diff --git a/Core/Resgrid.AdminAssist/CapabilitySetupEvaluator.cs b/Core/Resgrid.AdminAssist/CapabilitySetupEvaluator.cs
new file mode 100644
index 000000000..89d68a62d
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/CapabilitySetupEvaluator.cs
@@ -0,0 +1,42 @@
+using System;
+using System.Linq;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.AdminAssist
+{
+ /// Learning, purchase, recorded configuration and supported verification remain separate dimensions.
+ public static class CapabilitySetupEvaluator
+ {
+ public static CapabilitySetupAssessment Evaluate(ProductCapability capability, CapabilityAccess access, ConfigurationReport report, DateTime now, TimeSpan freshness)
+ {
+ var state = CapabilitySetupState.NotAssessed;
+ var definition = capability.Setup;
+ var accessFresh = access != null && access.AsOfUtc <= now && now - access.AsOfUtc <= freshness;
+ if (definition != null && accessFresh && access.State == EvidenceState.Known && report.Snapshot.Consistent)
+ {
+ var fact = report.Snapshot.Find(definition.EvidenceId);
+ if (fact.IsFresh(now, freshness) && fact.Number.HasValue && fact.Number >= 0)
+ {
+ state = fact.Number < definition.Minimum ? CapabilitySetupState.NotConfigured : CapabilitySetupState.ConfigurationPresent;
+ if (state == CapabilitySetupState.ConfigurationPresent && definition.RuleIds.Count > 0)
+ {
+ var checks = definition.RuleIds.Select(id => report.Findings.SingleOrDefault(f => f.RuleId == id)).ToArray();
+ bool current(ConfigurationFinding check) => check != null && check.SnapshotRevision == report.Snapshot.Revision &&
+ check.EvaluatedOnUtc <= now && now - check.EvaluatedOnUtc <= freshness;
+ if (checks.Any(check => current(check) && check.Result == RuleResult.Fail)) state = CapabilitySetupState.NeedsAttention;
+ // N/A, missing or stale checks do not verify a capability. No data-usage or delivery claim.
+ else if (checks.All(check => current(check) && check.Result == RuleResult.Pass)) state = CapabilitySetupState.ChecksPassed;
+ }
+ }
+ }
+ var addon = capability.Requirements.Any(r => r.Kind == "addon");
+ var opportunity = capability.ReleaseStatus is not ("available" or "preview") ? "Ui.OpportunityPlanned" :
+ !accessFresh || addon && (access.CommercialState == null || access.CommercialState == EvidenceState.Unknown || access.CommercialState == EvidenceState.Redacted) ? "Ui.OpportunityUnknown" :
+ addon && access.CommercialState == EvidenceState.Unavailable ? "Ui.OpportunityNotOwned" :
+ state == CapabilitySetupState.NotConfigured ? addon ? "Ui.OpportunitySubscribedNotConfigured" : "Ui.OpportunityIncludedNotConfigured" :
+ addon ? "Ui.OpportunitySubscribed" : "Ui.OpportunityNoAddon";
+ return new(capability.Id, state, opportunity, definition?.GuidanceKey ?? "Ui.ConfigurationNotAssessed",
+ definition?.RuleIds ?? Array.Empty(), report.Snapshot.Revision, report.Snapshot.AsOfUtc);
+ }
+ }
+}
diff --git a/Core/Resgrid.AdminAssist/CapacityImpactEvaluator.cs b/Core/Resgrid.AdminAssist/CapacityImpactEvaluator.cs
new file mode 100644
index 000000000..89e9fa808
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/CapacityImpactEvaluator.cs
@@ -0,0 +1,40 @@
+using System;
+using System.Collections.Generic;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.AdminAssist
+{
+ /// Headroom for proposed total personnel/unit counts; no provisioning, price estimate or entitlement change.
+ public static class CapacityImpactEvaluator
+ {
+ public static ConfigurationImpactReport Evaluate(ConfigurationSnapshot snapshot, CapacityImpactRequest request, DateTime now, TimeSpan maximumAge)
+ {
+ if (request == null || request.ProposedPersonnelCount < 0 || request.ProposedPersonnelCount > 1000000 || request.ProposedUnitCount < 0 || request.ProposedUnitCount > 1000000)
+ throw new ArgumentException("Proposed total counts must be between zero and one million.");
+ if (!snapshot.Consistent || snapshot.Revision != request.ExpectedRevision) throw new AdminAssistConcurrencyException();
+ decimal? Value(string id) { var value = snapshot.Find(id); return value.IsFresh(now, maximumAge) && value.Number >= 0 ? value.Number : null; }
+ var personnel = Value("capacityPersonnelCount"); var units = Value("capacityUnitCount");
+ var metrics = new List();
+ void Add(string label, decimal? before, decimal? after) => metrics.Add(new(label, before.HasValue && after.HasValue ? EvidenceState.Known : EvidenceState.Unknown, before, after));
+ Add("Impact.PersonnelTotal", personnel, request.ProposedPersonnelCount);
+ Add("Impact.UnitTotal", units, request.ProposedUnitCount);
+ var kind = snapshot.Find("capacityKind");
+ if (kind.IsFresh(now, maximumAge) && kind.Code == "entities")
+ {
+ var cap = Value("capacityEntityLimit");
+ // Zero is not a verified entity allowance; the owning limit service changes behavior at zero.
+ if (cap == 0) cap = null;
+ Add("Impact.SharedHeadroom", cap - personnel - units, cap - request.ProposedPersonnelCount - request.ProposedUnitCount);
+ }
+ else if (kind.IsFresh(now, maximumAge) && kind.Code == "separate")
+ {
+ Add("Impact.PersonnelHeadroom", Value("capacityPersonnelLimit") - personnel, Value("capacityPersonnelLimit") - request.ProposedPersonnelCount);
+ Add("Impact.UnitHeadroom", Value("capacityUnitLimit") - units, Value("capacityUnitLimit") - request.ProposedUnitCount);
+ }
+ else Add("Impact.CapacityHeadroom", null, null);
+ return new("plan.capacity", snapshot.Revision, snapshot.AsOfUtc, "capacity-v1",
+ new SettingImpact("Medium", "Impact.Audience", "Area.plans", "Impact.Timing", "Impact.CapacityReversal", "Impact.Verify"),
+ metrics.AsReadOnly(), Array.Empty(), new[] { "Impact.NoMutation", "Impact.CapacityScope", "Impact.CapacityTiming" }, "/User/Subscription/Index");
+ }
+ }
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/automation.yaml b/Core/Resgrid.AdminAssist/Catalog/automation.yaml
new file mode 100644
index 000000000..3b9148f9e
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/automation.yaml
@@ -0,0 +1,851 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "automation",
+ "LabelKey": "Area.automation",
+ "PurposeKey": "AreaPurpose.automation",
+ "Order": 10,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "table.ChatbotDepartmentConfig.IsEnabled",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.IsEnabled",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.IsEnabled",
+ "Binding": "ChatbotDepartmentConfig.IsEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.IsEnabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.AllowedPlatforms",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.AllowedPlatforms",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.AllowedPlatforms",
+ "Binding": "ChatbotDepartmentConfig.AllowedPlatforms",
+ "ValueType": "list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.AllowedPlatforms",
+ "DefaultValue": "*",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "Binding": "ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "DefaultValue": "3",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.SessionTtlMinutes",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.SessionTtlMinutes",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.SessionTtlMinutes",
+ "Binding": "ChatbotDepartmentConfig.SessionTtlMinutes",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.SessionTtlMinutes",
+ "DefaultValue": "30",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "Binding": "ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "Binding": "ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.LlmApiEndpoint",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.LlmApiEndpoint",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.LlmApiEndpoint",
+ "Binding": "ChatbotDepartmentConfig.LlmApiEndpoint",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.LlmApiEndpoint",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.LlmApiKey",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.LlmApiKey",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.LlmApiKey",
+ "Binding": "ChatbotDepartmentConfig.LlmApiKey",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.LlmApiKey",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.LlmModelName",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.LlmModelName",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.LlmModelName",
+ "Binding": "ChatbotDepartmentConfig.LlmModelName",
+ "ValueType": "text",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.LlmModelName",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "Binding": "ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "DefaultValue": "host default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "Binding": "ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "DefaultValue": "host default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "Binding": "ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "AreaId": "automation",
+ "LabelKey": "TableField.ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "HelpKey": "TableHelp.ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "Binding": "ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.automation",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "ChatbotDepartmentConfig",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "workflows",
+ "AreaId": "automation",
+ "LabelKey": "Feature.workflows",
+ "PurposeKey": "FeaturePurpose.workflows",
+ "ValueKey": "AreaValue.automation",
+ "ExampleKey": "AreaExample.automation",
+ "AdoptionKey": "FeatureAdoption.workflows",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workflows",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "workflow-failures"
+ ]
+ },
+ {
+ "Id": "new-workflow",
+ "AreaId": "automation",
+ "LabelKey": "Feature.new-workflow",
+ "PurposeKey": "FeaturePurpose.new-workflow",
+ "ValueKey": "AreaValue.automation",
+ "ExampleKey": "AreaExample.automation",
+ "AdoptionKey": "FeatureAdoption.new-workflow",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workflows",
+ "Action": "New"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "workflow-runs",
+ "AreaId": "automation",
+ "LabelKey": "Feature.workflow-runs",
+ "PurposeKey": "FeaturePurpose.workflow-runs",
+ "ValueKey": "AreaValue.automation",
+ "ExampleKey": "AreaExample.automation",
+ "AdoptionKey": "FeatureAdoption.workflow-runs",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workflows",
+ "Action": "Runs"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "protected-workflows",
+ "AreaId": "automation",
+ "LabelKey": "Feature.protected-workflows",
+ "PurposeKey": "FeaturePurpose.protected-workflows",
+ "ValueKey": "FeatureValue.protected-workflows",
+ "ExampleKey": "AreaExample.automation",
+ "AdoptionKey": "FeatureAdoption.protected-workflows",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "ProtectedWorkflows",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "ADP"
+ },
+ {
+ "Kind": "protection",
+ "Id": "Enabled"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "user-defined-fields",
+ "AreaId": "automation",
+ "LabelKey": "Feature.user-defined-fields",
+ "PurposeKey": "FeaturePurpose.user-defined-fields",
+ "ValueKey": "FeatureValue.user-defined-fields",
+ "ExampleKey": "AreaExample.automation",
+ "AdoptionKey": "FeatureAdoption.user-defined-fields",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "UserDefinedFields",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "api-mcp",
+ "AreaId": "automation",
+ "LabelKey": "Feature.api-mcp",
+ "PurposeKey": "FeaturePurpose.api-mcp",
+ "ValueKey": "FeatureValue.api-mcp",
+ "ExampleKey": "AreaExample.automation",
+ "AdoptionKey": "FeatureAdoption.api-mcp",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "field.PersonnelListStatusOrder.StatusId",
+ "field.PersonnelListStatusOrder.Weight",
+ "field.PersonnelListStatusOrderSetting.Orders",
+ "setting.BigBoardHideUnavailable",
+ "setting.BigBoardMapCenterAddress",
+ "setting.BigBoardMapCenterGpsCoordinates",
+ "setting.BigBoardMapZoomLevel",
+ "setting.BigBoardPageRefresh",
+ "setting.CallsSortOrder",
+ "setting.DisabledAutoAvailable",
+ "setting.EnableModernNotifications",
+ "setting.ForceChatbotSecurityPin",
+ "setting.PersonnelListStatusSortOrder",
+ "setting.PersonnelSortOrder",
+ "setting.RequirePasswordResetViaEmail",
+ "setting.StaffingSuppressStaffingLevels",
+ "setting.TestEnabled",
+ "setting.UnitsSortOrder",
+ "setting.UpdateTimestamp",
+ "table.Department.ApiKey",
+ "table.Department.Code",
+ "table.Department.LinkCode",
+ "table.Department.ManagingUserId",
+ "table.Department.PublicApiKey",
+ "table.Department.SharedSecret",
+ "table.Department.ShowWelcome",
+ "table.Department.TimeZone",
+ "table.Department.Use24HourTime"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "import-migration",
+ "AreaId": "automation",
+ "LabelKey": "Feature.import-migration",
+ "PurposeKey": "FeaturePurpose.import-migration",
+ "ValueKey": "FeatureValue.import-migration",
+ "ExampleKey": "AreaExample.automation",
+ "AdoptionKey": "FeatureAdoption.import-migration",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "SetupWizard"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "workflow-failures",
+ "AreaId": "automation",
+ "Severity": "Warning",
+ "TitleKey": "Rule.workflow-failures",
+ "ExplanationKey": "RuleWhy.workflow-failures",
+ "NextActionKey": "RuleNext.workflow-failures",
+ "Location": {
+ "Controller": "Workflows",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "failedWorkflowCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "table.ChatbotDepartmentConfig.IsEnabled",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.IsEnabled",
+ "Body": "Chatbot Department Config / Is Enabled. Department chatbot availability. Platform feature rollout, account linking and action permissions are separate gates.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-isenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.AllowedPlatforms",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.AllowedPlatforms",
+ "Body": "Chatbot Department Config / Allowed Platforms. Allowed chatbot platform codes; the stored asterisk represents the platform default. Review each connected provider and its account-linking requirements.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-allowedplatforms",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "Body": "Chatbot Department Config / Max Sessions Per User. Maximum chatbot sessions per member in supported consumers. This is separate from authenticated web/mobile session limits.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-maxsessionsperuser",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.SessionTtlMinutes",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.SessionTtlMinutes",
+ "Body": "Chatbot Department Config / Session Ttl Minutes. Chatbot session lifetime in minutes. Expiry does not revoke an unrelated Resgrid sign-in session.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-sessionttlminutes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "Body": "Chatbot Department Config / Allow Dispatch Via Chatbot. Permits supported chatbot dispatch actions subject to their own authorization and confirmation. Enabling it may allow real calls and pages.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-allowdispatchviachatbot",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "Body": "Chatbot Department Config / Require Confirmation For Status Change. Requests confirmation for supported status changes. Review each platform consumer before assuming all commands are covered.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-requireconfirmationforstatuschange",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.LlmApiEndpoint",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.LlmApiEndpoint",
+ "Body": "Chatbot Department Config / Llm Api Endpoint. Optional existing chatbot model endpoint. Phase 0 Admin Assist does not call it and does not use chatbot configuration as an AI entitlement.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-llmapiendpoint",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.LlmApiKey",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.LlmApiKey",
+ "Body": "Chatbot Department Config / Llm Api Key. Credential for the chatbot model provider. Never copy it into setup metadata or public reference content.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-llmapikey",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.LlmModelName",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.LlmModelName",
+ "Body": "Chatbot Department Config / Llm Model Name. Model identifier used by the existing chatbot integration. This is separate from the later Admin Assist open-source inference deployment.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-llmmodelname",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "Body": "Chatbot Department Config / Messages Per User Per Minute. Optional per-member chatbot rate bound. Review provider limits and burst behavior; this is not a delivery guarantee.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-messagesperuserperminute",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "Body": "Chatbot Department Config / Messages Per Department Per Minute. Optional department chatbot rate bound. Consider shared demand and provider quotas before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-messagesperdepartmentperminute",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "Body": "Chatbot Department Config / Require Linking Confirmation. Requires confirmation in the supported account-linking flow. Linking must not bypass verified identity or departmental authorization.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-requirelinkingconfirmation",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "Locale": "en",
+ "TitleKey": "TableField.ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "Body": "Chatbot Department Config / Proactive Notifications Enabled. Allows supported proactive chatbot notifications. Recipient permissions, channel configuration and sending workflows remain authoritative.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-chatbotdepartmentconfig-proactivenotificationsenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "workflows",
+ "Locale": "en",
+ "TitleKey": "Feature.workflows",
+ "Body": "Workflows Automations triggered by department events Reduce repeated administrative work while retaining ownership and review of external effects. Review a Workflow and its permissions before explicitly enabling it. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "workflows",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-workflow",
+ "Locale": "en",
+ "TitleKey": "Feature.new-workflow",
+ "Body": "New Workflow Create an automation workflow Reduce repeated administrative work while retaining ownership and review of external effects. Review a Workflow and its permissions before explicitly enabling it. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-workflow",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "workflow-runs",
+ "Locale": "en",
+ "TitleKey": "Feature.workflow-runs",
+ "Body": "Workflow Runs Workflow execution history Reduce repeated administrative work while retaining ownership and review of external effects. Review a Workflow and its permissions before explicitly enabling it. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "workflow-runs",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "protected-workflows",
+ "Locale": "en",
+ "TitleKey": "Feature.protected-workflows",
+ "Body": "Protected workflows Configure approved releases to supported external workflow destinations. Keep protected-data egress scoped, reviewed and auditable. Review a Workflow and its permissions before explicitly enabling it. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "protected-workflows",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "user-defined-fields",
+ "Locale": "en",
+ "TitleKey": "Feature.user-defined-fields",
+ "Body": "User-defined fields Define additional fields for supported forms and records. Collect the information the department actually needs with appropriate classification. Review a Workflow and its permissions before explicitly enabling it. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "user-defined-fields",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "api-mcp",
+ "Locale": "en",
+ "TitleKey": "Feature.api-mcp",
+ "Body": "API and MCP integrations Use supported APIs and MCP with authorized credentials and permissions. Connect approved systems without placing credentials in setup examples. Review a Workflow and its permissions before explicitly enabling it. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "api-mcp",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "import-migration",
+ "Locale": "en",
+ "TitleKey": "Feature.import-migration",
+ "Body": "Import and migration planning Plan source ownership and review existing import tools before copying data. Avoid duplicate resources and verify resulting configuration in Setup Report. Review a Workflow and its permissions before explicitly enabling it. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "import-migration",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/business.yaml b/Core/Resgrid.AdminAssist/Catalog/business.yaml
new file mode 100644
index 000000000..16cce1575
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/business.yaml
@@ -0,0 +1,1156 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "business",
+ "LabelKey": "Area.business",
+ "PurposeKey": "AreaPurpose.business",
+ "Order": 9,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "module.BusinessOperationsDisabled",
+ "AreaId": "business",
+ "LabelKey": "Module.BusinessOperationsDisabled",
+ "HelpKey": "ModuleHelp.BusinessOperationsDisabled",
+ "Binding": "DepartmentModuleSettings.BusinessOperationsDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "BusinessOperationsEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.business",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.BusinessOperationsDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "invoices",
+ "AreaId": "business",
+ "LabelKey": "Feature.invoices",
+ "PurposeKey": "FeaturePurpose.invoices",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.invoices",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Invoicing",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.CustomerInvoicing"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-invoice",
+ "AreaId": "business",
+ "LabelKey": "Feature.new-invoice",
+ "PurposeKey": "FeaturePurpose.new-invoice",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.new-invoice",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Invoicing",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.CustomerInvoicing"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "rate-cards",
+ "AreaId": "business",
+ "LabelKey": "Feature.rate-cards",
+ "PurposeKey": "FeaturePurpose.rate-cards",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.rate-cards",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Invoicing",
+ "Action": "RateCards"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.CustomerInvoicing"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "invoice-aging",
+ "AreaId": "business",
+ "LabelKey": "Feature.invoice-aging",
+ "PurposeKey": "FeaturePurpose.invoice-aging",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.invoice-aging",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Invoicing",
+ "Action": "Aging"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.CustomerInvoicing"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "billing-settings",
+ "AreaId": "business",
+ "LabelKey": "Feature.billing-settings",
+ "PurposeKey": "FeaturePurpose.billing-settings",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.billing-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Invoicing",
+ "Action": "Settings"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.CustomerInvoicing"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "online-payment-settings",
+ "AreaId": "business",
+ "LabelKey": "Feature.online-payment-settings",
+ "PurposeKey": "FeaturePurpose.online-payment-settings",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.online-payment-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Invoicing",
+ "Action": "Settings"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.OnlinePayments"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "deployments",
+ "AreaId": "business",
+ "LabelKey": "Feature.deployments",
+ "PurposeKey": "FeaturePurpose.deployments",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.deployments",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Deployments",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Operations.Deployments"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-deployment",
+ "AreaId": "business",
+ "LabelKey": "Feature.new-deployment",
+ "PurposeKey": "FeaturePurpose.new-deployment",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.new-deployment",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Deployments",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Operations.Deployments"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "deployment-from-external-order",
+ "AreaId": "business",
+ "LabelKey": "Feature.deployment-from-external-order",
+ "PurposeKey": "FeaturePurpose.deployment-from-external-order",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.deployment-from-external-order",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Deployments",
+ "Action": "FromExternalOrder"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Operations.Deployments"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "bids",
+ "AreaId": "business",
+ "LabelKey": "Feature.bids",
+ "PurposeKey": "FeaturePurpose.bids",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.bids",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Bids",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.ContractorBilling"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-bid",
+ "AreaId": "business",
+ "LabelKey": "Feature.new-bid",
+ "PurposeKey": "FeaturePurpose.new-bid",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.new-bid",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Bids",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.ContractorBilling"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "contracts",
+ "AreaId": "business",
+ "LabelKey": "Feature.contracts",
+ "PurposeKey": "FeaturePurpose.contracts",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.contracts",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Contracts",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.ContractorBilling"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-contract",
+ "AreaId": "business",
+ "LabelKey": "Feature.new-contract",
+ "PurposeKey": "FeaturePurpose.new-contract",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.new-contract",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Contracts",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.ContractorBilling"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "compliance-documents",
+ "AreaId": "business",
+ "LabelKey": "Feature.compliance-documents",
+ "PurposeKey": "FeaturePurpose.compliance-documents",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.compliance-documents",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Contracts",
+ "Action": "Compliance"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.ContractorBilling"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "rate-schedules",
+ "AreaId": "business",
+ "LabelKey": "Feature.rate-schedules",
+ "PurposeKey": "FeaturePurpose.rate-schedules",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.rate-schedules",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RateSchedules",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Invoicing.ContractorBilling"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "cal-oes-mars",
+ "AreaId": "business",
+ "LabelKey": "Feature.cal-oes-mars",
+ "PurposeKey": "FeaturePurpose.cal-oes-mars",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.cal-oes-mars",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "CalOesMars",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "CostRecovery.CalOesMars"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "cal-oes-mars-queue",
+ "AreaId": "business",
+ "LabelKey": "Feature.cal-oes-mars-queue",
+ "PurposeKey": "FeaturePurpose.cal-oes-mars-queue",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.cal-oes-mars-queue",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "CalOesMars",
+ "Action": "Queue"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "CostRecovery.CalOesMars"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "cal-oes-mars-rates",
+ "AreaId": "business",
+ "LabelKey": "Feature.cal-oes-mars-rates",
+ "PurposeKey": "FeaturePurpose.cal-oes-mars-rates",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.cal-oes-mars-rates",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "CalOesMars",
+ "Action": "Rates"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "CostRecovery.CalOesMars"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "cal-oes-mars-reconciliation",
+ "AreaId": "business",
+ "LabelKey": "Feature.cal-oes-mars-reconciliation",
+ "PurposeKey": "FeaturePurpose.cal-oes-mars-reconciliation",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.cal-oes-mars-reconciliation",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "CalOesMars",
+ "Action": "Reconciliation"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "CostRecovery.CalOesMars"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "workforce",
+ "AreaId": "business",
+ "LabelKey": "Feature.workforce",
+ "PurposeKey": "FeaturePurpose.workforce",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.workforce",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workforce",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Workforce.InternalCosting"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "workforce-compensation",
+ "AreaId": "business",
+ "LabelKey": "Feature.workforce-compensation",
+ "PurposeKey": "FeaturePurpose.workforce-compensation",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.workforce-compensation",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workforce",
+ "Action": "Compensation"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Workforce.InternalCosting"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "workforce-annual-facts",
+ "AreaId": "business",
+ "LabelKey": "Feature.workforce-annual-facts",
+ "PurposeKey": "FeaturePurpose.workforce-annual-facts",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.workforce-annual-facts",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workforce",
+ "Action": "AnnualFacts"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Workforce.InternalCosting"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "resource-costs",
+ "AreaId": "business",
+ "LabelKey": "Feature.resource-costs",
+ "PurposeKey": "FeaturePurpose.resource-costs",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.resource-costs",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workforce",
+ "Action": "ResourceCosts"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Workforce.InternalCosting"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "cost-runs",
+ "AreaId": "business",
+ "LabelKey": "Feature.cost-runs",
+ "PurposeKey": "FeaturePurpose.cost-runs",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.cost-runs",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workforce",
+ "Action": "CostRuns"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Workforce.InternalCosting"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "pay-data-reporting",
+ "AreaId": "business",
+ "LabelKey": "Feature.pay-data-reporting",
+ "PurposeKey": "FeaturePurpose.pay-data-reporting",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.pay-data-reporting",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workforce",
+ "Action": "PayData"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Compliance.CaliforniaPayDataReporting"
+ },
+ {
+ "Kind": "module",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ },
+ {
+ "Kind": "addon",
+ "Id": "ADP"
+ },
+ {
+ "Kind": "protection",
+ "Id": "Enabled"
+ }
+ ],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "my-demographics",
+ "AreaId": "business",
+ "LabelKey": "Feature.my-demographics",
+ "PurposeKey": "FeaturePurpose.my-demographics",
+ "ValueKey": "AreaValue.business",
+ "ExampleKey": "AreaExample.business",
+ "AdoptionKey": "FeatureAdoption.my-demographics",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workforce",
+ "Action": "MyDemographics"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Compliance.CaliforniaPayDataReporting"
+ },
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "module.BusinessOperationsDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.BusinessOperationsDisabled",
+ "Body": "BusinessOperations availability. Controls availability of business operations. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-businessoperationsdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "invoices",
+ "Locale": "en",
+ "TitleKey": "Feature.invoices",
+ "Body": "Invoices Customer invoices and payments Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "invoices",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-invoice",
+ "Locale": "en",
+ "TitleKey": "Feature.new-invoice",
+ "Body": "New Invoice Draft an invoice for a customer Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-invoice",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "rate-cards",
+ "Locale": "en",
+ "TitleKey": "Feature.rate-cards",
+ "Body": "Rate Cards Billing rates for units, personnel and fees Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "rate-cards",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "invoice-aging",
+ "Locale": "en",
+ "TitleKey": "Feature.invoice-aging",
+ "Body": "Accounts Receivable Aging Outstanding invoice balances by age Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "invoice-aging",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "billing-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.billing-settings",
+ "Body": "Billing Settings Legal name, remit-to address and tax registrations printed on invoices Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "billing-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "online-payment-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.online-payment-settings",
+ "Body": "Online Payment Settings Connect your Stripe account to collect invoice payments online Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "online-payment-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "deployments",
+ "Locale": "en",
+ "TitleKey": "Feature.deployments",
+ "Body": "Deployment Finance Deployments, rosters, daily time reports and expenses Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "deployments",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-deployment",
+ "Locale": "en",
+ "TitleKey": "Feature.new-deployment",
+ "Body": "New Deployment Create a deployment finance wrapper Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-deployment",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "deployment-from-external-order",
+ "Locale": "en",
+ "TitleKey": "Feature.deployment-from-external-order",
+ "Body": "Deployment From External Order Create a deployment from an open RMS mutual-aid order Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "deployment-from-external-order",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "bids",
+ "Locale": "en",
+ "TitleKey": "Feature.bids",
+ "Body": "Bids Priced estimates for customer contacts and contracts Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "bids",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-bid",
+ "Locale": "en",
+ "TitleKey": "Feature.new-bid",
+ "Body": "New Bid Draft a bid for a customer Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-bid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "contracts",
+ "Locale": "en",
+ "TitleKey": "Feature.contracts",
+ "Body": "Contracts Service contracts, document requirements and compliance Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "contracts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-contract",
+ "Locale": "en",
+ "TitleKey": "Feature.new-contract",
+ "Body": "New Contract Create a service contract for a customer Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-contract",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "compliance-documents",
+ "Locale": "en",
+ "TitleKey": "Feature.compliance-documents",
+ "Body": "Compliance Documents Insurance, workers' comp, SAM, licences and bonds with expiry alerts Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "compliance-documents",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "rate-schedules",
+ "Locale": "en",
+ "TitleKey": "Feature.rate-schedules",
+ "Body": "Rate Schedules Contractor rate tables: certifications, crews, vehicles, equipment, premiums and policies Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "rate-schedules",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "cal-oes-mars",
+ "Locale": "en",
+ "TitleKey": "Feature.cal-oes-mars",
+ "Body": "Cal OES MARS CFAA cost recovery readiness: agency, F-5 resources, annual rates and agreements Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "cal-oes-mars",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "cal-oes-mars-queue",
+ "Locale": "en",
+ "TitleKey": "Feature.cal-oes-mars-queue",
+ "Body": "MARS Action Queue F-42 and expense claims to prepare, validate and hand off to the MARS portal Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "cal-oes-mars-queue",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "cal-oes-mars-rates",
+ "Locale": "en",
+ "TitleKey": "Feature.cal-oes-mars-rates",
+ "Body": "MARS Annual Rates Salary Survey, Attachment A, Administrative Rate, Rate Letter and Special Equipment snapshots Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "cal-oes-mars-rates",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "cal-oes-mars-reconciliation",
+ "Locale": "en",
+ "TitleKey": "Feature.cal-oes-mars-reconciliation",
+ "Body": "MARS Reconciliation Observed MARS invoices, local approval and payment reconciliation Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "cal-oes-mars-reconciliation",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "workforce",
+ "Locale": "en",
+ "TitleKey": "Feature.workforce",
+ "Body": "Workforce Employer identity, establishments, workers, employments and job assignments Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "workforce",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "workforce-compensation",
+ "Locale": "en",
+ "TitleKey": "Feature.workforce-compensation",
+ "Body": "Compensation Profiles Employee, role-default and department-default compensation with pay and employer-cost components Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "workforce-compensation",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "workforce-annual-facts",
+ "Locale": "en",
+ "TitleKey": "Feature.workforce-annual-facts",
+ "Body": "Annual Pay Facts W-2 earnings and hours per employment for pay data reporting, with CSV import Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "workforce-annual-facts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "resource-costs",
+ "Locale": "en",
+ "TitleKey": "Feature.resource-costs",
+ "Body": "Resource Cost Profiles Depreciation, fuel, maintenance and fixed costs per unit or asset Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "resource-costs",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "cost-runs",
+ "Locale": "en",
+ "TitleKey": "Feature.cost-runs",
+ "Body": "Field Cost Runs Internal loaded cost and margin for bids, calls and deployments Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "cost-runs",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "pay-data-reporting",
+ "Locale": "en",
+ "TitleKey": "Feature.pay-data-reporting",
+ "Body": "California Pay Data Reporting CRD pay data report runs: snapshots, aggregation, validation, export and the portal worksheet Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and Advanced Data Protection in the Enabled state. Review regional applicability and protected workforce access.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "pay-data-reporting",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "my-demographics",
+ "Locale": "en",
+ "TitleKey": "Feature.my-demographics",
+ "Body": "My Demographic Response Your voluntary self-identification for California pay data reporting Connect deployment records to invoicing, reimbursement or internal cost review when needed. Compare an event standby invoice with its approved deployment documentation. Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "my-demographics",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/calls.yaml b/Core/Resgrid.AdminAssist/Catalog/calls.yaml
new file mode 100644
index 000000000..1c4d10924
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/calls.yaml
@@ -0,0 +1,2833 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "calls",
+ "LabelKey": "Area.calls",
+ "PurposeKey": "AreaPurpose.calls",
+ "Order": 1,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.RssFeedKeyForActiveCalls",
+ "AreaId": "calls",
+ "LabelKey": "Setting.RssFeedKeyForActiveCalls",
+ "HelpKey": "SettingHelp.RssFeedKeyForActiveCalls",
+ "Binding": "DepartmentSettingTypes.RssFeedKeyForActiveCalls",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": "RssFeedKeyForActiveCalls"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RssFeedKeyForActiveCalls",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.TextToCallNumber",
+ "AreaId": "calls",
+ "LabelKey": "Setting.TextToCallNumber",
+ "HelpKey": "SettingHelp.TextToCallNumber",
+ "Binding": "DepartmentSettingTypes.TextToCallNumber",
+ "ValueType": "provider-reference",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings",
+ "Field": "TextToCallNumber"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.TextToCallNumber",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.TextToCallImportFormat",
+ "AreaId": "calls",
+ "LabelKey": "Setting.TextToCallImportFormat",
+ "HelpKey": "SettingHelp.TextToCallImportFormat",
+ "Binding": "DepartmentSettingTypes.TextToCallImportFormat",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings",
+ "Field": "TextToCallImportFormat"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.TextToCallImportFormat",
+ "DefaultValue": "owning parser default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.TextToCallSourceNumbers",
+ "AreaId": "calls",
+ "LabelKey": "Setting.TextToCallSourceNumbers",
+ "HelpKey": "SettingHelp.TextToCallSourceNumbers",
+ "Binding": "DepartmentSettingTypes.TextToCallSourceNumbers",
+ "ValueType": "sensitive-list",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings",
+ "Field": "TextToCallSourceNumbers"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.TextToCallSourceNumbers",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.EnableTextToCall",
+ "AreaId": "calls",
+ "LabelKey": "Setting.EnableTextToCall",
+ "HelpKey": "SettingHelp.EnableTextToCall",
+ "Binding": "DepartmentSettingTypes.EnableTextToCall",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings",
+ "Field": "EnableTextToCall"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.EnableTextToCall",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.InternalDispatchEmail",
+ "AreaId": "calls",
+ "LabelKey": "Setting.InternalDispatchEmail",
+ "HelpKey": "SettingHelp.InternalDispatchEmail",
+ "Binding": "DepartmentSettingTypes.InternalDispatchEmail",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": "InternalDispatchEmail"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.InternalDispatchEmail",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.CallsSortOrder",
+ "AreaId": "calls",
+ "LabelKey": "Setting.CallsSortOrder",
+ "HelpKey": "SettingHelp.CallsSortOrder",
+ "Binding": "DepartmentSettingTypes.CallsSortOrder",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "CallsSortOrder"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.CallsSortOrder",
+ "DefaultValue": "owning view default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.DispatchShiftInsteadOfGroup",
+ "AreaId": "calls",
+ "LabelKey": "Setting.DispatchShiftInsteadOfGroup",
+ "HelpKey": "SettingHelp.DispatchShiftInsteadOfGroup",
+ "Binding": "DepartmentSettingTypes.DispatchShiftInsteadOfGroup",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "DispatchShiftInsteadOfGroup"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [
+ "setting.AutoSetStatusForShiftDispatchPersonnel"
+ ],
+ "Conflicts": [],
+ "DocumentationId": "setting.DispatchShiftInsteadOfGroup",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.AutoSetStatusForShiftDispatchPersonnel",
+ "AreaId": "calls",
+ "LabelKey": "Setting.AutoSetStatusForShiftDispatchPersonnel",
+ "HelpKey": "SettingHelp.AutoSetStatusForShiftDispatchPersonnel",
+ "Binding": "DepartmentSettingTypes.AutoSetStatusForShiftDispatchPersonnel",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "AutoSetStatusForShiftPersonnel"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchShiftInsteadOfGroup"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.AutoSetStatusForShiftDispatchPersonnel",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.ShiftCallDispatchPersonnelStatusToSet",
+ "AreaId": "calls",
+ "LabelKey": "Setting.ShiftCallDispatchPersonnelStatusToSet",
+ "HelpKey": "SettingHelp.ShiftCallDispatchPersonnelStatusToSet",
+ "Binding": "DepartmentSettingTypes.ShiftCallDispatchPersonnelStatusToSet",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "ShiftCallDispatchPersonnelStatusToSet"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.ShiftCallDispatchPersonnelStatusToSet",
+ "DefaultValue": "-1",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.ShiftCallReleasePersonnelStatusToSet",
+ "AreaId": "calls",
+ "LabelKey": "Setting.ShiftCallReleasePersonnelStatusToSet",
+ "HelpKey": "SettingHelp.ShiftCallReleasePersonnelStatusToSet",
+ "Binding": "DepartmentSettingTypes.ShiftCallReleasePersonnelStatusToSet",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "ShiftCallReleasePersonnelStatusToSet"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.ShiftCallReleasePersonnelStatusToSet",
+ "DefaultValue": "-1",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "AreaId": "calls",
+ "LabelKey": "Setting.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "HelpKey": "SettingHelp.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "Binding": "DepartmentSettingTypes.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "UnitDispatchAlsoDispatchToAssignedPersonnel"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.UnitDispatchAlsoDispatchToGroup",
+ "AreaId": "calls",
+ "LabelKey": "Setting.UnitDispatchAlsoDispatchToGroup",
+ "HelpKey": "SettingHelp.UnitDispatchAlsoDispatchToGroup",
+ "Binding": "DepartmentSettingTypes.UnitDispatchAlsoDispatchToGroup",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "UnitDispatchAlsoDispatchToGroup"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UnitDispatchAlsoDispatchToGroup",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.CheckInTimersAutoEnableForNewCalls",
+ "AreaId": "calls",
+ "LabelKey": "Setting.CheckInTimersAutoEnableForNewCalls",
+ "HelpKey": "SettingHelp.CheckInTimersAutoEnableForNewCalls",
+ "Binding": "DepartmentSettingTypes.CheckInTimersAutoEnableForNewCalls",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "AutoEnableCheckInTimers"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.CheckInTimersAutoEnableForNewCalls",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.UnitCallDispatchStatusToSet",
+ "AreaId": "calls",
+ "LabelKey": "Setting.UnitCallDispatchStatusToSet",
+ "HelpKey": "SettingHelp.UnitCallDispatchStatusToSet",
+ "Binding": "DepartmentSettingTypes.UnitCallDispatchStatusToSet",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "UnitCallDispatchStatusToSet"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UnitCallDispatchStatusToSet",
+ "DefaultValue": "-1",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.UnitCallReleaseStatusToSet",
+ "AreaId": "calls",
+ "LabelKey": "Setting.UnitCallReleaseStatusToSet",
+ "HelpKey": "SettingHelp.UnitCallReleaseStatusToSet",
+ "Binding": "DepartmentSettingTypes.UnitCallReleaseStatusToSet",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "UnitCallReleaseStatusToSet"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UnitCallReleaseStatusToSet",
+ "DefaultValue": "-1",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.UnitCallStatusOverridesByUnitType",
+ "AreaId": "calls",
+ "LabelKey": "Setting.UnitCallStatusOverridesByUnitType",
+ "HelpKey": "SettingHelp.UnitCallStatusOverridesByUnitType",
+ "Binding": "DepartmentSettingTypes.UnitCallStatusOverridesByUnitType",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "UnitCallStatusOverridesByUnitType"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UnitCallStatusOverridesByUnitType",
+ "DefaultValue": "empty overrides",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.DispatchRecommendationMode",
+ "AreaId": "calls",
+ "LabelKey": "Setting.DispatchRecommendationMode",
+ "HelpKey": "SettingHelp.DispatchRecommendationMode",
+ "Binding": "DepartmentSettingTypes.DispatchRecommendationMode",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "DispatchRecommendationMode"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Conflicts": [],
+ "DocumentationId": "setting.DispatchRecommendationMode",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.DispatchRecommendationAutoDispatch",
+ "AreaId": "calls",
+ "LabelKey": "Setting.DispatchRecommendationAutoDispatch",
+ "HelpKey": "SettingHelp.DispatchRecommendationAutoDispatch",
+ "Binding": "DepartmentSettingTypes.DispatchRecommendationAutoDispatch",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "DispatchRecommendationAutoDispatch"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.DispatchRecommendationAutoDispatch",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.DispatchRecommendationConfig",
+ "AreaId": "calls",
+ "LabelKey": "Setting.DispatchRecommendationConfig",
+ "HelpKey": "SettingHelp.DispatchRecommendationConfig",
+ "Binding": "DepartmentSettingTypes.DispatchRecommendationConfig",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "DispatchRecommendationConfig"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationMode"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.DispatchRecommendationConfig",
+ "DefaultValue": "DispatchRecommendationConfig constructor",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.NewCallFieldPolicy",
+ "AreaId": "calls",
+ "LabelKey": "Setting.NewCallFieldPolicy",
+ "HelpKey": "SettingHelp.NewCallFieldPolicy",
+ "Binding": "DepartmentSettingTypes.NewCallFieldPolicy",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "NewCallFieldPolicy"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.NewCallFieldPolicy",
+ "DefaultValue": "visible, not required",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.GroupDispatchScopeConfig",
+ "AreaId": "calls",
+ "LabelKey": "Setting.GroupDispatchScopeConfig",
+ "HelpKey": "SettingHelp.GroupDispatchScopeConfig",
+ "Binding": "DepartmentSettingTypes.GroupDispatchScopeConfig",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "GroupDispatchScopeEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.GroupDispatchScopeConfig",
+ "DefaultValue": "disabled, no department-wide role exceptions",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverrideSetting.Overrides",
+ "AreaId": "calls",
+ "LabelKey": "Field.UnitTypeCallStatusOverrideSetting.Overrides",
+ "HelpKey": "FieldHelp.UnitTypeCallStatusOverrideSetting.Overrides",
+ "Binding": "UnitTypeCallStatusOverrideSetting.Overrides",
+ "ValueType": "list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitCallStatusOverridesByUnitType"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitTypeCallStatusOverrideSetting.Overrides",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitTypeCallStatusOverrideSetting",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverride.UnitTypeId",
+ "AreaId": "calls",
+ "LabelKey": "Field.UnitTypeCallStatusOverride.UnitTypeId",
+ "HelpKey": "FieldHelp.UnitTypeCallStatusOverride.UnitTypeId",
+ "Binding": "UnitTypeCallStatusOverride.UnitTypeId",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitCallStatusOverridesByUnitType"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitTypeCallStatusOverride.UnitTypeId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitTypeCallStatusOverride",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverride.DispatchStatus",
+ "AreaId": "calls",
+ "LabelKey": "Field.UnitTypeCallStatusOverride.DispatchStatus",
+ "HelpKey": "FieldHelp.UnitTypeCallStatusOverride.DispatchStatus",
+ "Binding": "UnitTypeCallStatusOverride.DispatchStatus",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitCallStatusOverridesByUnitType"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitTypeCallStatusOverride.DispatchStatus",
+ "DefaultValue": "-1",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitTypeCallStatusOverride",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverride.ReleaseStatus",
+ "AreaId": "calls",
+ "LabelKey": "Field.UnitTypeCallStatusOverride.ReleaseStatus",
+ "HelpKey": "FieldHelp.UnitTypeCallStatusOverride.ReleaseStatus",
+ "Binding": "UnitTypeCallStatusOverride.ReleaseStatus",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitCallStatusOverridesByUnitType"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitTypeCallStatusOverride.ReleaseStatus",
+ "DefaultValue": "-1",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitTypeCallStatusOverride",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.NewCallFieldPolicy.Rules",
+ "AreaId": "calls",
+ "LabelKey": "Field.NewCallFieldPolicy.Rules",
+ "HelpKey": "FieldHelp.NewCallFieldPolicy.Rules",
+ "Binding": "NewCallFieldPolicy.Rules",
+ "ValueType": "list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.NewCallFieldPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.NewCallFieldPolicy.Rules",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "NewCallFieldPolicy",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.NewCallFieldRule.Key",
+ "AreaId": "calls",
+ "LabelKey": "Field.NewCallFieldRule.Key",
+ "HelpKey": "FieldHelp.NewCallFieldRule.Key",
+ "Binding": "NewCallFieldRule.Key",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.NewCallFieldPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.NewCallFieldRule.Key",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "NewCallFieldRule",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.NewCallFieldRule.Visible",
+ "AreaId": "calls",
+ "LabelKey": "Field.NewCallFieldRule.Visible",
+ "HelpKey": "FieldHelp.NewCallFieldRule.Visible",
+ "Binding": "NewCallFieldRule.Visible",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.NewCallFieldPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.NewCallFieldRule.Visible",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "NewCallFieldRule",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.NewCallFieldRule.Required",
+ "AreaId": "calls",
+ "LabelKey": "Field.NewCallFieldRule.Required",
+ "HelpKey": "FieldHelp.NewCallFieldRule.Required",
+ "Binding": "NewCallFieldRule.Required",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.NewCallFieldPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.NewCallFieldRule.Required",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "NewCallFieldRule",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.GroupDispatchScopeConfig.Enabled",
+ "AreaId": "calls",
+ "LabelKey": "Field.GroupDispatchScopeConfig.Enabled",
+ "HelpKey": "FieldHelp.GroupDispatchScopeConfig.Enabled",
+ "Binding": "GroupDispatchScopeConfig.Enabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "GroupDispatchScopeEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.GroupDispatchScopeConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.GroupDispatchScopeConfig.Enabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "GroupDispatchScopeConfig",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "AreaId": "calls",
+ "LabelKey": "Field.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "HelpKey": "FieldHelp.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "Binding": "GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "ValueType": "reference-list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.GroupDispatchScopeConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "GroupDispatchScopeConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "Binding": "DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "DefaultValue": "1800",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.MaxRadiusMeters",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.MaxRadiusMeters",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.MaxRadiusMeters",
+ "Binding": "DispatchRecommendationConfig.MaxRadiusMeters",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.MaxRadiusMeters",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.IncludeStaleLocations",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.IncludeStaleLocations",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.IncludeStaleLocations",
+ "Binding": "DispatchRecommendationConfig.IncludeStaleLocations",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.IncludeStaleLocations",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "Binding": "DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "DefaultValue": "1800",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.UseRoutedEta",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.UseRoutedEta",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.UseRoutedEta",
+ "Binding": "DispatchRecommendationConfig.UseRoutedEta",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.UseRoutedEta",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.EtaShortlistSize",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.EtaShortlistSize",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.EtaShortlistSize",
+ "Binding": "DispatchRecommendationConfig.EtaShortlistSize",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.EtaShortlistSize",
+ "DefaultValue": "5",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.RestPeriodMinutes",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.RestPeriodMinutes",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.RestPeriodMinutes",
+ "Binding": "DispatchRecommendationConfig.RestPeriodMinutes",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.RestPeriodMinutes",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "Binding": "DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "AreaId": "calls",
+ "LabelKey": "Field.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "HelpKey": "FieldHelp.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "Binding": "DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DispatchRecommendationConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DispatchRecommendationConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Hostname",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.Hostname",
+ "HelpKey": "TableHelp.DepartmentCallEmail.Hostname",
+ "Binding": "DepartmentCallEmail.Hostname",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.Hostname",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Port",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.Port",
+ "HelpKey": "TableHelp.DepartmentCallEmail.Port",
+ "Binding": "DepartmentCallEmail.Port",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.Port",
+ "DefaultValue": "editor/provider default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.UseSsl",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.UseSsl",
+ "HelpKey": "TableHelp.DepartmentCallEmail.UseSsl",
+ "Binding": "DepartmentCallEmail.UseSsl",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.UseSsl",
+ "DefaultValue": "editor/provider default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Username",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.Username",
+ "HelpKey": "TableHelp.DepartmentCallEmail.Username",
+ "Binding": "DepartmentCallEmail.Username",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.Username",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Password",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.Password",
+ "HelpKey": "TableHelp.DepartmentCallEmail.Password",
+ "Binding": "DepartmentCallEmail.Password",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.Password",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.FormatType",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.FormatType",
+ "HelpKey": "TableHelp.DepartmentCallEmail.FormatType",
+ "Binding": "DepartmentCallEmail.FormatType",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.FormatType",
+ "DefaultValue": "owning parser default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.LastCheck",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.LastCheck",
+ "HelpKey": "TableHelp.DepartmentCallEmail.LastCheck",
+ "Binding": "DepartmentCallEmail.LastCheck",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.LastCheck",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.IsFailure",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.IsFailure",
+ "HelpKey": "TableHelp.DepartmentCallEmail.IsFailure",
+ "Binding": "DepartmentCallEmail.IsFailure",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.IsFailure",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.ErrorMessage",
+ "AreaId": "calls",
+ "LabelKey": "TableField.DepartmentCallEmail.ErrorMessage",
+ "HelpKey": "TableHelp.DepartmentCallEmail.ErrorMessage",
+ "Binding": "DepartmentCallEmail.ErrorMessage",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.calls",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentCallEmail.ErrorMessage",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentCallEmail",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "calls",
+ "AreaId": "calls",
+ "LabelKey": "Feature.calls",
+ "PurposeKey": "FeaturePurpose.calls",
+ "ValueKey": "AreaValue.calls",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.calls",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Dispatch",
+ "Action": "Dashboard"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-call",
+ "AreaId": "calls",
+ "LabelKey": "Feature.new-call",
+ "PurposeKey": "FeaturePurpose.new-call",
+ "ValueKey": "AreaValue.calls",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.new-call",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Dispatch",
+ "Action": "NewCall"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "archived-calls",
+ "AreaId": "calls",
+ "LabelKey": "Feature.archived-calls",
+ "PurposeKey": "FeaturePurpose.archived-calls",
+ "ValueKey": "AreaValue.calls",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.archived-calls",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Dispatch",
+ "Action": "ArchivedCalls"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "incident-command",
+ "AreaId": "calls",
+ "LabelKey": "Feature.incident-command",
+ "PurposeKey": "FeaturePurpose.incident-command",
+ "ValueKey": "FeatureValue.incident-command",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.incident-command",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Command",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "permission",
+ "Id": "CommandAppLogin"
+ }
+ ],
+ "SettingIds": [
+ "permission.CommandAppLogin"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "call-templates",
+ "AreaId": "calls",
+ "LabelKey": "Feature.call-templates",
+ "PurposeKey": "FeaturePurpose.call-templates",
+ "ValueKey": "FeatureValue.call-templates",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.call-templates",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Templates",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "call-types-priorities",
+ "AreaId": "calls",
+ "LabelKey": "Feature.call-types-priorities",
+ "PurposeKey": "FeaturePurpose.call-types-priorities",
+ "ValueKey": "FeatureValue.call-types-priorities",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.call-types-priorities",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "Types"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "run-cards",
+ "AreaId": "calls",
+ "LabelKey": "Feature.run-cards",
+ "PurposeKey": "FeaturePurpose.run-cards",
+ "ValueKey": "FeatureValue.run-cards",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.run-cards",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RunCards",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Dispatch.RunCards"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": [
+ "run-cards"
+ ],
+ "Setup": {
+ "EvidenceId": "runCardCount",
+ "Minimum": 1,
+ "RuleIds": [
+ "run-cards"
+ ],
+ "GuidanceKey": "SetupEvidence.run-cards"
+ }
+ },
+ {
+ "Id": "checkin-setup",
+ "AreaId": "calls",
+ "LabelKey": "Feature.checkin-setup",
+ "PurposeKey": "FeaturePurpose.checkin-setup",
+ "ValueKey": "FeatureValue.checkin-setup",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.checkin-setup",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "field.DispatchRecommendationConfig.EtaShortlistSize",
+ "field.DispatchRecommendationConfig.IncludeStaleLocations",
+ "field.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "field.DispatchRecommendationConfig.MaxRadiusMeters",
+ "field.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "field.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "field.DispatchRecommendationConfig.RestPeriodMinutes",
+ "field.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "field.DispatchRecommendationConfig.UseRoutedEta",
+ "field.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "field.GroupDispatchScopeConfig.Enabled",
+ "field.NewCallFieldPolicy.Rules",
+ "field.NewCallFieldRule.Key",
+ "field.NewCallFieldRule.Required",
+ "field.NewCallFieldRule.Visible",
+ "field.UnitTypeCallStatusOverride.DispatchStatus",
+ "field.UnitTypeCallStatusOverride.ReleaseStatus",
+ "field.UnitTypeCallStatusOverride.UnitTypeId",
+ "field.UnitTypeCallStatusOverrideSetting.Overrides",
+ "setting.AutoSetStatusForShiftDispatchPersonnel",
+ "setting.CheckInTimersAutoEnableForNewCalls",
+ "setting.DispatchRecommendationAutoDispatch",
+ "setting.DispatchRecommendationConfig",
+ "setting.DispatchRecommendationMode",
+ "setting.DispatchShiftInsteadOfGroup",
+ "setting.GroupDispatchScopeConfig",
+ "setting.NewCallFieldPolicy",
+ "setting.PersonnelOnUnitSetUnitStatus",
+ "setting.ShiftCallDispatchPersonnelStatusToSet",
+ "setting.ShiftCallReleasePersonnelStatusToSet",
+ "setting.UnitCallDispatchStatusToSet",
+ "setting.UnitCallReleaseStatusToSet",
+ "setting.UnitCallStatusOverridesByUnitType",
+ "setting.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "setting.UnitDispatchAlsoDispatchToGroup"
+ ],
+ "RuleIds": [
+ "checkin-timers",
+ "shift-auto-without-dispatch",
+ "shift-coverage"
+ ],
+ "Setup": {
+ "EvidenceId": "checkInTimerCount",
+ "Minimum": 1,
+ "RuleIds": [
+ "checkin-timers"
+ ],
+ "GuidanceKey": "SetupEvidence.checkin-setup"
+ }
+ },
+ {
+ "Id": "text-intake",
+ "AreaId": "calls",
+ "LabelKey": "Feature.text-intake",
+ "PurposeKey": "FeaturePurpose.text-intake",
+ "ValueKey": "FeatureValue.text-intake",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.text-intake",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "setting.EnableTextCommand",
+ "setting.EnableTextToCall",
+ "setting.TextToCallImportFormat",
+ "setting.TextToCallNumber",
+ "setting.TextToCallSourceNumbers",
+ "setting.TtsLanguage"
+ ],
+ "RuleIds": [
+ "command-sources",
+ "text-sources"
+ ]
+ },
+ {
+ "Id": "email-intake",
+ "AreaId": "calls",
+ "LabelKey": "Feature.email-intake",
+ "PurposeKey": "FeaturePurpose.email-intake",
+ "ValueKey": "FeatureValue.email-intake",
+ "ExampleKey": "AreaExample.calls",
+ "AdoptionKey": "FeatureAdoption.email-intake",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "setting.InternalDispatchEmail",
+ "setting.RssFeedKeyForActiveCalls",
+ "table.DepartmentCallEmail.ErrorMessage",
+ "table.DepartmentCallEmail.FormatType",
+ "table.DepartmentCallEmail.Hostname",
+ "table.DepartmentCallEmail.IsFailure",
+ "table.DepartmentCallEmail.LastCheck",
+ "table.DepartmentCallEmail.Password",
+ "table.DepartmentCallEmail.Port",
+ "table.DepartmentCallEmail.UseSsl",
+ "table.DepartmentCallEmail.Username"
+ ],
+ "RuleIds": [
+ "email-import-failures",
+ "import-heartbeat"
+ ],
+ "Setup": {
+ "EvidenceId": "emailImportSourceCount",
+ "Minimum": 1,
+ "RuleIds": [
+ "email-import-failures",
+ "import-heartbeat"
+ ],
+ "GuidanceKey": "SetupEvidence.email-intake"
+ }
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "shift-auto-without-dispatch",
+ "AreaId": "calls",
+ "Severity": "Warning",
+ "TitleKey": "Rule.shift-auto-without-dispatch",
+ "ExplanationKey": "RuleWhy.shift-auto-without-dispatch",
+ "NextActionKey": "RuleNext.shift-auto-without-dispatch",
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "AutoSetStatusForShiftDispatchPersonnel",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "DispatchShiftInsteadOfGroup",
+ "Comparison": "IsFalse",
+ "Number": null
+ }
+ ]
+ },
+ {
+ "Id": "shift-coverage",
+ "AreaId": "calls",
+ "Severity": "Critical",
+ "TitleKey": "Rule.shift-coverage",
+ "ExplanationKey": "RuleWhy.shift-coverage",
+ "NextActionKey": "RuleNext.shift-coverage",
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "DispatchShiftInsteadOfGroup",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "groupsWithoutShiftCoverage",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "text-sources",
+ "AreaId": "calls",
+ "Severity": "Critical",
+ "TitleKey": "Rule.text-sources",
+ "ExplanationKey": "RuleWhy.text-sources",
+ "NextActionKey": "RuleNext.text-sources",
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "EnableTextToCall",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "textSourcePresent",
+ "Comparison": "IsFalse",
+ "Number": null
+ }
+ ]
+ },
+ {
+ "Id": "run-cards",
+ "AreaId": "calls",
+ "Severity": "Warning",
+ "TitleKey": "Rule.run-cards",
+ "ExplanationKey": "RuleWhy.run-cards",
+ "NextActionKey": "RuleNext.run-cards",
+ "Location": {
+ "Controller": "RunCards",
+ "Action": "Index"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "DispatchRecommendationMode",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "runCardCount",
+ "Comparison": "Equal",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "checkin-timers",
+ "AreaId": "calls",
+ "Severity": "Warning",
+ "TitleKey": "Rule.checkin-timers",
+ "ExplanationKey": "RuleWhy.checkin-timers",
+ "NextActionKey": "RuleNext.checkin-timers",
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "CheckInTimersAutoEnableForNewCalls",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "checkInTimerCount",
+ "Comparison": "Equal",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "import-heartbeat",
+ "AreaId": "calls",
+ "Severity": "Warning",
+ "TitleKey": "Rule.import-heartbeat",
+ "ExplanationKey": "RuleWhy.import-heartbeat",
+ "NextActionKey": "RuleNext.import-heartbeat",
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "importHeartbeatExpected",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "importHeartbeatMissing",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ]
+ },
+ {
+ "Id": "email-import-failures",
+ "AreaId": "calls",
+ "Severity": "Warning",
+ "TitleKey": "Rule.email-import-failures",
+ "ExplanationKey": "RuleWhy.email-import-failures",
+ "NextActionKey": "RuleNext.email-import-failures",
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "emailImportSourceCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "emailImportFailureCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "setting.RssFeedKeyForActiveCalls",
+ "Locale": "en",
+ "TitleKey": "Setting.RssFeedKeyForActiveCalls",
+ "Body": "Rss Feed Key For Active Calls. Credential for the active-call feed. Treat the feed and its key as sensitive; rotate through its owning screen.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-rssfeedkeyforactivecalls",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.TextToCallNumber",
+ "Locale": "en",
+ "TitleKey": "Setting.TextToCallNumber",
+ "Body": "Text To Call Number. Provisioned inbound text number. Provisioning has external effects and must use the normal text settings flow.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-texttocallnumber",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.TextToCallImportFormat",
+ "Locale": "en",
+ "TitleKey": "Setting.TextToCallImportFormat",
+ "Body": "Text To Call Import Format. Parser used for inbound text call creation. Verify the sender format with a controlled example on the owning screen.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-texttocallimportformat",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.TextToCallSourceNumbers",
+ "Locale": "en",
+ "TitleKey": "Setting.TextToCallSourceNumbers",
+ "Body": "Text To Call Source Numbers. Allowed inbound source numbers for text calls and commands. Empty sources prevent accepted intake; never display raw numbers in Admin Assist.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-texttocallsourcenumbers",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.EnableTextToCall",
+ "Locale": "en",
+ "TitleKey": "Setting.EnableTextToCall",
+ "Body": "Enable Text To Call. Configured text-call preference. Enforcement differs by provider and chatbot path; the stored value alone does not prove intake is stopped or accepted. Review sender classification and perform an explicit controlled verification on the owning screen.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-enabletexttocall",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.InternalDispatchEmail",
+ "Locale": "en",
+ "TitleKey": "Setting.InternalDispatchEmail",
+ "Body": "Internal Dispatch Email. Assigned internal dispatch email address. Presence can be shown; the address stays on the authorized import screen.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-internaldispatchemail",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.CallsSortOrder",
+ "Locale": "en",
+ "TitleKey": "Setting.CallsSortOrder",
+ "Body": "Calls Sort Order. Sort order for displayed calls; does not reorder provider delivery or change call priority.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-callssortorder",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.DispatchShiftInsteadOfGroup",
+ "Locale": "en",
+ "TitleKey": "Setting.DispatchShiftInsteadOfGroup",
+ "Body": "Dispatch Shift Instead Of Group. Expand dispatched groups using the resolved on-duty roster. An empty shift result falls back to group members; preview both cases.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-dispatchshiftinsteadofgroup",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.AutoSetStatusForShiftDispatchPersonnel",
+ "Locale": "en",
+ "TitleKey": "Setting.AutoSetStatusForShiftDispatchPersonnel",
+ "Body": "Auto Set Status For Shift Dispatch Personnel. Apply the configured status to shift-dispatched personnel. This only takes effect with shift dispatch enabled.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-autosetstatusforshiftdispatchpersonnel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.ShiftCallDispatchPersonnelStatusToSet",
+ "Locale": "en",
+ "TitleKey": "Setting.ShiftCallDispatchPersonnelStatusToSet",
+ "Body": "Shift Call Dispatch Personnel Status To Set. Personnel status applied when shift dispatch occurs. Minus one leaves status unchanged; use an existing approved status.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-shiftcalldispatchpersonnelstatustoset",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.ShiftCallReleasePersonnelStatusToSet",
+ "Locale": "en",
+ "TitleKey": "Setting.ShiftCallReleasePersonnelStatusToSet",
+ "Body": "Shift Call Release Personnel Status To Set. Personnel status applied on call release for the shift-dispatch path. Minus one leaves status unchanged.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-shiftcallreleasepersonnelstatustoset",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "Locale": "en",
+ "TitleKey": "Setting.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "Body": "Unit Dispatch Also Dispatch To Assigned Personnel. Expand unit dispatch to its assigned crew. Review duplicate routes, current assignments and recipient permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-unitdispatchalsodispatchtoassignedpersonnel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.UnitDispatchAlsoDispatchToGroup",
+ "Locale": "en",
+ "TitleKey": "Setting.UnitDispatchAlsoDispatchToGroup",
+ "Body": "Unit Dispatch Also Dispatch To Group. Expand unit dispatch to the station group. This can substantially increase the recipient audience.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-unitdispatchalsodispatchtogroup",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.CheckInTimersAutoEnableForNewCalls",
+ "Locale": "en",
+ "TitleKey": "Setting.CheckInTimersAutoEnableForNewCalls",
+ "Body": "Check In Timers Auto Enable For New Calls. Automatically start configured check-in timers for new calls. Review timer targets and escalation before enabling it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-checkintimersautoenablefornewcalls",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.UnitCallDispatchStatusToSet",
+ "Locale": "en",
+ "TitleKey": "Setting.UnitCallDispatchStatusToSet",
+ "Body": "Unit Call Dispatch Status To Set. Unit status applied during call dispatch. Minus one or an invalid built-in unit status leaves the status unchanged.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-unitcalldispatchstatustoset",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.UnitCallReleaseStatusToSet",
+ "Locale": "en",
+ "TitleKey": "Setting.UnitCallReleaseStatusToSet",
+ "Body": "Unit Call Release Status To Set. Unit status applied at call release. Review unit-type overrides before assuming one department-wide effect.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-unitcallreleasestatustoset",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.UnitCallStatusOverridesByUnitType",
+ "Locale": "en",
+ "TitleKey": "Setting.UnitCallStatusOverridesByUnitType",
+ "Body": "Unit Call Status Overrides By Unit Type. Per-unit-type call status overrides. Existing type-specific values take precedence over department defaults.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-unitcallstatusoverridesbyunittype",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.DispatchRecommendationMode",
+ "Locale": "en",
+ "TitleKey": "Setting.DispatchRecommendationMode",
+ "Body": "Dispatch Recommendation Mode. Dispatch recommendation selection mode. Review run cards, eligible resources and human dispatch responsibility.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-dispatchrecommendationmode",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.DispatchRecommendationAutoDispatch",
+ "Locale": "en",
+ "TitleKey": "Setting.DispatchRecommendationAutoDispatch",
+ "Body": "Dispatch Recommendation Auto Dispatch. Allow the recommendation path to dispatch automatically where enabled. Preview recipients and verify local procedures first.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-dispatchrecommendationautodispatch",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.DispatchRecommendationConfig",
+ "Locale": "en",
+ "TitleKey": "Setting.DispatchRecommendationConfig",
+ "Body": "Dispatch Recommendation Config. Location, ETA, rest, crew and move-up settings used by recommendation consumers. External ETA calls occur only in the owning operational flow.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-dispatchrecommendationconfig",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.NewCallFieldPolicy",
+ "Locale": "en",
+ "TitleKey": "Setting.NewCallFieldPolicy",
+ "Body": "New Call Field Policy. Controls optional new-call fields across supported clients. Hidden fields cannot be required; core dispatch fields remain mandatory.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-newcallfieldpolicy",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.GroupDispatchScopeConfig",
+ "Locale": "en",
+ "TitleKey": "Setting.GroupDispatchScopeConfig",
+ "Body": "Group Dispatch Scope Config. Group-subtree dispatch visibility with explicit role exceptions. Preview each actor and target scope before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-groupdispatchscopeconfig",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverrideSetting.Overrides",
+ "Locale": "en",
+ "TitleKey": "Field.UnitTypeCallStatusOverrideSetting.Overrides",
+ "Body": "Unit Type Call Status Override Setting / Overrides. Per-unit-type dispatch and release status overrides. The owning consumer resolves these before department defaults.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unittypecallstatusoverridesetting-overrides",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverride.UnitTypeId",
+ "Locale": "en",
+ "TitleKey": "Field.UnitTypeCallStatusOverride.UnitTypeId",
+ "Body": "Unit Type Call Status Override / Unit Type Id. Existing unit type receiving this override. A unit type name is not a qualification or staffing clearance.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unittypecallstatusoverride-unittypeid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverride.DispatchStatus",
+ "Locale": "en",
+ "TitleKey": "Field.UnitTypeCallStatusOverride.DispatchStatus",
+ "Body": "Unit Type Call Status Override / Dispatch Status. Status applied to this unit type on dispatch; minus one leaves it unchanged.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unittypecallstatusoverride-dispatchstatus",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitTypeCallStatusOverride.ReleaseStatus",
+ "Locale": "en",
+ "TitleKey": "Field.UnitTypeCallStatusOverride.ReleaseStatus",
+ "Body": "Unit Type Call Status Override / Release Status. Status applied to this unit type on release; minus one leaves it unchanged.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unittypecallstatusoverride-releasestatus",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.NewCallFieldPolicy.Rules",
+ "Locale": "en",
+ "TitleKey": "Field.NewCallFieldPolicy.Rules",
+ "Body": "New Call Field Policy / Rules. Per-field visibility and requiredness for optional call-creation fields. Unconfigured fields remain visible and optional.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-newcallfieldpolicy-rules",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.NewCallFieldRule.Key",
+ "Locale": "en",
+ "TitleKey": "Field.NewCallFieldRule.Key",
+ "Body": "New Call Field Rule / Key. One supported built-in call-field key. Name, nature, priority and type cannot be removed through this policy.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-newcallfieldrule-key",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.NewCallFieldRule.Visible",
+ "Locale": "en",
+ "TitleKey": "Field.NewCallFieldRule.Visible",
+ "Body": "New Call Field Rule / Visible. Whether the optional call field is shown on supported creation surfaces. Hidden fields cannot be required.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-newcallfieldrule-visible",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.NewCallFieldRule.Required",
+ "Locale": "en",
+ "TitleKey": "Field.NewCallFieldRule.Required",
+ "Body": "New Call Field Rule / Required. Whether a visible optional field must be supplied. Review imports and each supported client before making a field mandatory.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-newcallfieldrule-required",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.GroupDispatchScopeConfig.Enabled",
+ "Locale": "en",
+ "TitleKey": "Field.GroupDispatchScopeConfig.Enabled",
+ "Body": "Group Dispatch Scope Config / Enabled. Limit supported dispatch views to the member's group subtree. Department administrators and configured department-wide roles keep department-wide access.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-groupdispatchscopeconfig-enabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "Locale": "en",
+ "TitleKey": "Field.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "Body": "Group Dispatch Scope Config / Department Wide Role Ids. Existing roles allowed department-wide dispatch views while group scoping is enabled. This changes view scope, not licensing or operational qualification.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-groupdispatchscopeconfig-departmentwideroleids",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "Body": "Dispatch Recommendation Config / Max Location Age Seconds. Exclude older unit positions from closest-unit candidates; zero removes the age limit. IncludeStaleLocations changes this behavior.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-maxlocationageseconds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.MaxRadiusMeters",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.MaxRadiusMeters",
+ "Body": "Dispatch Recommendation Config / Max Radius Meters. Maximum candidate distance in meters; zero removes the radius cap. This is not a response-time or route-safety guarantee.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-maxradiusmeters",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.IncludeStaleLocations",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.IncludeStaleLocations",
+ "Body": "Dispatch Recommendation Config / Include Stale Locations. Permit positions beyond the configured age limit in closest-unit selection, marked stale. Review the risk of outdated positions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-includestalelocations",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "Body": "Dispatch Recommendation Config / Personnel Max Location Age Seconds. Maximum age of personnel positions for closest-unit candidate selection; zero removes the age limit.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-personnelmaxlocationageseconds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.UseRoutedEta",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.UseRoutedEta",
+ "Body": "Dispatch Recommendation Config / Use Routed Eta. Re-rank shortlisted candidates using provider travel estimates. The operational path can make external provider calls; Admin Assist does not.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-useroutedeta",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.EtaShortlistSize",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.EtaShortlistSize",
+ "Body": "Dispatch Recommendation Config / Eta Shortlist Size. Number of straight-line candidates per requirement sent for routed ETA when enabled. The owning validator caps provider work.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-etashortlistsize",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.RestPeriodMinutes",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.RestPeriodMinutes",
+ "Body": "Dispatch Recommendation Config / Rest Period Minutes. Deprioritize recently dispatched resources for this duration; zero disables rotation. This does not infer fatigue or medical fitness.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-restperiodminutes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "Body": "Dispatch Recommendation Config / Unit Minimum Staffing Level. Minimum configured unit staffing level for recommendation eligibility; zero disables the gate. Units without defined seats pass, and run cards may override it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-unitminimumstaffinglevel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "Locale": "en",
+ "TitleKey": "Field.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "Body": "Dispatch Recommendation Config / Move Up Recommendations Enabled. Run the station coverage move-up pass after selection. Recommendations remain subject to approved local dispatch procedures.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-dispatchrecommendationconfig-moveuprecommendationsenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Hostname",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.Hostname",
+ "Body": "Department Call Email / Hostname. Mailbox host for email intake. Review the approved provider and network reachability without exposing credentials in setup guidance.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-hostname",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Port",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.Port",
+ "Body": "Department Call Email / Port. Mailbox connection port. It must match the selected provider and TLS mode.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-port",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.UseSsl",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.UseSsl",
+ "Body": "Department Call Email / Use Ssl. Mailbox transport encryption option. Verify actual provider compatibility and successful polling; a stored flag alone does not prove transport protection.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-usessl",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Username",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.Username",
+ "Body": "Department Call Email / Username. Mailbox account identifier used for intake. It remains on the authorized configuration screen.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-username",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.Password",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.Password",
+ "Body": "Department Call Email / Password. Mailbox credential. Do not copy it into Admin Assist; rotate it through the mailbox and owning editor together.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-password",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.FormatType",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.FormatType",
+ "Body": "Department Call Email / Format Type. Selects the inbound email parser. Verify representative permitted source messages without sending an operational page unintentionally.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-formattype",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.LastCheck",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.LastCheck",
+ "Body": "Department Call Email / Last Check. Last recorded polling timestamp. Missing or future timestamps are unknown; quiet call volume is not proof of a poll failure.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-lastcheck",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.IsFailure",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.IsFailure",
+ "Body": "Department Call Email / Is Failure. Latest recorded mailbox failure flag. Verify a new poll before treating it as a continuing outage or a resolved problem.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-isfailure",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentCallEmail.ErrorMessage",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentCallEmail.ErrorMessage",
+ "Body": "Department Call Email / Error Message. Provider/import error details on the authorized screen. Admin Assist uses a normalized failure indication and does not copy provider bodies.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentcallemail-errormessage",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "calls",
+ "Locale": "en",
+ "TitleKey": "Feature.calls",
+ "Body": "Calls View calls and dispatches Make call intake and recipient selection consistent across shifts. Review a test scenario before enabling CAD intake or changing dispatch routing. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "calls",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-call",
+ "Locale": "en",
+ "TitleKey": "Feature.new-call",
+ "Body": "New Call Create and dispatch a new call Make call intake and recipient selection consistent across shifts. Review a test scenario before enabling CAD intake or changing dispatch routing. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-call",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "archived-calls",
+ "Locale": "en",
+ "TitleKey": "Feature.archived-calls",
+ "Body": "Archived Calls Closed and historical calls Make call intake and recipient selection consistent across shifts. Review a test scenario before enabling CAD intake or changing dispatch routing. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "archived-calls",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "incident-command",
+ "Locale": "en",
+ "TitleKey": "Feature.incident-command",
+ "Body": "Incident command and accountability Command tools organize incident roles and accountability for authorized commanders. Prepare command structures and access before an exercise or response. Review a test scenario before enabling CAD intake or changing dispatch routing. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "incident-command",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "call-templates",
+ "Locale": "en",
+ "TitleKey": "Feature.call-templates",
+ "Body": "Call templates Maintain reusable call information and note templates. Reduce repeated entry while keeping dispatch decisions explicit. Review a test scenario before enabling CAD intake or changing dispatch routing. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "call-templates",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "call-types-priorities",
+ "Locale": "en",
+ "TitleKey": "Feature.call-types-priorities",
+ "Body": "Call types and priorities Maintain the department's call classifications and priorities. Use consistent reporting and run-card matching terms. Review a test scenario before enabling CAD intake or changing dispatch routing. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "call-types-priorities",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "run-cards",
+ "Locale": "en",
+ "TitleKey": "Feature.run-cards",
+ "Body": "Run cards and recommendations Configure matching rules, resource requirements and supported dispatch recommendations. Review candidate coverage before enabling operational use. Review a test scenario before enabling CAD intake or changing dispatch routing. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "run-cards",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "checkin-setup",
+ "Locale": "en",
+ "TitleKey": "Feature.checkin-setup",
+ "Body": "Check-in timers Configure supported check-in targets and escalation behavior. Review lone-worker and response follow-up with approved local procedures. Review a test scenario before enabling CAD intake or changing dispatch routing. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "checkin-setup",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "text-intake",
+ "Locale": "en",
+ "TitleKey": "Feature.text-intake",
+ "Body": "Text call intake and commands Configure source numbers, parsing and supported inbound text actions. Make approved inbound sources and their operational effects explicit. Review a test scenario before enabling CAD intake or changing dispatch routing. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "text-intake",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "email-intake",
+ "Locale": "en",
+ "TitleKey": "Feature.email-intake",
+ "Body": "Email and CAD call intake Configure supported email and CAD import formats and source credentials. Review parsing, routing and observed integration failures before activation. Review a test scenario before enabling CAD intake or changing dispatch routing. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "email-intake",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/communication.yaml b/Core/Resgrid.AdminAssist/Catalog/communication.yaml
new file mode 100644
index 000000000..a2df094b1
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/communication.yaml
@@ -0,0 +1,1226 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "communication",
+ "LabelKey": "Area.communication",
+ "PurposeKey": "AreaPurpose.communication",
+ "Order": 4,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.EnableTextCommand",
+ "AreaId": "communication",
+ "LabelKey": "Setting.EnableTextCommand",
+ "HelpKey": "SettingHelp.EnableTextCommand",
+ "Binding": "DepartmentSettingTypes.EnableTextCommand",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings",
+ "Field": "EnableTextCommand"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.EnableTextCommand",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.TtsLanguage",
+ "AreaId": "communication",
+ "LabelKey": "Setting.TtsLanguage",
+ "HelpKey": "SettingHelp.TtsLanguage",
+ "Binding": "DepartmentSettingTypes.TtsLanguage",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings",
+ "Field": "TtsLanguage"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.TtsLanguage",
+ "DefaultValue": "owning voice default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.EnableModernNotifications",
+ "AreaId": "communication",
+ "LabelKey": "Setting.EnableModernNotifications",
+ "HelpKey": "SettingHelp.EnableModernNotifications",
+ "Binding": "DepartmentSettingTypes.EnableModernNotifications",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "EnableModernNotifications"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.EnableModernNotifications",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.MessagingDisabled",
+ "AreaId": "communication",
+ "LabelKey": "Module.MessagingDisabled",
+ "HelpKey": "ModuleHelp.MessagingDisabled",
+ "Binding": "DepartmentModuleSettings.MessagingDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "MessagingEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.MessagingDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.MessagingNameOverride",
+ "AreaId": "communication",
+ "LabelKey": "Module.MessagingNameOverride",
+ "HelpKey": "ModuleHelp.MessagingNameOverride",
+ "Binding": "DepartmentModuleSettings.MessagingNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.MessagingNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.EventType",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.EventType",
+ "HelpKey": "TableHelp.DepartmentNotification.EventType",
+ "Binding": "DepartmentNotification.EventType",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.EventType",
+ "DefaultValue": "required",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.UsersToNotify",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.UsersToNotify",
+ "HelpKey": "TableHelp.DepartmentNotification.UsersToNotify",
+ "Binding": "DepartmentNotification.UsersToNotify",
+ "ValueType": "reference-list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.UsersToNotify",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.RolesToNotify",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.RolesToNotify",
+ "HelpKey": "TableHelp.DepartmentNotification.RolesToNotify",
+ "Binding": "DepartmentNotification.RolesToNotify",
+ "ValueType": "reference-list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.RolesToNotify",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.GroupsToNotify",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.GroupsToNotify",
+ "HelpKey": "TableHelp.DepartmentNotification.GroupsToNotify",
+ "Binding": "DepartmentNotification.GroupsToNotify",
+ "ValueType": "reference-list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.GroupsToNotify",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.LockToGroup",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.LockToGroup",
+ "HelpKey": "TableHelp.DepartmentNotification.LockToGroup",
+ "Binding": "DepartmentNotification.LockToGroup",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.LockToGroup",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.SelectedGroupsAdminsOnly",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.SelectedGroupsAdminsOnly",
+ "HelpKey": "TableHelp.DepartmentNotification.SelectedGroupsAdminsOnly",
+ "Binding": "DepartmentNotification.SelectedGroupsAdminsOnly",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.SelectedGroupsAdminsOnly",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.DepartmentAdmins",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.DepartmentAdmins",
+ "HelpKey": "TableHelp.DepartmentNotification.DepartmentAdmins",
+ "Binding": "DepartmentNotification.DepartmentAdmins",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.DepartmentAdmins",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.Everyone",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.Everyone",
+ "HelpKey": "TableHelp.DepartmentNotification.Everyone",
+ "Binding": "DepartmentNotification.Everyone",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.Everyone",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.Disabled",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.Disabled",
+ "HelpKey": "TableHelp.DepartmentNotification.Disabled",
+ "Binding": "DepartmentNotification.Disabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.Disabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.BeforeData",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.BeforeData",
+ "HelpKey": "TableHelp.DepartmentNotification.BeforeData",
+ "Binding": "DepartmentNotification.BeforeData",
+ "ValueType": "structured",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.BeforeData",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.CurrentData",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.CurrentData",
+ "HelpKey": "TableHelp.DepartmentNotification.CurrentData",
+ "Binding": "DepartmentNotification.CurrentData",
+ "ValueType": "structured",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.CurrentData",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.UpperLimit",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.UpperLimit",
+ "HelpKey": "TableHelp.DepartmentNotification.UpperLimit",
+ "Binding": "DepartmentNotification.UpperLimit",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.UpperLimit",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.LowerLimit",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.LowerLimit",
+ "HelpKey": "TableHelp.DepartmentNotification.LowerLimit",
+ "Binding": "DepartmentNotification.LowerLimit",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.LowerLimit",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentNotification.Data",
+ "AreaId": "communication",
+ "LabelKey": "TableField.DepartmentNotification.Data",
+ "HelpKey": "TableHelp.DepartmentNotification.Data",
+ "Binding": "DepartmentNotification.Data",
+ "ValueType": "structured",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.communication",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentNotification.Data",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentNotification",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "inbox",
+ "AreaId": "communication",
+ "LabelKey": "Feature.inbox",
+ "PurposeKey": "FeaturePurpose.inbox",
+ "ValueKey": "AreaValue.communication",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.inbox",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Messages",
+ "Action": "Inbox"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Messaging"
+ }
+ ],
+ "SettingIds": [
+ "module.MessagingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "outbox",
+ "AreaId": "communication",
+ "LabelKey": "Feature.outbox",
+ "PurposeKey": "FeaturePurpose.outbox",
+ "ValueKey": "AreaValue.communication",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.outbox",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Messages",
+ "Action": "Outbox"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Messaging"
+ }
+ ],
+ "SettingIds": [
+ "module.MessagingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "compose-message",
+ "AreaId": "communication",
+ "LabelKey": "Feature.compose-message",
+ "PurposeKey": "FeaturePurpose.compose-message",
+ "ValueKey": "AreaValue.communication",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.compose-message",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Messages",
+ "Action": "Compose"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Messaging"
+ }
+ ],
+ "SettingIds": [
+ "module.MessagingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "chat",
+ "AreaId": "communication",
+ "LabelKey": "Feature.chat",
+ "PurposeKey": "FeaturePurpose.chat",
+ "ValueKey": "AreaValue.communication",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.chat",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Chat",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Chat.System"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "voice",
+ "AreaId": "communication",
+ "LabelKey": "Feature.voice",
+ "PurposeKey": "FeaturePurpose.voice",
+ "ValueKey": "AreaValue.communication",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.voice",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Voice",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "PTT"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "notifications",
+ "AreaId": "communication",
+ "LabelKey": "Feature.notifications",
+ "PurposeKey": "FeaturePurpose.notifications",
+ "ValueKey": "FeatureValue.notifications",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.notifications",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Notifications",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "table.DepartmentNotification.BeforeData",
+ "table.DepartmentNotification.CurrentData",
+ "table.DepartmentNotification.Data",
+ "table.DepartmentNotification.DepartmentAdmins",
+ "table.DepartmentNotification.Disabled",
+ "table.DepartmentNotification.EventType",
+ "table.DepartmentNotification.Everyone",
+ "table.DepartmentNotification.GroupsToNotify",
+ "table.DepartmentNotification.LockToGroup",
+ "table.DepartmentNotification.LowerLimit",
+ "table.DepartmentNotification.RolesToNotify",
+ "table.DepartmentNotification.SelectedGroupsAdminsOnly",
+ "table.DepartmentNotification.UpperLimit",
+ "table.DepartmentNotification.UsersToNotify"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "distribution-lists",
+ "AreaId": "communication",
+ "LabelKey": "Feature.distribution-lists",
+ "PurposeKey": "FeaturePurpose.distribution-lists",
+ "ValueKey": "FeatureValue.distribution-lists",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.distribution-lists",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "DistributionLists",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "communication-tests",
+ "AreaId": "communication",
+ "LabelKey": "Feature.communication-tests",
+ "PurposeKey": "FeaturePurpose.communication-tests",
+ "ValueKey": "FeatureValue.communication-tests",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.communication-tests",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "CommunicationTest",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "communication-tests"
+ ]
+ },
+ {
+ "Id": "chatbot-settings",
+ "AreaId": "communication",
+ "LabelKey": "Feature.chatbot-settings",
+ "PurposeKey": "FeaturePurpose.chatbot-settings",
+ "ValueKey": "FeatureValue.chatbot-settings",
+ "ExampleKey": "AreaExample.communication",
+ "AdoptionKey": "FeatureAdoption.chatbot-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "ChatbotSettings",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "table.ChatbotDepartmentConfig.AllowDispatchViaChatbot",
+ "table.ChatbotDepartmentConfig.AllowedPlatforms",
+ "table.ChatbotDepartmentConfig.IsEnabled",
+ "table.ChatbotDepartmentConfig.LlmApiEndpoint",
+ "table.ChatbotDepartmentConfig.LlmApiKey",
+ "table.ChatbotDepartmentConfig.LlmModelName",
+ "table.ChatbotDepartmentConfig.MaxSessionsPerUser",
+ "table.ChatbotDepartmentConfig.MessagesPerDepartmentPerMinute",
+ "table.ChatbotDepartmentConfig.MessagesPerUserPerMinute",
+ "table.ChatbotDepartmentConfig.ProactiveNotificationsEnabled",
+ "table.ChatbotDepartmentConfig.RequireConfirmationForStatusChange",
+ "table.ChatbotDepartmentConfig.RequireLinkingConfirmation",
+ "table.ChatbotDepartmentConfig.SessionTtlMinutes"
+ ],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "command-sources",
+ "AreaId": "communication",
+ "Severity": "Warning",
+ "TitleKey": "Rule.command-sources",
+ "ExplanationKey": "RuleWhy.command-sources",
+ "NextActionKey": "RuleNext.command-sources",
+ "Location": {
+ "Controller": "Department",
+ "Action": "TextSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "EnableTextCommand",
+ "Comparison": "IsTrue",
+ "Number": null
+ },
+ {
+ "EvidenceId": "EnableTextToCall",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "textSourcePresent",
+ "Comparison": "IsFalse",
+ "Number": null
+ }
+ ]
+ },
+ {
+ "Id": "communication-tests",
+ "AreaId": "communication",
+ "Severity": "Warning",
+ "TitleKey": "Rule.communication-tests",
+ "ExplanationKey": "RuleWhy.communication-tests",
+ "NextActionKey": "RuleNext.communication-tests",
+ "Location": {
+ "Controller": "CommunicationTest",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "communicationTestAgeDays",
+ "Comparison": "Greater",
+ "Number": 30
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "setting.EnableTextCommand",
+ "Locale": "en",
+ "TitleKey": "Setting.EnableTextCommand",
+ "Body": "Enable Text Command. Configured text-command preference. Dispatch-source patterns and verified member command identity are different checks. Provider and chatbot paths do not enforce this switch uniformly; review the active consumer before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-enabletextcommand",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.TtsLanguage",
+ "Locale": "en",
+ "TitleKey": "Setting.TtsLanguage",
+ "Body": "Tts Language. Text-to-speech language for supported voice notifications. Confirm supported voices and pronunciation with a human-run test.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-ttslanguage",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.EnableModernNotifications",
+ "Locale": "en",
+ "TitleKey": "Setting.EnableModernNotifications",
+ "Body": "Enable Modern Notifications. Use supported modern notification behavior. Verify each consumer and channel; provider acceptance is not delivery.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-enablemodernnotifications",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.MessagingDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.MessagingDisabled",
+ "Body": "Messaging availability. Controls availability of messages and announcements. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-messagingdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.MessagingNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.MessagingNameOverride",
+ "Body": "Messaging menu name. Optional display name for messages and announcements in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-messagingnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.EventType",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.EventType",
+ "Body": "Department Notification / Event Type. Event that can trigger this notification rule. Match the event to a real administrative responsibility and expected frequency.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-eventtype",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.UsersToNotify",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.UsersToNotify",
+ "Body": "Department Notification / Users To Notify. Explicit member recipients. Membership and channel eligibility are evaluated separately at send time.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-userstonotify",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.RolesToNotify",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.RolesToNotify",
+ "Body": "Department Notification / Roles To Notify. Personnel-role recipients. Role membership can change; a role label is not a qualification or delivery guarantee.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-rolestonotify",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.GroupsToNotify",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.GroupsToNotify",
+ "Body": "Department Notification / Groups To Notify. Department-group recipients. Review group membership and lock-to-group behavior together.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-groupstonotify",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.LockToGroup",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.LockToGroup",
+ "Body": "Department Notification / Lock To Group. Restricts applicable event processing to group scope. Review the selected event's actual source group and recipient resolver.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-locktogroup",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.SelectedGroupsAdminsOnly",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.SelectedGroupsAdminsOnly",
+ "Body": "Department Notification / Selected Groups Admins Only. Limits selected-group recipients to their administrators in supported event paths. It does not designate department administrators automatically.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-selectedgroupsadminsonly",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.DepartmentAdmins",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.DepartmentAdmins",
+ "Body": "Department Notification / Department Admins. Includes department administrators in supported notification processing. Review overlap and channel eligibility before estimating volume.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-departmentadmins",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.Everyone",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.Everyone",
+ "Body": "Department Notification / Everyone. Selects the department-wide recipient option. Review actual active membership, suppression and deduplication before use.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-everyone",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.Disabled",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.Disabled",
+ "Body": "Department Notification / Disabled. Stored disabled marker. The inspected legacy notification processor does not consult this flag, so it must not be treated as a verified stop switch. Review the active consumer; queued and delivered notifications cannot be recalled.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-disabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.BeforeData",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.BeforeData",
+ "Body": "Department Notification / Before Data. Previous-state filter for applicable events. Review valid status IDs and the event-specific interpretation of an empty or wildcard value.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-beforedata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.CurrentData",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.CurrentData",
+ "Body": "Department Notification / Current Data. Current-state filter for applicable events. Compare it with the previous-state filter to avoid unintended volume.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-currentdata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.UpperLimit",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.UpperLimit",
+ "Body": "Department Notification / Upper Limit. Upper threshold for event-specific alerts. Units and comparisons depend on the selected event.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-upperlimit",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.LowerLimit",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.LowerLimit",
+ "Body": "Department Notification / Lower Limit. Lower threshold for event-specific alerts. Use approved local thresholds and verify the actual event interpretation.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-lowerlimit",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentNotification.Data",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentNotification.Data",
+ "Body": "Department Notification / Data. Event-specific configuration payload. The owning editor validates its meaning; Admin Assist does not execute arbitrary stored expressions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentnotification-data",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "inbox",
+ "Locale": "en",
+ "TitleKey": "Feature.inbox",
+ "Body": "Inbox Your messages inbox Choose a communication channel appropriate to the audience and task. Preview recipients and explicitly run a communication test through its own screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "inbox",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "outbox",
+ "Locale": "en",
+ "TitleKey": "Feature.outbox",
+ "Body": "Sent Messages Messages you sent Choose a communication channel appropriate to the audience and task. Preview recipients and explicitly run a communication test through its own screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "outbox",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "compose-message",
+ "Locale": "en",
+ "TitleKey": "Feature.compose-message",
+ "Body": "New Message Send a message, poll or callback request Choose a communication channel appropriate to the audience and task. Preview recipients and explicitly run a communication test through its own screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "compose-message",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "chat",
+ "Locale": "en",
+ "TitleKey": "Feature.chat",
+ "Body": "Chat Real-time department chat Choose a communication channel appropriate to the audience and task. Preview recipients and explicitly run a communication test through its own screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "chat",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "voice",
+ "Locale": "en",
+ "TitleKey": "Feature.voice",
+ "Body": "Voice Voice channels and push-to-talk Choose a communication channel appropriate to the audience and task. Preview recipients and explicitly run a communication test through its own screen. Review supported clients, channel membership and current subscription quantities. Push-to-Talk is distinct from phone voice alerts and department radio requirements.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "voice",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "notifications",
+ "Locale": "en",
+ "TitleKey": "Feature.notifications",
+ "Body": "Notification rules Select events, recipients and conditions for administrative notifications. Reduce missed follow-up and review unnecessary message volume. Preview recipients and explicitly run a communication test through its own screen. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "notifications",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "distribution-lists",
+ "Locale": "en",
+ "TitleKey": "Feature.distribution-lists",
+ "Body": "Distribution lists Maintain reusable recipient lists for supported communication flows. Keep audience ownership explicit and review recipients before sending. Preview recipients and explicitly run a communication test through its own screen. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "distribution-lists",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "communication-tests",
+ "Locale": "en",
+ "TitleKey": "Feature.communication-tests",
+ "Body": "Communication Tests Prepare and explicitly run tests of configured channels. Collect observed test evidence; registration alone does not prove delivery. Preview recipients and explicitly run a communication test through its own screen. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "communication-tests",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "chatbot-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.chatbot-settings",
+ "Body": "Chatbot and Assistant integration settings Review supported chatbot platforms, account linking, limits and operational actions. Keep automated access and confirmations under administrator control. Preview recipients and explicitly run a communication test through its own screen. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "chatbot-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/home.yaml b/Core/Resgrid.AdminAssist/Catalog/home.yaml
new file mode 100644
index 000000000..87969053c
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/home.yaml
@@ -0,0 +1,852 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "home",
+ "LabelKey": "Area.home",
+ "PurposeKey": "AreaPurpose.home",
+ "Order": 0,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.BigBoardMapZoomLevel",
+ "AreaId": "home",
+ "LabelKey": "Setting.BigBoardMapZoomLevel",
+ "HelpKey": "SettingHelp.BigBoardMapZoomLevel",
+ "Binding": "DepartmentSettingTypes.BigBoardMapZoomLevel",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "BigBoardMapZoomLevel"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.home",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.BigBoardMapZoomLevel",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.BigBoardPageRefresh",
+ "AreaId": "home",
+ "LabelKey": "Setting.BigBoardPageRefresh",
+ "HelpKey": "SettingHelp.BigBoardPageRefresh",
+ "Binding": "DepartmentSettingTypes.BigBoardPageRefresh",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "BigBoardPageRefresh"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.home",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.BigBoardPageRefresh",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.BigBoardMapCenterAddress",
+ "AreaId": "home",
+ "LabelKey": "Setting.BigBoardMapCenterAddress",
+ "HelpKey": "SettingHelp.BigBoardMapCenterAddress",
+ "Binding": "DepartmentSettingTypes.BigBoardMapCenterAddress",
+ "ValueType": "reference",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "BigBoardMapCenterAddress"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.home",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.BigBoardMapCenterAddress",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.BigBoardHideUnavailable",
+ "AreaId": "home",
+ "LabelKey": "Setting.BigBoardHideUnavailable",
+ "HelpKey": "SettingHelp.BigBoardHideUnavailable",
+ "Binding": "DepartmentSettingTypes.BigBoardHideUnavailable",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "BigBoardHideUnavailable"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.home",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.BigBoardHideUnavailable",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.BigBoardMapCenterGpsCoordinates",
+ "AreaId": "home",
+ "LabelKey": "Setting.BigBoardMapCenterGpsCoordinates",
+ "HelpKey": "SettingHelp.BigBoardMapCenterGpsCoordinates",
+ "Binding": "DepartmentSettingTypes.BigBoardMapCenterGpsCoordinates",
+ "ValueType": "location",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "BigBoardMapCenterGpsCoordinates"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.home",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.BigBoardMapCenterGpsCoordinates",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "dashboard",
+ "AreaId": "home",
+ "LabelKey": "Feature.dashboard",
+ "PurposeKey": "FeaturePurpose.dashboard",
+ "ValueKey": "AreaValue.home",
+ "ExampleKey": "AreaExample.home",
+ "AdoptionKey": "FeatureAdoption.dashboard",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Home",
+ "Action": "Dashboard"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "profile",
+ "AreaId": "home",
+ "LabelKey": "Feature.profile",
+ "PurposeKey": "FeaturePurpose.profile",
+ "ValueKey": "AreaValue.home",
+ "ExampleKey": "AreaExample.home",
+ "AdoptionKey": "FeatureAdoption.profile",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Home",
+ "Action": "EditUserProfile"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "departments",
+ "AreaId": "home",
+ "LabelKey": "Feature.departments",
+ "PurposeKey": "FeaturePurpose.departments",
+ "ValueKey": "AreaValue.home",
+ "ExampleKey": "AreaExample.home",
+ "AdoptionKey": "FeatureAdoption.departments",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Profile",
+ "Action": "YourDepartments"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "dispatch-app",
+ "AreaId": "home",
+ "LabelKey": "Feature.dispatch-app",
+ "PurposeKey": "FeaturePurpose.dispatch-app",
+ "ValueKey": "FeatureValue.dispatch-app",
+ "ExampleKey": "AreaExample.home",
+ "AdoptionKey": "FeatureAdoption.dispatch-app",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Dispatch",
+ "Action": "Dashboard"
+ },
+ "Requirements": [
+ {
+ "Kind": "permission",
+ "Id": "DispatchAppLogin"
+ }
+ ],
+ "SettingIds": [
+ "permission.DispatchAppLogin"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "responder-app",
+ "AreaId": "home",
+ "LabelKey": "Feature.responder-app",
+ "PurposeKey": "FeaturePurpose.responder-app",
+ "ValueKey": "FeatureValue.responder-app",
+ "ExampleKey": "AreaExample.home",
+ "AdoptionKey": "FeatureAdoption.responder-app",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Home",
+ "Action": "EditUserProfile"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "unit-app",
+ "AreaId": "home",
+ "LabelKey": "Feature.unit-app",
+ "PurposeKey": "FeaturePurpose.unit-app",
+ "ValueKey": "FeatureValue.unit-app",
+ "ExampleKey": "AreaExample.home",
+ "AdoptionKey": "FeatureAdoption.unit-app",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Units",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "unit-group",
+ "unit-type"
+ ]
+ },
+ {
+ "Id": "big-board",
+ "AreaId": "home",
+ "LabelKey": "Feature.big-board",
+ "PurposeKey": "FeaturePurpose.big-board",
+ "ValueKey": "FeatureValue.big-board",
+ "ExampleKey": "AreaExample.home",
+ "AdoptionKey": "FeatureAdoption.big-board",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "field.PersonnelListStatusOrder.StatusId",
+ "field.PersonnelListStatusOrder.Weight",
+ "field.PersonnelListStatusOrderSetting.Orders",
+ "setting.BigBoardHideUnavailable",
+ "setting.BigBoardMapCenterAddress",
+ "setting.BigBoardMapCenterGpsCoordinates",
+ "setting.BigBoardMapZoomLevel",
+ "setting.BigBoardPageRefresh",
+ "setting.CallsSortOrder",
+ "setting.DisabledAutoAvailable",
+ "setting.EnableModernNotifications",
+ "setting.ForceChatbotSecurityPin",
+ "setting.PersonnelListStatusSortOrder",
+ "setting.PersonnelSortOrder",
+ "setting.RequirePasswordResetViaEmail",
+ "setting.StaffingSuppressStaffingLevels",
+ "setting.TestEnabled",
+ "setting.UnitsSortOrder",
+ "setting.UpdateTimestamp",
+ "table.Department.ApiKey",
+ "table.Department.Code",
+ "table.Department.LinkCode",
+ "table.Department.ManagingUserId",
+ "table.Department.PublicApiKey",
+ "table.Department.SharedSecret",
+ "table.Department.ShowWelcome",
+ "table.Department.TimeZone",
+ "table.Department.Use24HourTime"
+ ],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [],
+ "Packs": [
+ {
+ "Id": "fire",
+ "LabelKey": "Pack.fire",
+ "PurposeKey": "PackPurpose.fire",
+ "AreaIds": [
+ "calls",
+ "people",
+ "location",
+ "maintenance"
+ ],
+ "RuleIds": [
+ "shift-auto-without-dispatch",
+ "shift-coverage",
+ "text-sources",
+ "empty-groups",
+ "unit-type",
+ "unit-group",
+ "station-address",
+ "person-location-age",
+ "unit-location-age",
+ "map-token",
+ "map-style",
+ "run-cards",
+ "checkin-timers",
+ "weather-zones",
+ "qualified-coverage",
+ "credential-expiry",
+ "checklist-overdue",
+ "equipment-holds",
+ "import-heartbeat",
+ "email-import-failures",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "site-references"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.fire",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "ems",
+ "LabelKey": "Pack.ems",
+ "PurposeKey": "PackPurpose.ems",
+ "AreaIds": [
+ "people",
+ "maintenance",
+ "inventory",
+ "knowledge"
+ ],
+ "RuleIds": [
+ "empty-groups",
+ "qualified-coverage",
+ "credential-expiry",
+ "checklist-overdue",
+ "equipment-holds",
+ "stock-expiry",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "policy-references",
+ "policy-expiry",
+ "continuity-reference"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.ems",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "mental-health",
+ "LabelKey": "Pack.mental-health",
+ "PurposeKey": "PackPurpose.mental-health",
+ "AreaIds": [
+ "people",
+ "communication",
+ "knowledge",
+ "records"
+ ],
+ "RuleIds": [
+ "command-sources",
+ "empty-groups",
+ "communication-tests",
+ "qualified-coverage",
+ "credential-expiry",
+ "record-review",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "policy-references",
+ "policy-expiry",
+ "continuity-reference"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.mental-health",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "sar",
+ "LabelKey": "Pack.sar",
+ "PurposeKey": "PackPurpose.sar",
+ "AreaIds": [
+ "people",
+ "maintenance",
+ "location",
+ "calls"
+ ],
+ "RuleIds": [
+ "shift-auto-without-dispatch",
+ "shift-coverage",
+ "text-sources",
+ "empty-groups",
+ "unit-type",
+ "unit-group",
+ "station-address",
+ "person-location-age",
+ "unit-location-age",
+ "map-token",
+ "map-style",
+ "run-cards",
+ "checkin-timers",
+ "weather-zones",
+ "qualified-coverage",
+ "credential-expiry",
+ "checklist-overdue",
+ "equipment-holds",
+ "import-heartbeat",
+ "email-import-failures",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "site-references"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.sar",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "emergency-response",
+ "LabelKey": "Pack.emergency-response",
+ "PurposeKey": "PackPurpose.emergency-response",
+ "AreaIds": [
+ "people",
+ "knowledge",
+ "inventory",
+ "calls"
+ ],
+ "RuleIds": [
+ "shift-auto-without-dispatch",
+ "shift-coverage",
+ "text-sources",
+ "empty-groups",
+ "run-cards",
+ "checkin-timers",
+ "qualified-coverage",
+ "credential-expiry",
+ "stock-expiry",
+ "import-heartbeat",
+ "email-import-failures",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "policy-references",
+ "policy-expiry",
+ "continuity-reference"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.emergency-response",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "hazmat",
+ "LabelKey": "Pack.hazmat",
+ "PurposeKey": "PackPurpose.hazmat",
+ "AreaIds": [
+ "people",
+ "maintenance",
+ "inventory",
+ "knowledge"
+ ],
+ "RuleIds": [
+ "empty-groups",
+ "qualified-coverage",
+ "credential-expiry",
+ "checklist-overdue",
+ "equipment-holds",
+ "stock-expiry",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "policy-references",
+ "policy-expiry",
+ "continuity-reference"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.hazmat",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "industrial",
+ "LabelKey": "Pack.industrial",
+ "PurposeKey": "PackPurpose.industrial",
+ "AreaIds": [
+ "people",
+ "maintenance",
+ "knowledge",
+ "communication"
+ ],
+ "RuleIds": [
+ "command-sources",
+ "empty-groups",
+ "communication-tests",
+ "qualified-coverage",
+ "credential-expiry",
+ "checklist-overdue",
+ "equipment-holds",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "policy-references",
+ "policy-expiry",
+ "continuity-reference"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.industrial",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "security",
+ "LabelKey": "Pack.security",
+ "PurposeKey": "PackPurpose.security",
+ "AreaIds": [
+ "people",
+ "calls",
+ "maintenance",
+ "records"
+ ],
+ "RuleIds": [
+ "shift-auto-without-dispatch",
+ "shift-coverage",
+ "text-sources",
+ "empty-groups",
+ "run-cards",
+ "checkin-timers",
+ "qualified-coverage",
+ "credential-expiry",
+ "checklist-overdue",
+ "equipment-holds",
+ "import-heartbeat",
+ "email-import-failures",
+ "record-review",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.security",
+ "PackGapOwner"
+ ]
+ },
+ {
+ "Id": "mutual-aid",
+ "LabelKey": "Pack.mutual-aid",
+ "PurposeKey": "PackPurpose.mutual-aid",
+ "AreaIds": [
+ "calls",
+ "people",
+ "knowledge",
+ "business"
+ ],
+ "RuleIds": [
+ "shift-auto-without-dispatch",
+ "shift-coverage",
+ "text-sources",
+ "empty-groups",
+ "run-cards",
+ "checkin-timers",
+ "qualified-coverage",
+ "credential-expiry",
+ "import-heartbeat",
+ "email-import-failures",
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades",
+ "policy-references",
+ "policy-expiry",
+ "continuity-reference"
+ ],
+ "PrerequisiteKeys": [
+ "PackLocalRequirements",
+ "PackGap.mutual-aid",
+ "PackGapOwner"
+ ]
+ }
+ ],
+ "Articles": [
+ {
+ "Id": "setting.BigBoardMapZoomLevel",
+ "Locale": "en",
+ "TitleKey": "Setting.BigBoardMapZoomLevel",
+ "Body": "Big Board Map Zoom Level. Initial Big Board map zoom. An unset override lets the consuming board select its default.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-bigboardmapzoomlevel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.BigBoardPageRefresh",
+ "Locale": "en",
+ "TitleKey": "Setting.BigBoardPageRefresh",
+ "Body": "Big Board Page Refresh. Big Board refresh interval. Review load and the age of displayed information before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-bigboardpagerefresh",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.BigBoardMapCenterAddress",
+ "Locale": "en",
+ "TitleKey": "Setting.BigBoardMapCenterAddress",
+ "Body": "Big Board Map Center Address. Address used to center the Big Board. Address details remain on their owning screen.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-bigboardmapcenteraddress",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.BigBoardHideUnavailable",
+ "Locale": "en",
+ "TitleKey": "Setting.BigBoardHideUnavailable",
+ "Body": "Big Board Hide Unavailable. Hide unavailable resources on the Big Board; this affects visibility, not their dispatch eligibility.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-bigboardhideunavailable",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.BigBoardMapCenterGpsCoordinates",
+ "Locale": "en",
+ "TitleKey": "Setting.BigBoardMapCenterGpsCoordinates",
+ "Body": "Big Board Map Center Gps Coordinates. Explicit board-center coordinates take precedence over address geocoding. Partial coordinates do not overwrite the saved center.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-bigboardmapcentergpscoordinates",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "dashboard",
+ "Locale": "en",
+ "TitleKey": "Feature.dashboard",
+ "Body": "Dashboard Department home: status, staffing and activity Give each role the right app and a clear starting point. A dispatcher creates a call while responders and unit crews receive their assigned work. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "dashboard",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile",
+ "Locale": "en",
+ "TitleKey": "Feature.profile",
+ "Body": "My Profile View and edit your own profile, contact methods and notifications Give each role the right app and a clear starting point. A dispatcher creates a call while responders and unit crews receive their assigned work. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "departments",
+ "Locale": "en",
+ "TitleKey": "Feature.departments",
+ "Body": "Your Departments Switch between the departments you belong to Give each role the right app and a clear starting point. A dispatcher creates a call while responders and unit crews receive their assigned work. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "departments",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "dispatch-app",
+ "Locale": "en",
+ "TitleKey": "Feature.dispatch-app",
+ "Body": "Dispatch application Dispatchers use the dispatch interface to review calls and resources and explicitly select recipients. Give dispatch personnel a focused operating surface alongside web administration. A dispatcher creates a call while responders and unit crews receive their assigned work. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "dispatch-app",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "responder-app",
+ "Locale": "en",
+ "TitleKey": "Feature.responder-app",
+ "Body": "Responder application Individual members use the supported Responder client for their account, availability, calls and notifications. Separate member device setup from department configuration and verify each member's channels. A dispatcher creates a call while responders and unit crews receive their assigned work. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "responder-app",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "unit-app",
+ "Locale": "en",
+ "TitleKey": "Feature.unit-app",
+ "Body": "Unit application A shared unit client represents an apparatus or team rather than an individual member. Review device identity, assigned crew and unit communications together. A dispatcher creates a call while responders and unit crews receive their assigned work. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "unit-app",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "big-board",
+ "Locale": "en",
+ "TitleKey": "Feature.big-board",
+ "Body": "Big Board Shared display clients show the configured resource and call picture. Choose display refresh, location age and visibility appropriate to a station screen. A dispatcher creates a call while responders and unit crews receive their assigned work. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "big-board",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "guide.start-setup",
+ "Locale": "en",
+ "TitleKey": "Guide.start-setup",
+ "Body": "Department administrators can open **Setup Wizard** from the Department or Help menu when setup is enabled for the deployment. An unfinished setup also appears on the dashboard. Dismissing that prompt affects only your account; the menu remains available. Setup Wizard and Setup Report are available independently of Admin Assist and do not require an AI add-on.\n\nChoose **Fresh setup**, **Review existing setup**, or **Import or migration**. The choice records your intent; it does not import or overwrite data. Use the department operating profile to describe your organization and link approved local policies. Fire, EMS, mental health, SAR, emergency response, Hazmat, industrial, security and mutual-aid packs suggest areas to review. They do not establish qualifications or authorize clinical, tactical or hazardous work.\n\nThe nine-step journey covers goals and applications, the department profile, all-area orientation, people and access, operational essentials, selected workflows, add-ons, verification and practice, and review and handover. Pause and resume without creating sample incidents or overwriting existing configuration.\n\nSelected operating packs suggest areas without changing your choices. Site references use existing department group IDs; policy references use existing, unexpired department document IDs. Saving checks those references and rejects concurrent overwrites. A valid reference does not prove that its contents are approved or sufficient. Verification checks whether linked policies or site groups later become unavailable, and flags documents scheduled for removal within 30 days. A reviewed profile without a continuity link receives an administrative review prompt; an external procedure may still exist. The checks do not read or certify policy contents.\n\nAn optional **Expected email polling interval** compares recorded mailbox polls with your declared maximum interval. Leave it blank when no interval has been established. Missing or future poll timestamps remain unknown, and low call volume alone does not imply failure. SMS, CAD push and API intake require separate telemetry; the expectation does not change polling or send a test.",
+ "SourcePath": "docs/admin-assist/setup-guide.md",
+ "Anchor": "start-setup",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "guide.choose-areas",
+ "Locale": "en",
+ "TitleKey": "Guide.choose-areas",
+ "Body": "Mark each area **Use now**, **Learn later**, or **Not applicable**. A not-applicable choice requires a reason: outside the mission, managed in another approved system, managed by a responsible partner, or no current need. Baseline security remains in scope. Explore Resgrid covers applications, calls, people, units and location, communication, contacts and site knowledge, records, maintenance, inventory, deployments and business, automation, security and plans. Each feature explains its purpose, value, example and adoption requirements.\n\nArea choices are shared by department administrators. Learning and interest choices are personal. Another administrator's save can require you to reload and review before saving again. Learning a feature does not configure it, purchase an add-on, enable a module or send anything.",
+ "SourcePath": "docs/admin-assist/setup-guide.md",
+ "Anchor": "choose-areas",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "guide.configure-and-verify",
+ "Locale": "en",
+ "TitleKey": "Guide.configure-and-verify",
+ "Body": "Use **Open owning screen** to configure a feature with its existing permissions and validation. Some settings include contextual help and a highlighted field when opened from Admin Assist. Save on that screen, then use **Return to setup and verify**. The return link does not submit the form. Its navigation context lasts 30 minutes and is tied to the current administrator and department, so it can survive the owning screen’s save and redirect. Returning to setup clears it. Choose **Verify again** after saving.\n\nThe report separates verified checks, failures and unknown evidence. Unpurchased optional add-ons do not reduce core completion. Deferring an area does not hide a verified critical failure or uncertainty in an active critical check. Selected areas with no automated checks are listed explicitly; they are not verified. Missing, restricted or unavailable source data remains unknown; it is never treated as zero. Critical unknowns prevent a fully verified result. Review the evidence time and refresh again if configuration changed during the read.\n\nRecord an administrative review to retain the report version, evidence revision, selected-scope revision, timestamp and unresolved-check counts. A changed configuration, scope or catalog makes that review visibly out of date. Each newly added administrator still has a separate orientation checklist. An optional revisit date is stored in the report; it does not schedule a one-off notification. Weekly follow-up is a separate preference.\n\nSetup Report replaces the old numerical setup score. It is administrative configuration guidance, not certification of operational readiness or proof that a page was delivered. Start a Communication Test explicitly through its own screen when communication verification is needed.\n\n**Open a fresh printable report** rechecks access and reloads the summary. It includes current findings, selected areas, personal feature interests and public add-on guidance. It omits protected notes, names, source records and credentials. Printing or saving a local copy does not create a managed server export; handle the copy under department policy.",
+ "SourcePath": "docs/admin-assist/setup-guide.md",
+ "Anchor": "configure-and-verify",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "guide.understand-addons",
+ "Locale": "en",
+ "TitleKey": "Guide.understand-addons",
+ "Body": "| Add-on | What it adds | Adoption considerations |\n|---|---|---|\n| Push-to-Talk | Voice channels in supported Resgrid clients | Review seats, devices and channel membership. Phone voice alerts and radio requirements are separate. |\n| Advanced Data Protection | Additional protection and scoped disclosure for supported sensitive content | Purchase and enrollment are separate. Review MFA, recovery, supported fields and effects on search, exports and integrations. |\n| Readiness Pro | Maintenance, work orders, preventive and corrective work, approvals and safety holds | Checklists remain available without the add-on. Maintenance also needs its module and permissions. |\n| Business Operations | Invoicing, rates, contracts, bids, reimbursement and workforce costing | Certifications and Deployment Finance remain available without the add-on. Pay-data reporting also requires enabled ADP; payment providers need separate setup. |\n| Enhanced AI | Planned summaries, drafts, knowledge assistance and optional conversation | Availability depends on release and rollout. Deterministic setup and Admin Assist do not require it. |\n\nAvailability can depend on subscription, rollout, module settings, permissions, protection enrollment and source availability. An unknown subscription is not confirmation of a free or paid plan. Only the managing member can perform subscription changes through the billing screen. Feature interest does not start a trial or purchase.\n\nThe add-on step opens a comparison of all five add-ons. Each card lists its related features. Mark a feature **Interested in this feature** to see it in Setup Report with its current prerequisites and next available action. **I understand this feature**, availability, purchased entitlement, configuration and verified checks are separate states. Buying an add-on does not configure or verify the feature. The feature-setup section distinguishes recorded configuration, supported check results, current entitlement and optional opportunities. Initial evidence mappings cover personnel, groups, units, run cards, check-in timers, weather zones and email intake. Other feature configuration remains unassessed; absence of setup evidence does not prove a feature is unused.",
+ "SourcePath": "docs/admin-assist/setup-guide.md",
+ "Anchor": "understand-addons",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "guide.follow-up",
+ "Locale": "en",
+ "TitleKey": "Guide.follow-up",
+ "Body": "Admin Assist adds an administrative worklist. Claim an unresolved finding, set a review date, start a review, or record an accepted exception with a reason and expiry. Exceptions do not make the underlying check pass. Fresh verification resolves a finding; a later verified failure reopens it. An evidence outage cannot resolve it. Fix records, qualifications, inventory and other source tasks through their owning screens.\n\nWeekly follow-up is opt-in and only runs when the deployment enables scheduled digests. Quiet hours use the department time zone. The message contains a generic link to Admin Assist; open the authenticated page to see current evidence. A notification handoff is not confirmation of delivery. Turning the preference off suppresses future handoffs.",
+ "SourcePath": "docs/admin-assist/setup-guide.md",
+ "Anchor": "follow-up",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "guide.reference-and-history",
+ "Locale": "en",
+ "TitleKey": "Guide.reference-and-history",
+ "Body": "Settings Reference searches a release-pinned public documentation catalog. It does not search department records or attachments. If your language has no reference article, the result labels its source language.\n\nSupported scalar settings offer **Preview a proposed value**. A preview compares values in memory, shows related health-check changes and lists its limits. It does not save configuration. Current operational previews cover v4 map-marker selection, the automatic-availability status projection and administrator MFA enrollment. These do not establish every client's behavior, actual physical availability or session/recovery readiness.\n\n**Preview plan capacity** compares proposed total personnel and unit counts with observed base-plan headroom. It does not purchase capacity or add resources; add-on seats, provider quotas and pricing are separate.\n\n**Preview dispatch routing** uses a saved call ID as a route scenario. Choose an explicit UTC roster time within seven days of now and all three proposed shift/crew/group options. It compares direct, group, role and unit crew/group recipients with the broadcaster's resolver, preserving direct duplicates and empty-shift fallback. Current membership and crews are not reconstructed historical assignments. Unit devices, printers, channel eligibility, provider handoff and delivery are outside these personnel counts. The preview sends nothing and rereads inputs to detect changes during evaluation.\n\n**Preview a permission change** compares current members through the supported action or resource visibility gate. It includes roles, department and group administration, target-group ancestors, and ungrouped targets. It counts allowed actor/target pairs separately from members, so a narrowed group scope is visible even when the same members retain some access. Existing sessions, protected fields and other permission gates still require verification.\n\n**Preview a module switch** compares web navigation and bounded primary-table counts. Hiding an entry keeps the underlying data; it does not prove API access is revoked or a worker stops. Mapping, Reports, Logs/Records and Inventory data totals remain unknown where a complete adapter is unavailable. Licensed maintenance, checklists and business switches require separate entitlement-aware previews.\n\n**Preview a text sender scenario** compares a test number against current source patterns and the complete proposed call/command switches. Choose the provider path actually in use. The result returns a masked reference and distinguishes routing branches from actual successful acceptance. SignalWire and Twilio legacy paths share their production routing decisions with the preview, but do not consult the switches uniformly. Chatbot and master-number paths, number ownership, active SMS department, plan access, webhook authentication, verified identity, opt-out exceptions and parser success require separate verification. A missing dispatch-source pattern is not proof that verified members cannot use commands. The preview never receives or sends a text.\n\n**Preview notification volume** compares the current staffing-suppression setting with a proposed toggle for a declared department-wide scenario. Set the future window and assumed events per member across that entire window. The result separates current membership, preference/contact gates, confirmed suppression, unknown profiles/staffing and possible channel-handoff ranges. It uses no historical event sample and does not resolve every notification-rule audience. Address/device validity, provider behavior, chat/voice, SMS segments and delivery remain separate. Changing this preview never saves settings, sends a notification or changes staffing.\n\n**Preview sign-in and session policy** compares department-wide MFA, SSO-only policy, password age/minimum length, idle timeout or concurrent-session limits. Enrollment is distinct from verified factors and recovery. The SSO-only gate keeps its existing safety valve when no provider is enabled; an enabled provider is not a successful login test. Session estimates respect the host policy date and distinguish next-session limits from revocation. Password age uses the owning boundary and preserves its handling of untracked dates. No password, recovery secret, session ticket, IP address or provider credential is read by these projections, and the preview does not change credentials or sessions.\n\n**Preview retention policy** compares a prospective Records default using a bounded sample of metadata. A blank default uses the system class default; zero means permanent. Historical policy and definition overrides remain in force, so older revisions do not simply inherit a shortened default. Known parent/preservation holds and permanent-content obligations are excluded; uncertain historical holds are identified. Remaining candidates need the owning lifecycle checks for children, disclosure copies, attachments, external storage, evidence, submissions, workflows and search erasure. These counts are not permission or proof of eligibility to purge. The preview does not read record bodies, purge content, change protection or cancel an add-on.\n\nCounts and checks are only as current as their source evidence. Unquantified effects still need review on the owning screen. Refresh after a configuration conflict and verify again after an actual save. Reference results can expand the full release-pinned source text and identify its source language.\n\nChange History starts when collection is enabled. Earlier changes are unavailable. History shows safe configuration differences; secrets and sensitive strings use presence/change markers. It does not expose another administrator's personal learning choices.",
+ "SourcePath": "docs/admin-assist/setup-guide.md",
+ "Anchor": "reference-and-history",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/inventory.yaml b/Core/Resgrid.AdminAssist/Catalog/inventory.yaml
new file mode 100644
index 000000000..f4a046f3a
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/inventory.yaml
@@ -0,0 +1,351 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "inventory",
+ "LabelKey": "Area.inventory",
+ "PurposeKey": "AreaPurpose.inventory",
+ "Order": 8,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "module.InventoryDisabled",
+ "AreaId": "inventory",
+ "LabelKey": "Module.InventoryDisabled",
+ "HelpKey": "ModuleHelp.InventoryDisabled",
+ "Binding": "DepartmentModuleSettings.InventoryDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "InventoryEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.inventory",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.InventoryDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.InventoryNameOverride",
+ "AreaId": "inventory",
+ "LabelKey": "Module.InventoryNameOverride",
+ "HelpKey": "ModuleHelp.InventoryNameOverride",
+ "Binding": "DepartmentModuleSettings.InventoryNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.inventory",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.InventoryNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "inventory",
+ "AreaId": "inventory",
+ "LabelKey": "Feature.inventory",
+ "PurposeKey": "FeaturePurpose.inventory",
+ "ValueKey": "AreaValue.inventory",
+ "ExampleKey": "AreaExample.inventory",
+ "AdoptionKey": "FeatureAdoption.inventory",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Inventory",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Inventory"
+ }
+ ],
+ "SettingIds": [
+ "module.InventoryDisabled"
+ ],
+ "RuleIds": [
+ "stock-expiry"
+ ]
+ },
+ {
+ "Id": "inventory-status",
+ "AreaId": "inventory",
+ "LabelKey": "Feature.inventory-status",
+ "PurposeKey": "FeaturePurpose.inventory-status",
+ "ValueKey": "AreaValue.inventory",
+ "ExampleKey": "AreaExample.inventory",
+ "AdoptionKey": "FeatureAdoption.inventory-status",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Inventory",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Inventory"
+ }
+ ],
+ "SettingIds": [
+ "module.InventoryDisabled"
+ ],
+ "RuleIds": [
+ "stock-expiry"
+ ]
+ },
+ {
+ "Id": "inventory-transfer",
+ "AreaId": "inventory",
+ "LabelKey": "Feature.inventory-transfer",
+ "PurposeKey": "FeaturePurpose.inventory-transfer",
+ "ValueKey": "AreaValue.inventory",
+ "ExampleKey": "AreaExample.inventory",
+ "AdoptionKey": "FeatureAdoption.inventory-transfer",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Inventory",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Inventory"
+ }
+ ],
+ "SettingIds": [
+ "module.InventoryDisabled"
+ ],
+ "RuleIds": [
+ "stock-expiry"
+ ]
+ },
+ {
+ "Id": "inventory-issue",
+ "AreaId": "inventory",
+ "LabelKey": "Feature.inventory-issue",
+ "PurposeKey": "FeaturePurpose.inventory-issue",
+ "ValueKey": "AreaValue.inventory",
+ "ExampleKey": "AreaExample.inventory",
+ "AdoptionKey": "FeatureAdoption.inventory-issue",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Inventory",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Inventory"
+ }
+ ],
+ "SettingIds": [
+ "module.InventoryDisabled"
+ ],
+ "RuleIds": [
+ "stock-expiry"
+ ]
+ },
+ {
+ "Id": "inventory-purchasing",
+ "AreaId": "inventory",
+ "LabelKey": "Feature.inventory-purchasing",
+ "PurposeKey": "FeaturePurpose.inventory-purchasing",
+ "ValueKey": "FeatureValue.inventory-purchasing",
+ "ExampleKey": "AreaExample.inventory",
+ "AdoptionKey": "FeatureAdoption.inventory-purchasing",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Inventory",
+ "Action": "Purchasing"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Inventory"
+ }
+ ],
+ "SettingIds": [
+ "module.InventoryDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "inventory-operations",
+ "AreaId": "inventory",
+ "LabelKey": "Feature.inventory-operations",
+ "PurposeKey": "FeaturePurpose.inventory-operations",
+ "ValueKey": "FeatureValue.inventory-operations",
+ "ExampleKey": "AreaExample.inventory",
+ "AdoptionKey": "FeatureAdoption.inventory-operations",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Inventory",
+ "Action": "Operations"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Inventory"
+ }
+ ],
+ "SettingIds": [
+ "module.InventoryDisabled"
+ ],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "stock-expiry",
+ "AreaId": "inventory",
+ "Severity": "Warning",
+ "TitleKey": "Rule.stock-expiry",
+ "ExplanationKey": "RuleWhy.stock-expiry",
+ "NextActionKey": "RuleNext.stock-expiry",
+ "Location": {
+ "Controller": "Inventory",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "stockExpiring30Days",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "module.InventoryDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.InventoryDisabled",
+ "Body": "Inventory availability. Controls availability of inventory. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-inventorydisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.InventoryNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.InventoryNameOverride",
+ "Body": "Inventory menu name. Optional display name for inventory in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-inventorynameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "inventory",
+ "Locale": "en",
+ "TitleKey": "Feature.inventory",
+ "Body": "Inventory Inventory for stations and units See recorded shortages and due dates before they become an administrative surprise. Review an expiring supply lot and arrange restocking through the inventory screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "inventory",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "inventory-status",
+ "Locale": "en",
+ "TitleKey": "Feature.inventory-status",
+ "Body": "Inventory Status On-hand, low-stock and expiring inventory See recorded shortages and due dates before they become an administrative surprise. Review an expiring supply lot and arrange restocking through the inventory screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "inventory-status",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "inventory-transfer",
+ "Locale": "en",
+ "TitleKey": "Feature.inventory-transfer",
+ "Body": "Transfer Inventory Move inventory between locations See recorded shortages and due dates before they become an administrative surprise. Review an expiring supply lot and arrange restocking through the inventory screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "inventory-transfer",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "inventory-issue",
+ "Locale": "en",
+ "TitleKey": "Feature.inventory-issue",
+ "Body": "Issue Equipment Issue or return equipment to personnel See recorded shortages and due dates before they become an administrative surprise. Review an expiring supply lot and arrange restocking through the inventory screen. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "inventory-issue",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "inventory-purchasing",
+ "Locale": "en",
+ "TitleKey": "Feature.inventory-purchasing",
+ "Body": "Inventory purchasing Manage suppliers, purchase orders and receipts. Connect replenishment to recorded stock needs and authorized receipt. Review an expiring supply lot and arrange restocking through the inventory screen. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "inventory-purchasing",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "inventory-operations",
+ "Locale": "en",
+ "TitleKey": "Feature.inventory-operations",
+ "Body": "Inventory counts, expiry and alerts Review stock counts, expiry and configured inventory alerts. Identify inventory data and supplies that need owner follow-up. Review an expiring supply lot and arrange restocking through the inventory screen. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "inventory-operations",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/knowledge.yaml b/Core/Resgrid.AdminAssist/Catalog/knowledge.yaml
new file mode 100644
index 000000000..bc5c2fc30
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/knowledge.yaml
@@ -0,0 +1,658 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "knowledge",
+ "LabelKey": "Area.knowledge",
+ "PurposeKey": "AreaPurpose.knowledge",
+ "Order": 5,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "module.DocumentsDisabled",
+ "AreaId": "knowledge",
+ "LabelKey": "Module.DocumentsDisabled",
+ "HelpKey": "ModuleHelp.DocumentsDisabled",
+ "Binding": "DepartmentModuleSettings.DocumentsDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "DocumentsEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.knowledge",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.DocumentsDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.DocumentsNameOverride",
+ "AreaId": "knowledge",
+ "LabelKey": "Module.DocumentsNameOverride",
+ "HelpKey": "ModuleHelp.DocumentsNameOverride",
+ "Binding": "DepartmentModuleSettings.DocumentsNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.knowledge",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.DocumentsNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "module.NotesDisabled",
+ "AreaId": "knowledge",
+ "LabelKey": "Module.NotesDisabled",
+ "HelpKey": "ModuleHelp.NotesDisabled",
+ "Binding": "DepartmentModuleSettings.NotesDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "NotesEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.knowledge",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.NotesDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.NotesNameOverride",
+ "AreaId": "knowledge",
+ "LabelKey": "Module.NotesNameOverride",
+ "HelpKey": "ModuleHelp.NotesNameOverride",
+ "Binding": "DepartmentModuleSettings.NotesNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.knowledge",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.NotesNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "contacts",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.contacts",
+ "PurposeKey": "FeaturePurpose.contacts",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.contacts",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Contacts",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-contact",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.new-contact",
+ "PurposeKey": "FeaturePurpose.new-contact",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.new-contact",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Contacts",
+ "Action": "Add"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "contact-categories",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.contact-categories",
+ "PurposeKey": "FeaturePurpose.contact-categories",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.contact-categories",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Contacts",
+ "Action": "Categories"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "documents",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.documents",
+ "PurposeKey": "FeaturePurpose.documents",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.documents",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Documents",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Documents"
+ }
+ ],
+ "SettingIds": [
+ "module.DocumentsDisabled"
+ ],
+ "RuleIds": [
+ "policy-expiry"
+ ]
+ },
+ {
+ "Id": "new-document",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.new-document",
+ "PurposeKey": "FeaturePurpose.new-document",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.new-document",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Documents",
+ "Action": "NewDocument"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Documents"
+ }
+ ],
+ "SettingIds": [
+ "module.DocumentsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "notes",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.notes",
+ "PurposeKey": "FeaturePurpose.notes",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.notes",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Notes",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Notes"
+ }
+ ],
+ "SettingIds": [
+ "module.NotesDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-note",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.new-note",
+ "PurposeKey": "FeaturePurpose.new-note",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.new-note",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Notes",
+ "Action": "NewNote"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Notes"
+ }
+ ],
+ "SettingIds": [
+ "module.NotesDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "protocols",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.protocols",
+ "PurposeKey": "FeaturePurpose.protocols",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.protocols",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Protocols",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-protocol",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.new-protocol",
+ "PurposeKey": "FeaturePurpose.new-protocol",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.new-protocol",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Protocols",
+ "Action": "New"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "forms",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.forms",
+ "PurposeKey": "FeaturePurpose.forms",
+ "ValueKey": "AreaValue.knowledge",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.forms",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Forms",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "shared-links",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.shared-links",
+ "PurposeKey": "FeaturePurpose.shared-links",
+ "ValueKey": "FeatureValue.shared-links",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.shared-links",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Links",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "file-library",
+ "AreaId": "knowledge",
+ "LabelKey": "Feature.file-library",
+ "PurposeKey": "FeaturePurpose.file-library",
+ "ValueKey": "FeatureValue.file-library",
+ "ExampleKey": "AreaExample.knowledge",
+ "AdoptionKey": "FeatureAdoption.file-library",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Documents",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Documents"
+ }
+ ],
+ "SettingIds": [
+ "module.DocumentsDisabled"
+ ],
+ "RuleIds": [
+ "policy-expiry"
+ ]
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "policy-references",
+ "AreaId": "knowledge",
+ "Severity": "Warning",
+ "TitleKey": "Rule.policy-references",
+ "ExplanationKey": "RuleWhy.policy-references",
+ "NextActionKey": "RuleNext.policy-references",
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "declaredPolicyReferences",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "unavailablePolicyReferences",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "policy-expiry",
+ "AreaId": "knowledge",
+ "Severity": "Warning",
+ "TitleKey": "Rule.policy-expiry",
+ "ExplanationKey": "RuleWhy.policy-expiry",
+ "NextActionKey": "RuleNext.policy-expiry",
+ "Location": {
+ "Controller": "Documents",
+ "Action": "Index"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "declaredPolicyReferences",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "policyReferencesExpiring30Days",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "continuity-reference",
+ "AreaId": "knowledge",
+ "Severity": "Information",
+ "TitleKey": "Rule.continuity-reference",
+ "ExplanationKey": "RuleWhy.continuity-reference",
+ "NextActionKey": "RuleNext.continuity-reference",
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "operatingProfileReviewed",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "declaredContinuityReferences",
+ "Comparison": "Equal",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "module.DocumentsDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.DocumentsDisabled",
+ "Body": "Documents availability. Controls availability of shared documents. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-documentsdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.DocumentsNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.DocumentsNameOverride",
+ "Body": "Documents menu name. Optional display name for shared documents in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-documentsnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.NotesDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.NotesDisabled",
+ "Body": "Notes availability. Controls availability of notes. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-notesdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.NotesNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.NotesNameOverride",
+ "Body": "Notes menu name. Optional display name for notes in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-notesnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "contacts",
+ "Locale": "en",
+ "TitleKey": "Feature.contacts",
+ "Body": "Contacts People and organizations outside the department Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "contacts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-contact",
+ "Locale": "en",
+ "TitleKey": "Feature.new-contact",
+ "Body": "New Contact Add a person or organization contact Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-contact",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "contact-categories",
+ "Locale": "en",
+ "TitleKey": "Feature.contact-categories",
+ "Body": "Contact Categories Manage contact categories Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "contact-categories",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "documents",
+ "Locale": "en",
+ "TitleKey": "Feature.documents",
+ "Body": "Documents Upload and share documents Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "documents",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-document",
+ "Locale": "en",
+ "TitleKey": "Feature.new-document",
+ "Body": "Upload Document Upload a new document Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-document",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "notes",
+ "Locale": "en",
+ "TitleKey": "Feature.notes",
+ "Body": "Notes Department notes: small bits of shared information Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "notes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-note",
+ "Locale": "en",
+ "TitleKey": "Feature.new-note",
+ "Body": "New Note Post a department note Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-note",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "protocols",
+ "Locale": "en",
+ "TitleKey": "Feature.protocols",
+ "Body": "Protocols Dispatch protocols and procedures Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "protocols",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-protocol",
+ "Locale": "en",
+ "TitleKey": "Feature.new-protocol",
+ "Body": "New Protocol Create a dispatch protocol Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-protocol",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "forms",
+ "Locale": "en",
+ "TitleKey": "Feature.forms",
+ "Body": "Forms Custom call and dispatch forms Help authorized members find the current reference and responsible contact. Review a receiving-agency contact and an approved site plan before a planned event. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "forms",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "shared-links",
+ "Locale": "en",
+ "TitleKey": "Feature.shared-links",
+ "Body": "Shared links Configure supported shared views and links. Review exposed data and link access before distribution. Review a receiving-agency contact and an approved site plan before a planned event. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "shared-links",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "file-library",
+ "Locale": "en",
+ "TitleKey": "Feature.file-library",
+ "Body": "Files and attachments Attach and maintain files through their owning documents and records. Keep reference material with its owner, permissions and retention policy. Review a receiving-agency contact and an approved site plan before a planned event. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "file-library",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/location.yaml b/Core/Resgrid.AdminAssist/Catalog/location.yaml
new file mode 100644
index 000000000..540491c95
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/location.yaml
@@ -0,0 +1,2136 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "location",
+ "LabelKey": "Area.location",
+ "PurposeKey": "AreaPurpose.location",
+ "Order": 3,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.UnitsSortOrder",
+ "AreaId": "location",
+ "LabelKey": "Setting.UnitsSortOrder",
+ "HelpKey": "SettingHelp.UnitsSortOrder",
+ "Binding": "DepartmentSettingTypes.UnitsSortOrder",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "UnitsSortOrder"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UnitsSortOrder",
+ "DefaultValue": "owning view default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.MappingPersonnelLocationTTL",
+ "AreaId": "location",
+ "LabelKey": "Setting.MappingPersonnelLocationTTL",
+ "HelpKey": "SettingHelp.MappingPersonnelLocationTTL",
+ "Binding": "DepartmentSettingTypes.MappingPersonnelLocationTTL",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "PersonnelLocationTTL"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.MappingPersonnelLocationTTL",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.MappingUnitLocationTTL",
+ "AreaId": "location",
+ "LabelKey": "Setting.MappingUnitLocationTTL",
+ "HelpKey": "SettingHelp.MappingUnitLocationTTL",
+ "Binding": "DepartmentSettingTypes.MappingUnitLocationTTL",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "UnitLocationTTL"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.MappingUnitLocationTTL",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.MappingPersonnelAllowStatusWithNoLocationToOverwrite",
+ "AreaId": "location",
+ "LabelKey": "Setting.MappingPersonnelAllowStatusWithNoLocationToOverwrite",
+ "HelpKey": "SettingHelp.MappingPersonnelAllowStatusWithNoLocationToOverwrite",
+ "Binding": "DepartmentSettingTypes.MappingPersonnelAllowStatusWithNoLocationToOverwrite",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "PersonnelAllowStatusWithNoLocationToOverwrite"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.MappingPersonnelAllowStatusWithNoLocationToOverwrite",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.MappingUnitAllowStatusWithNoLocationToOverwrite",
+ "AreaId": "location",
+ "LabelKey": "Setting.MappingUnitAllowStatusWithNoLocationToOverwrite",
+ "HelpKey": "SettingHelp.MappingUnitAllowStatusWithNoLocationToOverwrite",
+ "Binding": "DepartmentSettingTypes.MappingUnitAllowStatusWithNoLocationToOverwrite",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "UnitAllowStatusWithNoLocationToOverwrite"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.MappingUnitAllowStatusWithNoLocationToOverwrite",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.PersonnelOnUnitSetUnitStatus",
+ "AreaId": "location",
+ "LabelKey": "Setting.PersonnelOnUnitSetUnitStatus",
+ "HelpKey": "SettingHelp.PersonnelOnUnitSetUnitStatus",
+ "Binding": "DepartmentSettingTypes.PersonnelOnUnitSetUnitStatus",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings",
+ "Field": "PersonnelOnUnitSetUnitStatus"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.PersonnelOnUnitSetUnitStatus",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.WeatherAlertsEnabled",
+ "AreaId": "location",
+ "LabelKey": "Setting.WeatherAlertsEnabled",
+ "HelpKey": "SettingHelp.WeatherAlertsEnabled",
+ "Binding": "DepartmentSettingTypes.WeatherAlertsEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Settings",
+ "Field": "WeatherAlertsEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.WeatherAlertsEnabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.WeatherAlertMinimumSeverity",
+ "AreaId": "location",
+ "LabelKey": "Setting.WeatherAlertMinimumSeverity",
+ "HelpKey": "SettingHelp.WeatherAlertMinimumSeverity",
+ "Binding": "DepartmentSettingTypes.WeatherAlertMinimumSeverity",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Settings",
+ "Field": "WeatherAlertMinimumSeverity"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.WeatherAlertMinimumSeverity",
+ "DefaultValue": "owning weather default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.WeatherAlertAutoMessageSeverity",
+ "AreaId": "location",
+ "LabelKey": "Setting.WeatherAlertAutoMessageSeverity",
+ "HelpKey": "SettingHelp.WeatherAlertAutoMessageSeverity",
+ "Binding": "DepartmentSettingTypes.WeatherAlertAutoMessageSeverity",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Settings",
+ "Field": "WeatherAlertAutoMessageSeverity"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.WeatherAlertAutoMessageSeverity",
+ "DefaultValue": "owning weather default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.WeatherAlertCallIntegration",
+ "AreaId": "location",
+ "LabelKey": "Setting.WeatherAlertCallIntegration",
+ "HelpKey": "SettingHelp.WeatherAlertCallIntegration",
+ "Binding": "DepartmentSettingTypes.WeatherAlertCallIntegration",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Settings",
+ "Field": "WeatherAlertCallIntegration"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.WeatherAlertCallIntegration",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.WeatherAlertCacheMinutes",
+ "AreaId": "location",
+ "LabelKey": "Setting.WeatherAlertCacheMinutes",
+ "HelpKey": "SettingHelp.WeatherAlertCacheMinutes",
+ "Binding": "DepartmentSettingTypes.WeatherAlertCacheMinutes",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Settings",
+ "Field": "WeatherAlertCacheMinutes"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.WeatherAlertCacheMinutes",
+ "DefaultValue": "owning weather default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.WeatherAlertAutoMessageSchedule",
+ "AreaId": "location",
+ "LabelKey": "Setting.WeatherAlertAutoMessageSchedule",
+ "HelpKey": "SettingHelp.WeatherAlertAutoMessageSchedule",
+ "Binding": "DepartmentSettingTypes.WeatherAlertAutoMessageSchedule",
+ "ValueType": "structured",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Settings",
+ "Field": "WeatherAlertAutoMessageSchedule"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.WeatherAlertAutoMessageSchedule",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.WeatherAlertExcludedEvents",
+ "AreaId": "location",
+ "LabelKey": "Setting.WeatherAlertExcludedEvents",
+ "HelpKey": "SettingHelp.WeatherAlertExcludedEvents",
+ "Binding": "DepartmentSettingTypes.WeatherAlertExcludedEvents",
+ "ValueType": "list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Settings",
+ "Field": "WeatherAlertExcludedEvents"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.WeatherAlertExcludedEvents",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.MappingUseMapboxOverride",
+ "AreaId": "location",
+ "LabelKey": "Setting.MappingUseMapboxOverride",
+ "HelpKey": "SettingHelp.MappingUseMapboxOverride",
+ "Binding": "DepartmentSettingTypes.MappingUseMapboxOverride",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "UseMapboxOverride"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [
+ "setting.MappingMapboxAccessToken",
+ "setting.MappingMapboxStyleUrl"
+ ],
+ "Conflicts": [],
+ "DocumentationId": "setting.MappingUseMapboxOverride",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.MappingMapboxStyleUrl",
+ "AreaId": "location",
+ "LabelKey": "Setting.MappingMapboxStyleUrl",
+ "HelpKey": "SettingHelp.MappingMapboxStyleUrl",
+ "Binding": "DepartmentSettingTypes.MappingMapboxStyleUrl",
+ "ValueType": "sensitive-text",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "MapboxStyleUrl"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.MappingUseMapboxOverride"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.MappingMapboxStyleUrl",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.MappingMapboxAccessToken",
+ "AreaId": "location",
+ "LabelKey": "Setting.MappingMapboxAccessToken",
+ "HelpKey": "SettingHelp.MappingMapboxAccessToken",
+ "Binding": "DepartmentSettingTypes.MappingMapboxAccessToken",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "MapboxAccessToken"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.MappingUseMapboxOverride"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.MappingMapboxAccessToken",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.HardwareTrackingStaleAfterSeconds",
+ "AreaId": "location",
+ "LabelKey": "Setting.HardwareTrackingStaleAfterSeconds",
+ "HelpKey": "SettingHelp.HardwareTrackingStaleAfterSeconds",
+ "Binding": "DepartmentSettingTypes.HardwareTrackingStaleAfterSeconds",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "HardwareTrackingStaleAfterSeconds"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.HardwareTrackingStaleAfterSeconds",
+ "DefaultValue": "180",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.HardwareTrackingMobileFallbackEnabled",
+ "AreaId": "location",
+ "LabelKey": "Setting.HardwareTrackingMobileFallbackEnabled",
+ "HelpKey": "SettingHelp.HardwareTrackingMobileFallbackEnabled",
+ "Binding": "DepartmentSettingTypes.HardwareTrackingMobileFallbackEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "HardwareTrackingMobileFallbackEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.HardwareTrackingMobileFallbackEnabled",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.HardwareTrackingLocationRetentionDays",
+ "AreaId": "location",
+ "LabelKey": "Setting.HardwareTrackingLocationRetentionDays",
+ "HelpKey": "SettingHelp.HardwareTrackingLocationRetentionDays",
+ "Binding": "DepartmentSettingTypes.HardwareTrackingLocationRetentionDays",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "HardwareTrackingLocationRetentionDays"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.HardwareTrackingLocationRetentionDays",
+ "DefaultValue": "UnitTrackingConfig.DefaultLocationRetentionDays",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.UnitStatusThresholds",
+ "AreaId": "location",
+ "LabelKey": "Setting.UnitStatusThresholds",
+ "HelpKey": "SettingHelp.UnitStatusThresholds",
+ "Binding": "DepartmentSettingTypes.UnitStatusThresholds",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": "UnitStatusThresholds"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UnitStatusThresholds",
+ "DefaultValue": "no thresholds",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.MappingDisabled",
+ "AreaId": "location",
+ "LabelKey": "Module.MappingDisabled",
+ "HelpKey": "ModuleHelp.MappingDisabled",
+ "Binding": "DepartmentModuleSettings.MappingDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "MappingEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.MappingDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.MappingNameOverride",
+ "AreaId": "location",
+ "LabelKey": "Module.MappingNameOverride",
+ "HelpKey": "ModuleHelp.MappingNameOverride",
+ "Binding": "DepartmentModuleSettings.MappingNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.MappingNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.UnitStatusThresholds.Thresholds",
+ "AreaId": "location",
+ "LabelKey": "Field.UnitStatusThresholds.Thresholds",
+ "HelpKey": "FieldHelp.UnitStatusThresholds.Thresholds",
+ "Binding": "UnitStatusThresholds.Thresholds",
+ "ValueType": "list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitStatusThresholds"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitStatusThresholds.Thresholds",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitStatusThresholds",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.UnitStatusThreshold.BaseType",
+ "AreaId": "location",
+ "LabelKey": "Field.UnitStatusThreshold.BaseType",
+ "HelpKey": "FieldHelp.UnitStatusThreshold.BaseType",
+ "Binding": "UnitStatusThreshold.BaseType",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitStatusThresholds"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitStatusThreshold.BaseType",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitStatusThreshold",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.UnitStatusThreshold.WarnSeconds",
+ "AreaId": "location",
+ "LabelKey": "Field.UnitStatusThreshold.WarnSeconds",
+ "HelpKey": "FieldHelp.UnitStatusThreshold.WarnSeconds",
+ "Binding": "UnitStatusThreshold.WarnSeconds",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitStatusThresholds"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitStatusThreshold.WarnSeconds",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitStatusThreshold",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.UnitStatusThreshold.AlertSeconds",
+ "AreaId": "location",
+ "LabelKey": "Field.UnitStatusThreshold.AlertSeconds",
+ "HelpKey": "FieldHelp.UnitStatusThreshold.AlertSeconds",
+ "Binding": "UnitStatusThreshold.AlertSeconds",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.UnitStatusThresholds"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.UnitStatusThreshold.AlertSeconds",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "UnitStatusThreshold",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.AddressId",
+ "AreaId": "location",
+ "LabelKey": "TableField.Department.AddressId",
+ "HelpKey": "TableHelp.Department.AddressId",
+ "Binding": "Department.AddressId",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Profile",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.AddressId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.WeatherAlertZone.Name",
+ "AreaId": "location",
+ "LabelKey": "TableField.WeatherAlertZone.Name",
+ "HelpKey": "TableHelp.WeatherAlertZone.Name",
+ "Binding": "WeatherAlertZone.Name",
+ "ValueType": "text",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Zones",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.WeatherAlertZone.Name",
+ "DefaultValue": "required",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "WeatherAlertZone",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.WeatherAlertZone.ZoneCode",
+ "AreaId": "location",
+ "LabelKey": "TableField.WeatherAlertZone.ZoneCode",
+ "HelpKey": "TableHelp.WeatherAlertZone.ZoneCode",
+ "Binding": "WeatherAlertZone.ZoneCode",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Zones",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.WeatherAlertZone.ZoneCode",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "WeatherAlertZone",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.WeatherAlertZone.CenterGeoLocation",
+ "AreaId": "location",
+ "LabelKey": "TableField.WeatherAlertZone.CenterGeoLocation",
+ "HelpKey": "TableHelp.WeatherAlertZone.CenterGeoLocation",
+ "Binding": "WeatherAlertZone.CenterGeoLocation",
+ "ValueType": "location",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Zones",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.WeatherAlertZone.CenterGeoLocation",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "WeatherAlertZone",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.WeatherAlertZone.RadiusMiles",
+ "AreaId": "location",
+ "LabelKey": "TableField.WeatherAlertZone.RadiusMiles",
+ "HelpKey": "TableHelp.WeatherAlertZone.RadiusMiles",
+ "Binding": "WeatherAlertZone.RadiusMiles",
+ "ValueType": "number",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Zones",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.WeatherAlertZone.RadiusMiles",
+ "DefaultValue": "editor default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "WeatherAlertZone",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.WeatherAlertZone.IsActive",
+ "AreaId": "location",
+ "LabelKey": "TableField.WeatherAlertZone.IsActive",
+ "HelpKey": "TableHelp.WeatherAlertZone.IsActive",
+ "Binding": "WeatherAlertZone.IsActive",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Zones",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.WeatherAlertZone.IsActive",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "WeatherAlertZone",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.WeatherAlertZone.IsPrimary",
+ "AreaId": "location",
+ "LabelKey": "TableField.WeatherAlertZone.IsPrimary",
+ "HelpKey": "TableHelp.WeatherAlertZone.IsPrimary",
+ "Binding": "WeatherAlertZone.IsPrimary",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Zones",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.location",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.WeatherAlertZone.IsPrimary",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "WeatherAlertZone",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "units",
+ "AreaId": "location",
+ "LabelKey": "Feature.units",
+ "PurposeKey": "FeaturePurpose.units",
+ "ValueKey": "AreaValue.location",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.units",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Units",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "unit-group",
+ "unit-type"
+ ],
+ "Setup": {
+ "EvidenceId": "unitCount",
+ "Minimum": 1,
+ "RuleIds": [
+ "unit-type",
+ "unit-group"
+ ],
+ "GuidanceKey": "SetupEvidence.units"
+ }
+ },
+ {
+ "Id": "new-unit",
+ "AreaId": "location",
+ "LabelKey": "Feature.new-unit",
+ "PurposeKey": "FeaturePurpose.new-unit",
+ "ValueKey": "AreaValue.location",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.new-unit",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Units",
+ "Action": "NewUnit"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "unit-staffing",
+ "AreaId": "location",
+ "LabelKey": "Feature.unit-staffing",
+ "PurposeKey": "FeaturePurpose.unit-staffing",
+ "ValueKey": "AreaValue.location",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.unit-staffing",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Units",
+ "Action": "UnitStaffing"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "mapping",
+ "AreaId": "location",
+ "LabelKey": "Feature.mapping",
+ "PurposeKey": "FeaturePurpose.mapping",
+ "ValueKey": "AreaValue.location",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.mapping",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Mapping",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Mapping"
+ }
+ ],
+ "SettingIds": [
+ "module.MappingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "pois",
+ "AreaId": "location",
+ "LabelKey": "Feature.pois",
+ "PurposeKey": "FeaturePurpose.pois",
+ "ValueKey": "AreaValue.location",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.pois",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Mapping",
+ "Action": "POIs"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Mapping"
+ }
+ ],
+ "SettingIds": [
+ "module.MappingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "map-layers",
+ "AreaId": "location",
+ "LabelKey": "Feature.map-layers",
+ "PurposeKey": "FeaturePurpose.map-layers",
+ "ValueKey": "AreaValue.location",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.map-layers",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Mapping",
+ "Action": "Layers"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Mapping"
+ }
+ ],
+ "SettingIds": [
+ "module.MappingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "live-routing",
+ "AreaId": "location",
+ "LabelKey": "Feature.live-routing",
+ "PurposeKey": "FeaturePurpose.live-routing",
+ "ValueKey": "AreaValue.location",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.live-routing",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Mapping",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Mapping"
+ }
+ ],
+ "SettingIds": [
+ "module.MappingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "unit-types",
+ "AreaId": "location",
+ "LabelKey": "Feature.unit-types",
+ "PurposeKey": "FeaturePurpose.unit-types",
+ "ValueKey": "FeatureValue.unit-types",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.unit-types",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "Types"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "hardware-tracking",
+ "AreaId": "location",
+ "LabelKey": "Feature.hardware-tracking",
+ "PurposeKey": "FeaturePurpose.hardware-tracking",
+ "ValueKey": "FeatureValue.hardware-tracking",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.hardware-tracking",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "UnitTracking",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "custom-maps",
+ "AreaId": "location",
+ "LabelKey": "Feature.custom-maps",
+ "PurposeKey": "FeaturePurpose.custom-maps",
+ "ValueKey": "FeatureValue.custom-maps",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.custom-maps",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "CustomMaps",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Mapping"
+ }
+ ],
+ "SettingIds": [
+ "module.MappingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "indoor-maps",
+ "AreaId": "location",
+ "LabelKey": "Feature.indoor-maps",
+ "PurposeKey": "FeaturePurpose.indoor-maps",
+ "ValueKey": "FeatureValue.indoor-maps",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.indoor-maps",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "IndoorMaps",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Mapping"
+ }
+ ],
+ "SettingIds": [
+ "module.MappingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "routes",
+ "AreaId": "location",
+ "LabelKey": "Feature.routes",
+ "PurposeKey": "FeaturePurpose.routes",
+ "ValueKey": "FeatureValue.routes",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.routes",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Routes",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Mapping"
+ },
+ {
+ "Kind": "permission",
+ "Id": "ManageRoutes"
+ }
+ ],
+ "SettingIds": [
+ "module.MappingDisabled",
+ "permission.ManageRoutes"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "weather",
+ "AreaId": "location",
+ "LabelKey": "Feature.weather",
+ "PurposeKey": "FeaturePurpose.weather",
+ "ValueKey": "FeatureValue.weather",
+ "ExampleKey": "AreaExample.location",
+ "AdoptionKey": "FeatureAdoption.weather",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "weather-zones"
+ ],
+ "Setup": {
+ "EvidenceId": "weatherZoneCount",
+ "Minimum": 1,
+ "RuleIds": [
+ "weather-zones"
+ ],
+ "GuidanceKey": "SetupEvidence.weather"
+ }
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "unit-type",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.unit-type",
+ "ExplanationKey": "RuleWhy.unit-type",
+ "NextActionKey": "RuleNext.unit-type",
+ "Location": {
+ "Controller": "Units",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "unitsWithoutType",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "unit-group",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.unit-group",
+ "ExplanationKey": "RuleWhy.unit-group",
+ "NextActionKey": "RuleNext.unit-group",
+ "Location": {
+ "Controller": "Units",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "unitsWithoutGroup",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "station-address",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.station-address",
+ "ExplanationKey": "RuleWhy.station-address",
+ "NextActionKey": "RuleNext.station-address",
+ "Location": {
+ "Controller": "Groups",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "stationsWithoutLocation",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "person-location-age",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.person-location-age",
+ "ExplanationKey": "RuleWhy.person-location-age",
+ "NextActionKey": "RuleNext.person-location-age",
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "MappingPersonnelLocationTTL",
+ "Comparison": "Equal",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "unit-location-age",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.unit-location-age",
+ "ExplanationKey": "RuleWhy.unit-location-age",
+ "NextActionKey": "RuleNext.unit-location-age",
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "MappingUnitLocationTTL",
+ "Comparison": "Equal",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "map-token",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.map-token",
+ "ExplanationKey": "RuleWhy.map-token",
+ "NextActionKey": "RuleNext.map-token",
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "MappingUseMapboxOverride",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "mapTokenPresent",
+ "Comparison": "IsFalse",
+ "Number": null
+ }
+ ]
+ },
+ {
+ "Id": "map-style",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.map-style",
+ "ExplanationKey": "RuleWhy.map-style",
+ "NextActionKey": "RuleNext.map-style",
+ "Location": {
+ "Controller": "Department",
+ "Action": "MappingSettings"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "MappingUseMapboxOverride",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "mapStylePresent",
+ "Comparison": "IsFalse",
+ "Number": null
+ }
+ ]
+ },
+ {
+ "Id": "weather-zones",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.weather-zones",
+ "ExplanationKey": "RuleWhy.weather-zones",
+ "NextActionKey": "RuleNext.weather-zones",
+ "Location": {
+ "Controller": "WeatherAlerts",
+ "Action": "Index"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "WeatherAlertsEnabled",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "weatherZoneCount",
+ "Comparison": "Equal",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "site-references",
+ "AreaId": "location",
+ "Severity": "Warning",
+ "TitleKey": "Rule.site-references",
+ "ExplanationKey": "RuleWhy.site-references",
+ "NextActionKey": "RuleNext.site-references",
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "declaredSiteReferences",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "unavailableSiteReferences",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "setting.UnitsSortOrder",
+ "Locale": "en",
+ "TitleKey": "Setting.UnitsSortOrder",
+ "Body": "Units Sort Order. Sort order for unit lists; does not change unit eligibility or dispatch recommendation ranking.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-unitssortorder",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.MappingPersonnelLocationTTL",
+ "Locale": "en",
+ "TitleKey": "Setting.MappingPersonnelLocationTTL",
+ "Body": "Mapping Personnel Location TTL. Maximum personnel location age in minutes. Zero keeps stale positions visible without an age limit; assess actual ping ages.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-mappingpersonnellocationttl",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.MappingUnitLocationTTL",
+ "Locale": "en",
+ "TitleKey": "Setting.MappingUnitLocationTTL",
+ "Body": "Mapping Unit Location TTL. Maximum unit location age in minutes. Zero retains stale unit locations indefinitely in supported map consumers.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-mappingunitlocationttl",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.MappingPersonnelAllowStatusWithNoLocationToOverwrite",
+ "Locale": "en",
+ "TitleKey": "Setting.MappingPersonnelAllowStatusWithNoLocationToOverwrite",
+ "Body": "Mapping Personnel Allow Status With No Location To Overwrite. Allow a personnel status without a location to replace the previous location-bearing state. This can remove a marker.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-mappingpersonnelallowstatuswithnolocationtooverwrite",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.MappingUnitAllowStatusWithNoLocationToOverwrite",
+ "Locale": "en",
+ "TitleKey": "Setting.MappingUnitAllowStatusWithNoLocationToOverwrite",
+ "Body": "Mapping Unit Allow Status With No Location To Overwrite. Allow a unit status without a location to overwrite earlier location data. Check hardware and app updates together.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-mappingunitallowstatuswithnolocationtooverwrite",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.PersonnelOnUnitSetUnitStatus",
+ "Locale": "en",
+ "TitleKey": "Setting.PersonnelOnUnitSetUnitStatus",
+ "Body": "Personnel On Unit Set Unit Status. Allow personnel status updates to influence their assigned unit status. Review automation and crew assignment together.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-personnelonunitsetunitstatus",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.WeatherAlertsEnabled",
+ "Locale": "en",
+ "TitleKey": "Setting.WeatherAlertsEnabled",
+ "Body": "Weather Alerts Enabled. Enable supported weather-alert processing. Configure zones and communication behavior before relying on it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-weatheralertsenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.WeatherAlertMinimumSeverity",
+ "Locale": "en",
+ "TitleKey": "Setting.WeatherAlertMinimumSeverity",
+ "Body": "Weather Alert Minimum Severity. Minimum severity eligible for the weather-alert view. Severity values come from the weather service, not local incident triage.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-weatheralertminimumseverity",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.WeatherAlertAutoMessageSeverity",
+ "Locale": "en",
+ "TitleKey": "Setting.WeatherAlertAutoMessageSeverity",
+ "Body": "Weather Alert Auto Message Severity. Minimum weather severity eligible for automatic messages. Review recipients, schedule and duplicate suppression.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-weatheralertautomessageseverity",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.WeatherAlertCallIntegration",
+ "Locale": "en",
+ "TitleKey": "Setting.WeatherAlertCallIntegration",
+ "Body": "Weather Alert Call Integration. Include supported weather context in call integration. It does not certify weather or route safety.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-weatheralertcallintegration",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.WeatherAlertCacheMinutes",
+ "Locale": "en",
+ "TitleKey": "Setting.WeatherAlertCacheMinutes",
+ "Body": "Weather Alert Cache Minutes. Weather cache duration; longer caching changes freshness and provider load.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-weatheralertcacheminutes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.WeatherAlertAutoMessageSchedule",
+ "Locale": "en",
+ "TitleKey": "Setting.WeatherAlertAutoMessageSchedule",
+ "Body": "Weather Alert Auto Message Schedule. Schedule for automatic weather messaging. Review the department time zone, overnight periods and daylight-saving changes.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-weatheralertautomessageschedule",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.WeatherAlertExcludedEvents",
+ "Locale": "en",
+ "TitleKey": "Setting.WeatherAlertExcludedEvents",
+ "Body": "Weather Alert Excluded Events. Weather event types excluded from configured processing. Review exclusions against approved local procedures.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-weatheralertexcludedevents",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.MappingUseMapboxOverride",
+ "Locale": "en",
+ "TitleKey": "Setting.MappingUseMapboxOverride",
+ "Body": "Mapping Use Mapbox Override. Use the department map provider override. Turning it off on the owning screen removes the stored style and token.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-mappingusemapboxoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.MappingMapboxStyleUrl",
+ "Locale": "en",
+ "TitleKey": "Setting.MappingMapboxStyleUrl",
+ "Body": "Mapping Mapbox Style Url. Custom map style reference. Verify the provider style and credential together; disabling the override deletes this value.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-mappingmapboxstyleurl",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.MappingMapboxAccessToken",
+ "Locale": "en",
+ "TitleKey": "Setting.MappingMapboxAccessToken",
+ "Body": "Mapping Mapbox Access Token. Map-provider access token. Only presence is reported. Disabling the override deletes it and requires re-entry to restore.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-mappingmapboxaccesstoken",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.HardwareTrackingStaleAfterSeconds",
+ "Locale": "en",
+ "TitleKey": "Setting.HardwareTrackingStaleAfterSeconds",
+ "Body": "Hardware Tracking Stale After Seconds. Age at which a hardware location becomes stale, clamped to at least one second. Review device reporting intervals.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-hardwaretrackingstaleafterseconds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.HardwareTrackingMobileFallbackEnabled",
+ "Locale": "en",
+ "TitleKey": "Setting.HardwareTrackingMobileFallbackEnabled",
+ "Body": "Hardware Tracking Mobile Fallback Enabled. Use supported mobile location fallback when hardware data is stale. Verify each device/source rather than assuming continuous tracking.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-hardwaretrackingmobilefallbackenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.HardwareTrackingLocationRetentionDays",
+ "Locale": "en",
+ "TitleKey": "Setting.HardwareTrackingLocationRetentionDays",
+ "Body": "Hardware Tracking Location Retention Days. Tracking retention bounded by host configuration and applicable holds. Shortening retention can make data eligible for deletion.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-hardwaretrackinglocationretentiondays",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.UnitStatusThresholds",
+ "Locale": "en",
+ "TitleKey": "Setting.UnitStatusThresholds",
+ "Body": "Unit Status Thresholds. Visual warning thresholds for time in a unit status. A highlight does not change the unit status or certify availability.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-unitstatusthresholds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.MappingDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.MappingDisabled",
+ "Body": "Mapping availability. Controls availability of maps and location views. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-mappingdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.MappingNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.MappingNameOverride",
+ "Body": "Mapping menu name. Optional display name for maps and location views in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-mappingnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitStatusThresholds.Thresholds",
+ "Locale": "en",
+ "TitleKey": "Field.UnitStatusThresholds.Thresholds",
+ "Body": "Unit Status Thresholds / Thresholds. Board highlighting thresholds grouped by base status meaning. An empty list disables highlighting.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unitstatusthresholds-thresholds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitStatusThreshold.BaseType",
+ "Locale": "en",
+ "TitleKey": "Field.UnitStatusThreshold.BaseType",
+ "Body": "Unit Status Threshold / Base Type. Base status meaning for a threshold, independent of custom status names and colors.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unitstatusthreshold-basetype",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitStatusThreshold.WarnSeconds",
+ "Locale": "en",
+ "TitleKey": "Field.UnitStatusThreshold.WarnSeconds",
+ "Body": "Unit Status Threshold / Warn Seconds. Seconds in this status before a warning highlight; zero disables it. An alert at or before this threshold makes the row alert-only.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unitstatusthreshold-warnseconds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.UnitStatusThreshold.AlertSeconds",
+ "Locale": "en",
+ "TitleKey": "Field.UnitStatusThreshold.AlertSeconds",
+ "Body": "Unit Status Threshold / Alert Seconds. Seconds in this status before a higher-priority highlight; zero disables it. Highlighting does not send a page or change status.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-unitstatusthreshold-alertseconds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.AddressId",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.AddressId",
+ "Body": "Department / Address Id. Department address reference. Review the owning address and mapping consumers; it is separate from station and site addresses.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-addressid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.WeatherAlertZone.Name",
+ "Locale": "en",
+ "TitleKey": "TableField.WeatherAlertZone.Name",
+ "Body": "Weather Alert Zone / Name. Administrator-facing label for this weather zone. The name does not define its geographic coverage.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-weatheralertzone-name",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.WeatherAlertZone.ZoneCode",
+ "Locale": "en",
+ "TitleKey": "TableField.WeatherAlertZone.ZoneCode",
+ "Body": "Weather Alert Zone / Zone Code. Provider weather-zone identifier. Verify the intended jurisdiction and source coverage.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-weatheralertzone-zonecode",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.WeatherAlertZone.CenterGeoLocation",
+ "Locale": "en",
+ "TitleKey": "TableField.WeatherAlertZone.CenterGeoLocation",
+ "Body": "Weather Alert Zone / Center Geo Location. Center point used by supported radius-based weather coverage. Coordinate values stay on their owning map/editor.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-weatheralertzone-centergeolocation",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.WeatherAlertZone.RadiusMiles",
+ "Locale": "en",
+ "TitleKey": "TableField.WeatherAlertZone.RadiusMiles",
+ "Body": "Weather Alert Zone / Radius Miles. Radius in miles for supported geographic matching. Review actual coverage and provider behavior; larger is not automatically safer.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-weatheralertzone-radiusmiles",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.WeatherAlertZone.IsActive",
+ "Locale": "en",
+ "TitleKey": "TableField.WeatherAlertZone.IsActive",
+ "Body": "Weather Alert Zone / Is Active. Whether the zone participates in supported weather processing. Department weather settings and worker operation are additional requirements.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-weatheralertzone-isactive",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.WeatherAlertZone.IsPrimary",
+ "Locale": "en",
+ "TitleKey": "TableField.WeatherAlertZone.IsPrimary",
+ "Body": "Weather Alert Zone / Is Primary. Marks the primary zone for consumers that select a default. Review other active zones rather than assuming they are disabled.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-weatheralertzone-isprimary",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "units",
+ "Locale": "en",
+ "TitleKey": "Feature.units",
+ "Body": "Units Apparatus, vehicles and teams Make resource information easier to find and show when positions are stale. Review an apparatus location and its last update before relying on the map. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "units",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-unit",
+ "Locale": "en",
+ "TitleKey": "Feature.new-unit",
+ "Body": "New Unit Add an apparatus, vehicle or team Make resource information easier to find and show when positions are stale. Review an apparatus location and its last update before relying on the map. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-unit",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "unit-staffing",
+ "Locale": "en",
+ "TitleKey": "Feature.unit-staffing",
+ "Body": "Unit Staffing Assign personnel to units Make resource information easier to find and show when positions are stale. Review an apparatus location and its last update before relying on the map. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "unit-staffing",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "mapping",
+ "Locale": "en",
+ "TitleKey": "Feature.mapping",
+ "Body": "Mapping Large map with layers, personnel and units Make resource information easier to find and show when positions are stale. Review an apparatus location and its last update before relying on the map. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "mapping",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "pois",
+ "Locale": "en",
+ "TitleKey": "Feature.pois",
+ "Body": "Points of Interest Manage map points of interest Make resource information easier to find and show when positions are stale. Review an apparatus location and its last update before relying on the map. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "pois",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "map-layers",
+ "Locale": "en",
+ "TitleKey": "Feature.map-layers",
+ "Body": "Map Layers Manage map layers Make resource information easier to find and show when positions are stale. Review an apparatus location and its last update before relying on the map. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "map-layers",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "live-routing",
+ "Locale": "en",
+ "TitleKey": "Feature.live-routing",
+ "Body": "Live Routing Routing and directions for active resources Make resource information easier to find and show when positions are stale. Review an apparatus location and its last update before relying on the map. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "live-routing",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "unit-types",
+ "Locale": "en",
+ "TitleKey": "Feature.unit-types",
+ "Body": "Unit types Configure apparatus and resource types and their supported status behavior. Group comparable resources without assuming staffing or qualification. Review an apparatus location and its last update before relying on the map. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "unit-types",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "hardware-tracking",
+ "Locale": "en",
+ "TitleKey": "Feature.hardware-tracking",
+ "Body": "Hardware location tracking Associate supported tracking devices with department resources. Review device ownership, stale-position behavior and fallback sources. Review an apparatus location and its last update before relying on the map. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "hardware-tracking",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "custom-maps",
+ "Locale": "en",
+ "TitleKey": "Feature.custom-maps",
+ "Body": "Custom map layers Manage supported custom map content for the department. Give responders useful reference layers with an identified owner and update process. Review an apparatus location and its last update before relying on the map. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "custom-maps",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "indoor-maps",
+ "Locale": "en",
+ "TitleKey": "Feature.indoor-maps",
+ "Body": "Indoor maps Organize indoor map references and zones where supported. Keep building references available to authorized users without inferring safe routes. Review an apparatus location and its last update before relying on the map. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "indoor-maps",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "routes",
+ "Locale": "en",
+ "TitleKey": "Feature.routes",
+ "Body": "Routes Manage configured routes and supported route assignments. Prepare recurring route information with current source ownership. Review an apparatus location and its last update before relying on the map. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "routes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "weather",
+ "Locale": "en",
+ "TitleKey": "Feature.weather",
+ "Body": "Weather zones and alerts Configure monitored zones and weather alert processing. Review alert coverage and automatic-message settings before use. Review an apparatus location and its last update before relying on the map. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "weather",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/maintenance.yaml b/Core/Resgrid.AdminAssist/Catalog/maintenance.yaml
new file mode 100644
index 000000000..fc1dc1e4b
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/maintenance.yaml
@@ -0,0 +1,581 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "maintenance",
+ "LabelKey": "Area.maintenance",
+ "PurposeKey": "AreaPurpose.maintenance",
+ "Order": 7,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "module.MaintenanceDisabled",
+ "AreaId": "maintenance",
+ "LabelKey": "Module.MaintenanceDisabled",
+ "HelpKey": "ModuleHelp.MaintenanceDisabled",
+ "Binding": "DepartmentModuleSettings.MaintenanceDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "MaintenanceEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.maintenance",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.MaintenanceDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.MaintenanceNameOverride",
+ "AreaId": "maintenance",
+ "LabelKey": "Module.MaintenanceNameOverride",
+ "HelpKey": "ModuleHelp.MaintenanceNameOverride",
+ "Binding": "DepartmentModuleSettings.MaintenanceNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.maintenance",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.MaintenanceNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "module.ChecklistsDisabled",
+ "AreaId": "maintenance",
+ "LabelKey": "Module.ChecklistsDisabled",
+ "HelpKey": "ModuleHelp.ChecklistsDisabled",
+ "Binding": "DepartmentModuleSettings.ChecklistsDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "ChecklistsEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.maintenance",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.ChecklistsDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "checklists",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.checklists",
+ "PurposeKey": "FeaturePurpose.checklists",
+ "ValueKey": "AreaValue.maintenance",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.checklists",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Checklists",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Checklists.System"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": [
+ "checklist-overdue"
+ ]
+ },
+ {
+ "Id": "new-checklist",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.new-checklist",
+ "PurposeKey": "FeaturePurpose.new-checklist",
+ "ValueKey": "AreaValue.maintenance",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.new-checklist",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Checklists",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Checklists.System"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "checklist-templates",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.checklist-templates",
+ "PurposeKey": "FeaturePurpose.checklist-templates",
+ "ValueKey": "AreaValue.maintenance",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.checklist-templates",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Checklists",
+ "Action": "Templates"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Checklists.System"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "work-orders",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.work-orders",
+ "PurposeKey": "FeaturePurpose.work-orders",
+ "ValueKey": "AreaValue.maintenance",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.work-orders",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "WorkOrders",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Maintenance.WorkOrders"
+ },
+ {
+ "Kind": "module",
+ "Id": "Maintenance"
+ },
+ {
+ "Kind": "addon",
+ "Id": "ReadinessPro"
+ }
+ ],
+ "SettingIds": [
+ "module.MaintenanceDisabled"
+ ],
+ "RuleIds": [
+ "equipment-holds"
+ ]
+ },
+ {
+ "Id": "new-work-order",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.new-work-order",
+ "PurposeKey": "FeaturePurpose.new-work-order",
+ "ValueKey": "AreaValue.maintenance",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.new-work-order",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "WorkOrders",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Maintenance.WorkOrders"
+ },
+ {
+ "Kind": "module",
+ "Id": "Maintenance"
+ },
+ {
+ "Kind": "addon",
+ "Id": "ReadinessPro"
+ }
+ ],
+ "SettingIds": [
+ "module.MaintenanceDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "checklist-schedules",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.checklist-schedules",
+ "PurposeKey": "FeaturePurpose.checklist-schedules",
+ "ValueKey": "FeatureValue.checklist-schedules",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.checklist-schedules",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Checklists",
+ "Action": "Due"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Checklists"
+ }
+ ],
+ "SettingIds": [
+ "module.ChecklistsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "checklist-reports",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.checklist-reports",
+ "PurposeKey": "FeaturePurpose.checklist-reports",
+ "ValueKey": "FeatureValue.checklist-reports",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.checklist-reports",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Checklists",
+ "Action": "Compliance"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Checklists"
+ }
+ ],
+ "SettingIds": [
+ "module.ChecklistsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "preventive-maintenance",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.preventive-maintenance",
+ "PurposeKey": "FeaturePurpose.preventive-maintenance",
+ "ValueKey": "FeatureValue.preventive-maintenance",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.preventive-maintenance",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "WorkOrders",
+ "Action": "Recurrences"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "ReadinessPro"
+ },
+ {
+ "Kind": "module",
+ "Id": "Maintenance"
+ }
+ ],
+ "SettingIds": [
+ "module.MaintenanceDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "maintenance-reports",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.maintenance-reports",
+ "PurposeKey": "FeaturePurpose.maintenance-reports",
+ "ValueKey": "FeatureValue.maintenance-reports",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.maintenance-reports",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "WorkOrders",
+ "Action": "Reports"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "ReadinessPro"
+ },
+ {
+ "Kind": "module",
+ "Id": "Maintenance"
+ }
+ ],
+ "SettingIds": [
+ "module.MaintenanceDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "maintenance-policy",
+ "AreaId": "maintenance",
+ "LabelKey": "Feature.maintenance-policy",
+ "PurposeKey": "FeaturePurpose.maintenance-policy",
+ "ValueKey": "FeatureValue.maintenance-policy",
+ "ExampleKey": "AreaExample.maintenance",
+ "AdoptionKey": "FeatureAdoption.maintenance-policy",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "WorkOrders",
+ "Action": "Settings"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "ReadinessPro"
+ },
+ {
+ "Kind": "module",
+ "Id": "Maintenance"
+ }
+ ],
+ "SettingIds": [
+ "module.MaintenanceDisabled"
+ ],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "checklist-overdue",
+ "AreaId": "maintenance",
+ "Severity": "Warning",
+ "TitleKey": "Rule.checklist-overdue",
+ "ExplanationKey": "RuleWhy.checklist-overdue",
+ "NextActionKey": "RuleNext.checklist-overdue",
+ "Location": {
+ "Controller": "Checklists",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "overdueChecklistCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "equipment-holds",
+ "AreaId": "maintenance",
+ "Severity": "Critical",
+ "TitleKey": "Rule.equipment-holds",
+ "ExplanationKey": "RuleWhy.equipment-holds",
+ "NextActionKey": "RuleNext.equipment-holds",
+ "Location": {
+ "Controller": "WorkOrders",
+ "Action": "Index"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "maintenanceAvailable",
+ "Comparison": "IsTrue",
+ "Number": null
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "activeSafetyHoldCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "module.MaintenanceDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.MaintenanceDisabled",
+ "Body": "Maintenance availability. Controls availability of maintenance and work orders. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-maintenancedisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.MaintenanceNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.MaintenanceNameOverride",
+ "Body": "Maintenance menu name. Optional display name for maintenance and work orders in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-maintenancenameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.ChecklistsDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.ChecklistsDisabled",
+ "Body": "Checklists availability. Controls availability of checklists. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-checklistsdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "checklists",
+ "Locale": "en",
+ "TitleKey": "Feature.checklists",
+ "Body": "Checklists Apparatus, station and readiness checklists Connect recorded equipment checks with owned corrective work when maintenance is enabled. Record an equipment defect, assign repair and review return to service through the owning module. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "checklists",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-checklist",
+ "Locale": "en",
+ "TitleKey": "Feature.new-checklist",
+ "Body": "New Checklist Author a checklist definition Connect recorded equipment checks with owned corrective work when maintenance is enabled. Record an equipment defect, assign repair and review return to service through the owning module. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-checklist",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "checklist-templates",
+ "Locale": "en",
+ "TitleKey": "Feature.checklist-templates",
+ "Body": "Checklist Templates Start from a checklist template Connect recorded equipment checks with owned corrective work when maintenance is enabled. Record an equipment defect, assign repair and review return to service through the owning module. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "checklist-templates",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "work-orders",
+ "Locale": "en",
+ "TitleKey": "Feature.work-orders",
+ "Body": "Work Orders Maintenance and repair work orders Connect recorded equipment checks with owned corrective work when maintenance is enabled. Record an equipment defect, assign repair and review return to service through the owning module. Checklists do not require Readiness Pro. Maintenance requires the add-on, module access and reviewed repair and approval procedures.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "work-orders",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-work-order",
+ "Locale": "en",
+ "TitleKey": "Feature.new-work-order",
+ "Body": "New Work Order Open a maintenance work order Connect recorded equipment checks with owned corrective work when maintenance is enabled. Record an equipment defect, assign repair and review return to service through the owning module. Checklists do not require Readiness Pro. Maintenance requires the add-on, module access and reviewed repair and approval procedures.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-work-order",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "checklist-schedules",
+ "Locale": "en",
+ "TitleKey": "Feature.checklist-schedules",
+ "Body": "Checklist schedules and due work Assign recurring checks and review due occurrences. Make recorded equipment and procedure checks visible to their owners. Record an equipment defect, assign repair and review return to service through the owning module. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "checklist-schedules",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "checklist-reports",
+ "Locale": "en",
+ "TitleKey": "Feature.checklist-reports",
+ "Body": "Checklist compliance reports Review expected, completed, skipped and overdue checks. Find missing recorded checks without treating a report as safety certification. Record an equipment defect, assign repair and review return to service through the owning module. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "checklist-reports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "preventive-maintenance",
+ "Locale": "en",
+ "TitleKey": "Feature.preventive-maintenance",
+ "Body": "Preventive maintenance Configure recurring maintenance work and due tasks. Plan equipment upkeep and track corrective responsibility. Record an equipment defect, assign repair and review return to service through the owning module. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "preventive-maintenance",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "maintenance-reports",
+ "Locale": "en",
+ "TitleKey": "Feature.maintenance-reports",
+ "Body": "Maintenance history and reports Review maintenance work, recorded holds and repair history. Support accountable return-to-service review through the owning workflow. Record an equipment defect, assign repair and review return to service through the owning module. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "maintenance-reports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "maintenance-policy",
+ "Locale": "en",
+ "TitleKey": "Feature.maintenance-policy",
+ "Body": "Maintenance policies and approvals Configure supported work-order policies and approval requirements. Make authority and repair completion requirements explicit. Record an equipment defect, assign repair and review return to service through the owning module. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "maintenance-policy",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/people.yaml b/Core/Resgrid.AdminAssist/Catalog/people.yaml
new file mode 100644
index 000000000..0d9ce87eb
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/people.yaml
@@ -0,0 +1,1403 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "people",
+ "LabelKey": "Area.people",
+ "PurposeKey": "AreaPurpose.people",
+ "Order": 2,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.DisabledAutoAvailable",
+ "AreaId": "people",
+ "LabelKey": "Setting.DisabledAutoAvailable",
+ "HelpKey": "SettingHelp.DisabledAutoAvailable",
+ "Binding": "DepartmentSettingTypes.DisabledAutoAvailable",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "DisabledAutoAvailable"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.DisabledAutoAvailable",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.PersonnelSortOrder",
+ "AreaId": "people",
+ "LabelKey": "Setting.PersonnelSortOrder",
+ "HelpKey": "SettingHelp.PersonnelSortOrder",
+ "Binding": "DepartmentSettingTypes.PersonnelSortOrder",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "PersonnelSortOrder"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.PersonnelSortOrder",
+ "DefaultValue": "owning view default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.PersonnelListStatusSortOrder",
+ "AreaId": "people",
+ "LabelKey": "Setting.PersonnelListStatusSortOrder",
+ "HelpKey": "SettingHelp.PersonnelListStatusSortOrder",
+ "Binding": "DepartmentSettingTypes.PersonnelListStatusSortOrder",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "PersonnelListStatusSortOrder"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.PersonnelListStatusSortOrder",
+ "DefaultValue": "empty ordering",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.AllowSignupsForMultipleShiftGroups",
+ "AreaId": "people",
+ "LabelKey": "Setting.AllowSignupsForMultipleShiftGroups",
+ "HelpKey": "SettingHelp.AllowSignupsForMultipleShiftGroups",
+ "Binding": "DepartmentSettingTypes.AllowSignupsForMultipleShiftGroups",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ShiftSettings",
+ "Field": "AllowSignupsForMultipleShiftGroups"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.AllowSignupsForMultipleShiftGroups",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.StaffingSuppressStaffingLevels",
+ "AreaId": "people",
+ "LabelKey": "Setting.StaffingSuppressStaffingLevels",
+ "HelpKey": "SettingHelp.StaffingSuppressStaffingLevels",
+ "Binding": "DepartmentSettingTypes.StaffingSuppressStaffingLevels",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "StaffingSuppressStaffingLevels"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.StaffingSuppressStaffingLevels",
+ "DefaultValue": "empty suppression list",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.ShiftsDisabled",
+ "AreaId": "people",
+ "LabelKey": "Module.ShiftsDisabled",
+ "HelpKey": "ModuleHelp.ShiftsDisabled",
+ "Binding": "DepartmentModuleSettings.ShiftsDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "ShiftsEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.ShiftsDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.ShiftsNameOverride",
+ "AreaId": "people",
+ "LabelKey": "Module.ShiftsNameOverride",
+ "HelpKey": "ModuleHelp.ShiftsNameOverride",
+ "Binding": "DepartmentModuleSettings.ShiftsNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.ShiftsNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "module.CalendarDisabled",
+ "AreaId": "people",
+ "LabelKey": "Module.CalendarDisabled",
+ "HelpKey": "ModuleHelp.CalendarDisabled",
+ "Binding": "DepartmentModuleSettings.CalendarDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "CalendarEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.CalendarDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.CalendarNameOverride",
+ "AreaId": "people",
+ "LabelKey": "Module.CalendarNameOverride",
+ "HelpKey": "ModuleHelp.CalendarNameOverride",
+ "Binding": "DepartmentModuleSettings.CalendarNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.CalendarNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "module.TrainingDisabled",
+ "AreaId": "people",
+ "LabelKey": "Module.TrainingDisabled",
+ "HelpKey": "ModuleHelp.TrainingDisabled",
+ "Binding": "DepartmentModuleSettings.TrainingDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "TrainingEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.TrainingDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.TrainingNameOverride",
+ "AreaId": "people",
+ "LabelKey": "Module.TrainingNameOverride",
+ "HelpKey": "ModuleHelp.TrainingNameOverride",
+ "Binding": "DepartmentModuleSettings.TrainingNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.TrainingNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.PersonnelListStatusOrderSetting.Orders",
+ "AreaId": "people",
+ "LabelKey": "Field.PersonnelListStatusOrderSetting.Orders",
+ "HelpKey": "FieldHelp.PersonnelListStatusOrderSetting.Orders",
+ "Binding": "PersonnelListStatusOrderSetting.Orders",
+ "ValueType": "list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.PersonnelListStatusSortOrder"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.PersonnelListStatusOrderSetting.Orders",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "PersonnelListStatusOrderSetting",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.PersonnelListStatusOrder.Weight",
+ "AreaId": "people",
+ "LabelKey": "Field.PersonnelListStatusOrder.Weight",
+ "HelpKey": "FieldHelp.PersonnelListStatusOrder.Weight",
+ "Binding": "PersonnelListStatusOrder.Weight",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.PersonnelListStatusSortOrder"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.PersonnelListStatusOrder.Weight",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "PersonnelListStatusOrder",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.PersonnelListStatusOrder.StatusId",
+ "AreaId": "people",
+ "LabelKey": "Field.PersonnelListStatusOrder.StatusId",
+ "HelpKey": "FieldHelp.PersonnelListStatusOrder.StatusId",
+ "Binding": "PersonnelListStatusOrder.StatusId",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.PersonnelListStatusSortOrder"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.PersonnelListStatusOrder.StatusId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "PersonnelListStatusOrder",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "AreaId": "people",
+ "LabelKey": "Field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "HelpKey": "FieldHelp.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "Binding": "DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.StaffingSuppressStaffingLevels"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DepartmentSuppressStaffingInfo",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "AreaId": "people",
+ "LabelKey": "Field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "HelpKey": "FieldHelp.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "Binding": "DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "ValueType": "reference-list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.people",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.StaffingSuppressStaffingLevels"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "DepartmentSuppressStaffingInfo",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "personnel",
+ "AreaId": "people",
+ "LabelKey": "Feature.personnel",
+ "PurposeKey": "FeaturePurpose.personnel",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.personnel",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Personnel",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [],
+ "Setup": {
+ "EvidenceId": "activePersonnelCount",
+ "Minimum": 1,
+ "RuleIds": [],
+ "GuidanceKey": "SetupEvidence.personnel"
+ }
+ },
+ {
+ "Id": "add-person",
+ "AreaId": "people",
+ "LabelKey": "Feature.add-person",
+ "PurposeKey": "FeaturePurpose.add-person",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.add-person",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Personnel",
+ "Action": "AddPerson"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "groups",
+ "AreaId": "people",
+ "LabelKey": "Feature.groups",
+ "PurposeKey": "FeaturePurpose.groups",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.groups",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Groups",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "empty-groups",
+ "station-address"
+ ],
+ "Setup": {
+ "EvidenceId": "groupCount",
+ "Minimum": 1,
+ "RuleIds": [
+ "empty-groups",
+ "station-address"
+ ],
+ "GuidanceKey": "SetupEvidence.groups"
+ }
+ },
+ {
+ "Id": "new-group",
+ "AreaId": "people",
+ "LabelKey": "Feature.new-group",
+ "PurposeKey": "FeaturePurpose.new-group",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.new-group",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Groups",
+ "Action": "NewGroup"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "shifts",
+ "AreaId": "people",
+ "LabelKey": "Feature.shifts",
+ "PurposeKey": "FeaturePurpose.shifts",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.shifts",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Shifts",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Shifts"
+ }
+ ],
+ "SettingIds": [
+ "module.ShiftsDisabled"
+ ],
+ "RuleIds": [
+ "shift-open-slots",
+ "shift-overlaps",
+ "shift-trades"
+ ]
+ },
+ {
+ "Id": "calendar",
+ "AreaId": "people",
+ "LabelKey": "Feature.calendar",
+ "PurposeKey": "FeaturePurpose.calendar",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.calendar",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Calendar",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Calendar"
+ }
+ ],
+ "SettingIds": [
+ "module.CalendarDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-calendar-item",
+ "AreaId": "people",
+ "LabelKey": "Feature.new-calendar-item",
+ "PurposeKey": "FeaturePurpose.new-calendar-item",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.new-calendar-item",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Calendar",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Calendar"
+ }
+ ],
+ "SettingIds": [
+ "module.CalendarDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "trainings",
+ "AreaId": "people",
+ "LabelKey": "Feature.trainings",
+ "PurposeKey": "FeaturePurpose.trainings",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.trainings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Trainings",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Training"
+ }
+ ],
+ "SettingIds": [
+ "module.TrainingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-training",
+ "AreaId": "people",
+ "LabelKey": "Feature.new-training",
+ "PurposeKey": "FeaturePurpose.new-training",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.new-training",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Trainings",
+ "Action": "New"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Training"
+ }
+ ],
+ "SettingIds": [
+ "module.TrainingDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "certification-dashboard",
+ "AreaId": "people",
+ "LabelKey": "Feature.certification-dashboard",
+ "PurposeKey": "FeaturePurpose.certification-dashboard",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.certification-dashboard",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Certifications",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "credential-expiry",
+ "qualified-coverage"
+ ]
+ },
+ {
+ "Id": "certification-types",
+ "AreaId": "people",
+ "LabelKey": "Feature.certification-types",
+ "PurposeKey": "FeaturePurpose.certification-types",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.certification-types",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Certifications",
+ "Action": "Types"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "certification-settings",
+ "AreaId": "people",
+ "LabelKey": "Feature.certification-settings",
+ "PurposeKey": "FeaturePurpose.certification-settings",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.certification-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Certifications",
+ "Action": "Settings"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "my-certifications",
+ "AreaId": "people",
+ "LabelKey": "Feature.my-certifications",
+ "PurposeKey": "FeaturePurpose.my-certifications",
+ "ValueKey": "AreaValue.people",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.my-certifications",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Certifications",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": [
+ "credential-expiry",
+ "qualified-coverage"
+ ]
+ },
+ {
+ "Id": "personnel-roles",
+ "AreaId": "people",
+ "LabelKey": "Feature.personnel-roles",
+ "PurposeKey": "FeaturePurpose.personnel-roles",
+ "ValueKey": "FeatureValue.personnel-roles",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.personnel-roles",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Personnel",
+ "Action": "Roles"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "custom-statuses",
+ "AreaId": "people",
+ "LabelKey": "Feature.custom-statuses",
+ "PurposeKey": "FeaturePurpose.custom-statuses",
+ "ValueKey": "FeatureValue.custom-statuses",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.custom-statuses",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "CustomStatuses",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "workshifts",
+ "AreaId": "people",
+ "LabelKey": "Feature.workshifts",
+ "PurposeKey": "FeaturePurpose.workshifts",
+ "ValueKey": "FeatureValue.workshifts",
+ "ExampleKey": "AreaExample.people",
+ "AdoptionKey": "FeatureAdoption.workshifts",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Workshifts",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Shifts"
+ }
+ ],
+ "SettingIds": [
+ "module.ShiftsDisabled"
+ ],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "empty-groups",
+ "AreaId": "people",
+ "Severity": "Warning",
+ "TitleKey": "Rule.empty-groups",
+ "ExplanationKey": "RuleWhy.empty-groups",
+ "NextActionKey": "RuleNext.empty-groups",
+ "Location": {
+ "Controller": "Groups",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "emptyGroupCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "qualified-coverage",
+ "AreaId": "people",
+ "Severity": "Critical",
+ "TitleKey": "Rule.qualified-coverage",
+ "ExplanationKey": "RuleWhy.qualified-coverage",
+ "NextActionKey": "RuleNext.qualified-coverage",
+ "Location": {
+ "Controller": "Certifications",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "uncoveredQualificationCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "credential-expiry",
+ "AreaId": "people",
+ "Severity": "Warning",
+ "TitleKey": "Rule.credential-expiry",
+ "ExplanationKey": "RuleWhy.credential-expiry",
+ "NextActionKey": "RuleNext.credential-expiry",
+ "Location": {
+ "Controller": "Certifications",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "qualificationsExpiring30Days",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "shift-open-slots",
+ "AreaId": "people",
+ "Severity": "Warning",
+ "TitleKey": "Rule.shift-open-slots",
+ "ExplanationKey": "RuleWhy.shift-open-slots",
+ "NextActionKey": "RuleNext.shift-open-slots",
+ "Location": {
+ "Controller": "Shifts",
+ "Action": "Index"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "upcomingShiftCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "upcomingOpenShiftSlots",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "shift-overlaps",
+ "AreaId": "people",
+ "Severity": "Warning",
+ "TitleKey": "Rule.shift-overlaps",
+ "ExplanationKey": "RuleWhy.shift-overlaps",
+ "NextActionKey": "RuleNext.shift-overlaps",
+ "Location": {
+ "Controller": "Shifts",
+ "Action": "Index"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "upcomingShiftCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "overlappingShiftPersonnel",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "shift-trades",
+ "AreaId": "people",
+ "Severity": "Warning",
+ "TitleKey": "Rule.shift-trades",
+ "ExplanationKey": "RuleWhy.shift-trades",
+ "NextActionKey": "RuleNext.shift-trades",
+ "Location": {
+ "Controller": "Shifts",
+ "Action": "Index"
+ },
+ "AppliesWhen": [
+ {
+ "EvidenceId": "upcomingShiftCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ],
+ "FailsWhen": [
+ {
+ "EvidenceId": "unfilledShiftTrades",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "setting.DisabledAutoAvailable",
+ "Locale": "en",
+ "TitleKey": "Setting.DisabledAutoAvailable",
+ "Body": "Disabled Auto Available. Disables automatic availability behavior. Review staffing/status reset interactions before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-disabledautoavailable",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.PersonnelSortOrder",
+ "Locale": "en",
+ "TitleKey": "Setting.PersonnelSortOrder",
+ "Body": "Personnel Sort Order. Sort order for personnel lists; does not change availability, access or dispatch priority.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-personnelsortorder",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.PersonnelListStatusSortOrder",
+ "Locale": "en",
+ "TitleKey": "Setting.PersonnelListStatusSortOrder",
+ "Body": "Personnel List Status Sort Order. Custom ordering of personnel statuses in lists. Review all configured statuses before replacing the order.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-personnelliststatussortorder",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.AllowSignupsForMultipleShiftGroups",
+ "Locale": "en",
+ "TitleKey": "Setting.AllowSignupsForMultipleShiftGroups",
+ "Body": "Allow Signups For Multiple Shift Groups. Allow a member to sign up for multiple shift groups. Review overlaps and local coverage rules separately.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-allowsignupsformultipleshiftgroups",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.StaffingSuppressStaffingLevels",
+ "Locale": "en",
+ "TitleKey": "Setting.StaffingSuppressStaffingLevels",
+ "Body": "Staffing Suppress Staffing Levels. Staffing levels suppressed in supported notifications. Suppression can change who hears an alert and is not evidence of delivery.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-staffingsuppressstaffinglevels",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.ShiftsDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.ShiftsDisabled",
+ "Body": "Shifts availability. Controls availability of shift scheduling. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-shiftsdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.ShiftsNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.ShiftsNameOverride",
+ "Body": "Shifts menu name. Optional display name for shift scheduling in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-shiftsnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.CalendarDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.CalendarDisabled",
+ "Body": "Calendar availability. Controls availability of calendar events. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-calendardisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.CalendarNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.CalendarNameOverride",
+ "Body": "Calendar menu name. Optional display name for calendar events in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-calendarnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.TrainingDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.TrainingDisabled",
+ "Body": "Training availability. Controls availability of training. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-trainingdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.TrainingNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.TrainingNameOverride",
+ "Body": "Training menu name. Optional display name for training in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-trainingnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.PersonnelListStatusOrderSetting.Orders",
+ "Locale": "en",
+ "TitleKey": "Field.PersonnelListStatusOrderSetting.Orders",
+ "Body": "Personnel List Status Order Setting / Orders. Ordered status weights for supported personnel lists. This does not set availability or dispatch priority.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-personnelliststatusordersetting-orders",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.PersonnelListStatusOrder.Weight",
+ "Locale": "en",
+ "TitleKey": "Field.PersonnelListStatusOrder.Weight",
+ "Body": "Personnel List Status Order / Weight. Relative list order for this status. Confirm all configured statuses remain represented.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-personnelliststatusorder-weight",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.PersonnelListStatusOrder.StatusId",
+ "Locale": "en",
+ "TitleKey": "Field.PersonnelListStatusOrder.StatusId",
+ "Body": "Personnel List Status Order / Status Id. Existing personnel-status identifier whose list position is being configured.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-personnelliststatusorder-statusid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "Locale": "en",
+ "TitleKey": "Field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "Body": "Department Suppress Staffing Info / Enable Supress Staffing. Enables the configured staffing-level suppression in supported notification consumers; review reachability before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-departmentsuppressstaffinginfo-enablesupressstaffing",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "Locale": "en",
+ "TitleKey": "Field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "Body": "Department Suppress Staffing Info / Staffing Levels To Supress. Existing staffing levels to suppress. A suppressed level is not proof that another channel reaches the member.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-departmentsuppressstaffinginfo-staffinglevelstosupress",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "personnel",
+ "Locale": "en",
+ "TitleKey": "Feature.personnel",
+ "Body": "Personnel People in the department, status and staffing Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "personnel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "add-person",
+ "Locale": "en",
+ "TitleKey": "Feature.add-person",
+ "Body": "Add Person Manually create a user account in the department Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "add-person",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "groups",
+ "Locale": "en",
+ "TitleKey": "Feature.groups",
+ "Body": "Groups & Stations Department groups and stations Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "groups",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-group",
+ "Locale": "en",
+ "TitleKey": "Feature.new-group",
+ "Body": "New Group Create a group or station Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-group",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "shifts",
+ "Locale": "en",
+ "TitleKey": "Feature.shifts",
+ "Body": "Shifts Shift signups, recurring shifts and trades Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "shifts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "calendar",
+ "Locale": "en",
+ "TitleKey": "Feature.calendar",
+ "Body": "Calendar Events, meetings and trainings you can sign up for Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "calendar",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-calendar-item",
+ "Locale": "en",
+ "TitleKey": "Feature.new-calendar-item",
+ "Body": "New Calendar Event Create a calendar event Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-calendar-item",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "trainings",
+ "Locale": "en",
+ "TitleKey": "Feature.trainings",
+ "Body": "Trainings Trainings, study guides and procedures Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "trainings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-training",
+ "Locale": "en",
+ "TitleKey": "Feature.new-training",
+ "Body": "New Training Create a training with optional quiz Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-training",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "certification-dashboard",
+ "Locale": "en",
+ "TitleKey": "Feature.certification-dashboard",
+ "Body": "Certification Dashboard Expiring and expired certifications for people and units Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "certification-dashboard",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "certification-types",
+ "Locale": "en",
+ "TitleKey": "Feature.certification-types",
+ "Body": "Certification Types The department's certification catalog and template gallery Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "certification-types",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "certification-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.certification-settings",
+ "Body": "Certification Settings Enforcement mode, grace period and expiry notifications Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "certification-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "my-certifications",
+ "Locale": "en",
+ "TitleKey": "Feature.my-certifications",
+ "Body": "My Certifications Your own certification records Keep access and responsibilities aligned with the people doing the work. Check that the next shift has the locally required qualified crew. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "my-certifications",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "personnel-roles",
+ "Locale": "en",
+ "TitleKey": "Feature.personnel-roles",
+ "Body": "Personnel roles Organize department-defined role assignments. Describe responsibility consistently without assuming that a role proves qualification. Check that the next shift has the locally required qualified crew. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "personnel-roles",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "custom-statuses",
+ "Locale": "en",
+ "TitleKey": "Feature.custom-statuses",
+ "Body": "Personnel and unit statuses Configure status names, base meanings and supported behavior. Use terminology familiar to the department while preserving automation meaning. Check that the next shift has the locally required qualified crew. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "custom-statuses",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "workshifts",
+ "Locale": "en",
+ "TitleKey": "Feature.workshifts",
+ "Body": "Workshifts Configure repeating workforce schedules supported by Workshifts. Review schedule ownership and local time separately from dispatch eligibility. Check that the next shift has the locally required qualified crew. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "workshifts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/plans.yaml b/Core/Resgrid.AdminAssist/Catalog/plans.yaml
new file mode 100644
index 000000000..a79f6d523
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/plans.yaml
@@ -0,0 +1,428 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "plans",
+ "LabelKey": "Area.plans",
+ "PurposeKey": "AreaPurpose.plans",
+ "Order": 12,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.StripeCustomerId",
+ "AreaId": "plans",
+ "LabelKey": "Setting.StripeCustomerId",
+ "HelpKey": "SettingHelp.StripeCustomerId",
+ "Binding": "DepartmentSettingTypes.StripeCustomerId",
+ "ValueType": "provider-reference",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index",
+ "Field": "StripeCustomerId"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.plans",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.StripeCustomerId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.BrainTreeCustomerId",
+ "AreaId": "plans",
+ "LabelKey": "Setting.BrainTreeCustomerId",
+ "HelpKey": "SettingHelp.BrainTreeCustomerId",
+ "Binding": "DepartmentSettingTypes.BrainTreeCustomerId",
+ "ValueType": "provider-reference",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index",
+ "Field": "BrainTreeCustomerId"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.plans",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.BrainTreeCustomerId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.PaddleCustomerId",
+ "AreaId": "plans",
+ "LabelKey": "Setting.PaddleCustomerId",
+ "HelpKey": "SettingHelp.PaddleCustomerId",
+ "Binding": "DepartmentSettingTypes.PaddleCustomerId",
+ "ValueType": "provider-reference",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index",
+ "Field": "PaddleCustomerId"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.plans",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.PaddleCustomerId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "addon-ptt",
+ "AreaId": "plans",
+ "LabelKey": "Feature.addon-ptt",
+ "PurposeKey": "FeaturePurpose.addon-ptt",
+ "ValueKey": "FeatureValue.addon-ptt",
+ "ExampleKey": "FeatureExample.addon-ptt",
+ "AdoptionKey": "FeatureAdoption.addon-ptt",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "PTT"
+ }
+ ],
+ "SettingIds": [
+ "setting.BrainTreeCustomerId",
+ "setting.PaddleCustomerId",
+ "setting.StripeCustomerId"
+ ],
+ "RuleIds": [
+ "personnel-limit",
+ "unit-limit"
+ ]
+ },
+ {
+ "Id": "addon-adp",
+ "AreaId": "plans",
+ "LabelKey": "Feature.addon-adp",
+ "PurposeKey": "FeaturePurpose.addon-adp",
+ "ValueKey": "FeatureValue.addon-adp",
+ "ExampleKey": "FeatureExample.addon-adp",
+ "AdoptionKey": "FeatureAdoption.addon-adp",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "ADP"
+ }
+ ],
+ "SettingIds": [
+ "setting.BrainTreeCustomerId",
+ "setting.PaddleCustomerId",
+ "setting.StripeCustomerId"
+ ],
+ "RuleIds": [
+ "personnel-limit",
+ "unit-limit"
+ ]
+ },
+ {
+ "Id": "addon-readiness",
+ "AreaId": "plans",
+ "LabelKey": "Feature.addon-readiness",
+ "PurposeKey": "FeaturePurpose.addon-readiness",
+ "ValueKey": "FeatureValue.addon-readiness",
+ "ExampleKey": "FeatureExample.addon-readiness",
+ "AdoptionKey": "FeatureAdoption.addon-readiness",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "ReadinessPro"
+ }
+ ],
+ "SettingIds": [
+ "setting.BrainTreeCustomerId",
+ "setting.PaddleCustomerId",
+ "setting.StripeCustomerId"
+ ],
+ "RuleIds": [
+ "personnel-limit",
+ "unit-limit"
+ ]
+ },
+ {
+ "Id": "addon-business",
+ "AreaId": "plans",
+ "LabelKey": "Feature.addon-business",
+ "PurposeKey": "FeaturePurpose.addon-business",
+ "ValueKey": "FeatureValue.addon-business",
+ "ExampleKey": "FeatureExample.addon-business",
+ "AdoptionKey": "FeatureAdoption.addon-business",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "BusinessOperations"
+ }
+ ],
+ "SettingIds": [
+ "setting.BrainTreeCustomerId",
+ "setting.PaddleCustomerId",
+ "setting.StripeCustomerId"
+ ],
+ "RuleIds": [
+ "personnel-limit",
+ "unit-limit"
+ ]
+ },
+ {
+ "Id": "addon-ai",
+ "AreaId": "plans",
+ "LabelKey": "Feature.addon-ai",
+ "PurposeKey": "FeaturePurpose.addon-ai",
+ "ValueKey": "FeatureValue.addon-ai",
+ "ExampleKey": "FeatureExample.addon-ai",
+ "AdoptionKey": "FeatureAdoption.addon-ai",
+ "ReleaseStatus": "planned",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "EnhancedAi"
+ }
+ ],
+ "SettingIds": [
+ "setting.BrainTreeCustomerId",
+ "setting.PaddleCustomerId",
+ "setting.StripeCustomerId"
+ ],
+ "RuleIds": [
+ "personnel-limit",
+ "unit-limit"
+ ]
+ },
+ {
+ "Id": "subscription",
+ "AreaId": "plans",
+ "LabelKey": "Feature.subscription",
+ "PurposeKey": "FeaturePurpose.subscription",
+ "ValueKey": "FeatureValue.subscription",
+ "ExampleKey": "AreaExample.plans",
+ "AdoptionKey": "FeatureAdoption.subscription",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "setting.BrainTreeCustomerId",
+ "setting.PaddleCustomerId",
+ "setting.StripeCustomerId"
+ ],
+ "RuleIds": [
+ "personnel-limit",
+ "unit-limit"
+ ]
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "personnel-limit",
+ "AreaId": "plans",
+ "Severity": "Warning",
+ "TitleKey": "Rule.personnel-limit",
+ "ExplanationKey": "RuleWhy.personnel-limit",
+ "NextActionKey": "RuleNext.personnel-limit",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "personnelUtilization",
+ "Comparison": "GreaterOrEqual",
+ "Number": 0.9
+ }
+ ]
+ },
+ {
+ "Id": "unit-limit",
+ "AreaId": "plans",
+ "Severity": "Warning",
+ "TitleKey": "Rule.unit-limit",
+ "ExplanationKey": "RuleWhy.unit-limit",
+ "NextActionKey": "RuleNext.unit-limit",
+ "Location": {
+ "Controller": "Subscription",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "unitUtilization",
+ "Comparison": "GreaterOrEqual",
+ "Number": 0.9
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "setting.StripeCustomerId",
+ "Locale": "en",
+ "TitleKey": "Setting.StripeCustomerId",
+ "Body": "Stripe Customer Id. Billing-provider customer reference managed by subscription workflows; never edit this as an ordinary department setting.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-stripecustomerid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.BrainTreeCustomerId",
+ "Locale": "en",
+ "TitleKey": "Setting.BrainTreeCustomerId",
+ "Body": "Brain Tree Customer Id. Legacy billing reference. Use the subscription provider workflow, not a direct settings edit.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-braintreecustomerid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.PaddleCustomerId",
+ "Locale": "en",
+ "TitleKey": "Setting.PaddleCustomerId",
+ "Body": "Paddle Customer Id. Billing-provider customer reference. Managed by authorized billing flows and never returned in assistant evidence.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-paddlecustomerid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "addon-ptt",
+ "Locale": "en",
+ "TitleKey": "Feature.addon-ptt",
+ "Body": "Push-to-Talk Voice channels for crew communication in supported Resgrid clients. Coordinate field teams through configured voice channels. A SAR coordinator uses a team channel during a training exercise. Review seats, supported clients and channel setup. PTT does not provide phone dispatch alerts or certify radio replacement.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "addon-ptt",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "addon-adp",
+ "Locale": "en",
+ "TitleKey": "Feature.addon-adp",
+ "Body": "Advanced Data Protection Additional protection and scoped access for cataloged sensitive department content. Control protected content disclosure and recovery through the department protection lifecycle. An administrator enrolls the department and verifies its recovery arrangements. Buying does not enroll the department. Review MFA, recovery, migration and integration behavior; this is not a compliance certification.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "addon-adp",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "addon-readiness",
+ "Locale": "en",
+ "TitleKey": "Feature.addon-readiness",
+ "Body": "Readiness Pro Maintenance, work orders, preventive tasks, corrective work, approvals and safety holds. Give equipment defects an owner and a recorded repair and return-to-service review. A failed apparatus check leads to an explicitly created maintenance work order. Checklists do not require this add-on. Maintenance needs its module, permissions and active entitlement. Historical evidence and hold release follow owning-module rules.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "addon-readiness",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "addon-business",
+ "Locale": "en",
+ "TitleKey": "Feature.addon-business",
+ "Body": "Business Operations Invoicing, payments, rates, contracts, bids, MARS reimbursement, workforce and field costing. Connect administrative commercial work to the department activities it supports. Prepare an event standby invoice or review documented mutual-aid costs. Certifications and Deployment Finance do not require this add-on. Pay-data reporting additionally needs ADP Enabled; online payments require provider setup. No reimbursement or savings are guaranteed.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "addon-business",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "addon-ai",
+ "Locale": "en",
+ "TitleKey": "Feature.addon-ai",
+ "Body": "Enhanced AI Planned summaries, drafts, knowledge assistance and optional Admin Assist conversation. Help explain approved evidence and prepare drafts for human review when released. Ask for an explanation of a configuration finding when the conversational feature is available. Planned until product and runtime availability are verified. Deterministic Setup Wizard, Setup Report and Admin Assist do not require an AI purchase.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "addon-ai",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "subscription",
+ "Locale": "en",
+ "TitleKey": "Feature.subscription",
+ "Body": "Base plans and capacity Review current plan allowances and authorized subscription options. Choose capacity for actual department needs without inferring prices or terms. Review feature requirements with the managing member before using the normal billing screen. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "subscription",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/records.yaml b/Core/Resgrid.AdminAssist/Catalog/records.yaml
new file mode 100644
index 000000000..e18144121
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/records.yaml
@@ -0,0 +1,2267 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "records",
+ "LabelKey": "Area.records",
+ "PurposeKey": "AreaPurpose.records",
+ "Order": 6,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.RecordsDefaultLifecyclePreset",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsDefaultLifecyclePreset",
+ "HelpKey": "SettingHelp.RecordsDefaultLifecyclePreset",
+ "Binding": "DepartmentSettingTypes.RecordsDefaultLifecyclePreset",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsDefaultLifecyclePreset"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsDefaultLifecyclePreset",
+ "DefaultValue": "owning records default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.RecordsReviewDueHours",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsReviewDueHours",
+ "HelpKey": "SettingHelp.RecordsReviewDueHours",
+ "Binding": "DepartmentSettingTypes.RecordsReviewDueHours",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsReviewDueHours"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsReviewDueHours",
+ "DefaultValue": "owning records default",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.RecordsNumberingConfig",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsNumberingConfig",
+ "HelpKey": "SettingHelp.RecordsNumberingConfig",
+ "Binding": "DepartmentSettingTypes.RecordsNumberingConfig",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsNumberingConfig"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsNumberingConfig",
+ "DefaultValue": "RecordsNumberingConfig constructor",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.RecordsSearchConfig",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsSearchConfig",
+ "HelpKey": "SettingHelp.RecordsSearchConfig",
+ "Binding": "DepartmentSettingTypes.RecordsSearchConfig",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsSearchConfig"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsSearchConfig",
+ "DefaultValue": "RecordsSearchConfig constructor",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.RecordsRetentionPolicy",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsRetentionPolicy",
+ "HelpKey": "SettingHelp.RecordsRetentionPolicy",
+ "Binding": "DepartmentSettingTypes.RecordsRetentionPolicy",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsRetentionPolicy"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsRetentionPolicy",
+ "DefaultValue": "class defaults, no department override",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.RecordsGroupVisibilityMode",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsGroupVisibilityMode",
+ "HelpKey": "SettingHelp.RecordsGroupVisibilityMode",
+ "Binding": "DepartmentSettingTypes.RecordsGroupVisibilityMode",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsGroupVisibilityMode"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsGroupVisibilityMode",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.RecordsGroupScopeConfig",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsGroupScopeConfig",
+ "HelpKey": "SettingHelp.RecordsGroupScopeConfig",
+ "Binding": "DepartmentSettingTypes.RecordsGroupScopeConfig",
+ "ValueType": "reserved",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsGroupScopeConfig"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsGroupScopeConfig",
+ "DefaultValue": "unused",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "retired"
+ },
+ {
+ "Id": "setting.RecordsDisclosureConfig",
+ "AreaId": "records",
+ "LabelKey": "Setting.RecordsDisclosureConfig",
+ "HelpKey": "SettingHelp.RecordsDisclosureConfig",
+ "Binding": "DepartmentSettingTypes.RecordsDisclosureConfig",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "RecordsDisclosureConfig"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RecordsDisclosureConfig",
+ "DefaultValue": "RecordsDisclosureConfig constructor",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.LogsDisabled",
+ "AreaId": "records",
+ "LabelKey": "Module.LogsDisabled",
+ "HelpKey": "ModuleHelp.LogsDisabled",
+ "Binding": "DepartmentModuleSettings.LogsDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "LogsEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.LogsDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.LogsNameOverride",
+ "AreaId": "records",
+ "LabelKey": "Module.LogsNameOverride",
+ "HelpKey": "ModuleHelp.LogsNameOverride",
+ "Binding": "DepartmentModuleSettings.LogsNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.LogsNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "module.ReportsDisabled",
+ "AreaId": "records",
+ "LabelKey": "Module.ReportsDisabled",
+ "HelpKey": "ModuleHelp.ReportsDisabled",
+ "Binding": "DepartmentModuleSettings.ReportsDisabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "ReportsEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.ReportsDisabled",
+ "DefaultValue": "false",
+ "AllowedValues": "true or false",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "module.ReportsNameOverride",
+ "AreaId": "records",
+ "LabelKey": "Module.ReportsNameOverride",
+ "HelpKey": "ModuleHelp.ReportsNameOverride",
+ "Binding": "DepartmentModuleSettings.ReportsNameOverride",
+ "ValueType": "string",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.ModuleSettings"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "module.ReportsNameOverride",
+ "DefaultValue": "unset",
+ "AllowedValues": "owning serializer and consuming UI",
+ "EvidenceSource": "DepartmentSettingsService.GetDepartmentModuleSettingsAsync",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.NumberAssignment",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsNumberingConfig.NumberAssignment",
+ "HelpKey": "FieldHelp.RecordsNumberingConfig.NumberAssignment",
+ "Binding": "RecordsNumberingConfig.NumberAssignment",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsNumberingConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsNumberingConfig.NumberAssignment",
+ "DefaultValue": "OnFinalize",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsNumberingConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.ResetYearly",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsNumberingConfig.ResetYearly",
+ "HelpKey": "FieldHelp.RecordsNumberingConfig.ResetYearly",
+ "Binding": "RecordsNumberingConfig.ResetYearly",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsNumberingConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsNumberingConfig.ResetYearly",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsNumberingConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.SequenceWidth",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsNumberingConfig.SequenceWidth",
+ "HelpKey": "FieldHelp.RecordsNumberingConfig.SequenceWidth",
+ "Binding": "RecordsNumberingConfig.SequenceWidth",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "SequenceWidth"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsNumberingConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsNumberingConfig.SequenceWidth",
+ "DefaultValue": "4",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsNumberingConfig",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.IncludeYear",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsNumberingConfig.IncludeYear",
+ "HelpKey": "FieldHelp.RecordsNumberingConfig.IncludeYear",
+ "Binding": "RecordsNumberingConfig.IncludeYear",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "IncludeYear"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsNumberingConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsNumberingConfig.IncludeYear",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsNumberingConfig",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.PerGroupSequence",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsNumberingConfig.PerGroupSequence",
+ "HelpKey": "FieldHelp.RecordsNumberingConfig.PerGroupSequence",
+ "Binding": "RecordsNumberingConfig.PerGroupSequence",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "PerGroupSequence"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsNumberingConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsNumberingConfig.PerGroupSequence",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsNumberingConfig",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.RecordsSearchConfig.IndexNarrative",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsSearchConfig.IndexNarrative",
+ "HelpKey": "FieldHelp.RecordsSearchConfig.IndexNarrative",
+ "Binding": "RecordsSearchConfig.IndexNarrative",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsSearchConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsSearchConfig.IndexNarrative",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsSearchConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsSearchConfig.IncludeLegacyHistory",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsSearchConfig.IncludeLegacyHistory",
+ "HelpKey": "FieldHelp.RecordsSearchConfig.IncludeLegacyHistory",
+ "Binding": "RecordsSearchConfig.IncludeLegacyHistory",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsSearchConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsSearchConfig.IncludeLegacyHistory",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsSearchConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.DepartmentDefaultYears",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionPolicy.DepartmentDefaultYears",
+ "HelpKey": "FieldHelp.RecordsRetentionPolicy.DepartmentDefaultYears",
+ "Binding": "RecordsRetentionPolicy.DepartmentDefaultYears",
+ "ValueType": "nullable-integer",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "DepartmentDefaultYears"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionPolicy.DepartmentDefaultYears",
+ "DefaultValue": "system class default",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.Overrides",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionPolicy.Overrides",
+ "HelpKey": "FieldHelp.RecordsRetentionPolicy.Overrides",
+ "Binding": "RecordsRetentionPolicy.Overrides",
+ "ValueType": "list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionPolicy.Overrides",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionPolicy",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.LastChangedByUserId",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionPolicy.LastChangedByUserId",
+ "HelpKey": "FieldHelp.RecordsRetentionPolicy.LastChangedByUserId",
+ "Binding": "RecordsRetentionPolicy.LastChangedByUserId",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionPolicy.LastChangedByUserId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionPolicy",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.LastChangedOn",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionPolicy.LastChangedOn",
+ "HelpKey": "FieldHelp.RecordsRetentionPolicy.LastChangedOn",
+ "Binding": "RecordsRetentionPolicy.LastChangedOn",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionPolicy.LastChangedOn",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionPolicy",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.History",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionPolicy.History",
+ "HelpKey": "FieldHelp.RecordsRetentionPolicy.History",
+ "Binding": "RecordsRetentionPolicy.History",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionPolicy.History",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionPolicy",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "field.RecordsRetentionOverride.DefinitionKey",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionOverride.DefinitionKey",
+ "HelpKey": "FieldHelp.RecordsRetentionOverride.DefinitionKey",
+ "Binding": "RecordsRetentionOverride.DefinitionKey",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionOverride.DefinitionKey",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionOverride",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsRetentionOverride.RetentionYears",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionOverride.RetentionYears",
+ "HelpKey": "FieldHelp.RecordsRetentionOverride.RetentionYears",
+ "Binding": "RecordsRetentionOverride.RetentionYears",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionOverride.RetentionYears",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionOverride",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsRetentionOverride.AppliesFrom",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionOverride.AppliesFrom",
+ "HelpKey": "FieldHelp.RecordsRetentionOverride.AppliesFrom",
+ "Binding": "RecordsRetentionOverride.AppliesFrom",
+ "ValueType": "date",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionOverride.AppliesFrom",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionOverride",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicyVersion.EffectiveOn",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionPolicyVersion.EffectiveOn",
+ "HelpKey": "FieldHelp.RecordsRetentionPolicyVersion.EffectiveOn",
+ "Binding": "RecordsRetentionPolicyVersion.EffectiveOn",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionPolicyVersion.EffectiveOn",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionPolicyVersion",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicyVersion.Policy",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsRetentionPolicyVersion.Policy",
+ "HelpKey": "FieldHelp.RecordsRetentionPolicyVersion.Policy",
+ "Binding": "RecordsRetentionPolicyVersion.Policy",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsRetentionPolicy"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsRetentionPolicyVersion.Policy",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsRetentionPolicyVersion",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "field.RecordsDisclosureConfig.StatutoryClockDays",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsDisclosureConfig.StatutoryClockDays",
+ "HelpKey": "FieldHelp.RecordsDisclosureConfig.StatutoryClockDays",
+ "Binding": "RecordsDisclosureConfig.StatutoryClockDays",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "DisclosureStatutoryClockDays"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsDisclosureConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsDisclosureConfig.StatutoryClockDays",
+ "DefaultValue": "10",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsDisclosureConfig",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.RecordsDisclosureConfig.DefaultRedactionProfile",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsDisclosureConfig.DefaultRedactionProfile",
+ "HelpKey": "FieldHelp.RecordsDisclosureConfig.DefaultRedactionProfile",
+ "Binding": "RecordsDisclosureConfig.DefaultRedactionProfile",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "DisclosureDefaultRedactionProfile"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsDisclosureConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsDisclosureConfig.DefaultRedactionProfile",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsDisclosureConfig",
+ "Availability": "available"
+ },
+ {
+ "Id": "field.RecordsDisclosureConfig.ReleaseApproverUserId",
+ "AreaId": "records",
+ "LabelKey": "Field.RecordsDisclosureConfig.ReleaseApproverUserId",
+ "HelpKey": "FieldHelp.RecordsDisclosureConfig.ReleaseApproverUserId",
+ "Binding": "RecordsDisclosureConfig.ReleaseApproverUserId",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings",
+ "Field": "DisclosureReleaseApproverUserId"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Medium",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.records",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.RecordsDisclosureConfig"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "field.RecordsDisclosureConfig.ReleaseApproverUserId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning configuration workflow",
+ "EvidenceSource": "RecordsDisclosureConfig",
+ "Availability": "available"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "logs",
+ "AreaId": "records",
+ "LabelKey": "Feature.logs",
+ "PurposeKey": "FeaturePurpose.logs",
+ "ValueKey": "AreaValue.records",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.logs",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Logs",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Logs"
+ }
+ ],
+ "SettingIds": [
+ "module.LogsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "new-log",
+ "AreaId": "records",
+ "LabelKey": "Feature.new-log",
+ "PurposeKey": "FeaturePurpose.new-log",
+ "ValueKey": "AreaValue.records",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.new-log",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Logs",
+ "Action": "NewLog"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Logs"
+ }
+ ],
+ "SettingIds": [
+ "module.LogsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "records",
+ "AreaId": "records",
+ "LabelKey": "Feature.records",
+ "PurposeKey": "FeaturePurpose.records",
+ "ValueKey": "AreaValue.records",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.records",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Records",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "module",
+ "Id": "Logs"
+ }
+ ],
+ "SettingIds": [
+ "module.LogsDisabled"
+ ],
+ "RuleIds": [
+ "record-review"
+ ]
+ },
+ {
+ "Id": "records-dashboard",
+ "AreaId": "records",
+ "LabelKey": "Feature.records-dashboard",
+ "PurposeKey": "FeaturePurpose.records-dashboard",
+ "ValueKey": "AreaValue.records",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.records-dashboard",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Records",
+ "Action": "Dashboard"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "module",
+ "Id": "Logs"
+ }
+ ],
+ "SettingIds": [
+ "module.LogsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "records-settings",
+ "AreaId": "records",
+ "LabelKey": "Feature.records-settings",
+ "PurposeKey": "FeaturePurpose.records-settings",
+ "ValueKey": "AreaValue.records",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.records-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Records",
+ "Action": "Settings"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "module",
+ "Id": "Logs"
+ }
+ ],
+ "SettingIds": [
+ "field.RecordsDisclosureConfig.DefaultRedactionProfile",
+ "field.RecordsDisclosureConfig.ReleaseApproverUserId",
+ "field.RecordsDisclosureConfig.StatutoryClockDays",
+ "field.RecordsNumberingConfig.IncludeYear",
+ "field.RecordsNumberingConfig.NumberAssignment",
+ "field.RecordsNumberingConfig.PerGroupSequence",
+ "field.RecordsNumberingConfig.ResetYearly",
+ "field.RecordsNumberingConfig.SequenceWidth",
+ "field.RecordsRetentionOverride.AppliesFrom",
+ "field.RecordsRetentionOverride.DefinitionKey",
+ "field.RecordsRetentionOverride.RetentionYears",
+ "field.RecordsRetentionPolicy.DepartmentDefaultYears",
+ "field.RecordsRetentionPolicy.History",
+ "field.RecordsRetentionPolicy.LastChangedByUserId",
+ "field.RecordsRetentionPolicy.LastChangedOn",
+ "field.RecordsRetentionPolicy.Overrides",
+ "field.RecordsRetentionPolicyVersion.EffectiveOn",
+ "field.RecordsRetentionPolicyVersion.Policy",
+ "field.RecordsSearchConfig.IncludeLegacyHistory",
+ "field.RecordsSearchConfig.IndexNarrative",
+ "module.LogsDisabled",
+ "setting.RecordsDefaultLifecyclePreset",
+ "setting.RecordsDisclosureConfig",
+ "setting.RecordsGroupScopeConfig",
+ "setting.RecordsGroupVisibilityMode",
+ "setting.RecordsNumberingConfig",
+ "setting.RecordsRetentionPolicy",
+ "setting.RecordsReviewDueHours",
+ "setting.RecordsSearchConfig"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "reports",
+ "AreaId": "records",
+ "LabelKey": "Feature.reports",
+ "PurposeKey": "FeaturePurpose.reports",
+ "ValueKey": "AreaValue.records",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.reports",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Reports",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "module",
+ "Id": "Reports"
+ }
+ ],
+ "SettingIds": [
+ "module.ReportsDisabled"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-definitions",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-definitions",
+ "PurposeKey": "FeaturePurpose.record-definitions",
+ "ValueKey": "FeatureValue.record-definitions",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-definitions",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordDefinitions",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "permission",
+ "Id": "ManageRecordDefinitions"
+ }
+ ],
+ "SettingIds": [
+ "permission.ManageRecordDefinitions"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "incident-reports",
+ "AreaId": "records",
+ "LabelKey": "Feature.incident-reports",
+ "PurposeKey": "FeaturePurpose.incident-reports",
+ "ValueKey": "FeatureValue.incident-reports",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.incident-reports",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "IncidentReports",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-occupancies",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-occupancies",
+ "PurposeKey": "FeaturePurpose.record-occupancies",
+ "ValueKey": "FeatureValue.record-occupancies",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-occupancies",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordOccupancies",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "flag",
+ "Id": "Records.Prevention.Occupancy"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-inspections",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-inspections",
+ "PurposeKey": "FeaturePurpose.record-inspections",
+ "ValueKey": "FeatureValue.record-inspections",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-inspections",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordInspections",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "flag",
+ "Id": "Records.Prevention.Inspections"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-hydrants",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-hydrants",
+ "PurposeKey": "FeaturePurpose.record-hydrants",
+ "ValueKey": "FeatureValue.record-hydrants",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-hydrants",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordHydrants",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "flag",
+ "Id": "Records.Prevention.Hydrants"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-permits",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-permits",
+ "PurposeKey": "FeaturePurpose.record-permits",
+ "ValueKey": "FeatureValue.record-permits",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-permits",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordPermits",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "flag",
+ "Id": "Records.Prevention.Permits"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-investigations",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-investigations",
+ "PurposeKey": "FeaturePurpose.record-investigations",
+ "ValueKey": "FeatureValue.record-investigations",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-investigations",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordInvestigations",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "flag",
+ "Id": "Records.Investigations"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-evidence",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-evidence",
+ "PurposeKey": "FeaturePurpose.record-evidence",
+ "ValueKey": "FeatureValue.record-evidence",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-evidence",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Records",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": [
+ "record-review"
+ ]
+ },
+ {
+ "Id": "record-holds",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-holds",
+ "PurposeKey": "FeaturePurpose.record-holds",
+ "ValueKey": "FeatureValue.record-holds",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-holds",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordLegalHolds",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "permission",
+ "Id": "ManageRecordLegalHold"
+ }
+ ],
+ "SettingIds": [
+ "permission.ManageRecordLegalHold"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-submissions",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-submissions",
+ "PurposeKey": "FeaturePurpose.record-submissions",
+ "ValueKey": "FeatureValue.record-submissions",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-submissions",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "IncidentReports",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "permission",
+ "Id": "SubmitRecords"
+ }
+ ],
+ "SettingIds": [
+ "permission.SubmitRecords"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-analytics",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-analytics",
+ "PurposeKey": "FeaturePurpose.record-analytics",
+ "ValueKey": "FeatureValue.record-analytics",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-analytics",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordsAnalytics",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "flag",
+ "Id": "Records.Analytics"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-saved-reports",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-saved-reports",
+ "PurposeKey": "FeaturePurpose.record-saved-reports",
+ "ValueKey": "FeatureValue.record-saved-reports",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-saved-reports",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordSavedReports",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "permission",
+ "Id": "ManageRecordReports"
+ }
+ ],
+ "SettingIds": [
+ "permission.ManageRecordReports"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-exports",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-exports",
+ "PurposeKey": "FeaturePurpose.record-exports",
+ "ValueKey": "FeatureValue.record-exports",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-exports",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "RecordsExportTemplates",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ },
+ {
+ "Kind": "permission",
+ "Id": "ManageRecordReports"
+ }
+ ],
+ "SettingIds": [
+ "permission.ManageRecordReports"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "record-disclosures",
+ "AreaId": "records",
+ "LabelKey": "Feature.record-disclosures",
+ "PurposeKey": "FeaturePurpose.record-disclosures",
+ "ValueKey": "FeatureValue.record-disclosures",
+ "ExampleKey": "AreaExample.records",
+ "AdoptionKey": "FeatureAdoption.record-disclosures",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Disclosures",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "flag",
+ "Id": "Records.System"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "record-review",
+ "AreaId": "records",
+ "Severity": "Warning",
+ "TitleKey": "Rule.record-review",
+ "ExplanationKey": "RuleWhy.record-review",
+ "NextActionKey": "RuleNext.record-review",
+ "Location": {
+ "Controller": "Records",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "overdueRecordReviewCount",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "setting.RecordsDefaultLifecyclePreset",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsDefaultLifecyclePreset",
+ "Body": "Records Default Lifecycle Preset. Default lifecycle for new department-owned definitions. Locked definitions retain their own lifecycle.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordsdefaultlifecyclepreset",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RecordsReviewDueHours",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsReviewDueHours",
+ "Body": "Records Review Due Hours. Default administrative review deadline; a definition-level override takes precedence. This is not a statutory deadline inference.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordsreviewduehours",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RecordsNumberingConfig",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsNumberingConfig",
+ "Body": "Records Numbering Config. Number assignment, year reset and sequence formatting for definitions that do not override the department configuration.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordsnumberingconfig",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RecordsSearchConfig",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsSearchConfig",
+ "Body": "Records Search Config. Allowed record search scope and protected-data behavior. Search access remains bounded by current source permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordssearchconfig",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RecordsRetentionPolicy",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsRetentionPolicy",
+ "Body": "Records Retention Policy. Default and definition-specific retention, including prior-policy history. Holds and restricted-class rules can prevent purge eligibility.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordsretentionpolicy",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RecordsGroupVisibilityMode",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsGroupVisibilityMode",
+ "Body": "Records Group Visibility Mode. Whether record visibility is department-wide or group scoped. Group scope narrows existing permission and never grants access.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordsgroupvisibilitymode",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RecordsGroupScopeConfig",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsGroupScopeConfig",
+ "Body": "Records Group Scope Config. Reserved identifier with no editable behavior in this release. Do not present it as a shipped setting.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordsgroupscopeconfig",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RecordsDisclosureConfig",
+ "Locale": "en",
+ "TitleKey": "Setting.RecordsDisclosureConfig",
+ "Body": "Records Disclosure Config. Disclosure review clock, redaction profile and release approver. Review local obligations through the authorized disclosure workflow.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-recordsdisclosureconfig",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.LogsDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.LogsDisabled",
+ "Body": "Logs availability. Controls availability of legacy logs. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-logsdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.LogsNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.LogsNameOverride",
+ "Body": "Logs menu name. Optional display name for legacy logs in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-logsnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.ReportsDisabled",
+ "Locale": "en",
+ "TitleKey": "Module.ReportsDisabled",
+ "Body": "Reports availability. Controls availability of reports. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-reportsdisabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module.ReportsNameOverride",
+ "Locale": "en",
+ "TitleKey": "Module.ReportsNameOverride",
+ "Body": "Reports menu name. Optional display name for reports in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-reportsnameoverride",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.NumberAssignment",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsNumberingConfig.NumberAssignment",
+ "Body": "Records Numbering Config / Number Assignment. Choose when numbers are assigned for definitions using department defaults. Review existing references before changing numbering behavior.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsnumberingconfig-numberassignment",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.ResetYearly",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsNumberingConfig.ResetYearly",
+ "Body": "Records Numbering Config / Reset Yearly. Restart record sequences each calendar year in the department time zone.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsnumberingconfig-resetyearly",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.SequenceWidth",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsNumberingConfig.SequenceWidth",
+ "Body": "Records Numbering Config / Sequence Width. Zero-padded sequence width for definitions using department defaults. The Records editor validates the supported width.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsnumberingconfig-sequencewidth",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.IncludeYear",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsNumberingConfig.IncludeYear",
+ "Body": "Records Numbering Config / Include Year. Include the year between the record prefix and sequence number.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsnumberingconfig-includeyear",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsNumberingConfig.PerGroupSequence",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsNumberingConfig.PerGroupSequence",
+ "Body": "Records Numbering Config / Per Group Sequence. Use separate station/group sequences. This changes numbering, not record visibility.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsnumberingconfig-pergroupsequence",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsSearchConfig.IndexNarrative",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsSearchConfig.IndexNarrative",
+ "Body": "Records Search Config / Index Narrative. Include unprotected narrative in search. Advanced Data Protection enrollment withdraws narrative indexing; this preference cannot override protection.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordssearchconfig-indexnarrative",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsSearchConfig.IncludeLegacyHistory",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsSearchConfig.IncludeLegacyHistory",
+ "Body": "Records Search Config / Include Legacy History. Include supported legacy personnel and unit logs in the Records search scope. Source permissions still apply.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordssearchconfig-includelegacyhistory",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.DepartmentDefaultYears",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionPolicy.DepartmentDefaultYears",
+ "Body": "Records Retention Policy / Department Default Years. Department retention for standard record classes. Zero means permanent; protected classes, prior policy and holds can retain records longer.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionpolicy-departmentdefaultyears",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.Overrides",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionPolicy.Overrides",
+ "Body": "Records Retention Policy / Overrides. Definition-specific prospective retention overrides. Use the Records workflow and its confirmations; Admin Assist never purges records.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionpolicy-overrides",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.LastChangedByUserId",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionPolicy.LastChangedByUserId",
+ "Body": "Records Retention Policy / Last Changed By User Id. Recorded policy-change actor. It is not an editable retention rule and is not exposed as raw identity in this reference.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionpolicy-lastchangedbyuserid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.LastChangedOn",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionPolicy.LastChangedOn",
+ "Body": "Records Retention Policy / Last Changed On. Policy effective timestamp used with prior policy versions. It is not the record's retention expiry date.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionpolicy-lastchangedon",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicy.History",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionPolicy.History",
+ "Body": "Records Retention Policy / History. Prior policy versions retained by the owning lifecycle so current changes do not silently rewrite historical retention.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionpolicy-history",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionOverride.DefinitionKey",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionOverride.DefinitionKey",
+ "Body": "Records Retention Override / Definition Key. Stable record-definition key to which this override applies. Display names do not identify a retention policy.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionoverride-definitionkey",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionOverride.RetentionYears",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionOverride.RetentionYears",
+ "Body": "Records Retention Override / Retention Years. Years retained under this definition override; zero means permanent. Holds and prospective policy resolution still apply.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionoverride-retentionyears",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionOverride.AppliesFrom",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionOverride.AppliesFrom",
+ "Body": "Records Retention Override / Applies From. Prospective boundary for revisions eligible for the override, evaluated by the Records lifecycle.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionoverride-appliesfrom",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicyVersion.EffectiveOn",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionPolicyVersion.EffectiveOn",
+ "Body": "Records Retention Policy Version / Effective On. Effective timestamp of a stored historical retention policy version.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionpolicyversion-effectiveon",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsRetentionPolicyVersion.Policy",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsRetentionPolicyVersion.Policy",
+ "Body": "Records Retention Policy Version / Policy. Historical policy snapshot used to resolve retention for older revisions. Never edit this as an ordinary preference.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsretentionpolicyversion-policy",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsDisclosureConfig.StatutoryClockDays",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsDisclosureConfig.StatutoryClockDays",
+ "Body": "Records Disclosure Config / Statutory Clock Days. Configured disclosure review clock. Verify local obligations with the responsible owner; the default does not establish a legal deadline.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsdisclosureconfig-statutoryclockdays",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsDisclosureConfig.DefaultRedactionProfile",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsDisclosureConfig.DefaultRedactionProfile",
+ "Body": "Records Disclosure Config / Default Redaction Profile. Default redaction profile in the owning disclosure workflow. Review the actual proposed release before approval.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsdisclosureconfig-defaultredactionprofile",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "field.RecordsDisclosureConfig.ReleaseApproverUserId",
+ "Locale": "en",
+ "TitleKey": "Field.RecordsDisclosureConfig.ReleaseApproverUserId",
+ "Body": "Records Disclosure Config / Release Approver User Id. Authorized member responsible for disclosure release approval. Selecting an approver does not grant missing permissions or protected-data access.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "field-recordsdisclosureconfig-releaseapproveruserid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "logs",
+ "Locale": "en",
+ "TitleKey": "Feature.logs",
+ "Body": "Logs Run, training, work and meeting logs Keep administrative follow-up and reporting evidence connected to the source record. Review an incident report and its outstanding corrections using the Records workflow. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "logs",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "new-log",
+ "Locale": "en",
+ "TitleKey": "Feature.new-log",
+ "Body": "New Log Create a run report, training log or work log Keep administrative follow-up and reporting evidence connected to the source record. Review an incident report and its outstanding corrections using the Records workflow. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "new-log",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "records",
+ "Locale": "en",
+ "TitleKey": "Feature.records",
+ "Body": "Records Records queue: run reports, training and operational records Keep administrative follow-up and reporting evidence connected to the source record. Review an incident report and its outstanding corrections using the Records workflow. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "records",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "records-dashboard",
+ "Locale": "en",
+ "TitleKey": "Feature.records-dashboard",
+ "Body": "Records Dashboard Records due, submissions and quality at a glance Keep administrative follow-up and reporting evidence connected to the source record. Review an incident report and its outstanding corrections using the Records workflow. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "records-dashboard",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "records-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.records-settings",
+ "Body": "Records Settings Lifecycle, numbering, search, retention and visibility settings for Records Keep administrative follow-up and reporting evidence connected to the source record. Review an incident report and its outstanding corrections using the Records workflow. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "records-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "reports",
+ "Locale": "en",
+ "TitleKey": "Feature.reports",
+ "Body": "Reports Generate reports from department data Keep administrative follow-up and reporting evidence connected to the source record. Review an incident report and its outstanding corrections using the Records workflow. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "reports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-definitions",
+ "Locale": "en",
+ "TitleKey": "Feature.record-definitions",
+ "Body": "Record definitions and templates Configure record forms, lifecycle, numbering and review requirements. Fit reporting to approved local procedures while preserving built-in definitions. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-definitions",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "incident-reports",
+ "Locale": "en",
+ "TitleKey": "Feature.incident-reports",
+ "Body": "Incident reports Prepare incident reports linked to authorized call evidence. Review source completeness before finalization or external submission. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "incident-reports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-occupancies",
+ "Locale": "en",
+ "TitleKey": "Feature.record-occupancies",
+ "Body": "Occupancies and preplans Maintain premises, contacts, hazards and review metadata. Keep site knowledge owned and current; recorded hazards do not certify safety. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-occupancies",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-inspections",
+ "Locale": "en",
+ "TitleKey": "Feature.record-inspections",
+ "Body": "Inspections Schedule and record authorized inspection work and corrections. Track administrative follow-up against configured inspection procedures. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-inspections",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-hydrants",
+ "Locale": "en",
+ "TitleKey": "Feature.record-hydrants",
+ "Body": "Hydrants and water sources Maintain hydrant and water-source records and their review history. Identify records needing verification without claiming current flow or availability. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-hydrants",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-permits",
+ "Locale": "en",
+ "TitleKey": "Feature.record-permits",
+ "Body": "Permits Manage supported permit records and lifecycle. Assign review responsibility; a software state is not a hazardous-work safety clearance. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-permits",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-investigations",
+ "Locale": "en",
+ "TitleKey": "Feature.record-investigations",
+ "Body": "Investigations Manage authorized investigation records and their controlled workflow. Keep case responsibility and access separate from general department visibility. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-investigations",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-evidence",
+ "Locale": "en",
+ "TitleKey": "Feature.record-evidence",
+ "Body": "Evidence capture and provenance Capture supported source evidence from the owning record workflow. Preserve evidence context and access restrictions without copying it into setup guidance. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-evidence",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-holds",
+ "Locale": "en",
+ "TitleKey": "Feature.record-holds",
+ "Body": "Legal holds Place and release holds through the authorized Records lifecycle. Retain affected evidence while a hold remains active. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-holds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-submissions",
+ "Locale": "en",
+ "TitleKey": "Feature.record-submissions",
+ "Body": "Reporting submissions Prepare and reconcile supported reporting submissions from an authorized incident report. Review destination requirements and actual submission outcomes. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-submissions",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-analytics",
+ "Locale": "en",
+ "TitleKey": "Feature.record-analytics",
+ "Body": "Records analytics Review supported aggregate response, workload and readiness reports. Use measured source data with its scope and completeness limits. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-analytics",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-saved-reports",
+ "Locale": "en",
+ "TitleKey": "Feature.record-saved-reports",
+ "Body": "Saved record reports Create reusable report selections over authorized record data. Make repeatable administrative reviews easier. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-saved-reports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-exports",
+ "Locale": "en",
+ "TitleKey": "Feature.record-exports",
+ "Body": "Record exports and templates Configure supported export templates and review their runs. Keep release destinations, protected access and output handling explicit. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-exports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "record-disclosures",
+ "Locale": "en",
+ "TitleKey": "Feature.record-disclosures",
+ "Body": "Disclosure requests Manage disclosure scope, redaction and release approval. Assign review ownership and verify the material approved for release. Review an incident report and its outstanding corrections using the Records workflow. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "record-disclosures",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/Catalog/security.yaml b/Core/Resgrid.AdminAssist/Catalog/security.yaml
new file mode 100644
index 000000000..3281ba68a
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Catalog/security.yaml
@@ -0,0 +1,7055 @@
+{
+ "Version": "2026.09.24.1",
+ "Areas": [
+ {
+ "Id": "security",
+ "LabelKey": "Area.security",
+ "PurposeKey": "AreaPurpose.security",
+ "Order": 11,
+ "Archetypes": []
+ }
+ ],
+ "Settings": [
+ {
+ "Id": "setting.TestEnabled",
+ "AreaId": "security",
+ "LabelKey": "Setting.TestEnabled",
+ "HelpKey": "SettingHelp.TestEnabled",
+ "Binding": "DepartmentSettingTypes.TestEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "TestEnabled"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.TestEnabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.UpdateTimestamp",
+ "AreaId": "security",
+ "LabelKey": "Setting.UpdateTimestamp",
+ "HelpKey": "SettingHelp.UpdateTimestamp",
+ "Binding": "DepartmentSettingTypes.UpdateTimestamp",
+ "ValueType": "internal",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "UpdateTimestamp"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.UpdateTimestamp",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.ModuleSettings",
+ "AreaId": "security",
+ "LabelKey": "Setting.ModuleSettings",
+ "HelpKey": "SettingHelp.ModuleSettings",
+ "Binding": "DepartmentSettingTypes.ModuleSettings",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings",
+ "Field": "ModuleSettings"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.ModuleSettings",
+ "DefaultValue": "all switches enabled, no label overrides",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.Require2FAForAdmins",
+ "AreaId": "security",
+ "LabelKey": "Setting.Require2FAForAdmins",
+ "HelpKey": "SettingHelp.Require2FAForAdmins",
+ "Binding": "DepartmentSettingTypes.Require2FAForAdmins",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "Require2FAForAdmins"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.Require2FAForAdmins",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.ForceChatbotSecurityPin",
+ "AreaId": "security",
+ "LabelKey": "Setting.ForceChatbotSecurityPin",
+ "HelpKey": "SettingHelp.ForceChatbotSecurityPin",
+ "Binding": "DepartmentSettingTypes.ForceChatbotSecurityPin",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "ForceChatbotSecurityPin"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.ForceChatbotSecurityPin",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.RequirePasswordResetViaEmail",
+ "AreaId": "security",
+ "LabelKey": "Setting.RequirePasswordResetViaEmail",
+ "HelpKey": "SettingHelp.RequirePasswordResetViaEmail",
+ "Binding": "DepartmentSettingTypes.RequirePasswordResetViaEmail",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": "RequirePasswordResetViaEmail"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.RequirePasswordResetViaEmail",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "setting.DepartmentOperatingProfile",
+ "AreaId": "security",
+ "LabelKey": "Setting.DepartmentOperatingProfile",
+ "HelpKey": "SettingHelp.DepartmentOperatingProfile",
+ "Binding": "DepartmentSettingTypes.DepartmentOperatingProfile",
+ "ValueType": "protobuf",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "DepartmentOperatingProfile"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "setting.DepartmentOperatingProfile",
+ "DefaultValue": "unknown context, no selected archetypes",
+ "AllowedValues": "Validated by the owning editor and service; Admin Assist never saves a proposed value.",
+ "EvidenceSource": "DepartmentSettings",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.Archetypes",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.Archetypes",
+ "HelpKey": "ProfileFieldHelp.Archetypes",
+ "Binding": "DepartmentOperatingProfile.Archetypes",
+ "ValueType": "list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "Archetypes"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.Archetypes",
+ "DefaultValue": "none",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.WorkforceMix",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.WorkforceMix",
+ "HelpKey": "ProfileFieldHelp.WorkforceMix",
+ "Binding": "DepartmentOperatingProfile.WorkforceMix",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "WorkforceMix"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.WorkforceMix",
+ "DefaultValue": "unknown",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.DeclaredMemberCount",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.DeclaredMemberCount",
+ "HelpKey": "ProfileFieldHelp.DeclaredMemberCount",
+ "Binding": "DepartmentOperatingProfile.DeclaredMemberCount",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "DeclaredMemberCount"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.DeclaredMemberCount",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.AuthoritativeSystemReferences",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.AuthoritativeSystemReferences",
+ "HelpKey": "ProfileFieldHelp.AuthoritativeSystemReferences",
+ "Binding": "DepartmentOperatingProfile.AuthoritativeSystemReferences",
+ "ValueType": "reference-list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "AuthoritativeSystemReferences"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.AuthoritativeSystemReferences",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.DispatchModel",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.DispatchModel",
+ "HelpKey": "ProfileFieldHelp.DispatchModel",
+ "Binding": "DepartmentOperatingProfile.DispatchModel",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "DispatchModel"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.DispatchModel",
+ "DefaultValue": "unknown",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.OperatingHours",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.OperatingHours",
+ "HelpKey": "ProfileFieldHelp.OperatingHours",
+ "Binding": "DepartmentOperatingProfile.OperatingHours",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "OperatingHours"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.OperatingHours",
+ "DefaultValue": "unknown",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.SiteGroupReferences",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.SiteGroupReferences",
+ "HelpKey": "ProfileFieldHelp.SiteGroupReferences",
+ "Binding": "DepartmentOperatingProfile.SiteGroupReferences",
+ "ValueType": "reference-list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "SiteGroupReferences"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.SiteGroupReferences",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.MutualAid",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.MutualAid",
+ "HelpKey": "ProfileFieldHelp.MutualAid",
+ "Binding": "DepartmentOperatingProfile.MutualAid",
+ "ValueType": "nullable-boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "MutualAid"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.MutualAid",
+ "DefaultValue": "unknown",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.LanguageCodes",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.LanguageCodes",
+ "HelpKey": "ProfileFieldHelp.LanguageCodes",
+ "Binding": "DepartmentOperatingProfile.LanguageCodes",
+ "ValueType": "list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "LanguageCodes"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.LanguageCodes",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.AccessibilityNeeds",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.AccessibilityNeeds",
+ "HelpKey": "ProfileFieldHelp.AccessibilityNeeds",
+ "Binding": "DepartmentOperatingProfile.AccessibilityNeeds",
+ "ValueType": "list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "AccessibilityNeeds"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.AccessibilityNeeds",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.StaffingPolicyReferences",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.StaffingPolicyReferences",
+ "HelpKey": "ProfileFieldHelp.StaffingPolicyReferences",
+ "Binding": "DepartmentOperatingProfile.StaffingPolicyReferences",
+ "ValueType": "reference-list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "StaffingPolicyReferences"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.StaffingPolicyReferences",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.QualificationPolicyReferences",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.QualificationPolicyReferences",
+ "HelpKey": "ProfileFieldHelp.QualificationPolicyReferences",
+ "Binding": "DepartmentOperatingProfile.QualificationPolicyReferences",
+ "ValueType": "reference-list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "QualificationPolicyReferences"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.QualificationPolicyReferences",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.ContinuityProcedureReferences",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.ContinuityProcedureReferences",
+ "HelpKey": "ProfileFieldHelp.ContinuityProcedureReferences",
+ "Binding": "DepartmentOperatingProfile.ContinuityProcedureReferences",
+ "ValueType": "reference-list",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "ContinuityProcedureReferences"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.ContinuityProcedureReferences",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.SeasonStartMonthDay",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.SeasonStartMonthDay",
+ "HelpKey": "ProfileFieldHelp.SeasonStartMonthDay",
+ "Binding": "DepartmentOperatingProfile.SeasonStartMonthDay",
+ "ValueType": "date-part",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "SeasonStartMonthDay"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.SeasonStartMonthDay",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.SeasonEndMonthDay",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.SeasonEndMonthDay",
+ "HelpKey": "ProfileFieldHelp.SeasonEndMonthDay",
+ "Binding": "DepartmentOperatingProfile.SeasonEndMonthDay",
+ "ValueType": "date-part",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "SeasonEndMonthDay"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.SeasonEndMonthDay",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "profile.ReviewedOnUtc",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.ReviewedOnUtc",
+ "HelpKey": "ProfileFieldHelp.ReviewedOnUtc",
+ "Binding": "DepartmentOperatingProfile.ReviewedOnUtc",
+ "ValueType": "server-metadata",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.ReviewedOnUtc",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "profile.Revision",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.Revision",
+ "HelpKey": "ProfileFieldHelp.Revision",
+ "Binding": "DepartmentOperatingProfile.Revision",
+ "ValueType": "server-metadata",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.Revision",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "profile.ExpectedEmailPollIntervalMinutes",
+ "AreaId": "security",
+ "LabelKey": "ProfileField.ExpectedEmailPollIntervalMinutes",
+ "HelpKey": "ProfileFieldHelp.ExpectedEmailPollIntervalMinutes",
+ "Binding": "DepartmentOperatingProfile.ExpectedEmailPollIntervalMinutes",
+ "ValueType": "nullable-integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "OperatingProfile",
+ "Field": "ExpectedEmailPollIntervalMinutes"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [
+ "setting.DepartmentOperatingProfile"
+ ],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "profile.ExpectedEmailPollIntervalMinutes",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by DepartmentOperatingProfile and the typed save boundary",
+ "EvidenceSource": "DepartmentSettingsService.GetOperatingProfileAsync",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.CreateCall",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateCall",
+ "HelpKey": "PermissionHelp.CreateCall",
+ "Binding": "PermissionTypes.CreateCall",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "CreateCall"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateCall",
+ "DefaultValue": "No permission row: everyone; no group lock",
+ "AllowedValues": "Actions 0–3, selected department role IDs for action 2, and group lock for resource visibility gates only",
+ "EvidenceSource": "PermissionsService.IsUserAllowed / ResourceVisibilityPermission",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.CreateNote",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateNote",
+ "HelpKey": "PermissionHelp.CreateNote",
+ "Binding": "PermissionTypes.CreateNote",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "CreateNote"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateNote",
+ "DefaultValue": "No permission row: everyone; no group lock",
+ "AllowedValues": "Actions 0–3, selected department role IDs for action 2, and group lock for resource visibility gates only",
+ "EvidenceSource": "PermissionsService.IsUserAllowed / ResourceVisibilityPermission",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.ViewPersonalInfo",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewPersonalInfo",
+ "HelpKey": "PermissionHelp.ViewPersonalInfo",
+ "Binding": "PermissionTypes.ViewPersonalInfo",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "ViewPersonalInfo"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewPersonalInfo",
+ "DefaultValue": "No permission row: everyone; no group lock",
+ "AllowedValues": "Actions 0–3, selected department role IDs for action 2, and group lock for resource visibility gates only",
+ "EvidenceSource": "PermissionsService.IsUserAllowed / ResourceVisibilityPermission",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.ViewGroupUsers",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewGroupUsers",
+ "HelpKey": "PermissionHelp.ViewGroupUsers",
+ "Binding": "PermissionTypes.ViewGroupUsers",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "ViewGroupsUsers"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewGroupUsers",
+ "DefaultValue": "No permission row: everyone; no group lock",
+ "AllowedValues": "Actions 0–3, selected department role IDs for action 2, and group lock for resource visibility gates only",
+ "EvidenceSource": "PermissionsService.IsUserAllowed / ResourceVisibilityPermission",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.ViewGroupUnits",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewGroupUnits",
+ "HelpKey": "PermissionHelp.ViewGroupUnits",
+ "Binding": "PermissionTypes.ViewGroupUnits",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "ViewGroupsUnits"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewGroupUnits",
+ "DefaultValue": "No permission row: everyone; no group lock",
+ "AllowedValues": "Actions 0–3, selected department role IDs for action 2, and group lock for resource visibility gates only",
+ "EvidenceSource": "PermissionsService.IsUserAllowed / ResourceVisibilityPermission",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.CanSeePersonnelLocations",
+ "AreaId": "security",
+ "LabelKey": "Permission.CanSeePersonnelLocations",
+ "HelpKey": "PermissionHelp.CanSeePersonnelLocations",
+ "Binding": "PermissionTypes.CanSeePersonnelLocations",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "ViewPersonnelLocation"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CanSeePersonnelLocations",
+ "DefaultValue": "No permission row: everyone; no group lock",
+ "AllowedValues": "Actions 0–3, selected department role IDs for action 2, and group lock for resource visibility gates only",
+ "EvidenceSource": "PermissionsService.IsUserAllowed / ResourceVisibilityPermission",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.CanSeeUnitLocations",
+ "AreaId": "security",
+ "LabelKey": "Permission.CanSeeUnitLocations",
+ "HelpKey": "PermissionHelp.CanSeeUnitLocations",
+ "Binding": "PermissionTypes.CanSeeUnitLocations",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index",
+ "Field": "ViewUnitLocation"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CanSeeUnitLocations",
+ "DefaultValue": "No permission row: everyone; no group lock",
+ "AllowedValues": "Actions 0–3, selected department role IDs for action 2, and group lock for resource visibility gates only",
+ "EvidenceSource": "PermissionsService.IsUserAllowed / ResourceVisibilityPermission",
+ "Availability": "available"
+ },
+ {
+ "Id": "permission.AddPersonnel",
+ "AreaId": "security",
+ "LabelKey": "Permission.AddPersonnel",
+ "HelpKey": "PermissionHelp.AddPersonnel",
+ "Binding": "PermissionTypes.AddPersonnel",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.AddPersonnel",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.AddPersonnel",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.RemovePersonnel",
+ "AreaId": "security",
+ "LabelKey": "Permission.RemovePersonnel",
+ "HelpKey": "PermissionHelp.RemovePersonnel",
+ "Binding": "PermissionTypes.RemovePersonnel",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.RemovePersonnel",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.RemovePersonnel",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateTraining",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateTraining",
+ "HelpKey": "PermissionHelp.CreateTraining",
+ "Binding": "PermissionTypes.CreateTraining",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateTraining",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateTraining",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateDocument",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateDocument",
+ "HelpKey": "PermissionHelp.CreateDocument",
+ "Binding": "PermissionTypes.CreateDocument",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateDocument",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateDocument",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateCalendarEntry",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateCalendarEntry",
+ "HelpKey": "PermissionHelp.CreateCalendarEntry",
+ "Binding": "PermissionTypes.CreateCalendarEntry",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateCalendarEntry",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateCalendarEntry",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateLog",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateLog",
+ "HelpKey": "PermissionHelp.CreateLog",
+ "Binding": "PermissionTypes.CreateLog",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateLog",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateLog",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateShift",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateShift",
+ "HelpKey": "PermissionHelp.CreateShift",
+ "Binding": "PermissionTypes.CreateShift",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateShift",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateShift",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.AdjustInventory",
+ "AreaId": "security",
+ "LabelKey": "Permission.AdjustInventory",
+ "HelpKey": "PermissionHelp.AdjustInventory",
+ "Binding": "PermissionTypes.AdjustInventory",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.AdjustInventory",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.AdjustInventory",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateMessage",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateMessage",
+ "HelpKey": "PermissionHelp.CreateMessage",
+ "Binding": "PermissionTypes.CreateMessage",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateMessage",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateMessage",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.DeleteCall",
+ "AreaId": "security",
+ "LabelKey": "Permission.DeleteCall",
+ "HelpKey": "PermissionHelp.DeleteCall",
+ "Binding": "PermissionTypes.DeleteCall",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.DeleteCall",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.DeleteCall",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CloseCall",
+ "AreaId": "security",
+ "LabelKey": "Permission.CloseCall",
+ "HelpKey": "PermissionHelp.CloseCall",
+ "Binding": "PermissionTypes.CloseCall",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CloseCall",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CloseCall",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.AddCallData",
+ "AreaId": "security",
+ "LabelKey": "Permission.AddCallData",
+ "HelpKey": "PermissionHelp.AddCallData",
+ "Binding": "PermissionTypes.AddCallData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.AddCallData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.AddCallData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ContactEdit",
+ "AreaId": "security",
+ "LabelKey": "Permission.ContactEdit",
+ "HelpKey": "PermissionHelp.ContactEdit",
+ "Binding": "PermissionTypes.ContactEdit",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ContactEdit",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ContactEdit",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ContactView",
+ "AreaId": "security",
+ "LabelKey": "Permission.ContactView",
+ "HelpKey": "PermissionHelp.ContactView",
+ "Binding": "PermissionTypes.ContactView",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ContactView",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ContactView",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ContactDelete",
+ "AreaId": "security",
+ "LabelKey": "Permission.ContactDelete",
+ "HelpKey": "PermissionHelp.ContactDelete",
+ "Binding": "PermissionTypes.ContactDelete",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ContactDelete",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ContactDelete",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateWorkflow",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateWorkflow",
+ "HelpKey": "PermissionHelp.CreateWorkflow",
+ "Binding": "PermissionTypes.CreateWorkflow",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateWorkflow",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateWorkflow",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageWorkflowCredentials",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageWorkflowCredentials",
+ "HelpKey": "PermissionHelp.ManageWorkflowCredentials",
+ "Binding": "PermissionTypes.ManageWorkflowCredentials",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageWorkflowCredentials",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageWorkflowCredentials",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewWorkflowRuns",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewWorkflowRuns",
+ "HelpKey": "PermissionHelp.ViewWorkflowRuns",
+ "Binding": "PermissionTypes.ViewWorkflowRuns",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewWorkflowRuns",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewWorkflowRuns",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewUdfFields",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewUdfFields",
+ "HelpKey": "PermissionHelp.ViewUdfFields",
+ "Binding": "PermissionTypes.ViewUdfFields",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewUdfFields",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewUdfFields",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRoutes",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageRoutes",
+ "HelpKey": "PermissionHelp.ManageRoutes",
+ "Binding": "PermissionTypes.ManageRoutes",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageRoutes",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageRoutes",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.DeleteLog",
+ "AreaId": "security",
+ "LabelKey": "Permission.DeleteLog",
+ "HelpKey": "PermissionHelp.DeleteLog",
+ "Binding": "PermissionTypes.DeleteLog",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.DeleteLog",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.DeleteLog",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.UseCalendarSync",
+ "AreaId": "security",
+ "LabelKey": "Permission.UseCalendarSync",
+ "HelpKey": "PermissionHelp.UseCalendarSync",
+ "Binding": "PermissionTypes.UseCalendarSync",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.UseCalendarSync",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.UseCalendarSync",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.DispatchAppLogin",
+ "AreaId": "security",
+ "LabelKey": "Permission.DispatchAppLogin",
+ "HelpKey": "PermissionHelp.DispatchAppLogin",
+ "Binding": "PermissionTypes.DispatchAppLogin",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.DispatchAppLogin",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.DispatchAppLogin",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CommandAppLogin",
+ "AreaId": "security",
+ "LabelKey": "Permission.CommandAppLogin",
+ "HelpKey": "PermissionHelp.CommandAppLogin",
+ "Binding": "PermissionTypes.CommandAppLogin",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CommandAppLogin",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CommandAppLogin",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageDepartmentDataProtection",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageDepartmentDataProtection",
+ "HelpKey": "PermissionHelp.ManageDepartmentDataProtection",
+ "Binding": "PermissionTypes.ManageDepartmentDataProtection",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageDepartmentDataProtection",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageDepartmentDataProtection",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedCallData",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewProtectedCallData",
+ "HelpKey": "PermissionHelp.ViewProtectedCallData",
+ "Binding": "PermissionTypes.ViewProtectedCallData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewProtectedCallData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewProtectedCallData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.EditProtectedCallData",
+ "AreaId": "security",
+ "LabelKey": "Permission.EditProtectedCallData",
+ "HelpKey": "PermissionHelp.EditProtectedCallData",
+ "Binding": "PermissionTypes.EditProtectedCallData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.EditProtectedCallData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.EditProtectedCallData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedPersonnelData",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewProtectedPersonnelData",
+ "HelpKey": "PermissionHelp.ViewProtectedPersonnelData",
+ "Binding": "PermissionTypes.ViewProtectedPersonnelData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewProtectedPersonnelData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewProtectedPersonnelData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedContactData",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewProtectedContactData",
+ "HelpKey": "PermissionHelp.ViewProtectedContactData",
+ "Binding": "PermissionTypes.ViewProtectedContactData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewProtectedContactData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewProtectedContactData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedOperationalData",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewProtectedOperationalData",
+ "HelpKey": "PermissionHelp.ViewProtectedOperationalData",
+ "Binding": "PermissionTypes.ViewProtectedOperationalData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewProtectedOperationalData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewProtectedOperationalData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ExportProtectedData",
+ "AreaId": "security",
+ "LabelKey": "Permission.ExportProtectedData",
+ "HelpKey": "PermissionHelp.ExportProtectedData",
+ "Binding": "PermissionTypes.ExportProtectedData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ExportProtectedData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ExportProtectedData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ConfigureProtectedDataEgress",
+ "AreaId": "security",
+ "LabelKey": "Permission.ConfigureProtectedDataEgress",
+ "HelpKey": "PermissionHelp.ConfigureProtectedDataEgress",
+ "Binding": "PermissionTypes.ConfigureProtectedDataEgress",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ConfigureProtectedDataEgress",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ConfigureProtectedDataEgress",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.BreakGlassProtectedData",
+ "AreaId": "security",
+ "LabelKey": "Permission.BreakGlassProtectedData",
+ "HelpKey": "PermissionHelp.BreakGlassProtectedData",
+ "Binding": "PermissionTypes.BreakGlassProtectedData",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.BreakGlassProtectedData",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.BreakGlassProtectedData",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateRecord",
+ "AreaId": "security",
+ "LabelKey": "Permission.CreateRecord",
+ "HelpKey": "PermissionHelp.CreateRecord",
+ "Binding": "PermissionTypes.CreateRecord",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.CreateRecord",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.CreateRecord",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.DeleteRecord",
+ "AreaId": "security",
+ "LabelKey": "Permission.DeleteRecord",
+ "HelpKey": "PermissionHelp.DeleteRecord",
+ "Binding": "PermissionTypes.DeleteRecord",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.DeleteRecord",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.DeleteRecord",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ReviewRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.ReviewRecords",
+ "HelpKey": "PermissionHelp.ReviewRecords",
+ "Binding": "PermissionTypes.ReviewRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ReviewRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ReviewRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ApproveRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.ApproveRecords",
+ "HelpKey": "PermissionHelp.ApproveRecords",
+ "Binding": "PermissionTypes.ApproveRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ApproveRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ApproveRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.FinalizeRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.FinalizeRecords",
+ "HelpKey": "PermissionHelp.FinalizeRecords",
+ "Binding": "PermissionTypes.FinalizeRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.FinalizeRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.FinalizeRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.AmendRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.AmendRecords",
+ "HelpKey": "PermissionHelp.AmendRecords",
+ "Binding": "PermissionTypes.AmendRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.AmendRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.AmendRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.SubmitRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.SubmitRecords",
+ "HelpKey": "PermissionHelp.SubmitRecords",
+ "Binding": "PermissionTypes.SubmitRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.SubmitRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.SubmitRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ExportRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.ExportRecords",
+ "HelpKey": "PermissionHelp.ExportRecords",
+ "Binding": "PermissionTypes.ExportRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ExportRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ExportRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ShareRecordsExternally",
+ "AreaId": "security",
+ "LabelKey": "Permission.ShareRecordsExternally",
+ "HelpKey": "PermissionHelp.ShareRecordsExternally",
+ "Binding": "PermissionTypes.ShareRecordsExternally",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ShareRecordsExternally",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ShareRecordsExternally",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewRestrictedRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewRestrictedRecords",
+ "HelpKey": "PermissionHelp.ViewRestrictedRecords",
+ "Binding": "PermissionTypes.ViewRestrictedRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewRestrictedRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewRestrictedRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewLegacyRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewLegacyRecords",
+ "HelpKey": "PermissionHelp.ViewLegacyRecords",
+ "Binding": "PermissionTypes.ViewLegacyRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewLegacyRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewLegacyRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewGroupRecords",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewGroupRecords",
+ "HelpKey": "PermissionHelp.ViewGroupRecords",
+ "Binding": "PermissionTypes.ViewGroupRecords",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewGroupRecords",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewGroupRecords",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordDefinitions",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageRecordDefinitions",
+ "HelpKey": "PermissionHelp.ManageRecordDefinitions",
+ "Binding": "PermissionTypes.ManageRecordDefinitions",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageRecordDefinitions",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageRecordDefinitions",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.PublishRecordDefinitions",
+ "AreaId": "security",
+ "LabelKey": "Permission.PublishRecordDefinitions",
+ "HelpKey": "PermissionHelp.PublishRecordDefinitions",
+ "Binding": "PermissionTypes.PublishRecordDefinitions",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.PublishRecordDefinitions",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.PublishRecordDefinitions",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordReports",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageRecordReports",
+ "HelpKey": "PermissionHelp.ManageRecordReports",
+ "Binding": "PermissionTypes.ManageRecordReports",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageRecordReports",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageRecordReports",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordDisclosures",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageRecordDisclosures",
+ "HelpKey": "PermissionHelp.ManageRecordDisclosures",
+ "Binding": "PermissionTypes.ManageRecordDisclosures",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageRecordDisclosures",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageRecordDisclosures",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordLegalHold",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageRecordLegalHold",
+ "HelpKey": "PermissionHelp.ManageRecordLegalHold",
+ "Binding": "PermissionTypes.ManageRecordLegalHold",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageRecordLegalHold",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageRecordLegalHold",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ReassignRecordDrafts",
+ "AreaId": "security",
+ "LabelKey": "Permission.ReassignRecordDrafts",
+ "HelpKey": "PermissionHelp.ReassignRecordDrafts",
+ "Binding": "PermissionTypes.ReassignRecordDrafts",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ReassignRecordDrafts",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ReassignRecordDrafts",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.RecordsPreventionAdmin",
+ "AreaId": "security",
+ "LabelKey": "Permission.RecordsPreventionAdmin",
+ "HelpKey": "PermissionHelp.RecordsPreventionAdmin",
+ "Binding": "PermissionTypes.RecordsPreventionAdmin",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.RecordsPreventionAdmin",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.RecordsPreventionAdmin",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageChecklists",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageChecklists",
+ "HelpKey": "PermissionHelp.ManageChecklists",
+ "Binding": "PermissionTypes.ManageChecklists",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageChecklists",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageChecklists",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewChecklistResults",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewChecklistResults",
+ "HelpKey": "PermissionHelp.ViewChecklistResults",
+ "Binding": "PermissionTypes.ViewChecklistResults",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewChecklistResults",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewChecklistResults",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageWorkOrders",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageWorkOrders",
+ "HelpKey": "PermissionHelp.ManageWorkOrders",
+ "Binding": "PermissionTypes.ManageWorkOrders",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageWorkOrders",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageWorkOrders",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewAllWorkOrders",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewAllWorkOrders",
+ "HelpKey": "PermissionHelp.ViewAllWorkOrders",
+ "Binding": "PermissionTypes.ViewAllWorkOrders",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewAllWorkOrders",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewAllWorkOrders",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.TransferInventory",
+ "AreaId": "security",
+ "LabelKey": "Permission.TransferInventory",
+ "HelpKey": "PermissionHelp.TransferInventory",
+ "Binding": "PermissionTypes.TransferInventory",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.TransferInventory",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.TransferInventory",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.IssueInventory",
+ "AreaId": "security",
+ "LabelKey": "Permission.IssueInventory",
+ "HelpKey": "PermissionHelp.IssueInventory",
+ "Binding": "PermissionTypes.IssueInventory",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.IssueInventory",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.IssueInventory",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageControlledSubstances",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageControlledSubstances",
+ "HelpKey": "PermissionHelp.ManageControlledSubstances",
+ "Binding": "PermissionTypes.ManageControlledSubstances",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageControlledSubstances",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageControlledSubstances",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageInvoicing",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageInvoicing",
+ "HelpKey": "PermissionHelp.ManageInvoicing",
+ "Binding": "PermissionTypes.ManageInvoicing",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageInvoicing",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageInvoicing",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewInvoicing",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewInvoicing",
+ "HelpKey": "PermissionHelp.ViewInvoicing",
+ "Binding": "PermissionTypes.ViewInvoicing",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewInvoicing",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewInvoicing",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageCertifications",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageCertifications",
+ "HelpKey": "PermissionHelp.ManageCertifications",
+ "Binding": "PermissionTypes.ManageCertifications",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageCertifications",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageCertifications",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewCertifications",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewCertifications",
+ "HelpKey": "PermissionHelp.ViewCertifications",
+ "Binding": "PermissionTypes.ViewCertifications",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewCertifications",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewCertifications",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageCertificationSetup",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageCertificationSetup",
+ "HelpKey": "PermissionHelp.ManageCertificationSetup",
+ "Binding": "PermissionTypes.ManageCertificationSetup",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageCertificationSetup",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageCertificationSetup",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageBids",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageBids",
+ "HelpKey": "PermissionHelp.ManageBids",
+ "Binding": "PermissionTypes.ManageBids",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageBids",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageBids",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageContracts",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageContracts",
+ "HelpKey": "PermissionHelp.ManageContracts",
+ "Binding": "PermissionTypes.ManageContracts",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageContracts",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageContracts",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageDeployments",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageDeployments",
+ "HelpKey": "PermissionHelp.ManageDeployments",
+ "Binding": "PermissionTypes.ManageDeployments",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageDeployments",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageDeployments",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ApproveTimeReports",
+ "AreaId": "security",
+ "LabelKey": "Permission.ApproveTimeReports",
+ "HelpKey": "PermissionHelp.ApproveTimeReports",
+ "Binding": "PermissionTypes.ApproveTimeReports",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ApproveTimeReports",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ApproveTimeReports",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageMutualAidReimbursement",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageMutualAidReimbursement",
+ "HelpKey": "PermissionHelp.ManageMutualAidReimbursement",
+ "Binding": "PermissionTypes.ManageMutualAidReimbursement",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageMutualAidReimbursement",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageMutualAidReimbursement",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewInternalCosts",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewInternalCosts",
+ "HelpKey": "PermissionHelp.ViewInternalCosts",
+ "Binding": "PermissionTypes.ViewInternalCosts",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewInternalCosts",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewInternalCosts",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageWorkforceCompensation",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManageWorkforceCompensation",
+ "HelpKey": "PermissionHelp.ManageWorkforceCompensation",
+ "Binding": "PermissionTypes.ManageWorkforceCompensation",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManageWorkforceCompensation",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManageWorkforceCompensation",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewWorkforceCompensation",
+ "AreaId": "security",
+ "LabelKey": "Permission.ViewWorkforceCompensation",
+ "HelpKey": "PermissionHelp.ViewWorkforceCompensation",
+ "Binding": "PermissionTypes.ViewWorkforceCompensation",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ViewWorkforceCompensation",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ViewWorkforceCompensation",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManagePayDataReporting",
+ "AreaId": "security",
+ "LabelKey": "Permission.ManagePayDataReporting",
+ "HelpKey": "PermissionHelp.ManagePayDataReporting",
+ "Binding": "PermissionTypes.ManagePayDataReporting",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ManagePayDataReporting",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ManagePayDataReporting",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "permission.ExportPayDataReporting",
+ "AreaId": "security",
+ "LabelKey": "Permission.ExportPayDataReporting",
+ "HelpKey": "PermissionHelp.ExportPayDataReporting",
+ "Binding": "PermissionTypes.ExportPayDataReporting",
+ "ValueType": "permission",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "High",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.PermissionTiming",
+ "ReversibilityKey": "Impact.PermissionReversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "permission.ExportPayDataReporting",
+ "DefaultValue": "Awaiting consumer review; do not infer access from an absent row",
+ "AllowedValues": "Use the choices validated by the owning Security screen",
+ "EvidenceSource": "Permission inventory; runtime consumer review pending",
+ "Availability": "review-required",
+ "ReviewGap": "Review no-row default, action values, role/group scope, dependent grants, source screens and web/API/mobile enforcement for PermissionTypes.ExportPayDataReporting",
+ "ReviewGapExpiresOn": "2026-10-08T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.Name",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.Name",
+ "HelpKey": "TableHelp.Department.Name",
+ "Binding": "Department.Name",
+ "ValueType": "text",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Profile",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.Name",
+ "DefaultValue": "required",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.DepartmentType",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.DepartmentType",
+ "HelpKey": "TableHelp.Department.DepartmentType",
+ "Binding": "Department.DepartmentType",
+ "ValueType": "text",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Profile",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.DepartmentType",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.TimeZone",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.TimeZone",
+ "HelpKey": "TableHelp.Department.TimeZone",
+ "Binding": "Department.TimeZone",
+ "ValueType": "timezone",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.TimeZone",
+ "DefaultValue": "owning setup default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.Use24HourTime",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.Use24HourTime",
+ "HelpKey": "TableHelp.Department.Use24HourTime",
+ "Binding": "Department.Use24HourTime",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.Use24HourTime",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.ManagingUserId",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.ManagingUserId",
+ "HelpKey": "TableHelp.Department.ManagingUserId",
+ "Binding": "Department.ManagingUserId",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.ManagingUserId",
+ "DefaultValue": "required",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.Code",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.Code",
+ "HelpKey": "TableHelp.Department.Code",
+ "Binding": "Department.Code",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.Code",
+ "DefaultValue": "owning setup default",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.ApiKey",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.ApiKey",
+ "HelpKey": "TableHelp.Department.ApiKey",
+ "Binding": "Department.ApiKey",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.ApiKey",
+ "DefaultValue": "generated",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.PublicApiKey",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.PublicApiKey",
+ "HelpKey": "TableHelp.Department.PublicApiKey",
+ "Binding": "Department.PublicApiKey",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.PublicApiKey",
+ "DefaultValue": "generated",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.SharedSecret",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.SharedSecret",
+ "HelpKey": "TableHelp.Department.SharedSecret",
+ "Binding": "Department.SharedSecret",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.SharedSecret",
+ "DefaultValue": "generated",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.LinkCode",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.LinkCode",
+ "HelpKey": "TableHelp.Department.LinkCode",
+ "Binding": "Department.LinkCode",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.LinkCode",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.Department.ShowWelcome",
+ "AreaId": "security",
+ "LabelKey": "TableField.Department.ShowWelcome",
+ "HelpKey": "TableHelp.Department.ShowWelcome",
+ "Binding": "Department.ShowWelcome",
+ "ValueType": "server-metadata",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.Department.ShowWelcome",
+ "DefaultValue": "legacy",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "Department",
+ "Availability": "read-only"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.RequireMfa",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.RequireMfa",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.RequireMfa",
+ "Binding": "DepartmentSecurityPolicy.RequireMfa",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "RequireMfa"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.RequireMfa",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.RequireSso",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.RequireSso",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.RequireSso",
+ "Binding": "DepartmentSecurityPolicy.RequireSso",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "RequireSso"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.RequireSso",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.SessionTimeoutMinutes",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.SessionTimeoutMinutes",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.SessionTimeoutMinutes",
+ "Binding": "DepartmentSecurityPolicy.SessionTimeoutMinutes",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "SessionTimeoutMinutes"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.SessionTimeoutMinutes",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "Binding": "DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "MaxConcurrentSessions"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.AllowedIpRanges",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.AllowedIpRanges",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.AllowedIpRanges",
+ "Binding": "DepartmentSecurityPolicy.AllowedIpRanges",
+ "ValueType": "restricted-list",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "AllowedIpRanges"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.AllowedIpRanges",
+ "DefaultValue": "empty",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.PasswordExpirationDays",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.PasswordExpirationDays",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.PasswordExpirationDays",
+ "Binding": "DepartmentSecurityPolicy.PasswordExpirationDays",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "PasswordExpirationDays"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.PasswordExpirationDays",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.MinPasswordLength",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.MinPasswordLength",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.MinPasswordLength",
+ "Binding": "DepartmentSecurityPolicy.MinPasswordLength",
+ "ValueType": "integer",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "MinPasswordLength"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.MinPasswordLength",
+ "DefaultValue": "editor minimum 8",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "Binding": "DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.DataClassificationLevel",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSecurityPolicy.DataClassificationLevel",
+ "HelpKey": "TableHelp.DepartmentSecurityPolicy.DataClassificationLevel",
+ "Binding": "DepartmentSecurityPolicy.DataClassificationLevel",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy",
+ "Field": "DataClassificationLevel"
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSecurityPolicy.DataClassificationLevel",
+ "DefaultValue": "0",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSecurityPolicy",
+ "Availability": "available"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.SsoProviderType",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.SsoProviderType",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.SsoProviderType",
+ "Binding": "DepartmentSsoConfig.SsoProviderType",
+ "ValueType": "enum",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.SsoProviderType",
+ "DefaultValue": "required",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.IsEnabled",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.IsEnabled",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.IsEnabled",
+ "Binding": "DepartmentSsoConfig.IsEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.IsEnabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.ClientId",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.ClientId",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.ClientId",
+ "Binding": "DepartmentSsoConfig.ClientId",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.ClientId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedClientSecret",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.EncryptedClientSecret",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.EncryptedClientSecret",
+ "Binding": "DepartmentSsoConfig.EncryptedClientSecret",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.EncryptedClientSecret",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.Authority",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.Authority",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.Authority",
+ "Binding": "DepartmentSsoConfig.Authority",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.Authority",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.MetadataUrl",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.MetadataUrl",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.MetadataUrl",
+ "Binding": "DepartmentSsoConfig.MetadataUrl",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.MetadataUrl",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EntityId",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.EntityId",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.EntityId",
+ "Binding": "DepartmentSsoConfig.EntityId",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.EntityId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "Binding": "DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "ValueType": "restricted",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedIdpCertificate",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.EncryptedIdpCertificate",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.EncryptedIdpCertificate",
+ "Binding": "DepartmentSsoConfig.EncryptedIdpCertificate",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.EncryptedIdpCertificate",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedSigningCertificate",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.EncryptedSigningCertificate",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.EncryptedSigningCertificate",
+ "Binding": "DepartmentSsoConfig.EncryptedSigningCertificate",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.EncryptedSigningCertificate",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AttributeMappingJson",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.AttributeMappingJson",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.AttributeMappingJson",
+ "Binding": "DepartmentSsoConfig.AttributeMappingJson",
+ "ValueType": "structured",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.AttributeMappingJson",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AllowLocalLogin",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.AllowLocalLogin",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.AllowLocalLogin",
+ "Binding": "DepartmentSsoConfig.AllowLocalLogin",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.AllowLocalLogin",
+ "DefaultValue": "true",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AutoProvisionUsers",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.AutoProvisionUsers",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.AutoProvisionUsers",
+ "Binding": "DepartmentSsoConfig.AutoProvisionUsers",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.AutoProvisionUsers",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.DefaultRankId",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.DefaultRankId",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.DefaultRankId",
+ "Binding": "DepartmentSsoConfig.DefaultRankId",
+ "ValueType": "reference",
+ "Classification": "Restricted",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.DefaultRankId",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.ScimEnabled",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.ScimEnabled",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.ScimEnabled",
+ "Binding": "DepartmentSsoConfig.ScimEnabled",
+ "ValueType": "boolean",
+ "Classification": "Internal",
+ "Secret": false,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.ScimEnabled",
+ "DefaultValue": "false",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedScimBearerToken",
+ "AreaId": "security",
+ "LabelKey": "TableField.DepartmentSsoConfig.EncryptedScimBearerToken",
+ "HelpKey": "TableHelp.DepartmentSsoConfig.EncryptedScimBearerToken",
+ "Binding": "DepartmentSsoConfig.EncryptedScimBearerToken",
+ "ValueType": "secret",
+ "Classification": "Restricted",
+ "Secret": true,
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso",
+ "Field": null
+ },
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z",
+ "Impact": {
+ "Risk": "Critical",
+ "AudienceKey": "Impact.Audience",
+ "OperationKey": "Area.security",
+ "TimingKey": "Impact.Timing",
+ "ReversibilityKey": "Impact.Reversal",
+ "VerificationKey": "Impact.Verify"
+ },
+ "Requires": [],
+ "Affects": [],
+ "Conflicts": [],
+ "DocumentationId": "table.DepartmentSsoConfig.EncryptedScimBearerToken",
+ "DefaultValue": "unset",
+ "AllowedValues": "Validated by the owning workflow; row IDs, credentials and configuration changes are never accepted by the reference catalog.",
+ "EvidenceSource": "DepartmentSsoConfig",
+ "Availability": "reference-only"
+ }
+ ],
+ "Capabilities": [
+ {
+ "Id": "two-factor",
+ "AreaId": "security",
+ "LabelKey": "Feature.two-factor",
+ "PurposeKey": "FeaturePurpose.two-factor",
+ "ValueKey": "AreaValue.security",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.two-factor",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "TwoFactor",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "invites",
+ "AreaId": "security",
+ "LabelKey": "Feature.invites",
+ "PurposeKey": "FeaturePurpose.invites",
+ "ValueKey": "AreaValue.security",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.invites",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "Invites"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "department-settings",
+ "AreaId": "security",
+ "LabelKey": "Feature.department-settings",
+ "PurposeKey": "FeaturePurpose.department-settings",
+ "ValueKey": "AreaValue.security",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.department-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "Settings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "field.DepartmentSuppressStaffingInfo.EnableSupressStaffing",
+ "field.DepartmentSuppressStaffingInfo.StaffingLevelsToSupress",
+ "field.PersonnelListStatusOrder.StatusId",
+ "field.PersonnelListStatusOrder.Weight",
+ "field.PersonnelListStatusOrderSetting.Orders",
+ "setting.BigBoardHideUnavailable",
+ "setting.BigBoardMapCenterAddress",
+ "setting.BigBoardMapCenterGpsCoordinates",
+ "setting.BigBoardMapZoomLevel",
+ "setting.BigBoardPageRefresh",
+ "setting.CallsSortOrder",
+ "setting.DisabledAutoAvailable",
+ "setting.EnableModernNotifications",
+ "setting.ForceChatbotSecurityPin",
+ "setting.PersonnelListStatusSortOrder",
+ "setting.PersonnelSortOrder",
+ "setting.RequirePasswordResetViaEmail",
+ "setting.StaffingSuppressStaffingLevels",
+ "setting.TestEnabled",
+ "setting.UnitsSortOrder",
+ "setting.UpdateTimestamp",
+ "table.Department.ApiKey",
+ "table.Department.Code",
+ "table.Department.LinkCode",
+ "table.Department.ManagingUserId",
+ "table.Department.PublicApiKey",
+ "table.Department.SharedSecret",
+ "table.Department.ShowWelcome",
+ "table.Department.TimeZone",
+ "table.Department.Use24HourTime"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "call-settings",
+ "AreaId": "security",
+ "LabelKey": "Feature.call-settings",
+ "PurposeKey": "FeaturePurpose.call-settings",
+ "ValueKey": "AreaValue.security",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.call-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "CallSettings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "setting.InternalDispatchEmail",
+ "setting.RssFeedKeyForActiveCalls",
+ "table.DepartmentCallEmail.ErrorMessage",
+ "table.DepartmentCallEmail.FormatType",
+ "table.DepartmentCallEmail.Hostname",
+ "table.DepartmentCallEmail.IsFailure",
+ "table.DepartmentCallEmail.LastCheck",
+ "table.DepartmentCallEmail.Password",
+ "table.DepartmentCallEmail.Port",
+ "table.DepartmentCallEmail.UseSsl",
+ "table.DepartmentCallEmail.Username"
+ ],
+ "RuleIds": [
+ "email-import-failures",
+ "import-heartbeat"
+ ]
+ },
+ {
+ "Id": "dispatch-settings",
+ "AreaId": "security",
+ "LabelKey": "Feature.dispatch-settings",
+ "PurposeKey": "FeaturePurpose.dispatch-settings",
+ "ValueKey": "AreaValue.security",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.dispatch-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "DispatchSettings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "field.DispatchRecommendationConfig.EtaShortlistSize",
+ "field.DispatchRecommendationConfig.IncludeStaleLocations",
+ "field.DispatchRecommendationConfig.MaxLocationAgeSeconds",
+ "field.DispatchRecommendationConfig.MaxRadiusMeters",
+ "field.DispatchRecommendationConfig.MoveUpRecommendationsEnabled",
+ "field.DispatchRecommendationConfig.PersonnelMaxLocationAgeSeconds",
+ "field.DispatchRecommendationConfig.RestPeriodMinutes",
+ "field.DispatchRecommendationConfig.UnitMinimumStaffingLevel",
+ "field.DispatchRecommendationConfig.UseRoutedEta",
+ "field.GroupDispatchScopeConfig.DepartmentWideRoleIds",
+ "field.GroupDispatchScopeConfig.Enabled",
+ "field.NewCallFieldPolicy.Rules",
+ "field.NewCallFieldRule.Key",
+ "field.NewCallFieldRule.Required",
+ "field.NewCallFieldRule.Visible",
+ "field.UnitTypeCallStatusOverride.DispatchStatus",
+ "field.UnitTypeCallStatusOverride.ReleaseStatus",
+ "field.UnitTypeCallStatusOverride.UnitTypeId",
+ "field.UnitTypeCallStatusOverrideSetting.Overrides",
+ "setting.AutoSetStatusForShiftDispatchPersonnel",
+ "setting.CheckInTimersAutoEnableForNewCalls",
+ "setting.DispatchRecommendationAutoDispatch",
+ "setting.DispatchRecommendationConfig",
+ "setting.DispatchRecommendationMode",
+ "setting.DispatchShiftInsteadOfGroup",
+ "setting.GroupDispatchScopeConfig",
+ "setting.NewCallFieldPolicy",
+ "setting.PersonnelOnUnitSetUnitStatus",
+ "setting.ShiftCallDispatchPersonnelStatusToSet",
+ "setting.ShiftCallReleasePersonnelStatusToSet",
+ "setting.UnitCallDispatchStatusToSet",
+ "setting.UnitCallReleaseStatusToSet",
+ "setting.UnitCallStatusOverridesByUnitType",
+ "setting.UnitDispatchAlsoDispatchToAssignedPersonnel",
+ "setting.UnitDispatchAlsoDispatchToGroup"
+ ],
+ "RuleIds": [
+ "checkin-timers",
+ "shift-auto-without-dispatch",
+ "shift-coverage"
+ ]
+ },
+ {
+ "Id": "data-protection",
+ "AreaId": "security",
+ "LabelKey": "Feature.data-protection",
+ "PurposeKey": "FeaturePurpose.data-protection",
+ "ValueKey": "AreaValue.security",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.data-protection",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "DataProtection",
+ "Action": "Index"
+ },
+ "Requirements": [
+ {
+ "Kind": "addon",
+ "Id": "ADP"
+ }
+ ],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "module-settings",
+ "AreaId": "security",
+ "LabelKey": "Feature.module-settings",
+ "PurposeKey": "FeaturePurpose.module-settings",
+ "ValueKey": "FeatureValue.module-settings",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.module-settings",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "ModuleSettings"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "module.BusinessOperationsDisabled",
+ "module.CalendarDisabled",
+ "module.CalendarNameOverride",
+ "module.ChecklistsDisabled",
+ "module.DocumentsDisabled",
+ "module.DocumentsNameOverride",
+ "module.InventoryDisabled",
+ "module.InventoryNameOverride",
+ "module.LogsDisabled",
+ "module.LogsNameOverride",
+ "module.MaintenanceDisabled",
+ "module.MaintenanceNameOverride",
+ "module.MappingDisabled",
+ "module.MappingNameOverride",
+ "module.MessagingDisabled",
+ "module.MessagingNameOverride",
+ "module.NotesDisabled",
+ "module.NotesNameOverride",
+ "module.ReportsDisabled",
+ "module.ReportsNameOverride",
+ "module.ShiftsDisabled",
+ "module.ShiftsNameOverride",
+ "module.TrainingDisabled",
+ "module.TrainingNameOverride",
+ "setting.ModuleSettings"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "permissions",
+ "AreaId": "security",
+ "LabelKey": "Feature.permissions",
+ "PurposeKey": "FeaturePurpose.permissions",
+ "ValueKey": "FeatureValue.permissions",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.permissions",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "permission.AddCallData",
+ "permission.AddPersonnel",
+ "permission.AdjustInventory",
+ "permission.AmendRecords",
+ "permission.ApproveRecords",
+ "permission.ApproveTimeReports",
+ "permission.BreakGlassProtectedData",
+ "permission.CanSeePersonnelLocations",
+ "permission.CanSeeUnitLocations",
+ "permission.CloseCall",
+ "permission.CommandAppLogin",
+ "permission.ConfigureProtectedDataEgress",
+ "permission.ContactDelete",
+ "permission.ContactEdit",
+ "permission.ContactView",
+ "permission.CreateCalendarEntry",
+ "permission.CreateCall",
+ "permission.CreateDocument",
+ "permission.CreateLog",
+ "permission.CreateMessage",
+ "permission.CreateNote",
+ "permission.CreateRecord",
+ "permission.CreateShift",
+ "permission.CreateTraining",
+ "permission.CreateWorkflow",
+ "permission.DeleteCall",
+ "permission.DeleteLog",
+ "permission.DeleteRecord",
+ "permission.DispatchAppLogin",
+ "permission.EditProtectedCallData",
+ "permission.ExportPayDataReporting",
+ "permission.ExportProtectedData",
+ "permission.ExportRecords",
+ "permission.FinalizeRecords",
+ "permission.IssueInventory",
+ "permission.ManageBids",
+ "permission.ManageCertificationSetup",
+ "permission.ManageCertifications",
+ "permission.ManageChecklists",
+ "permission.ManageContracts",
+ "permission.ManageControlledSubstances",
+ "permission.ManageDepartmentDataProtection",
+ "permission.ManageDeployments",
+ "permission.ManageInvoicing",
+ "permission.ManageMutualAidReimbursement",
+ "permission.ManagePayDataReporting",
+ "permission.ManageRecordDefinitions",
+ "permission.ManageRecordDisclosures",
+ "permission.ManageRecordLegalHold",
+ "permission.ManageRecordReports",
+ "permission.ManageRoutes",
+ "permission.ManageWorkOrders",
+ "permission.ManageWorkflowCredentials",
+ "permission.ManageWorkforceCompensation",
+ "permission.PublishRecordDefinitions",
+ "permission.ReassignRecordDrafts",
+ "permission.RecordsPreventionAdmin",
+ "permission.RemovePersonnel",
+ "permission.ReviewRecords",
+ "permission.ShareRecordsExternally",
+ "permission.SubmitRecords",
+ "permission.TransferInventory",
+ "permission.UseCalendarSync",
+ "permission.ViewAllWorkOrders",
+ "permission.ViewCertifications",
+ "permission.ViewChecklistResults",
+ "permission.ViewGroupRecords",
+ "permission.ViewGroupUnits",
+ "permission.ViewGroupUsers",
+ "permission.ViewInternalCosts",
+ "permission.ViewInvoicing",
+ "permission.ViewLegacyRecords",
+ "permission.ViewPersonalInfo",
+ "permission.ViewProtectedCallData",
+ "permission.ViewProtectedContactData",
+ "permission.ViewProtectedOperationalData",
+ "permission.ViewProtectedPersonnelData",
+ "permission.ViewRestrictedRecords",
+ "permission.ViewUdfFields",
+ "permission.ViewWorkflowRuns",
+ "permission.ViewWorkforceCompensation",
+ "setting.Require2FAForAdmins"
+ ],
+ "RuleIds": [
+ "admin-enrollment",
+ "admin-mfa",
+ "admin-succession",
+ "password-recovery"
+ ]
+ },
+ {
+ "Id": "sso",
+ "AreaId": "security",
+ "LabelKey": "Feature.sso",
+ "PurposeKey": "FeaturePurpose.sso",
+ "ValueKey": "FeatureValue.sso",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.sso",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Security",
+ "Action": "Sso"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "table.DepartmentSsoConfig.AllowLocalLogin",
+ "table.DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "table.DepartmentSsoConfig.AttributeMappingJson",
+ "table.DepartmentSsoConfig.Authority",
+ "table.DepartmentSsoConfig.AutoProvisionUsers",
+ "table.DepartmentSsoConfig.ClientId",
+ "table.DepartmentSsoConfig.DefaultRankId",
+ "table.DepartmentSsoConfig.EncryptedClientSecret",
+ "table.DepartmentSsoConfig.EncryptedIdpCertificate",
+ "table.DepartmentSsoConfig.EncryptedScimBearerToken",
+ "table.DepartmentSsoConfig.EncryptedSigningCertificate",
+ "table.DepartmentSsoConfig.EntityId",
+ "table.DepartmentSsoConfig.IsEnabled",
+ "table.DepartmentSsoConfig.MetadataUrl",
+ "table.DepartmentSsoConfig.ScimEnabled",
+ "table.DepartmentSsoConfig.SsoProviderType"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "security-policy",
+ "AreaId": "security",
+ "LabelKey": "Feature.security-policy",
+ "PurposeKey": "FeaturePurpose.security-policy",
+ "ValueKey": "FeatureValue.security-policy",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.security-policy",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Security",
+ "Action": "SecurityPolicy"
+ },
+ "Requirements": [],
+ "SettingIds": [
+ "table.DepartmentSecurityPolicy.AllowedIpRanges",
+ "table.DepartmentSecurityPolicy.DataClassificationLevel",
+ "table.DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "table.DepartmentSecurityPolicy.MinPasswordLength",
+ "table.DepartmentSecurityPolicy.PasswordExpirationDays",
+ "table.DepartmentSecurityPolicy.RequireMfa",
+ "table.DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "table.DepartmentSecurityPolicy.RequireSso",
+ "table.DepartmentSecurityPolicy.SessionTimeoutMinutes"
+ ],
+ "RuleIds": []
+ },
+ {
+ "Id": "audit-history",
+ "AreaId": "security",
+ "LabelKey": "Feature.audit-history",
+ "PurposeKey": "FeaturePurpose.audit-history",
+ "ValueKey": "FeatureValue.audit-history",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.audit-history",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Security",
+ "Action": "Audits"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "account-sessions",
+ "AreaId": "security",
+ "LabelKey": "Feature.account-sessions",
+ "PurposeKey": "FeaturePurpose.account-sessions",
+ "ValueKey": "FeatureValue.account-sessions",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.account-sessions",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "AccountSecurity",
+ "Action": "Sessions"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ },
+ {
+ "Id": "setup-help",
+ "AreaId": "security",
+ "LabelKey": "Feature.setup-help",
+ "PurposeKey": "FeaturePurpose.setup-help",
+ "ValueKey": "FeatureValue.setup-help",
+ "ExampleKey": "AreaExample.security",
+ "AdoptionKey": "FeatureAdoption.setup-help",
+ "ReleaseStatus": "available",
+ "Location": {
+ "Controller": "Department",
+ "Action": "SetupWizard"
+ },
+ "Requirements": [],
+ "SettingIds": [],
+ "RuleIds": []
+ }
+ ],
+ "Rules": [
+ {
+ "Id": "admin-mfa",
+ "AreaId": "security",
+ "Severity": "Critical",
+ "TitleKey": "Rule.admin-mfa",
+ "ExplanationKey": "RuleWhy.admin-mfa",
+ "NextActionKey": "RuleNext.admin-mfa",
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "Require2FAForAdmins",
+ "Comparison": "Equal",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "admin-enrollment",
+ "AreaId": "security",
+ "Severity": "Critical",
+ "TitleKey": "Rule.admin-enrollment",
+ "ExplanationKey": "RuleWhy.admin-enrollment",
+ "NextActionKey": "RuleNext.admin-enrollment",
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "adminsWithoutMfa",
+ "Comparison": "Greater",
+ "Number": 0
+ }
+ ]
+ },
+ {
+ "Id": "admin-succession",
+ "AreaId": "security",
+ "Severity": "Warning",
+ "TitleKey": "Rule.admin-succession",
+ "ExplanationKey": "RuleWhy.admin-succession",
+ "NextActionKey": "RuleNext.admin-succession",
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "activeAdminCount",
+ "Comparison": "Less",
+ "Number": 2
+ }
+ ]
+ },
+ {
+ "Id": "password-recovery",
+ "AreaId": "security",
+ "Severity": "Warning",
+ "TitleKey": "Rule.password-recovery",
+ "ExplanationKey": "RuleWhy.password-recovery",
+ "NextActionKey": "RuleNext.password-recovery",
+ "Location": {
+ "Controller": "Security",
+ "Action": "Index"
+ },
+ "AppliesWhen": [],
+ "FailsWhen": [
+ {
+ "EvidenceId": "RequirePasswordResetViaEmail",
+ "Comparison": "IsFalse",
+ "Number": null
+ }
+ ]
+ }
+ ],
+ "Packs": [],
+ "Articles": [
+ {
+ "Id": "setting.TestEnabled",
+ "Locale": "en",
+ "TitleKey": "Setting.TestEnabled",
+ "Body": "Test Enabled. Department testing behavior. Do not treat enabling a test setting as proof of production readiness.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-testenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.UpdateTimestamp",
+ "Locale": "en",
+ "TitleKey": "Setting.UpdateTimestamp",
+ "Body": "Update Timestamp. Internal configuration timestamp. Read-only metadata, not an administrator-editable preference.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-updatetimestamp",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.ModuleSettings",
+ "Locale": "en",
+ "TitleKey": "Setting.ModuleSettings",
+ "Body": "Module Settings. Controls module navigation and supported feature gates. Hiding a module does not delete its records or prove independent dispatch settings are disabled.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-modulesettings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.Require2FAForAdmins",
+ "Locale": "en",
+ "TitleKey": "Setting.Require2FAForAdmins",
+ "Body": "Require2 FAFor Admins. Administrator MFA requirement mode. Verify actual factors and recovery for each administrator before enforcement changes.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-require2faforadmins",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.ForceChatbotSecurityPin",
+ "Locale": "en",
+ "TitleKey": "Setting.ForceChatbotSecurityPin",
+ "Body": "Force Chatbot Security Pin. Require the member security PIN for sensitive supported chatbot and SMS actions, including members who have not opted in.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-forcechatbotsecuritypin",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.RequirePasswordResetViaEmail",
+ "Locale": "en",
+ "TitleKey": "Setting.RequirePasswordResetViaEmail",
+ "Body": "Require Password Reset Via Email. Use single-use recovery links for administrator-initiated member password resets, instead of selecting a replacement password.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-requirepasswordresetviaemail",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setting.DepartmentOperatingProfile",
+ "Locale": "en",
+ "TitleKey": "Setting.DepartmentOperatingProfile",
+ "Body": "Department Operating Profile. Declared organization, workforce, dispatch, seasonal, language and policy context. Recommendations never infer licenses or clinical scope from this profile.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setting-departmentoperatingprofile",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.Archetypes",
+ "Locale": "en",
+ "TitleKey": "ProfileField.Archetypes",
+ "Body": "Operating sectors. Choose all sectors served by the department. A pack suggests administrative reviews; it does not establish qualification or clinical scope.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-archetypes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.WorkforceMix",
+ "Locale": "en",
+ "TitleKey": "ProfileField.WorkforceMix",
+ "Body": "Workforce mix. Describe the workforce so setup guidance can reflect career, volunteer, contract or combined operations.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-workforcemix",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.DeclaredMemberCount",
+ "Locale": "en",
+ "TitleKey": "ProfileField.DeclaredMemberCount",
+ "Body": "Declared member count. Optional planning estimate; actual membership and subscription counts come from their owning sources.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-declaredmembercount",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.AuthoritativeSystemReferences",
+ "Locale": "en",
+ "TitleKey": "ProfileField.AuthoritativeSystemReferences",
+ "Body": "Authoritative system references. Short declared source-system labels. Saving this list does not verify a connection, an import or the freshness of external data.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-authoritativesystemreferences",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.DispatchModel",
+ "Locale": "en",
+ "TitleKey": "ProfileField.DispatchModel",
+ "Body": "Dispatch model. Record whether dispatch is central, self-directed, external or a combination. Verify each routing path through its owning settings.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-dispatchmodel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.OperatingHours",
+ "Locale": "en",
+ "TitleKey": "ProfileField.OperatingHours",
+ "Body": "Operating hours. Describe continuous, scheduled, on-call or seasonal operation. This is context and does not create shifts or guarantee coverage.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-operatinghours",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.SiteGroupReferences",
+ "Locale": "en",
+ "TitleKey": "ProfileField.SiteGroupReferences",
+ "Body": "Sites and groups. Reference existing numeric group IDs in this department. This does not grant group access or change dispatch scope.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-sitegroupreferences",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.MutualAid",
+ "Locale": "en",
+ "TitleKey": "ProfileField.MutualAid",
+ "Body": "Mutual aid participation. Declare whether mutual aid is part of operations. Agreements, access and response eligibility require separate review.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-mutualaid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.LanguageCodes",
+ "Locale": "en",
+ "TitleKey": "ProfileField.LanguageCodes",
+ "Body": "Working languages. Languages used by the team. This preference does not prove interpreter availability or translate operational records.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-languagecodes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.AccessibilityNeeds",
+ "Locale": "en",
+ "TitleKey": "ProfileField.AccessibilityNeeds",
+ "Body": "Accessibility preferences. Record screen-reader, caption, large-text or plain-language needs for setup planning. Verify client behavior with the people who use it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-accessibilityneeds",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.StaffingPolicyReferences",
+ "Locale": "en",
+ "TitleKey": "ProfileField.StaffingPolicyReferences",
+ "Body": "Staffing policy documents. Reference existing department document IDs for approved staffing policies. The save checks existence and expiry, not policy approval or adequacy.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-staffingpolicyreferences",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.QualificationPolicyReferences",
+ "Locale": "en",
+ "TitleKey": "ProfileField.QualificationPolicyReferences",
+ "Body": "Qualification policy documents. Reference existing department document IDs for approved qualification policies. Do not infer a license, scope of practice or deployment qualification from a role label.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-qualificationpolicyreferences",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.ContinuityProcedureReferences",
+ "Locale": "en",
+ "TitleKey": "ProfileField.ContinuityProcedureReferences",
+ "Body": "Continuity procedure documents. Reference existing department document IDs for approved continuity procedures. Test fallback communications and ownership through the approved procedure.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-continuityprocedurereferences",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.SeasonStartMonthDay",
+ "Locale": "en",
+ "TitleKey": "ProfileField.SeasonStartMonthDay",
+ "Body": "Season start. Start of a declared seasonal period, in MM-DD format. Provide both start and end; this does not enable or disable resources on those dates.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-seasonstartmonthday",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.SeasonEndMonthDay",
+ "Locale": "en",
+ "TitleKey": "ProfileField.SeasonEndMonthDay",
+ "Body": "Season end. End of a declared seasonal period, in MM-DD format. A period can cross a calendar year; verify actual rosters separately.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-seasonendmonthday",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.ReviewedOnUtc",
+ "Locale": "en",
+ "TitleKey": "ProfileField.ReviewedOnUtc",
+ "Body": "Profile review time. Server-recorded time of the most recent validated profile save; it does not certify operational readiness.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-reviewedonutc",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.Revision",
+ "Locale": "en",
+ "TitleKey": "ProfileField.Revision",
+ "Body": "Profile revision. Server revision used to reject concurrent overwrites. Reload when another administrator has saved a newer profile.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-revision",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "profile.ExpectedEmailPollIntervalMinutes",
+ "Locale": "en",
+ "TitleKey": "ProfileField.ExpectedEmailPollIntervalMinutes",
+ "Body": "Expected email polling interval (minutes). Optional maximum time between recorded mailbox polls, from 1 to 10080 minutes. Blank means no declared polling expectation. This checks configured email connectors, not how often calls arrive; it does not measure SMS, CAD push or API health. Review the host polling schedule before setting it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "profile-expectedemailpollintervalminutes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateCall",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateCall",
+ "Body": "Create calls. Allows starting a call. The department-level action uses each member’s actual administrator state and personnel roles; later dispatch validation remains authoritative.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createcall",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateNote",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateNote",
+ "Body": "Create notes. Allows creating a department note. The action does not grant access to protected note contents or another department.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createnote",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewPersonalInfo",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewPersonalInfo",
+ "Body": "View personal information. Controls the personal-information permission gate. Protected fields still require their own current authorization and data protection grant.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewpersonalinfo",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewGroupUsers",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewGroupUsers",
+ "Body": "View personnel. Controls visibility of personnel targets. A group lock can narrow target scope; administrators of a target group or its ancestors use the owning visibility policy.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewgroupusers",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewGroupUnits",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewGroupUnits",
+ "Body": "View units. Controls visibility of unit targets and their assigned stations. Ungrouped viewers and unassigned units do not share a group.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewgroupunits",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CanSeePersonnelLocations",
+ "Locale": "en",
+ "TitleKey": "Permission.CanSeePersonnelLocations",
+ "Body": "View personnel locations. Controls the location visibility gate for each viewer and person. The preview counts access pairs, not current map markers, tracking consent or GPS availability.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-canseepersonnellocations",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CanSeeUnitLocations",
+ "Locale": "en",
+ "TitleKey": "Permission.CanSeeUnitLocations",
+ "Body": "View unit locations. Controls the location visibility gate for each viewer and unit. A group lock refers to the unit’s station and the owning group hierarchy, not any station a viewer can otherwise see.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-canseeunitlocations",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.AddPersonnel",
+ "Locale": "en",
+ "TitleKey": "Permission.AddPersonnel",
+ "Body": "Add Personnel. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-addpersonnel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.RemovePersonnel",
+ "Locale": "en",
+ "TitleKey": "Permission.RemovePersonnel",
+ "Body": "Remove Personnel. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-removepersonnel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateTraining",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateTraining",
+ "Body": "Create Training. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createtraining",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateDocument",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateDocument",
+ "Body": "Create Document. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createdocument",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateCalendarEntry",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateCalendarEntry",
+ "Body": "Create Calendar Entry. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createcalendarentry",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateLog",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateLog",
+ "Body": "Create Log. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createlog",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateShift",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateShift",
+ "Body": "Create Shift. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createshift",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.AdjustInventory",
+ "Locale": "en",
+ "TitleKey": "Permission.AdjustInventory",
+ "Body": "Adjust Inventory. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-adjustinventory",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateMessage",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateMessage",
+ "Body": "Create Message. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createmessage",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.DeleteCall",
+ "Locale": "en",
+ "TitleKey": "Permission.DeleteCall",
+ "Body": "Delete Call. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-deletecall",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CloseCall",
+ "Locale": "en",
+ "TitleKey": "Permission.CloseCall",
+ "Body": "Close Call. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-closecall",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.AddCallData",
+ "Locale": "en",
+ "TitleKey": "Permission.AddCallData",
+ "Body": "Add Call Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-addcalldata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ContactEdit",
+ "Locale": "en",
+ "TitleKey": "Permission.ContactEdit",
+ "Body": "Contact Edit. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-contactedit",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ContactView",
+ "Locale": "en",
+ "TitleKey": "Permission.ContactView",
+ "Body": "Contact View. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-contactview",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ContactDelete",
+ "Locale": "en",
+ "TitleKey": "Permission.ContactDelete",
+ "Body": "Contact Delete. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-contactdelete",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateWorkflow",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateWorkflow",
+ "Body": "Create Workflow. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createworkflow",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageWorkflowCredentials",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageWorkflowCredentials",
+ "Body": "Manage Workflow Credentials. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-manageworkflowcredentials",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewWorkflowRuns",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewWorkflowRuns",
+ "Body": "View Workflow Runs. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewworkflowruns",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewUdfFields",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewUdfFields",
+ "Body": "View custom field Fields. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewudffields",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRoutes",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageRoutes",
+ "Body": "Manage Routes. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-manageroutes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.DeleteLog",
+ "Locale": "en",
+ "TitleKey": "Permission.DeleteLog",
+ "Body": "Delete Log. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-deletelog",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.UseCalendarSync",
+ "Locale": "en",
+ "TitleKey": "Permission.UseCalendarSync",
+ "Body": "Use Calendar Sync. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-usecalendarsync",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.DispatchAppLogin",
+ "Locale": "en",
+ "TitleKey": "Permission.DispatchAppLogin",
+ "Body": "Dispatch App Login. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-dispatchapplogin",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CommandAppLogin",
+ "Locale": "en",
+ "TitleKey": "Permission.CommandAppLogin",
+ "Body": "Command App Login. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-commandapplogin",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageDepartmentDataProtection",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageDepartmentDataProtection",
+ "Body": "Manage Department Data Protection. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managedepartmentdataprotection",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedCallData",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewProtectedCallData",
+ "Body": "View Protected Call Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewprotectedcalldata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.EditProtectedCallData",
+ "Locale": "en",
+ "TitleKey": "Permission.EditProtectedCallData",
+ "Body": "Edit Protected Call Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-editprotectedcalldata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedPersonnelData",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewProtectedPersonnelData",
+ "Body": "View Protected Personnel Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewprotectedpersonneldata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedContactData",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewProtectedContactData",
+ "Body": "View Protected Contact Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewprotectedcontactdata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewProtectedOperationalData",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewProtectedOperationalData",
+ "Body": "View Protected Operational Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewprotectedoperationaldata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ExportProtectedData",
+ "Locale": "en",
+ "TitleKey": "Permission.ExportProtectedData",
+ "Body": "Export Protected Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-exportprotecteddata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ConfigureProtectedDataEgress",
+ "Locale": "en",
+ "TitleKey": "Permission.ConfigureProtectedDataEgress",
+ "Body": "Configure Protected Data Egress. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-configureprotecteddataegress",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.BreakGlassProtectedData",
+ "Locale": "en",
+ "TitleKey": "Permission.BreakGlassProtectedData",
+ "Body": "Break Glass Protected Data. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-breakglassprotecteddata",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.CreateRecord",
+ "Locale": "en",
+ "TitleKey": "Permission.CreateRecord",
+ "Body": "Create Record. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-createrecord",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.DeleteRecord",
+ "Locale": "en",
+ "TitleKey": "Permission.DeleteRecord",
+ "Body": "Delete Record. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-deleterecord",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ReviewRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.ReviewRecords",
+ "Body": "Review Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-reviewrecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ApproveRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.ApproveRecords",
+ "Body": "Approve Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-approverecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.FinalizeRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.FinalizeRecords",
+ "Body": "Finalize Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-finalizerecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.AmendRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.AmendRecords",
+ "Body": "Amend Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-amendrecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.SubmitRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.SubmitRecords",
+ "Body": "Submit Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-submitrecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ExportRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.ExportRecords",
+ "Body": "Export Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-exportrecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ShareRecordsExternally",
+ "Locale": "en",
+ "TitleKey": "Permission.ShareRecordsExternally",
+ "Body": "Share Records Externally. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-sharerecordsexternally",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewRestrictedRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewRestrictedRecords",
+ "Body": "View Restricted Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewrestrictedrecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewLegacyRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewLegacyRecords",
+ "Body": "View Legacy Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewlegacyrecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewGroupRecords",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewGroupRecords",
+ "Body": "View Group Records. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewgrouprecords",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordDefinitions",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageRecordDefinitions",
+ "Body": "Manage Record Definitions. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managerecorddefinitions",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.PublishRecordDefinitions",
+ "Locale": "en",
+ "TitleKey": "Permission.PublishRecordDefinitions",
+ "Body": "Publish Record Definitions. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-publishrecorddefinitions",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordReports",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageRecordReports",
+ "Body": "Manage Record Reports. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managerecordreports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordDisclosures",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageRecordDisclosures",
+ "Body": "Manage Record Disclosures. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managerecorddisclosures",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageRecordLegalHold",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageRecordLegalHold",
+ "Body": "Manage Record Legal Hold. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managerecordlegalhold",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ReassignRecordDrafts",
+ "Locale": "en",
+ "TitleKey": "Permission.ReassignRecordDrafts",
+ "Body": "Reassign Record Drafts. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-reassignrecorddrafts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.RecordsPreventionAdmin",
+ "Locale": "en",
+ "TitleKey": "Permission.RecordsPreventionAdmin",
+ "Body": "Records Prevention Admin. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-recordspreventionadmin",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageChecklists",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageChecklists",
+ "Body": "Manage Checklists. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managechecklists",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewChecklistResults",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewChecklistResults",
+ "Body": "View Checklist Results. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewchecklistresults",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageWorkOrders",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageWorkOrders",
+ "Body": "Manage Work Orders. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-manageworkorders",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewAllWorkOrders",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewAllWorkOrders",
+ "Body": "View All Work Orders. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewallworkorders",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.TransferInventory",
+ "Locale": "en",
+ "TitleKey": "Permission.TransferInventory",
+ "Body": "Transfer Inventory. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-transferinventory",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.IssueInventory",
+ "Locale": "en",
+ "TitleKey": "Permission.IssueInventory",
+ "Body": "Issue Inventory. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-issueinventory",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageControlledSubstances",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageControlledSubstances",
+ "Body": "Manage Controlled Substances. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managecontrolledsubstances",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageInvoicing",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageInvoicing",
+ "Body": "Manage Invoicing. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-manageinvoicing",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewInvoicing",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewInvoicing",
+ "Body": "View Invoicing. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewinvoicing",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageCertifications",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageCertifications",
+ "Body": "Manage Certifications. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managecertifications",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewCertifications",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewCertifications",
+ "Body": "View Certifications. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewcertifications",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageCertificationSetup",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageCertificationSetup",
+ "Body": "Manage Certification Setup. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managecertificationsetup",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageBids",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageBids",
+ "Body": "Manage Bids. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managebids",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageContracts",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageContracts",
+ "Body": "Manage Contracts. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managecontracts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageDeployments",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageDeployments",
+ "Body": "Manage Deployments. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managedeployments",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ApproveTimeReports",
+ "Locale": "en",
+ "TitleKey": "Permission.ApproveTimeReports",
+ "Body": "Approve Time Reports. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-approvetimereports",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageMutualAidReimbursement",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageMutualAidReimbursement",
+ "Body": "Manage Mutual Aid Reimbursement. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managemutualaidreimbursement",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewInternalCosts",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewInternalCosts",
+ "Body": "View Internal Costs. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewinternalcosts",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManageWorkforceCompensation",
+ "Locale": "en",
+ "TitleKey": "Permission.ManageWorkforceCompensation",
+ "Body": "Manage Workforce Compensation. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-manageworkforcecompensation",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ViewWorkforceCompensation",
+ "Locale": "en",
+ "TitleKey": "Permission.ViewWorkforceCompensation",
+ "Body": "View Workforce Compensation. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-viewworkforcecompensation",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ManagePayDataReporting",
+ "Locale": "en",
+ "TitleKey": "Permission.ManagePayDataReporting",
+ "Body": "Manage Pay Data Reporting. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-managepaydatareporting",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permission.ExportPayDataReporting",
+ "Locale": "en",
+ "TitleKey": "Permission.ExportPayDataReporting",
+ "Body": "Export Pay Data Reporting. Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permission-exportpaydatareporting",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.Name",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.Name",
+ "Body": "Department / Name. Department display name. Review member-facing labels and documents that snapshot the name; changing it does not rename historical artifacts.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-name",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.DepartmentType",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.DepartmentType",
+ "Body": "Department / Department Type. Legacy organization-type label. The operating profile provides multiple sectors; neither establishes clinical scope or response qualifications.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-departmenttype",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.TimeZone",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.TimeZone",
+ "Body": "Department / Time Zone. Department time zone used by scheduling and local-date reports. Review overnight shifts and daylight-saving transitions before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-timezone",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.Use24HourTime",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.Use24HourTime",
+ "Body": "Department / Use24 Hour Time. Preferred time display. This does not change stored timestamps or the department time zone.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-use24hourtime",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.ManagingUserId",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.ManagingUserId",
+ "Body": "Department / Managing User Id. Managing-member identity. Subscription and high-risk account operations may require this member; change ownership through its explicit owning workflow.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-managinguserid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.Code",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.Code",
+ "Body": "Department / Code. Department code used by supported identification and access flows. Review those consumers before changing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-code",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.ApiKey",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.ApiKey",
+ "Body": "Department / Api Key. Department API credential. Never place it in setup notes or model input; manage and rotate it through the authorized workflow.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-apikey",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.PublicApiKey",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.PublicApiKey",
+ "Body": "Department / Public Api Key. Credential used by supported public API consumers. Public in the field name does not make credential disclosure safe.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-publicapikey",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.SharedSecret",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.SharedSecret",
+ "Body": "Department / Shared Secret. Department integration secret. Rotation can affect integrations and needs coordinated verification.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-sharedsecret",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.LinkCode",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.LinkCode",
+ "Body": "Department / Link Code. Department linking code. Review who can use a link and rotate it using the owning workflow.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-linkcode",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.Department.ShowWelcome",
+ "Locale": "en",
+ "TitleKey": "TableField.Department.ShowWelcome",
+ "Body": "Department / Show Welcome. Legacy welcome flag. Restored setup dismissal is per administrator and does not use this flag as evidence of setup completion.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-department-showwelcome",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.RequireMfa",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.RequireMfa",
+ "Body": "Department Security Policy / Require Mfa. Department-wide MFA policy, distinct from the administrator-only setting. Review enrollment, supported factors and recovery before enforcement.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-requiremfa",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.RequireSso",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.RequireSso",
+ "Body": "Department Security Policy / Require Sso. Requires the supported SSO policy gate. Verify the active identity provider and local recovery arrangements before removing a sign-in path.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-requiresso",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.SessionTimeoutMinutes",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.SessionTimeoutMinutes",
+ "Body": "Department Security Policy / Session Timeout Minutes. Idle timeout in minutes; zero defers to host behavior. Verify policy-managed sessions and each supported client rather than assuming immediate global logout.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-sessiontimeoutminutes",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.MaxConcurrentSessions",
+ "Body": "Department Security Policy / Max Concurrent Sessions. Maximum policy-managed concurrent sessions per user; zero means unlimited for this setting. Existing sessions and enforcement rollout must be checked separately.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-maxconcurrentsessions",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.AllowedIpRanges",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.AllowedIpRanges",
+ "Body": "Department Security Policy / Allowed Ip Ranges. Allowed login network ranges. Empty adds no range restriction. Review legitimate responder networks and recovery access before narrowing it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-allowedipranges",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.PasswordExpirationDays",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.PasswordExpirationDays",
+ "Body": "Department Security Policy / Password Expiration Days. Password age in days; zero disables this policy's age limit. Verify local-password and SSO behavior separately.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-passwordexpirationdays",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.MinPasswordLength",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.MinPasswordLength",
+ "Body": "Department Security Policy / Min Password Length. Minimum length offered by the policy editor. Actual password validators and supported credential-change paths remain authoritative.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-minpasswordlength",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.RequirePasswordComplexity",
+ "Body": "Department Security Policy / Require Password Complexity. Stored complexity preference. Consumer and editor coverage must be verified before relying on this field; it is not proof that an existing password meets a rule.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-requirepasswordcomplexity",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSecurityPolicy.DataClassificationLevel",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSecurityPolicy.DataClassificationLevel",
+ "Body": "Department Security Policy / Data Classification Level. Department classification label. Selecting it does not enroll ADP, establish compliance or automatically classify every record correctly.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentsecuritypolicy-dataclassificationlevel",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.SsoProviderType",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.SsoProviderType",
+ "Body": "Department Sso Config / Sso Provider Type. Selects the identity protocol and provider configuration. OIDC and SAML have different metadata, certificates and callback requirements.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-ssoprovidertype",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.IsEnabled",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.IsEnabled",
+ "Body": "Department Sso Config / Is Enabled. Makes this provider configuration available to the supported SSO flow. A saved enabled flag is not a successful sign-in test.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-isenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.ClientId",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.ClientId",
+ "Body": "Department Sso Config / Client Id. Client registration identifier from the identity provider. Keep tenant and audience registration consistent with the owning SSO flow.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-clientid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedClientSecret",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.EncryptedClientSecret",
+ "Body": "Department Sso Config / Encrypted Client Secret. Encrypted provider client secret. The secret is entered and rotated on the authorized provider editor; Admin Assist only describes its purpose.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-encryptedclientsecret",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.Authority",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.Authority",
+ "Body": "Department Sso Config / Authority. OIDC issuer or authority. Verify the intended tenant, discovery metadata and callback registration before enabling it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-authority",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.MetadataUrl",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.MetadataUrl",
+ "Body": "Department Sso Config / Metadata Url. SAML provider metadata location. Review the trusted provider and its current signing material through the SSO editor.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-metadataurl",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EntityId",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.EntityId",
+ "Body": "Department Sso Config / Entity Id. SAML service-provider identifier registered at the identity provider. It must agree with the configured integration.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-entityid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.AssertionConsumerServiceUrl",
+ "Body": "Department Sso Config / Assertion Consumer Service Url. Stored SAML callback configuration. Use the endpoint supplied by the owning SSO setup and verify the provider registration.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-assertionconsumerserviceurl",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedIdpCertificate",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.EncryptedIdpCertificate",
+ "Body": "Department Sso Config / Encrypted Idp Certificate. Encrypted provider verification certificate material. Review expiry and rotation through SSO; this description is not certificate validation.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-encryptedidpcertificate",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedSigningCertificate",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.EncryptedSigningCertificate",
+ "Body": "Department Sso Config / Encrypted Signing Certificate. Encrypted signing certificate and private-key material. Do not copy it into notes, logs or assistant messages.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-encryptedsigningcertificate",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AttributeMappingJson",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.AttributeMappingJson",
+ "Body": "Department Sso Config / Attribute Mapping Json. Maps provider attributes to supported member fields. Validate identity matching and missing attributes with an approved test account.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-attributemappingjson",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AllowLocalLogin",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.AllowLocalLogin",
+ "Body": "Department Sso Config / Allow Local Login. Allows a local-password path alongside this provider where policy permits. Review the department-wide SSO requirement and recovery plan together.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-allowlocallogin",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.AutoProvisionUsers",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.AutoProvisionUsers",
+ "Body": "Department Sso Config / Auto Provision Users. Allows the supported sign-in flow to create members. Review identity matching, capacity and default assignments before enabling it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-autoprovisionusers",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.DefaultRankId",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.DefaultRankId",
+ "Body": "Department Sso Config / Default Rank Id. Department rank assigned by supported automatic provisioning. It does not grant permissions or prove qualifications.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-defaultrankid",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.ScimEnabled",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.ScimEnabled",
+ "Body": "Department Sso Config / Scim Enabled. Enables supported SCIM provisioning for this configuration. Review identity lifecycle, deactivation and token access separately from interactive sign-in.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-scimenabled",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "table.DepartmentSsoConfig.EncryptedScimBearerToken",
+ "Locale": "en",
+ "TitleKey": "TableField.DepartmentSsoConfig.EncryptedScimBearerToken",
+ "Body": "Department Sso Config / Encrypted Scim Bearer Token. Encrypted credential for inbound SCIM requests. Rotate through the explicit token workflow and update the provider before retiring an old credential.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "table-departmentssoconfig-encryptedscimbearertoken",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "two-factor",
+ "Locale": "en",
+ "TitleKey": "Feature.two-factor",
+ "Body": "Two-Factor Authentication Set up or manage two-factor sign-in Keep administrative access recoverable and limited to authorized people. Verify an additional administrator and review MFA and recovery procedures. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "two-factor",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "invites",
+ "Locale": "en",
+ "TitleKey": "Feature.invites",
+ "Body": "Manage Invites Send email invites so people create their own accounts Keep administrative access recoverable and limited to authorized people. Verify an additional administrator and review MFA and recovery procedures. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "invites",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "department-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.department-settings",
+ "Body": "Department Settings Department profile, address, API keys and module settings Keep administrative access recoverable and limited to authorized people. Verify an additional administrator and review MFA and recovery procedures. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "department-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "call-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.call-settings",
+ "Body": "Call Settings Call types, priorities, email import and dispatch settings Keep administrative access recoverable and limited to authorized people. Verify an additional administrator and review MFA and recovery procedures. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "call-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "dispatch-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.dispatch-settings",
+ "Body": "Dispatch Settings Dispatch behaviour and notification settings Keep administrative access recoverable and limited to authorized people. Verify an additional administrator and review MFA and recovery procedures. Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "dispatch-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "data-protection",
+ "Locale": "en",
+ "TitleKey": "Feature.data-protection",
+ "Body": "Data Protection Advanced Data Protection enrollment and policies Keep administrative access recoverable and limited to authorized people. Verify an additional administrator and review MFA and recovery procedures. Purchase and enrollment are separate. Review MFA, key recovery and effects on search, exports, integrations and notifications before enrollment.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "data-protection",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "module-settings",
+ "Locale": "en",
+ "TitleKey": "Feature.module-settings",
+ "Body": "Module settings Choose which optional modules appear and operate for the department. Reduce navigation clutter while understanding retained data and add-on prerequisites. Verify an additional administrator and review MFA and recovery procedures. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "module-settings",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "permissions",
+ "Locale": "en",
+ "TitleKey": "Feature.permissions",
+ "Body": "Permissions Configure action permissions, roles and supported group restrictions. Review who can perform sensitive work and which resources they may see. Verify an additional administrator and review MFA and recovery procedures. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "permissions",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "sso",
+ "Locale": "en",
+ "TitleKey": "Feature.sso",
+ "Body": "Single sign-on and provisioning Configure supported identity providers and provisioning. Review identity mapping, local fallback and recovery before enforcing SSO. Verify an additional administrator and review MFA and recovery procedures. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "sso",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "security-policy",
+ "Locale": "en",
+ "TitleKey": "Feature.security-policy",
+ "Body": "Security and session policy Configure supported MFA, password, session and network restrictions. Review lockout and recovery risks with an enrolled administrator. Verify an additional administrator and review MFA and recovery procedures. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "security-policy",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "audit-history",
+ "Locale": "en",
+ "TitleKey": "Feature.audit-history",
+ "Body": "Audit history Review recorded administrative changes and available source details. Identify what changed and who should verify the effect. Verify an additional administrator and review MFA and recovery procedures. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "audit-history",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "account-sessions",
+ "Locale": "en",
+ "TitleKey": "Feature.account-sessions",
+ "Body": "Account sessions and recovery Review the current member's sessions and account security controls. Keep personal account recovery distinct from department-wide settings. Verify an additional administrator and review MFA and recovery procedures. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "account-sessions",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ },
+ {
+ "Id": "setup-help",
+ "Locale": "en",
+ "TitleKey": "Feature.setup-help",
+ "Body": "Setup help and support Resume orientation and review current configuration evidence. Keep learning, configuration and verification as separate steps. Verify an additional administrator and review MFA and recovery procedures. Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.",
+ "SourcePath": "docs/admin-assist/settings-reference.md",
+ "Anchor": "setup-help",
+ "PackVersion": "2026.09.24.1",
+ "Owner": "Resgrid.Core",
+ "ReviewedOn": "2026-09-24T00:00:00Z"
+ }
+ ]
+}
diff --git a/Core/Resgrid.AdminAssist/ConfigurationCatalog.cs b/Core/Resgrid.AdminAssist/ConfigurationCatalog.cs
new file mode 100644
index 000000000..7669f9883
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/ConfigurationCatalog.cs
@@ -0,0 +1,125 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.IO;
+using System.Linq;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using System.Text.RegularExpressions;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.AdminAssist
+{
+ ///
+ /// Embedded, versioned YAML 1.2 documents authored in its JSON subset. Restricting the format rejects YAML
+ /// tags, aliases and executable bindings; the catalog is data, never a reflection invocation language.
+ ///
+ public sealed class ConfigurationCatalog : IAdminAssistCatalog
+ {
+ public string Version { get; }
+ public IReadOnlyList Settings { get; }
+ public IReadOnlyList Areas { get; }
+ public IReadOnlyList Capabilities { get; }
+ public IReadOnlyList Packs { get; }
+ public IReadOnlyList Rules { get; }
+ public IReadOnlyList Articles { get; }
+
+ public ConfigurationCatalog() : this(ReadEmbedded()) { }
+
+ public ConfigurationCatalog(IEnumerable documents)
+ {
+ var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true,
+ UnmappedMemberHandling = JsonUnmappedMemberHandling.Disallow };
+ options.Converters.Add(new JsonStringEnumConverter());
+ var packs = documents.Select(document => JsonSerializer.Deserialize(document, options)
+ ?? throw new InvalidDataException("Empty Admin Assist catalog document.")).ToList();
+ if (packs.Count == 0 || packs.Select(p => p.Version).Distinct().Count() != 1 || string.IsNullOrWhiteSpace(packs[0].Version))
+ throw new InvalidDataException("Admin Assist catalog versions must agree.");
+ Version = packs[0].Version;
+ Areas = Freeze(packs.SelectMany(p => p.Areas).OrderBy(a => a.Order).Select(a => a with { Archetypes = Freeze(a.Archetypes) }));
+ Settings = Freeze(packs.SelectMany(p => p.Settings).Select(s => s with
+ { Requires = Freeze(s.Requires), Affects = Freeze(s.Affects), Conflicts = Freeze(s.Conflicts) }));
+ Capabilities = Freeze(packs.SelectMany(p => p.Capabilities).Select(c => c with
+ { Requirements = Freeze(c.Requirements), SettingIds = Freeze(c.SettingIds), RuleIds = Freeze(c.RuleIds),
+ Setup = c.Setup == null ? null : c.Setup with { RuleIds = Freeze(c.Setup.RuleIds) } }));
+ Packs = Freeze(packs.SelectMany(p => p.Packs).Select(p => p with
+ { AreaIds = Freeze(p.AreaIds), RuleIds = Freeze(p.RuleIds), PrerequisiteKeys = Freeze(p.PrerequisiteKeys) }));
+ Rules = Freeze(packs.SelectMany(p => p.Rules).Select(r => r with
+ { AppliesWhen = Freeze(r.AppliesWhen), FailsWhen = Freeze(r.FailsWhen) }));
+ Articles = Freeze(packs.SelectMany(p => p.Articles));
+ Validate();
+ }
+
+ private void Validate()
+ {
+ var areas = Unique(Areas.Select(a => a.Id));
+ var settings = Unique(Settings.Select(s => s.Id));
+ Unique(Capabilities.Select(c => c.Id));
+ Unique(Packs.Select(p => p.Id));
+ var rules = Unique(Rules.Select(r => r.Id));
+ Unique(Articles.Select(a => a.Locale + "." + a.Id));
+ foreach (var setting in Settings)
+ {
+ Require(areas.Contains(setting.AreaId), "Setting area missing: " + setting.Id);
+ Require(setting.Impact != null && !string.IsNullOrWhiteSpace(setting.HelpKey), "Setting guidance missing: " + setting.Id);
+ Require(setting.Requires.Concat(setting.Affects).Concat(setting.Conflicts).All(settings.Contains), "Setting dependency missing: " + setting.Id);
+ ValidateLocation(setting.Location);
+ }
+ foreach (var capability in Capabilities)
+ {
+ Require(areas.Contains(capability.AreaId), "Capability area missing: " + capability.Id);
+ Require(capability.SettingIds.All(settings.Contains) && capability.RuleIds.All(rules.Contains), "Capability reference missing: " + capability.Id);
+ Require(new[] { "available", "preview", "planned", "retired" }.Contains(capability.ReleaseStatus), "Invalid release state.");
+ if (capability.Setup != null)
+ Require(!string.IsNullOrWhiteSpace(capability.Setup.EvidenceId) && capability.Setup.Minimum > 0 &&
+ !string.IsNullOrWhiteSpace(capability.Setup.GuidanceKey) && capability.Setup.RuleIds.All(rules.Contains), "Invalid setup evidence mapping: " + capability.Id);
+ ValidateLocation(capability.Location);
+ }
+ foreach (var rule in Rules)
+ {
+ Require(areas.Contains(rule.AreaId) && rule.FailsWhen.Count > 0, "Rule needs an area and predicate: " + rule.Id);
+ ValidateLocation(rule.Location);
+ }
+ foreach (var pack in Packs)
+ Require(pack.AreaIds.All(areas.Contains) && pack.RuleIds.All(rules.Contains), "Operating pack reference missing: " + pack.Id);
+ }
+
+ private static HashSet Unique(IEnumerable ids)
+ {
+ var set = new HashSet(StringComparer.Ordinal);
+ foreach (var id in ids)
+ Require(id != null && Regex.IsMatch(id, "^[a-zA-Z][a-zA-Z0-9._-]*$") && set.Add(id), "Invalid or duplicate catalog id: " + id);
+ return set;
+ }
+ private static void ValidateLocation(CatalogLocation location)
+ {
+ Require(location != null && Regex.IsMatch(location.Controller, "^[A-Za-z][A-Za-z0-9]*$") &&
+ Regex.IsMatch(location.Action, "^[A-Za-z][A-Za-z0-9]*$"), "Catalog destinations must be local MVC actions.");
+ }
+ private static void Require(bool condition, string message)
+ {
+ if (!condition) throw new InvalidDataException(message);
+ }
+ private static ReadOnlyCollection Freeze(IEnumerable items) => Array.AsReadOnly(items.ToArray());
+ private static IEnumerable ReadEmbedded()
+ {
+ var assembly = typeof(ConfigurationCatalog).Assembly;
+ foreach (var name in assembly.GetManifestResourceNames().Where(n => n.EndsWith(".yaml", StringComparison.Ordinal)).OrderBy(n => n))
+ {
+ using var stream = assembly.GetManifestResourceStream(name) ?? throw new InvalidDataException(name);
+ using var reader = new StreamReader(stream);
+ yield return reader.ReadToEnd();
+ }
+ }
+ private sealed class CatalogDocument
+ {
+ public string Version { get; set; } = "";
+ public List Settings { get; set; } = [];
+ public List Areas { get; set; } = [];
+ public List Capabilities { get; set; } = [];
+ public List Packs { get; set; } = [];
+ public List Rules { get; set; } = [];
+ public List Articles { get; set; } = [];
+ }
+ }
+}
diff --git a/Core/Resgrid.AdminAssist/ConfigurationImpactEvaluator.cs b/Core/Resgrid.AdminAssist/ConfigurationImpactEvaluator.cs
new file mode 100644
index 000000000..6d3bdce3f
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/ConfigurationImpactEvaluator.cs
@@ -0,0 +1,84 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.AdminAssist
+{
+ /// Side-effect-free scalar overlays and health-rule deltas. Unmeasured operational effects remain explicit.
+ public sealed class ConfigurationImpactEvaluator(IAdminAssistCatalog catalog)
+ {
+ // Deliberate allowlist, not arbitrary reflection or client-supplied evidence.
+ public static readonly IReadOnlyList BooleanSettings = Array.AsReadOnly(new[] {
+ "DispatchShiftInsteadOfGroup", "AutoSetStatusForShiftDispatchPersonnel", "DisabledAutoAvailable", "EnableTextToCall", "EnableTextCommand",
+ "MappingUseMapboxOverride", "CheckInTimersAutoEnableForNewCalls", "WeatherAlertsEnabled", "RequirePasswordResetViaEmail",
+ "MappingPersonnelAllowStatusWithNoLocationToOverwrite", "MappingUnitAllowStatusWithNoLocationToOverwrite"
+ });
+ public static readonly IReadOnlyList NumberSettings = Array.AsReadOnly(new[] {
+ "Require2FAForAdmins", "MappingPersonnelLocationTTL", "MappingUnitLocationTTL"
+ });
+ public static bool Supports(string settingId) => settingId != null && settingId.StartsWith("setting.", StringComparison.Ordinal) &&
+ BooleanSettings.Concat(NumberSettings).Contains(settingId.Substring(8), StringComparer.Ordinal);
+
+ public ConfigurationImpactReport Evaluate(ConfigurationSnapshot snapshot, ConfigurationImpactRequest request, DateTime now, TimeSpan maximumAge)
+ {
+ if (request == null || !Supports(request.SettingId)) throw new ArgumentException("This setting has no scalar preview.");
+ if (!snapshot.Consistent || snapshot.Revision != request.ExpectedRevision) throw new AdminAssistConcurrencyException();
+ var setting = catalog.Settings.Single(s => s.Id == request.SettingId);
+ var id = request.SettingId.Substring(8);
+ var original = snapshot.Find(id);
+ if (BooleanSettings.Contains(id))
+ {
+ if (!request.Boolean.HasValue || request.Number.HasValue) throw new ArgumentException("A Boolean proposal is required.");
+ }
+ else if (request.Boolean.HasValue || !request.Number.HasValue || request.Number < 0 || request.Number > (id == "Require2FAForAdmins" ? 2 : 525600) || decimal.Truncate(request.Number.Value) != request.Number)
+ throw new ArgumentException("The proposed value is outside the supported range.");
+
+ var values = snapshot.Evidence.ToDictionary(p => p.Key, p => p.Value, StringComparer.Ordinal);
+ // A proposal is known; its current value and dependencies can still be unknown.
+ values[id] = original with { State = EvidenceState.Known, AsOfUtc = now, Source = "InMemoryProposal", Boolean = request.Boolean, Number = request.Number, ReasonCode = null };
+ var metrics = new List();
+ var limits = new List { "Impact.NoMutation", "Impact.Unquantified", "Impact.Window" };
+ if (id is "EnableTextToCall" or "EnableTextCommand") limits.Add("Impact.TextProviderLimits");
+ if (id == "MappingUseMapboxOverride" && request.Boolean == false)
+ {
+ // The existing editor deletes these values when the override is disabled. Model that composed effect.
+ foreach (var presence in new[] { "mapTokenPresent", "mapStylePresent" })
+ values[presence] = snapshot.Find(presence) with { State = EvidenceState.Known, Boolean = false, AsOfUtc = now, Source = "InMemoryProposal" };
+ limits.Add("Impact.MapCredentialsRemoved");
+ }
+ metrics.Add(new ConfigurationImpactMetric("Impact.StoredValue", original.IsFresh(now, maximumAge) ? EvidenceState.Known : original.State == EvidenceState.Redacted ? EvidenceState.Redacted : EvidenceState.Unknown,
+ original.IsFresh(now, maximumAge) ? original.Number ?? (original.Boolean.HasValue ? original.Boolean.Value ? 1m : 0m : null) : null,
+ request.Number ?? (request.Boolean == true ? 1 : 0), original.IsFresh(now, maximumAge) ? null : "EvidenceNotObserved"));
+ if (id == "Require2FAForAdmins")
+ {
+ var unenrolled = snapshot.Find("adminsWithoutMfa");
+ var groupUnenrolled = snapshot.Find("groupOnlyAdminsWithoutMfa");
+ decimal? Enrollment(decimal? scope)
+ {
+ if (!scope.HasValue || scope < 0 || scope > 2) return null;
+ if (scope == 0) return 0;
+ if (!unenrolled.IsFresh(now, maximumAge) || !unenrolled.Number.HasValue) return null;
+ if (scope == 1) return unenrolled.Number;
+ return groupUnenrolled.IsFresh(now, maximumAge) && groupUnenrolled.Number.HasValue ? unenrolled.Number + groupUnenrolled.Number : null;
+ }
+ var before = original.IsFresh(now, maximumAge) ? Enrollment(original.Number) : null;
+ var after = Enrollment(request.Number);
+ metrics.Add(new ConfigurationImpactMetric("Impact.AdminsRequiringEnrollment", before.HasValue && after.HasValue ? EvidenceState.Known : EvidenceState.Unknown, before, after));
+ limits.Add("Impact.MfaRecoveryUnknown");
+ }
+ var proposed = snapshot with { Evidence = new ReadOnlyDictionary(values) };
+ var changes = new List();
+ foreach (var definition in catalog.Rules)
+ {
+ var rule = new ConfigurationRule(definition);
+ var before = rule.Evaluate(snapshot, now, maximumAge).Result;
+ var after = rule.Evaluate(proposed, now, maximumAge).Result;
+ if (before != after) changes.Add(new(definition.Id, definition.TitleKey, before, after));
+ }
+ return new(setting.Id, snapshot.Revision, snapshot.AsOfUtc, "scalar-impact-v1", setting.Impact,
+ metrics.AsReadOnly(), changes.AsReadOnly(), limits.AsReadOnly(), setting.Location.Url);
+ }
+ }
+}
diff --git a/Core/Resgrid.AdminAssist/ConfigurationRule.cs b/Core/Resgrid.AdminAssist/ConfigurationRule.cs
new file mode 100644
index 000000000..fff1a51c0
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/ConfigurationRule.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.AdminAssist
+{
+ /// Evaluates only observed, fresh scalar metadata. Incomplete evidence cannot become a pass.
+ public sealed class ConfigurationRule(ConfigurationRuleDefinition definition) : IConfigurationRule
+ {
+ public ConfigurationRuleDefinition Definition { get; } = definition;
+
+ public ConfigurationFinding Evaluate(ConfigurationSnapshot snapshot, DateTime nowUtc, TimeSpan maximumAge)
+ {
+ var ids = Definition.AppliesWhen.Concat(Definition.FailsWhen).Select(c => c.EvidenceId).Distinct().ToArray();
+ RuleResult result;
+ bool? applies = null;
+ string? reason = null;
+ if (!snapshot.Consistent)
+ {
+ result = RuleResult.Unknown;
+ reason = "SnapshotChanged";
+ }
+ else
+ {
+ applies = MatchAll(Definition.AppliesWhen, snapshot, nowUtc, maximumAge);
+ if (applies == false) result = RuleResult.NotApplicable;
+ else if (applies == null) { result = RuleResult.Unknown; reason = "ApplicabilityUnknown"; }
+ else
+ {
+ var fails = MatchAll(Definition.FailsWhen, snapshot, nowUtc, maximumAge);
+ result = fails == null ? RuleResult.Unknown : fails.Value ? RuleResult.Fail : RuleResult.Pass;
+ if (fails == null) reason = "EvidenceIncompleteOrStale";
+ }
+ }
+ return new ConfigurationFinding(Definition.Id, Definition.AreaId, Definition.Severity, result,
+ Definition.TitleKey, Definition.ExplanationKey, Definition.NextActionKey, Definition.Location.Url,
+ ids, snapshot.Revision, nowUtc, reason, Definition.Severity == FindingSeverity.Critical &&
+ (result == RuleResult.Fail || result == RuleResult.Unknown && applies == true && Definition.AppliesWhen.Count > 0));
+ }
+
+ private static bool? MatchAll(IReadOnlyList conditions, ConfigurationSnapshot snapshot,
+ DateTime now, TimeSpan age)
+ {
+ var unknown = false;
+ var anyFalse = false;
+ foreach (var condition in conditions)
+ {
+ var evidence = snapshot.Find(condition.EvidenceId);
+ if (!evidence.IsFresh(now, age)) { unknown = true; continue; }
+ bool? match = condition.Comparison switch
+ {
+ EvidenceComparison.IsTrue => evidence.Boolean,
+ EvidenceComparison.IsFalse => evidence.Boolean.HasValue ? !evidence.Boolean.Value : null,
+ EvidenceComparison.Equal when condition.Code != null => evidence.Code == null ? null : evidence.Code == condition.Code,
+ EvidenceComparison.NotEqual when condition.Code != null => evidence.Code == null ? null : evidence.Code != condition.Code,
+ _ when !evidence.Number.HasValue || !condition.Number.HasValue => null,
+ EvidenceComparison.Equal => evidence.Number == condition.Number,
+ EvidenceComparison.NotEqual => evidence.Number != condition.Number,
+ EvidenceComparison.Greater => evidence.Number > condition.Number,
+ EvidenceComparison.GreaterOrEqual => evidence.Number >= condition.Number,
+ EvidenceComparison.Less => evidence.Number < condition.Number,
+ EvidenceComparison.LessOrEqual => evidence.Number <= condition.Number,
+ _ => null
+ };
+ if (match == false) anyFalse = true;
+ if (!match.HasValue) unknown = true;
+ }
+ return unknown ? null : !anyFalse;
+ }
+ }
+}
diff --git a/Core/Resgrid.AdminAssist/FindingLifecycle.cs b/Core/Resgrid.AdminAssist/FindingLifecycle.cs
new file mode 100644
index 000000000..61e709b35
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/FindingLifecycle.cs
@@ -0,0 +1,45 @@
+using System;
+using Resgrid.Model;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.AdminAssist
+{
+ public static class FindingLifecycle
+ {
+ /// Unknown evidence cannot resolve a finding; acknowledgement and exceptions never change rule results.
+ public static WorkflowTriggerEventType? Observe(AdminAssistFindingRow row, ConfigurationFinding finding, DateTime now)
+ {
+ var previous = (RuleResult)row.Result;
+ var first = row.Revision == 0;
+ WorkflowTriggerEventType? transition = null;
+ if (finding.Result == RuleResult.Fail && (row.Episode == 0 || previous == RuleResult.Pass || row.ReviewStatus == (int)FindingReviewStatus.Resolved))
+ {
+ transition = row.Episode == 0 ? WorkflowTriggerEventType.AdminAssistFindingOpened : WorkflowTriggerEventType.AdminAssistFindingReopened;
+ row.Episode++;
+ row.ReviewStatus = (int)(row.OwnerId == null ? FindingReviewStatus.Unassigned : FindingReviewStatus.Assigned);
+ row.ExceptionUntil = null;
+ }
+ else if (!first && finding.Result == RuleResult.Pass && row.ReviewStatus != (int)FindingReviewStatus.Resolved && row.Episode > 0)
+ {
+ transition = WorkflowTriggerEventType.AdminAssistFindingResolved;
+ row.ReviewStatus = (int)FindingReviewStatus.Resolved;
+ row.ExceptionUntil = null;
+ }
+ // Keep an expired exception pending while evidence is unknown: it is no longer an active
+ // exception, but its next verified failure must still produce exactly one reopened episode.
+ if (row.ReviewStatus == (int)FindingReviewStatus.AcceptedException && row.ExceptionUntil <= now && finding.Result == RuleResult.Fail)
+ {
+ row.ReviewStatus = (int)(row.OwnerId == null ? FindingReviewStatus.Unassigned : FindingReviewStatus.Assigned);
+ row.ExceptionUntil = null;
+ if (finding.Result == RuleResult.Fail) { transition = WorkflowTriggerEventType.AdminAssistFindingReopened; row.Episode++; }
+ }
+ row.Result = (int)finding.Result;
+ row.Severity = (int)finding.Severity;
+ row.SnapshotRevision = finding.SnapshotRevision;
+ if (first) row.FirstObservedOn = now;
+ row.LastObservedOn = now;
+ row.Revision++;
+ return transition;
+ }
+ }
+}
diff --git a/Core/Resgrid.AdminAssist/Resgrid.AdminAssist.csproj b/Core/Resgrid.AdminAssist/Resgrid.AdminAssist.csproj
new file mode 100644
index 000000000..a03afe74c
--- /dev/null
+++ b/Core/Resgrid.AdminAssist/Resgrid.AdminAssist.csproj
@@ -0,0 +1,13 @@
+
+
+ net9.0
+ Debug;Release;Docker
+ enable
+
+
+
+
+
+
+
+
diff --git a/Core/Resgrid.Chatbot/Handlers/UnitsActionHandler.cs b/Core/Resgrid.Chatbot/Handlers/UnitsActionHandler.cs
index 7e3ad306d..43bb47feb 100644
--- a/Core/Resgrid.Chatbot/Handlers/UnitsActionHandler.cs
+++ b/Core/Resgrid.Chatbot/Handlers/UnitsActionHandler.cs
@@ -33,9 +33,9 @@ public async Task HandleAsync(ChatbotMessage message, ChatbotIn
var culture = session.Culture;
try
{
- // Layer 2 for a list: every active member may list their department's units, so the
- // permission is decided once per request against session.DepartmentId. A per-row
- // CanUserViewUnitAsync answers the same membership question with two lookups per unit.
+ // Layer 2 for a list: membership is decided once per request against session.DepartmentId;
+ // View Units is then applied per row from the cached visibility matrix, as the v4 unit lists do,
+ // rather than CanUserViewUnitAsync's database lookups per unit.
if (!await _authorizationService.IsUserValidWithinLimitsAsync(session.UserId, session.DepartmentId))
return new ChatbotResponse { Text = ChatbotResources.Get("Units_NoPermission", culture), Processed = false };
@@ -58,6 +58,9 @@ public async Task HandleAsync(ChatbotMessage message, ChatbotIn
if (unit == null || unit.DepartmentId != session.DepartmentId)
continue;
+ if (!await _authorizationService.CanUserViewUnitViaMatrixAsync(unit.UnitId, session.UserId, session.DepartmentId))
+ continue;
+
var status = await _customStateService.GetCustomUnitStateAsync(unitState);
var statusText = status?.ButtonText ?? ChatbotResources.Get("Personnel_Unknown", culture);
sb.AppendLine(ChatbotResources.Get("Units_Line", culture, unit.Name, statusText));
diff --git a/Core/Resgrid.Chatbot/Handlers/UnitsAvailableActionHandler.cs b/Core/Resgrid.Chatbot/Handlers/UnitsAvailableActionHandler.cs
index f5cbdd948..37bdea618 100644
--- a/Core/Resgrid.Chatbot/Handlers/UnitsAvailableActionHandler.cs
+++ b/Core/Resgrid.Chatbot/Handlers/UnitsAvailableActionHandler.cs
@@ -43,10 +43,10 @@ public async Task HandleAsync(ChatbotMessage message, ChatbotIn
var culture = session.Culture;
try
{
- // Layer 2 for a list: every active member may list their department's units, so the
- // permission is decided once per request against session.DepartmentId. A per-row
- // CanUserViewUnitAsync answers the same membership question with two lookups per unit —
- // over the whole department here, since availability is classified before the cap.
+ // Layer 2 for a list: membership is decided once per request against session.DepartmentId;
+ // View Units is then applied per row from the cached visibility matrix, as the v4 unit lists do,
+ // rather than CanUserViewUnitAsync's database lookups per unit (over the whole department here,
+ // since availability is classified before the cap).
if (!await _authorizationService.IsUserValidWithinLimitsAsync(session.UserId, session.DepartmentId))
return new ChatbotResponse { Text = ChatbotResources.Get("Units_NoPermission", culture), Processed = false };
@@ -62,6 +62,9 @@ public async Task HandleAsync(ChatbotMessage message, ChatbotIn
foreach (var unitState in unitStatuses.Where(u => u?.Unit != null && u.Unit.DepartmentId == session.DepartmentId)
.OrderBy(u => u.Unit.Name))
{
+ if (!await _authorizationService.CanUserViewUnitViaMatrixAsync(unitState.Unit.UnitId, session.UserId, session.DepartmentId))
+ continue;
+
var availability = await _platformReportingService.ClassifyUnitAvailabilityAsync(session.DepartmentId, unitState.State);
if (availability != AvailabilityClass.Available)
continue;
diff --git a/Core/Resgrid.Config/AdminAssistConfig.cs b/Core/Resgrid.Config/AdminAssistConfig.cs
new file mode 100644
index 000000000..79e12cd8d
--- /dev/null
+++ b/Core/Resgrid.Config/AdminAssistConfig.cs
@@ -0,0 +1,18 @@
+namespace Resgrid.Config
+{
+ /// Host-owned bounds for deterministic administrative assistance. No inference settings.
+ public static class AdminAssistConfig
+ {
+ public static int SnapshotTimeoutSeconds = 20;
+ public static int MaxEvidenceRows = 2000;
+ public static int EvidenceFreshnessSeconds = 60;
+ public static int MaxHistoryPageSize = 100;
+ public static int TraceRetentionDays = 90;
+ public static int AggregateRetentionDays = 365;
+ public static int PersonalLearningRetentionDays = 365;
+ public static bool CaptureDispatchTraces = false;
+ public static bool DrainDispatchTraceQueue = false;
+ public static string TraceQueueName = "adminassisttraces-v1";
+ public static bool SendAdminDigests = false;
+ }
+}
diff --git a/Core/Resgrid.Config/McpConfig.cs b/Core/Resgrid.Config/McpConfig.cs
index b09efd086..4493f8064 100644
--- a/Core/Resgrid.Config/McpConfig.cs
+++ b/Core/Resgrid.Config/McpConfig.cs
@@ -40,6 +40,18 @@ public static class McpConfig
/// Enable stdio transport (for backwards compatibility)
///
public static bool EnableStdioTransport = false;
+
+ ///
+ /// Tool calls allowed per minute for each access token (each signed-in session)
+ ///
+ public static int ToolCallsPerMinute = 100;
+
+ ///
+ /// Tool calls allowed per minute from each client address for calls made without an access token, which in
+ /// practice are authenticate and refresh_access_token. Kept low: the API sees every sign-in made through MCP as
+ /// coming from the MCP server, so this is the only per-caller limit on password attempts made through it.
+ ///
+ public static int UnauthenticatedCallsPerMinute = 10;
}
}
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.ar.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.ar.resx
new file mode 100644
index 000000000..2ba62f431
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.ar.resx
@@ -0,0 +1,363 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ إضافة شخص
+
+
+ حماية البيانات المتقدمة
+
+
+ العروض
+
+
+ اللوحة الكبيرة
+
+
+ التقويم
+
+
+ أنواع الشهادات
+
+
+ الدردشة
+
+
+ قوائم التحقق
+
+
+ اختبارات الاتصال
+
+
+ جهات الاتصال
+
+
+ العقود
+
+
+ لوحة المعلومات
+
+
+ حماية البيانات
+
+
+ إعدادات القسم
+
+
+ أقسامك
+
+
+ إعدادات التوزيع
+
+
+ المستندات
+
+
+ النماذج
+
+
+ صندوق الوارد
+
+
+ تقارير الحوادث
+
+
+ المخزون
+
+
+ إدارة الدعوات
+
+
+ الفواتير
+
+
+ التوجيه المباشر
+
+
+ الخرائط
+
+
+ إعدادات الوحدات
+
+
+ جهة اتصال جديدة
+
+
+ انتشار جديد
+
+
+ مجموعة جديدة
+
+
+ ملاحظة جديدة
+
+
+ بروتوكول جديد
+
+
+ تدريب جديد
+
+
+ وحدة جديدة
+
+
+ سير عمل جديد
+
+
+ الرسائل المرسلة
+
+
+ الصيانة الوقائية
+
+
+ البروتوكولات
+
+
+ بطاقات الأسعار
+
+
+ حالات حفظ السجلات
+
+
+ عمليات التفتيش
+
+
+ التحقيقات
+
+
+ التصاريح
+
+
+ السجلات
+
+
+ إعدادات السجلات
+
+
+ المسارات
+
+
+ الورديات
+
+
+ التدريبات
+
+
+ المصادقة الثنائية
+
+
+ تأهيل الوحدة
+
+
+ مكالمة صوتية
+
+
+ تشغيلات سير العمل
+
+
+ سير العمل
+
+
+ القوى العاملة
+
+
+ الجميع
+
+
+ الصلاحية
+
+
+ البحث والإنقاذ
+
+
+ تعديل المخزون
+
+
+ اعتماد السجلات
+
+
+ إغلاق البلاغ
+
+
+ إنشاء سير عمل
+
+
+ حذف البلاغ
+
+
+ إنهاء السجلات
+
+
+ إدارة تعريفات السجلات
+
+
+ إدارة إفصاحات السجلات
+
+
+ إدارة تقارير السجلات
+
+
+ نشر تعريفات السجلات
+
+
+ مراجعة السجلات
+
+
+ لا
+
+
+ ساعات التشغيل
+
+
+ نعم
+
+
+ العقد
+
+
+ متطوع
+
+
+ ساعات التشغيل
+
+
+ بعد
+
+
+ المنطقة
+
+
+ قبل
+
+
+ إصدار الفهرس
+
+
+ افتح صفحة الإعداد المعنية
+
+
+ حرج
+
+
+ يحتاج إلى متابعة
+
+
+ مخطط
+
+
+ معاينة
+
+
+ الأدلة حتى
+
+
+ الموضوع
+
+
+ معلومات
+
+
+ معلومات
+
+
+ مهتم بهذه الميزة
+
+
+ متاح
+
+
+ تعرّف عليه لاحقًا
+
+
+ أفهم هذه الميزة
+
+
+ جارٍ تحميل إعداد القسم…
+
+
+ لا ينطبق
+
+
+ تم التحقق
+
+
+ طباعة
+
+
+ اقرأ النص المصدر
+
+
+ الأدلة المحمية غير متاحة
+
+
+ فحص الإعدادات إرشاد إداري. فهم ميزة أو حفظ إعداد لا يثبت الجاهزية التشغيلية أو تسليم الرسائل.
+
+
+ إعادة المحاولة
+
+
+ موعد المراجعة
+
+
+ جارٍ الحفظ…
+
+
+ ابحث عن المجالات والميزات
+
+
+ ابحث في الوثائق المرجعية
+
+
+ غير مُسند
+
+
+ غير متاح
+
+
+ غير معروف
+
+
+ استخدم الآن
+
+
+ تحقق مجددًا
+
+
+ تحذير
+
+
+ استكشف Resgrid والإضافات
+
+
+ فحوص الإعداد
+
+
+ سجل التغييرات
+
+
+ نظرة عامة
+
+
+ مرجع الإعدادات
+
+
+ تقرير الإعداد
+
+
+ معالج الإعداد
+
+
+ قائمة مهام المسؤول
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.cs b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.cs
new file mode 100644
index 000000000..43579b588
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.cs
@@ -0,0 +1,4 @@
+namespace Resgrid.Localization.Areas.User.AdminAssist
+{
+ public sealed class AdminAssist { }
+}
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.de.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.de.resx
new file mode 100644
index 000000000..d97eba9d1
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.de.resx
@@ -0,0 +1,309 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Erweiterter Datenschutz
+
+
+ Archivierte Einsätze
+
+
+ Angebote
+
+
+ Großanzeigetafel
+
+
+ Kalender
+
+
+ Einsätze
+
+
+ Checklisten
+
+
+ Kommunikationstests
+
+
+ Kontakte
+
+
+ Verträge
+
+
+ Übersicht
+
+
+ Datenschutz
+
+
+ Abteilungseinstellungen
+
+
+ Ihre Abteilungen
+
+
+ Dokumente
+
+
+ Formulare
+
+
+ Einsatzberichte
+
+
+ Inventar
+
+
+ Rechnungen
+
+
+ Protokolle
+
+
+ Kartierung
+
+
+ Moduleinstellungen
+
+
+ Neuer Einsatz
+
+
+ Neue Gruppe
+
+
+ Neues Protokoll
+
+
+ Neue Schulung
+
+
+ Notizen
+
+
+ Vorbeugende Wartung
+
+
+ Protokolle
+
+
+ Preislisten
+
+
+ Aufbewahrungssperren für Akten
+
+
+ Prüfungen
+
+
+ Ermittlungen
+
+
+ Genehmigungen
+
+
+ Akten-Einstellungen
+
+
+ Routen
+
+
+ Schichten
+
+
+ Einheiten
+
+
+ Sprachanruf
+
+
+ Belegschaft
+
+
+ Alle
+
+
+ Such- und Rettungsdienst
+
+
+ Inventar anpassen
+
+
+ Berichte genehmigen
+
+
+ Berichte abschließen
+
+
+ Berichtsdefinitionen verwalten
+
+
+ Berichtsoffenlegungen verwalten
+
+
+ Berichtsauswertungen verwalten
+
+
+ Berichtsdefinitionen veröffentlichen
+
+
+ Berichte prüfen
+
+
+ Nein
+
+
+ Betriebsstunden
+
+
+ Ja
+
+
+ Vertrag
+
+
+ Unbekannt
+
+
+ Ehrenamtliche(r)
+
+
+ Betriebsstunden
+
+
+ Nachher
+
+
+ Vorher
+
+
+ Katalogversion
+
+
+ Zuständige Einstellungsseite öffnen
+
+
+ Kritisch
+
+
+ Handlungsbedarf
+
+
+ Geplant
+
+
+ Vorschau
+
+
+ Nachweisstand
+
+
+ Zeitpunkt
+
+
+ Informationen
+
+
+ Interesse an dieser Funktion
+
+
+ Verfügbar
+
+
+ Später kennenlernen
+
+
+ Ich verstehe diese Funktion
+
+
+ Abteilungseinrichtung wird geladen…
+
+
+ Nicht zutreffend
+
+
+ Geprüft
+
+
+ Drucken
+
+
+ Originaltext lesen
+
+
+ Geschützte Nachweise nicht verfügbar
+
+
+ Die Konfigurationsprüfung bietet administrative Orientierung. Eine verstandene Funktion oder gespeicherte Einstellung belegt weder die Einsatzbereitschaft noch die Zustellung von Nachrichten.
+
+
+ Erneut versuchen
+
+
+ Prüfung fällig
+
+
+ Speichern…
+
+
+ Bereiche und Funktionen suchen
+
+
+ Referenzdokumentation durchsuchen
+
+
+ Nicht zugewiesen
+
+
+ Nicht verfügbar
+
+
+ Unbekannt
+
+
+ Jetzt verwenden
+
+
+ Erneut prüfen
+
+
+ Warnung
+
+
+ Resgrid und Erweiterungen entdecken
+
+
+ Konfigurationsprüfungen
+
+
+ Änderungsverlauf
+
+
+ Übersicht
+
+
+ Einstellungsreferenz
+
+
+ Einrichtungsbericht
+
+
+ Einrichtungsassistent
+
+
+ Aufgabenliste für Administratoren
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.el.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.el.resx
new file mode 100644
index 000000000..7e51d8479
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.el.resx
@@ -0,0 +1,390 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Προσθήκη Ατόμου
+
+
+ Προηγμένη προστασία δεδομένων
+
+
+ Αρχειοθετημένες Κλήσεις
+
+
+ Προσφορές
+
+
+ Ημερολόγιο
+
+
+ Κλήσεις
+
+
+ Τύποι Πιστοποιήσεων
+
+
+ Συνομιλία
+
+
+ Λίστες ελέγχου
+
+
+ Δοκιμές Επικοινωνίας
+
+
+ Επαφές
+
+
+ Συμβάσεις
+
+
+ Προστασία δεδομένων
+
+
+ Ρυθμίσεις Τμήματος
+
+
+ Τα Τμήματά Σας
+
+
+ Ρυθμίσεις Αποστολής
+
+
+ Έγγραφα
+
+
+ Φόρμες
+
+
+ Εισερχόμενα
+
+
+ Αναφορές συμβάντων
+
+
+ Διαχείριση Προσκλήσεων
+
+
+ Τιμολόγια
+
+
+ Ζωντανή Δρομολόγηση
+
+
+ Καταγραφές
+
+
+ Χαρτογράφηση
+
+
+ Ρυθμίσεις ενοτήτων
+
+
+ Νέα Κλήση
+
+
+ Νέα Επαφή
+
+
+ Νέα αποστολή
+
+
+ Νέα Ομάδα
+
+
+ Νέα Καταγραφή
+
+
+ Νέα Σημείωση
+
+
+ Νέο Πρωτόκολλο
+
+
+ Νέα Εκπαίδευση
+
+
+ Νέα Μονάδα
+
+
+ Νέα Ροή Εργασίας
+
+
+ Σημειώσεις
+
+
+ Απεσταλμένα Μηνύματα
+
+
+ Προσωπικό
+
+
+ Προληπτική συντήρηση
+
+
+ Πρωτόκολλα
+
+
+ Τιμοκατάλογοι
+
+
+ Δεσμεύσεις διατήρησης αρχείων
+
+
+ Επιθεωρήσεις
+
+
+ Έρευνες
+
+
+ Άδειες
+
+
+ Ρυθμίσεις αρχείων
+
+
+ Αναφορές
+
+
+ Διαδρομές
+
+
+ Βάρδιες
+
+
+ Εκπαιδεύσεις
+
+
+ Έλεγχος Ταυτότητας Δύο Παραγόντων
+
+
+ Στελέχωση Μονάδας
+
+
+ Μονάδες
+
+
+ Φωνή
+
+
+ Εκτελέσεις Ροής Εργασίας
+
+
+ Εργατικό δυναμικό
+
+
+ Όλοι
+
+
+ Δικαίωμα
+
+
+ Έρευνα και διάσωση
+
+
+ Προσαρμογή Αποθέματος
+
+
+ Έγκριση αναφορών
+
+
+ Κλείσιμο Κλήσης
+
+
+ Σύνδεση στην Εφαρμογή Command
+
+
+ Δημιουργία Ροής Εργασίας
+
+
+ Διαγραφή Κλήσης
+
+
+ Διαγραφή Καταγραφής
+
+
+ Σύνδεση στην Εφαρμογή Dispatch
+
+
+ Οριστικοποίηση αναφορών
+
+
+ Διαχείριση ορισμών αναφορών
+
+
+ Διαχείριση γνωστοποιήσεων αναφορών
+
+
+ Διαχείριση συγκεντρωτικών αναφορών
+
+
+ Δημοσίευση ορισμών αναφορών
+
+
+ Έλεγχος αναφορών
+
+
+ Χρήση Συγχρονισμού Ημερολογίου
+
+
+ Όχι
+
+
+ Ώρες λειτουργίας
+
+
+ Ναι
+
+
+ Σύμβαση
+
+
+ Εθελοντής
+
+
+ Ώρες λειτουργίας
+
+
+ Ενεργοποίηση Σύγχρονων Ειδοποιήσεων
+
+
+ Μετά
+
+
+ Περιοχή
+
+
+ Πριν
+
+
+ Έκδοση καταλόγου
+
+
+ Άνοιγμα της αντίστοιχης σελίδας ρυθμίσεων
+
+
+ Κρίσιμο
+
+
+ Χρειάζεται προσοχή
+
+
+ Προγραμματισμένη
+
+
+ Προεπισκόπηση
+
+
+ Στοιχεία έως
+
+
+ Πότε
+
+
+ Πληροφορίες
+
+
+ Πληροφορίες
+
+
+ Με ενδιαφέρει αυτή η λειτουργία
+
+
+ Διαθέσιμο
+
+
+ Ενημέρωση αργότερα
+
+
+ Κατανοώ αυτή τη λειτουργία
+
+
+ Φόρτωση ρυθμίσεων τμήματος…
+
+
+ Δεν εφαρμόζεται
+
+
+ Επαληθεύτηκε
+
+
+ Εκτύπωση
+
+
+ Ανάγνωση του κειμένου πηγής
+
+
+ Τα προστατευμένα στοιχεία δεν είναι διαθέσιμα
+
+
+ Ο έλεγχος ρυθμίσεων παρέχει διοικητική καθοδήγηση. Η κατανόηση μιας λειτουργίας ή η αποθήκευση μιας ρύθμισης δεν αποδεικνύει επιχειρησιακή ετοιμότητα ή παράδοση μηνυμάτων.
+
+
+ Δοκιμάστε ξανά
+
+
+ Προθεσμία ελέγχου
+
+
+ Αποθήκευση…
+
+
+ Αναζήτηση τομέων και λειτουργιών
+
+
+ Αναζήτηση στην τεκμηρίωση αναφοράς
+
+
+ Μη ανατεθειμένο
+
+
+ Μη διαθέσιμο
+
+
+ Άγνωστο
+
+
+ Χρήση τώρα
+
+
+ Επαλήθευση ξανά
+
+
+ Προειδοποίηση
+
+
+ Εξερεύνηση του Resgrid και των πρόσθετων
+
+
+ Έλεγχοι ρυθμίσεων
+
+
+ Ιστορικό αλλαγών
+
+
+ Επισκόπηση
+
+
+ Οδηγός αναφοράς ρυθμίσεων
+
+
+ Αναφορά ρύθμισης
+
+
+ Οδηγός ρύθμισης
+
+
+ Λίστα εργασιών διαχειριστή
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.en.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.en.resx
new file mode 100644
index 000000000..3d852e3d8
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.en.resx
@@ -0,0 +1,5409 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Automation and connectivity
+
+
+ Deployments and business
+
+
+ Calls and response
+
+
+ Communication
+
+
+ Home and applications
+
+
+ Inventory and readiness
+
+
+ Contacts and site knowledge
+
+
+ Units and location
+
+
+ Checklists and maintenance
+
+
+ People and organization
+
+
+ Plans, add-ons and AI
+
+
+ Records and reporting
+
+
+ Administration and security
+
+
+ Review a Workflow and its permissions before explicitly enabling it.
+
+
+ Compare an event standby invoice with its approved deployment documentation.
+
+
+ Review a test scenario before enabling CAD intake or changing dispatch routing.
+
+
+ Preview recipients and explicitly run a communication test through its own screen.
+
+
+ A dispatcher creates a call while responders and unit crews receive their assigned work.
+
+
+ Review an expiring supply lot and arrange restocking through the inventory screen.
+
+
+ Review a receiving-agency contact and an approved site plan before a planned event.
+
+
+ Review an apparatus location and its last update before relying on the map.
+
+
+ Record an equipment defect, assign repair and review return to service through the owning module.
+
+
+ Check that the next shift has the locally required qualified crew.
+
+
+ Review feature requirements with the managing member before using the normal billing screen.
+
+
+ Review an incident report and its outstanding corrections using the Records workflow.
+
+
+ Verify an additional administrator and review MFA and recovery procedures.
+
+
+ Configure Workflows, user-defined fields, APIs, imports and integrations.
+
+
+ Understand free Deployment Finance and optional Business Operations workflows.
+
+
+ Create and receive calls, choose recipients and follow response status.
+
+
+ Use messages, notifications, communication tests, chat and Push-to-Talk.
+
+
+ Learn how the web, Dispatch, Responder, Unit, Incident Command and Big Board fit your team.
+
+
+ Track stock, equipment, issue and return, purchasing and expiry.
+
+
+ Maintain contacts, preplans, forms, notes, documents, files and links.
+
+
+ Manage units, crews, maps, location tracking, routes and weather.
+
+
+ Use included checklists and optional Readiness Pro repair and maintenance workflows.
+
+
+ Organize members, stations, groups, roles, qualifications, shifts and training.
+
+
+ Compare included features, base-plan limits and paid add-ons.
+
+
+ Understand Records, legacy Logs, reviews, prevention, investigations and reporting.
+
+
+ Review department settings, permissions, MFA, SSO, audit and data protection.
+
+
+ Reduce repeated administrative work while retaining ownership and review of external effects.
+
+
+ Connect deployment records to invoicing, reimbursement or internal cost review when needed.
+
+
+ Make call intake and recipient selection consistent across shifts.
+
+
+ Choose a communication channel appropriate to the audience and task.
+
+
+ Give each role the right app and a clear starting point.
+
+
+ See recorded shortages and due dates before they become an administrative surprise.
+
+
+ Help authorized members find the current reference and responsible contact.
+
+
+ Make resource information easier to find and show when positions are stale.
+
+
+ Connect recorded equipment checks with owned corrective work when maintenance is enabled.
+
+
+ Keep access and responsibilities aligned with the people doing the work.
+
+
+ Choose optional capabilities by the work they support and their adoption requirements.
+
+
+ Keep administrative follow-up and reporting evidence connected to the source record.
+
+
+ Keep administrative access recoverable and limited to authorized people.
+
+
+ Account sessions and recovery
+
+
+ Add Person
+
+
+ Advanced Data Protection
+
+
+ Enhanced AI
+
+
+ Business Operations
+
+
+ Push-to-Talk
+
+
+ Readiness Pro
+
+
+ API and MCP integrations
+
+
+ Archived Calls
+
+
+ Audit history
+
+
+ Bids
+
+
+ Big Board
+
+
+ Billing Settings
+
+
+ Cal OES MARS
+
+
+ MARS Action Queue
+
+
+ MARS Annual Rates
+
+
+ MARS Reconciliation
+
+
+ Calendar
+
+
+ Call Settings
+
+
+ Call templates
+
+
+ Call types and priorities
+
+
+ Calls
+
+
+ Certification Dashboard
+
+
+ Certification Settings
+
+
+ Certification Types
+
+
+ Chat
+
+
+ Chatbot and Assistant integration settings
+
+
+ Check-in timers
+
+
+ Checklist compliance reports
+
+
+ Checklist schedules and due work
+
+
+ Checklist Templates
+
+
+ Checklists
+
+
+ Communication Tests
+
+
+ Compliance Documents
+
+
+ New Message
+
+
+ Contact Categories
+
+
+ Contacts
+
+
+ Contracts
+
+
+ Field Cost Runs
+
+
+ Custom map layers
+
+
+ Personnel and unit statuses
+
+
+ Dashboard
+
+
+ Data Protection
+
+
+ Department Settings
+
+
+ Your Departments
+
+
+ Deployment From External Order
+
+
+ Deployment Finance
+
+
+ Dispatch application
+
+
+ Dispatch Settings
+
+
+ Distribution lists
+
+
+ Documents
+
+
+ Email and CAD call intake
+
+
+ Files and attachments
+
+
+ Forms
+
+
+ Groups & Stations
+
+
+ Hardware location tracking
+
+
+ Import and migration planning
+
+
+ Inbox
+
+
+ Incident command and accountability
+
+
+ Incident reports
+
+
+ Indoor maps
+
+
+ Inventory
+
+
+ Issue Equipment
+
+
+ Inventory counts, expiry and alerts
+
+
+ Inventory purchasing
+
+
+ Inventory Status
+
+
+ Transfer Inventory
+
+
+ Manage Invites
+
+
+ Accounts Receivable Aging
+
+
+ Invoices
+
+
+ Live Routing
+
+
+ Logs
+
+
+ Maintenance policies and approvals
+
+
+ Maintenance history and reports
+
+
+ Map Layers
+
+
+ Mapping
+
+
+ Module settings
+
+
+ My Certifications
+
+
+ My Demographic Response
+
+
+ New Bid
+
+
+ New Calendar Event
+
+
+ New Call
+
+
+ New Checklist
+
+
+ New Contact
+
+
+ New Contract
+
+
+ New Deployment
+
+
+ Upload Document
+
+
+ New Group
+
+
+ New Invoice
+
+
+ New Log
+
+
+ New Note
+
+
+ New Protocol
+
+
+ New Training
+
+
+ New Unit
+
+
+ New Work Order
+
+
+ New Workflow
+
+
+ Notes
+
+
+ Notification rules
+
+
+ Online Payment Settings
+
+
+ Sent Messages
+
+
+ California Pay Data Reporting
+
+
+ Permissions
+
+
+ Personnel
+
+
+ Personnel roles
+
+
+ Points of Interest
+
+
+ Preventive maintenance
+
+
+ My Profile
+
+
+ Protected workflows
+
+
+ Protocols
+
+
+ Rate Cards
+
+
+ Rate Schedules
+
+
+ Records analytics
+
+
+ Record definitions and templates
+
+
+ Disclosure requests
+
+
+ Evidence capture and provenance
+
+
+ Record exports and templates
+
+
+ Legal holds
+
+
+ Hydrants and water sources
+
+
+ Inspections
+
+
+ Investigations
+
+
+ Occupancies and preplans
+
+
+ Permits
+
+
+ Saved record reports
+
+
+ Reporting submissions
+
+
+ Records
+
+
+ Records Dashboard
+
+
+ Records Settings
+
+
+ Reports
+
+
+ Resource Cost Profiles
+
+
+ Responder application
+
+
+ Routes
+
+
+ Run cards and recommendations
+
+
+ Security and session policy
+
+
+ Setup help and support
+
+
+ Shared links
+
+
+ Shifts
+
+
+ Single sign-on and provisioning
+
+
+ Base plans and capacity
+
+
+ Text call intake and commands
+
+
+ Trainings
+
+
+ Two-Factor Authentication
+
+
+ Unit application
+
+
+ Unit Staffing
+
+
+ Unit types
+
+
+ Units
+
+
+ User-defined fields
+
+
+ Voice
+
+
+ Weather zones and alerts
+
+
+ Work Orders
+
+
+ Workflow Runs
+
+
+ Workflows
+
+
+ Workforce
+
+
+ Annual Pay Facts
+
+
+ Compensation Profiles
+
+
+ Workshifts
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Buying does not enroll the department. Review MFA, recovery, migration and integration behavior; this is not a compliance certification.
+
+
+ Planned until product and runtime availability are verified. Deterministic Setup Wizard, Setup Report and Admin Assist do not require an AI purchase.
+
+
+ Certifications and Deployment Finance do not require this add-on. Pay-data reporting additionally needs ADP Enabled; online payments require provider setup. No reimbursement or savings are guaranteed.
+
+
+ Review seats, supported clients and channel setup. PTT does not provide phone dispatch alerts or certify radio replacement.
+
+
+ Checklists do not require this add-on. Maintenance needs its module, permissions and active entitlement. Historical evidence and hold release follow owning-module rules.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Purchase and enrollment are separate. Review MFA, key recovery and effects on search, exports, integrations and notifications before enrollment.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Checklists do not require Readiness Pro. Maintenance requires the add-on, module access and reviewed repair and approval procedures.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and Advanced Data Protection in the Enabled state. Review regional applicability and protected workforce access.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review supported clients, channel membership and current subscription quantities. Push-to-Talk is distinct from phone voice alerts and department radio requirements.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Checklists do not require Readiness Pro. Maintenance requires the add-on, module access and reviewed repair and approval procedures.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ An administrator enrolls the department and verifies its recovery arrangements.
+
+
+ Ask for an explanation of a configuration finding when the conversational feature is available.
+
+
+ Prepare an event standby invoice or review documented mutual-aid costs.
+
+
+ A SAR coordinator uses a team channel during a training exercise.
+
+
+ A failed apparatus check leads to an explicitly created maintenance work order.
+
+
+ Review the current member's sessions and account security controls.
+
+
+ Manually create a user account in the department
+
+
+ Additional protection and scoped access for cataloged sensitive department content.
+
+
+ Planned summaries, drafts, knowledge assistance and optional Admin Assist conversation.
+
+
+ Invoicing, payments, rates, contracts, bids, MARS reimbursement, workforce and field costing.
+
+
+ Voice channels for crew communication in supported Resgrid clients.
+
+
+ Maintenance, work orders, preventive tasks, corrective work, approvals and safety holds.
+
+
+ Use supported APIs and MCP with authorized credentials and permissions.
+
+
+ Closed and historical calls
+
+
+ Review recorded administrative changes and available source details.
+
+
+ Priced estimates for customer contacts and contracts
+
+
+ Shared display clients show the configured resource and call picture.
+
+
+ Legal name, remit-to address and tax registrations printed on invoices
+
+
+ CFAA cost recovery readiness: agency, F-5 resources, annual rates and agreements
+
+
+ F-42 and expense claims to prepare, validate and hand off to the MARS portal
+
+
+ Salary Survey, Attachment A, Administrative Rate, Rate Letter and Special Equipment snapshots
+
+
+ Observed MARS invoices, local approval and payment reconciliation
+
+
+ Events, meetings and trainings you can sign up for
+
+
+ Call types, priorities, email import and dispatch settings
+
+
+ Maintain reusable call information and note templates.
+
+
+ Maintain the department's call classifications and priorities.
+
+
+ View calls and dispatches
+
+
+ Expiring and expired certifications for people and units
+
+
+ Enforcement mode, grace period and expiry notifications
+
+
+ The department's certification catalog and template gallery
+
+
+ Real-time department chat
+
+
+ Review supported chatbot platforms, account linking, limits and operational actions.
+
+
+ Configure supported check-in targets and escalation behavior.
+
+
+ Review expected, completed, skipped and overdue checks.
+
+
+ Assign recurring checks and review due occurrences.
+
+
+ Start from a checklist template
+
+
+ Apparatus, station and readiness checklists
+
+
+ Prepare and explicitly run tests of configured channels.
+
+
+ Insurance, workers' comp, SAM, licences and bonds with expiry alerts
+
+
+ Send a message, poll or callback request
+
+
+ Manage contact categories
+
+
+ People and organizations outside the department
+
+
+ Service contracts, document requirements and compliance
+
+
+ Internal loaded cost and margin for bids, calls and deployments
+
+
+ Manage supported custom map content for the department.
+
+
+ Configure status names, base meanings and supported behavior.
+
+
+ Department home: status, staffing and activity
+
+
+ Advanced Data Protection enrollment and policies
+
+
+ Department profile, address, API keys and module settings
+
+
+ Switch between the departments you belong to
+
+
+ Create a deployment from an open RMS mutual-aid order
+
+
+ Deployments, rosters, daily time reports and expenses
+
+
+ Dispatchers use the dispatch interface to review calls and resources and explicitly select recipients.
+
+
+ Dispatch behaviour and notification settings
+
+
+ Maintain reusable recipient lists for supported communication flows.
+
+
+ Upload and share documents
+
+
+ Configure supported email and CAD import formats and source credentials.
+
+
+ Attach and maintain files through their owning documents and records.
+
+
+ Custom call and dispatch forms
+
+
+ Department groups and stations
+
+
+ Associate supported tracking devices with department resources.
+
+
+ Plan source ownership and review existing import tools before copying data.
+
+
+ Your messages inbox
+
+
+ Command tools organize incident roles and accountability for authorized commanders.
+
+
+ Prepare incident reports linked to authorized call evidence.
+
+
+ Organize indoor map references and zones where supported.
+
+
+ Inventory for stations and units
+
+
+ Issue or return equipment to personnel
+
+
+ Review stock counts, expiry and configured inventory alerts.
+
+
+ Manage suppliers, purchase orders and receipts.
+
+
+ On-hand, low-stock and expiring inventory
+
+
+ Move inventory between locations
+
+
+ Send email invites so people create their own accounts
+
+
+ Outstanding invoice balances by age
+
+
+ Customer invoices and payments
+
+
+ Routing and directions for active resources
+
+
+ Run, training, work and meeting logs
+
+
+ Configure supported work-order policies and approval requirements.
+
+
+ Review maintenance work, recorded holds and repair history.
+
+
+ Manage map layers
+
+
+ Large map with layers, personnel and units
+
+
+ Choose which optional modules appear and operate for the department.
+
+
+ Your own certification records
+
+
+ Your voluntary self-identification for California pay data reporting
+
+
+ Draft a bid for a customer
+
+
+ Create a calendar event
+
+
+ Create and dispatch a new call
+
+
+ Author a checklist definition
+
+
+ Add a person or organization contact
+
+
+ Create a service contract for a customer
+
+
+ Create a deployment finance wrapper
+
+
+ Upload a new document
+
+
+ Create a group or station
+
+
+ Draft an invoice for a customer
+
+
+ Create a run report, training log or work log
+
+
+ Post a department note
+
+
+ Create a dispatch protocol
+
+
+ Create a training with optional quiz
+
+
+ Add an apparatus, vehicle or team
+
+
+ Open a maintenance work order
+
+
+ Create an automation workflow
+
+
+ Department notes: small bits of shared information
+
+
+ Select events, recipients and conditions for administrative notifications.
+
+
+ Connect your Stripe account to collect invoice payments online
+
+
+ Messages you sent
+
+
+ CRD pay data report runs: snapshots, aggregation, validation, export and the portal worksheet
+
+
+ Configure action permissions, roles and supported group restrictions.
+
+
+ People in the department, status and staffing
+
+
+ Organize department-defined role assignments.
+
+
+ Manage map points of interest
+
+
+ Configure recurring maintenance work and due tasks.
+
+
+ View and edit your own profile, contact methods and notifications
+
+
+ Configure approved releases to supported external workflow destinations.
+
+
+ Dispatch protocols and procedures
+
+
+ Billing rates for units, personnel and fees
+
+
+ Contractor rate tables: certifications, crews, vehicles, equipment, premiums and policies
+
+
+ Review supported aggregate response, workload and readiness reports.
+
+
+ Configure record forms, lifecycle, numbering and review requirements.
+
+
+ Manage disclosure scope, redaction and release approval.
+
+
+ Capture supported source evidence from the owning record workflow.
+
+
+ Configure supported export templates and review their runs.
+
+
+ Place and release holds through the authorized Records lifecycle.
+
+
+ Maintain hydrant and water-source records and their review history.
+
+
+ Schedule and record authorized inspection work and corrections.
+
+
+ Manage authorized investigation records and their controlled workflow.
+
+
+ Maintain premises, contacts, hazards and review metadata.
+
+
+ Manage supported permit records and lifecycle.
+
+
+ Create reusable report selections over authorized record data.
+
+
+ Prepare and reconcile supported reporting submissions from an authorized incident report.
+
+
+ Records queue: run reports, training and operational records
+
+
+ Records due, submissions and quality at a glance
+
+
+ Lifecycle, numbering, search, retention and visibility settings for Records
+
+
+ Generate reports from department data
+
+
+ Depreciation, fuel, maintenance and fixed costs per unit or asset
+
+
+ Individual members use the supported Responder client for their account, availability, calls and notifications.
+
+
+ Manage configured routes and supported route assignments.
+
+
+ Configure matching rules, resource requirements and supported dispatch recommendations.
+
+
+ Configure supported MFA, password, session and network restrictions.
+
+
+ Resume orientation and review current configuration evidence.
+
+
+ Configure supported shared views and links.
+
+
+ Shift signups, recurring shifts and trades
+
+
+ Configure supported identity providers and provisioning.
+
+
+ Review current plan allowances and authorized subscription options.
+
+
+ Configure source numbers, parsing and supported inbound text actions.
+
+
+ Trainings, study guides and procedures
+
+
+ Set up or manage two-factor sign-in
+
+
+ A shared unit client represents an apparatus or team rather than an individual member.
+
+
+ Assign personnel to units
+
+
+ Configure apparatus and resource types and their supported status behavior.
+
+
+ Apparatus, vehicles and teams
+
+
+ Define additional fields for supported forms and records.
+
+
+ Voice channels and push-to-talk
+
+
+ Configure monitored zones and weather alert processing.
+
+
+ Maintenance and repair work orders
+
+
+ Workflow execution history
+
+
+ Automations triggered by department events
+
+
+ Employer identity, establishments, workers, employments and job assignments
+
+
+ W-2 earnings and hours per employment for pay data reporting, with CSV import
+
+
+ Employee, role-default and department-default compensation with pay and employer-cost components
+
+
+ Configure repeating workforce schedules supported by Workshifts.
+
+
+ Keep personal account recovery distinct from department-wide settings.
+
+
+ Control protected content disclosure and recovery through the department protection lifecycle.
+
+
+ Help explain approved evidence and prepare drafts for human review when released.
+
+
+ Connect administrative commercial work to the department activities it supports.
+
+
+ Coordinate field teams through configured voice channels.
+
+
+ Give equipment defects an owner and a recorded repair and return-to-service review.
+
+
+ Connect approved systems without placing credentials in setup examples.
+
+
+ Identify what changed and who should verify the effect.
+
+
+ Choose display refresh, location age and visibility appropriate to a station screen.
+
+
+ Reduce repeated entry while keeping dispatch decisions explicit.
+
+
+ Use consistent reporting and run-card matching terms.
+
+
+ Keep automated access and confirmations under administrator control.
+
+
+ Review lone-worker and response follow-up with approved local procedures.
+
+
+ Find missing recorded checks without treating a report as safety certification.
+
+
+ Make recorded equipment and procedure checks visible to their owners.
+
+
+ Collect observed test evidence; registration alone does not prove delivery.
+
+
+ Give responders useful reference layers with an identified owner and update process.
+
+
+ Use terminology familiar to the department while preserving automation meaning.
+
+
+ Give dispatch personnel a focused operating surface alongside web administration.
+
+
+ Keep audience ownership explicit and review recipients before sending.
+
+
+ Review parsing, routing and observed integration failures before activation.
+
+
+ Keep reference material with its owner, permissions and retention policy.
+
+
+ Review device ownership, stale-position behavior and fallback sources.
+
+
+ Avoid duplicate resources and verify resulting configuration in Setup Report.
+
+
+ Prepare command structures and access before an exercise or response.
+
+
+ Review source completeness before finalization or external submission.
+
+
+ Keep building references available to authorized users without inferring safe routes.
+
+
+ Identify inventory data and supplies that need owner follow-up.
+
+
+ Connect replenishment to recorded stock needs and authorized receipt.
+
+
+ Make authority and repair completion requirements explicit.
+
+
+ Support accountable return-to-service review through the owning workflow.
+
+
+ Reduce navigation clutter while understanding retained data and add-on prerequisites.
+
+
+ Reduce missed follow-up and review unnecessary message volume.
+
+
+ Review who can perform sensitive work and which resources they may see.
+
+
+ Describe responsibility consistently without assuming that a role proves qualification.
+
+
+ Plan equipment upkeep and track corrective responsibility.
+
+
+ Keep protected-data egress scoped, reviewed and auditable.
+
+
+ Use measured source data with its scope and completeness limits.
+
+
+ Fit reporting to approved local procedures while preserving built-in definitions.
+
+
+ Assign review ownership and verify the material approved for release.
+
+
+ Preserve evidence context and access restrictions without copying it into setup guidance.
+
+
+ Keep release destinations, protected access and output handling explicit.
+
+
+ Retain affected evidence while a hold remains active.
+
+
+ Identify records needing verification without claiming current flow or availability.
+
+
+ Track administrative follow-up against configured inspection procedures.
+
+
+ Keep case responsibility and access separate from general department visibility.
+
+
+ Keep site knowledge owned and current; recorded hazards do not certify safety.
+
+
+ Assign review responsibility; a software state is not a hazardous-work safety clearance.
+
+
+ Make repeatable administrative reviews easier.
+
+
+ Review destination requirements and actual submission outcomes.
+
+
+ Separate member device setup from department configuration and verify each member's channels.
+
+
+ Prepare recurring route information with current source ownership.
+
+
+ Review candidate coverage before enabling operational use.
+
+
+ Review lockout and recovery risks with an enrolled administrator.
+
+
+ Keep learning, configuration and verification as separate steps.
+
+
+ Review exposed data and link access before distribution.
+
+
+ Review identity mapping, local fallback and recovery before enforcing SSO.
+
+
+ Choose capacity for actual department needs without inferring prices or terms.
+
+
+ Make approved inbound sources and their operational effects explicit.
+
+
+ Review device identity, assigned crew and unit communications together.
+
+
+ Group comparable resources without assuming staffing or qualification.
+
+
+ Collect the information the department actually needs with appropriate classification.
+
+
+ Review alert coverage and automatic-message settings before use.
+
+
+ Review schedule ownership and local time separately from dispatch eligibility.
+
+
+ Department Suppress Staffing Info / Enable Supress Staffing
+
+
+ Department Suppress Staffing Info / Staffing Levels To Supress
+
+
+ Dispatch Recommendation Config / Eta Shortlist Size
+
+
+ Dispatch Recommendation Config / Include Stale Locations
+
+
+ Dispatch Recommendation Config / Max Location Age Seconds
+
+
+ Dispatch Recommendation Config / Max Radius Meters
+
+
+ Dispatch Recommendation Config / Move Up Recommendations Enabled
+
+
+ Dispatch Recommendation Config / Personnel Max Location Age Seconds
+
+
+ Dispatch Recommendation Config / Rest Period Minutes
+
+
+ Dispatch Recommendation Config / Unit Minimum Staffing Level
+
+
+ Dispatch Recommendation Config / Use Routed Eta
+
+
+ Group Dispatch Scope Config / Department Wide Role Ids
+
+
+ Group Dispatch Scope Config / Enabled
+
+
+ New Call Field Policy / Rules
+
+
+ New Call Field Rule / Key
+
+
+ New Call Field Rule / Required
+
+
+ New Call Field Rule / Visible
+
+
+ Personnel List Status Order / Status Id
+
+
+ Personnel List Status Order / Weight
+
+
+ Personnel List Status Order Setting / Orders
+
+
+ Records Disclosure Config / Default Redaction Profile
+
+
+ Records Disclosure Config / Release Approver User Id
+
+
+ Records Disclosure Config / Statutory Clock Days
+
+
+ Records Numbering Config / Include Year
+
+
+ Records Numbering Config / Number Assignment
+
+
+ Records Numbering Config / Per Group Sequence
+
+
+ Records Numbering Config / Reset Yearly
+
+
+ Records Numbering Config / Sequence Width
+
+
+ Records Retention Override / Applies From
+
+
+ Records Retention Override / Definition Key
+
+
+ Records Retention Override / Retention Years
+
+
+ Records Retention Policy / Department Default Years
+
+
+ Records Retention Policy / History
+
+
+ Records Retention Policy / Last Changed By User Id
+
+
+ Records Retention Policy / Last Changed On
+
+
+ Records Retention Policy / Overrides
+
+
+ Records Retention Policy Version / Effective On
+
+
+ Records Retention Policy Version / Policy
+
+
+ Records Search Config / Include Legacy History
+
+
+ Records Search Config / Index Narrative
+
+
+ Unit Status Threshold / Alert Seconds
+
+
+ Unit Status Threshold / Base Type
+
+
+ Unit Status Threshold / Warn Seconds
+
+
+ Unit Status Thresholds / Thresholds
+
+
+ Unit Type Call Status Override / Dispatch Status
+
+
+ Unit Type Call Status Override / Release Status
+
+
+ Unit Type Call Status Override / Unit Type Id
+
+
+ Unit Type Call Status Override Setting / Overrides
+
+
+ Enables the configured staffing-level suppression in supported notification consumers; review reachability before changing it.
+
+
+ Existing staffing levels to suppress. A suppressed level is not proof that another channel reaches the member.
+
+
+ Number of straight-line candidates per requirement sent for routed ETA when enabled. The owning validator caps provider work.
+
+
+ Permit positions beyond the configured age limit in closest-unit selection, marked stale. Review the risk of outdated positions.
+
+
+ Exclude older unit positions from closest-unit candidates; zero removes the age limit. IncludeStaleLocations changes this behavior.
+
+
+ Maximum candidate distance in meters; zero removes the radius cap. This is not a response-time or route-safety guarantee.
+
+
+ Run the station coverage move-up pass after selection. Recommendations remain subject to approved local dispatch procedures.
+
+
+ Maximum age of personnel positions for closest-unit candidate selection; zero removes the age limit.
+
+
+ Deprioritize recently dispatched resources for this duration; zero disables rotation. This does not infer fatigue or medical fitness.
+
+
+ Minimum configured unit staffing level for recommendation eligibility; zero disables the gate. Units without defined seats pass, and run cards may override it.
+
+
+ Re-rank shortlisted candidates using provider travel estimates. The operational path can make external provider calls; Admin Assist does not.
+
+
+ Existing roles allowed department-wide dispatch views while group scoping is enabled. This changes view scope, not licensing or operational qualification.
+
+
+ Limit supported dispatch views to the member's group subtree. Department administrators and configured department-wide roles keep department-wide access.
+
+
+ Per-field visibility and requiredness for optional call-creation fields. Unconfigured fields remain visible and optional.
+
+
+ One supported built-in call-field key. Name, nature, priority and type cannot be removed through this policy.
+
+
+ Whether a visible optional field must be supplied. Review imports and each supported client before making a field mandatory.
+
+
+ Whether the optional call field is shown on supported creation surfaces. Hidden fields cannot be required.
+
+
+ Existing personnel-status identifier whose list position is being configured.
+
+
+ Relative list order for this status. Confirm all configured statuses remain represented.
+
+
+ Ordered status weights for supported personnel lists. This does not set availability or dispatch priority.
+
+
+ Default redaction profile in the owning disclosure workflow. Review the actual proposed release before approval.
+
+
+ Authorized member responsible for disclosure release approval. Selecting an approver does not grant missing permissions or protected-data access.
+
+
+ Configured disclosure review clock. Verify local obligations with the responsible owner; the default does not establish a legal deadline.
+
+
+ Include the year between the record prefix and sequence number.
+
+
+ Choose when numbers are assigned for definitions using department defaults. Review existing references before changing numbering behavior.
+
+
+ Use separate station/group sequences. This changes numbering, not record visibility.
+
+
+ Restart record sequences each calendar year in the department time zone.
+
+
+ Zero-padded sequence width for definitions using department defaults. The Records editor validates the supported width.
+
+
+ Prospective boundary for revisions eligible for the override, evaluated by the Records lifecycle.
+
+
+ Stable record-definition key to which this override applies. Display names do not identify a retention policy.
+
+
+ Years retained under this definition override; zero means permanent. Holds and prospective policy resolution still apply.
+
+
+ Department retention for standard record classes. Zero means permanent; protected classes, prior policy and holds can retain records longer.
+
+
+ Prior policy versions retained by the owning lifecycle so current changes do not silently rewrite historical retention.
+
+
+ Recorded policy-change actor. It is not an editable retention rule and is not exposed as raw identity in this reference.
+
+
+ Policy effective timestamp used with prior policy versions. It is not the record's retention expiry date.
+
+
+ Definition-specific prospective retention overrides. Use the Records workflow and its confirmations; Admin Assist never purges records.
+
+
+ Effective timestamp of a stored historical retention policy version.
+
+
+ Historical policy snapshot used to resolve retention for older revisions. Never edit this as an ordinary preference.
+
+
+ Include supported legacy personnel and unit logs in the Records search scope. Source permissions still apply.
+
+
+ Include unprotected narrative in search. Advanced Data Protection enrollment withdraws narrative indexing; this preference cannot override protection.
+
+
+ Seconds in this status before a higher-priority highlight; zero disables it. Highlighting does not send a page or change status.
+
+
+ Base status meaning for a threshold, independent of custom status names and colors.
+
+
+ Seconds in this status before a warning highlight; zero disables it. An alert at or before this threshold makes the row alert-only.
+
+
+ Board highlighting thresholds grouped by base status meaning. An empty list disables highlighting.
+
+
+ Status applied to this unit type on dispatch; minus one leaves it unchanged.
+
+
+ Status applied to this unit type on release; minus one leaves it unchanged.
+
+
+ Existing unit type receiving this override. A unit type name is not a qualification or staffing clearance.
+
+
+ Per-unit-type dispatch and release status overrides. The owning consumer resolves these before department defaults.
+
+
+ Choose the areas your department uses
+
+
+ Configure and verify
+
+
+ Follow up on findings
+
+
+ Use Settings Reference and Change History
+
+
+ Start or resume setup
+
+
+ Understand optional add-ons
+
+
+ Administrators selected by this policy who lack MFA enrollment
+
+
+ Department members and authorized consumers of this setting.
+
+
+ Saved call ID
+
+
+ Capacity headroom
+
+
+ Enter proposed total personnel and unit counts, including existing resources. This does not add, remove or purchase anything.
+
+
+ Preview plan capacity
+
+
+ A preview needs no rollback. Any later resource or subscription change follows its owning workflow.
+
+
+ Positive headroom is remaining allowance; a negative value exceeds the observed base-plan limit. Entity plans share one allowance across personnel and units. Add-on seats, storage, provider quotas and prices are not included.
+
+
+ Billing observations can change. Existing plan enforcement remains authoritative when adding resources. No purchase, reservation, resource deletion or entitlement change is performed.
+
+
+ Personnel newly selected
+
+
+ Personnel route attempts, including direct duplicates
+
+
+ Route selection is not channel eligibility or delivery. Profiles, suppression, registrations, provider availability and other recipient gates can prevent a send. Review the authorized Calls and Communication Tests screens; this preview never dispatches or tests a channel.
+
+
+ Dispatched groups with empty-shift fallback
+
+
+ Use a saved call as a route scenario. Enter its numeric ID from the Calls screen and choose all three proposed routing options. Current settings and membership are read afresh; nothing is sent or saved.
+
+
+ Distinct personnel selected
+
+
+ Preview dispatch routing
+
+
+ Personnel no longer selected
+
+
+ Call scenarios checked
+
+
+ Compares direct, group, role and unit-crew/group routes through the broadcaster’s recipient resolver. Repeated direct dispatch rows remain separate attempts; expanded routes deduplicate. Unit device, printer and external routes are outside these personnel counts. This does not propose group-scope or permission changes.
+
+
+ The explicit UTC time selects resolved shifts, including approvals, trades and overnight windows. Call routes, group/role membership and unit crews are current observations, not reconstructed historical assignments. Inputs are reread to detect changes during the preview.
+
+
+ Effect
+
+
+ Disabling the map override on the owning screen removes its saved style and token. Re-enabling requires re-entering those values.
+
+
+ Complete authorized map evidence could not be read. Marker effects are unknown; an unavailable source is not a zero count.
+
+
+ TTL expires location pings; a saved status location can remain visible. A shorter TTL does not necessarily remove a marker.
+
+
+ Personnel or units checked
+
+
+ Locations and statuses are read during this request and evaluated at the report time. Counts can change with new pings; historical replay and other map consumers are not included.
+
+
+ Marker counts use the v4 map selection rules and your current location permissions. They do not predict another member’s access or change location permissions.
+
+
+ Markers newly visible
+
+
+ Markers no longer visible
+
+
+ Scope 1 includes department admins and the managing member; scope 2 also includes group admins without double-counting them. Hidden current members remain in scope. This is enrollment metadata; session enforcement, supported recovery factors, other MFA policies and SSO behavior require separate verification. The owning screen requires the managing member and the current admin to enroll before enforcement can be enabled.
+
+
+ Module
+
+
+ Stored rows in the module’s primary table
+
+
+ Hide this module
+
+
+ Preview the legacy module navigation switches. Enabling a switch does not grant permissions, enroll an add-on or complete feature setup. Calls, personnel and units remain core areas.
+
+
+ Memberships whose module navigation changes
+
+
+ Current memberships with the module navigation entry enabled
+
+
+ Preview a module switch
+
+
+ Stored rows behind a hidden module entry
+
+
+ Menu counts cover current department memberships, including hidden members. They describe the shared web navigation gate, not successful sign-in, each member’s visible records or mobile clients. Content counts cover only primary Messages, Shifts, Documents, CalendarItems, Notes and Trainings rows; they include retained or expired rows. Mapping and Reports aggregate other sources; Logs/Records and Inventory have multiple data models. Their content totals remain unknown until the corresponding adapters are available. The licensed maintenance, checklist and business switches need their own entitlement-aware preview.
+
+
+ A saved switch affects navigation after its owning settings cache and page refresh. Hiding a menu does not delete data, revoke an existing API permission or prove that a worker stops. Verify relevant consumers and scheduled work separately before relying on a switch as an operational shutdown.
+
+
+ This preview reads current evidence and changes values only in memory. Use the owning screen to make a change.
+
+
+ Host broadcast gate blocks this department (1 = yes)
+
+
+ Counts use the same ordinary notification preference/contact gate as the sender. A grandfathered verification value is allowed by that gate. Missing profiles and staffing outside this department widen the range. Email addresses, phone numbers, device tokens and staffing notes are not read. Address/device validity, provider availability, SMS segmentation/retries, chat/voice and IC-app delivery remain unverified. Zero to the displayed upper bound is an ordinary channel-handoff estimate, not a device-message count, delivery guarantee or SMS bill.
+
+
+ Future window (days)
+
+
+ Email preference/contact gate — maximum members
+
+
+ Email preference/contact gate — minimum members
+
+
+ Assumed events per member in the entire window
+
+
+ Compare staffing suppression for a department-wide scenario. Enter the same number of ordinary notification events per current active member over the next 1–30 days. This is a declared scenario, not an observed event forecast.
+
+
+ Historical events sampled (not used in this scenario)
+
+
+ Current active members evaluated, including hidden members
+
+
+ Members with unavailable channel preferences
+
+
+ Unblocked members with none of these three channel gates enabled
+
+
+ Preview notification volume
+
+
+ Push preference gate — maximum members
+
+
+ Push preference gate — minimum members
+
+
+ Members potentially passing at least one channel preference/contact gate — maximum
+
+
+ Members passing at least one channel preference/contact gate — minimum
+
+
+ Assumed ordinary events per member in the window
+
+
+ The sample contains current non-deleted, non-disabled members, including hidden members, and is bounded. Event counts are your assumption across the full future window; current membership, preferences and staffing are held constant. This does not resolve notification-rule audiences, plan-limited recipient expansion, event-specific conditions, Calendar/Training overrides or historical recipients. No event history was sampled.
+
+
+ SMS preference/contact gate — maximum members
+
+
+ SMS preference/contact gate — minimum members
+
+
+ Members whose suppression cannot be determined
+
+
+ Proposed: apply the currently configured staffing suppression list
+
+
+ Members blocked by a verified staffing or host gate
+
+
+ The hypothetical change only toggles the existing staffing suppression list in memory. Actual sends use their current membership and suppression caches plus fresh provider gates, so a later send can differ. Review the list on the owning screen and run an authorized Communication Test after a real change; this preview never sends, saves or changes staffing.
+
+
+ Possible ordinary channel handoffs in the window — upper bound
+
+
+ Possible ordinary channel handoffs in the window — lower bound
+
+
+ Declared future window in days from this evaluation
+
+
+ Proposed audience
+
+
+ Department administrators
+
+
+ Department and group administrators
+
+
+ Department administrators and selected roles
+
+
+ Everyone
+
+
+ Members allowed at least one evaluated action or target
+
+
+ Allowed member/action or member/target pairs
+
+
+ Newly allowed pairs
+
+
+ Choose a supported permission and its complete proposed policy. Current members, roles, groups and resource scopes are checked afresh. The preview does not save permissions or refresh access.
+
+
+ Restrict resource visibility to group scope
+
+
+ No longer allowed pairs
+
+
+ Preview a permission change
+
+
+ Restore the prior permission using Security. Information already viewed or actions already performed cannot be recalled.
+
+
+ Selected department roles
+
+
+ Current department members evaluated
+
+
+ Uses current memberships, including hidden members but excluding disabled and deleted memberships. Resource visibility uses the shared authorization decision, including target-group ancestors. Ungrouped people do not share a group. Counts measure the named permission gate, not complete end-to-end access: identity lockout, client claims, feature access, protected data, resource ownership and other gates still apply. More than 100,000 actor/target pairs, ambiguous memberships or unavailable source data produce unknown results.
+
+
+ Resource targets (or one department action)
+
+
+ Direct authorization reads, cached visibility matrices, claims and existing sessions can refresh at different times. Verify the affected web and mobile actions after saving; this preview neither refreshes sessions nor grants access.
+
+
+ Permission
+
+
+ Personnel headroom
+
+
+ Visible personnel markers for your current access
+
+
+ Total personnel
+
+
+ Preview a proposed value
+
+
+ Proposed: include assigned unit crews
+
+
+ Proposed: use on-duty shifts instead of group membership
+
+
+ Proposed: include unit station groups
+
+
+ Proposed value
+
+
+ Verified eligibility for deletion across all dependencies
+
+
+ Expired sample headers requiring further owning-lifecycle review
+
+
+ Default years for future standard-class revisions (0 = permanent)
+
+
+ Sample headers past their historical policy window
+
+
+ Sample covers both complete record populations (0 = no, 1 = yes)
+
+
+ Expired sample headers excluded by a known direct or preservation hold, casualty, rescue or exposure content
+
+
+ Compare a prospective Records retention default. Leave blank for the system class default; zero means permanent. Existing definition overrides and historical policies are preserved. This preview cannot delete data.
+
+
+ The owning Records policy preserves previous policy versions. A prospective default applies to future finalized revisions; older revisions keep the policy that applied when they became official. Definition overrides remain in force. Restricted classes remain permanent unless an explicit authorized override applies. This is policy behavior, not a legal retention recommendation.
+
+
+ Expired sample headers excluded because historical hold coverage is uncertain
+
+
+ The sample contains at most 250 unpurged headers of each parent record type in identifier order. Counts are not population estimates when the sample is incomplete. Open, amending, recently changed and unexpired headers are excluded. Known parent and preservation holds and permanent casualty/rescue/exposure content are excluded; possible historical period holds remain uncertain. Child analyses and their holds, revision integrity, disclosure productions, evidence retention, attachments and external storage, workflow/outbox activity, submissions and search erasure still require the owning retention checks. Remaining candidates are not authorization or proof of purge eligibility.
+
+
+ Preview retention policy
+
+
+ Retention and Advanced Data Protection have separate lifecycles. Changing a default or cancelling an add-on does not decrypt or erase protected content. The owning protection policy, recovery and offboarding process remain authoritative. This preview reads metadata only and neither changes protection nor calls a purge workflow.
+
+
+ Unpurged record headers in the sample
+
+
+ Proposed default retention years
+
+
+ Restore the previous value on its owning screen where supported. Delivered messages, deleted secrets and purged data cannot be recalled.
+
+
+ Stored active, unexpired department sessions sampled
+
+
+ Sessions that will actually require reauthentication
+
+
+ Members currently at or above the proposed next-session limit
+
+
+ Enabled SSO configuration rows (provider connection not tested)
+
+
+ Existing passwords satisfying the proposed length
+
+
+ Tracked member passwords crossing the owning expiry boundary now
+
+
+ Security-policy field
+
+
+ Compare one supported security-policy field using current member and session metadata. No credentials, recovery codes, device details or provider secrets are displayed. Current sign-in state can change after this evaluation.
+
+
+ Members without verified identity metadata
+
+
+ Current-generation managed sessions crossing the idle boundary now
+
+
+ Sampled sessions created on or after the host policy date gate
+
+
+ The owning atomic insert counts active, unexpired sessions in this department created on or after the host policy gate. Reaching the limit blocks a new managed session; it does not revoke existing sessions. Zero removes this department limit. The preview uses the same counted set, including rows that may later fail another validation gate, and cannot predict concurrent logins or future expiry.
+
+
+ Current active members in the bounded sample
+
+
+ Members subject to MFA completion at the supported sign-in gate
+
+
+ Members potentially requiring MFA enrollment — maximum
+
+
+ Members requiring MFA enrollment by this policy — minimum
+
+
+ The owning validator enforces a minimum of eight characters and its fixed digit, uppercase and lowercase requirements. This field changes supported future password changes; stored password hashes cannot reveal current length. The stored complexity preference does not disable that fixed validator, and this preview does not inspect passwords.
+
+
+ Effective minimum for supported password-change validators
+
+
+ The owning password-age check expires tracked dates only after the configured day boundary. Zero disables that check; missing dates are grandfathered rather than forced to expire. Counts do not imply that SSO users use a local password or that every client enforces expiry identically. Supported sign-in/password-change flows apply the actual enforcement.
+
+
+ Members subject to the RequireSso password-login gate
+
+
+ Stored / proposed policy value (boolean: 1 = enabled)
+
+
+ Preview sign-in and session policy
+
+
+ Proposed value
+
+
+ Working provider, account linkage and recovery access
+
+
+ Usable factors and recovery arrangements
+
+
+ TwoFactorEnabled is an enrollment indicator, not proof of a working factor or recovery path. The supported policy gate requires completed Resgrid MFA for both password and SSO sign-in. Administrator-only MFA requirements remain separate and may still apply when this field is off. Review authenticator/recovery setup with affected members before enforcement; the preview does not authenticate them.
+
+
+ The RequireSso gate blocks password sign-in only when an SSO configuration is enabled. With no enabled provider, the owning service keeps its safety valve. Enabled does not prove IdP connectivity, correct claims, member linkage or emergency recovery. Provider AllowLocalLogin and client-specific gates are separate and can further restrict access. Verify a working alternate administrator session and recovery procedure before changing policy.
+
+
+ This is a bounded metadata snapshot of current members, including hidden members. It compares one field in memory through decisions shared with the owning consumers. Other sign-in, identity, enrollment, credential and source-availability checks still apply. No password hash, factor secret, IP address or session ticket is read; no session is revoked, refreshed or created.
+
+
+ Host session-policy date gate is active now (1 = yes)
+
+
+ Idle timeout applies only to managed sessions created on or after the configured host policy date gate. A blank/invalid gate means this department timeout is not enabled by that consumer; older sessions are excluded. Counts use stored last activity, which can lag because activity writes are throttled. Credential cutoff, generation, expiry, current request claims and tracking deployment determine actual reauthentication. Zero disables this department-specific idle check; it does not disable normal session expiry.
+
+
+ RequireSso set without an enabled provider (1 = safety valve applies)
+
+
+ Members without a tracked password-change date
+
+
+ Shared entity headroom
+
+
+ Roster simulation time (UTC; within seven days of now)
+
+
+ Configuration changed. Use Verify again to refresh the report, then review your proposal before previewing it.
+
+
+ Observed personnel whose displayed status changes
+
+
+ Complete authorized status evidence is unavailable. No zero-change conclusion can be drawn.
+
+
+ Proposed markers using a status location
+
+
+ Distinct personnel with an observed status in either projection
+
+
+ Compares the owning one-hour automatic-availability filter at the report time, with its one-year history bound. Hidden, disabled and deleted members are outside this query. Members with no status in either projection are outside the sample. This does not quantify shift, unit-crew or staffing-level automation.
+
+
+ Standing-by statuses in the observed sample
+
+
+ Automatic availability affects the next supported status read after the one-hour cutoff; the preview does not write a new status or prove physical availability. New status updates can change these counts.
+
+
+ Setting value (Boolean: 0 = no, 1 = yes)
+
+
+ Actual successful inbound acceptance
+
+
+ Enters the command branch before identity checks (0 = no, 1 = yes)
+
+
+ Enters the call-import branch (0 = no, 1 = yes)
+
+
+ Choose the provider path actually used by your department and a test sender number. Compare the complete proposed text-call and command switches against current source patterns. No text is received or sent.
+
+
+ Provider path
+
+
+ Matches a configured dispatch source pattern (0 = no, 1 = yes)
+
+
+ Preview a text sender scenario
+
+
+ Proposed: enable text calls
+
+
+ Proposed: enable text commands
+
+
+ Text settings are not uniform provider enforcement. The current SignalWire path reads both switches and treats unmatched senders as dispatch sources when commands are disabled. The Twilio legacy path classifies dispatch senders by patterns without consulting these two switches; its chatbot path has separate controls. This preview does not establish accepted or rejected senders, verify numbers, validate a webhook, run a parser or send a page. Review the active provider before relying on a switch to stop intake.
+
+
+ Sender scenarios evaluated
+
+
+ This is one routing scenario after department resolution and the plan gate. It does not establish number ownership, the active SMS department, supported plan, authenticated webhook, verified sender identity, chatbot permissions, opt-out exceptions, parser success or call delivery. Twilio chatbot and master-number paths, email, CAD and API imports are outside this evaluator. A zero call-branch value may still permit a command or opt-out response. The source number is used only for this request; the returned reference is masked. No historical acceptance rate is inferred.
+
+
+ Test sender number
+
+
+ Twilio legacy text path
+
+
+ Verify the owning consumer after saving; session, cache and client refresh behavior can differ.
+
+
+ Unit headroom
+
+
+ Visible unit markers for your current access
+
+
+ Total units
+
+
+ These figures cover the listed checks only. Effects without a metric, including provider delivery and session enforcement, have not been quantified.
+
+
+ Return to Setup Report and verify current evidence. Communication tests must be reviewed and started explicitly.
+
+
+ Choose a change window and responsible verifier using approved local procedures. Verify again after saving; new source data can invalidate this preview.
+
+
+ BusinessOperations availability
+
+
+ Calendar availability
+
+
+ Calendar menu name
+
+
+ Checklists availability
+
+
+ Documents availability
+
+
+ Documents menu name
+
+
+ Inventory availability
+
+
+ Inventory menu name
+
+
+ Logs availability
+
+
+ Logs menu name
+
+
+ Maintenance availability
+
+
+ Maintenance menu name
+
+
+ Mapping availability
+
+
+ Mapping menu name
+
+
+ Messaging availability
+
+
+ Messaging menu name
+
+
+ Notes availability
+
+
+ Notes menu name
+
+
+ Reports availability
+
+
+ Reports menu name
+
+
+ Shifts availability
+
+
+ Shifts menu name
+
+
+ Training availability
+
+
+ Training menu name
+
+
+ Controls availability of business operations. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Controls availability of calendar events. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for calendar events in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of checklists. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Controls availability of shared documents. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for shared documents in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of inventory. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for inventory in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of legacy logs. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for legacy logs in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of maintenance and work orders. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for maintenance and work orders in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of maps and location views. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for maps and location views in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of messages and announcements. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for messages and announcements in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of notes. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for notes in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of reports. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for reports in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of shift scheduling. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for shift scheduling in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of training. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for training in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Emergency management and response
+
+
+ EMS and ambulance
+
+
+ Fire
+
+
+ Hazardous materials response
+
+
+ Industrial response
+
+
+ Mental health and mobile crisis
+
+
+ Multi-agency and mutual aid
+
+
+ Search and rescue
+
+
+ Security and facilities
+
+
+ The pack can organize declared sites, personnel, supply expiry and continuity references. Shelter capacity, welfare needs, external agency availability, deployment conflicts and actual communications coverage are not yet measured by these checks. Review those sources with the response coordinator.
+
+
+ The pack can flag credential expiry, configured staffing gaps and stock/check metadata. It does not verify clinical scope, patient-care protocols, drug administration authority, medical equipment suitability or patient handover completion. Use the approved clinical and logistics systems with their responsible owners.
+
+
+ The pack can flag configured roster vacancies, qualifications, equipment checks and holds. It does not verify apparatus minimum staffing, command competence, local response standards or pre-incident plans. Have the responsible fire-service owner review these sources and the fallback plan.
+
+
+ The pack can flag recorded qualifications, overdue checks, expiring supplies and safety holds. It does not infer Hazmat response level, instrument calibration compliance, exposure clearance or protective-equipment suitability. Review actual approved requirements with the Hazmat program owner.
+
+
+ The pack can flag site-reference gaps, qualifications, equipment restrictions and supply expiry. Permit-to-work authority, process hazards, contractor clearance, site shutdown state and external plant alarms are not evaluated. The site response owner must verify those sources.
+
+
+ The pack can organize team coverage, protected access and current procedure references. After-hours referral ownership, crisis-service availability, clinical supervision and case handover are not yet measured. Confirm these with the responsible service owner without entering client narratives into setup.
+
+
+ The pack can organize shared-work areas, personnel and agreement references. External agency commitments, resource typing, cross-agency credentials, simultaneous assignments, cost eligibility and reimbursement acceptance are not verified. Confirm these with the participating agencies and finance owner.
+
+
+ The pack can flag configured roster gaps, credentials and overdue equipment checks. Search-sector coverage, terrain access, radio coverage, external resource location, missing-person case handling and mission suitability require their owning systems and a search-service reviewer.
+
+
+ The pack can review scoped resource visibility, configured shifts, credentials and check-in configuration. Post orders, lone-worker response arrangements, client deadlines and actual site access are not verified by these checks. Review them with the responsible operations owner.
+
+
+ Capability-gap tracking owner: Resgrid.Core. Sector-specific acceptance review is pending; these prompts are not approved local operating requirements.
+
+
+ Use approved local requirements. Missing external evidence remains unknown; this report does not certify operational safety.
+
+
+ Review activation rosters, volunteer onboarding, partner contacts and supplies.
+
+
+ Review qualification mix, ambulance checks, supply expiry and receiving contacts.
+
+
+ Review apparatus, qualified crew, run cards and mutual-aid arrangements.
+
+
+ Review locally approved qualifications, instrument checks, PPE and procedure review.
+
+
+ Review site coverage, escalation, equipment restrictions and approved local procedures.
+
+
+ Review clinician, peer and interpreter coverage, escalation contacts and restricted records.
+
+
+ Review agency-specific recipients, agreements, resource typing and cost documentation.
+
+
+ Review specialty qualifications, team availability, equipment checks and check-in arrangements.
+
+
+ Review site and post coverage, qualifications, check-in configuration and client deadlines.
+
+
+ Add Call Data
+
+
+ Add Personnel
+
+
+ Adjust Inventory
+
+
+ Amend Records
+
+
+ Approve Records
+
+
+ Approve Time Reports
+
+
+ Break Glass Protected Data
+
+
+ View personnel locations
+
+
+ View unit locations
+
+
+ Close Call
+
+
+ Command App Login
+
+
+ Configure Protected Data Egress
+
+
+ Contact Delete
+
+
+ Contact Edit
+
+
+ Contact View
+
+
+ Create Calendar Entry
+
+
+ Create calls
+
+
+ Create Document
+
+
+ Create Log
+
+
+ Create Message
+
+
+ Create notes
+
+
+ Create Record
+
+
+ Create Shift
+
+
+ Create Training
+
+
+ Create Workflow
+
+
+ Delete Call
+
+
+ Delete Log
+
+
+ Delete Record
+
+
+ Dispatch App Login
+
+
+ Edit Protected Call Data
+
+
+ Export Pay Data Reporting
+
+
+ Export Protected Data
+
+
+ Export Records
+
+
+ Finalize Records
+
+
+ Issue Inventory
+
+
+ Manage Bids
+
+
+ Manage Certification Setup
+
+
+ Manage Certifications
+
+
+ Manage Checklists
+
+
+ Manage Contracts
+
+
+ Manage Controlled Substances
+
+
+ Manage Department Data Protection
+
+
+ Manage Deployments
+
+
+ Manage Invoicing
+
+
+ Manage Mutual Aid Reimbursement
+
+
+ Manage Pay Data Reporting
+
+
+ Manage Record Definitions
+
+
+ Manage Record Disclosures
+
+
+ Manage Record Legal Hold
+
+
+ Manage Record Reports
+
+
+ Manage Routes
+
+
+ Manage Work Orders
+
+
+ Manage Workflow Credentials
+
+
+ Manage Workforce Compensation
+
+
+ Publish Record Definitions
+
+
+ Reassign Record Drafts
+
+
+ Records Prevention Admin
+
+
+ Remove Personnel
+
+
+ Review Records
+
+
+ Share Records Externally
+
+
+ Submit Records
+
+
+ Transfer Inventory
+
+
+ Use Calendar Sync
+
+
+ View All Work Orders
+
+
+ View Certifications
+
+
+ View Checklist Results
+
+
+ View Group Records
+
+
+ View units
+
+
+ View personnel
+
+
+ View Internal Costs
+
+
+ View Invoicing
+
+
+ View Legacy Records
+
+
+ View personal information
+
+
+ View Protected Call Data
+
+
+ View Protected Contact Data
+
+
+ View Protected Operational Data
+
+
+ View Protected Personnel Data
+
+
+ View Restricted Records
+
+
+ View custom field Fields
+
+
+ View Workflow Runs
+
+
+ View Workforce Compensation
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Controls the location visibility gate for each viewer and person. The preview counts access pairs, not current map markers, tracking consent or GPS availability.
+
+
+ Controls the location visibility gate for each viewer and unit. A group lock refers to the unit’s station and the owning group hierarchy, not any station a viewer can otherwise see.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Allows starting a call. The department-level action uses each member’s actual administrator state and personnel roles; later dispatch validation remains authoritative.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Allows creating a department note. The action does not grant access to protected note contents or another department.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Controls visibility of unit targets and their assigned stations. Ungrouped viewers and unassigned units do not share a group.
+
+
+ Controls visibility of personnel targets. A group lock can narrow target scope; administrators of a target group or its ancestors use the owning visibility policy.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Controls the personal-information permission gate. Protected fields still require their own current authorization and data protection grant.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Accessibility preferences
+
+
+ Authoritative source systems
+
+
+ Another administrator changed this profile. Your proposed values are still shown. Reload the current profile before saving again.
+
+
+ Approved continuity procedures
+
+
+ Approximate member count (optional)
+
+
+ Dispatch model
+
+
+ Enter existing numeric document IDs for approved policies in this department. Expired documents cannot be referenced. Saving verifies existence, not approval or suitability.
+
+
+ Enter existing numeric group IDs from this department. Saving adds another optional row.
+
+
+ One or more group or document references are invalid, expired or unavailable in this department. Check the references and try again.
+
+
+ Working languages
+
+
+ Participates in mutual aid
+
+
+ No
+
+
+ Operating hours
+
+
+ Approved qualification policies
+
+
+ Reference
+
+
+ Enter existing reference identifiers, not sensitive details. Saving adds another optional row.
+
+
+ Reload current profile
+
+
+ Save operating profile
+
+
+ Season ends (MM-DD, optional)
+
+
+ Season starts (MM-DD, optional)
+
+
+ Sites and service-area groups
+
+
+ Approved staffing policies
+
+
+ Use a short source-system reference label. These labels are declarations; saving does not verify a connection or import.
+
+
+ Department time zone
+
+
+ Workforce mix
+
+
+ Yes
+
+
+ Captions
+
+
+ Career
+
+
+ Central dispatch
+
+
+ Combination
+
+
+ 24-hour operation
+
+
+ Contract
+
+
+ External dispatch
+
+
+ Large text
+
+
+ On call
+
+
+ Plain language
+
+
+ Scheduled hours
+
+
+ Screen reader
+
+
+ Seasonal
+
+
+ Self dispatch
+
+
+ Unknown
+
+
+ Volunteer
+
+
+ Accessibility preferences
+
+
+ Operating sectors
+
+
+ Authoritative system references
+
+
+ Continuity procedure documents
+
+
+ Declared member count
+
+
+ Dispatch model
+
+
+ Expected email polling interval (minutes)
+
+
+ Working languages
+
+
+ Mutual aid participation
+
+
+ Operating hours
+
+
+ Qualification policy documents
+
+
+ Profile review time
+
+
+ Profile revision
+
+
+ Season end
+
+
+ Season start
+
+
+ Sites and groups
+
+
+ Staffing policy documents
+
+
+ Workforce mix
+
+
+ Record screen-reader, caption, large-text or plain-language needs for setup planning. Verify client behavior with the people who use it.
+
+
+ Choose all sectors served by the department. A pack suggests administrative reviews; it does not establish qualification or clinical scope.
+
+
+ Short declared source-system labels. Saving this list does not verify a connection, an import or the freshness of external data.
+
+
+ Reference existing department document IDs for approved continuity procedures. Test fallback communications and ownership through the approved procedure.
+
+
+ Optional planning estimate; actual membership and subscription counts come from their owning sources.
+
+
+ Record whether dispatch is central, self-directed, external or a combination. Verify each routing path through its owning settings.
+
+
+ Optional maximum time between recorded mailbox polls, from 1 to 10080 minutes. Blank means no declared polling expectation. This checks configured email connectors, not how often calls arrive; it does not measure SMS, CAD push or API health. Review the host polling schedule before setting it.
+
+
+ Languages used by the team. This preference does not prove interpreter availability or translate operational records.
+
+
+ Declare whether mutual aid is part of operations. Agreements, access and response eligibility require separate review.
+
+
+ Describe continuous, scheduled, on-call or seasonal operation. This is context and does not create shifts or guarantee coverage.
+
+
+ Reference existing department document IDs for approved qualification policies. Do not infer a license, scope of practice or deployment qualification from a role label.
+
+
+ Server-recorded time of the most recent validated profile save; it does not certify operational readiness.
+
+
+ Server revision used to reject concurrent overwrites. Reload when another administrator has saved a newer profile.
+
+
+ End of a declared seasonal period, in MM-DD format. A period can cross a calendar year; verify actual rosters separately.
+
+
+ Start of a declared seasonal period, in MM-DD format. Provide both start and end; this does not enable or disable resources on those dates.
+
+
+ Reference existing numeric group IDs in this department. This does not grant group access or change dispatch scope.
+
+
+ Reference existing department document IDs for approved staffing policies. The save checks existence and expiry, not policy approval or adequacy.
+
+
+ Describe the workforce so setup guidance can reflect career, volunteer, contract or combined operations.
+
+
+ Administrators need MFA enrollment
+
+
+ Administrator MFA is not enforced
+
+
+ Administrator succession needs review
+
+
+ Automatic check-in timers have no configuration
+
+
+ Required checks are overdue
+
+
+ Combined text intake and commands lack sender separation
+
+
+ Communication verification needs review
+
+
+ No continuity procedure is linked
+
+
+ Qualifications expire soon
+
+
+ Email import reports a failure
+
+
+ Groups have no active members
+
+
+ Equipment restrictions need review
+
+
+ Expected email polling evidence is missing
+
+
+ Custom map style is missing
+
+
+ Custom map credentials are missing
+
+
+ Administrator password resets need review
+
+
+ Personnel locations never expire
+
+
+ Personnel capacity is nearly full
+
+
+ Referenced policy documents expire soon
+
+
+ Referenced policies are unavailable
+
+
+ Required qualifications are uncovered
+
+
+ Record review deadlines need attention
+
+
+ Dispatch recommendations have no run cards
+
+
+ Shift status automation is inactive
+
+
+ Shift coverage needs review
+
+
+ Upcoming shifts have unfilled configured slots
+
+
+ Personnel have overlapping shift assignments
+
+
+ Upcoming shift trades are incomplete
+
+
+ Declared site references are unavailable
+
+
+ Station locations are incomplete
+
+
+ Stock expires soon
+
+
+ Text call sender routing needs review
+
+
+ Units have no group
+
+
+ Unit capacity is nearly full
+
+
+ Unit locations never expire
+
+
+ Units have no type
+
+
+ Weather alerts have no zones
+
+
+ Workflow failures need review
+
+
+ Review current administrator enrollment.
+
+
+ Review the administrator MFA requirement and recovery arrangements.
+
+
+ Review another authorized administrator and account recovery.
+
+
+ Review timer targets and escalation before activation.
+
+
+ Review overdue checklist assignments.
+
+
+ Review provider-specific dispatch sender classification and verified member commands.
+
+
+ Explicitly run a reviewed Communication Test.
+
+
+ Link an approved current document or review the external source with its responsible owner.
+
+
+ Review credentials due within the next 30 days.
+
+
+ Review the import error on the authorized Call Settings screen and verify the next poll.
+
+
+ Review group membership and intended use.
+
+
+ Review active holds and corrective work.
+
+
+ Review configured mailboxes, the host polling schedule and the declared interval. SMS, CAD push and API intake require separate evidence.
+
+
+ Review the custom map style.
+
+
+ Review the map override on its protected configuration screen.
+
+
+ Review the password-reset policy.
+
+
+ Choose a location lifetime appropriate to your workflow.
+
+
+ Review member usage and current subscription options.
+
+
+ Review document replacement or expiry with the responsible policy owner.
+
+
+ Review the operating profile references and their owning documents.
+
+
+ Review the owning qualification and roster evidence.
+
+
+ Review authorized overdue records.
+
+
+ Review run cards before relying on recommendations.
+
+
+ Review shift dispatch and automatic-status settings.
+
+
+ Review coverage and preview the dispatch recipients.
+
+
+ Review the shift roster and approved local staffing requirements.
+
+
+ Review assignments and trades; role eligibility does not establish physical availability.
+
+
+ Review outstanding offers and supervisor approvals.
+
+
+ Review current sites and service-area groups in the operating profile.
+
+
+ Review station addresses and coordinates.
+
+
+ Review expiring lots and authorized replenishment.
+
+
+ Review the active provider, approved sender patterns and controlled intake verification.
+
+
+ Review each unit group assignment.
+
+
+ Review unit usage and current subscription options.
+
+
+ Review unit location lifetime and device updates.
+
+
+ Assign the appropriate unit types through the Units screen.
+
+
+ Review weather alert zones.
+
+
+ Review failed runs and their owning workflow.
+
+
+ Enforcement settings alone do not prove that every administrator has enrolled.
+
+
+ Administrative accounts control department access and configuration.
+
+
+ A single administrative account can make recovery difficult.
+
+
+ Automatic timers need applicable target configuration.
+
+
+ Recorded overdue checks need an owner and follow-up.
+
+
+ Both text calls and commands are selected without dispatch-source patterns. Member commands use verified identity; the patterns distinguish dispatch senders rather than granting every member permission.
+
+
+ Configuration and device registration do not prove delivery.
+
+
+ The reviewed operating profile has no reference to a continuity or fallback procedure. The procedure may exist elsewhere; this is an administrative review prompt.
+
+
+ Expiring qualifications may affect upcoming assignments.
+
+
+ One or more configured mailboxes currently report a failed polling state. This is the latest stored observation, not proof of a continuing provider outage.
+
+
+ An empty group has no members to receive its work.
+
+
+ Only the owning workflow can release a safety hold.
+
+
+ Mailbox polling is compared with the interval declared in the operating profile. Missing calls alone do not imply an outage; absent or future poll timestamps remain unknown.
+
+
+ An enabled map override needs a style configuration.
+
+
+ An enabled map override needs its provider credentials.
+
+
+ Sending a single-use recovery link avoids an administrator choosing a member password.
+
+
+ A zero location lifetime can keep stale personnel positions on the map.
+
+
+ Adding members may exceed the current plan limit.
+
+
+ A linked staffing, qualification or continuity document is scheduled for removal within 30 days. This is document metadata, not a legal or clinical review deadline.
+
+
+ A declared policy document was removed, expired or is no longer in this department. Existence alone does not prove policy approval or suitability.
+
+
+ Coverage follows approved local qualification and role requirements.
+
+
+ Recorded due dates need administrative follow-up.
+
+
+ Enabled recommendations need reviewed run-card configuration.
+
+
+ Automatic shift status changes need shift dispatch enabled.
+
+
+ An empty shift can cause group dispatch to fall back to every group member.
+
+
+ Resolved rosters do not fill every configured role slot in the next seven days.
+
+
+ The same person appears on duty in overlapping shifts in the next seven days.
+
+
+ A requested or pending trade has not changed the resolved roster.
+
+
+ An operating-profile group reference no longer belongs to this department or has been removed.
+
+
+ Missing station locations reduce mapping and closest-resource usefulness.
+
+
+ Recorded lot expiry can affect supply availability.
+
+
+ Text call intake is selected without source patterns. Provider paths differ: this can broaden acceptance or prevent sender classification. The stored switch alone does not prove intake enforcement.
+
+
+ Group membership affects resource organization and routing.
+
+
+ Adding units may exceed the current plan limit.
+
+
+ A zero location lifetime can keep stale unit positions on the map.
+
+
+ Unit types support consistent status and qualification configuration.
+
+
+ Enabled weather alerts need an applicable area configuration.
+
+
+ Observed failures can leave administrative work incomplete.
+
+
+ Allow Signups For Multiple Shift Groups
+
+
+ Auto Set Status For Shift Dispatch Personnel
+
+
+ Big Board Hide Unavailable
+
+
+ Big Board Map Center Address
+
+
+ Big Board Map Center Gps Coordinates
+
+
+ Big Board Map Zoom Level
+
+
+ Big Board Page Refresh
+
+
+ Brain Tree Customer Id
+
+
+ Calls Sort Order
+
+
+ Check In Timers Auto Enable For New Calls
+
+
+ Department Operating Profile
+
+
+ Disabled Auto Available
+
+
+ Dispatch Recommendation Auto Dispatch
+
+
+ Dispatch Recommendation Config
+
+
+ Dispatch Recommendation Mode
+
+
+ Dispatch Shift Instead Of Group
+
+
+ Enable Modern Notifications
+
+
+ Enable Text Command
+
+
+ Enable Text To Call
+
+
+ Force Chatbot Security Pin
+
+
+ Group Dispatch Scope Config
+
+
+ Hardware Tracking Location Retention Days
+
+
+ Hardware Tracking Mobile Fallback Enabled
+
+
+ Hardware Tracking Stale After Seconds
+
+
+ Internal Dispatch Email
+
+
+ Mapping Mapbox Access Token
+
+
+ Mapping Mapbox Style Url
+
+
+ Mapping Personnel Allow Status With No Location To Overwrite
+
+
+ Mapping Personnel Location TTL
+
+
+ Mapping Unit Allow Status With No Location To Overwrite
+
+
+ Mapping Unit Location TTL
+
+
+ Mapping Use Mapbox Override
+
+
+ Module Settings
+
+
+ New Call Field Policy
+
+
+ Paddle Customer Id
+
+
+ Personnel List Status Sort Order
+
+
+ Personnel On Unit Set Unit Status
+
+
+ Personnel Sort Order
+
+
+ Records Default Lifecycle Preset
+
+
+ Records Disclosure Config
+
+
+ Records Group Scope Config
+
+
+ Records Group Visibility Mode
+
+
+ Records Numbering Config
+
+
+ Records Retention Policy
+
+
+ Records Review Due Hours
+
+
+ Records Search Config
+
+
+ Require2 FAFor Admins
+
+
+ Require Password Reset Via Email
+
+
+ Rss Feed Key For Active Calls
+
+
+ Shift Call Dispatch Personnel Status To Set
+
+
+ Shift Call Release Personnel Status To Set
+
+
+ Staffing Suppress Staffing Levels
+
+
+ Stripe Customer Id
+
+
+ Test Enabled
+
+
+ Text To Call Import Format
+
+
+ Text To Call Number
+
+
+ Text To Call Source Numbers
+
+
+ Tts Language
+
+
+ Unit Call Dispatch Status To Set
+
+
+ Unit Call Release Status To Set
+
+
+ Unit Call Status Overrides By Unit Type
+
+
+ Unit Dispatch Also Dispatch To Assigned Personnel
+
+
+ Unit Dispatch Also Dispatch To Group
+
+
+ Unit Status Thresholds
+
+
+ Units Sort Order
+
+
+ Update Timestamp
+
+
+ Weather Alert Auto Message Schedule
+
+
+ Weather Alert Auto Message Severity
+
+
+ Weather Alert Cache Minutes
+
+
+ Weather Alert Call Integration
+
+
+ Weather Alert Excluded Events
+
+
+ Weather Alert Minimum Severity
+
+
+ Weather Alerts Enabled
+
+
+ Allow a member to sign up for multiple shift groups. Review overlaps and local coverage rules separately.
+
+
+ Apply the configured status to shift-dispatched personnel. This only takes effect with shift dispatch enabled.
+
+
+ Hide unavailable resources on the Big Board; this affects visibility, not their dispatch eligibility.
+
+
+ Address used to center the Big Board. Address details remain on their owning screen.
+
+
+ Explicit board-center coordinates take precedence over address geocoding. Partial coordinates do not overwrite the saved center.
+
+
+ Initial Big Board map zoom. An unset override lets the consuming board select its default.
+
+
+ Big Board refresh interval. Review load and the age of displayed information before changing it.
+
+
+ Legacy billing reference. Use the subscription provider workflow, not a direct settings edit.
+
+
+ Sort order for displayed calls; does not reorder provider delivery or change call priority.
+
+
+ Automatically start configured check-in timers for new calls. Review timer targets and escalation before enabling it.
+
+
+ Declared organization, workforce, dispatch, seasonal, language and policy context. Recommendations never infer licenses or clinical scope from this profile.
+
+
+ Disables automatic availability behavior. Review staffing/status reset interactions before changing it.
+
+
+ Allow the recommendation path to dispatch automatically where enabled. Preview recipients and verify local procedures first.
+
+
+ Location, ETA, rest, crew and move-up settings used by recommendation consumers. External ETA calls occur only in the owning operational flow.
+
+
+ Dispatch recommendation selection mode. Review run cards, eligible resources and human dispatch responsibility.
+
+
+ Expand dispatched groups using the resolved on-duty roster. An empty shift result falls back to group members; preview both cases.
+
+
+ Use supported modern notification behavior. Verify each consumer and channel; provider acceptance is not delivery.
+
+
+ Configured text-command preference. Dispatch-source patterns and verified member command identity are different checks. Provider and chatbot paths do not enforce this switch uniformly; review the active consumer before changing it.
+
+
+ Configured text-call preference. Enforcement differs by provider and chatbot path; the stored value alone does not prove intake is stopped or accepted. Review sender classification and perform an explicit controlled verification on the owning screen.
+
+
+ Require the member security PIN for sensitive supported chatbot and SMS actions, including members who have not opted in.
+
+
+ Group-subtree dispatch visibility with explicit role exceptions. Preview each actor and target scope before changing it.
+
+
+ Tracking retention bounded by host configuration and applicable holds. Shortening retention can make data eligible for deletion.
+
+
+ Use supported mobile location fallback when hardware data is stale. Verify each device/source rather than assuming continuous tracking.
+
+
+ Age at which a hardware location becomes stale, clamped to at least one second. Review device reporting intervals.
+
+
+ Assigned internal dispatch email address. Presence can be shown; the address stays on the authorized import screen.
+
+
+ Map-provider access token. Only presence is reported. Disabling the override deletes it and requires re-entry to restore.
+
+
+ Custom map style reference. Verify the provider style and credential together; disabling the override deletes this value.
+
+
+ Allow a personnel status without a location to replace the previous location-bearing state. This can remove a marker.
+
+
+ Maximum personnel location age in minutes. Zero keeps stale positions visible without an age limit; assess actual ping ages.
+
+
+ Allow a unit status without a location to overwrite earlier location data. Check hardware and app updates together.
+
+
+ Maximum unit location age in minutes. Zero retains stale unit locations indefinitely in supported map consumers.
+
+
+ Use the department map provider override. Turning it off on the owning screen removes the stored style and token.
+
+
+ Controls module navigation and supported feature gates. Hiding a module does not delete its records or prove independent dispatch settings are disabled.
+
+
+ Controls optional new-call fields across supported clients. Hidden fields cannot be required; core dispatch fields remain mandatory.
+
+
+ Billing-provider customer reference. Managed by authorized billing flows and never returned in assistant evidence.
+
+
+ Custom ordering of personnel statuses in lists. Review all configured statuses before replacing the order.
+
+
+ Allow personnel status updates to influence their assigned unit status. Review automation and crew assignment together.
+
+
+ Sort order for personnel lists; does not change availability, access or dispatch priority.
+
+
+ Default lifecycle for new department-owned definitions. Locked definitions retain their own lifecycle.
+
+
+ Disclosure review clock, redaction profile and release approver. Review local obligations through the authorized disclosure workflow.
+
+
+ Reserved identifier with no editable behavior in this release. Do not present it as a shipped setting.
+
+
+ Whether record visibility is department-wide or group scoped. Group scope narrows existing permission and never grants access.
+
+
+ Number assignment, year reset and sequence formatting for definitions that do not override the department configuration.
+
+
+ Default and definition-specific retention, including prior-policy history. Holds and restricted-class rules can prevent purge eligibility.
+
+
+ Default administrative review deadline; a definition-level override takes precedence. This is not a statutory deadline inference.
+
+
+ Allowed record search scope and protected-data behavior. Search access remains bounded by current source permissions.
+
+
+ Administrator MFA requirement mode. Verify actual factors and recovery for each administrator before enforcement changes.
+
+
+ Use single-use recovery links for administrator-initiated member password resets, instead of selecting a replacement password.
+
+
+ Credential for the active-call feed. Treat the feed and its key as sensitive; rotate through its owning screen.
+
+
+ Personnel status applied when shift dispatch occurs. Minus one leaves status unchanged; use an existing approved status.
+
+
+ Personnel status applied on call release for the shift-dispatch path. Minus one leaves status unchanged.
+
+
+ Staffing levels suppressed in supported notifications. Suppression can change who hears an alert and is not evidence of delivery.
+
+
+ Billing-provider customer reference managed by subscription workflows; never edit this as an ordinary department setting.
+
+
+ Department testing behavior. Do not treat enabling a test setting as proof of production readiness.
+
+
+ Parser used for inbound text call creation. Verify the sender format with a controlled example on the owning screen.
+
+
+ Provisioned inbound text number. Provisioning has external effects and must use the normal text settings flow.
+
+
+ Allowed inbound source numbers for text calls and commands. Empty sources prevent accepted intake; never display raw numbers in Admin Assist.
+
+
+ Text-to-speech language for supported voice notifications. Confirm supported voices and pronunciation with a human-run test.
+
+
+ Unit status applied during call dispatch. Minus one or an invalid built-in unit status leaves the status unchanged.
+
+
+ Unit status applied at call release. Review unit-type overrides before assuming one department-wide effect.
+
+
+ Per-unit-type call status overrides. Existing type-specific values take precedence over department defaults.
+
+
+ Expand unit dispatch to its assigned crew. Review duplicate routes, current assignments and recipient permissions.
+
+
+ Expand unit dispatch to the station group. This can substantially increase the recipient audience.
+
+
+ Visual warning thresholds for time in a unit status. A highlight does not change the unit status or certify availability.
+
+
+ Sort order for unit lists; does not change unit eligibility or dispatch recommendation ranking.
+
+
+ Internal configuration timestamp. Read-only metadata, not an administrator-editable preference.
+
+
+ Schedule for automatic weather messaging. Review the department time zone, overnight periods and daylight-saving changes.
+
+
+ Minimum weather severity eligible for automatic messages. Review recipients, schedule and duplicate suppression.
+
+
+ Weather cache duration; longer caching changes freshness and provider load.
+
+
+ Include supported weather context in call integration. It does not certify weather or route safety.
+
+
+ Weather event types excluded from configured processing. Review exclusions against approved local procedures.
+
+
+ Minimum severity eligible for the weather-alert view. Severity values come from the weather service, not local incident triage.
+
+
+ Enable supported weather-alert processing. Configure zones and communication behavior before relying on it.
+
+
+ Check-in timer configuration is recorded. Verify target selection, deadlines, escalation ownership and a controlled scenario through the owning screen.
+
+
+ Mailbox configuration and available polling metadata are checked. Parser success, routing and page delivery require a controlled authorized test.
+
+
+ Checks recorded group membership and station location metadata. Review intended dispatch and site coverage separately.
+
+
+ Current active members are recorded. This does not verify invitations, account access, role assignment or qualifications.
+
+
+ Run-card records are present. The listed check verifies presence when recommendations are enabled, not correctness of local response requirements.
+
+
+ Checks recorded unit types and groups. Crew suitability, device setup and actual communications need separate verification.
+
+
+ Weather zones are recorded. Confirm geographic coverage and the actual provider and notification path.
+
+
+ Chatbot Department Config / Allow Dispatch Via Chatbot
+
+
+ Chatbot Department Config / Allowed Platforms
+
+
+ Chatbot Department Config / Is Enabled
+
+
+ Chatbot Department Config / Llm Api Endpoint
+
+
+ Chatbot Department Config / Llm Api Key
+
+
+ Chatbot Department Config / Llm Model Name
+
+
+ Chatbot Department Config / Max Sessions Per User
+
+
+ Chatbot Department Config / Messages Per Department Per Minute
+
+
+ Chatbot Department Config / Messages Per User Per Minute
+
+
+ Chatbot Department Config / Proactive Notifications Enabled
+
+
+ Chatbot Department Config / Require Confirmation For Status Change
+
+
+ Chatbot Department Config / Require Linking Confirmation
+
+
+ Chatbot Department Config / Session Ttl Minutes
+
+
+ Department / Address Id
+
+
+ Department / Api Key
+
+
+ Department / Code
+
+
+ Department / Department Type
+
+
+ Department / Link Code
+
+
+ Department / Managing User Id
+
+
+ Department / Name
+
+
+ Department / Public Api Key
+
+
+ Department / Shared Secret
+
+
+ Department / Show Welcome
+
+
+ Department / Time Zone
+
+
+ Department / Use24 Hour Time
+
+
+ Department Call Email / Error Message
+
+
+ Department Call Email / Format Type
+
+
+ Department Call Email / Hostname
+
+
+ Department Call Email / Is Failure
+
+
+ Department Call Email / Last Check
+
+
+ Department Call Email / Password
+
+
+ Department Call Email / Port
+
+
+ Department Call Email / Use Ssl
+
+
+ Department Call Email / Username
+
+
+ Department Notification / Before Data
+
+
+ Department Notification / Current Data
+
+
+ Department Notification / Data
+
+
+ Department Notification / Department Admins
+
+
+ Department Notification / Disabled
+
+
+ Department Notification / Event Type
+
+
+ Department Notification / Everyone
+
+
+ Department Notification / Groups To Notify
+
+
+ Department Notification / Lock To Group
+
+
+ Department Notification / Lower Limit
+
+
+ Department Notification / Roles To Notify
+
+
+ Department Notification / Selected Groups Admins Only
+
+
+ Department Notification / Upper Limit
+
+
+ Department Notification / Users To Notify
+
+
+ Department Security Policy / Allowed Ip Ranges
+
+
+ Department Security Policy / Data Classification Level
+
+
+ Department Security Policy / Max Concurrent Sessions
+
+
+ Department Security Policy / Min Password Length
+
+
+ Department Security Policy / Password Expiration Days
+
+
+ Department Security Policy / Require Mfa
+
+
+ Department Security Policy / Require Password Complexity
+
+
+ Department Security Policy / Require Sso
+
+
+ Department Security Policy / Session Timeout Minutes
+
+
+ Department Sso Config / Allow Local Login
+
+
+ Department Sso Config / Assertion Consumer Service Url
+
+
+ Department Sso Config / Attribute Mapping Json
+
+
+ Department Sso Config / Authority
+
+
+ Department Sso Config / Auto Provision Users
+
+
+ Department Sso Config / Client Id
+
+
+ Department Sso Config / Default Rank Id
+
+
+ Department Sso Config / Encrypted Client Secret
+
+
+ Department Sso Config / Encrypted Idp Certificate
+
+
+ Department Sso Config / Encrypted Scim Bearer Token
+
+
+ Department Sso Config / Encrypted Signing Certificate
+
+
+ Department Sso Config / Entity Id
+
+
+ Department Sso Config / Is Enabled
+
+
+ Department Sso Config / Metadata Url
+
+
+ Department Sso Config / Scim Enabled
+
+
+ Department Sso Config / Sso Provider Type
+
+
+ Weather Alert Zone / Center Geo Location
+
+
+ Weather Alert Zone / Is Active
+
+
+ Weather Alert Zone / Is Primary
+
+
+ Weather Alert Zone / Name
+
+
+ Weather Alert Zone / Radius Miles
+
+
+ Weather Alert Zone / Zone Code
+
+
+ Permits supported chatbot dispatch actions subject to their own authorization and confirmation. Enabling it may allow real calls and pages.
+
+
+ Allowed chatbot platform codes; the stored asterisk represents the platform default. Review each connected provider and its account-linking requirements.
+
+
+ Department chatbot availability. Platform feature rollout, account linking and action permissions are separate gates.
+
+
+ Optional existing chatbot model endpoint. Phase 0 Admin Assist does not call it and does not use chatbot configuration as an AI entitlement.
+
+
+ Credential for the chatbot model provider. Never copy it into setup metadata or public reference content.
+
+
+ Model identifier used by the existing chatbot integration. This is separate from the later Admin Assist open-source inference deployment.
+
+
+ Maximum chatbot sessions per member in supported consumers. This is separate from authenticated web/mobile session limits.
+
+
+ Optional department chatbot rate bound. Consider shared demand and provider quotas before changing it.
+
+
+ Optional per-member chatbot rate bound. Review provider limits and burst behavior; this is not a delivery guarantee.
+
+
+ Allows supported proactive chatbot notifications. Recipient permissions, channel configuration and sending workflows remain authoritative.
+
+
+ Requests confirmation for supported status changes. Review each platform consumer before assuming all commands are covered.
+
+
+ Requires confirmation in the supported account-linking flow. Linking must not bypass verified identity or departmental authorization.
+
+
+ Chatbot session lifetime in minutes. Expiry does not revoke an unrelated Resgrid sign-in session.
+
+
+ Department address reference. Review the owning address and mapping consumers; it is separate from station and site addresses.
+
+
+ Department API credential. Never place it in setup notes or model input; manage and rotate it through the authorized workflow.
+
+
+ Department code used by supported identification and access flows. Review those consumers before changing it.
+
+
+ Legacy organization-type label. The operating profile provides multiple sectors; neither establishes clinical scope or response qualifications.
+
+
+ Department linking code. Review who can use a link and rotate it using the owning workflow.
+
+
+ Managing-member identity. Subscription and high-risk account operations may require this member; change ownership through its explicit owning workflow.
+
+
+ Department display name. Review member-facing labels and documents that snapshot the name; changing it does not rename historical artifacts.
+
+
+ Credential used by supported public API consumers. Public in the field name does not make credential disclosure safe.
+
+
+ Department integration secret. Rotation can affect integrations and needs coordinated verification.
+
+
+ Legacy welcome flag. Restored setup dismissal is per administrator and does not use this flag as evidence of setup completion.
+
+
+ Department time zone used by scheduling and local-date reports. Review overnight shifts and daylight-saving transitions before changing it.
+
+
+ Preferred time display. This does not change stored timestamps or the department time zone.
+
+
+ Provider/import error details on the authorized screen. Admin Assist uses a normalized failure indication and does not copy provider bodies.
+
+
+ Selects the inbound email parser. Verify representative permitted source messages without sending an operational page unintentionally.
+
+
+ Mailbox host for email intake. Review the approved provider and network reachability without exposing credentials in setup guidance.
+
+
+ Latest recorded mailbox failure flag. Verify a new poll before treating it as a continuing outage or a resolved problem.
+
+
+ Last recorded polling timestamp. Missing or future timestamps are unknown; quiet call volume is not proof of a poll failure.
+
+
+ Mailbox credential. Do not copy it into Admin Assist; rotate it through the mailbox and owning editor together.
+
+
+ Mailbox connection port. It must match the selected provider and TLS mode.
+
+
+ Mailbox transport encryption option. Verify actual provider compatibility and successful polling; a stored flag alone does not prove transport protection.
+
+
+ Mailbox account identifier used for intake. It remains on the authorized configuration screen.
+
+
+ Previous-state filter for applicable events. Review valid status IDs and the event-specific interpretation of an empty or wildcard value.
+
+
+ Current-state filter for applicable events. Compare it with the previous-state filter to avoid unintended volume.
+
+
+ Event-specific configuration payload. The owning editor validates its meaning; Admin Assist does not execute arbitrary stored expressions.
+
+
+ Includes department administrators in supported notification processing. Review overlap and channel eligibility before estimating volume.
+
+
+ Stored disabled marker. The inspected legacy notification processor does not consult this flag, so it must not be treated as a verified stop switch. Review the active consumer; queued and delivered notifications cannot be recalled.
+
+
+ Event that can trigger this notification rule. Match the event to a real administrative responsibility and expected frequency.
+
+
+ Selects the department-wide recipient option. Review actual active membership, suppression and deduplication before use.
+
+
+ Department-group recipients. Review group membership and lock-to-group behavior together.
+
+
+ Restricts applicable event processing to group scope. Review the selected event's actual source group and recipient resolver.
+
+
+ Lower threshold for event-specific alerts. Use approved local thresholds and verify the actual event interpretation.
+
+
+ Personnel-role recipients. Role membership can change; a role label is not a qualification or delivery guarantee.
+
+
+ Limits selected-group recipients to their administrators in supported event paths. It does not designate department administrators automatically.
+
+
+ Upper threshold for event-specific alerts. Units and comparisons depend on the selected event.
+
+
+ Explicit member recipients. Membership and channel eligibility are evaluated separately at send time.
+
+
+ Allowed login network ranges. Empty adds no range restriction. Review legitimate responder networks and recovery access before narrowing it.
+
+
+ Department classification label. Selecting it does not enroll ADP, establish compliance or automatically classify every record correctly.
+
+
+ Maximum policy-managed concurrent sessions per user; zero means unlimited for this setting. Existing sessions and enforcement rollout must be checked separately.
+
+
+ Minimum length offered by the policy editor. Actual password validators and supported credential-change paths remain authoritative.
+
+
+ Password age in days; zero disables this policy's age limit. Verify local-password and SSO behavior separately.
+
+
+ Department-wide MFA policy, distinct from the administrator-only setting. Review enrollment, supported factors and recovery before enforcement.
+
+
+ Stored complexity preference. Consumer and editor coverage must be verified before relying on this field; it is not proof that an existing password meets a rule.
+
+
+ Requires the supported SSO policy gate. Verify the active identity provider and local recovery arrangements before removing a sign-in path.
+
+
+ Idle timeout in minutes; zero defers to host behavior. Verify policy-managed sessions and each supported client rather than assuming immediate global logout.
+
+
+ Allows a local-password path alongside this provider where policy permits. Review the department-wide SSO requirement and recovery plan together.
+
+
+ Stored SAML callback configuration. Use the endpoint supplied by the owning SSO setup and verify the provider registration.
+
+
+ Maps provider attributes to supported member fields. Validate identity matching and missing attributes with an approved test account.
+
+
+ OIDC issuer or authority. Verify the intended tenant, discovery metadata and callback registration before enabling it.
+
+
+ Allows the supported sign-in flow to create members. Review identity matching, capacity and default assignments before enabling it.
+
+
+ Client registration identifier from the identity provider. Keep tenant and audience registration consistent with the owning SSO flow.
+
+
+ Department rank assigned by supported automatic provisioning. It does not grant permissions or prove qualifications.
+
+
+ Encrypted provider client secret. The secret is entered and rotated on the authorized provider editor; Admin Assist only describes its purpose.
+
+
+ Encrypted provider verification certificate material. Review expiry and rotation through SSO; this description is not certificate validation.
+
+
+ Encrypted credential for inbound SCIM requests. Rotate through the explicit token workflow and update the provider before retiring an old credential.
+
+
+ Encrypted signing certificate and private-key material. Do not copy it into notes, logs or assistant messages.
+
+
+ SAML service-provider identifier registered at the identity provider. It must agree with the configured integration.
+
+
+ Makes this provider configuration available to the supported SSO flow. A saved enabled flag is not a successful sign-in test.
+
+
+ SAML provider metadata location. Review the trusted provider and its current signing material through the SSO editor.
+
+
+ Enables supported SCIM provisioning for this configuration. Review identity lifecycle, deactivation and token access separately from interactive sign-in.
+
+
+ Selects the identity protocol and provider configuration. OIDC and SAML have different metadata, certificates and callback requirements.
+
+
+ Center point used by supported radius-based weather coverage. Coordinate values stay on their owning map/editor.
+
+
+ Whether the zone participates in supported weather processing. Department weather settings and worker operation are additional requirements.
+
+
+ Marks the primary zone for consumers that select a default. Review other active zones rather than assuming they are disabled.
+
+
+ Administrator-facing label for this weather zone. The name does not define its geographic coverage.
+
+
+ Radius in miles for supported geographic matching. Review actual coverage and provider behavior; larger is not automatically safer.
+
+
+ Provider weather-zone identifier. Verify the intended jurisdiction and source coverage.
+
+
+ Accept time-limited exception
+
+
+ Accepted exception
+
+
+ Needs attention
+
+
+ Features that use this add-on
+
+
+ Requires Advanced Data Protection
+
+
+ Requires Workforce and Business Operations
+
+
+ Requires Push-to-Talk
+
+
+ Requires Readiness Pro
+
+
+ Show add-on comparisons only
+
+
+ Before adopting
+
+
+ After
+
+
+ All findings
+
+
+ Area
+
+
+ Assign to me
+
+
+ Assigned
+
+
+ Availability could not be verified
+
+
+ Current access allows the next setup step
+
+
+ Availability
+
+
+ Before
+
+
+ Recorded configuration, supported checks, add-on access and personal learning are separate. No activity measurement is implied: a feature with no recorded setup is not necessarily unused. Unknown evidence remains unassessed.
+
+
+ Feature setup and optional opportunities
+
+
+ Catalog version
+
+
+ Verified checks in selected areas
+
+
+ Supported configuration checks
+
+
+ Feature configuration has not been certified. Review the owning screen and the applicable checks in this report.
+
+
+ Open owning screen
+
+
+ Another administrator changed setup. The latest workspace has been loaded; review it before saving again.
+
+
+ Critical
+
+
+ Critical checks have unknown evidence. The department cannot be shown as fully verified.
+
+
+ Department ID
+
+
+ Optional administrative follow-up using your configured notification channels. No finding details are included. Quiet hours use the department time zone. An uncertain provider handoff is not automatically retried.
+
+
+ Your weekly Resgrid configuration summary is ready. Sign in to Admin Assist to review current evidence.
+
+
+ Send me a generic weekly summary link
+
+
+ Last notification handoff
+
+
+ Scheduled digests are disabled on this deployment. Your preference is saved, but no digest will be sent until the host enables them.
+
+
+ Dismiss for me; setup stays available in the menu
+
+
+ The report could not be loaded. Retry or use the normal department screens.
+
+
+ Evidence revision
+
+
+ Example
+
+
+ Exception expires
+
+
+ Choose an expiry within 90 days. The check continues to show its actual result. Notes follow department data protection.
+
+
+ Needs attention
+
+
+ Checks needing attention
+
+
+ Not enabled for this deployment
+
+
+ Planned
+
+
+ Preview
+
+
+ Retired
+
+
+ Show
+
+
+ Fresh setup
+
+
+ Evidence as of
+
+
+ Change
+
+
+ History starts when collection is enabled. Earlier configuration changes are unavailable.
+
+
+ Subject
+
+
+ When
+
+
+ Import or migration
+
+
+ Import planning does not copy data. Use the existing reviewed import tools and verify the resulting configuration here.
+
+
+ In review
+
+
+ Configuration changed during this read. Verify again before relying on this report.
+
+
+ Information
+
+
+ Information
+
+
+ Interested in this feature
+
+
+ Choose fresh setup, review or import mode above. Decide who dispatches, who responds and which applications or shared devices each role uses. A synthetic example: a dispatcher creates a training scenario, a responder sees assigned work and a unit crew updates its status. This lesson creates no incident or message.
+
+
+ Welcome and goals
+
+
+ Review the time zone, language, address and operating profile. Declare mission, operating hours, service areas and approved policy references. Unitless and non-dispatch teams should select only the work they need. Saving this profile does not validate a local staffing or clinical policy.
+
+
+ Department and operating profile
+
+
+ Use the area choices below and explore the full feature map, including capabilities hidden from your current menus. Choose use now, learn later or a reason why an area does not apply. Mark understood features individually; reading does not verify configuration.
+
+
+ Explore every area of Resgrid
+
+
+ Review the managing member and backup administrators, MFA, groups or stations, roles and qualifications. Add or invite personnel through the owning screen only after reviewing recipients and the send action. Confirm least-privilege access with the responsible users.
+
+
+ People, structure and access
+
+
+ Configure the calls, units, statuses, intake, notifications and mapping needed for your selected mission. Review dispatch previews and source eligibility before relying on a channel. App installation, device identity, provider setup and current contact verification are separate tasks.
+
+
+ Operational essentials
+
+
+ Open the selected-workflow list in Setup Report. Check prerequisites and responsible owners for shifts, training, checklists, inventory, records, contacts and automation. Save on the normal configuration screen, use the return-to-setup link, and verify again.
+
+
+ Configure selected areas
+
+
+ Compare current included capabilities with Push-to-Talk, Advanced Data Protection, Readiness Pro and Business Operations. Review feature value, alternatives and adoption requirements. Enhanced AI remains planned. Interest and learning never purchase, start a trial, enroll protection or enable a module.
+
+
+ Understand plans and add-ons
+
+
+ Run Setup Report and review critical failures and unknowns. Use available dry-run previews. A communication test is a separate deliberate action: review its recipients and channels before sending through Communication Tests. A completed setup review does not guarantee field response or delivery.
+
+
+ Verify and practice
+
+
+ Record the reviewed evidence, unresolved work, owners and optional revisit date in Setup Report. Use the redacted print view for an authorized handover. Train other administrators and members on their normal workflows. Each new administrator keeps a separate orientation checklist.
+
+
+ Review and handover
+
+
+ Configuration effort depends on your selected areas, data quality, local policy and provider setup. Reserve time with the responsible owners; a department-specific effort estimate is not yet available.
+
+
+ Work through these nine steps at your own pace. Shared scope, personal learning and review evidence are saved separately. Configure features on their owning screens, then use Setup Report to verify current evidence.
+
+
+ Your setup journey
+
+
+ Available
+
+
+ Learn later
+
+
+ Learn about this feature
+
+
+ I understand this feature
+
+
+ Learning progress
+
+
+ Learning marked complete by you
+
+
+ Learning not yet marked complete
+
+
+ Loading department setup…
+
+
+ Subscription changes require the managing member
+
+
+ Mark this report reviewed
+
+
+ Setup mode
+
+
+ Module is disabled
+
+
+ Load more
+
+
+ Next setup actions
+
+
+ Learning and interest choices never purchase, enable, send, import or change operational configuration.
+
+
+ No matching features.
+
+
+ Not yet reviewed
+
+
+ No items in this view.
+
+
+ Not applicable
+
+
+ Department operating profile
+
+
+ Feature without an add-on requirement has no configuration recorded in the checked source
+
+
+ No add-on requirement in this release; applicable base-plan limits still apply
+
+
+ Optional add-on opportunity; no current entitlement was verified
+
+
+ Not currently released for setup
+
+
+ Current add-on entitlement verified; setup is a separate step
+
+
+ Subscribed feature with no configuration recorded in the checked source
+
+
+ Current add-on or access information is unavailable
+
+
+ Unpurchased optional add-ons do not reduce core completion. Deferring an area does not hide a critical verified failure or active critical uncertainty.
+
+
+ Optional capabilities and add-ons
+
+
+ Operating packs
+
+
+ Verified
+
+
+ Follow-up preferences
+
+
+ Print
+
+
+ This report contains only the current authorized setup summary and public guidance. Protected notes, names, source records and credentials are omitted. It is not an operational readiness certification. Handle any copy you print or save under your department’s information policy; this page creates no stored server export.
+
+
+ Open a fresh printable report
+
+
+ Use approved local staffing, qualification and continuity policies; operating packs suggest areas to review without assuming local requirements.
+
+
+ Your operating profile could not be verified. Pack suggestions are unavailable.
+
+
+ Data protection enrollment is required
+
+
+ Quiet hours end (0–23; same hour means no quiet period)
+
+
+ Quiet hours start (0–23)
+
+
+ Read source text
+
+
+ Reason
+
+
+ Protected evidence unavailable
+
+
+ Configuration health is administrative guidance. A learned feature or saved setting is not proof of operational readiness or message delivery.
+
+
+ Required add-ons
+
+
+ Resolved by verification
+
+
+ Start or resume setup
+
+
+ Retry
+
+
+ Return to setup and verify
+
+
+ Review existing setup
+
+
+ Configuration, selected setup scope or catalog version has changed since that review. Verify current evidence and review again.
+
+
+ Review due
+
+
+ Checks at the recorded administrative review
+
+
+ Last administrative review
+
+
+ Review again on (UTC date)
+
+
+ Choose an optional shared review date within the next year. It is stored at noon UTC and shown in the report; this choice does not send a reminder. Optional weekly follow-up is configured separately in the admin worklist. Clear the date to remove it.
+
+
+ The change was not saved. Reload and try again.
+
+
+ Save preferences
+
+
+ Save review date
+
+
+ Save area choice
+
+
+ Save changes on this screen first, then return to setup and verify the current evidence. The return link does not save this form.
+
+
+ Saving…
+
+
+ Why this area is not applicable
+
+
+ No current department need
+
+
+ Managed in another approved system
+
+
+ Outside our department mission
+
+
+ Managed by a responsible partner
+
+
+ Search areas and features
+
+
+ Search reference documentation
+
+
+ Choose a reason
+
+
+ Choose features of interest in Explore Resgrid and add-ons to see their prerequisites here.
+
+
+ Selected in your operating profile
+
+
+ Your selected feature interests
+
+
+ Setup choice
+
+
+ Learn the available areas and optional add-ons, configure your selected areas, then review the evidence together.
+
+
+ Recorded configuration and listed checks passed
+
+
+ Configuration recorded; verification is incomplete
+
+
+ Configuration recorded; listed checks need attention
+
+
+ Configuration has not been verified
+
+
+ No configuration recorded in the checked source
+
+
+ Current source access unavailable
+
+
+ Start review
+
+
+ View subscription options
+
+
+ Subscription status could not be verified
+
+
+ Suggested by your selected operating packs
+
+
+ Resgrid Admin Assist
+
+
+ Unassigned
+
+
+ Unavailable
+
+
+ Selected areas without automated checks
+
+
+ Unknown
+
+
+ Checks with unknown evidence
+
+
+ Use now
+
+
+ Value to your department
+
+
+ Results cover only the listed checks. Review procedures, external systems and areas without automated checks with their responsible owners.
+
+
+ Verify again
+
+
+ Choose Verify again to create or update the worklist.
+
+
+ Warning
+
+
+ Choose the work your department needs, learn the available areas, then configure each feature on its own screen. Return here to verify.
+
+
+ Last completed background evaluation
+
+
+ The background worker has not completed an evaluation.
+
+
+ Current access could not be verified
+
+
+ A prerequisite prevents the next setup step
+
+
+ Interest and learning are personal choices. Availability, setup and verified checks are separate; purchasing an add-on never completes setup automatically.
+
+
+ Verification updates findings. Assignment and accepted exceptions do not resolve a failed check. A fresh passing check resolves it.
+
+
+ Explore Resgrid and add-ons
+
+
+ Health checks
+
+
+ Change history
+
+
+ Overview
+
+
+ Settings reference
+
+
+ Setup Report
+
+
+ Setup Wizard
+
+
+ Admin worklist
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.es.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.es.resx
new file mode 100644
index 000000000..aa185da7a
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.es.resx
@@ -0,0 +1,348 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Agregar persona
+
+
+ Protección de datos avanzada
+
+
+ Llamadas archivadas
+
+
+ Ofertas
+
+
+ tablero grande
+
+
+ Calendario
+
+
+ Llamadas
+
+
+ Listas de verificación
+
+
+ Pruebas de comunicación
+
+
+ Contactos
+
+
+ Contratos
+
+
+ Panel
+
+
+ Protección de datos
+
+
+ Configuración del departamento
+
+
+ Configuración de envío
+
+
+ Documentos
+
+
+ Formularios
+
+
+ Bandeja de entrada
+
+
+ Inventario
+
+
+ Administrar invitaciones
+
+
+ Facturas
+
+
+ Cartografía
+
+
+ Configuración de módulos
+
+
+ Nueva llamada
+
+
+ Nuevo contacto
+
+
+ Nuevo despliegue
+
+
+ Nuevo Grupo
+
+
+ Nuevo registro
+
+
+ Nueva nota
+
+
+ Nuevo Protocolo
+
+
+ Nueva capacitación
+
+
+ Nueva unidad
+
+
+ Nuevo flujo de trabajo
+
+
+ Mensajes enviados
+
+
+ Personal
+
+
+ Mantenimiento preventivo
+
+
+ Tarifas
+
+
+ Retenciones de conservación de registros
+
+
+ Inspecciones
+
+
+ Investigaciones
+
+
+ Permisos
+
+
+ Registros
+
+
+ Configuración de registros
+
+
+ Rutas
+
+
+ Turnos
+
+
+ Autenticación de Dos Factores
+
+
+ Personal de la unidad
+
+
+ Unidades
+
+
+ Voz
+
+
+ Ejecuciones del flujo de trabajo
+
+
+ Flujos de trabajo
+
+
+ Plantilla
+
+
+ Todos
+
+
+ Permiso
+
+
+ Búsqueda y rescate
+
+
+ Ajustar inventario
+
+
+ Aprobar registros
+
+
+ cerrar llamada
+
+
+ Crear flujo de trabajo
+
+
+ Eliminar llamada
+
+
+ Finalizar registros
+
+
+ Administrar definiciones de registro
+
+
+ Administrar divulgaciones de registros
+
+
+ Administrar informes de registros
+
+
+ Publicar definiciones de registro
+
+
+ Revisar registros
+
+
+ Referencia
+
+
+ Sí
+
+
+ Contrato
+
+
+ Voluntario
+
+
+ Después
+
+
+ Área
+
+
+ Antes
+
+
+ Versión del catálogo
+
+
+ Abrir la página de configuración correspondiente
+
+
+ Crítico
+
+
+ Requiere atención
+
+
+ Planificado
+
+
+ Evidencias a fecha de
+
+
+ Cuándo
+
+
+ Información
+
+
+ Me interesa esta función
+
+
+ Disponible
+
+
+ Conocer más adelante
+
+
+ Entiendo esta función
+
+
+ Cargando la configuración del departamento…
+
+
+ No corresponde
+
+
+ Verificado
+
+
+ Imprimir
+
+
+ Leer el texto de origen
+
+
+ Las evidencias protegidas no están disponibles
+
+
+ La comprobación de la configuración ofrece orientación administrativa. Comprender una función o guardar un ajuste no demuestra preparación operativa ni entrega de mensajes.
+
+
+ Reintentar
+
+
+ Revisión pendiente
+
+
+ Guardando…
+
+
+ Buscar áreas y funciones
+
+
+ Buscar en la documentación de referencia
+
+
+ Sin asignar
+
+
+ No disponible
+
+
+ Desconocido
+
+
+ Usar ahora
+
+
+ Volver a verificar
+
+
+ Advertencia
+
+
+ Explorar Resgrid y sus complementos
+
+
+ Comprobaciones de configuración
+
+
+ Historial de cambios
+
+
+ Resumen
+
+
+ Referencia de configuración
+
+
+ Informe de configuración
+
+
+ Asistente de configuración
+
+
+ Lista de tareas del administrador
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.fr.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.fr.resx
new file mode 100644
index 000000000..1fcdc74d5
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.fr.resx
@@ -0,0 +1,303 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Protection avancée des données
+
+
+ Appels archivés
+
+
+ Offres
+
+
+ Grand tableau
+
+
+ Calendrier
+
+
+ Appels
+
+
+ Discussion
+
+
+ Listes de contrôle
+
+
+ Tests de communication
+
+
+ Contrats
+
+
+ Tableau de bord
+
+
+ Protection des données
+
+
+ Paramètres du département
+
+
+ Vos départements
+
+
+ Formulaires
+
+
+ Rapports d'incident
+
+
+ Inventaire
+
+
+ Factures
+
+
+ Journaux
+
+
+ Cartographie
+
+
+ Paramètres des modules
+
+
+ Nouveau déploiement
+
+
+ Nouveau Groupe
+
+
+ Nouveau Protocole
+
+
+ Nouvelle formation
+
+
+ Personnels
+
+
+ Maintenance préventive
+
+
+ Protocoles
+
+
+ Grilles tarifaires
+
+
+ Conservations légales des dossiers
+
+
+ Enquêtes
+
+
+ Permis
+
+
+ Paramètres des dossiers
+
+
+ Itinéraires
+
+
+ Quarts
+
+
+ Formations
+
+
+ Unités
+
+
+ Appel vocal
+
+
+ Effectifs
+
+
+ Incendie
+
+
+ Recherche et sauvetage
+
+
+ Ajuster l'inventaire
+
+
+ Approuver des rapports
+
+
+ Finaliser des rapports
+
+
+ Gérer les définitions de rapport
+
+
+ Gérer les divulgations de rapports
+
+
+ Gérer les états de rapports
+
+
+ Publier les définitions de rapport
+
+
+ Réviser des rapports
+
+
+ Non
+
+
+ Référence
+
+
+ Oui
+
+
+ Contrat
+
+
+ Bénévole
+
+
+ Après
+
+
+ Zone
+
+
+ Avant
+
+
+ Version du catalogue
+
+
+ Ouvrir la page de configuration correspondante
+
+
+ Critique
+
+
+ Nécessite une intervention
+
+
+ Planifié
+
+
+ Aperçu
+
+
+ Éléments de preuve au
+
+
+ Date
+
+
+ Informations
+
+
+ Cette fonctionnalité m’intéresse
+
+
+ Disponible
+
+
+ Découvrir plus tard
+
+
+ Je comprends cette fonctionnalité
+
+
+ Chargement de la configuration du service…
+
+
+ Sans objet
+
+
+ Vérifié
+
+
+ Imprimer
+
+
+ Lire le texte source
+
+
+ Éléments de preuve protégés indisponibles
+
+
+ La vérification de la configuration fournit des indications administratives. Comprendre une fonctionnalité ou enregistrer un paramètre ne prouve ni la disponibilité opérationnelle ni la remise des messages.
+
+
+ Réessayer
+
+
+ Relecture due
+
+
+ Enregistrement…
+
+
+ Rechercher des domaines et des fonctionnalités
+
+
+ Rechercher dans la documentation de référence
+
+
+ Non attribué
+
+
+ Indisponible
+
+
+ Inconnu
+
+
+ Utiliser maintenant
+
+
+ Vérifier à nouveau
+
+
+ Avertissement
+
+
+ Découvrir Resgrid et ses modules complémentaires
+
+
+ Vérifications de configuration
+
+
+ Historique des modifications
+
+
+ Vue d’ensemble
+
+
+ Référence des paramètres
+
+
+ Rapport de configuration
+
+
+ Assistant de configuration
+
+
+ Liste des tâches de l’administrateur
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.it.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.it.resx
new file mode 100644
index 000000000..078b23927
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.it.resx
@@ -0,0 +1,312 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Protezione avanzata dei dati
+
+
+ Chiamate archiviate
+
+
+ Offerte
+
+
+ Tabellone
+
+
+ Calendario
+
+
+ Chiamate
+
+
+ Liste di controllo
+
+
+ Test di comunicazione
+
+
+ Contatti
+
+
+ Contratti
+
+
+ Protezione dei dati
+
+
+ Impostazioni dipartimento
+
+
+ I tuoi dipartimenti
+
+
+ Documenti
+
+
+ Moduli
+
+
+ Rapporti di incidente
+
+
+ Inventario
+
+
+ Fatture
+
+
+ Registri
+
+
+ Mappatura
+
+
+ Impostazioni moduli
+
+
+ Nuovo impiego
+
+
+ Nuovo Gruppo
+
+
+ Nuovo Protocollo
+
+
+ Nuova formazione
+
+
+ Note
+
+
+ Personale
+
+
+ Manutenzione preventiva
+
+
+ Protocolli
+
+
+ Listini
+
+
+ Blocchi di conservazione dei registri
+
+
+ Ispezioni
+
+
+ Indagini
+
+
+ Permessi
+
+
+ Impostazioni registri
+
+
+ Percorsi
+
+
+ Turni
+
+
+ Formazioni
+
+
+ Unità
+
+
+ Voce
+
+
+ Flussi di lavoro
+
+
+ Personale
+
+
+ Tutti
+
+
+ Ricerca e soccorso
+
+
+ Rettifica inventario
+
+
+ Approvare rapporti
+
+
+ Finalizzare rapporti
+
+
+ Gestire definizioni di rapporto
+
+
+ Gestire divulgazioni di rapporti
+
+
+ Gestire report sui rapporti
+
+
+ Pubblicare definizioni di rapporto
+
+
+ Revisionare rapporti
+
+
+ Riferimento
+
+
+ Sì
+
+
+ Contratto
+
+
+ Volontario
+
+
+ Dopo
+
+
+ Assegnato
+
+
+ Prima
+
+
+ Versione catalogo
+
+
+ Apri la pagina delle impostazioni pertinente
+
+
+ Critico
+
+
+ Richiede attenzione
+
+
+ Pianificato
+
+
+ Anteprima
+
+
+ Evidenze aggiornate al
+
+
+ Data
+
+
+ Informazioni
+
+
+ Mi interessa questa funzionalità
+
+
+ Disponibile
+
+
+ Scopri più avanti
+
+
+ Comprendo questa funzionalità
+
+
+ Caricamento della configurazione del reparto…
+
+
+ Non applicabile
+
+
+ Verificato
+
+
+ Stampa
+
+
+ Leggi il testo originale
+
+
+ Motivo
+
+
+ Evidenze protette non disponibili
+
+
+ La verifica della configurazione fornisce indicazioni amministrative. Comprendere una funzionalità o salvare un’impostazione non dimostra la prontezza operativa né la consegna dei messaggi.
+
+
+ Riprova
+
+
+ Revisione entro
+
+
+ Salvataggio…
+
+
+ Cerca aree e funzionalità
+
+
+ Cerca nella documentazione di riferimento
+
+
+ Non assegnato
+
+
+ Non disponibile
+
+
+ Sconosciuto
+
+
+ Usa ora
+
+
+ Verifica di nuovo
+
+
+ Avviso
+
+
+ Esplora Resgrid e i componenti aggiuntivi
+
+
+ Verifiche della configurazione
+
+
+ Cronologia delle modifiche
+
+
+ Panoramica
+
+
+ Riferimento delle impostazioni
+
+
+ Rapporto di configurazione
+
+
+ Configurazione guidata
+
+
+ Elenco attività dell’amministratore
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.pl.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.pl.resx
new file mode 100644
index 000000000..53e904219
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.pl.resx
@@ -0,0 +1,318 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Zaawansowana ochrona danych
+
+
+ Zarchiwizowane zgłoszenia
+
+
+ Oferty
+
+
+ Wielka tablica
+
+
+ Kalendarz
+
+
+ Zgłoszenia
+
+
+ Czat
+
+
+ Listy kontrolne
+
+
+ Testy łączności
+
+
+ Kontakty
+
+
+ Umowy
+
+
+ Pulpit
+
+
+ Ochrona danych
+
+
+ Ustawienia oddziału
+
+
+ Twoje oddziały
+
+
+ Dokumenty
+
+
+ Formularze
+
+
+ Raporty ze zdarzeń
+
+
+ Inwentarz
+
+
+ Faktury
+
+
+ Dzienniki
+
+
+ Mapowanie
+
+
+ Ustawienia modułów
+
+
+ Nowa dyslokacja
+
+
+ Nowa Grupa
+
+
+ Nowy Protokół
+
+
+ Nowe szkolenie
+
+
+ Personel
+
+
+ Konserwacja zapobiegawcza
+
+
+ Protokoły
+
+
+ Cenniki
+
+
+ Blokady zachowania rejestrów
+
+
+ Kontrole
+
+
+ Dochodzenia
+
+
+ Zezwolenia
+
+
+ Ustawienia rejestrów
+
+
+ Trasy
+
+
+ Zmiany
+
+
+ Szkolenia
+
+
+ Jednostki
+
+
+ Połączenie głosowe
+
+
+ Przepływy pracy
+
+
+ Kadry
+
+
+ Wszyscy
+
+
+ Poszukiwania i ratownictwo
+
+
+ Dostosuj inwentarz
+
+
+ Zatwierdzanie raportów
+
+
+ Finalizowanie raportów
+
+
+ Zarządzanie definicjami raportów
+
+
+ Zarządzanie ujawnieniami raportów
+
+
+ Zarządzanie zestawieniami raportów
+
+
+ Publikowanie definicji raportów
+
+
+ Przeglądanie raportów
+
+
+ Nie
+
+
+ Godziny pracy
+
+
+ Tak
+
+
+ Umowa
+
+
+ Wolontariusz
+
+
+ Godziny pracy
+
+
+ Po
+
+
+ Obszar
+
+
+ Przed
+
+
+ Wersja katalogu
+
+
+ Otwórz odpowiednią stronę ustawień
+
+
+ Krytyczne
+
+
+ Wymaga uwagi
+
+
+ Zaplanowana
+
+
+ Podgląd
+
+
+ Dane aktualne na
+
+
+ Informacje
+
+
+ Interesuje mnie ta funkcja
+
+
+ Dostępne
+
+
+ Poznaj później
+
+
+ Rozumiem tę funkcję
+
+
+ Ładowanie konfiguracji jednostki…
+
+
+ Nie dotyczy
+
+
+ Zweryfikowano
+
+
+ Drukuj
+
+
+ Czytaj tekst źródłowy
+
+
+ Powód
+
+
+ Chronione dane potwierdzające są niedostępne
+
+
+ Kontrola konfiguracji służy jako wskazówka administracyjna. Poznanie funkcji lub zapisanie ustawienia nie potwierdza gotowości operacyjnej ani doręczenia wiadomości.
+
+
+ Ponów próbę
+
+
+ Termin przeglądu
+
+
+ Zapisywanie…
+
+
+ Szukaj obszarów i funkcji
+
+
+ Szukaj w dokumentacji referencyjnej
+
+
+ Nieprzypisane
+
+
+ Niedostępne
+
+
+ Nieznane
+
+
+ Używaj teraz
+
+
+ Sprawdź ponownie
+
+
+ Ostrzeżenie
+
+
+ Poznaj Resgrid i dodatki
+
+
+ Kontrole konfiguracji
+
+
+ Historia zmian
+
+
+ Przegląd
+
+
+ Informacje o ustawieniach
+
+
+ Raport konfiguracji
+
+
+ Kreator konfiguracji
+
+
+ Lista zadań administratora
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.resx
new file mode 100644
index 000000000..3d852e3d8
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.resx
@@ -0,0 +1,5409 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Automation and connectivity
+
+
+ Deployments and business
+
+
+ Calls and response
+
+
+ Communication
+
+
+ Home and applications
+
+
+ Inventory and readiness
+
+
+ Contacts and site knowledge
+
+
+ Units and location
+
+
+ Checklists and maintenance
+
+
+ People and organization
+
+
+ Plans, add-ons and AI
+
+
+ Records and reporting
+
+
+ Administration and security
+
+
+ Review a Workflow and its permissions before explicitly enabling it.
+
+
+ Compare an event standby invoice with its approved deployment documentation.
+
+
+ Review a test scenario before enabling CAD intake or changing dispatch routing.
+
+
+ Preview recipients and explicitly run a communication test through its own screen.
+
+
+ A dispatcher creates a call while responders and unit crews receive their assigned work.
+
+
+ Review an expiring supply lot and arrange restocking through the inventory screen.
+
+
+ Review a receiving-agency contact and an approved site plan before a planned event.
+
+
+ Review an apparatus location and its last update before relying on the map.
+
+
+ Record an equipment defect, assign repair and review return to service through the owning module.
+
+
+ Check that the next shift has the locally required qualified crew.
+
+
+ Review feature requirements with the managing member before using the normal billing screen.
+
+
+ Review an incident report and its outstanding corrections using the Records workflow.
+
+
+ Verify an additional administrator and review MFA and recovery procedures.
+
+
+ Configure Workflows, user-defined fields, APIs, imports and integrations.
+
+
+ Understand free Deployment Finance and optional Business Operations workflows.
+
+
+ Create and receive calls, choose recipients and follow response status.
+
+
+ Use messages, notifications, communication tests, chat and Push-to-Talk.
+
+
+ Learn how the web, Dispatch, Responder, Unit, Incident Command and Big Board fit your team.
+
+
+ Track stock, equipment, issue and return, purchasing and expiry.
+
+
+ Maintain contacts, preplans, forms, notes, documents, files and links.
+
+
+ Manage units, crews, maps, location tracking, routes and weather.
+
+
+ Use included checklists and optional Readiness Pro repair and maintenance workflows.
+
+
+ Organize members, stations, groups, roles, qualifications, shifts and training.
+
+
+ Compare included features, base-plan limits and paid add-ons.
+
+
+ Understand Records, legacy Logs, reviews, prevention, investigations and reporting.
+
+
+ Review department settings, permissions, MFA, SSO, audit and data protection.
+
+
+ Reduce repeated administrative work while retaining ownership and review of external effects.
+
+
+ Connect deployment records to invoicing, reimbursement or internal cost review when needed.
+
+
+ Make call intake and recipient selection consistent across shifts.
+
+
+ Choose a communication channel appropriate to the audience and task.
+
+
+ Give each role the right app and a clear starting point.
+
+
+ See recorded shortages and due dates before they become an administrative surprise.
+
+
+ Help authorized members find the current reference and responsible contact.
+
+
+ Make resource information easier to find and show when positions are stale.
+
+
+ Connect recorded equipment checks with owned corrective work when maintenance is enabled.
+
+
+ Keep access and responsibilities aligned with the people doing the work.
+
+
+ Choose optional capabilities by the work they support and their adoption requirements.
+
+
+ Keep administrative follow-up and reporting evidence connected to the source record.
+
+
+ Keep administrative access recoverable and limited to authorized people.
+
+
+ Account sessions and recovery
+
+
+ Add Person
+
+
+ Advanced Data Protection
+
+
+ Enhanced AI
+
+
+ Business Operations
+
+
+ Push-to-Talk
+
+
+ Readiness Pro
+
+
+ API and MCP integrations
+
+
+ Archived Calls
+
+
+ Audit history
+
+
+ Bids
+
+
+ Big Board
+
+
+ Billing Settings
+
+
+ Cal OES MARS
+
+
+ MARS Action Queue
+
+
+ MARS Annual Rates
+
+
+ MARS Reconciliation
+
+
+ Calendar
+
+
+ Call Settings
+
+
+ Call templates
+
+
+ Call types and priorities
+
+
+ Calls
+
+
+ Certification Dashboard
+
+
+ Certification Settings
+
+
+ Certification Types
+
+
+ Chat
+
+
+ Chatbot and Assistant integration settings
+
+
+ Check-in timers
+
+
+ Checklist compliance reports
+
+
+ Checklist schedules and due work
+
+
+ Checklist Templates
+
+
+ Checklists
+
+
+ Communication Tests
+
+
+ Compliance Documents
+
+
+ New Message
+
+
+ Contact Categories
+
+
+ Contacts
+
+
+ Contracts
+
+
+ Field Cost Runs
+
+
+ Custom map layers
+
+
+ Personnel and unit statuses
+
+
+ Dashboard
+
+
+ Data Protection
+
+
+ Department Settings
+
+
+ Your Departments
+
+
+ Deployment From External Order
+
+
+ Deployment Finance
+
+
+ Dispatch application
+
+
+ Dispatch Settings
+
+
+ Distribution lists
+
+
+ Documents
+
+
+ Email and CAD call intake
+
+
+ Files and attachments
+
+
+ Forms
+
+
+ Groups & Stations
+
+
+ Hardware location tracking
+
+
+ Import and migration planning
+
+
+ Inbox
+
+
+ Incident command and accountability
+
+
+ Incident reports
+
+
+ Indoor maps
+
+
+ Inventory
+
+
+ Issue Equipment
+
+
+ Inventory counts, expiry and alerts
+
+
+ Inventory purchasing
+
+
+ Inventory Status
+
+
+ Transfer Inventory
+
+
+ Manage Invites
+
+
+ Accounts Receivable Aging
+
+
+ Invoices
+
+
+ Live Routing
+
+
+ Logs
+
+
+ Maintenance policies and approvals
+
+
+ Maintenance history and reports
+
+
+ Map Layers
+
+
+ Mapping
+
+
+ Module settings
+
+
+ My Certifications
+
+
+ My Demographic Response
+
+
+ New Bid
+
+
+ New Calendar Event
+
+
+ New Call
+
+
+ New Checklist
+
+
+ New Contact
+
+
+ New Contract
+
+
+ New Deployment
+
+
+ Upload Document
+
+
+ New Group
+
+
+ New Invoice
+
+
+ New Log
+
+
+ New Note
+
+
+ New Protocol
+
+
+ New Training
+
+
+ New Unit
+
+
+ New Work Order
+
+
+ New Workflow
+
+
+ Notes
+
+
+ Notification rules
+
+
+ Online Payment Settings
+
+
+ Sent Messages
+
+
+ California Pay Data Reporting
+
+
+ Permissions
+
+
+ Personnel
+
+
+ Personnel roles
+
+
+ Points of Interest
+
+
+ Preventive maintenance
+
+
+ My Profile
+
+
+ Protected workflows
+
+
+ Protocols
+
+
+ Rate Cards
+
+
+ Rate Schedules
+
+
+ Records analytics
+
+
+ Record definitions and templates
+
+
+ Disclosure requests
+
+
+ Evidence capture and provenance
+
+
+ Record exports and templates
+
+
+ Legal holds
+
+
+ Hydrants and water sources
+
+
+ Inspections
+
+
+ Investigations
+
+
+ Occupancies and preplans
+
+
+ Permits
+
+
+ Saved record reports
+
+
+ Reporting submissions
+
+
+ Records
+
+
+ Records Dashboard
+
+
+ Records Settings
+
+
+ Reports
+
+
+ Resource Cost Profiles
+
+
+ Responder application
+
+
+ Routes
+
+
+ Run cards and recommendations
+
+
+ Security and session policy
+
+
+ Setup help and support
+
+
+ Shared links
+
+
+ Shifts
+
+
+ Single sign-on and provisioning
+
+
+ Base plans and capacity
+
+
+ Text call intake and commands
+
+
+ Trainings
+
+
+ Two-Factor Authentication
+
+
+ Unit application
+
+
+ Unit Staffing
+
+
+ Unit types
+
+
+ Units
+
+
+ User-defined fields
+
+
+ Voice
+
+
+ Weather zones and alerts
+
+
+ Work Orders
+
+
+ Workflow Runs
+
+
+ Workflows
+
+
+ Workforce
+
+
+ Annual Pay Facts
+
+
+ Compensation Profiles
+
+
+ Workshifts
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Buying does not enroll the department. Review MFA, recovery, migration and integration behavior; this is not a compliance certification.
+
+
+ Planned until product and runtime availability are verified. Deterministic Setup Wizard, Setup Report and Admin Assist do not require an AI purchase.
+
+
+ Certifications and Deployment Finance do not require this add-on. Pay-data reporting additionally needs ADP Enabled; online payments require provider setup. No reimbursement or savings are guaranteed.
+
+
+ Review seats, supported clients and channel setup. PTT does not provide phone dispatch alerts or certify radio replacement.
+
+
+ Checklists do not require this add-on. Maintenance needs its module, permissions and active entitlement. Historical evidence and hold release follow owning-module rules.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Purchase and enrollment are separate. Review MFA, key recovery and effects on search, exports, integrations and notifications before enrollment.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Checklists do not require Readiness Pro. Maintenance requires the add-on, module access and reviewed repair and approval procedures.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and Advanced Data Protection in the Enabled state. Review regional applicability and protected workforce access.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Review supported clients, channel membership and current subscription quantities. Push-to-Talk is distinct from phone voice alerts and department radio requirements.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ Checklists do not require Readiness Pro. Maintenance requires the add-on, module access and reviewed repair and approval procedures.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Review permissions and setup requirements on the owning screen; saving or sending remains an explicit action.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Requires Business Operations and the capability rollout. Certifications and Deployment Finance remain available without this add-on; payment processing needs its own provider setup.
+
+
+ Review the owning screen, current access and source-specific requirements. Configuration, provisioning, exports and messages require explicit actions; learning about a capability does not activate it.
+
+
+ An administrator enrolls the department and verifies its recovery arrangements.
+
+
+ Ask for an explanation of a configuration finding when the conversational feature is available.
+
+
+ Prepare an event standby invoice or review documented mutual-aid costs.
+
+
+ A SAR coordinator uses a team channel during a training exercise.
+
+
+ A failed apparatus check leads to an explicitly created maintenance work order.
+
+
+ Review the current member's sessions and account security controls.
+
+
+ Manually create a user account in the department
+
+
+ Additional protection and scoped access for cataloged sensitive department content.
+
+
+ Planned summaries, drafts, knowledge assistance and optional Admin Assist conversation.
+
+
+ Invoicing, payments, rates, contracts, bids, MARS reimbursement, workforce and field costing.
+
+
+ Voice channels for crew communication in supported Resgrid clients.
+
+
+ Maintenance, work orders, preventive tasks, corrective work, approvals and safety holds.
+
+
+ Use supported APIs and MCP with authorized credentials and permissions.
+
+
+ Closed and historical calls
+
+
+ Review recorded administrative changes and available source details.
+
+
+ Priced estimates for customer contacts and contracts
+
+
+ Shared display clients show the configured resource and call picture.
+
+
+ Legal name, remit-to address and tax registrations printed on invoices
+
+
+ CFAA cost recovery readiness: agency, F-5 resources, annual rates and agreements
+
+
+ F-42 and expense claims to prepare, validate and hand off to the MARS portal
+
+
+ Salary Survey, Attachment A, Administrative Rate, Rate Letter and Special Equipment snapshots
+
+
+ Observed MARS invoices, local approval and payment reconciliation
+
+
+ Events, meetings and trainings you can sign up for
+
+
+ Call types, priorities, email import and dispatch settings
+
+
+ Maintain reusable call information and note templates.
+
+
+ Maintain the department's call classifications and priorities.
+
+
+ View calls and dispatches
+
+
+ Expiring and expired certifications for people and units
+
+
+ Enforcement mode, grace period and expiry notifications
+
+
+ The department's certification catalog and template gallery
+
+
+ Real-time department chat
+
+
+ Review supported chatbot platforms, account linking, limits and operational actions.
+
+
+ Configure supported check-in targets and escalation behavior.
+
+
+ Review expected, completed, skipped and overdue checks.
+
+
+ Assign recurring checks and review due occurrences.
+
+
+ Start from a checklist template
+
+
+ Apparatus, station and readiness checklists
+
+
+ Prepare and explicitly run tests of configured channels.
+
+
+ Insurance, workers' comp, SAM, licences and bonds with expiry alerts
+
+
+ Send a message, poll or callback request
+
+
+ Manage contact categories
+
+
+ People and organizations outside the department
+
+
+ Service contracts, document requirements and compliance
+
+
+ Internal loaded cost and margin for bids, calls and deployments
+
+
+ Manage supported custom map content for the department.
+
+
+ Configure status names, base meanings and supported behavior.
+
+
+ Department home: status, staffing and activity
+
+
+ Advanced Data Protection enrollment and policies
+
+
+ Department profile, address, API keys and module settings
+
+
+ Switch between the departments you belong to
+
+
+ Create a deployment from an open RMS mutual-aid order
+
+
+ Deployments, rosters, daily time reports and expenses
+
+
+ Dispatchers use the dispatch interface to review calls and resources and explicitly select recipients.
+
+
+ Dispatch behaviour and notification settings
+
+
+ Maintain reusable recipient lists for supported communication flows.
+
+
+ Upload and share documents
+
+
+ Configure supported email and CAD import formats and source credentials.
+
+
+ Attach and maintain files through their owning documents and records.
+
+
+ Custom call and dispatch forms
+
+
+ Department groups and stations
+
+
+ Associate supported tracking devices with department resources.
+
+
+ Plan source ownership and review existing import tools before copying data.
+
+
+ Your messages inbox
+
+
+ Command tools organize incident roles and accountability for authorized commanders.
+
+
+ Prepare incident reports linked to authorized call evidence.
+
+
+ Organize indoor map references and zones where supported.
+
+
+ Inventory for stations and units
+
+
+ Issue or return equipment to personnel
+
+
+ Review stock counts, expiry and configured inventory alerts.
+
+
+ Manage suppliers, purchase orders and receipts.
+
+
+ On-hand, low-stock and expiring inventory
+
+
+ Move inventory between locations
+
+
+ Send email invites so people create their own accounts
+
+
+ Outstanding invoice balances by age
+
+
+ Customer invoices and payments
+
+
+ Routing and directions for active resources
+
+
+ Run, training, work and meeting logs
+
+
+ Configure supported work-order policies and approval requirements.
+
+
+ Review maintenance work, recorded holds and repair history.
+
+
+ Manage map layers
+
+
+ Large map with layers, personnel and units
+
+
+ Choose which optional modules appear and operate for the department.
+
+
+ Your own certification records
+
+
+ Your voluntary self-identification for California pay data reporting
+
+
+ Draft a bid for a customer
+
+
+ Create a calendar event
+
+
+ Create and dispatch a new call
+
+
+ Author a checklist definition
+
+
+ Add a person or organization contact
+
+
+ Create a service contract for a customer
+
+
+ Create a deployment finance wrapper
+
+
+ Upload a new document
+
+
+ Create a group or station
+
+
+ Draft an invoice for a customer
+
+
+ Create a run report, training log or work log
+
+
+ Post a department note
+
+
+ Create a dispatch protocol
+
+
+ Create a training with optional quiz
+
+
+ Add an apparatus, vehicle or team
+
+
+ Open a maintenance work order
+
+
+ Create an automation workflow
+
+
+ Department notes: small bits of shared information
+
+
+ Select events, recipients and conditions for administrative notifications.
+
+
+ Connect your Stripe account to collect invoice payments online
+
+
+ Messages you sent
+
+
+ CRD pay data report runs: snapshots, aggregation, validation, export and the portal worksheet
+
+
+ Configure action permissions, roles and supported group restrictions.
+
+
+ People in the department, status and staffing
+
+
+ Organize department-defined role assignments.
+
+
+ Manage map points of interest
+
+
+ Configure recurring maintenance work and due tasks.
+
+
+ View and edit your own profile, contact methods and notifications
+
+
+ Configure approved releases to supported external workflow destinations.
+
+
+ Dispatch protocols and procedures
+
+
+ Billing rates for units, personnel and fees
+
+
+ Contractor rate tables: certifications, crews, vehicles, equipment, premiums and policies
+
+
+ Review supported aggregate response, workload and readiness reports.
+
+
+ Configure record forms, lifecycle, numbering and review requirements.
+
+
+ Manage disclosure scope, redaction and release approval.
+
+
+ Capture supported source evidence from the owning record workflow.
+
+
+ Configure supported export templates and review their runs.
+
+
+ Place and release holds through the authorized Records lifecycle.
+
+
+ Maintain hydrant and water-source records and their review history.
+
+
+ Schedule and record authorized inspection work and corrections.
+
+
+ Manage authorized investigation records and their controlled workflow.
+
+
+ Maintain premises, contacts, hazards and review metadata.
+
+
+ Manage supported permit records and lifecycle.
+
+
+ Create reusable report selections over authorized record data.
+
+
+ Prepare and reconcile supported reporting submissions from an authorized incident report.
+
+
+ Records queue: run reports, training and operational records
+
+
+ Records due, submissions and quality at a glance
+
+
+ Lifecycle, numbering, search, retention and visibility settings for Records
+
+
+ Generate reports from department data
+
+
+ Depreciation, fuel, maintenance and fixed costs per unit or asset
+
+
+ Individual members use the supported Responder client for their account, availability, calls and notifications.
+
+
+ Manage configured routes and supported route assignments.
+
+
+ Configure matching rules, resource requirements and supported dispatch recommendations.
+
+
+ Configure supported MFA, password, session and network restrictions.
+
+
+ Resume orientation and review current configuration evidence.
+
+
+ Configure supported shared views and links.
+
+
+ Shift signups, recurring shifts and trades
+
+
+ Configure supported identity providers and provisioning.
+
+
+ Review current plan allowances and authorized subscription options.
+
+
+ Configure source numbers, parsing and supported inbound text actions.
+
+
+ Trainings, study guides and procedures
+
+
+ Set up or manage two-factor sign-in
+
+
+ A shared unit client represents an apparatus or team rather than an individual member.
+
+
+ Assign personnel to units
+
+
+ Configure apparatus and resource types and their supported status behavior.
+
+
+ Apparatus, vehicles and teams
+
+
+ Define additional fields for supported forms and records.
+
+
+ Voice channels and push-to-talk
+
+
+ Configure monitored zones and weather alert processing.
+
+
+ Maintenance and repair work orders
+
+
+ Workflow execution history
+
+
+ Automations triggered by department events
+
+
+ Employer identity, establishments, workers, employments and job assignments
+
+
+ W-2 earnings and hours per employment for pay data reporting, with CSV import
+
+
+ Employee, role-default and department-default compensation with pay and employer-cost components
+
+
+ Configure repeating workforce schedules supported by Workshifts.
+
+
+ Keep personal account recovery distinct from department-wide settings.
+
+
+ Control protected content disclosure and recovery through the department protection lifecycle.
+
+
+ Help explain approved evidence and prepare drafts for human review when released.
+
+
+ Connect administrative commercial work to the department activities it supports.
+
+
+ Coordinate field teams through configured voice channels.
+
+
+ Give equipment defects an owner and a recorded repair and return-to-service review.
+
+
+ Connect approved systems without placing credentials in setup examples.
+
+
+ Identify what changed and who should verify the effect.
+
+
+ Choose display refresh, location age and visibility appropriate to a station screen.
+
+
+ Reduce repeated entry while keeping dispatch decisions explicit.
+
+
+ Use consistent reporting and run-card matching terms.
+
+
+ Keep automated access and confirmations under administrator control.
+
+
+ Review lone-worker and response follow-up with approved local procedures.
+
+
+ Find missing recorded checks without treating a report as safety certification.
+
+
+ Make recorded equipment and procedure checks visible to their owners.
+
+
+ Collect observed test evidence; registration alone does not prove delivery.
+
+
+ Give responders useful reference layers with an identified owner and update process.
+
+
+ Use terminology familiar to the department while preserving automation meaning.
+
+
+ Give dispatch personnel a focused operating surface alongside web administration.
+
+
+ Keep audience ownership explicit and review recipients before sending.
+
+
+ Review parsing, routing and observed integration failures before activation.
+
+
+ Keep reference material with its owner, permissions and retention policy.
+
+
+ Review device ownership, stale-position behavior and fallback sources.
+
+
+ Avoid duplicate resources and verify resulting configuration in Setup Report.
+
+
+ Prepare command structures and access before an exercise or response.
+
+
+ Review source completeness before finalization or external submission.
+
+
+ Keep building references available to authorized users without inferring safe routes.
+
+
+ Identify inventory data and supplies that need owner follow-up.
+
+
+ Connect replenishment to recorded stock needs and authorized receipt.
+
+
+ Make authority and repair completion requirements explicit.
+
+
+ Support accountable return-to-service review through the owning workflow.
+
+
+ Reduce navigation clutter while understanding retained data and add-on prerequisites.
+
+
+ Reduce missed follow-up and review unnecessary message volume.
+
+
+ Review who can perform sensitive work and which resources they may see.
+
+
+ Describe responsibility consistently without assuming that a role proves qualification.
+
+
+ Plan equipment upkeep and track corrective responsibility.
+
+
+ Keep protected-data egress scoped, reviewed and auditable.
+
+
+ Use measured source data with its scope and completeness limits.
+
+
+ Fit reporting to approved local procedures while preserving built-in definitions.
+
+
+ Assign review ownership and verify the material approved for release.
+
+
+ Preserve evidence context and access restrictions without copying it into setup guidance.
+
+
+ Keep release destinations, protected access and output handling explicit.
+
+
+ Retain affected evidence while a hold remains active.
+
+
+ Identify records needing verification without claiming current flow or availability.
+
+
+ Track administrative follow-up against configured inspection procedures.
+
+
+ Keep case responsibility and access separate from general department visibility.
+
+
+ Keep site knowledge owned and current; recorded hazards do not certify safety.
+
+
+ Assign review responsibility; a software state is not a hazardous-work safety clearance.
+
+
+ Make repeatable administrative reviews easier.
+
+
+ Review destination requirements and actual submission outcomes.
+
+
+ Separate member device setup from department configuration and verify each member's channels.
+
+
+ Prepare recurring route information with current source ownership.
+
+
+ Review candidate coverage before enabling operational use.
+
+
+ Review lockout and recovery risks with an enrolled administrator.
+
+
+ Keep learning, configuration and verification as separate steps.
+
+
+ Review exposed data and link access before distribution.
+
+
+ Review identity mapping, local fallback and recovery before enforcing SSO.
+
+
+ Choose capacity for actual department needs without inferring prices or terms.
+
+
+ Make approved inbound sources and their operational effects explicit.
+
+
+ Review device identity, assigned crew and unit communications together.
+
+
+ Group comparable resources without assuming staffing or qualification.
+
+
+ Collect the information the department actually needs with appropriate classification.
+
+
+ Review alert coverage and automatic-message settings before use.
+
+
+ Review schedule ownership and local time separately from dispatch eligibility.
+
+
+ Department Suppress Staffing Info / Enable Supress Staffing
+
+
+ Department Suppress Staffing Info / Staffing Levels To Supress
+
+
+ Dispatch Recommendation Config / Eta Shortlist Size
+
+
+ Dispatch Recommendation Config / Include Stale Locations
+
+
+ Dispatch Recommendation Config / Max Location Age Seconds
+
+
+ Dispatch Recommendation Config / Max Radius Meters
+
+
+ Dispatch Recommendation Config / Move Up Recommendations Enabled
+
+
+ Dispatch Recommendation Config / Personnel Max Location Age Seconds
+
+
+ Dispatch Recommendation Config / Rest Period Minutes
+
+
+ Dispatch Recommendation Config / Unit Minimum Staffing Level
+
+
+ Dispatch Recommendation Config / Use Routed Eta
+
+
+ Group Dispatch Scope Config / Department Wide Role Ids
+
+
+ Group Dispatch Scope Config / Enabled
+
+
+ New Call Field Policy / Rules
+
+
+ New Call Field Rule / Key
+
+
+ New Call Field Rule / Required
+
+
+ New Call Field Rule / Visible
+
+
+ Personnel List Status Order / Status Id
+
+
+ Personnel List Status Order / Weight
+
+
+ Personnel List Status Order Setting / Orders
+
+
+ Records Disclosure Config / Default Redaction Profile
+
+
+ Records Disclosure Config / Release Approver User Id
+
+
+ Records Disclosure Config / Statutory Clock Days
+
+
+ Records Numbering Config / Include Year
+
+
+ Records Numbering Config / Number Assignment
+
+
+ Records Numbering Config / Per Group Sequence
+
+
+ Records Numbering Config / Reset Yearly
+
+
+ Records Numbering Config / Sequence Width
+
+
+ Records Retention Override / Applies From
+
+
+ Records Retention Override / Definition Key
+
+
+ Records Retention Override / Retention Years
+
+
+ Records Retention Policy / Department Default Years
+
+
+ Records Retention Policy / History
+
+
+ Records Retention Policy / Last Changed By User Id
+
+
+ Records Retention Policy / Last Changed On
+
+
+ Records Retention Policy / Overrides
+
+
+ Records Retention Policy Version / Effective On
+
+
+ Records Retention Policy Version / Policy
+
+
+ Records Search Config / Include Legacy History
+
+
+ Records Search Config / Index Narrative
+
+
+ Unit Status Threshold / Alert Seconds
+
+
+ Unit Status Threshold / Base Type
+
+
+ Unit Status Threshold / Warn Seconds
+
+
+ Unit Status Thresholds / Thresholds
+
+
+ Unit Type Call Status Override / Dispatch Status
+
+
+ Unit Type Call Status Override / Release Status
+
+
+ Unit Type Call Status Override / Unit Type Id
+
+
+ Unit Type Call Status Override Setting / Overrides
+
+
+ Enables the configured staffing-level suppression in supported notification consumers; review reachability before changing it.
+
+
+ Existing staffing levels to suppress. A suppressed level is not proof that another channel reaches the member.
+
+
+ Number of straight-line candidates per requirement sent for routed ETA when enabled. The owning validator caps provider work.
+
+
+ Permit positions beyond the configured age limit in closest-unit selection, marked stale. Review the risk of outdated positions.
+
+
+ Exclude older unit positions from closest-unit candidates; zero removes the age limit. IncludeStaleLocations changes this behavior.
+
+
+ Maximum candidate distance in meters; zero removes the radius cap. This is not a response-time or route-safety guarantee.
+
+
+ Run the station coverage move-up pass after selection. Recommendations remain subject to approved local dispatch procedures.
+
+
+ Maximum age of personnel positions for closest-unit candidate selection; zero removes the age limit.
+
+
+ Deprioritize recently dispatched resources for this duration; zero disables rotation. This does not infer fatigue or medical fitness.
+
+
+ Minimum configured unit staffing level for recommendation eligibility; zero disables the gate. Units without defined seats pass, and run cards may override it.
+
+
+ Re-rank shortlisted candidates using provider travel estimates. The operational path can make external provider calls; Admin Assist does not.
+
+
+ Existing roles allowed department-wide dispatch views while group scoping is enabled. This changes view scope, not licensing or operational qualification.
+
+
+ Limit supported dispatch views to the member's group subtree. Department administrators and configured department-wide roles keep department-wide access.
+
+
+ Per-field visibility and requiredness for optional call-creation fields. Unconfigured fields remain visible and optional.
+
+
+ One supported built-in call-field key. Name, nature, priority and type cannot be removed through this policy.
+
+
+ Whether a visible optional field must be supplied. Review imports and each supported client before making a field mandatory.
+
+
+ Whether the optional call field is shown on supported creation surfaces. Hidden fields cannot be required.
+
+
+ Existing personnel-status identifier whose list position is being configured.
+
+
+ Relative list order for this status. Confirm all configured statuses remain represented.
+
+
+ Ordered status weights for supported personnel lists. This does not set availability or dispatch priority.
+
+
+ Default redaction profile in the owning disclosure workflow. Review the actual proposed release before approval.
+
+
+ Authorized member responsible for disclosure release approval. Selecting an approver does not grant missing permissions or protected-data access.
+
+
+ Configured disclosure review clock. Verify local obligations with the responsible owner; the default does not establish a legal deadline.
+
+
+ Include the year between the record prefix and sequence number.
+
+
+ Choose when numbers are assigned for definitions using department defaults. Review existing references before changing numbering behavior.
+
+
+ Use separate station/group sequences. This changes numbering, not record visibility.
+
+
+ Restart record sequences each calendar year in the department time zone.
+
+
+ Zero-padded sequence width for definitions using department defaults. The Records editor validates the supported width.
+
+
+ Prospective boundary for revisions eligible for the override, evaluated by the Records lifecycle.
+
+
+ Stable record-definition key to which this override applies. Display names do not identify a retention policy.
+
+
+ Years retained under this definition override; zero means permanent. Holds and prospective policy resolution still apply.
+
+
+ Department retention for standard record classes. Zero means permanent; protected classes, prior policy and holds can retain records longer.
+
+
+ Prior policy versions retained by the owning lifecycle so current changes do not silently rewrite historical retention.
+
+
+ Recorded policy-change actor. It is not an editable retention rule and is not exposed as raw identity in this reference.
+
+
+ Policy effective timestamp used with prior policy versions. It is not the record's retention expiry date.
+
+
+ Definition-specific prospective retention overrides. Use the Records workflow and its confirmations; Admin Assist never purges records.
+
+
+ Effective timestamp of a stored historical retention policy version.
+
+
+ Historical policy snapshot used to resolve retention for older revisions. Never edit this as an ordinary preference.
+
+
+ Include supported legacy personnel and unit logs in the Records search scope. Source permissions still apply.
+
+
+ Include unprotected narrative in search. Advanced Data Protection enrollment withdraws narrative indexing; this preference cannot override protection.
+
+
+ Seconds in this status before a higher-priority highlight; zero disables it. Highlighting does not send a page or change status.
+
+
+ Base status meaning for a threshold, independent of custom status names and colors.
+
+
+ Seconds in this status before a warning highlight; zero disables it. An alert at or before this threshold makes the row alert-only.
+
+
+ Board highlighting thresholds grouped by base status meaning. An empty list disables highlighting.
+
+
+ Status applied to this unit type on dispatch; minus one leaves it unchanged.
+
+
+ Status applied to this unit type on release; minus one leaves it unchanged.
+
+
+ Existing unit type receiving this override. A unit type name is not a qualification or staffing clearance.
+
+
+ Per-unit-type dispatch and release status overrides. The owning consumer resolves these before department defaults.
+
+
+ Choose the areas your department uses
+
+
+ Configure and verify
+
+
+ Follow up on findings
+
+
+ Use Settings Reference and Change History
+
+
+ Start or resume setup
+
+
+ Understand optional add-ons
+
+
+ Administrators selected by this policy who lack MFA enrollment
+
+
+ Department members and authorized consumers of this setting.
+
+
+ Saved call ID
+
+
+ Capacity headroom
+
+
+ Enter proposed total personnel and unit counts, including existing resources. This does not add, remove or purchase anything.
+
+
+ Preview plan capacity
+
+
+ A preview needs no rollback. Any later resource or subscription change follows its owning workflow.
+
+
+ Positive headroom is remaining allowance; a negative value exceeds the observed base-plan limit. Entity plans share one allowance across personnel and units. Add-on seats, storage, provider quotas and prices are not included.
+
+
+ Billing observations can change. Existing plan enforcement remains authoritative when adding resources. No purchase, reservation, resource deletion or entitlement change is performed.
+
+
+ Personnel newly selected
+
+
+ Personnel route attempts, including direct duplicates
+
+
+ Route selection is not channel eligibility or delivery. Profiles, suppression, registrations, provider availability and other recipient gates can prevent a send. Review the authorized Calls and Communication Tests screens; this preview never dispatches or tests a channel.
+
+
+ Dispatched groups with empty-shift fallback
+
+
+ Use a saved call as a route scenario. Enter its numeric ID from the Calls screen and choose all three proposed routing options. Current settings and membership are read afresh; nothing is sent or saved.
+
+
+ Distinct personnel selected
+
+
+ Preview dispatch routing
+
+
+ Personnel no longer selected
+
+
+ Call scenarios checked
+
+
+ Compares direct, group, role and unit-crew/group routes through the broadcaster’s recipient resolver. Repeated direct dispatch rows remain separate attempts; expanded routes deduplicate. Unit device, printer and external routes are outside these personnel counts. This does not propose group-scope or permission changes.
+
+
+ The explicit UTC time selects resolved shifts, including approvals, trades and overnight windows. Call routes, group/role membership and unit crews are current observations, not reconstructed historical assignments. Inputs are reread to detect changes during the preview.
+
+
+ Effect
+
+
+ Disabling the map override on the owning screen removes its saved style and token. Re-enabling requires re-entering those values.
+
+
+ Complete authorized map evidence could not be read. Marker effects are unknown; an unavailable source is not a zero count.
+
+
+ TTL expires location pings; a saved status location can remain visible. A shorter TTL does not necessarily remove a marker.
+
+
+ Personnel or units checked
+
+
+ Locations and statuses are read during this request and evaluated at the report time. Counts can change with new pings; historical replay and other map consumers are not included.
+
+
+ Marker counts use the v4 map selection rules and your current location permissions. They do not predict another member’s access or change location permissions.
+
+
+ Markers newly visible
+
+
+ Markers no longer visible
+
+
+ Scope 1 includes department admins and the managing member; scope 2 also includes group admins without double-counting them. Hidden current members remain in scope. This is enrollment metadata; session enforcement, supported recovery factors, other MFA policies and SSO behavior require separate verification. The owning screen requires the managing member and the current admin to enroll before enforcement can be enabled.
+
+
+ Module
+
+
+ Stored rows in the module’s primary table
+
+
+ Hide this module
+
+
+ Preview the legacy module navigation switches. Enabling a switch does not grant permissions, enroll an add-on or complete feature setup. Calls, personnel and units remain core areas.
+
+
+ Memberships whose module navigation changes
+
+
+ Current memberships with the module navigation entry enabled
+
+
+ Preview a module switch
+
+
+ Stored rows behind a hidden module entry
+
+
+ Menu counts cover current department memberships, including hidden members. They describe the shared web navigation gate, not successful sign-in, each member’s visible records or mobile clients. Content counts cover only primary Messages, Shifts, Documents, CalendarItems, Notes and Trainings rows; they include retained or expired rows. Mapping and Reports aggregate other sources; Logs/Records and Inventory have multiple data models. Their content totals remain unknown until the corresponding adapters are available. The licensed maintenance, checklist and business switches need their own entitlement-aware preview.
+
+
+ A saved switch affects navigation after its owning settings cache and page refresh. Hiding a menu does not delete data, revoke an existing API permission or prove that a worker stops. Verify relevant consumers and scheduled work separately before relying on a switch as an operational shutdown.
+
+
+ This preview reads current evidence and changes values only in memory. Use the owning screen to make a change.
+
+
+ Host broadcast gate blocks this department (1 = yes)
+
+
+ Counts use the same ordinary notification preference/contact gate as the sender. A grandfathered verification value is allowed by that gate. Missing profiles and staffing outside this department widen the range. Email addresses, phone numbers, device tokens and staffing notes are not read. Address/device validity, provider availability, SMS segmentation/retries, chat/voice and IC-app delivery remain unverified. Zero to the displayed upper bound is an ordinary channel-handoff estimate, not a device-message count, delivery guarantee or SMS bill.
+
+
+ Future window (days)
+
+
+ Email preference/contact gate — maximum members
+
+
+ Email preference/contact gate — minimum members
+
+
+ Assumed events per member in the entire window
+
+
+ Compare staffing suppression for a department-wide scenario. Enter the same number of ordinary notification events per current active member over the next 1–30 days. This is a declared scenario, not an observed event forecast.
+
+
+ Historical events sampled (not used in this scenario)
+
+
+ Current active members evaluated, including hidden members
+
+
+ Members with unavailable channel preferences
+
+
+ Unblocked members with none of these three channel gates enabled
+
+
+ Preview notification volume
+
+
+ Push preference gate — maximum members
+
+
+ Push preference gate — minimum members
+
+
+ Members potentially passing at least one channel preference/contact gate — maximum
+
+
+ Members passing at least one channel preference/contact gate — minimum
+
+
+ Assumed ordinary events per member in the window
+
+
+ The sample contains current non-deleted, non-disabled members, including hidden members, and is bounded. Event counts are your assumption across the full future window; current membership, preferences and staffing are held constant. This does not resolve notification-rule audiences, plan-limited recipient expansion, event-specific conditions, Calendar/Training overrides or historical recipients. No event history was sampled.
+
+
+ SMS preference/contact gate — maximum members
+
+
+ SMS preference/contact gate — minimum members
+
+
+ Members whose suppression cannot be determined
+
+
+ Proposed: apply the currently configured staffing suppression list
+
+
+ Members blocked by a verified staffing or host gate
+
+
+ The hypothetical change only toggles the existing staffing suppression list in memory. Actual sends use their current membership and suppression caches plus fresh provider gates, so a later send can differ. Review the list on the owning screen and run an authorized Communication Test after a real change; this preview never sends, saves or changes staffing.
+
+
+ Possible ordinary channel handoffs in the window — upper bound
+
+
+ Possible ordinary channel handoffs in the window — lower bound
+
+
+ Declared future window in days from this evaluation
+
+
+ Proposed audience
+
+
+ Department administrators
+
+
+ Department and group administrators
+
+
+ Department administrators and selected roles
+
+
+ Everyone
+
+
+ Members allowed at least one evaluated action or target
+
+
+ Allowed member/action or member/target pairs
+
+
+ Newly allowed pairs
+
+
+ Choose a supported permission and its complete proposed policy. Current members, roles, groups and resource scopes are checked afresh. The preview does not save permissions or refresh access.
+
+
+ Restrict resource visibility to group scope
+
+
+ No longer allowed pairs
+
+
+ Preview a permission change
+
+
+ Restore the prior permission using Security. Information already viewed or actions already performed cannot be recalled.
+
+
+ Selected department roles
+
+
+ Current department members evaluated
+
+
+ Uses current memberships, including hidden members but excluding disabled and deleted memberships. Resource visibility uses the shared authorization decision, including target-group ancestors. Ungrouped people do not share a group. Counts measure the named permission gate, not complete end-to-end access: identity lockout, client claims, feature access, protected data, resource ownership and other gates still apply. More than 100,000 actor/target pairs, ambiguous memberships or unavailable source data produce unknown results.
+
+
+ Resource targets (or one department action)
+
+
+ Direct authorization reads, cached visibility matrices, claims and existing sessions can refresh at different times. Verify the affected web and mobile actions after saving; this preview neither refreshes sessions nor grants access.
+
+
+ Permission
+
+
+ Personnel headroom
+
+
+ Visible personnel markers for your current access
+
+
+ Total personnel
+
+
+ Preview a proposed value
+
+
+ Proposed: include assigned unit crews
+
+
+ Proposed: use on-duty shifts instead of group membership
+
+
+ Proposed: include unit station groups
+
+
+ Proposed value
+
+
+ Verified eligibility for deletion across all dependencies
+
+
+ Expired sample headers requiring further owning-lifecycle review
+
+
+ Default years for future standard-class revisions (0 = permanent)
+
+
+ Sample headers past their historical policy window
+
+
+ Sample covers both complete record populations (0 = no, 1 = yes)
+
+
+ Expired sample headers excluded by a known direct or preservation hold, casualty, rescue or exposure content
+
+
+ Compare a prospective Records retention default. Leave blank for the system class default; zero means permanent. Existing definition overrides and historical policies are preserved. This preview cannot delete data.
+
+
+ The owning Records policy preserves previous policy versions. A prospective default applies to future finalized revisions; older revisions keep the policy that applied when they became official. Definition overrides remain in force. Restricted classes remain permanent unless an explicit authorized override applies. This is policy behavior, not a legal retention recommendation.
+
+
+ Expired sample headers excluded because historical hold coverage is uncertain
+
+
+ The sample contains at most 250 unpurged headers of each parent record type in identifier order. Counts are not population estimates when the sample is incomplete. Open, amending, recently changed and unexpired headers are excluded. Known parent and preservation holds and permanent casualty/rescue/exposure content are excluded; possible historical period holds remain uncertain. Child analyses and their holds, revision integrity, disclosure productions, evidence retention, attachments and external storage, workflow/outbox activity, submissions and search erasure still require the owning retention checks. Remaining candidates are not authorization or proof of purge eligibility.
+
+
+ Preview retention policy
+
+
+ Retention and Advanced Data Protection have separate lifecycles. Changing a default or cancelling an add-on does not decrypt or erase protected content. The owning protection policy, recovery and offboarding process remain authoritative. This preview reads metadata only and neither changes protection nor calls a purge workflow.
+
+
+ Unpurged record headers in the sample
+
+
+ Proposed default retention years
+
+
+ Restore the previous value on its owning screen where supported. Delivered messages, deleted secrets and purged data cannot be recalled.
+
+
+ Stored active, unexpired department sessions sampled
+
+
+ Sessions that will actually require reauthentication
+
+
+ Members currently at or above the proposed next-session limit
+
+
+ Enabled SSO configuration rows (provider connection not tested)
+
+
+ Existing passwords satisfying the proposed length
+
+
+ Tracked member passwords crossing the owning expiry boundary now
+
+
+ Security-policy field
+
+
+ Compare one supported security-policy field using current member and session metadata. No credentials, recovery codes, device details or provider secrets are displayed. Current sign-in state can change after this evaluation.
+
+
+ Members without verified identity metadata
+
+
+ Current-generation managed sessions crossing the idle boundary now
+
+
+ Sampled sessions created on or after the host policy date gate
+
+
+ The owning atomic insert counts active, unexpired sessions in this department created on or after the host policy gate. Reaching the limit blocks a new managed session; it does not revoke existing sessions. Zero removes this department limit. The preview uses the same counted set, including rows that may later fail another validation gate, and cannot predict concurrent logins or future expiry.
+
+
+ Current active members in the bounded sample
+
+
+ Members subject to MFA completion at the supported sign-in gate
+
+
+ Members potentially requiring MFA enrollment — maximum
+
+
+ Members requiring MFA enrollment by this policy — minimum
+
+
+ The owning validator enforces a minimum of eight characters and its fixed digit, uppercase and lowercase requirements. This field changes supported future password changes; stored password hashes cannot reveal current length. The stored complexity preference does not disable that fixed validator, and this preview does not inspect passwords.
+
+
+ Effective minimum for supported password-change validators
+
+
+ The owning password-age check expires tracked dates only after the configured day boundary. Zero disables that check; missing dates are grandfathered rather than forced to expire. Counts do not imply that SSO users use a local password or that every client enforces expiry identically. Supported sign-in/password-change flows apply the actual enforcement.
+
+
+ Members subject to the RequireSso password-login gate
+
+
+ Stored / proposed policy value (boolean: 1 = enabled)
+
+
+ Preview sign-in and session policy
+
+
+ Proposed value
+
+
+ Working provider, account linkage and recovery access
+
+
+ Usable factors and recovery arrangements
+
+
+ TwoFactorEnabled is an enrollment indicator, not proof of a working factor or recovery path. The supported policy gate requires completed Resgrid MFA for both password and SSO sign-in. Administrator-only MFA requirements remain separate and may still apply when this field is off. Review authenticator/recovery setup with affected members before enforcement; the preview does not authenticate them.
+
+
+ The RequireSso gate blocks password sign-in only when an SSO configuration is enabled. With no enabled provider, the owning service keeps its safety valve. Enabled does not prove IdP connectivity, correct claims, member linkage or emergency recovery. Provider AllowLocalLogin and client-specific gates are separate and can further restrict access. Verify a working alternate administrator session and recovery procedure before changing policy.
+
+
+ This is a bounded metadata snapshot of current members, including hidden members. It compares one field in memory through decisions shared with the owning consumers. Other sign-in, identity, enrollment, credential and source-availability checks still apply. No password hash, factor secret, IP address or session ticket is read; no session is revoked, refreshed or created.
+
+
+ Host session-policy date gate is active now (1 = yes)
+
+
+ Idle timeout applies only to managed sessions created on or after the configured host policy date gate. A blank/invalid gate means this department timeout is not enabled by that consumer; older sessions are excluded. Counts use stored last activity, which can lag because activity writes are throttled. Credential cutoff, generation, expiry, current request claims and tracking deployment determine actual reauthentication. Zero disables this department-specific idle check; it does not disable normal session expiry.
+
+
+ RequireSso set without an enabled provider (1 = safety valve applies)
+
+
+ Members without a tracked password-change date
+
+
+ Shared entity headroom
+
+
+ Roster simulation time (UTC; within seven days of now)
+
+
+ Configuration changed. Use Verify again to refresh the report, then review your proposal before previewing it.
+
+
+ Observed personnel whose displayed status changes
+
+
+ Complete authorized status evidence is unavailable. No zero-change conclusion can be drawn.
+
+
+ Proposed markers using a status location
+
+
+ Distinct personnel with an observed status in either projection
+
+
+ Compares the owning one-hour automatic-availability filter at the report time, with its one-year history bound. Hidden, disabled and deleted members are outside this query. Members with no status in either projection are outside the sample. This does not quantify shift, unit-crew or staffing-level automation.
+
+
+ Standing-by statuses in the observed sample
+
+
+ Automatic availability affects the next supported status read after the one-hour cutoff; the preview does not write a new status or prove physical availability. New status updates can change these counts.
+
+
+ Setting value (Boolean: 0 = no, 1 = yes)
+
+
+ Actual successful inbound acceptance
+
+
+ Enters the command branch before identity checks (0 = no, 1 = yes)
+
+
+ Enters the call-import branch (0 = no, 1 = yes)
+
+
+ Choose the provider path actually used by your department and a test sender number. Compare the complete proposed text-call and command switches against current source patterns. No text is received or sent.
+
+
+ Provider path
+
+
+ Matches a configured dispatch source pattern (0 = no, 1 = yes)
+
+
+ Preview a text sender scenario
+
+
+ Proposed: enable text calls
+
+
+ Proposed: enable text commands
+
+
+ Text settings are not uniform provider enforcement. The current SignalWire path reads both switches and treats unmatched senders as dispatch sources when commands are disabled. The Twilio legacy path classifies dispatch senders by patterns without consulting these two switches; its chatbot path has separate controls. This preview does not establish accepted or rejected senders, verify numbers, validate a webhook, run a parser or send a page. Review the active provider before relying on a switch to stop intake.
+
+
+ Sender scenarios evaluated
+
+
+ This is one routing scenario after department resolution and the plan gate. It does not establish number ownership, the active SMS department, supported plan, authenticated webhook, verified sender identity, chatbot permissions, opt-out exceptions, parser success or call delivery. Twilio chatbot and master-number paths, email, CAD and API imports are outside this evaluator. A zero call-branch value may still permit a command or opt-out response. The source number is used only for this request; the returned reference is masked. No historical acceptance rate is inferred.
+
+
+ Test sender number
+
+
+ Twilio legacy text path
+
+
+ Verify the owning consumer after saving; session, cache and client refresh behavior can differ.
+
+
+ Unit headroom
+
+
+ Visible unit markers for your current access
+
+
+ Total units
+
+
+ These figures cover the listed checks only. Effects without a metric, including provider delivery and session enforcement, have not been quantified.
+
+
+ Return to Setup Report and verify current evidence. Communication tests must be reviewed and started explicitly.
+
+
+ Choose a change window and responsible verifier using approved local procedures. Verify again after saving; new source data can invalidate this preview.
+
+
+ BusinessOperations availability
+
+
+ Calendar availability
+
+
+ Calendar menu name
+
+
+ Checklists availability
+
+
+ Documents availability
+
+
+ Documents menu name
+
+
+ Inventory availability
+
+
+ Inventory menu name
+
+
+ Logs availability
+
+
+ Logs menu name
+
+
+ Maintenance availability
+
+
+ Maintenance menu name
+
+
+ Mapping availability
+
+
+ Mapping menu name
+
+
+ Messaging availability
+
+
+ Messaging menu name
+
+
+ Notes availability
+
+
+ Notes menu name
+
+
+ Reports availability
+
+
+ Reports menu name
+
+
+ Shifts availability
+
+
+ Shifts menu name
+
+
+ Training availability
+
+
+ Training menu name
+
+
+ Controls availability of business operations. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Controls availability of calendar events. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for calendar events in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of checklists. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Controls availability of shared documents. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for shared documents in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of inventory. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for inventory in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of legacy logs. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for legacy logs in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of maintenance and work orders. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for maintenance and work orders in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of maps and location views. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for maps and location views in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of messages and announcements. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for messages and announcements in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of notes. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for notes in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of reports. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for reports in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of shift scheduling. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for shift scheduling in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Controls availability of training. Disabling this module can remove navigation and block module operations; it does not delete its records. Turning it on still requires the applicable subscription, rollout and permissions.
+
+
+ Optional display name for training in consumers that support the override. It changes the label, not permissions or functionality. This release has no separate name-override control in Module Settings.
+
+
+ Emergency management and response
+
+
+ EMS and ambulance
+
+
+ Fire
+
+
+ Hazardous materials response
+
+
+ Industrial response
+
+
+ Mental health and mobile crisis
+
+
+ Multi-agency and mutual aid
+
+
+ Search and rescue
+
+
+ Security and facilities
+
+
+ The pack can organize declared sites, personnel, supply expiry and continuity references. Shelter capacity, welfare needs, external agency availability, deployment conflicts and actual communications coverage are not yet measured by these checks. Review those sources with the response coordinator.
+
+
+ The pack can flag credential expiry, configured staffing gaps and stock/check metadata. It does not verify clinical scope, patient-care protocols, drug administration authority, medical equipment suitability or patient handover completion. Use the approved clinical and logistics systems with their responsible owners.
+
+
+ The pack can flag configured roster vacancies, qualifications, equipment checks and holds. It does not verify apparatus minimum staffing, command competence, local response standards or pre-incident plans. Have the responsible fire-service owner review these sources and the fallback plan.
+
+
+ The pack can flag recorded qualifications, overdue checks, expiring supplies and safety holds. It does not infer Hazmat response level, instrument calibration compliance, exposure clearance or protective-equipment suitability. Review actual approved requirements with the Hazmat program owner.
+
+
+ The pack can flag site-reference gaps, qualifications, equipment restrictions and supply expiry. Permit-to-work authority, process hazards, contractor clearance, site shutdown state and external plant alarms are not evaluated. The site response owner must verify those sources.
+
+
+ The pack can organize team coverage, protected access and current procedure references. After-hours referral ownership, crisis-service availability, clinical supervision and case handover are not yet measured. Confirm these with the responsible service owner without entering client narratives into setup.
+
+
+ The pack can organize shared-work areas, personnel and agreement references. External agency commitments, resource typing, cross-agency credentials, simultaneous assignments, cost eligibility and reimbursement acceptance are not verified. Confirm these with the participating agencies and finance owner.
+
+
+ The pack can flag configured roster gaps, credentials and overdue equipment checks. Search-sector coverage, terrain access, radio coverage, external resource location, missing-person case handling and mission suitability require their owning systems and a search-service reviewer.
+
+
+ The pack can review scoped resource visibility, configured shifts, credentials and check-in configuration. Post orders, lone-worker response arrangements, client deadlines and actual site access are not verified by these checks. Review them with the responsible operations owner.
+
+
+ Capability-gap tracking owner: Resgrid.Core. Sector-specific acceptance review is pending; these prompts are not approved local operating requirements.
+
+
+ Use approved local requirements. Missing external evidence remains unknown; this report does not certify operational safety.
+
+
+ Review activation rosters, volunteer onboarding, partner contacts and supplies.
+
+
+ Review qualification mix, ambulance checks, supply expiry and receiving contacts.
+
+
+ Review apparatus, qualified crew, run cards and mutual-aid arrangements.
+
+
+ Review locally approved qualifications, instrument checks, PPE and procedure review.
+
+
+ Review site coverage, escalation, equipment restrictions and approved local procedures.
+
+
+ Review clinician, peer and interpreter coverage, escalation contacts and restricted records.
+
+
+ Review agency-specific recipients, agreements, resource typing and cost documentation.
+
+
+ Review specialty qualifications, team availability, equipment checks and check-in arrangements.
+
+
+ Review site and post coverage, qualifications, check-in configuration and client deadlines.
+
+
+ Add Call Data
+
+
+ Add Personnel
+
+
+ Adjust Inventory
+
+
+ Amend Records
+
+
+ Approve Records
+
+
+ Approve Time Reports
+
+
+ Break Glass Protected Data
+
+
+ View personnel locations
+
+
+ View unit locations
+
+
+ Close Call
+
+
+ Command App Login
+
+
+ Configure Protected Data Egress
+
+
+ Contact Delete
+
+
+ Contact Edit
+
+
+ Contact View
+
+
+ Create Calendar Entry
+
+
+ Create calls
+
+
+ Create Document
+
+
+ Create Log
+
+
+ Create Message
+
+
+ Create notes
+
+
+ Create Record
+
+
+ Create Shift
+
+
+ Create Training
+
+
+ Create Workflow
+
+
+ Delete Call
+
+
+ Delete Log
+
+
+ Delete Record
+
+
+ Dispatch App Login
+
+
+ Edit Protected Call Data
+
+
+ Export Pay Data Reporting
+
+
+ Export Protected Data
+
+
+ Export Records
+
+
+ Finalize Records
+
+
+ Issue Inventory
+
+
+ Manage Bids
+
+
+ Manage Certification Setup
+
+
+ Manage Certifications
+
+
+ Manage Checklists
+
+
+ Manage Contracts
+
+
+ Manage Controlled Substances
+
+
+ Manage Department Data Protection
+
+
+ Manage Deployments
+
+
+ Manage Invoicing
+
+
+ Manage Mutual Aid Reimbursement
+
+
+ Manage Pay Data Reporting
+
+
+ Manage Record Definitions
+
+
+ Manage Record Disclosures
+
+
+ Manage Record Legal Hold
+
+
+ Manage Record Reports
+
+
+ Manage Routes
+
+
+ Manage Work Orders
+
+
+ Manage Workflow Credentials
+
+
+ Manage Workforce Compensation
+
+
+ Publish Record Definitions
+
+
+ Reassign Record Drafts
+
+
+ Records Prevention Admin
+
+
+ Remove Personnel
+
+
+ Review Records
+
+
+ Share Records Externally
+
+
+ Submit Records
+
+
+ Transfer Inventory
+
+
+ Use Calendar Sync
+
+
+ View All Work Orders
+
+
+ View Certifications
+
+
+ View Checklist Results
+
+
+ View Group Records
+
+
+ View units
+
+
+ View personnel
+
+
+ View Internal Costs
+
+
+ View Invoicing
+
+
+ View Legacy Records
+
+
+ View personal information
+
+
+ View Protected Call Data
+
+
+ View Protected Contact Data
+
+
+ View Protected Operational Data
+
+
+ View Protected Personnel Data
+
+
+ View Restricted Records
+
+
+ View custom field Fields
+
+
+ View Workflow Runs
+
+
+ View Workforce Compensation
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Controls the location visibility gate for each viewer and person. The preview counts access pairs, not current map markers, tracking consent or GPS availability.
+
+
+ Controls the location visibility gate for each viewer and unit. A group lock refers to the unit’s station and the owning group hierarchy, not any station a viewer can otherwise see.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Allows starting a call. The department-level action uses each member’s actual administrator state and personnel roles; later dispatch validation remains authoritative.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Allows creating a department note. The action does not grant access to protected note contents or another department.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Controls visibility of unit targets and their assigned stations. Ungrouped viewers and unassigned units do not share a group.
+
+
+ Controls visibility of personnel targets. A group lock can narrow target scope; administrators of a target group or its ancestors use the owning visibility policy.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Controls the personal-information permission gate. Protected fields still require their own current authorization and data protection grant.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Review this permission on the Security screen. Its default when no policy is saved, group scope, dependent permissions and behavior across web, API and mobile are awaiting a complete consumer review. No live impact preview is available for this permission yet.
+
+
+ Accessibility preferences
+
+
+ Authoritative source systems
+
+
+ Another administrator changed this profile. Your proposed values are still shown. Reload the current profile before saving again.
+
+
+ Approved continuity procedures
+
+
+ Approximate member count (optional)
+
+
+ Dispatch model
+
+
+ Enter existing numeric document IDs for approved policies in this department. Expired documents cannot be referenced. Saving verifies existence, not approval or suitability.
+
+
+ Enter existing numeric group IDs from this department. Saving adds another optional row.
+
+
+ One or more group or document references are invalid, expired or unavailable in this department. Check the references and try again.
+
+
+ Working languages
+
+
+ Participates in mutual aid
+
+
+ No
+
+
+ Operating hours
+
+
+ Approved qualification policies
+
+
+ Reference
+
+
+ Enter existing reference identifiers, not sensitive details. Saving adds another optional row.
+
+
+ Reload current profile
+
+
+ Save operating profile
+
+
+ Season ends (MM-DD, optional)
+
+
+ Season starts (MM-DD, optional)
+
+
+ Sites and service-area groups
+
+
+ Approved staffing policies
+
+
+ Use a short source-system reference label. These labels are declarations; saving does not verify a connection or import.
+
+
+ Department time zone
+
+
+ Workforce mix
+
+
+ Yes
+
+
+ Captions
+
+
+ Career
+
+
+ Central dispatch
+
+
+ Combination
+
+
+ 24-hour operation
+
+
+ Contract
+
+
+ External dispatch
+
+
+ Large text
+
+
+ On call
+
+
+ Plain language
+
+
+ Scheduled hours
+
+
+ Screen reader
+
+
+ Seasonal
+
+
+ Self dispatch
+
+
+ Unknown
+
+
+ Volunteer
+
+
+ Accessibility preferences
+
+
+ Operating sectors
+
+
+ Authoritative system references
+
+
+ Continuity procedure documents
+
+
+ Declared member count
+
+
+ Dispatch model
+
+
+ Expected email polling interval (minutes)
+
+
+ Working languages
+
+
+ Mutual aid participation
+
+
+ Operating hours
+
+
+ Qualification policy documents
+
+
+ Profile review time
+
+
+ Profile revision
+
+
+ Season end
+
+
+ Season start
+
+
+ Sites and groups
+
+
+ Staffing policy documents
+
+
+ Workforce mix
+
+
+ Record screen-reader, caption, large-text or plain-language needs for setup planning. Verify client behavior with the people who use it.
+
+
+ Choose all sectors served by the department. A pack suggests administrative reviews; it does not establish qualification or clinical scope.
+
+
+ Short declared source-system labels. Saving this list does not verify a connection, an import or the freshness of external data.
+
+
+ Reference existing department document IDs for approved continuity procedures. Test fallback communications and ownership through the approved procedure.
+
+
+ Optional planning estimate; actual membership and subscription counts come from their owning sources.
+
+
+ Record whether dispatch is central, self-directed, external or a combination. Verify each routing path through its owning settings.
+
+
+ Optional maximum time between recorded mailbox polls, from 1 to 10080 minutes. Blank means no declared polling expectation. This checks configured email connectors, not how often calls arrive; it does not measure SMS, CAD push or API health. Review the host polling schedule before setting it.
+
+
+ Languages used by the team. This preference does not prove interpreter availability or translate operational records.
+
+
+ Declare whether mutual aid is part of operations. Agreements, access and response eligibility require separate review.
+
+
+ Describe continuous, scheduled, on-call or seasonal operation. This is context and does not create shifts or guarantee coverage.
+
+
+ Reference existing department document IDs for approved qualification policies. Do not infer a license, scope of practice or deployment qualification from a role label.
+
+
+ Server-recorded time of the most recent validated profile save; it does not certify operational readiness.
+
+
+ Server revision used to reject concurrent overwrites. Reload when another administrator has saved a newer profile.
+
+
+ End of a declared seasonal period, in MM-DD format. A period can cross a calendar year; verify actual rosters separately.
+
+
+ Start of a declared seasonal period, in MM-DD format. Provide both start and end; this does not enable or disable resources on those dates.
+
+
+ Reference existing numeric group IDs in this department. This does not grant group access or change dispatch scope.
+
+
+ Reference existing department document IDs for approved staffing policies. The save checks existence and expiry, not policy approval or adequacy.
+
+
+ Describe the workforce so setup guidance can reflect career, volunteer, contract or combined operations.
+
+
+ Administrators need MFA enrollment
+
+
+ Administrator MFA is not enforced
+
+
+ Administrator succession needs review
+
+
+ Automatic check-in timers have no configuration
+
+
+ Required checks are overdue
+
+
+ Combined text intake and commands lack sender separation
+
+
+ Communication verification needs review
+
+
+ No continuity procedure is linked
+
+
+ Qualifications expire soon
+
+
+ Email import reports a failure
+
+
+ Groups have no active members
+
+
+ Equipment restrictions need review
+
+
+ Expected email polling evidence is missing
+
+
+ Custom map style is missing
+
+
+ Custom map credentials are missing
+
+
+ Administrator password resets need review
+
+
+ Personnel locations never expire
+
+
+ Personnel capacity is nearly full
+
+
+ Referenced policy documents expire soon
+
+
+ Referenced policies are unavailable
+
+
+ Required qualifications are uncovered
+
+
+ Record review deadlines need attention
+
+
+ Dispatch recommendations have no run cards
+
+
+ Shift status automation is inactive
+
+
+ Shift coverage needs review
+
+
+ Upcoming shifts have unfilled configured slots
+
+
+ Personnel have overlapping shift assignments
+
+
+ Upcoming shift trades are incomplete
+
+
+ Declared site references are unavailable
+
+
+ Station locations are incomplete
+
+
+ Stock expires soon
+
+
+ Text call sender routing needs review
+
+
+ Units have no group
+
+
+ Unit capacity is nearly full
+
+
+ Unit locations never expire
+
+
+ Units have no type
+
+
+ Weather alerts have no zones
+
+
+ Workflow failures need review
+
+
+ Review current administrator enrollment.
+
+
+ Review the administrator MFA requirement and recovery arrangements.
+
+
+ Review another authorized administrator and account recovery.
+
+
+ Review timer targets and escalation before activation.
+
+
+ Review overdue checklist assignments.
+
+
+ Review provider-specific dispatch sender classification and verified member commands.
+
+
+ Explicitly run a reviewed Communication Test.
+
+
+ Link an approved current document or review the external source with its responsible owner.
+
+
+ Review credentials due within the next 30 days.
+
+
+ Review the import error on the authorized Call Settings screen and verify the next poll.
+
+
+ Review group membership and intended use.
+
+
+ Review active holds and corrective work.
+
+
+ Review configured mailboxes, the host polling schedule and the declared interval. SMS, CAD push and API intake require separate evidence.
+
+
+ Review the custom map style.
+
+
+ Review the map override on its protected configuration screen.
+
+
+ Review the password-reset policy.
+
+
+ Choose a location lifetime appropriate to your workflow.
+
+
+ Review member usage and current subscription options.
+
+
+ Review document replacement or expiry with the responsible policy owner.
+
+
+ Review the operating profile references and their owning documents.
+
+
+ Review the owning qualification and roster evidence.
+
+
+ Review authorized overdue records.
+
+
+ Review run cards before relying on recommendations.
+
+
+ Review shift dispatch and automatic-status settings.
+
+
+ Review coverage and preview the dispatch recipients.
+
+
+ Review the shift roster and approved local staffing requirements.
+
+
+ Review assignments and trades; role eligibility does not establish physical availability.
+
+
+ Review outstanding offers and supervisor approvals.
+
+
+ Review current sites and service-area groups in the operating profile.
+
+
+ Review station addresses and coordinates.
+
+
+ Review expiring lots and authorized replenishment.
+
+
+ Review the active provider, approved sender patterns and controlled intake verification.
+
+
+ Review each unit group assignment.
+
+
+ Review unit usage and current subscription options.
+
+
+ Review unit location lifetime and device updates.
+
+
+ Assign the appropriate unit types through the Units screen.
+
+
+ Review weather alert zones.
+
+
+ Review failed runs and their owning workflow.
+
+
+ Enforcement settings alone do not prove that every administrator has enrolled.
+
+
+ Administrative accounts control department access and configuration.
+
+
+ A single administrative account can make recovery difficult.
+
+
+ Automatic timers need applicable target configuration.
+
+
+ Recorded overdue checks need an owner and follow-up.
+
+
+ Both text calls and commands are selected without dispatch-source patterns. Member commands use verified identity; the patterns distinguish dispatch senders rather than granting every member permission.
+
+
+ Configuration and device registration do not prove delivery.
+
+
+ The reviewed operating profile has no reference to a continuity or fallback procedure. The procedure may exist elsewhere; this is an administrative review prompt.
+
+
+ Expiring qualifications may affect upcoming assignments.
+
+
+ One or more configured mailboxes currently report a failed polling state. This is the latest stored observation, not proof of a continuing provider outage.
+
+
+ An empty group has no members to receive its work.
+
+
+ Only the owning workflow can release a safety hold.
+
+
+ Mailbox polling is compared with the interval declared in the operating profile. Missing calls alone do not imply an outage; absent or future poll timestamps remain unknown.
+
+
+ An enabled map override needs a style configuration.
+
+
+ An enabled map override needs its provider credentials.
+
+
+ Sending a single-use recovery link avoids an administrator choosing a member password.
+
+
+ A zero location lifetime can keep stale personnel positions on the map.
+
+
+ Adding members may exceed the current plan limit.
+
+
+ A linked staffing, qualification or continuity document is scheduled for removal within 30 days. This is document metadata, not a legal or clinical review deadline.
+
+
+ A declared policy document was removed, expired or is no longer in this department. Existence alone does not prove policy approval or suitability.
+
+
+ Coverage follows approved local qualification and role requirements.
+
+
+ Recorded due dates need administrative follow-up.
+
+
+ Enabled recommendations need reviewed run-card configuration.
+
+
+ Automatic shift status changes need shift dispatch enabled.
+
+
+ An empty shift can cause group dispatch to fall back to every group member.
+
+
+ Resolved rosters do not fill every configured role slot in the next seven days.
+
+
+ The same person appears on duty in overlapping shifts in the next seven days.
+
+
+ A requested or pending trade has not changed the resolved roster.
+
+
+ An operating-profile group reference no longer belongs to this department or has been removed.
+
+
+ Missing station locations reduce mapping and closest-resource usefulness.
+
+
+ Recorded lot expiry can affect supply availability.
+
+
+ Text call intake is selected without source patterns. Provider paths differ: this can broaden acceptance or prevent sender classification. The stored switch alone does not prove intake enforcement.
+
+
+ Group membership affects resource organization and routing.
+
+
+ Adding units may exceed the current plan limit.
+
+
+ A zero location lifetime can keep stale unit positions on the map.
+
+
+ Unit types support consistent status and qualification configuration.
+
+
+ Enabled weather alerts need an applicable area configuration.
+
+
+ Observed failures can leave administrative work incomplete.
+
+
+ Allow Signups For Multiple Shift Groups
+
+
+ Auto Set Status For Shift Dispatch Personnel
+
+
+ Big Board Hide Unavailable
+
+
+ Big Board Map Center Address
+
+
+ Big Board Map Center Gps Coordinates
+
+
+ Big Board Map Zoom Level
+
+
+ Big Board Page Refresh
+
+
+ Brain Tree Customer Id
+
+
+ Calls Sort Order
+
+
+ Check In Timers Auto Enable For New Calls
+
+
+ Department Operating Profile
+
+
+ Disabled Auto Available
+
+
+ Dispatch Recommendation Auto Dispatch
+
+
+ Dispatch Recommendation Config
+
+
+ Dispatch Recommendation Mode
+
+
+ Dispatch Shift Instead Of Group
+
+
+ Enable Modern Notifications
+
+
+ Enable Text Command
+
+
+ Enable Text To Call
+
+
+ Force Chatbot Security Pin
+
+
+ Group Dispatch Scope Config
+
+
+ Hardware Tracking Location Retention Days
+
+
+ Hardware Tracking Mobile Fallback Enabled
+
+
+ Hardware Tracking Stale After Seconds
+
+
+ Internal Dispatch Email
+
+
+ Mapping Mapbox Access Token
+
+
+ Mapping Mapbox Style Url
+
+
+ Mapping Personnel Allow Status With No Location To Overwrite
+
+
+ Mapping Personnel Location TTL
+
+
+ Mapping Unit Allow Status With No Location To Overwrite
+
+
+ Mapping Unit Location TTL
+
+
+ Mapping Use Mapbox Override
+
+
+ Module Settings
+
+
+ New Call Field Policy
+
+
+ Paddle Customer Id
+
+
+ Personnel List Status Sort Order
+
+
+ Personnel On Unit Set Unit Status
+
+
+ Personnel Sort Order
+
+
+ Records Default Lifecycle Preset
+
+
+ Records Disclosure Config
+
+
+ Records Group Scope Config
+
+
+ Records Group Visibility Mode
+
+
+ Records Numbering Config
+
+
+ Records Retention Policy
+
+
+ Records Review Due Hours
+
+
+ Records Search Config
+
+
+ Require2 FAFor Admins
+
+
+ Require Password Reset Via Email
+
+
+ Rss Feed Key For Active Calls
+
+
+ Shift Call Dispatch Personnel Status To Set
+
+
+ Shift Call Release Personnel Status To Set
+
+
+ Staffing Suppress Staffing Levels
+
+
+ Stripe Customer Id
+
+
+ Test Enabled
+
+
+ Text To Call Import Format
+
+
+ Text To Call Number
+
+
+ Text To Call Source Numbers
+
+
+ Tts Language
+
+
+ Unit Call Dispatch Status To Set
+
+
+ Unit Call Release Status To Set
+
+
+ Unit Call Status Overrides By Unit Type
+
+
+ Unit Dispatch Also Dispatch To Assigned Personnel
+
+
+ Unit Dispatch Also Dispatch To Group
+
+
+ Unit Status Thresholds
+
+
+ Units Sort Order
+
+
+ Update Timestamp
+
+
+ Weather Alert Auto Message Schedule
+
+
+ Weather Alert Auto Message Severity
+
+
+ Weather Alert Cache Minutes
+
+
+ Weather Alert Call Integration
+
+
+ Weather Alert Excluded Events
+
+
+ Weather Alert Minimum Severity
+
+
+ Weather Alerts Enabled
+
+
+ Allow a member to sign up for multiple shift groups. Review overlaps and local coverage rules separately.
+
+
+ Apply the configured status to shift-dispatched personnel. This only takes effect with shift dispatch enabled.
+
+
+ Hide unavailable resources on the Big Board; this affects visibility, not their dispatch eligibility.
+
+
+ Address used to center the Big Board. Address details remain on their owning screen.
+
+
+ Explicit board-center coordinates take precedence over address geocoding. Partial coordinates do not overwrite the saved center.
+
+
+ Initial Big Board map zoom. An unset override lets the consuming board select its default.
+
+
+ Big Board refresh interval. Review load and the age of displayed information before changing it.
+
+
+ Legacy billing reference. Use the subscription provider workflow, not a direct settings edit.
+
+
+ Sort order for displayed calls; does not reorder provider delivery or change call priority.
+
+
+ Automatically start configured check-in timers for new calls. Review timer targets and escalation before enabling it.
+
+
+ Declared organization, workforce, dispatch, seasonal, language and policy context. Recommendations never infer licenses or clinical scope from this profile.
+
+
+ Disables automatic availability behavior. Review staffing/status reset interactions before changing it.
+
+
+ Allow the recommendation path to dispatch automatically where enabled. Preview recipients and verify local procedures first.
+
+
+ Location, ETA, rest, crew and move-up settings used by recommendation consumers. External ETA calls occur only in the owning operational flow.
+
+
+ Dispatch recommendation selection mode. Review run cards, eligible resources and human dispatch responsibility.
+
+
+ Expand dispatched groups using the resolved on-duty roster. An empty shift result falls back to group members; preview both cases.
+
+
+ Use supported modern notification behavior. Verify each consumer and channel; provider acceptance is not delivery.
+
+
+ Configured text-command preference. Dispatch-source patterns and verified member command identity are different checks. Provider and chatbot paths do not enforce this switch uniformly; review the active consumer before changing it.
+
+
+ Configured text-call preference. Enforcement differs by provider and chatbot path; the stored value alone does not prove intake is stopped or accepted. Review sender classification and perform an explicit controlled verification on the owning screen.
+
+
+ Require the member security PIN for sensitive supported chatbot and SMS actions, including members who have not opted in.
+
+
+ Group-subtree dispatch visibility with explicit role exceptions. Preview each actor and target scope before changing it.
+
+
+ Tracking retention bounded by host configuration and applicable holds. Shortening retention can make data eligible for deletion.
+
+
+ Use supported mobile location fallback when hardware data is stale. Verify each device/source rather than assuming continuous tracking.
+
+
+ Age at which a hardware location becomes stale, clamped to at least one second. Review device reporting intervals.
+
+
+ Assigned internal dispatch email address. Presence can be shown; the address stays on the authorized import screen.
+
+
+ Map-provider access token. Only presence is reported. Disabling the override deletes it and requires re-entry to restore.
+
+
+ Custom map style reference. Verify the provider style and credential together; disabling the override deletes this value.
+
+
+ Allow a personnel status without a location to replace the previous location-bearing state. This can remove a marker.
+
+
+ Maximum personnel location age in minutes. Zero keeps stale positions visible without an age limit; assess actual ping ages.
+
+
+ Allow a unit status without a location to overwrite earlier location data. Check hardware and app updates together.
+
+
+ Maximum unit location age in minutes. Zero retains stale unit locations indefinitely in supported map consumers.
+
+
+ Use the department map provider override. Turning it off on the owning screen removes the stored style and token.
+
+
+ Controls module navigation and supported feature gates. Hiding a module does not delete its records or prove independent dispatch settings are disabled.
+
+
+ Controls optional new-call fields across supported clients. Hidden fields cannot be required; core dispatch fields remain mandatory.
+
+
+ Billing-provider customer reference. Managed by authorized billing flows and never returned in assistant evidence.
+
+
+ Custom ordering of personnel statuses in lists. Review all configured statuses before replacing the order.
+
+
+ Allow personnel status updates to influence their assigned unit status. Review automation and crew assignment together.
+
+
+ Sort order for personnel lists; does not change availability, access or dispatch priority.
+
+
+ Default lifecycle for new department-owned definitions. Locked definitions retain their own lifecycle.
+
+
+ Disclosure review clock, redaction profile and release approver. Review local obligations through the authorized disclosure workflow.
+
+
+ Reserved identifier with no editable behavior in this release. Do not present it as a shipped setting.
+
+
+ Whether record visibility is department-wide or group scoped. Group scope narrows existing permission and never grants access.
+
+
+ Number assignment, year reset and sequence formatting for definitions that do not override the department configuration.
+
+
+ Default and definition-specific retention, including prior-policy history. Holds and restricted-class rules can prevent purge eligibility.
+
+
+ Default administrative review deadline; a definition-level override takes precedence. This is not a statutory deadline inference.
+
+
+ Allowed record search scope and protected-data behavior. Search access remains bounded by current source permissions.
+
+
+ Administrator MFA requirement mode. Verify actual factors and recovery for each administrator before enforcement changes.
+
+
+ Use single-use recovery links for administrator-initiated member password resets, instead of selecting a replacement password.
+
+
+ Credential for the active-call feed. Treat the feed and its key as sensitive; rotate through its owning screen.
+
+
+ Personnel status applied when shift dispatch occurs. Minus one leaves status unchanged; use an existing approved status.
+
+
+ Personnel status applied on call release for the shift-dispatch path. Minus one leaves status unchanged.
+
+
+ Staffing levels suppressed in supported notifications. Suppression can change who hears an alert and is not evidence of delivery.
+
+
+ Billing-provider customer reference managed by subscription workflows; never edit this as an ordinary department setting.
+
+
+ Department testing behavior. Do not treat enabling a test setting as proof of production readiness.
+
+
+ Parser used for inbound text call creation. Verify the sender format with a controlled example on the owning screen.
+
+
+ Provisioned inbound text number. Provisioning has external effects and must use the normal text settings flow.
+
+
+ Allowed inbound source numbers for text calls and commands. Empty sources prevent accepted intake; never display raw numbers in Admin Assist.
+
+
+ Text-to-speech language for supported voice notifications. Confirm supported voices and pronunciation with a human-run test.
+
+
+ Unit status applied during call dispatch. Minus one or an invalid built-in unit status leaves the status unchanged.
+
+
+ Unit status applied at call release. Review unit-type overrides before assuming one department-wide effect.
+
+
+ Per-unit-type call status overrides. Existing type-specific values take precedence over department defaults.
+
+
+ Expand unit dispatch to its assigned crew. Review duplicate routes, current assignments and recipient permissions.
+
+
+ Expand unit dispatch to the station group. This can substantially increase the recipient audience.
+
+
+ Visual warning thresholds for time in a unit status. A highlight does not change the unit status or certify availability.
+
+
+ Sort order for unit lists; does not change unit eligibility or dispatch recommendation ranking.
+
+
+ Internal configuration timestamp. Read-only metadata, not an administrator-editable preference.
+
+
+ Schedule for automatic weather messaging. Review the department time zone, overnight periods and daylight-saving changes.
+
+
+ Minimum weather severity eligible for automatic messages. Review recipients, schedule and duplicate suppression.
+
+
+ Weather cache duration; longer caching changes freshness and provider load.
+
+
+ Include supported weather context in call integration. It does not certify weather or route safety.
+
+
+ Weather event types excluded from configured processing. Review exclusions against approved local procedures.
+
+
+ Minimum severity eligible for the weather-alert view. Severity values come from the weather service, not local incident triage.
+
+
+ Enable supported weather-alert processing. Configure zones and communication behavior before relying on it.
+
+
+ Check-in timer configuration is recorded. Verify target selection, deadlines, escalation ownership and a controlled scenario through the owning screen.
+
+
+ Mailbox configuration and available polling metadata are checked. Parser success, routing and page delivery require a controlled authorized test.
+
+
+ Checks recorded group membership and station location metadata. Review intended dispatch and site coverage separately.
+
+
+ Current active members are recorded. This does not verify invitations, account access, role assignment or qualifications.
+
+
+ Run-card records are present. The listed check verifies presence when recommendations are enabled, not correctness of local response requirements.
+
+
+ Checks recorded unit types and groups. Crew suitability, device setup and actual communications need separate verification.
+
+
+ Weather zones are recorded. Confirm geographic coverage and the actual provider and notification path.
+
+
+ Chatbot Department Config / Allow Dispatch Via Chatbot
+
+
+ Chatbot Department Config / Allowed Platforms
+
+
+ Chatbot Department Config / Is Enabled
+
+
+ Chatbot Department Config / Llm Api Endpoint
+
+
+ Chatbot Department Config / Llm Api Key
+
+
+ Chatbot Department Config / Llm Model Name
+
+
+ Chatbot Department Config / Max Sessions Per User
+
+
+ Chatbot Department Config / Messages Per Department Per Minute
+
+
+ Chatbot Department Config / Messages Per User Per Minute
+
+
+ Chatbot Department Config / Proactive Notifications Enabled
+
+
+ Chatbot Department Config / Require Confirmation For Status Change
+
+
+ Chatbot Department Config / Require Linking Confirmation
+
+
+ Chatbot Department Config / Session Ttl Minutes
+
+
+ Department / Address Id
+
+
+ Department / Api Key
+
+
+ Department / Code
+
+
+ Department / Department Type
+
+
+ Department / Link Code
+
+
+ Department / Managing User Id
+
+
+ Department / Name
+
+
+ Department / Public Api Key
+
+
+ Department / Shared Secret
+
+
+ Department / Show Welcome
+
+
+ Department / Time Zone
+
+
+ Department / Use24 Hour Time
+
+
+ Department Call Email / Error Message
+
+
+ Department Call Email / Format Type
+
+
+ Department Call Email / Hostname
+
+
+ Department Call Email / Is Failure
+
+
+ Department Call Email / Last Check
+
+
+ Department Call Email / Password
+
+
+ Department Call Email / Port
+
+
+ Department Call Email / Use Ssl
+
+
+ Department Call Email / Username
+
+
+ Department Notification / Before Data
+
+
+ Department Notification / Current Data
+
+
+ Department Notification / Data
+
+
+ Department Notification / Department Admins
+
+
+ Department Notification / Disabled
+
+
+ Department Notification / Event Type
+
+
+ Department Notification / Everyone
+
+
+ Department Notification / Groups To Notify
+
+
+ Department Notification / Lock To Group
+
+
+ Department Notification / Lower Limit
+
+
+ Department Notification / Roles To Notify
+
+
+ Department Notification / Selected Groups Admins Only
+
+
+ Department Notification / Upper Limit
+
+
+ Department Notification / Users To Notify
+
+
+ Department Security Policy / Allowed Ip Ranges
+
+
+ Department Security Policy / Data Classification Level
+
+
+ Department Security Policy / Max Concurrent Sessions
+
+
+ Department Security Policy / Min Password Length
+
+
+ Department Security Policy / Password Expiration Days
+
+
+ Department Security Policy / Require Mfa
+
+
+ Department Security Policy / Require Password Complexity
+
+
+ Department Security Policy / Require Sso
+
+
+ Department Security Policy / Session Timeout Minutes
+
+
+ Department Sso Config / Allow Local Login
+
+
+ Department Sso Config / Assertion Consumer Service Url
+
+
+ Department Sso Config / Attribute Mapping Json
+
+
+ Department Sso Config / Authority
+
+
+ Department Sso Config / Auto Provision Users
+
+
+ Department Sso Config / Client Id
+
+
+ Department Sso Config / Default Rank Id
+
+
+ Department Sso Config / Encrypted Client Secret
+
+
+ Department Sso Config / Encrypted Idp Certificate
+
+
+ Department Sso Config / Encrypted Scim Bearer Token
+
+
+ Department Sso Config / Encrypted Signing Certificate
+
+
+ Department Sso Config / Entity Id
+
+
+ Department Sso Config / Is Enabled
+
+
+ Department Sso Config / Metadata Url
+
+
+ Department Sso Config / Scim Enabled
+
+
+ Department Sso Config / Sso Provider Type
+
+
+ Weather Alert Zone / Center Geo Location
+
+
+ Weather Alert Zone / Is Active
+
+
+ Weather Alert Zone / Is Primary
+
+
+ Weather Alert Zone / Name
+
+
+ Weather Alert Zone / Radius Miles
+
+
+ Weather Alert Zone / Zone Code
+
+
+ Permits supported chatbot dispatch actions subject to their own authorization and confirmation. Enabling it may allow real calls and pages.
+
+
+ Allowed chatbot platform codes; the stored asterisk represents the platform default. Review each connected provider and its account-linking requirements.
+
+
+ Department chatbot availability. Platform feature rollout, account linking and action permissions are separate gates.
+
+
+ Optional existing chatbot model endpoint. Phase 0 Admin Assist does not call it and does not use chatbot configuration as an AI entitlement.
+
+
+ Credential for the chatbot model provider. Never copy it into setup metadata or public reference content.
+
+
+ Model identifier used by the existing chatbot integration. This is separate from the later Admin Assist open-source inference deployment.
+
+
+ Maximum chatbot sessions per member in supported consumers. This is separate from authenticated web/mobile session limits.
+
+
+ Optional department chatbot rate bound. Consider shared demand and provider quotas before changing it.
+
+
+ Optional per-member chatbot rate bound. Review provider limits and burst behavior; this is not a delivery guarantee.
+
+
+ Allows supported proactive chatbot notifications. Recipient permissions, channel configuration and sending workflows remain authoritative.
+
+
+ Requests confirmation for supported status changes. Review each platform consumer before assuming all commands are covered.
+
+
+ Requires confirmation in the supported account-linking flow. Linking must not bypass verified identity or departmental authorization.
+
+
+ Chatbot session lifetime in minutes. Expiry does not revoke an unrelated Resgrid sign-in session.
+
+
+ Department address reference. Review the owning address and mapping consumers; it is separate from station and site addresses.
+
+
+ Department API credential. Never place it in setup notes or model input; manage and rotate it through the authorized workflow.
+
+
+ Department code used by supported identification and access flows. Review those consumers before changing it.
+
+
+ Legacy organization-type label. The operating profile provides multiple sectors; neither establishes clinical scope or response qualifications.
+
+
+ Department linking code. Review who can use a link and rotate it using the owning workflow.
+
+
+ Managing-member identity. Subscription and high-risk account operations may require this member; change ownership through its explicit owning workflow.
+
+
+ Department display name. Review member-facing labels and documents that snapshot the name; changing it does not rename historical artifacts.
+
+
+ Credential used by supported public API consumers. Public in the field name does not make credential disclosure safe.
+
+
+ Department integration secret. Rotation can affect integrations and needs coordinated verification.
+
+
+ Legacy welcome flag. Restored setup dismissal is per administrator and does not use this flag as evidence of setup completion.
+
+
+ Department time zone used by scheduling and local-date reports. Review overnight shifts and daylight-saving transitions before changing it.
+
+
+ Preferred time display. This does not change stored timestamps or the department time zone.
+
+
+ Provider/import error details on the authorized screen. Admin Assist uses a normalized failure indication and does not copy provider bodies.
+
+
+ Selects the inbound email parser. Verify representative permitted source messages without sending an operational page unintentionally.
+
+
+ Mailbox host for email intake. Review the approved provider and network reachability without exposing credentials in setup guidance.
+
+
+ Latest recorded mailbox failure flag. Verify a new poll before treating it as a continuing outage or a resolved problem.
+
+
+ Last recorded polling timestamp. Missing or future timestamps are unknown; quiet call volume is not proof of a poll failure.
+
+
+ Mailbox credential. Do not copy it into Admin Assist; rotate it through the mailbox and owning editor together.
+
+
+ Mailbox connection port. It must match the selected provider and TLS mode.
+
+
+ Mailbox transport encryption option. Verify actual provider compatibility and successful polling; a stored flag alone does not prove transport protection.
+
+
+ Mailbox account identifier used for intake. It remains on the authorized configuration screen.
+
+
+ Previous-state filter for applicable events. Review valid status IDs and the event-specific interpretation of an empty or wildcard value.
+
+
+ Current-state filter for applicable events. Compare it with the previous-state filter to avoid unintended volume.
+
+
+ Event-specific configuration payload. The owning editor validates its meaning; Admin Assist does not execute arbitrary stored expressions.
+
+
+ Includes department administrators in supported notification processing. Review overlap and channel eligibility before estimating volume.
+
+
+ Stored disabled marker. The inspected legacy notification processor does not consult this flag, so it must not be treated as a verified stop switch. Review the active consumer; queued and delivered notifications cannot be recalled.
+
+
+ Event that can trigger this notification rule. Match the event to a real administrative responsibility and expected frequency.
+
+
+ Selects the department-wide recipient option. Review actual active membership, suppression and deduplication before use.
+
+
+ Department-group recipients. Review group membership and lock-to-group behavior together.
+
+
+ Restricts applicable event processing to group scope. Review the selected event's actual source group and recipient resolver.
+
+
+ Lower threshold for event-specific alerts. Use approved local thresholds and verify the actual event interpretation.
+
+
+ Personnel-role recipients. Role membership can change; a role label is not a qualification or delivery guarantee.
+
+
+ Limits selected-group recipients to their administrators in supported event paths. It does not designate department administrators automatically.
+
+
+ Upper threshold for event-specific alerts. Units and comparisons depend on the selected event.
+
+
+ Explicit member recipients. Membership and channel eligibility are evaluated separately at send time.
+
+
+ Allowed login network ranges. Empty adds no range restriction. Review legitimate responder networks and recovery access before narrowing it.
+
+
+ Department classification label. Selecting it does not enroll ADP, establish compliance or automatically classify every record correctly.
+
+
+ Maximum policy-managed concurrent sessions per user; zero means unlimited for this setting. Existing sessions and enforcement rollout must be checked separately.
+
+
+ Minimum length offered by the policy editor. Actual password validators and supported credential-change paths remain authoritative.
+
+
+ Password age in days; zero disables this policy's age limit. Verify local-password and SSO behavior separately.
+
+
+ Department-wide MFA policy, distinct from the administrator-only setting. Review enrollment, supported factors and recovery before enforcement.
+
+
+ Stored complexity preference. Consumer and editor coverage must be verified before relying on this field; it is not proof that an existing password meets a rule.
+
+
+ Requires the supported SSO policy gate. Verify the active identity provider and local recovery arrangements before removing a sign-in path.
+
+
+ Idle timeout in minutes; zero defers to host behavior. Verify policy-managed sessions and each supported client rather than assuming immediate global logout.
+
+
+ Allows a local-password path alongside this provider where policy permits. Review the department-wide SSO requirement and recovery plan together.
+
+
+ Stored SAML callback configuration. Use the endpoint supplied by the owning SSO setup and verify the provider registration.
+
+
+ Maps provider attributes to supported member fields. Validate identity matching and missing attributes with an approved test account.
+
+
+ OIDC issuer or authority. Verify the intended tenant, discovery metadata and callback registration before enabling it.
+
+
+ Allows the supported sign-in flow to create members. Review identity matching, capacity and default assignments before enabling it.
+
+
+ Client registration identifier from the identity provider. Keep tenant and audience registration consistent with the owning SSO flow.
+
+
+ Department rank assigned by supported automatic provisioning. It does not grant permissions or prove qualifications.
+
+
+ Encrypted provider client secret. The secret is entered and rotated on the authorized provider editor; Admin Assist only describes its purpose.
+
+
+ Encrypted provider verification certificate material. Review expiry and rotation through SSO; this description is not certificate validation.
+
+
+ Encrypted credential for inbound SCIM requests. Rotate through the explicit token workflow and update the provider before retiring an old credential.
+
+
+ Encrypted signing certificate and private-key material. Do not copy it into notes, logs or assistant messages.
+
+
+ SAML service-provider identifier registered at the identity provider. It must agree with the configured integration.
+
+
+ Makes this provider configuration available to the supported SSO flow. A saved enabled flag is not a successful sign-in test.
+
+
+ SAML provider metadata location. Review the trusted provider and its current signing material through the SSO editor.
+
+
+ Enables supported SCIM provisioning for this configuration. Review identity lifecycle, deactivation and token access separately from interactive sign-in.
+
+
+ Selects the identity protocol and provider configuration. OIDC and SAML have different metadata, certificates and callback requirements.
+
+
+ Center point used by supported radius-based weather coverage. Coordinate values stay on their owning map/editor.
+
+
+ Whether the zone participates in supported weather processing. Department weather settings and worker operation are additional requirements.
+
+
+ Marks the primary zone for consumers that select a default. Review other active zones rather than assuming they are disabled.
+
+
+ Administrator-facing label for this weather zone. The name does not define its geographic coverage.
+
+
+ Radius in miles for supported geographic matching. Review actual coverage and provider behavior; larger is not automatically safer.
+
+
+ Provider weather-zone identifier. Verify the intended jurisdiction and source coverage.
+
+
+ Accept time-limited exception
+
+
+ Accepted exception
+
+
+ Needs attention
+
+
+ Features that use this add-on
+
+
+ Requires Advanced Data Protection
+
+
+ Requires Workforce and Business Operations
+
+
+ Requires Push-to-Talk
+
+
+ Requires Readiness Pro
+
+
+ Show add-on comparisons only
+
+
+ Before adopting
+
+
+ After
+
+
+ All findings
+
+
+ Area
+
+
+ Assign to me
+
+
+ Assigned
+
+
+ Availability could not be verified
+
+
+ Current access allows the next setup step
+
+
+ Availability
+
+
+ Before
+
+
+ Recorded configuration, supported checks, add-on access and personal learning are separate. No activity measurement is implied: a feature with no recorded setup is not necessarily unused. Unknown evidence remains unassessed.
+
+
+ Feature setup and optional opportunities
+
+
+ Catalog version
+
+
+ Verified checks in selected areas
+
+
+ Supported configuration checks
+
+
+ Feature configuration has not been certified. Review the owning screen and the applicable checks in this report.
+
+
+ Open owning screen
+
+
+ Another administrator changed setup. The latest workspace has been loaded; review it before saving again.
+
+
+ Critical
+
+
+ Critical checks have unknown evidence. The department cannot be shown as fully verified.
+
+
+ Department ID
+
+
+ Optional administrative follow-up using your configured notification channels. No finding details are included. Quiet hours use the department time zone. An uncertain provider handoff is not automatically retried.
+
+
+ Your weekly Resgrid configuration summary is ready. Sign in to Admin Assist to review current evidence.
+
+
+ Send me a generic weekly summary link
+
+
+ Last notification handoff
+
+
+ Scheduled digests are disabled on this deployment. Your preference is saved, but no digest will be sent until the host enables them.
+
+
+ Dismiss for me; setup stays available in the menu
+
+
+ The report could not be loaded. Retry or use the normal department screens.
+
+
+ Evidence revision
+
+
+ Example
+
+
+ Exception expires
+
+
+ Choose an expiry within 90 days. The check continues to show its actual result. Notes follow department data protection.
+
+
+ Needs attention
+
+
+ Checks needing attention
+
+
+ Not enabled for this deployment
+
+
+ Planned
+
+
+ Preview
+
+
+ Retired
+
+
+ Show
+
+
+ Fresh setup
+
+
+ Evidence as of
+
+
+ Change
+
+
+ History starts when collection is enabled. Earlier configuration changes are unavailable.
+
+
+ Subject
+
+
+ When
+
+
+ Import or migration
+
+
+ Import planning does not copy data. Use the existing reviewed import tools and verify the resulting configuration here.
+
+
+ In review
+
+
+ Configuration changed during this read. Verify again before relying on this report.
+
+
+ Information
+
+
+ Information
+
+
+ Interested in this feature
+
+
+ Choose fresh setup, review or import mode above. Decide who dispatches, who responds and which applications or shared devices each role uses. A synthetic example: a dispatcher creates a training scenario, a responder sees assigned work and a unit crew updates its status. This lesson creates no incident or message.
+
+
+ Welcome and goals
+
+
+ Review the time zone, language, address and operating profile. Declare mission, operating hours, service areas and approved policy references. Unitless and non-dispatch teams should select only the work they need. Saving this profile does not validate a local staffing or clinical policy.
+
+
+ Department and operating profile
+
+
+ Use the area choices below and explore the full feature map, including capabilities hidden from your current menus. Choose use now, learn later or a reason why an area does not apply. Mark understood features individually; reading does not verify configuration.
+
+
+ Explore every area of Resgrid
+
+
+ Review the managing member and backup administrators, MFA, groups or stations, roles and qualifications. Add or invite personnel through the owning screen only after reviewing recipients and the send action. Confirm least-privilege access with the responsible users.
+
+
+ People, structure and access
+
+
+ Configure the calls, units, statuses, intake, notifications and mapping needed for your selected mission. Review dispatch previews and source eligibility before relying on a channel. App installation, device identity, provider setup and current contact verification are separate tasks.
+
+
+ Operational essentials
+
+
+ Open the selected-workflow list in Setup Report. Check prerequisites and responsible owners for shifts, training, checklists, inventory, records, contacts and automation. Save on the normal configuration screen, use the return-to-setup link, and verify again.
+
+
+ Configure selected areas
+
+
+ Compare current included capabilities with Push-to-Talk, Advanced Data Protection, Readiness Pro and Business Operations. Review feature value, alternatives and adoption requirements. Enhanced AI remains planned. Interest and learning never purchase, start a trial, enroll protection or enable a module.
+
+
+ Understand plans and add-ons
+
+
+ Run Setup Report and review critical failures and unknowns. Use available dry-run previews. A communication test is a separate deliberate action: review its recipients and channels before sending through Communication Tests. A completed setup review does not guarantee field response or delivery.
+
+
+ Verify and practice
+
+
+ Record the reviewed evidence, unresolved work, owners and optional revisit date in Setup Report. Use the redacted print view for an authorized handover. Train other administrators and members on their normal workflows. Each new administrator keeps a separate orientation checklist.
+
+
+ Review and handover
+
+
+ Configuration effort depends on your selected areas, data quality, local policy and provider setup. Reserve time with the responsible owners; a department-specific effort estimate is not yet available.
+
+
+ Work through these nine steps at your own pace. Shared scope, personal learning and review evidence are saved separately. Configure features on their owning screens, then use Setup Report to verify current evidence.
+
+
+ Your setup journey
+
+
+ Available
+
+
+ Learn later
+
+
+ Learn about this feature
+
+
+ I understand this feature
+
+
+ Learning progress
+
+
+ Learning marked complete by you
+
+
+ Learning not yet marked complete
+
+
+ Loading department setup…
+
+
+ Subscription changes require the managing member
+
+
+ Mark this report reviewed
+
+
+ Setup mode
+
+
+ Module is disabled
+
+
+ Load more
+
+
+ Next setup actions
+
+
+ Learning and interest choices never purchase, enable, send, import or change operational configuration.
+
+
+ No matching features.
+
+
+ Not yet reviewed
+
+
+ No items in this view.
+
+
+ Not applicable
+
+
+ Department operating profile
+
+
+ Feature without an add-on requirement has no configuration recorded in the checked source
+
+
+ No add-on requirement in this release; applicable base-plan limits still apply
+
+
+ Optional add-on opportunity; no current entitlement was verified
+
+
+ Not currently released for setup
+
+
+ Current add-on entitlement verified; setup is a separate step
+
+
+ Subscribed feature with no configuration recorded in the checked source
+
+
+ Current add-on or access information is unavailable
+
+
+ Unpurchased optional add-ons do not reduce core completion. Deferring an area does not hide a critical verified failure or active critical uncertainty.
+
+
+ Optional capabilities and add-ons
+
+
+ Operating packs
+
+
+ Verified
+
+
+ Follow-up preferences
+
+
+ Print
+
+
+ This report contains only the current authorized setup summary and public guidance. Protected notes, names, source records and credentials are omitted. It is not an operational readiness certification. Handle any copy you print or save under your department’s information policy; this page creates no stored server export.
+
+
+ Open a fresh printable report
+
+
+ Use approved local staffing, qualification and continuity policies; operating packs suggest areas to review without assuming local requirements.
+
+
+ Your operating profile could not be verified. Pack suggestions are unavailable.
+
+
+ Data protection enrollment is required
+
+
+ Quiet hours end (0–23; same hour means no quiet period)
+
+
+ Quiet hours start (0–23)
+
+
+ Read source text
+
+
+ Reason
+
+
+ Protected evidence unavailable
+
+
+ Configuration health is administrative guidance. A learned feature or saved setting is not proof of operational readiness or message delivery.
+
+
+ Required add-ons
+
+
+ Resolved by verification
+
+
+ Start or resume setup
+
+
+ Retry
+
+
+ Return to setup and verify
+
+
+ Review existing setup
+
+
+ Configuration, selected setup scope or catalog version has changed since that review. Verify current evidence and review again.
+
+
+ Review due
+
+
+ Checks at the recorded administrative review
+
+
+ Last administrative review
+
+
+ Review again on (UTC date)
+
+
+ Choose an optional shared review date within the next year. It is stored at noon UTC and shown in the report; this choice does not send a reminder. Optional weekly follow-up is configured separately in the admin worklist. Clear the date to remove it.
+
+
+ The change was not saved. Reload and try again.
+
+
+ Save preferences
+
+
+ Save review date
+
+
+ Save area choice
+
+
+ Save changes on this screen first, then return to setup and verify the current evidence. The return link does not save this form.
+
+
+ Saving…
+
+
+ Why this area is not applicable
+
+
+ No current department need
+
+
+ Managed in another approved system
+
+
+ Outside our department mission
+
+
+ Managed by a responsible partner
+
+
+ Search areas and features
+
+
+ Search reference documentation
+
+
+ Choose a reason
+
+
+ Choose features of interest in Explore Resgrid and add-ons to see their prerequisites here.
+
+
+ Selected in your operating profile
+
+
+ Your selected feature interests
+
+
+ Setup choice
+
+
+ Learn the available areas and optional add-ons, configure your selected areas, then review the evidence together.
+
+
+ Recorded configuration and listed checks passed
+
+
+ Configuration recorded; verification is incomplete
+
+
+ Configuration recorded; listed checks need attention
+
+
+ Configuration has not been verified
+
+
+ No configuration recorded in the checked source
+
+
+ Current source access unavailable
+
+
+ Start review
+
+
+ View subscription options
+
+
+ Subscription status could not be verified
+
+
+ Suggested by your selected operating packs
+
+
+ Resgrid Admin Assist
+
+
+ Unassigned
+
+
+ Unavailable
+
+
+ Selected areas without automated checks
+
+
+ Unknown
+
+
+ Checks with unknown evidence
+
+
+ Use now
+
+
+ Value to your department
+
+
+ Results cover only the listed checks. Review procedures, external systems and areas without automated checks with their responsible owners.
+
+
+ Verify again
+
+
+ Choose Verify again to create or update the worklist.
+
+
+ Warning
+
+
+ Choose the work your department needs, learn the available areas, then configure each feature on its own screen. Return here to verify.
+
+
+ Last completed background evaluation
+
+
+ The background worker has not completed an evaluation.
+
+
+ Current access could not be verified
+
+
+ A prerequisite prevents the next setup step
+
+
+ Interest and learning are personal choices. Availability, setup and verified checks are separate; purchasing an add-on never completes setup automatically.
+
+
+ Verification updates findings. Assignment and accepted exceptions do not resolve a failed check. A fresh passing check resolves it.
+
+
+ Explore Resgrid and add-ons
+
+
+ Health checks
+
+
+ Change history
+
+
+ Overview
+
+
+ Settings reference
+
+
+ Setup Report
+
+
+ Setup Wizard
+
+
+ Admin worklist
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.sv.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.sv.resx
new file mode 100644
index 000000000..453178b81
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.sv.resx
@@ -0,0 +1,324 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Avancerat dataskydd
+
+
+ Arkiverade larm
+
+
+ Anbud
+
+
+ Stortavla
+
+
+ Kalender
+
+
+ Larm
+
+
+ Chatt
+
+
+ Checklistor
+
+
+ Kommunikationstester
+
+
+ Kontakter
+
+
+ Avtal
+
+
+ Översikt
+
+
+ Dataskydd
+
+
+ Avdelningsinställningar
+
+
+ Dina avdelningar
+
+
+ Dokument
+
+
+ Formulär
+
+
+ Fakturor
+
+
+ Loggar
+
+
+ Kartläggning
+
+
+ Modulinställningar
+
+
+ Ny insats
+
+
+ Ny grupp
+
+
+ Nytt Protokoll
+
+
+ Ny utbildning
+
+
+ Anteckningar
+
+
+ Personal
+
+
+ Förebyggande underhåll
+
+
+ Protokoll
+
+
+ Prislistor
+
+
+ Bevarandespärrar för journaler
+
+
+ Tillsyner
+
+
+ Utredningar
+
+
+ Tillstånd
+
+
+ Journalinställningar
+
+
+ Rapporter
+
+
+ Rutter
+
+
+ Skift
+
+
+ Utbildningar
+
+
+ Enheter
+
+
+ Röstsamtal
+
+
+ Arbetsflöden
+
+
+ Personal
+
+
+ Alla
+
+
+ Brand
+
+
+ Sök och räddning
+
+
+ Justera lager
+
+
+ Godkänna rapporter
+
+
+ Slutföra rapporter
+
+
+ Hantera rapportdefinitioner
+
+
+ Hantera utlämnanden av rapporter
+
+
+ Hantera rapportsammanställningar
+
+
+ Publicera rapportdefinitioner
+
+
+ Granska rapporter
+
+
+ Nej
+
+
+ Drifttimmar
+
+
+ Referens
+
+
+ Ja
+
+
+ Avtal
+
+
+ Okänd
+
+
+ Frivillig
+
+
+ Drifttimmar
+
+
+ Efter
+
+
+ Område
+
+
+ Tilldelad
+
+
+ Före
+
+
+ Katalogversion
+
+
+ Öppna tillhörande inställningssida
+
+
+ Kritisk
+
+
+ Behöver åtgärdas
+
+
+ Planerad
+
+
+ Underlag per
+
+
+ Information
+
+
+ Jag är intresserad av funktionen
+
+
+ Tillgänglig
+
+
+ Lär dig senare
+
+
+ Jag förstår funktionen
+
+
+ Läser in avdelningens konfiguration…
+
+
+ Ej tillämpligt
+
+
+ Verifierad
+
+
+ Skriv ut
+
+
+ Läs källtexten
+
+
+ Skyddade underlag är inte tillgängliga
+
+
+ Konfigurationskontrollen ger administrativ vägledning. Att förstå en funktion eller spara en inställning bevisar inte operativ beredskap eller att meddelanden har levererats.
+
+
+ Försök igen
+
+
+ Granskning senast
+
+
+ Sparar…
+
+
+ Sök områden och funktioner
+
+
+ Sök i referensdokumentationen
+
+
+ Ej tilldelad
+
+
+ Inte tillgänglig
+
+
+ Okänd
+
+
+ Använd nu
+
+
+ Kontrollera igen
+
+
+ Varning
+
+
+ Utforska Resgrid och tillägg
+
+
+ Konfigurationskontroller
+
+
+ Ändringshistorik
+
+
+ Översikt
+
+
+ Inställningsreferens
+
+
+ Konfigurationsrapport
+
+
+ Installationsguide
+
+
+ Administratörens uppgiftslista
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.uk.resx b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.uk.resx
new file mode 100644
index 000000000..ad51f51ce
--- /dev/null
+++ b/Core/Resgrid.Localization/Areas/User/AdminAssist/AdminAssist.uk.resx
@@ -0,0 +1,297 @@
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms
+
+
+ Розширений захист даних
+
+
+ Архівні виклики
+
+
+ Пропозиції
+
+
+ Велика дошка
+
+
+ Календар
+
+
+ Виклики
+
+
+ Чат
+
+
+ Контрольні списки
+
+
+ Тести зв’язку
+
+
+ Контакти
+
+
+ Договори
+
+
+ Захист даних
+
+
+ Налаштування підрозділу
+
+
+ Ваші підрозділи
+
+
+ Документи
+
+
+ Форми
+
+
+ Звіти про інциденти
+
+
+ Інвентар
+
+
+ Рахунки
+
+
+ Журнали
+
+
+ Картографування
+
+
+ Налаштування модулів
+
+
+ Нове розгортання
+
+
+ Нова Група
+
+
+ Новий Протокол
+
+
+ Нове навчання
+
+
+ Профілактичне обслуговування
+
+
+ Протоколи
+
+
+ Тарифи
+
+
+ Утримання записів для збереження
+
+
+ Перевірки
+
+
+ Розслідування
+
+
+ Дозволи
+
+
+ Налаштування записів
+
+
+ Маршрути
+
+
+ Зміни
+
+
+ Навчання
+
+
+ Голосовий виклик
+
+
+ Робочі процеси
+
+
+ Персонал
+
+
+ Усі
+
+
+ Пошук і порятунок
+
+
+ Коригувати інвентар
+
+
+ Затвердження звітів
+
+
+ Завершення звітів
+
+
+ Керування визначеннями звітів
+
+
+ Керування розкриттям звітів
+
+
+ Керування зведеннями звітів
+
+
+ Публікація визначень звітів
+
+
+ Перевірка звітів
+
+
+ Ні
+
+
+ Так
+
+
+ Договір
+
+
+ Волонтер
+
+
+ Після
+
+
+ До
+
+
+ Версія каталогу
+
+
+ Відкрити відповідну сторінку налаштувань
+
+
+ Критично
+
+
+ Потребує уваги
+
+
+ Заплановано
+
+
+ Попередній перегляд
+
+
+ Дані станом на
+
+
+ Інформація
+
+
+ Мене цікавить ця функція
+
+
+ Доступно
+
+
+ Ознайомитися пізніше
+
+
+ Я розумію цю функцію
+
+
+ Завантаження налаштувань підрозділу…
+
+
+ Не застосовується
+
+
+ Перевірено
+
+
+ Друк
+
+
+ Читати вихідний текст
+
+
+ Захищені підтверджувальні дані недоступні
+
+
+ Перевірка налаштувань надає адміністративні рекомендації. Розуміння функції або збереження налаштування не підтверджує оперативної готовності чи доставки повідомлень.
+
+
+ Повторити спробу
+
+
+ Термін перевірки
+
+
+ Збереження…
+
+
+ Пошук розділів і функцій
+
+
+ Пошук у довідковій документації
+
+
+ Не призначено
+
+
+ Недоступно
+
+
+ Невідомо
+
+
+ Використовувати зараз
+
+
+ Перевірити знову
+
+
+ Попередження
+
+
+ Огляд Resgrid і доповнень
+
+
+ Перевірки налаштувань
+
+
+ Історія змін
+
+
+ Огляд
+
+
+ Довідник налаштувань
+
+
+ Звіт про налаштування
+
+
+ Майстер налаштування
+
+
+ Список завдань адміністратора
+
+
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.ar.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.ar.resx
index 98be35e26..690acb42e 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.ar.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.ar.resx
@@ -135,4 +135,22 @@
رمز التحقق الخاص بك في Resgrid هو: {0}. تنتهي صلاحيته خلال {1} دقيقة.
+ رمز PIN للبلاغات المحمية
+ اختر رمز PIN شخصيًا من 6 إلى 12 رقمًا. يلزم تحقق جديد عبر تطبيق المصادقة. يجب أن يفعّل قسمك إتاحة البيانات برمز PIN لتلقي تفاصيل البلاغات المحمية.
+ رمز PIN الشخصي
+ رمز تطبيق المصادقة
+ حفظ
+ تم الحفظ.
+ تعذر إتاحة البيانات المحمية أو حفظها. سجّل الدخول إلى Resgrid وحاول مجددًا.
+ يتوفر بلاغ محمي. أرسل OPEN {0} ثم مسافة ثم رمز PIN الشخصي.
+ يتوفر بلاغ محمي. أدخل رمز PIN الشخصي ثم اضغط على مفتاح المربع.
+ إعدادات إتاحة بيانات ADP
+ الإرسال بالرسائل النصية
+ الإرسال الصوتي
+ تنبيه عام
+ الإتاحة بعد رمز PIN
+ السماح بوصول مؤقت لموظفي دعم Resgrid بموافقة موظف ثانٍ.
+ أقر بأن التفاصيل المتاحة تغادر Resgrid وقد تحتفظ بها شركات الاتصالات أو المستلمون.
+ السماح بالمحتوى المحمي
+ طلب موظفو Resgrid الوصول إلى البلاغ المحمي {0} لحالة الدعم {1}. يتطلب الوصول موافقة موظف مستقل وتنتهي صلاحيته خلال 15 دقيقة.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.de.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.de.resx
index aa6159b3f..4ad1c2d87 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.de.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.de.resx
@@ -135,4 +135,22 @@ Ihr Resgrid-Team
Ihr Resgrid-Bestätigungscode lautet: {0}. Er läuft in {1} Minuten ab.
+ PIN für geschützte Einsätze
+ Wählen Sie eine persönliche PIN mit 6–12 Ziffern. Eine erneute Bestätigung per Authenticator ist erforderlich. Ihre Abteilung muss die PIN-Freigabe aktivieren, bevor geschützte Einsatzdetails empfangen werden können.
+ Persönliche PIN
+ Authenticator-Code
+ Speichern
+ Gespeichert.
+ Geschützte Daten konnten nicht freigegeben oder gespeichert werden. Melden Sie sich bei Resgrid an und versuchen Sie es erneut.
+ Ein geschützter Einsatz ist verfügbar. Antworten Sie mit OPEN {0}, einem Leerzeichen und Ihrer persönlichen PIN.
+ Ein geschützter Einsatz ist verfügbar. Geben Sie Ihre persönliche PIN ein und drücken Sie die Raute-Taste.
+ ADP-Freigabeeinstellungen
+ SMS-Zustellung
+ Sprachzustellung
+ Allgemeine Benachrichtigung
+ Freigabe nach PIN
+ Zeitlich begrenzten Zugriff durch Resgrid-Supportmitarbeiter mit Genehmigung eines zweiten Mitarbeiters erlauben.
+ Ich bestätige, dass freigegebene Details Resgrid verlassen und von Telefonanbietern oder Empfängern gespeichert werden können.
+ Geschützte Inhalte erlauben
+ Resgrid-Mitarbeiter haben Zugriff auf den geschützten Einsatz {0} für Supportfall {1} angefordert. Der Zugriff erfordert einen unabhängigen Genehmiger und läuft innerhalb von 15 Minuten ab.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.el.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.el.resx
index 05f90b1b8..2acbc5b96 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.el.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.el.resx
@@ -135,4 +135,22 @@
Ο κωδικός επαλήθευσης Resgrid είναι: {0}. Λήγει σε {1} λεπτά.
+ PIN προστατευμένων συμβάντων
+ Επιλέξτε προσωπικό PIN 6–12 ψηφίων. Απαιτείται νέα επαλήθευση με την εφαρμογή ελέγχου ταυτότητας. Το τμήμα σας πρέπει να ενεργοποιήσει την παροχή στοιχείων μέσω PIN για να λαμβάνετε προστατευμένες λεπτομέρειες.
+ Προσωπικό PIN
+ Κωδικός εφαρμογής ελέγχου ταυτότητας
+ Αποθήκευση
+ Αποθηκεύτηκε.
+ Δεν ήταν δυνατή η παροχή ή αποθήκευση προστατευμένων δεδομένων. Συνδεθείτε στο Resgrid και δοκιμάστε ξανά.
+ Υπάρχει προστατευμένο συμβάν. Απαντήστε OPEN {0}, ένα κενό και το προσωπικό σας PIN.
+ Υπάρχει προστατευμένο συμβάν. Πληκτρολογήστε το προσωπικό σας PIN και πατήστε δίεση.
+ Ρυθμίσεις παροχής δεδομένων ADP
+ Παράδοση SMS
+ Φωνητική παράδοση
+ Γενική ειδοποίηση
+ Παροχή μετά το PIN
+ Να επιτρέπεται προσωρινή πρόσβαση στο προσωπικό υποστήριξης Resgrid με έγκριση δεύτερου υπαλλήλου.
+ Αναγνωρίζω ότι τα παρεχόμενα στοιχεία εξέρχονται από το Resgrid και μπορεί να διατηρηθούν από τηλεφωνικούς παρόχους ή παραλήπτες.
+ Να επιτρέπεται προστατευμένο περιεχόμενο
+ Το προσωπικό Resgrid ζήτησε πρόσβαση στο προστατευμένο συμβάν {0} για την υπόθεση υποστήριξης {1}. Η πρόσβαση απαιτεί ανεξάρτητη έγκριση και λήγει εντός 15 λεπτών.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.en.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.en.resx
index df185793e..29b287066 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.en.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.en.resx
@@ -135,4 +135,22 @@ The Resgrid Team
Your Resgrid verification code is: {0}. It expires in {1} minutes.
+ Protected dispatch PIN
+ Choose a personal PIN of 6–12 digits. Fresh authenticator verification is required. Your department must enable PIN release before you can receive protected dispatch details.
+ Personal PIN
+ Authenticator code
+ Save
+ Saved.
+ Unable to release or save protected data. Sign in to Resgrid and try again.
+ A protected dispatch is available. Reply OPEN {0} followed by your personal PIN, separated by a space.
+ A protected dispatch is available. Enter your personal PIN followed by the pound key.
+ ADP release settings
+ SMS delivery
+ Voice delivery
+ Generic alert
+ Release after PIN
+ Allow time-limited Resgrid staff support access with approval by a second staff member.
+ I acknowledge that released details leave Resgrid and may be retained by phone carriers or recipients.
+ Allow protected content
+ Resgrid staff requested access to protected dispatch {0} for support case {1}. Access requires an independent staff approver and expires within 15 minutes.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.es.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.es.resx
index cb30dbea3..a6ca79cbd 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.es.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.es.resx
@@ -135,4 +135,22 @@ El equipo de Resgrid
Su código de verificación de Resgrid es: {0}. Caduca en {1} minutos.
+ PIN de despacho protegido
+ Elija un PIN personal de 6 a 12 dígitos. Se requiere una verificación reciente con el autenticador. Su departamento debe habilitar la entrega mediante PIN para recibir los detalles protegidos.
+ PIN personal
+ Código del autenticador
+ Guardar
+ Guardado.
+ No se pueden mostrar ni guardar los datos protegidos. Inicie sesión en Resgrid e inténtelo de nuevo.
+ Hay un despacho protegido disponible. Responda OPEN {0} seguido de su PIN personal, separado por un espacio.
+ Hay un despacho protegido disponible. Introduzca su PIN personal y pulse la tecla de almohadilla.
+ Configuración de entrega de ADP
+ Entrega por SMS
+ Entrega por voz
+ Alerta genérica
+ Mostrar después del PIN
+ Permitir acceso temporal al personal de soporte de Resgrid con la aprobación de otro empleado.
+ Reconozco que los detalles entregados salen de Resgrid y pueden ser conservados por operadores telefónicos o destinatarios.
+ Permitir contenido protegido
+ El personal de Resgrid solicitó acceso al despacho protegido {0} para el caso de soporte {1}. El acceso requiere un aprobador independiente y caduca en 15 minutos.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.fr.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.fr.resx
index fd7376873..611abeb2b 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.fr.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.fr.resx
@@ -135,4 +135,22 @@ L'équipe Resgrid
Votre code de vérification Resgrid est : {0}. Il expire dans {1} minutes.
+ Code PIN des interventions protégées
+ Choisissez un code PIN personnel de 6 à 12 chiffres. Une vérification récente par authentificateur est requise. Votre service doit activer la transmission par code PIN pour recevoir les détails protégés.
+ Code PIN personnel
+ Code de l’authentificateur
+ Enregistrer
+ Enregistré.
+ Impossible de transmettre ou d’enregistrer les données protégées. Connectez-vous à Resgrid et réessayez.
+ Une intervention protégée est disponible. Répondez OPEN {0} suivi de votre code PIN personnel, séparé par un espace.
+ Une intervention protégée est disponible. Saisissez votre code PIN personnel puis appuyez sur dièse.
+ Paramètres de transmission ADP
+ Transmission par SMS
+ Transmission vocale
+ Alerte générique
+ Transmettre après le code PIN
+ Autoriser un accès temporaire au personnel d’assistance Resgrid avec l’approbation d’un second employé.
+ Je reconnais que les détails transmis quittent Resgrid et peuvent être conservés par les opérateurs téléphoniques ou les destinataires.
+ Autoriser le contenu protégé
+ Le personnel Resgrid a demandé l’accès à l’intervention protégée {0} pour le dossier d’assistance {1}. L’accès nécessite un approbateur indépendant et expire sous 15 minutes.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.it.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.it.resx
index 47d1f7455..13a60823b 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.it.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.it.resx
@@ -135,4 +135,22 @@ Il team Resgrid
Il tuo codice di verifica Resgrid è: {0}. Scade tra {1} minuti.
+ PIN per interventi protetti
+ Scegli un PIN personale di 6–12 cifre. È richiesta una nuova verifica con l’app di autenticazione. Il reparto deve abilitare il rilascio tramite PIN per ricevere i dettagli protetti.
+ PIN personale
+ Codice di autenticazione
+ Salva
+ Salvato.
+ Impossibile rilasciare o salvare i dati protetti. Accedi a Resgrid e riprova.
+ È disponibile un intervento protetto. Rispondi OPEN {0} seguito dal tuo PIN personale, separato da uno spazio.
+ È disponibile un intervento protetto. Inserisci il tuo PIN personale e premi il tasto cancelletto.
+ Impostazioni di rilascio ADP
+ Invio tramite SMS
+ Invio vocale
+ Avviso generico
+ Rilascio dopo il PIN
+ Consenti l’accesso temporaneo al personale di assistenza Resgrid con l’approvazione di un secondo dipendente.
+ Riconosco che i dettagli rilasciati escono da Resgrid e possono essere conservati dagli operatori telefonici o dai destinatari.
+ Consenti contenuti protetti
+ Il personale Resgrid ha richiesto accesso all’intervento protetto {0} per la richiesta di assistenza {1}. L’accesso richiede un approvatore indipendente e scade entro 15 minuti.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.pl.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.pl.resx
index 01a1d43b5..aeede04c2 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.pl.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.pl.resx
@@ -135,4 +135,22 @@ Zespół Resgrid
Twój kod weryfikacyjny Resgrid to: {0}. Wygaśnie za {1} minut.
+ PIN chronionych zgłoszeń
+ Wybierz osobisty PIN o długości 6–12 cyfr. Wymagana jest ponowna weryfikacja w aplikacji uwierzytelniającej. Twój dział musi włączyć udostępnianie po podaniu PIN-u, aby otrzymywać chronione szczegóły zgłoszeń.
+ Osobisty PIN
+ Kod z aplikacji uwierzytelniającej
+ Zapisz
+ Zapisano.
+ Nie można udostępnić ani zapisać chronionych danych. Zaloguj się do Resgrid i spróbuj ponownie.
+ Dostępne jest chronione zgłoszenie. Odpowiedz OPEN {0}, a następnie wpisz spację i swój osobisty PIN.
+ Dostępne jest chronione zgłoszenie. Wpisz swój osobisty PIN i naciśnij krzyżyk.
+ Ustawienia udostępniania ADP
+ Dostarczanie SMS
+ Dostarczanie głosowe
+ Powiadomienie ogólne
+ Udostępnij po podaniu PIN-u
+ Zezwól pracownikom pomocy Resgrid na czasowy dostęp po zatwierdzeniu przez drugiego pracownika.
+ Przyjmuję do wiadomości, że udostępnione szczegóły opuszczają Resgrid i mogą być przechowywane przez operatorów telefonicznych lub odbiorców.
+ Zezwól na chronioną treść
+ Pracownik Resgrid poprosił o dostęp do chronionego zgłoszenia {0} w sprawie pomocy {1}. Dostęp wymaga niezależnego zatwierdzenia i wygasa w ciągu 15 minut.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.sv.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.sv.resx
index a9024ce01..128f72a52 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.sv.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.sv.resx
@@ -135,4 +135,22 @@ Resgrid-teamet
Din Resgrid-verifieringskod är: {0}. Den upphör att gälla om {1} minuter.
+ PIN för skyddade larm
+ Välj en personlig PIN med 6–12 siffror. En ny verifiering med autentiseringsappen krävs. Din avdelning måste aktivera utlämning med PIN för att du ska kunna ta emot skyddade larmuppgifter.
+ Personlig PIN
+ Kod från autentiseringsappen
+ Spara
+ Sparat.
+ Det gick inte att lämna ut eller spara skyddade uppgifter. Logga in på Resgrid och försök igen.
+ Ett skyddat larm är tillgängligt. Svara OPEN {0} följt av ett mellanslag och din personliga PIN.
+ Ett skyddat larm är tillgängligt. Ange din personliga PIN och avsluta med fyrkant.
+ Inställningar för utlämning med ADP
+ SMS-leverans
+ Röstleverans
+ Allmän avisering
+ Lämna ut efter PIN
+ Tillåt tidsbegränsad åtkomst för Resgrids supportpersonal efter godkännande av en andra medarbetare.
+ Jag bekräftar att utlämnade uppgifter lämnar Resgrid och kan sparas av telefonoperatörer eller mottagare.
+ Tillåt skyddat innehåll
+ Resgrids personal har begärt åtkomst till det skyddade larmet {0} för supportärende {1}. Åtkomst kräver en oberoende godkännare och upphör inom 15 minuter.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.uk.resx b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.uk.resx
index d4ea62ffd..953fa62fa 100644
--- a/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.uk.resx
+++ b/Core/Resgrid.Localization/Areas/User/SystemMessages/SystemMessages.uk.resx
@@ -135,4 +135,22 @@
Ваш код підтвердження Resgrid: {0}. Діє {1} хв.
+ PIN захищених викликів
+ Виберіть особистий PIN із 6–12 цифр. Потрібна повторна перевірка в застосунку автентифікації. Ваш підрозділ має ввімкнути надання даних за PIN, щоб ви могли отримувати захищені відомості викликів.
+ Особистий PIN
+ Код автентифікатора
+ Зберегти
+ Збережено.
+ Не вдалося надати або зберегти захищені дані. Увійдіть у Resgrid і спробуйте ще раз.
+ Доступний захищений виклик. Надішліть OPEN {0}, пробіл і свій особистий PIN.
+ Доступний захищений виклик. Введіть свій особистий PIN і натисніть решітку.
+ Налаштування надання даних ADP
+ Доставка SMS
+ Голосова доставка
+ Загальне сповіщення
+ Надати після введення PIN
+ Дозволити тимчасовий доступ працівникам підтримки Resgrid за схваленням другого працівника.
+ Я підтверджую, що надані відомості залишають Resgrid і можуть зберігатися телефонними операторами або одержувачами.
+ Дозволити захищений вміст
+ Працівник Resgrid запросив доступ до захищеного виклику {0} для звернення до підтримки {1}. Доступ потребує незалежного схвалення та діє не більше 15 хвилин.
\ No newline at end of file
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx
index 5fd1c01d6..1d16b38be 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.ar.resx
@@ -695,6 +695,9 @@
تم إنشاء سير العمل من القالب مع مسودة إذن محمي. اضبط عنوان الوجهة وبيانات الاعتماد للخطوة، واختر الحقول المسموح بها، ثم اطلب الاعتماد. لن يُرسل أي شيء قبل اعتماد الإذن.
+
+ تم إنشاء سير العمل من القالب، ولكن دون مسودة إذن محمي (يتطلب إنشاؤها مسؤولاً عن سير العمل المحمي). سير العمل معطّل: اطلب من مسؤول إنشاء الإذن وطلب الاعتماد قبل تفعيله.
+
تم بلوغ الحد الأقصى لسير العمل في خطتك. يُرجى الترقية لإضافة المزيد.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx
index 93ae7d271..4c680afcb 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.de.resx
@@ -696,6 +696,9 @@
Workflow aus der Vorlage mit einem Entwurf einer geschützten Freigabe erstellt. Legen Sie Ziel-URL und Zugangsdaten des Schritts fest, wählen Sie die freigegebenen Felder und beantragen Sie die Genehmigung. Es wird nichts gesendet, bevor die Freigabe genehmigt ist.
+
+ Workflow aus der Vorlage erstellt, jedoch ohne Entwurf einer geschützten Freigabe (dafür ist ein Administrator für geschützte Workflows erforderlich). Er ist deaktiviert: Lassen Sie einen Administrator die Freigabe erstellen und die Genehmigung beantragen, bevor Sie ihn aktivieren.
+
Das Workflow-Limit Ihres Tarifs ist erreicht. Bitte führen Sie ein Upgrade durch, um weitere Workflows hinzuzufügen.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.el.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.el.resx
index c27f2bd29..109e9c4a5 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.el.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.el.resx
@@ -719,6 +719,9 @@
Η ροή εργασιών δημιουργήθηκε από το πρότυπο μαζί με πρόχειρη προστατευμένη έγκριση. Ορίστε το URL προορισμού και τα διαπιστευτήρια του βήματος, επιλέξτε τα πεδία προς κοινοποίηση και ζητήστε έγκριση. Δεν στέλνεται τίποτα πριν εγκριθεί.
+
+ Η ροή εργασιών δημιουργήθηκε από το πρότυπο, αλλά χωρίς πρόχειρη προστατευμένη έγκριση (για τη δημιουργία της απαιτείται διαχειριστής προστατευμένων ροών εργασιών). Είναι απενεργοποιημένη: ζητήστε από έναν διαχειριστή να δημιουργήσει την έγκριση και να υποβάλει αίτημα έγκρισης πριν την ενεργοποιήσετε.
+
Συμπληρώθηκε το όριο ροών εργασιών του προγράμματός σας. Αναβαθμίστε για να προσθέσετε περισσότερες.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx
index dcb36ab68..91122225f 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.en.resx
@@ -719,6 +719,9 @@
Workflow created from the template with a draft protected release. Set the destination URL and credential on the step, choose the released fields, then request approval. It never sends until the release is approved.
+
+ Workflow created from the template, but without a draft protected release (creating one needs a Protected Workflows administrator). It is disabled: have an administrator create the release and request approval before you enable it.
+
Workflow limit reached for your plan. Please upgrade to add more workflows.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx
index f2ec38c9c..c95dc71dc 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.es.resx
@@ -717,6 +717,9 @@
Flujo de trabajo creado a partir de la plantilla con una autorización protegida en borrador. Configure la URL de destino y la credencial del paso, elija los campos autorizados y solicite la aprobación. Nunca envía nada hasta que se apruebe la autorización.
+
+ Flujo de trabajo creado a partir de la plantilla, pero sin una autorización protegida en borrador (crearla requiere un administrador de flujos de trabajo protegidos). Está desactivado: pida a un administrador que cree la autorización y solicite la aprobación antes de activarlo.
+
Se alcanzó el límite de flujos de trabajo de su plan. Actualícelo para añadir más flujos de trabajo.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx
index 4c8655ebb..c196bfd10 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.fr.resx
@@ -696,6 +696,9 @@
Flux de travail créé à partir du modèle avec une autorisation protégée en brouillon. Définissez l'URL de destination et l'identifiant de l'étape, choisissez les champs autorisés, puis demandez l'approbation. Rien n'est envoyé avant l'approbation de l'autorisation.
+
+ Flux de travail créé à partir du modèle, mais sans autorisation protégée en brouillon (sa création nécessite un administrateur des flux de travail protégés). Il est désactivé : demandez à un administrateur de créer l'autorisation et d'en demander l'approbation avant de l'activer.
+
La limite de flux de travail de votre forfait est atteinte. Passez à un forfait supérieur pour en ajouter.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx
index 63a34f156..ab280b445 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.it.resx
@@ -696,6 +696,9 @@
Flusso di lavoro creato dal modello con un'autorizzazione protetta in bozza. Imposta l'URL di destinazione e la credenziale del passaggio, scegli i campi autorizzati e richiedi l'approvazione. Non invia nulla finché l'autorizzazione non è approvata.
+
+ Flusso di lavoro creato dal modello, ma senza un'autorizzazione protetta in bozza (per crearla serve un amministratore dei flussi di lavoro protetti). È disattivato: chiedi a un amministratore di creare l'autorizzazione e di richiederne l'approvazione prima di attivarlo.
+
È stato raggiunto il limite di flussi di lavoro del tuo piano. Passa a un piano superiore per aggiungerne altri.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx
index 6f55efd3f..52b2a05f5 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.pl.resx
@@ -696,6 +696,9 @@
Przepływ pracy utworzono z szablonu wraz z roboczym chronionym zezwoleniem. Ustaw docelowy adres URL i poświadczenie kroku, wybierz udostępniane pola i poproś o zatwierdzenie. Nic nie zostanie wysłane przed zatwierdzeniem zezwolenia.
+
+ Przepływ pracy utworzono z szablonu, ale bez roboczego chronionego zezwolenia (do jego utworzenia potrzebny jest administrator chronionych przepływów pracy). Jest wyłączony: przed włączeniem poproś administratora o utworzenie zezwolenia i wysłanie prośby o zatwierdzenie.
+
Osiągnięto limit przepływów pracy w Twoim planie. Przejdź na wyższy plan, aby dodać więcej.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx
index a5176f38f..980365433 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.resx
@@ -716,6 +716,9 @@
Workflow created from the template with a draft protected release. Set the destination URL and credential on the step, choose the released fields, then request approval. It never sends until the release is approved.
+
+ Workflow created from the template, but without a draft protected release (creating one needs a Protected Workflows administrator). It is disabled: have an administrator create the release and request approval before you enable it.
+
Workflow limit reached for your plan. Please upgrade to add more workflows.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx
index b137a2ddf..8a487f5c6 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.sv.resx
@@ -696,6 +696,9 @@
Arbetsflödet skapades från mallen med ett utkast till skyddad frisläppning. Ange mottagarens URL och autentiseringsuppgift för steget, välj de frisläppta fälten och begär sedan godkännande. Inget skickas förrän frisläppningen har godkänts.
+
+ Arbetsflödet skapades från mallen, men utan ett utkast till skyddad frisläppning (det kräver en administratör för skyddade arbetsflöden). Det är inaktiverat: låt en administratör skapa frisläppningen och begära godkännande innan du aktiverar det.
+
Gränsen för arbetsflöden i din plan har nåtts. Uppgradera för att lägga till fler arbetsflöden.
diff --git a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx
index ebcc56d5d..7b99a9b69 100644
--- a/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx
+++ b/Core/Resgrid.Localization/Areas/User/Workflows/Workflows.uk.resx
@@ -696,6 +696,9 @@
Робочий процес створено із шаблону разом із чернеткою захищеного дозволу. Укажіть URL призначення та облікові дані кроку, виберіть поля для розкриття та надішліть запит на затвердження. Нічого не надсилається, доки дозвіл не затверджено.
+
+ Робочий процес створено із шаблону, але без чернетки захищеного дозволу (для її створення потрібен адміністратор захищених робочих процесів). Його вимкнено: перш ніж увімкнути, попросіть адміністратора створити дозвіл і надіслати запит на затвердження.
+
Досягнуто ліміту робочих процесів вашого плану. Оновіть план, щоб додати більше робочих процесів.
diff --git a/Core/Resgrid.Model/AdminAssist/AdminAssistCatalog.cs b/Core/Resgrid.Model/AdminAssist/AdminAssistCatalog.cs
new file mode 100644
index 000000000..296acc356
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/AdminAssistCatalog.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed record CatalogLocation(string Controller, string Action, string Field = null)
+ {
+ public string Url => $"/User/{Uri.EscapeDataString(Controller)}/{Uri.EscapeDataString(Action)}" +
+ (string.IsNullOrWhiteSpace(Field) ? "" : "?aa=" + Uri.EscapeDataString(Field));
+ }
+ public sealed record SettingImpact(string Risk, string AudienceKey, string OperationKey,
+ string TimingKey, string ReversibilityKey, string VerificationKey);
+ public sealed record SettingCatalogEntry(string Id, string AreaId, string LabelKey, string HelpKey,
+ string Binding, string ValueType, string Classification, bool Secret, CatalogLocation Location,
+ string Owner, DateTime ReviewedOn, SettingImpact Impact, IReadOnlyList Requires,
+ IReadOnlyList Affects, IReadOnlyList Conflicts, string DocumentationId,
+ string DefaultValue = null, string AllowedValues = null, string EvidenceSource = null,
+ string Availability = "available", string ReviewGap = null, DateTime? ReviewGapExpiresOn = null);
+ public sealed record CapabilityRequirement(string Kind, string Id);
+ public sealed record CapabilitySetupDefinition(string EvidenceId, decimal Minimum, IReadOnlyList RuleIds, string GuidanceKey);
+ public sealed record ProductCapability(string Id, string AreaId, string LabelKey, string PurposeKey,
+ string ValueKey, string ExampleKey, string AdoptionKey, string ReleaseStatus,
+ CatalogLocation Location, IReadOnlyList Requirements,
+ IReadOnlyList SettingIds, IReadOnlyList RuleIds, CapabilitySetupDefinition Setup = null);
+ public sealed record ProductArea(string Id, string LabelKey, string PurposeKey, int Order,
+ IReadOnlyList Archetypes);
+ public sealed record CapabilityAccess(string CapabilityId, EvidenceState State,
+ IReadOnlyList ReasonCodes, bool CanConfigure, string Destination, DateTime AsOfUtc, string SubscriptionDestination = null,
+ EvidenceState? CommercialState = null);
+ public sealed record OperatingPack(string Id, string LabelKey, string PurposeKey,
+ IReadOnlyList AreaIds, IReadOnlyList RuleIds, IReadOnlyList PrerequisiteKeys);
+ public sealed record KnowledgeArticle(string Id, string Locale, string TitleKey, string Body,
+ string SourcePath, string Anchor, string PackVersion, string Owner, DateTime ReviewedOn);
+
+ public interface IAdminAssistCatalog
+ {
+ string Version { get; }
+ IReadOnlyList Settings { get; }
+ IReadOnlyList Areas { get; }
+ IReadOnlyList Capabilities { get; }
+ IReadOnlyList Packs { get; }
+ IReadOnlyList Rules { get; }
+ IReadOnlyList Articles { get; }
+ }
+
+ public enum EvidenceComparison { IsTrue, IsFalse, Equal, NotEqual, Greater, GreaterOrEqual, Less, LessOrEqual }
+ public sealed record EvidenceCondition(string EvidenceId, EvidenceComparison Comparison,
+ decimal? Number = null, string Code = null);
+ /// Fixed AND predicates: applicability first, then failure. No executable catalog expressions.
+ public sealed record ConfigurationRuleDefinition(string Id, string AreaId, FindingSeverity Severity,
+ string TitleKey, string ExplanationKey, string NextActionKey, CatalogLocation Location,
+ IReadOnlyList AppliesWhen, IReadOnlyList FailsWhen);
+}
diff --git a/Core/Resgrid.Model/AdminAssist/AdminAssistContracts.cs b/Core/Resgrid.Model/AdminAssist/AdminAssistContracts.cs
new file mode 100644
index 000000000..c5767181a
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/AdminAssistContracts.cs
@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public interface IConfigurationSnapshotProvider
+ {
+ Task ReadAsync(AdminAssistActor actor, CancellationToken cancellationToken = default);
+ }
+ public sealed record AdminAssistSearchHit(string Id, string TitleKey, string Excerpt, string SourcePath, string Anchor, string PackVersion, string Locale);
+ public interface IAdminAssistReferenceSearch
+ {
+ IReadOnlyList Search(string query, string locale, int take = 20);
+ }
+ public interface IAdminAssistEvidenceSource
+ {
+ string SourceId { get; }
+ IReadOnlyList EvidenceIds { get; }
+ Task> ReadAsync(AdminAssistActor actor, DateTime asOfUtc, CancellationToken cancellationToken);
+ }
+ public interface IAdminAssistAccessService
+ {
+ Task CanAccessAsync(AdminAssistActor actor, bool setup, CancellationToken cancellationToken = default);
+ Task> GetCapabilitiesAsync(AdminAssistActor actor, CancellationToken cancellationToken = default);
+ Task GetCapabilityAsync(AdminAssistActor actor, string capabilityId, CancellationToken cancellationToken = default);
+ }
+ public interface IConfigurationRule
+ {
+ ConfigurationRuleDefinition Definition { get; }
+ ConfigurationFinding Evaluate(ConfigurationSnapshot snapshot, DateTime nowUtc, TimeSpan maximumAge);
+ }
+ public interface IAdminAssistService
+ {
+ Task GetOverviewAsync(AdminAssistActor actor, bool setup, CancellationToken cancellationToken = default);
+ Task UpdateSetupAsync(AdminAssistActor actor, SetupProgressCommand command, CancellationToken cancellationToken = default);
+ Task> GetHistoryAsync(AdminAssistActor actor, int skip, int take, CancellationToken cancellationToken = default);
+ }
+ public sealed record SetupWorkspace(int DepartmentId, long Revision, SetupMode Mode,
+ IReadOnlyDictionary Areas, IReadOnlyList LearnedCapabilityIds,
+ IReadOnlyList InterestedCapabilityIds, string CatalogVersion, DateTime? ReviewedOnUtc, bool SetupPromptDismissed = false,
+ IReadOnlyDictionary AreaReasons = null, SetupReviewEvidence ReviewEvidence = null, DateTime? RevisitOnUtc = null, long ScopeRevision = 0);
+ public sealed record SetupProgressCommand(long ExpectedRevision, string Operation, string TargetId = null,
+ string Choice = null, string CatalogVersion = null, string ReasonCode = null, string EvidenceRevision = null, DateTime? RevisitOnUtc = null)
+ {
+ [System.Text.Json.Serialization.JsonIgnore, Newtonsoft.Json.JsonIgnore]
+ public SetupReviewEvidence ReviewEvidence { get; init; }
+ }
+ public enum SetupAreaReason { OutsideMission, OtherSystem, PartnerManaged, NoCurrentNeed }
+ public sealed record SetupReviewEvidence(string CatalogVersion, string SnapshotRevision, DateTime AsOfUtc, int Required, int Verified, int Failed, int Unknown, long ScopeRevision = 0);
+ public sealed record AdminAssistOverview(string CatalogVersion, SetupWorkspace Workspace,
+ ConfigurationReport Report, IReadOnlyList Access, IReadOnlyList CapabilitySetup = null);
+ public enum CapabilitySetupState { NotAssessed, NotConfigured, ConfigurationPresent, ChecksPassed, NeedsAttention }
+ public sealed record CapabilitySetupAssessment(string CapabilityId, CapabilitySetupState State, string OpportunityKey,
+ string GuidanceKey, IReadOnlyList RuleIds, string SnapshotRevision, DateTime AsOfUtc);
+ public sealed record AdminAssistHistoryItem(string Id, string ActorId, DateTime OccurredOnUtc,
+ string Source, string Action, string SubjectId, string BeforeCode, string AfterCode, long Revision);
+ public interface IAdminAssistRepository
+ {
+ Task> GetFindingsAsync(int departmentId, CancellationToken cancellationToken);
+ Task SaveFindingAsync(AdminAssistFindingRow row, long expectedRevision, CancellationToken cancellationToken);
+ Task SaveDailySummaryAsync(int departmentId, ConfigurationReport report, string catalogVersion, CancellationToken cancellationToken);
+ Task LockConfigurationAsync(int departmentId, CancellationToken cancellationToken);
+ Task ValidateOperatingProfileReferencesAsync(int departmentId, DepartmentOperatingProfile profile, DateTime asOfUtc, CancellationToken cancellationToken);
+ Task AppendConfigurationChangeAsync(int departmentId, string actorId, string binding, string before, string after, string correlationId, CancellationToken cancellationToken);
+ Task GetConfigurationRevisionAsync(int departmentId, CancellationToken cancellationToken);
+ Task GetWorkspaceAsync(int departmentId, string userId, string catalogVersion, CancellationToken cancellationToken);
+ Task UpdateWorkspaceAsync(AdminAssistActor actor, SetupProgressCommand command, CancellationToken cancellationToken);
+ Task> GetHistoryAsync(int departmentId, string actorId, int skip, int take, CancellationToken cancellationToken);
+ }
+ public sealed class AdminAssistConcurrencyException : Exception
+ {
+ public AdminAssistConcurrencyException() : base("The setup workspace changed. Reload before saving.") { }
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/AdminAssistFindingRow.cs b/Core/Resgrid.Model/AdminAssist/AdminAssistFindingRow.cs
new file mode 100644
index 000000000..2f7f0cd01
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/AdminAssistFindingRow.cs
@@ -0,0 +1,43 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Resgrid.Model.AdminAssist
+{
+ [Table("AdminAssistFindings")]
+ public sealed class AdminAssistFindingRow : IEntity
+ {
+ [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public string AdminAssistFindingId { get; set; }
+ public int DepartmentId { get; set; }
+ public string RuleId { get; set; }
+ public string SubjectId { get; set; }
+ public int Episode { get; set; }
+ public int Result { get; set; }
+ public int Severity { get; set; }
+ public int ReviewStatus { get; set; }
+ public string OwnerId { get; set; }
+ public DateTime? ReviewOn { get; set; }
+ public DateTime? ExceptionUntil { get; set; }
+ public string Content { get; set; }
+ public bool IsProtected { get; set; }
+ public int ProtectedCatalogVersion { get; set; }
+ public string SnapshotRevision { get; set; }
+ public long Revision { get; set; }
+ public DateTime FirstObservedOn { get; set; }
+ public DateTime LastObservedOn { get; set; }
+ [NotMapped] public object IdValue { get => AdminAssistFindingId; set => AdminAssistFindingId = value?.ToString(); }
+ [NotMapped] public string TableName => "AdminAssistFindings";
+ [NotMapped] public string IdName => nameof(AdminAssistFindingId);
+ [NotMapped] public int IdType => 1;
+ [NotMapped] public IEnumerable IgnoredProperties => new[] { nameof(IdValue), nameof(TableName), nameof(IdName), nameof(IdType) };
+ }
+ public sealed record FindingReviewCommand(string FindingId, long ExpectedRevision, string Operation,
+ string OwnerId = null, DateTime? ReviewOnUtc = null, DateTime? ExceptionUntilUtc = null, string Note = null);
+ public interface IAdminAssistWorklistService
+ {
+ System.Threading.Tasks.Task> GetAsync(AdminAssistActor actor, System.Threading.CancellationToken cancellationToken = default);
+ System.Threading.Tasks.Task VerifyAsync(AdminAssistActor actor, System.Threading.CancellationToken cancellationToken = default);
+ System.Threading.Tasks.Task ReviewAsync(AdminAssistActor actor, FindingReviewCommand command, System.Threading.CancellationToken cancellationToken = default);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/AdminAssistMaintenance.cs b/Core/Resgrid.Model/AdminAssist/AdminAssistMaintenance.cs
new file mode 100644
index 000000000..369a8985c
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/AdminAssistMaintenance.cs
@@ -0,0 +1,56 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed class AdminAssistPreferences
+ {
+ public int DepartmentId { get; set; }
+ public string UserId { get; set; }
+ public bool DigestEnabled { get; set; }
+ public int QuietStartHour { get; set; } = 20;
+ public int QuietEndHour { get; set; } = 8;
+ public string Locale { get; set; } = "en";
+ public long Revision { get; set; }
+ public DateTime? LastAttemptOn { get; set; }
+ public string LastAttemptWeek { get; set; }
+ public string LastAttemptOutcome { get; set; }
+ }
+ public sealed record AdminAssistPreferencesCommand(long ExpectedRevision, bool DigestEnabled, int QuietStartHour, int QuietEndHour);
+ public sealed record AdminAssistWorkerStatus(DateTime? LastEvaluatedOn, DateTime? LastDigestOn);
+ public interface IAdminAssistMaintenanceStore
+ {
+ Task> GetDueDepartmentsAsync(DateTime nowUtc, int take, CancellationToken ct);
+ Task TryLeaseAsync(int departmentId, string lease, DateTime nowUtc, CancellationToken ct);
+ Task CompleteLeaseAsync(int departmentId, string lease, DateTime? evaluatedOn, CancellationToken ct);
+ Task GetWorkerStatusAsync(int departmentId, CancellationToken ct);
+ Task GetPreferencesAsync(int departmentId, string userId, CancellationToken ct);
+ Task> GetDigestPreferencesAsync(int departmentId, CancellationToken ct);
+ Task AdvanceDigestCursorAsync(int departmentId, string userId, CancellationToken ct);
+ Task SavePreferencesAsync(AdminAssistActor actor, AdminAssistPreferencesCommand command, CancellationToken ct);
+ Task ClaimDigestAsync(AdminAssistPreferences preference, string week, DateTime nowUtc, CancellationToken ct);
+ Task CompleteDigestAsync(int departmentId, string userId, string week, string outcome, DateTime nowUtc, CancellationToken ct);
+ Task PurgeExpiredMetadataAsync(int departmentId, DateTime nowUtc, CancellationToken ct);
+ }
+ public interface IAdminAssistMaintenanceService
+ {
+ Task RunDepartmentAsync(int departmentId, CancellationToken ct);
+ }
+ public static class AdminAssistDigestSchedule
+ {
+ public static bool IsQuiet(DateTime utc, TimeZoneInfo zone, int start, int end)
+ {
+ if (utc.Kind != DateTimeKind.Utc || start is < 0 or > 23 || end is < 0 or > 23) throw new ArgumentException("Invalid digest schedule.");
+ var hour = TimeZoneInfo.ConvertTimeFromUtc(utc, zone).Hour;
+ return start == end ? false : start < end ? hour >= start && hour < end : hour >= start || hour < end;
+ }
+ public static string Week(DateTime utc, TimeZoneInfo zone)
+ {
+ if (utc.Kind != DateTimeKind.Utc) throw new ArgumentException("UTC required.");
+ var local = TimeZoneInfo.ConvertTimeFromUtc(utc, zone).Date;
+ return local.AddDays(-(((int)local.DayOfWeek + 6) % 7)).ToString("yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture);
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/AdminAssistWorkflowPayload.cs b/Core/Resgrid.Model/AdminAssist/AdminAssistWorkflowPayload.cs
new file mode 100644
index 000000000..2e0a5035f
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/AdminAssistWorkflowPayload.cs
@@ -0,0 +1,33 @@
+using System;
+using System.Linq;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using Resgrid.Model.Services;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// Public rule codes and scalar lifecycle metadata only; no notes, names, source evidence, owners or grants.
+ public static class AdminAssistWorkflowPayload
+ {
+ public static readonly int[] Triggers = { 189, 190, 191 };
+ public static readonly (string Variable, string Property)[] Variables = { ("id", "FindingId"), ("rule_id", "RuleId"), ("episode", "Episode"), ("result", "Result"), ("severity", "Severity"), ("review_status", "ReviewStatus") };
+ public static readonly string[] RuleIds = { "shift-auto-without-dispatch", "shift-coverage", "text-sources", "command-sources", "admin-mfa", "admin-enrollment", "admin-succession", "empty-groups", "unit-type", "unit-group", "station-address", "person-location-age", "unit-location-age", "map-token", "map-style", "personnel-limit", "unit-limit", "run-cards", "checkin-timers", "weather-zones", "communication-tests", "qualified-coverage", "credential-expiry", "checklist-overdue", "equipment-holds", "stock-expiry", "workflow-failures", "import-heartbeat", "email-import-failures", "policy-references", "policy-expiry", "site-references", "continuity-reference", "record-review", "password-recovery", "shift-open-slots", "shift-overlaps", "shift-trades" };
+ public static string Routing(JObject payload)
+ {
+ var safe = new JObject();
+ if (payload["FindingId"]?.Type == JTokenType.String && Guid.TryParseExact(payload["FindingId"].Value(), "D", out var id)) safe["FindingId"] = id.ToString("D");
+ if (payload["RuleId"]?.Type == JTokenType.String && RuleIds.Contains(payload["RuleId"].Value(), StringComparer.Ordinal)) safe["RuleId"] = payload["RuleId"].DeepClone();
+ foreach (var (name, max) in new[] { ("Episode", int.MaxValue), ("Result", 3), ("Severity", 2), ("ReviewStatus", 4) })
+ if (payload[name]?.Type == JTokenType.Integer && payload[name].Value() >= 0 && payload[name].Value() <= max) safe[name] = payload[name].DeepClone();
+ return safe.ToString(Formatting.None);
+ }
+ public static async Task ProjectAsync(int departmentId, JObject payload, IProtectedProjectionService protection, bool wrapped)
+ {
+ var projected = await protection.BuildSafeWorkflowPayloadAsync(departmentId, JObject.Parse(Routing(payload)))
+ ?? throw new InvalidOperationException("Admin Assist workflow projection unavailable.");
+ var safe = JObject.Parse(Routing(JObject.Parse(projected)));
+ return (wrapped ? new JObject { ["Payload"] = safe } : safe).ToString(Formatting.None);
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/AdminAssistWorkspaceRow.cs b/Core/Resgrid.Model/AdminAssist/AdminAssistWorkspaceRow.cs
new file mode 100644
index 000000000..1e9b72251
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/AdminAssistWorkspaceRow.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using Newtonsoft.Json;
+
+namespace Resgrid.Model.AdminAssist
+{
+ [Table("AdminAssistWorkspaces")]
+ public sealed class AdminAssistWorkspaceRow : IEntity
+ {
+ [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
+ public int DepartmentId { get; set; }
+ public long Revision { get; set; }
+ public int Mode { get; set; }
+ /// Versioned scope/reason codes, review evidence references and revisit date; never notes, configuration or secrets.
+ public string AreasJson { get; set; }
+ public string CatalogVersion { get; set; }
+ public DateTime? ReviewedOn { get; set; }
+ public DateTime ModifiedOn { get; set; }
+ [NotMapped, JsonIgnore] public object IdValue { get => DepartmentId; set => DepartmentId = Convert.ToInt32(value); }
+ [NotMapped] public string TableName => "AdminAssistWorkspaces";
+ [NotMapped] public string IdName => "DepartmentId";
+ [NotMapped] public int IdType => 0;
+ [NotMapped] public IEnumerable IgnoredProperties => new[] { "IdValue", "IdType", "TableName", "IdName" };
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/AdministrativeReferences.cs b/Core/Resgrid.Model/AdminAssist/AdministrativeReferences.cs
new file mode 100644
index 000000000..9c5ddee1b
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/AdministrativeReferences.cs
@@ -0,0 +1,12 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed record AdministrativeReferenceCounts(int PolicyReferences, int UnavailablePolicies, int ExpiringPolicies, int SiteReferences, int UnavailableSites);
+ public interface IAdministrativeReferenceStore
+ {
+ Task ReadAdministrativeReferencesAsync(int departmentId, int[] documentIds, int[] groupIds, DateTime asOfUtc, CancellationToken cancellationToken);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/ConfigurationChangeAudit.cs b/Core/Resgrid.Model/AdminAssist/ConfigurationChangeAudit.cs
new file mode 100644
index 000000000..cfbf7b781
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/ConfigurationChangeAudit.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// Fingerprint is request-local and must never be persisted. Values contains reviewed scalar/presence markers only.
+ public sealed record ConfigurationChangeStamp(string Fingerprint, string Values);
+ public interface IConfigurationChangeJournal
+ {
+ Task ExecuteAsync(int departmentId, string binding, Func> read,
+ Func> write, CancellationToken cancellationToken);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/ConfigurationEvidence.cs b/Core/Resgrid.Model/AdminAssist/ConfigurationEvidence.cs
new file mode 100644
index 000000000..142d7d0b0
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/ConfigurationEvidence.cs
@@ -0,0 +1,53 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public enum EvidenceState { Known, Unknown, Unavailable, Redacted, NotApplicable }
+ public enum FindingSeverity { Information, Warning, Critical }
+ public enum RuleResult { Pass, Fail, Unknown, NotApplicable }
+ public enum FindingReviewStatus { Unassigned, Assigned, InReview, AcceptedException, Resolved }
+ public enum SetupAreaChoice { UseNow, LearnLater, NotApplicable }
+ public enum SetupMode { Fresh, Review, Import }
+
+ /// Only allowlisted scalar metadata enters the engine; no raw configuration, names or secrets.
+ public sealed record ConfigurationEvidence(
+ string Id, EvidenceState State, string Source, string Version, DateTime AsOfUtc,
+ bool? Boolean = null, decimal? Number = null, string Code = null, string ReasonCode = null)
+ {
+ public bool IsFresh(DateTime now, TimeSpan lifetime) => State == EvidenceState.Known &&
+ AsOfUtc <= now && now - AsOfUtc <= lifetime;
+ }
+
+ public sealed record ConfigurationSnapshot(
+ int DepartmentId, string ActorId, string Revision, DateTime AsOfUtc, bool Consistent,
+ IReadOnlyDictionary Evidence)
+ {
+ public ConfigurationEvidence Find(string id) => Evidence.TryGetValue(id, out var value) ? value :
+ new ConfigurationEvidence(id, EvidenceState.Unknown, "not-observed", Revision, AsOfUtc,
+ ReasonCode: "EvidenceNotObserved");
+ }
+
+ public sealed record ConfigurationFinding(
+ string RuleId, string AreaId, FindingSeverity Severity, RuleResult Result,
+ string TitleKey, string ExplanationKey, string NextActionKey, string Destination,
+ IReadOnlyList EvidenceIds, string SnapshotRevision, DateTime EvaluatedOnUtc,
+ string ReasonCode = null, bool ScopeIndependent = false);
+
+ public sealed record ConfigurationReport(ConfigurationSnapshot Snapshot,
+ IReadOnlyList Findings, IReadOnlyList SelectedAreas)
+ {
+ public int Verified => Applicable.Count(f => f.Result == RuleResult.Pass);
+ public int Required => Applicable.Count();
+ public int Failed => Applicable.Count(f => f.Result == RuleResult.Fail);
+ public int Unknown => Applicable.Count(f => f.Result == RuleResult.Unknown);
+ public IReadOnlyList UncheckedAreaIds => SelectedAreas.Where(area => !Findings.Any(f => f.AreaId == area)).Distinct().ToArray();
+ public bool HasCriticalUncertainty => !Snapshot.Consistent || Applicable.Any(f =>
+ f.Severity == FindingSeverity.Critical && f.Result == RuleResult.Unknown);
+ private IEnumerable Applicable => Findings.Where(f =>
+ f.Result != RuleResult.NotApplicable && (f.AreaId == "security" || f.ScopeIndependent || SelectedAreas.Contains(f.AreaId)));
+ }
+
+ public sealed record AdminAssistActor(int DepartmentId, string UserId, string Locale = "en");
+}
diff --git a/Core/Resgrid.Model/AdminAssist/ConfigurationImpact.cs b/Core/Resgrid.Model/AdminAssist/ConfigurationImpact.cs
new file mode 100644
index 000000000..f966f0311
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/ConfigurationImpact.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// Only proposed scalar values are accepted from the caller. All current evidence is read by the server.
+ public sealed record ConfigurationImpactRequest(string SettingId, string ExpectedRevision, bool? Boolean = null, decimal? Number = null);
+ public sealed record CapacityImpactRequest(string ExpectedRevision, int ProposedPersonnelCount, int ProposedUnitCount);
+ public sealed record ConfigurationImpactMetric(string LabelKey, EvidenceState State, decimal? Before, decimal? After, string ReasonCode = null);
+ public sealed record ConfigurationImpactRule(string RuleId, string TitleKey, RuleResult Before, RuleResult After);
+ public sealed record ConfigurationImpactReport(string SettingId, string SnapshotRevision, DateTime AsOfUtc,
+ string EvaluatorVersion, SettingImpact Profile, IReadOnlyList Metrics,
+ IReadOnlyList RuleChanges, IReadOnlyList LimitKeys, string Destination);
+ public interface IConfigurationImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, ConfigurationImpactRequest request, CancellationToken cancellationToken = default);
+ Task PreviewCapacityAsync(AdminAssistActor actor, CapacityImpactRequest request, CancellationToken cancellationToken = default);
+ }
+ public sealed record OperationalImpact(IReadOnlyList Metrics, IReadOnlyList LimitKeys, string Version);
+ public interface IOperationalImpactProvider
+ {
+ bool Supports(string settingId);
+ Task EvaluateAsync(AdminAssistActor actor, ConfigurationSnapshot snapshot, ConfigurationImpactRequest request, CancellationToken cancellationToken);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/DepartmentOperatingProfile.cs b/Core/Resgrid.Model/AdminAssist/DepartmentOperatingProfile.cs
new file mode 100644
index 000000000..51a65d645
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/DepartmentOperatingProfile.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using ProtoBuf;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// Declared administrative context. Codes and references only; never clinical scope inferred from a role.
+ [ProtoContract]
+ public sealed class DepartmentOperatingProfile : IValidatableObject
+ {
+ public static readonly string[] ArchetypeCodes = { "fire", "ems", "mental-health", "sar", "emergency-response", "hazmat", "industrial", "security", "mutual-aid" };
+ public static readonly string[] WorkforceCodes = { "unknown", "career", "volunteer", "contract", "combination" };
+ public static readonly string[] DispatchCodes = { "unknown", "central", "self", "external", "combination" };
+ public static readonly string[] HoursCodes = { "unknown", "continuous", "scheduled", "on-call", "seasonal" };
+ [ProtoMember(1)] public List Archetypes { get; set; } = new();
+ [ProtoMember(2)] public string WorkforceMix { get; set; } = "unknown";
+ [ProtoMember(3)] public int? DeclaredMemberCount { get; set; }
+ [ProtoMember(4)] public List AuthoritativeSystemReferences { get; set; } = new();
+ [ProtoMember(5)] public string DispatchModel { get; set; } = "unknown";
+ [ProtoMember(6)] public string OperatingHours { get; set; } = "unknown";
+ [ProtoMember(7)] public List SiteGroupReferences { get; set; } = new();
+ [ProtoMember(8)] public bool? MutualAid { get; set; }
+ [ProtoMember(9)] public List LanguageCodes { get; set; } = new();
+ [ProtoMember(10)] public List AccessibilityNeeds { get; set; } = new();
+ [ProtoMember(11)] public List StaffingPolicyReferences { get; set; } = new();
+ [ProtoMember(12)] public List QualificationPolicyReferences { get; set; } = new();
+ [ProtoMember(13)] public List ContinuityProcedureReferences { get; set; } = new();
+ [ProtoMember(14)] public string SeasonStartMonthDay { get; set; }
+ [ProtoMember(15)] public string SeasonEndMonthDay { get; set; }
+ [ProtoMember(16)] public DateTime? ReviewedOnUtc { get; set; }
+ [ProtoMember(17)] public long Revision { get; set; }
+ [ProtoMember(18)] public int? ExpectedEmailPollIntervalMinutes { get; set; }
+
+ public IEnumerable Validate(ValidationContext validationContext)
+ {
+ if (Revision < 0 || Revision == long.MaxValue) yield return new ValidationResult("Invalid profile revision.", new[] { nameof(Revision) });
+ if (Archetypes == null || Archetypes.Count > ArchetypeCodes.Length || Archetypes.Distinct().Count() != Archetypes.Count || Archetypes.Any(a => !ArchetypeCodes.Contains(a)))
+ yield return new ValidationResult("Invalid operating archetype.", new[] { nameof(Archetypes) });
+ if (!WorkforceCodes.Contains(WorkforceMix) || !DispatchCodes.Contains(DispatchModel) || !HoursCodes.Contains(OperatingHours))
+ yield return new ValidationResult("Invalid operating context.");
+ if (DeclaredMemberCount < 0 || DeclaredMemberCount > 1000000) yield return new ValidationResult("Member count is outside the supported range.", new[] { nameof(DeclaredMemberCount) });
+ if (ExpectedEmailPollIntervalMinutes is < 1 or > 10080) yield return new ValidationResult("Expected email polling interval must be between 1 and 10080 minutes, or blank.", new[] { nameof(ExpectedEmailPollIntervalMinutes) });
+ var references = new[] { AuthoritativeSystemReferences, SiteGroupReferences, StaffingPolicyReferences, QualificationPolicyReferences, ContinuityProcedureReferences };
+ if (references.Any(list => list == null || list.Count > 25 || list.Any(value => string.IsNullOrWhiteSpace(value) || value.Length > 128 || value.Any(c => !(char.IsAsciiLetterOrDigit(c) || c == '-' || c == '_' || c == '.')))))
+ yield return new ValidationResult("Use at most 25 existing document, group or system reference identifiers per field.");
+ if (LanguageCodes == null || LanguageCodes.Count > 20 || LanguageCodes.Any(value => !Resgrid.Model.Helpers.AdminAssistLanguageCodes.IsValid(value)))
+ yield return new ValidationResult("Use supported language codes.", new[] { nameof(LanguageCodes) });
+ if (AccessibilityNeeds == null || AccessibilityNeeds.Count > 4 || AccessibilityNeeds.Any(value => !new[] { "captions", "screen-reader", "large-text", "plain-language" }.Contains(value)))
+ yield return new ValidationResult("Invalid accessibility preference.", new[] { nameof(AccessibilityNeeds) });
+ if ((SeasonStartMonthDay != null || SeasonEndMonthDay != null) && (!ValidDay(SeasonStartMonthDay) || !ValidDay(SeasonEndMonthDay)))
+ yield return new ValidationResult("Season dates must both use MM-DD.");
+ }
+ private static bool ValidDay(string value) => DateTime.TryParseExact("2000-" + value, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out _);
+ }
+}
+
+namespace Resgrid.Model.Helpers
+{
+ public static class AdminAssistLanguageCodes
+ {
+ public static bool IsValid(string code) => new[] { "ar", "de", "el", "en", "es", "fr", "it", "pl", "sv", "uk" }.Contains(code);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/DispatchImpact.cs b/Core/Resgrid.Model/AdminAssist/DispatchImpact.cs
new file mode 100644
index 000000000..09c770e3b
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/DispatchImpact.cs
@@ -0,0 +1,14 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// A saved call supplies route identifiers, never historical recipient evidence.
+ public sealed record DispatchImpactRequest(string ExpectedRevision, int CallId, DateTime SimulationTimeUtc,
+ bool ShiftInsteadOfGroup, bool UnitCrew, bool UnitGroup);
+ public interface IDispatchImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, DispatchImpactRequest request, CancellationToken cancellationToken = default);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/DispatchProviderOutcome.cs b/Core/Resgrid.Model/AdminAssist/DispatchProviderOutcome.cs
new file mode 100644
index 000000000..567703bd9
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/DispatchProviderOutcome.cs
@@ -0,0 +1,14 @@
+namespace Resgrid.Model.AdminAssist
+{
+ public static class DispatchProviderOutcome
+ {
+ /// Normalize only documented creation-response states. Later receipt stages are not inferred.
+ public static bool? CreationStatus(string status) => status?.ToLowerInvariant() switch
+ {
+ "accepted" or "queued" or "sending" or "sent" or "delivered" or "read" or "scheduled" or
+ "ringing" or "in-progress" or "completed" => true,
+ "failed" or "undelivered" or "canceled" or "busy" or "no-answer" => false,
+ _ => null
+ };
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/DispatchRecipientResolver.cs b/Core/Resgrid.Model/AdminAssist/DispatchRecipientResolver.cs
new file mode 100644
index 000000000..cb3636ae3
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/DispatchRecipientResolver.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public enum DispatchRouteKind { Direct, Group, Shift, UnitCrew, UnitGroup, Role }
+ public sealed record DispatchRoute(DispatchRouteKind Kind, string SourceId, IReadOnlyList Members,
+ bool UseResolvedShift = false, IReadOnlyList OnDutyMembers = null);
+ public sealed record DispatchSelection(string UserId, DispatchRouteKind Kind, string SourceId, bool Selected, bool EmptyShiftFallback);
+ public sealed record DispatchResolution(DateTime AsOfUtc, IReadOnlyList Decisions,
+ IReadOnlyList SelectedUserIds);
+
+ ///
+ /// Pure routing, used incrementally by the broadcaster and over isolated snapshots by previews.
+ /// Channel eligibility remains the communication service's responsibility. Inputs must already be
+ /// department scoped and filtered by the call's dispatch-scope decision. No I/O, wall clock or mutation.
+ ///
+ public static class DispatchRecipientResolver
+ {
+ public const string Version = "1";
+ public static DispatchResolution Resolve(DateTime asOfUtc, IEnumerable routes,
+ IEnumerable previouslySelected = null)
+ {
+ if (asOfUtc.Kind != DateTimeKind.Utc) throw new ArgumentException("An explicit UTC simulation time is required.", nameof(asOfUtc));
+ var prior = previouslySelected as IReadOnlySet ?? new HashSet(previouslySelected ?? Array.Empty(), StringComparer.Ordinal);
+ var seen = new HashSet(StringComparer.Ordinal);
+ var decisions = new List();
+ var selected = new List();
+ foreach (var route in routes)
+ {
+ if (route.Members == null || route.UseResolvedShift && route.OnDutyMembers == null)
+ throw new ArgumentException("Missing routing evidence must not be treated as an empty roster.");
+ var shift = route.Kind == DispatchRouteKind.Group && route.UseResolvedShift && route.OnDutyMembers.Count > 0;
+ var fallback = route.Kind == DispatchRouteKind.Group && route.UseResolvedShift && !shift;
+ foreach (var userId in shift ? route.OnDutyMembers : route.Members)
+ {
+ // Direct dispatch rows historically remain separate attempts, including duplicates. Expanded
+ // routes deduplicate against every earlier route even when that earlier send failed.
+ var added = !prior.Contains(userId) && seen.Add(userId);
+ var include = route.Kind == DispatchRouteKind.Direct || added;
+ decisions.Add(new DispatchSelection(userId, shift ? DispatchRouteKind.Shift : route.Kind, route.SourceId, include, fallback));
+ if (include) selected.Add(userId);
+ }
+ }
+ return new DispatchResolution(asOfUtc, decisions.AsReadOnly(), selected.AsReadOnly());
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/DispatchTraceEnvelope.cs b/Core/Resgrid.Model/AdminAssist/DispatchTraceEnvelope.cs
new file mode 100644
index 000000000..401b765eb
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/DispatchTraceEnvelope.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Text.Json;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// Versioned, bounded queue contract. No arbitrary provider payload or exception text is accepted.
+ public static class DispatchTraceEnvelope
+ {
+ public const int MaximumBytes = 32768;
+ public const string ContentType = "application/vnd.resgrid.admin-assist-trace.v1+json";
+ public static void Validate(AdminAssistDispatchTraceRow row)
+ {
+ if (row == null || !Guid.TryParseExact(row.AdminAssistDispatchTraceId, "D", out _) ||
+ !Guid.TryParseExact(row.AttemptId, "D", out _) || row.DepartmentId <= 0 || row.CallId <= 0 ||
+ !Enum.TryParse(row.Stage, out var stage) || !Enum.IsDefined(stage) ||
+ string.IsNullOrWhiteSpace(row.ResolverVersion) || row.ResolverVersion.Length > 64 ||
+ row.OccurredOn == default || row.OccurredOn > DateTime.UtcNow.AddMinutes(5) ||
+ string.IsNullOrWhiteSpace(row.Content) || row.Content.Length > MaximumBytes)
+ throw new ArgumentException("Invalid dispatch trace envelope.");
+ if (row.IsProtected)
+ {
+ if (row.ProtectedCatalogVersion < 30 || !ProtectedDataEnvelope.IsEnveloped(row.Content))
+ throw new ArgumentException("Invalid protected dispatch trace envelope.");
+ return;
+ }
+ var observation = JsonSerializer.Deserialize(row.Content) ?? throw new ArgumentException("Missing dispatch trace observation.");
+ if (row.ProtectedCatalogVersion != 0 || observation.Id != row.AdminAssistDispatchTraceId ||
+ observation.DepartmentId != row.DepartmentId || observation.CallId != row.CallId ||
+ observation.AttemptId != row.AttemptId || observation.Stage != stage || observation.OccurredOnUtc != row.OccurredOn ||
+ !Enum.IsDefined(observation.Channel) || !Enum.IsDefined(observation.Reason) ||
+ !Enum.IsDefined(observation.Provider) || observation.ProviderMessageId != null && !DispatchTraceTelemetry.IsProviderMessageId(observation.Provider, observation.ProviderMessageId) ||
+ observation.LogicalMessageId != null && !Guid.TryParseExact(observation.LogicalMessageId, "D", out _) ||
+ observation.RouteKind.HasValue && !Enum.IsDefined(observation.RouteKind.Value) ||
+ observation.RecipientId?.Length > 128 || observation.SourceId?.Length > 128 ||
+ observation.Sequence < 0 || observation.PriorDropped < 0 || observation.ResolverVersion != null && observation.ResolverVersion != row.ResolverVersion)
+ throw new ArgumentException("Mismatched dispatch trace observation.");
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/DispatchTraceTelemetry.cs b/Core/Resgrid.Model/AdminAssist/DispatchTraceTelemetry.cs
new file mode 100644
index 000000000..5cf73cadb
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/DispatchTraceTelemetry.cs
@@ -0,0 +1,130 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Threading;
+using System.Threading.Channels;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public enum DispatchTraceStage { Selected, Excluded, Attempted, ServiceCompleted, ServiceDeclined, Failed, Skipped, BroadcastStarted, BroadcastCompleted, ProviderAccepted, ProviderDeclined, ProviderResultUnknown }
+ public enum DispatchTraceChannel { Routing, Push, Sms, Email, Voice, UnitPush }
+ public enum DispatchTraceProvider { None, Twilio, SignalWire, Postmark }
+ public enum DispatchTraceReason { None, DuplicateRoute, EmptyShiftFallback, ProfileMissing, BroadcastDisabled, MemberIneligible, ChannelDisabled, ContactUnverified, SendException }
+ public sealed record DispatchTraceObservation(string Id, int DepartmentId, int CallId, int? QueueItemId,
+ string AttemptId, DateTime OccurredOnUtc, DispatchTraceStage Stage, DispatchTraceChannel Channel,
+ DispatchTraceReason Reason, string RecipientId, DispatchRouteKind? RouteKind, string SourceId, DateTime? InputAsOfUtc,
+ int Sequence = 0, int PriorDropped = 0, string ResolverVersion = null,
+ string LogicalMessageId = null, DispatchTraceProvider Provider = DispatchTraceProvider.None, string ProviderMessageId = null);
+
+ /// Bounded, non-blocking capture. Nothing here contacts a database, broker, logger or model.
+ public static class DispatchTraceTelemetry
+ {
+ private sealed class Context { public int DepartmentId; public int CallId; public int? QueueItemId; public string AttemptId; public int Count; public int Dropped; }
+ private static readonly AsyncLocal Current = new();
+ private sealed record ChannelContext(string LogicalMessageId, string RecipientId);
+ private static readonly AsyncLocal Sending = new();
+ private static readonly Channel Queue = Channel.CreateBounded(new BoundedChannelOptions(2048) { FullMode = BoundedChannelFullMode.Wait, SingleReader = true, AllowSynchronousContinuations = false });
+ private static long _dropped;
+ public static long Dropped => Interlocked.Read(ref _dropped);
+ public static ChannelReader Reader => Queue.Reader;
+ public static IDisposable Begin(int departmentId, int callId, int? queueItemId, bool enabled)
+ {
+ var previous = Current.Value;
+ Current.Value = enabled ? new Context { DepartmentId = departmentId, CallId = callId, QueueItemId = queueItemId, AttemptId = Guid.NewGuid().ToString("D") } : null;
+ return new Scope(() => Current.Value = previous);
+ }
+ public static void Observe(DispatchTraceStage stage, DispatchTraceChannel channel = DispatchTraceChannel.Routing,
+ DispatchTraceReason reason = DispatchTraceReason.None, string recipientId = null, DispatchRouteKind? routeKind = null, string sourceId = null, DateTime? inputAsOfUtc = null,
+ DispatchTraceProvider provider = DispatchTraceProvider.None, string providerMessageId = null)
+ {
+ var context = Current.Value;
+ if (context == null) return;
+ // IDs only, never provider bodies, phone numbers, addresses, exception messages or call text.
+ var sequence = Interlocked.Increment(ref context.Count);
+ if (sequence > 10000 && stage != DispatchTraceStage.BroadcastCompleted || recipientId?.Length > 128 || sourceId?.Length > 128)
+ {
+ Interlocked.Increment(ref context.Dropped); Interlocked.Increment(ref _dropped); return;
+ }
+ var observation = new DispatchTraceObservation(Guid.NewGuid().ToString("D"), context.DepartmentId, context.CallId, context.QueueItemId,
+ context.AttemptId, DateTime.UtcNow, stage, channel, reason, recipientId, routeKind, sourceId, inputAsOfUtc,
+ sequence, Volatile.Read(ref context.Dropped), DispatchRecipientResolver.Version, Sending.Value?.LogicalMessageId, provider, providerMessageId);
+ if (!Queue.Writer.TryWrite(observation)) { Interlocked.Increment(ref context.Dropped); Interlocked.Increment(ref _dropped); }
+ }
+ public static async Task AttemptAsync(DispatchTraceChannel channel, string recipientId, Func> send)
+ {
+ var previous = Sending.Value;
+ Sending.Value = Current.Value == null ? null : new ChannelContext(Guid.NewGuid().ToString("D"), recipientId);
+ Observe(DispatchTraceStage.Attempted, channel, recipientId: recipientId);
+ try
+ {
+ var result = await send();
+ // The existing service's boolean is not a provider receipt or proof of delivery.
+ Observe(result ? DispatchTraceStage.ServiceCompleted : DispatchTraceStage.ServiceDeclined, channel, recipientId: recipientId);
+ return result;
+ }
+ catch { Observe(DispatchTraceStage.Failed, channel, DispatchTraceReason.SendException, recipientId); throw; }
+ finally { Sending.Value = previous; }
+ }
+ /// Creation response only, never a delivery receipt. Called at the actual provider boundary.
+ public static void ProviderResult(DispatchTraceProvider provider, DispatchTraceChannel transport, string messageId, bool? accepted)
+ {
+ var sending = Sending.Value;
+ if (Current.Value == null || sending == null || provider == DispatchTraceProvider.None || !Enum.IsDefined(provider)) return;
+ if (!IsProviderMessageId(provider, messageId)) { messageId = null; if (accepted == true) accepted = null; }
+ Observe(accepted == true ? DispatchTraceStage.ProviderAccepted : accepted == false ? DispatchTraceStage.ProviderDeclined : DispatchTraceStage.ProviderResultUnknown,
+ transport, recipientId: sending.RecipientId, provider: provider, providerMessageId: messageId);
+ }
+ public static bool IsProviderMessageId(DispatchTraceProvider provider, string id)
+ {
+ if (string.IsNullOrWhiteSpace(id) || id.Length > 64) return false;
+ if (provider is DispatchTraceProvider.Postmark or DispatchTraceProvider.SignalWire && Guid.TryParseExact(id, "D", out var guid) && guid != Guid.Empty) return true;
+ if (provider is DispatchTraceProvider.Twilio or DispatchTraceProvider.SignalWire && id.Length == 34 && (id.StartsWith("SM", StringComparison.Ordinal) || id.StartsWith("MM", StringComparison.Ordinal) || id.StartsWith("CA", StringComparison.Ordinal)))
+ {
+ for (var i = 2; i < id.Length; i++) if (!Uri.IsHexDigit(id[i])) return false;
+ return true;
+ }
+ return false;
+ }
+ private sealed class Scope(Action dispose) : IDisposable { public void Dispose() => dispose(); }
+ }
+ [Table("AdminAssistDispatchTraces")]
+ public sealed class AdminAssistDispatchTraceRow : IEntity
+ {
+ [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public string AdminAssistDispatchTraceId { get; set; }
+ public int DepartmentId { get; set; }
+ public int CallId { get; set; }
+ public string AttemptId { get; set; }
+ public string Stage { get; set; }
+ public string ResolverVersion { get; set; }
+ public DateTime OccurredOn { get; set; }
+ public string Content { get; set; }
+ public bool IsProtected { get; set; }
+ public int ProtectedCatalogVersion { get; set; }
+ [NotMapped] public object IdValue { get => AdminAssistDispatchTraceId; set => AdminAssistDispatchTraceId = value?.ToString(); }
+ [NotMapped] public string TableName => "AdminAssistDispatchTraces";
+ [NotMapped] public string IdName => nameof(AdminAssistDispatchTraceId);
+ [NotMapped] public int IdType => 1;
+ [NotMapped] public IEnumerable IgnoredProperties => new[] { nameof(IdValue), nameof(TableName), nameof(IdName), nameof(IdType) };
+ }
+ public interface IAdminAssistTraceWriter
+ {
+ /// Returns null when new trace capture is disabled for this host or department.
+ Task PrepareAsync(DispatchTraceObservation observation, CancellationToken ct);
+ Task PersistPreparedAsync(AdminAssistDispatchTraceRow row, CancellationToken ct);
+ Task PersistAsync(DispatchTraceObservation observation, CancellationToken ct);
+ }
+ public interface IAdminAssistTraceStore
+ {
+ Task TraceDepartmentExistsAsync(int departmentId, CancellationToken ct);
+ Task SaveTraceAsync(AdminAssistDispatchTraceRow row, CancellationToken ct);
+ }
+ public enum DispatchTraceReceiveResult { Empty, Persisted }
+ /// Only prepared envelopes cross the durable queue. The sender never awaits this interface.
+ public interface IAdminAssistTraceQueue
+ {
+ Task EnqueueAsync(AdminAssistDispatchTraceRow row, CancellationToken ct);
+ Task ProcessNextAsync(Func persist, CancellationToken ct);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/ModuleImpact.cs b/Core/Resgrid.Model/AdminAssist/ModuleImpact.cs
new file mode 100644
index 000000000..b9245c801
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/ModuleImpact.cs
@@ -0,0 +1,29 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed record ModuleImpactRequest(string ExpectedRevision, string Module, bool Disabled);
+ public sealed record ModuleImpactCounts(int Members, int? ContentRows);
+ public interface IModuleImpactStore
+ {
+ Task ReadModuleImpactCountsAsync(int departmentId, string module, int bound, CancellationToken cancellationToken);
+ }
+ public interface IModuleImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, ModuleImpactRequest request, CancellationToken cancellationToken = default);
+ }
+ /// Legacy menu switches without an additional per-member claim gate in _Navigation or its mailbox entry.
+ public static class ModuleImpactSelection
+ {
+ public static IReadOnlyList Supported { get; } = Array.AsReadOnly(new[] {
+ "Messaging", "Mapping", "Shifts", "Logs", "Reports", "Documents", "Calendar", "Notes", "Training", "Inventory" });
+ public static bool Disabled(DepartmentModuleSettings value, string module) => module switch {
+ "Messaging" => value.MessagingDisabled, "Mapping" => value.MappingDisabled, "Shifts" => value.ShiftsDisabled,
+ "Logs" => value.LogsDisabled, "Reports" => value.ReportsDisabled, "Documents" => value.DocumentsDisabled,
+ "Calendar" => value.CalendarDisabled, "Notes" => value.NotesDisabled, "Training" => value.TrainingDisabled,
+ "Inventory" => value.InventoryDisabled, _ => throw new ArgumentException("Unsupported module preview.") };
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/NotificationImpact.cs b/Core/Resgrid.Model/AdminAssist/NotificationImpact.cs
new file mode 100644
index 000000000..2f40f7898
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/NotificationImpact.cs
@@ -0,0 +1,32 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// Declared future scenario, never a claimed count of historical notification events.
+ public sealed record NotificationImpactRequest(string ExpectedRevision, bool SuppressStaffing, int WindowDays, int EventsPerMember);
+ /// Internal metadata projection; no contact addresses, tokens, names or staffing notes.
+ public sealed class NotificationMemberEvidence
+ {
+ public int DepartmentId { get; set; }
+ public int MemberId { get; set; }
+ public string UserId { get; set; }
+ public int? ProfileId { get; set; }
+ public bool? Sms { get; set; }
+ public bool? MobileVerified { get; set; }
+ public bool? Email { get; set; }
+ public bool? EmailVerified { get; set; }
+ public bool? Push { get; set; }
+ public bool StaffingKnown { get; set; }
+ public int? Staffing { get; set; }
+ }
+ public interface INotificationImpactStore
+ {
+ Task> ReadNotificationMembersAsync(int departmentId, int bound, CancellationToken cancellationToken);
+ }
+ public interface INotificationImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, NotificationImpactRequest request, CancellationToken cancellationToken = default);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/PermissionImpact.cs b/Core/Resgrid.Model/AdminAssist/PermissionImpact.cs
new file mode 100644
index 000000000..8d0023051
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/PermissionImpact.cs
@@ -0,0 +1,15 @@
+using System.Threading;
+using System.Threading.Tasks;
+using System.Collections.Generic;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed record PermissionImpactRequest(string ExpectedRevision, string PermissionType, int Action,
+ bool LockToGroup, int[] RoleIds);
+ public sealed record PermissionRoleOption(int Id, string Name);
+ public interface IPermissionImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, PermissionImpactRequest request, CancellationToken cancellationToken = default);
+ Task> GetRoleOptionsAsync(AdminAssistActor actor, string expectedRevision, CancellationToken cancellationToken = default);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/RetentionImpact.cs b/Core/Resgrid.Model/AdminAssist/RetentionImpact.cs
new file mode 100644
index 000000000..23af5e0bc
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/RetentionImpact.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed record RetentionImpactRequest(string ExpectedRevision, int? ProposedDefaultYears);
+ /// Internal metadata projection. Record identifiers never leave the impact service.
+ public sealed record RetentionImpactHeader
+ {
+ public string RecordId { get; set; }
+ public int Kind { get; set; }
+ public string DefinitionKey { get; set; }
+ public int State { get; set; }
+ public DateTime? FinalizedOn { get; set; }
+ public DateTime ModifiedOn { get; set; }
+ public string AmendsRevisionId { get; set; }
+ public long RowVersion { get; set; }
+ public int HoldOrPermanentContent { get; set; }
+ public int HistoricalHoldUncertainty { get; set; }
+ }
+ public interface IRetentionImpactStore
+ {
+ Task> ReadRetentionHeadersAsync(int departmentId, int bound, CancellationToken ct);
+ }
+ public interface IRetentionImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, RetentionImpactRequest request, CancellationToken ct = default);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/SecurityImpact.cs b/Core/Resgrid.Model/AdminAssist/SecurityImpact.cs
new file mode 100644
index 000000000..c86c1f668
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/SecurityImpact.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed class SecurityMemberEvidence
+ {
+ public int DepartmentId { get; set; }
+ public int MemberId { get; set; }
+ public string UserId { get; set; }
+ public bool? TwoFactorEnabled { get; set; }
+ public DateTime? PasswordLastSetOn { get; set; }
+ }
+ public sealed class SecuritySessionEvidence
+ {
+ public int DepartmentId { get; set; }
+ public string Id { get; set; }
+ public string UserId { get; set; }
+ public DateTime CreatedOn { get; set; }
+ public DateTime LastActiveOn { get; set; }
+ public DateTime ExpiresOn { get; set; }
+ public long AuthenticationGeneration { get; set; }
+ public long? CurrentGeneration { get; set; }
+ }
+ public sealed record SecurityImpactEvidence(IReadOnlyList Members, IReadOnlyList Sessions, int EnabledSsoProviders);
+ public interface ISecurityImpactStore
+ {
+ Task ReadSecurityPolicyAsync(int departmentId, CancellationToken cancellationToken);
+ Task ReadSecurityImpactAsync(int departmentId, DateTime nowUtc, int bound, CancellationToken cancellationToken);
+ }
+ public interface ISecurityImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, ConfigurationImpactRequest request, CancellationToken cancellationToken = default);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/SetupWorkspaceMetadata.cs b/Core/Resgrid.Model/AdminAssist/SetupWorkspaceMetadata.cs
new file mode 100644
index 000000000..3c16cf1de
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/SetupWorkspaceMetadata.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+
+namespace Resgrid.Model.AdminAssist
+{
+ /// Versioned metadata in the existing workspace JSON column; no free text, content or credentials.
+ public sealed class SetupWorkspaceMetadata
+ {
+ public int SchemaVersion { get; set; } = 2;
+ public long ScopeRevision { get; set; }
+ public Dictionary Areas { get; set; } = new() { ["home"] = SetupAreaChoice.UseNow, ["security"] = SetupAreaChoice.UseNow };
+ public Dictionary AreaReasons { get; set; } = new();
+ public SetupReviewEvidence ReviewEvidence { get; set; }
+ public DateTime? RevisitOnUtc { get; set; }
+ public static SetupWorkspaceMetadata Read(string json)
+ {
+ if (json == null) return new();
+ if (json.Length > 32768) throw new InvalidOperationException("Workspace metadata exceeds its bound.");
+ var document = JObject.Parse(json);
+ SetupWorkspaceMetadata state;
+ if (document.TryGetValue(nameof(SchemaVersion), StringComparison.OrdinalIgnoreCase, out var version))
+ {
+ if (version.Type != JTokenType.Integer || version.Value() != 2) throw new InvalidOperationException("Unsupported workspace metadata version.");
+ state = document.ToObject();
+ }
+ else state = new SetupWorkspaceMetadata { Areas = document.ToObject>() };
+ if (state?.Areas == null || state.ScopeRevision < 0 || state.AreaReasons == null || state.Areas.Count > 100 || state.AreaReasons.Count > 100 ||
+ state.Areas.Any(a => string.IsNullOrWhiteSpace(a.Key) || a.Key.Length > 128 || !Enum.IsDefined(a.Value)) ||
+ state.AreaReasons.Any(a => !state.Areas.TryGetValue(a.Key, out var choice) || choice != SetupAreaChoice.NotApplicable || !Enum.IsDefined(a.Value)))
+ throw new InvalidOperationException("Invalid workspace metadata.");
+ return state;
+ }
+ public string Serialize() => JsonConvert.SerializeObject(this);
+ }
+}
diff --git a/Core/Resgrid.Model/AdminAssist/TextImportImpact.cs b/Core/Resgrid.Model/AdminAssist/TextImportImpact.cs
new file mode 100644
index 000000000..b48556f1e
--- /dev/null
+++ b/Core/Resgrid.Model/AdminAssist/TextImportImpact.cs
@@ -0,0 +1,13 @@
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.AdminAssist
+{
+ public sealed record TextImportImpactRequest(string ExpectedRevision, string ProviderPath, string SourceNumber,
+ bool CallsEnabled, bool CommandsEnabled);
+ public sealed record TextImportImpactReport(string MaskedSource, string ProviderPath, ConfigurationImpactReport Impact);
+ public interface ITextImportImpactService
+ {
+ Task PreviewAsync(AdminAssistActor actor, TextImportImpactRequest request, CancellationToken ct = default);
+ }
+}
diff --git a/Core/Resgrid.Model/AdpAuditEvent.cs b/Core/Resgrid.Model/AdpAuditEvent.cs
new file mode 100644
index 000000000..bec36b19f
--- /dev/null
+++ b/Core/Resgrid.Model/AdpAuditEvent.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Security.Cryptography;
+using System.Text;
+using Newtonsoft.Json;
+
+namespace Resgrid.Model
+{
+ /// Value-free ADP evidence. Never put PINs, tokens, reasons or protected content in these fields.
+ public sealed class AdpAuditEvent
+ {
+ public string EventId { get; set; } = Guid.NewGuid().ToString("N");
+ public int DepartmentId { get; set; }
+ public long Sequence { get; set; }
+ public string Layer { get; set; }
+ public string Operation { get; set; }
+ public string Outcome { get; set; }
+ public string ActorId { get; set; }
+ public string CorrelationId { get; set; }
+ public string ResourceId { get; set; }
+ public long PolicyEpoch { get; set; }
+ public DateTime OccurredUtc { get; set; } = DateTime.UtcNow;
+ public string PreviousHash { get; set; }
+ public string Hash { get; set; }
+ }
+
+ public static class AdpAuditChain
+ {
+ public const string Genesis = "0000000000000000000000000000000000000000000000000000000000000000";
+
+ public static string ComputeHash(AdpAuditEvent row)
+ {
+ // Explicit, versioned ordering and millisecond precision survive both database engines.
+ var canonical = JsonConvert.SerializeObject(new object[] { 1, row.PreviousHash, row.EventId,
+ row.DepartmentId, row.Sequence, row.Layer, row.Operation, row.Outcome, row.ActorId,
+ row.CorrelationId, row.ResourceId, row.PolicyEpoch,
+ row.OccurredUtc.ToString("yyyy-MM-dd'T'HH:mm:ss.fff", CultureInfo.InvariantCulture) });
+ return Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(canonical))).ToLowerInvariant();
+ }
+
+ public static void Link(AdpAuditEvent row, AdpAuditEvent tail)
+ {
+ row.OccurredUtc = new DateTime(row.OccurredUtc.Ticks - row.OccurredUtc.Ticks % TimeSpan.TicksPerMillisecond);
+ row.Sequence = (tail?.Sequence ?? 0) + 1;
+ row.PreviousHash = tail?.Hash ?? Genesis;
+ row.Hash = ComputeHash(row);
+ }
+
+ /// Verify in stored sequence order; an external tail checkpoint also detects suffix removal.
+ public static bool Verify(IEnumerable rows, long expectedCount, string expectedTailHash)
+ {
+ long sequence = 0;
+ int? department = null;
+ var previous = Genesis;
+ foreach (var row in rows)
+ {
+ department ??= row.DepartmentId;
+ if (row.DepartmentId != department || row.Sequence != ++sequence || row.PreviousHash != previous ||
+ row.Hash != ComputeHash(row)) return false;
+ previous = row.Hash;
+ }
+ return sequence == expectedCount && previous == expectedTailHash;
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/AdpPermissionDefaults.cs b/Core/Resgrid.Model/AdpPermissionDefaults.cs
index 350de54ca..711be6fe2 100644
--- a/Core/Resgrid.Model/AdpPermissionDefaults.cs
+++ b/Core/Resgrid.Model/AdpPermissionDefaults.cs
@@ -21,9 +21,9 @@ namespace Resgrid.Model
/// - Protected OPERATIONAL data (logs, forms, IC content) defaults to department and group
/// admins — command staff read it, the general roster does not, and departments widen it
/// per role as needed.
- /// - Export, egress configuration, break-glass, and ADP settings management default to
- /// department admins. Break-glass additionally requires the department's policy to enable
- /// it at all (plan section 12) — the permission alone is never sufficient.
+ /// - Export, egress configuration, and ADP settings management default to department admins.
+ /// The legacy break-glass value is retained for stored-row compatibility only. Staff support
+ /// access is authorized by BackOffice MFA, independent approval and customer consent.
///
public static class AdpPermissionDefaults
{
diff --git a/Core/Resgrid.Model/AdpSupportConsent.cs b/Core/Resgrid.Model/AdpSupportConsent.cs
new file mode 100644
index 000000000..87fccc329
--- /dev/null
+++ b/Core/Resgrid.Model/AdpSupportConsent.cs
@@ -0,0 +1,13 @@
+using System;
+
+namespace Resgrid.Model
+{
+ /// Department opt-in; every change advances the store version and revokes existing support sessions.
+ public sealed class AdpSupportConsent
+ {
+ public bool Enabled { get; set; }
+ public string UserId { get; set; }
+ public DateTime UpdatedUtc { get; set; }
+ public static string Key(int departmentId) => "support-consent:" + departmentId;
+ }
+}
diff --git a/Core/Resgrid.Model/AuditLogTypes.cs b/Core/Resgrid.Model/AuditLogTypes.cs
index d381ba4ab..0360278ee 100644
--- a/Core/Resgrid.Model/AuditLogTypes.cs
+++ b/Core/Resgrid.Model/AuditLogTypes.cs
@@ -343,6 +343,8 @@ public enum AuditLogTypes
FieldCostRunFrozen,
// Member removal lifecycle (2026-09-22): a removed membership brought back; it returns without its old admin standing. Append-only.
- UserReactivated
+ UserReactivated,
+ DepartmentConfigurationChanged,
+ AdminAssistReviewChanged
}
}
diff --git a/Core/Resgrid.Model/Checklists/ChecklistWorkflowPayload.cs b/Core/Resgrid.Model/Checklists/ChecklistWorkflowPayload.cs
index 46abfbc96..cf6beb4f6 100644
--- a/Core/Resgrid.Model/Checklists/ChecklistWorkflowPayload.cs
+++ b/Core/Resgrid.Model/Checklists/ChecklistWorkflowPayload.cs
@@ -16,7 +16,7 @@ public static class ChecklistWorkflowPayload
(int)WorkflowTriggerEventType.ChecklistMissed, (int)WorkflowTriggerEventType.WorkOrderCreated,
(int)WorkflowTriggerEventType.WorkOrderStatusChanged, (int)WorkflowTriggerEventType.WorkOrderAssigned,
(int)WorkflowTriggerEventType.ChecklistScheduleChanged, (int)WorkflowTriggerEventType.ChecklistOccurrenceSkipped
- }.Concat(Resgrid.Model.WorkOrders.WorkOrderWorkflowPayload.Triggers).Distinct().Concat(Resgrid.Model.Inventories.InventoryWorkflowPayload.Triggers).ToArray());
+ }.Concat(Resgrid.Model.WorkOrders.WorkOrderWorkflowPayload.Triggers).Distinct().Concat(Resgrid.Model.Inventories.InventoryWorkflowPayload.Triggers).Concat(AdminAssist.AdminAssistWorkflowPayload.Triggers).ToArray());
private static readonly string[] Identifiers = { "CompletionId", "DefinitionId", "VersionId", "ItemId", "ScheduleId", "OccurrenceId" };
private static bool IsStructuralTarget(int type, string target) =>
type >= 0 && type <= 2 && int.TryParse(target, out var numeric) && numeric > 0
@@ -31,6 +31,7 @@ private static void Timing(JObject source, JObject target)
public static string Routing(string payloadJson, string aggregateId)
{
var source = Resgrid.Model.Inventories.InventoryWorkflowPayload.Parse(payloadJson);
+ if (source["FindingId"] != null) return AdminAssist.AdminAssistWorkflowPayload.Routing(source);
if (Resgrid.Model.Inventories.InventoryWorkflowPayload.IsInventory(source)) return Resgrid.Model.Inventories.InventoryWorkflowPayload.Routing(source);
if (source["WorkOrderId"] != null || source["RecurrenceId"] != null) return Resgrid.Model.WorkOrders.WorkOrderWorkflowPayload.Routing(source);
var safe = new JObject();
@@ -49,13 +50,14 @@ public static string Routing(string payloadJson, string aggregateId)
return safe.ToString(Newtonsoft.Json.Formatting.None);
}
public static bool IsChecklist(int trigger) => Triggers.Contains(trigger);
- public static readonly IReadOnlyList ReadinessProducers = Array.AsReadOnly(new[] { "Checklists", "WorkOrders", "Inventory" });
+ public static readonly IReadOnlyList ReadinessProducers = Array.AsReadOnly(new[] { "Checklists", "WorkOrders", "Inventory", "AdminAssist" });
public static bool IsReadinessProducer(string producer) => ReadinessProducers.Contains(producer);
public static async Task ProjectAsync(int departmentId, object value, IProtectedProjectionService protection, bool wrapped = false)
{
if (protection == null) throw new InvalidOperationException("Checklist workflow protection is unavailable.");
var source = value as JObject ?? (value == null ? new JObject() : JObject.FromObject(value));
var payload = wrapped ? source["Payload"] as JObject ?? new JObject() : source;
+ if (payload["FindingId"] != null) return await AdminAssist.AdminAssistWorkflowPayload.ProjectAsync(departmentId, payload, protection, wrapped);
if (Resgrid.Model.Inventories.InventoryWorkflowPayload.IsInventory(payload)) return await Resgrid.Model.Inventories.InventoryWorkflowPayload.ProjectAsync(departmentId, source, protection, wrapped);
if (payload["WorkOrderId"] != null || payload["RecurrenceId"] != null) return await Resgrid.Model.WorkOrders.WorkOrderWorkflowPayload.ProjectAsync(departmentId, payload, protection, wrapped);
var safe = new JObject();
diff --git a/Core/Resgrid.Model/DepartmentSecurityPolicyDecisions.cs b/Core/Resgrid.Model/DepartmentSecurityPolicyDecisions.cs
new file mode 100644
index 000000000..887cd271a
--- /dev/null
+++ b/Core/Resgrid.Model/DepartmentSecurityPolicyDecisions.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Globalization;
+
+namespace Resgrid.Model
+{
+ /// Pure decisions shared by the owning sign-in/session consumers and administrative previews.
+ public static class DepartmentSecurityPolicyDecisions
+ {
+ public static bool BlocksPasswordLogin(bool requireSso, bool enabledProvider, bool loginViaSso) => requireSso && enabledProvider && !loginViaSso;
+ public static bool RequiresMfaCompletion(bool requireMfa, bool completed) => requireMfa && !completed;
+ public static int MinimumPasswordLength(int configured) => Math.Max(8, configured);
+ public static bool PasswordExpired(int days, DateTime? lastSetOn, DateTime nowUtc) =>
+ days > 0 && lastSetOn.HasValue && nowUtc > lastSetOn.Value.AddDays(days);
+ public static bool TryGetSessionGate(string configured, out DateTime gateUtc)
+ {
+ if (DateTimeOffset.TryParse(configured, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var parsed))
+ {
+ gateUtc = parsed.UtcDateTime; return true;
+ }
+ gateUtc = default; return false;
+ }
+ public static bool IdleExpired(int minutes, DateTime lastActiveOn, DateTime nowUtc) => minutes > 0 && lastActiveOn <= nowUtc.AddMinutes(-minutes);
+ }
+}
diff --git a/Core/Resgrid.Model/DepartmentSettingTypes.cs b/Core/Resgrid.Model/DepartmentSettingTypes.cs
index ced29eb73..f92715556 100644
--- a/Core/Resgrid.Model/DepartmentSettingTypes.cs
+++ b/Core/Resgrid.Model/DepartmentSettingTypes.cs
@@ -114,5 +114,8 @@ public enum DepartmentSettingTypes
/// user's group subtree, and which personnel roles stay department-wide while it is on.
///
GroupDispatchScopeConfig = 78,
+
+ /// Declared, reviewed administrative operating profile; registry section 4G.
+ DepartmentOperatingProfile = 110,
}
}
diff --git a/Core/Resgrid.Model/FeatureFlagKeys.cs b/Core/Resgrid.Model/FeatureFlagKeys.cs
index 7e06015bd..b33f2d259 100644
--- a/Core/Resgrid.Model/FeatureFlagKeys.cs
+++ b/Core/Resgrid.Model/FeatureFlagKeys.cs
@@ -7,6 +7,9 @@ namespace Resgrid.Model
///
public static class FeatureFlagKeys
{
+ public const string AdminSetup = "Admin.Setup";
+ public const string AdminAssist = "Admin.Assist";
+ public const string AiAdminAssist = "Ai.AdminAssist";
/// Free checklists rollout gate. Independent of paid plans and Maintenance.WorkOrders. Seeded off by M0189.
public const string ChecklistsSystem = "Checklists.System";
diff --git a/Core/Resgrid.Model/MappingMarkerSource.cs b/Core/Resgrid.Model/MappingMarkerSource.cs
new file mode 100644
index 000000000..3f69736f8
--- /dev/null
+++ b/Core/Resgrid.Model/MappingMarkerSource.cs
@@ -0,0 +1,27 @@
+using System;
+
+namespace Resgrid.Model
+{
+ public enum MappingMarkerSource { None, LocationPing, Status }
+
+ /// Shared v4 map marker selection. TTL expires pings; a status location remains a fallback.
+ public static class MappingMarkerSelection
+ {
+ public static MappingMarkerSource Select(DateTime? pingOn, DateTime? statusOn, bool statusHasLocation,
+ int pingTtlMinutes, bool allowStatusWithoutLocationToOverwrite, DateTime nowUtc)
+ => Select(pingOn, statusOn, () => statusHasLocation, pingTtlMinutes, allowStatusWithoutLocationToOverwrite, nowUtc);
+
+ public static MappingMarkerSource Select(DateTime? pingOn, DateTime? statusOn, Func statusHasLocation,
+ int pingTtlMinutes, bool allowStatusWithoutLocationToOverwrite, DateTime nowUtc)
+ {
+ if (pingOn.HasValue && pingTtlMinutes > 0 && nowUtc.AddMinutes(-pingTtlMinutes) > pingOn.Value) pingOn = null;
+ if (pingOn.HasValue)
+ {
+ if (!statusOn.HasValue || pingOn.Value > statusOn.Value) return MappingMarkerSource.LocationPing;
+ if (statusHasLocation()) return MappingMarkerSource.Status;
+ return allowStatusWithoutLocationToOverwrite ? MappingMarkerSource.None : MappingMarkerSource.LocationPing;
+ }
+ return statusOn.HasValue && statusHasLocation() ? MappingMarkerSource.Status : MappingMarkerSource.None;
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/NotificationChannelSelection.cs b/Core/Resgrid.Model/NotificationChannelSelection.cs
new file mode 100644
index 000000000..09f2fdf49
--- /dev/null
+++ b/Core/Resgrid.Model/NotificationChannelSelection.cs
@@ -0,0 +1,13 @@
+namespace Resgrid.Model
+{
+ /// Preference/contact gates used by the ordinary notification sender, before provider/device checks.
+ public sealed record NotificationChannelSelection(bool Sms, bool Email, bool Push)
+ {
+ public static NotificationChannelSelection From(UserProfile profile) => profile == null
+ ? new(true, true, true)
+ : From(profile.SendNotificationSms, profile.MobileNumberVerified, profile.SendNotificationEmail,
+ profile.EmailVerified, profile.SendNotificationPush);
+ public static NotificationChannelSelection From(bool sms, bool? mobileVerified, bool email, bool? emailVerified, bool push) =>
+ new(sms && mobileVerified.IsContactMethodAllowedForSending(), email && emailVerified.IsContactMethodAllowedForSending(), push);
+ }
+}
diff --git a/Core/Resgrid.Model/PermissionTypes.cs b/Core/Resgrid.Model/PermissionTypes.cs
index b97d79581..36a784748 100644
--- a/Core/Resgrid.Model/PermissionTypes.cs
+++ b/Core/Resgrid.Model/PermissionTypes.cs
@@ -77,8 +77,8 @@ public enum PermissionTypes
ConfigureProtectedDataEgress = 38,
///
- /// Emergency break-glass access to protected data. Off by default; every use requires a reason,
- /// produces notifications, and is subject to review (ADP plan section 12).
+ /// Legacy stored permission identifier. Does not authorize staff support access; that flow
+ /// is managed by BackOffice with customer consent, fresh MFA and independent approval.
///
BreakGlassProtectedData = 39,
diff --git a/Core/Resgrid.Model/ProtectedWorkflows/ProtectedPayloadValidator.cs b/Core/Resgrid.Model/ProtectedWorkflows/ProtectedPayloadValidator.cs
index 5741e03c5..425591ce6 100644
--- a/Core/Resgrid.Model/ProtectedWorkflows/ProtectedPayloadValidator.cs
+++ b/Core/Resgrid.Model/ProtectedWorkflows/ProtectedPayloadValidator.cs
@@ -100,14 +100,22 @@ private static ProtectedPayloadCheck ValidateJson(string body, bool requireResou
JToken token;
try
{
- using var reader = new JsonTextReader(new StringReader(body)) { DateParseHandling = DateParseHandling.None, FloatParseHandling = FloatParseHandling.Decimal };
- token = JToken.ReadFrom(reader);
- // Anything after the first value (a second object, stray text) is malformed.
- while (reader.Read())
+ // Comments are not JSON, and the body leaves exactly as rendered. Json.NET would skip them wherever they
+ // sit (inside the value as well as after it), so look at every token before parsing.
+ using (var scan = NewJsonReader(body))
{
- if (reader.TokenType != JsonToken.Comment)
- return ProtectedPayloadCheck.Invalid(RuleJsonParse, reader.LineNumber, reader.LinePosition);
+ while (scan.Read())
+ {
+ if (scan.TokenType == JsonToken.Comment)
+ return ProtectedPayloadCheck.Invalid(RuleJsonParse, scan.LineNumber, scan.LinePosition);
+ }
}
+
+ using var reader = NewJsonReader(body);
+ token = JToken.ReadFrom(reader);
+ // Anything after the first value (a second object, stray text) is malformed.
+ if (reader.Read())
+ return ProtectedPayloadCheck.Invalid(RuleJsonParse, reader.LineNumber, reader.LinePosition);
}
catch (JsonReaderException ex)
{
@@ -128,6 +136,9 @@ private static ProtectedPayloadCheck ValidateJson(string body, bool requireResou
return ProtectedPayloadCheck.Valid;
}
+ private static JsonTextReader NewJsonReader(string body) =>
+ new JsonTextReader(new StringReader(body)) { DateParseHandling = DateParseHandling.None, FloatParseHandling = FloatParseHandling.Decimal };
+
private static ProtectedPayloadCheck ValidateXml(string body)
{
var settings = new XmlReaderSettings
diff --git a/Core/Resgrid.Model/ProtectedWorkflows/ProtectedStepOptions.cs b/Core/Resgrid.Model/ProtectedWorkflows/ProtectedStepOptions.cs
index 91049fbc7..7c405a447 100644
--- a/Core/Resgrid.Model/ProtectedWorkflows/ProtectedStepOptions.cs
+++ b/Core/Resgrid.Model/ProtectedWorkflows/ProtectedStepOptions.cs
@@ -86,7 +86,8 @@ public sealed class ProtectedStepOptions
public static readonly Regex SubjectKeyPattern = new Regex("^[a-z0-9_]{1,64}$", RegexOptions.Compiled | RegexOptions.CultureInvariant);
private static readonly Regex HeaderToken = new Regex("^[A-Za-z0-9!#$%&'*+.^_`|~-]{1,64}$", RegexOptions.Compiled | RegexOptions.CultureInvariant);
- private static readonly Regex Hl7FieldReference = new Regex(@"^[A-Z0-9]{3}-\d{1,3}(\.\d{1,3}){0,2}$", RegexOptions.Compiled | RegexOptions.CultureInvariant);
+ // [0-9], not \d: \d also matches non-ASCII digits, which the response rules' int.Parse would throw on after the send.
+ private static readonly Regex Hl7FieldReference = new Regex(@"^[A-Z0-9]{3}-[0-9]{1,3}(\.[0-9]{1,3}){0,2}$", RegexOptions.Compiled | RegexOptions.CultureInvariant);
/// The declared content type exactly as configured (null when absent).
public string ContentType { get; set; }
diff --git a/Core/Resgrid.Model/Records/RecordsRetentionWindow.cs b/Core/Resgrid.Model/Records/RecordsRetentionWindow.cs
new file mode 100644
index 000000000..bca45d2b5
--- /dev/null
+++ b/Core/Resgrid.Model/Records/RecordsRetentionWindow.cs
@@ -0,0 +1,11 @@
+using System;
+
+namespace Resgrid.Model
+{
+ /// Shared calendar-year boundary. Zero, unknown or unrepresentable dates never expire.
+ public static class RecordsRetentionWindow
+ {
+ public static bool HasExpired(DateTime? finalized, int years, DateTime now) =>
+ finalized.HasValue && years > 0 && years <= 9999 - finalized.Value.Year && finalized.Value.AddYears(years) <= now;
+ }
+}
diff --git a/Core/Resgrid.Model/Repositories/IActionLogsRepository.cs b/Core/Resgrid.Model/Repositories/IActionLogsRepository.cs
index d545c1bc5..2329d5814 100644
--- a/Core/Resgrid.Model/Repositories/IActionLogsRepository.cs
+++ b/Core/Resgrid.Model/Repositories/IActionLogsRepository.cs
@@ -11,6 +11,8 @@ namespace Resgrid.Model.Repositories
///
public interface IActionLogsRepository: IRepository
{
+ /// Bounded latest status metadata for administrative previews; no ETA/provider enrichment. Throws on truncation.
+ Task> ReadLatestForAdministrationAsync(int departmentId, bool disableAutoAvailable, DateTime asOfUtc, int maximumRows, System.Threading.CancellationToken cancellationToken);
///
/// Gets the last action logs for department asynchronous.
///
diff --git a/Core/Resgrid.Model/Repositories/IAdpAccessStore.cs b/Core/Resgrid.Model/Repositories/IAdpAccessStore.cs
new file mode 100644
index 000000000..ef8cbf08e
--- /dev/null
+++ b/Core/Resgrid.Model/Repositories/IAdpAccessStore.cs
@@ -0,0 +1,19 @@
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.Repositories
+{
+ /// Durable compare-and-swap state. No plaintext PIN, grant token or customer content is stored.
+ public interface IAdpAccessStore
+ {
+ Task GetAsync(string id, CancellationToken cancellationToken = default);
+ Task SaveAsync(string id, string json, long expectedVersion, CancellationToken cancellationToken = default);
+ }
+
+ public sealed class AdpAccessState
+ {
+ public string StateId { get; set; }
+ public string Json { get; set; }
+ public long Version { get; set; }
+ }
+}
diff --git a/Core/Resgrid.Model/Repositories/IAdpAuditRepository.cs b/Core/Resgrid.Model/Repositories/IAdpAuditRepository.cs
new file mode 100644
index 000000000..bbba3d5bc
--- /dev/null
+++ b/Core/Resgrid.Model/Repositories/IAdpAuditRepository.cs
@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Resgrid.Model.Repositories
+{
+ public interface IAdpAuditRepository
+ {
+ Task AppendAsync(AdpAuditEvent record, CancellationToken cancellationToken = default);
+ Task> ReadAsync(int departmentId, CancellationToken cancellationToken = default);
+ }
+}
diff --git a/Core/Resgrid.Model/ResourceVisibilityPermission.cs b/Core/Resgrid.Model/ResourceVisibilityPermission.cs
new file mode 100644
index 000000000..516adec4a
--- /dev/null
+++ b/Core/Resgrid.Model/ResourceVisibilityPermission.cs
@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Resgrid.Model
+{
+ /// Shared resource visibility decision used by authorization and request-local administrative previews.
+ public static class ResourceVisibilityPermission
+ {
+ public static bool Allows(Permission permission, bool departmentAdmin, bool groupAdmin, int? actorGroup,
+ int? targetGroup, IEnumerable roleIds, bool adminOfTargetOrAncestor)
+ {
+ if (permission == null) return true;
+ var sameGroup = actorGroup.HasValue && targetGroup.HasValue && actorGroup == targetGroup;
+ switch ((PermissionActions)permission.Action)
+ {
+ case PermissionActions.DepartmentAdminsOnly: return departmentAdmin;
+ case PermissionActions.DepartmentAndGroupAdmins:
+ return departmentAdmin || groupAdmin && (!permission.LockToGroup || adminOfTargetOrAncestor);
+ case PermissionActions.DepartmentAdminsAndSelectRoles:
+ if (departmentAdmin) return true;
+ if (permission.LockToGroup && !sameGroup || string.IsNullOrWhiteSpace(permission.Data)) return false;
+ var selected = permission.Data.Split(',').Select(int.Parse).ToHashSet();
+ return roleIds.Any(selected.Contains);
+ case PermissionActions.Everyone: return !permission.LockToGroup || departmentAdmin || sameGroup;
+ // These legacy resource gates do not implement the RMS action 4; preserve their deny behavior.
+ default: return false;
+ }
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/Services/IAdpReleaseService.cs b/Core/Resgrid.Model/Services/IAdpReleaseService.cs
new file mode 100644
index 000000000..8606c6b55
--- /dev/null
+++ b/Core/Resgrid.Model/Services/IAdpReleaseService.cs
@@ -0,0 +1,23 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Resgrid.Model.Providers;
+
+namespace Resgrid.Model.Services
+{
+ public interface IAdpReleaseService
+ {
+ Task EnrollPinAsync(int departmentId, string userId, string grantToken, string pin, CancellationToken cancellationToken = default);
+ Task CreateChallengeAsync(int departmentId, int callId, string userId, string phone, ProtectedDataEgressChannel channel, CancellationToken cancellationToken = default);
+ Task ReleaseAsync(string challengeId, string phone, string pin, ProtectedDataEgressChannel channel, CancellationToken cancellationToken = default);
+ }
+
+ /// One-use, exact-field capabilities checked at the broker in addition to workload authentication.
+ public interface IAdpReleaseReceiptService
+ {
+ Task IssueAsync(int departmentId, long epoch, string actorId, string purpose,
+ IReadOnlyList fields, CancellationToken cancellationToken = default);
+ Task ConsumeAsync(string token, int departmentId, long epoch,
+ IReadOnlyList fields, CancellationToken cancellationToken = default);
+ }
+}
diff --git a/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs b/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs
index 3e7c7471d..c38beef6e 100644
--- a/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs
+++ b/Core/Resgrid.Model/Services/IDepartmentSettingsService.cs
@@ -8,6 +8,8 @@ namespace Resgrid.Model.Services
{
public interface IDepartmentSettingsService
{
+ Task GetOperatingProfileAsync(int departmentId);
+ Task SetOperatingProfileAsync(int departmentId, AdminAssist.DepartmentOperatingProfile profile, string actingUserId, CancellationToken cancellationToken = default);
///
/// Saves the or update setting asynchronous.
///
diff --git a/Core/Resgrid.Model/Services/IProtectedProjectionService.cs b/Core/Resgrid.Model/Services/IProtectedProjectionService.cs
index 77efc07e7..2c1a003b6 100644
--- a/Core/Resgrid.Model/Services/IProtectedProjectionService.cs
+++ b/Core/Resgrid.Model/Services/IProtectedProjectionService.cs
@@ -26,7 +26,7 @@ public interface IProtectedProjectionService
/// sanitized clone: the system-generated call number and structural/routing fields survive;
/// every cataloged user-authored field is nulled and the nature reads the generic
/// "sign in to Resgrid" line — safe to hand to any template, provider DTO, or TTS builder.
- /// ProtectedAfterPin behaves as GenericOnly until the PIN-release flow ships.
+ /// ProtectedAfterPin remains generic on unattended projections; AdpReleaseService handles verified releases.
///
///
/// The safe view of a member message for one outbound channel (catalog v7). A protected
diff --git a/Core/Resgrid.Model/Services/IShiftsService.cs b/Core/Resgrid.Model/Services/IShiftsService.cs
index 13b163084..07ff78963 100644
--- a/Core/Resgrid.Model/Services/IShiftsService.cs
+++ b/Core/Resgrid.Model/Services/IShiftsService.cs
@@ -15,6 +15,10 @@ public interface IShiftsService
/// Task<List<Shift>>.
Task> GetAllShiftsByDepartmentAsync(int departmentId);
+ /// Fresh administrative schedule evidence. Missing sources throw instead of becoming empty rosters.
+ Task> ReadSchedulesForAdministrationAsync(int departmentId, DateTime localStart, DateTime localEnd,
+ DateTime asOfUtc, int maximumRows, CancellationToken cancellationToken);
+
///
/// Gets the shift by identifier asynchronous.
diff --git a/Core/Resgrid.Model/Services/ISmsService.cs b/Core/Resgrid.Model/Services/ISmsService.cs
index d76fa45ce..d3db13155 100644
--- a/Core/Resgrid.Model/Services/ISmsService.cs
+++ b/Core/Resgrid.Model/Services/ISmsService.cs
@@ -29,6 +29,8 @@ Task SendMessageAsync(Message message, string departmentNumber, int depart
/// The profile.
/// The address.
/// Task<System.Boolean>.
+ Task SendProtectedDispatchChallengeAsync(UserProfile profile, int departmentId, string departmentNumber, string challengeText);
+
Task SendCallAsync(Call call, CallDispatch dispatch, string departmentNumber, int departmentId,
UserProfile profile = null, string address = null, Payment payment = null);
diff --git a/Core/Resgrid.Model/Services/IUnitsService.cs b/Core/Resgrid.Model/Services/IUnitsService.cs
index 618bc0eae..3bc21184d 100644
--- a/Core/Resgrid.Model/Services/IUnitsService.cs
+++ b/Core/Resgrid.Model/Services/IUnitsService.cs
@@ -363,5 +363,7 @@ Task AddUnitLocationAsync(UnitsLocation location, int d
Task> GetUnitStaffingForDepartmentAsync(int departmentId);
Task> GetLatestUnitLocationsAsync(int departmentId);
+ /// Uncached location read that propagates failure instead of returning an empty set.
+ Task> ReadLatestLocationsForAdministrationAsync(int departmentId);
}
}
diff --git a/Core/Resgrid.Model/Services/IUsersService.cs b/Core/Resgrid.Model/Services/IUsersService.cs
index 560aa9949..c4c758800 100644
--- a/Core/Resgrid.Model/Services/IUsersService.cs
+++ b/Core/Resgrid.Model/Services/IUsersService.cs
@@ -27,6 +27,8 @@ public interface IUsersService
Task GetUserByNameAsync(string userName);
Task SavePersonnelLocationAsync(PersonnelLocation personnelLocation, System.Threading.CancellationToken cancellationToken = default);
Task> GetLatestLocationsForDepartmentPersonnelAsync(int departmentId);
+ /// Uncached location read that propagates failure instead of returning an empty set.
+ Task> ReadLatestLocationsForAdministrationAsync(int departmentId);
Task GetPersonnelLocationByIdAsync(string id);
Task ClearOutUserLoginAsync(string userId);
Task> GetUserGroupAndRolesByDepartmentIdInLimitAsync(int deparmentId, bool retrieveHidden, bool retrieveDisabled, bool retrieveDeleted);
diff --git a/Core/Resgrid.Model/ShiftRosterGroups.cs b/Core/Resgrid.Model/ShiftRosterGroups.cs
new file mode 100644
index 000000000..9b724507e
--- /dev/null
+++ b/Core/Resgrid.Model/ShiftRosterGroups.cs
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Resgrid.Model
+{
+ /// Shared projection for the broadcaster and administrative simulation, after trades and approvals resolve.
+ public static class ShiftRosterGroups
+ {
+ public static List Select(int groupId, IEnumerable roster, IEnumerable groupMembers)
+ {
+ if (roster == null || groupMembers == null) throw new ArgumentException("Complete roster and membership evidence is required.");
+ var entries = roster.Where(r => r.IsOnDuty()).ToArray();
+ var people = new HashSet(entries.Where(r => r.DepartmentGroupId == groupId).Select(r => r.UserId), StringComparer.OrdinalIgnoreCase);
+ var members = new HashSet(groupMembers, StringComparer.OrdinalIgnoreCase);
+ foreach (var entry in entries.Where(r => !r.DepartmentGroupId.HasValue && members.Contains(r.UserId))) people.Add(entry.UserId);
+ return people.ToList();
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/TextIntakeRouting.cs b/Core/Resgrid.Model/TextIntakeRouting.cs
new file mode 100644
index 000000000..e75e6cb8f
--- /dev/null
+++ b/Core/Resgrid.Model/TextIntakeRouting.cs
@@ -0,0 +1,23 @@
+using System;
+
+namespace Resgrid.Model
+{
+ public enum TextIntakePath { TwilioLegacy, SignalWire }
+ public sealed record TextIntakeDecision(bool DispatchSource, bool CallBranch, bool CommandBranch);
+
+ /// Routing only, after department resolution and the provider's plan gate. Not sender authentication.
+ public static class TextIntakeRouting
+ {
+ public static TextIntakeDecision Decide(TextIntakePath path, bool patternMatched, bool callsEnabled, bool commandsEnabled)
+ {
+ return path switch
+ {
+ // The legacy Twilio consumer intentionally does not consult these switches.
+ TextIntakePath.TwilioLegacy => new(patternMatched, patternMatched, !patternMatched),
+ TextIntakePath.SignalWire => new(patternMatched || !commandsEnabled,
+ (patternMatched || !commandsEnabled) && callsEnabled, !patternMatched && commandsEnabled),
+ _ => throw new ArgumentOutOfRangeException(nameof(path))
+ };
+ }
+ }
+}
diff --git a/Core/Resgrid.Model/WorkflowTemplateVariableCatalog.cs b/Core/Resgrid.Model/WorkflowTemplateVariableCatalog.cs
index 548831503..c3b300bbe 100644
--- a/Core/Resgrid.Model/WorkflowTemplateVariableCatalog.cs
+++ b/Core/Resgrid.Model/WorkflowTemplateVariableCatalog.cs
@@ -446,6 +446,13 @@ pair.Variable is "status" or "old_status" or "contract_type" or "days_until_end"
: pair.Variable.EndsWith("_on", System.StringComparison.Ordinal) ? "datetime" : "string", false));
list.Add(new TemplateVariableDescriptor("contract.url", "Authenticated contract link", "string", false));
break;
+ case WorkflowTriggerEventType.AdminAssistFindingOpened:
+ case WorkflowTriggerEventType.AdminAssistFindingResolved:
+ case WorkflowTriggerEventType.AdminAssistFindingReopened:
+ foreach (var pair in AdminAssist.AdminAssistWorkflowPayload.Variables)
+ list.Add(new TemplateVariableDescriptor("admin_assist." + pair.Variable, "Admin Assist " + pair.Variable.Replace('_', ' '), pair.Variable is "id" or "rule_id" ? "string" : "int", false));
+ list.Add(new TemplateVariableDescriptor("admin_assist.url", "Authenticated Admin Assist link", "string", false));
+ break;
case WorkflowTriggerEventType.WorkOrderCreated:
case WorkflowTriggerEventType.WorkOrderStatusChanged:
case WorkflowTriggerEventType.WorkOrderAssigned:
diff --git a/Core/Resgrid.Model/WorkflowTriggerEventType.cs b/Core/Resgrid.Model/WorkflowTriggerEventType.cs
index 90a41eed3..4f7cfd59c 100644
--- a/Core/Resgrid.Model/WorkflowTriggerEventType.cs
+++ b/Core/Resgrid.Model/WorkflowTriggerEventType.cs
@@ -245,7 +245,10 @@ public enum WorkflowTriggerEventType
DeploymentAttachmentAdded = 187,
// Inventory held by a removed, disabled or hidden member (registry 188, 2026-09-22): raised with the DepartedHolder alert.
- InventoryDepartedHolder = 188
+ InventoryDepartedHolder = 188,
+ AdminAssistFindingOpened = 189,
+ AdminAssistFindingResolved = 190,
+ AdminAssistFindingReopened = 191
}
public static class WorkflowTriggerEventTypes
diff --git a/Core/Resgrid.Search/AdminAssistReferenceSearch.cs b/Core/Resgrid.Search/AdminAssistReferenceSearch.cs
new file mode 100644
index 000000000..16ed27a61
--- /dev/null
+++ b/Core/Resgrid.Search/AdminAssistReferenceSearch.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Lucene.Net.Analysis.Standard;
+using Lucene.Net.Analysis.TokenAttributes;
+using Lucene.Net.Documents;
+using Lucene.Net.Index;
+using Lucene.Net.Search;
+using Lucene.Net.Search.Similarities;
+using Lucene.Net.Store;
+using Lucene.Net.Util;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.Search
+{
+ /// CPU BM25 over the immutable release-pinned public reference corpus only. Never queries tenant records.
+ public sealed class AdminAssistReferenceSearch : IAdminAssistReferenceSearch, IDisposable
+ {
+ private readonly Lazy _index;
+ public AdminAssistReferenceSearch(IAdminAssistCatalog catalog) => _index = new Lazy(() => new ReferenceIndex(catalog));
+ public IReadOnlyList Search(string query, string locale, int take = 20)
+ {
+ if (string.IsNullOrWhiteSpace(query)) return Array.Empty();
+ if (query.Length > 256) throw new ArgumentException("Reference query too long.");
+ return _index.Value.Search(query, locale, Math.Clamp(take, 1, 25));
+ }
+ public void Dispose() { if (_index.IsValueCreated) _index.Value.Dispose(); }
+ private sealed class ReferenceIndex : IDisposable
+ {
+ private const LuceneVersion Version = LuceneVersion.LUCENE_48;
+ private readonly RAMDirectory _directory = new();
+ private readonly StandardAnalyzer _analyzer = new(Version);
+ private readonly DirectoryReader _reader;
+ private readonly IReadOnlyDictionary _articles;
+ public ReferenceIndex(IAdminAssistCatalog catalog)
+ {
+ _articles = catalog.Articles.ToDictionary(a => a.Locale + ":" + a.Id, StringComparer.Ordinal);
+ using (var writer = new IndexWriter(_directory, new IndexWriterConfig(Version, _analyzer) { Similarity = new BM25Similarity() }))
+ {
+ foreach (var (id, article) in _articles)
+ {
+ if (article.PackVersion != catalog.Version || string.IsNullOrWhiteSpace(article.Anchor) || !article.SourcePath.StartsWith("docs/admin-assist/", StringComparison.Ordinal))
+ throw new InvalidOperationException("Unreviewed reference source.");
+ writer.AddDocument(new Document { new StringField("id", id, Field.Store.YES), new StringField("locale", article.Locale, Field.Store.NO),
+ new TextField("body", article.Body, Field.Store.NO) });
+ }
+ writer.Commit();
+ }
+ _reader = DirectoryReader.Open(_directory);
+ }
+ public IReadOnlyList Search(string query, string locale, int take)
+ {
+ var selectedLocale = (locale ?? "en").Split('-')[0].ToLowerInvariant();
+ if (!_articles.Values.Any(a => a.Locale == selectedLocale)) selectedLocale = "en";
+ // Analyze literal text rather than exposing Lucene query syntax. Escaping punctuation alone
+ // still interprets words such as AND/OR/NOT as operators and can throw on normal questions.
+ var words = new BooleanQuery();
+ using (var tokens = _analyzer.GetTokenStream("body", new StringReader(query)))
+ {
+ var term = tokens.AddAttribute(); tokens.Reset();
+ while (tokens.IncrementToken()) words.Add(new TermQuery(new Term("body", term.ToString())), Occur.SHOULD);
+ tokens.End();
+ }
+ if (words.Clauses.Count == 0) return Array.Empty();
+ var filter = new BooleanQuery { { words, Occur.MUST }, { new TermQuery(new Term("locale", selectedLocale)), Occur.MUST } };
+ var searcher = new IndexSearcher(_reader) { Similarity = new BM25Similarity() };
+ return searcher.Search(filter, take).ScoreDocs.Select(hit => _articles[searcher.Doc(hit.Doc).Get("id")]).Select(a =>
+ new AdminAssistSearchHit(a.Id, a.TitleKey, a.Body.Length > 500 ? a.Body[..500] + "…" : a.Body, a.SourcePath, a.Anchor, a.PackVersion, a.Locale)).ToArray();
+ }
+ public void Dispose() { _reader.Dispose(); _analyzer.Dispose(); _directory.Dispose(); }
+ }
+ }
+}
diff --git a/Core/Resgrid.Search/SearchModule.cs b/Core/Resgrid.Search/SearchModule.cs
index f8d4aba53..85cf29e06 100644
--- a/Core/Resgrid.Search/SearchModule.cs
+++ b/Core/Resgrid.Search/SearchModule.cs
@@ -13,6 +13,7 @@ public class SearchModule : Module
{
protected override void Load(ContainerBuilder builder)
{
+ builder.RegisterType().As().SingleInstance();
builder.Register(c =>
{
var s3 = new S3SearchIndexStore();
diff --git a/Core/Resgrid.Services/AdminAssist/AdminAssistAccessService.cs b/Core/Resgrid.Services/AdminAssist/AdminAssistAccessService.cs
new file mode 100644
index 000000000..fc0cfa85f
--- /dev/null
+++ b/Core/Resgrid.Services/AdminAssist/AdminAssistAccessService.cs
@@ -0,0 +1,170 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Resgrid.Model;
+using Resgrid.Model.AdminAssist;
+using Resgrid.Model.Services;
+
+namespace Resgrid.Services.AdminAssist
+{
+ public sealed class AdminAssistAccessService(IRecordsAuthorizationService authorization, IFeatureToggleService flags,
+ IDepartmentSettingsService settings, ISubscriptionsService subscriptions, IDepartmentDataProtectionService protection,
+ IReadinessAccessService readiness, IBusinessOperationsAccessService business, IAdminAssistCatalog catalog,
+ TimeProvider clock, IAuthorizationService sourceAuthorization, IPermissionsService permissions = null) : IAdminAssistAccessService
+ {
+ public async Task CanAccessAsync(AdminAssistActor actor, bool setup, CancellationToken ct = default)
+ {
+ ct.ThrowIfCancellationRequested();
+ if (actor == null || actor.DepartmentId <= 0 || string.IsNullOrWhiteSpace(actor.UserId)) return false;
+ if (!await authorization.IsActiveMemberAsync(actor.UserId, actor.DepartmentId) ||
+ !await authorization.IsDepartmentAdminAsync(actor.UserId, actor.DepartmentId)) return false;
+ return await AdminAssistFeatureAvailability.IsEnabledAsync(flags, actor.DepartmentId, setup, ct);
+ }
+
+ public Task> GetCapabilitiesAsync(AdminAssistActor actor, CancellationToken ct = default) => ReadCapabilitiesAsync(actor, catalog.Capabilities, ct);
+ public async Task GetCapabilityAsync(AdminAssistActor actor, string capabilityId, CancellationToken ct = default) =>
+ (await ReadCapabilitiesAsync(actor, new[] { catalog.Capabilities.Single(c => c.Id == capabilityId) }, ct)).Single();
+
+ private async Task> ReadCapabilitiesAsync(AdminAssistActor actor, IEnumerable capabilities, CancellationToken ct)
+ {
+ if (!await authorization.IsActiveMemberAsync(actor.UserId, actor.DepartmentId) ||
+ !await authorization.IsDepartmentAdminAsync(actor.UserId, actor.DepartmentId)) throw new UnauthorizedAccessException();
+ var observed = new Dictionary();
+ var result = new List();
+ bool canManageSubscription;
+ try { canManageSubscription = await sourceAuthorization.CanUserManageSubscriptionAsync(actor.UserId, actor.DepartmentId); }
+ catch (OperationCanceledException) when (ct.IsCancellationRequested) { throw; }
+ catch (Exception) { canManageSubscription = false; }
+ foreach (var capability in capabilities)
+ {
+ ct.ThrowIfCancellationRequested();
+ var reasons = new List();
+ var commercial = new List();
+ var state = EvidenceState.Known;
+ if (capability.ReleaseStatus != "available" && capability.ReleaseStatus != "preview")
+ {
+ result.Add(new CapabilityAccess(capability.Id, EvidenceState.Unavailable, new[] { "Feature" + capability.ReleaseStatus }, false, null, clock.GetUtcNow().UtcDateTime));
+ continue;
+ }
+ foreach (var requirement in capability.Requirements)
+ {
+ var key = requirement.Kind + ":" + requirement.Id;
+ if (!observed.TryGetValue(key, out var requirementState))
+ {
+ requirementState = await EvaluateAsync(actor, requirement, ct);
+ observed[key] = requirementState;
+ }
+ if (requirement.Kind == "addon") commercial.Add(requirementState.State);
+ if (requirementState.State != EvidenceState.Known)
+ {
+ reasons.Add(requirementState.Reason);
+ state = state == EvidenceState.Unknown || requirementState.State == EvidenceState.Unknown ? EvidenceState.Unknown : requirementState.State;
+ }
+ }
+ // The source gate is authoritative even when diagnostic subscription metadata appears available.
+ if (state == EvidenceState.Known && capability.Location.Controller == "Subscription" &&
+ !canManageSubscription)
+ {
+ state = EvidenceState.Unavailable;
+ reasons.Add("ManagingMemberRequired");
+ }
+ try
+ {
+ if (state == EvidenceState.Known && !await OwningGateAsync(actor.DepartmentId, capability))
+ {
+ state = EvidenceState.Unavailable;
+ reasons.Add("SourceAccessUnavailable");
+ }
+ }
+ catch (OperationCanceledException) when (ct.IsCancellationRequested) { throw; }
+ catch (Exception) { state = EvidenceState.Unknown; reasons.Add("AvailabilityUnknown"); }
+ result.Add(new CapabilityAccess(capability.Id, state, reasons.Distinct().ToArray(), state == EvidenceState.Known,
+ state == EvidenceState.Known ? capability.Location.Url : null, clock.GetUtcNow().UtcDateTime,
+ canManageSubscription && capability.Requirements.Any(r => r.Kind == "addon") ? "/User/Subscription/Index" : null,
+ commercial.Count == 0 ? EvidenceState.NotApplicable : commercial.Any(s => s == EvidenceState.Unknown || s == EvidenceState.Redacted) ? EvidenceState.Unknown :
+ commercial.Any(s => s == EvidenceState.Unavailable) ? EvidenceState.Unavailable : EvidenceState.Known));
+ }
+ if (!await authorization.IsActiveMemberAsync(actor.UserId, actor.DepartmentId) ||
+ !await authorization.IsDepartmentAdminAsync(actor.UserId, actor.DepartmentId)) throw new UnauthorizedAccessException();
+ return result;
+ }
+
+ private async Task<(EvidenceState, string)> EvaluateAsync(AdminAssistActor actor, CapabilityRequirement requirement, CancellationToken ct)
+ {
+ var departmentId = actor.DepartmentId;
+ ct.ThrowIfCancellationRequested();
+ try
+ {
+ switch (requirement.Kind)
+ {
+ case "permission":
+ if (!Enum.TryParse(requirement.Id, out var permissionType) || !Enum.IsDefined(permissionType))
+ return (EvidenceState.Unknown, "AvailabilityUnknown");
+ bool allowed;
+ if (RecordPermissionCatalog.Get(permissionType) != null)
+ allowed = await authorization.HasPermissionAsync(actor.UserId, departmentId, permissionType);
+ else
+ {
+ if (permissions == null) return (EvidenceState.Unknown, "AvailabilityUnknown");
+ var permission = await permissions.GetPermissionByDepartmentTypeAsync(departmentId, permissionType);
+ // This endpoint is exclusively for fresh department admins; do not infer other actors' rights.
+ allowed = permissions.IsUserAllowed(permission, await authorization.IsDepartmentAdminAsync(actor.UserId, departmentId), false, new List());
+ }
+ return allowed ? (EvidenceState.Known, null) : (EvidenceState.Unavailable, "SourceAccessUnavailable");
+ case "flag":
+ var flag = await flags.EvaluateFreshAsync(requirement.Id, departmentId);
+ return flag == null ? (EvidenceState.Unknown, "AvailabilityUnknown") : flag.IsEnabled ? (EvidenceState.Known, null) : (EvidenceState.Unavailable, "FeatureNotEnabled");
+ case "module":
+ var module = await settings.GetDepartmentModuleSettingsAsync(departmentId, true);
+ if (module == null) return (EvidenceState.Unknown, "AvailabilityUnknown");
+ bool? disabled = requirement.Id switch
+ {
+ "Messaging" => module.MessagingDisabled, "Mapping" => module.MappingDisabled, "Shifts" => module.ShiftsDisabled,
+ "Logs" => module.LogsDisabled, "Reports" => module.ReportsDisabled, "Documents" => module.DocumentsDisabled,
+ "Calendar" => module.CalendarDisabled, "Notes" => module.NotesDisabled, "Training" => module.TrainingDisabled,
+ "Inventory" => module.InventoryDisabled, "Maintenance" => module.MaintenanceDisabled,
+ "Checklists" => module.ChecklistsDisabled, "BusinessOperations" => module.BusinessOperationsDisabled, _ => null
+ };
+ return disabled == null ? (EvidenceState.Unknown, "AvailabilityUnknown") : disabled.Value ? (EvidenceState.Unavailable, "ModuleDisabled") : (EvidenceState.Known, null);
+ case "protection":
+ return await protection.GetStateAsync(departmentId, true) == DepartmentDataProtectionState.Enabled
+ ? (EvidenceState.Known, null) : (EvidenceState.Unavailable, "ProtectionEnrollmentRequired");
+ case "addon":
+ if (!Enum.TryParse(requirement.Id, out var addon) || !Enum.IsDefined(addon) ||
+ string.IsNullOrWhiteSpace(Config.SystemBehaviorConfig.BillingApiBaseUrl) || string.IsNullOrWhiteSpace(Config.ApiConfig.BackendInternalApikey))
+ return (EvidenceState.Unknown, "SubscriptionStatusUnavailable");
+ var plans = await subscriptions.GetAllAddonPlansByTypeAsync(addon);
+ var ids = plans?.Where(p => p != null && p.AddonType == (int)addon && !string.IsNullOrWhiteSpace(p.PlanAddonId)).Select(p => p.PlanAddonId).Distinct().ToList();
+ if (ids == null || ids.Count == 0) return (EvidenceState.Unknown, "SubscriptionStatusUnavailable");
+ var payments = await subscriptions.GetCurrentPaymentAddonsForDepartmentAsync(departmentId, ids);
+ if (payments == null) return (EvidenceState.Unknown, "SubscriptionStatusUnavailable");
+ var now = clock.GetUtcNow().UtcDateTime;
+ return payments.Any(p => p != null && p.DepartmentId == departmentId && ids.Contains(p.PlanAddonId) && p.EffectiveOn != default &&
+ p.EffectiveOn <= now && p.EndingOn > now && p.EndingOn != DateTime.MaxValue && !string.Equals(p.TransactionId, "SYSTEM", StringComparison.OrdinalIgnoreCase))
+ ? (EvidenceState.Known, null) : (EvidenceState.Unavailable, "AddonRequired." + requirement.Id);
+ default: return (EvidenceState.Unknown, "AvailabilityUnknown");
+ }
+ }
+ catch (OperationCanceledException) when (ct.IsCancellationRequested) { throw; }
+ catch (Exception)
+ {
+ // Diagnostic fallback carries no exception message or source payload to logs/the browser.
+ return (EvidenceState.Unknown, "AvailabilityUnknown");
+ }
+ }
+
+ private Task OwningGateAsync(int departmentId, ProductCapability capability) => capability.Location.Controller switch
+ {
+ "Checklists" => readiness.CanUseChecklistsAsync(departmentId),
+ "WorkOrders" => readiness.CanUseMaintenanceAsync(departmentId),
+ "Invoicing" => business.CanUseInvoicingAsync(departmentId),
+ "Bids" or "Contracts" or "RateSchedules" => business.CanUseContractorBillingAsync(departmentId),
+ "CalOesMars" => business.CanUseCostRecoveryAsync(departmentId),
+ "Workforce" when capability.Id == "pay-data-reporting" => business.CanUsePayDataReportingAsync(departmentId),
+ "Workforce" => business.CanUseWorkforceAsync(departmentId),
+ _ => Task.FromResult(true)
+ };
+ }
+}
diff --git a/Core/Resgrid.Services/AdminAssist/AdminAssistFeatureAvailability.cs b/Core/Resgrid.Services/AdminAssist/AdminAssistFeatureAvailability.cs
new file mode 100644
index 000000000..6144a4d91
--- /dev/null
+++ b/Core/Resgrid.Services/AdminAssist/AdminAssistFeatureAvailability.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Resgrid.Model;
+using Resgrid.Model.Services;
+
+namespace Resgrid.Services.AdminAssist
+{
+ /// Fresh rollout checks. Missing flags and evaluation failures disable the optional feature.
+ public static class AdminAssistFeatureAvailability
+ {
+ public static async Task IsEnabledAsync(IFeatureToggleService flags, int departmentId, bool setup, CancellationToken ct = default)
+ {
+ ct.ThrowIfCancellationRequested();
+ if (departmentId <= 0) return false;
+ try
+ {
+ return (await flags.EvaluateFreshAsync(setup ? FeatureFlagKeys.AdminSetup : FeatureFlagKeys.AdminAssist, departmentId).WaitAsync(ct))?.IsEnabled == true;
+ }
+ catch (OperationCanceledException) when (ct.IsCancellationRequested) { throw; }
+ catch (Exception) { return false; }
+ }
+
+ public static async Task CanConfigureOperatingProfileAsync(IFeatureToggleService flags, int departmentId, CancellationToken ct = default) =>
+ await IsEnabledAsync(flags, departmentId, true, ct) || await IsEnabledAsync(flags, departmentId, false, ct);
+ }
+}
diff --git a/Core/Resgrid.Services/AdminAssist/AdminAssistMaintenanceService.cs b/Core/Resgrid.Services/AdminAssist/AdminAssistMaintenanceService.cs
new file mode 100644
index 000000000..bb3d2de0d
--- /dev/null
+++ b/Core/Resgrid.Services/AdminAssist/AdminAssistMaintenanceService.cs
@@ -0,0 +1,80 @@
+using System;
+using System.Globalization;
+using System.Linq;
+using System.Resources;
+using System.Threading;
+using System.Threading.Tasks;
+using Resgrid.Model.AdminAssist;
+using Resgrid.Model.Services;
+
+namespace Resgrid.Services.AdminAssist
+{
+ /// Bounded metadata refresh and explicitly opted-in, generic weekly admin follow-up. No inference.
+ public sealed class AdminAssistMaintenanceService(IAdminAssistMaintenanceStore store, IAdminAssistAccessService access,
+ IAdminAssistWorklistService worklist, IDepartmentsService departments, IRecordsAuthorizationService membership,
+ ICommunicationService communication, IDepartmentSettingsService settings, IUserProfileService profiles,
+ TimeProvider clock) : IAdminAssistMaintenanceService
+ {
+ private static readonly ResourceManager Labels = new(typeof(Resgrid.Localization.Areas.User.AdminAssist.AdminAssist));
+ public async Task RunDepartmentAsync(int departmentId, CancellationToken ct)
+ {
+ var now = clock.GetUtcNow().UtcDateTime;
+ var lease = Guid.NewGuid().ToString("D");
+ if (!await store.TryLeaseAsync(departmentId, lease, now, ct)) return;
+ DateTime? evaluated = null;
+ try
+ {
+ // Privacy/retention cleanup also runs for departments with no remaining administrator or
+ // whose UI rollout was disabled; neither condition should preserve departed-user preferences.
+ await store.PurgeExpiredMetadataAsync(departmentId, now, ct);
+ // The workload has no decryption grant. Sources retain current member/permission checks;
+ // protected or incomplete evidence stays unknown and cannot resolve an existing failure.
+ var admins = await departments.GetActiveAdminsForDepartmentAsync(departmentId);
+ var admin = admins?.OrderBy(a => a.UserId, StringComparer.Ordinal).FirstOrDefault();
+ if (admin == null) return;
+ var actor = new AdminAssistActor(departmentId, admin.UserId);
+ if (!await access.CanAccessAsync(actor, false, ct)) return;
+ await worklist.VerifyAsync(actor, ct);
+ evaluated = clock.GetUtcNow().UtcDateTime;
+ if (!Config.AdminAssistConfig.SendAdminDigests) return;
+ var department = await departments.GetDepartmentByIdAsync(departmentId, true);
+ if (department == null) return;
+ var zone = TimeZoneInfo.FindSystemTimeZoneById(department.TimeZone);
+ foreach (var preference in await store.GetDigestPreferencesAsync(departmentId, ct))
+ {
+ try
+ {
+ ct.ThrowIfCancellationRequested(); now = clock.GetUtcNow().UtcDateTime;
+ var recipient = new AdminAssistActor(departmentId, preference.UserId, preference.Locale);
+ if (!await access.CanAccessAsync(recipient, false, ct) || !await membership.IsAssignableMemberAsync(preference.UserId, departmentId)) continue;
+ if (AdminAssistDigestSchedule.IsQuiet(now, zone, preference.QuietStartHour, preference.QuietEndHour)) continue;
+ var week = AdminAssistDigestSchedule.Week(now, zone);
+ if (preference.LastAttemptWeek == week) continue;
+ var profile = await profiles.GetProfileByUserIdAsync(preference.UserId, true);
+ if (profile == null) continue;
+ var number = await settings.GetTextToCallNumberForDepartmentAsync(departmentId);
+ if (!await store.ClaimDigestAsync(preference, week, now, ct)) continue;
+ var current = await store.GetPreferencesAsync(departmentId, preference.UserId, ct);
+ if (!current.DigestEnabled || current.Revision != preference.Revision || !await access.CanAccessAsync(recipient, false, ct) ||
+ !await membership.IsAssignableMemberAsync(preference.UserId, departmentId))
+ {
+ await store.CompleteDigestAsync(departmentId, preference.UserId, week, "Suppressed", now, ct); continue;
+ }
+ var outcome = "HandoffUnconfirmed";
+ try
+ {
+ var locale = CultureInfo.GetCultureInfo(preference.Locale);
+ var message = Labels.GetString("Ui.DigestMessage", locale) + " " + (Config.SystemBehaviorConfig.ResgridBaseUrl ?? string.Empty).TrimEnd('/') + "/User/AdminAssist/Index";
+ if (await communication.SendNotificationAsync(preference.UserId, departmentId, message, number, department,
+ Labels.GetString("Ui.Title", locale), profile)) outcome = "HandedOff";
+ }
+ catch (Exception) { /* The provider may have accepted the request. Preserve the weekly claim. */ }
+ await store.CompleteDigestAsync(departmentId, preference.UserId, week, outcome, clock.GetUtcNow().UtcDateTime, ct);
+ }
+ finally { await store.AdvanceDigestCursorAsync(departmentId, preference.UserId, ct); }
+ }
+ }
+ finally { await store.CompleteLeaseAsync(departmentId, lease, evaluated, ct); }
+ }
+ }
+}
diff --git a/Core/Resgrid.Services/AdminAssist/AdminAssistService.cs b/Core/Resgrid.Services/AdminAssist/AdminAssistService.cs
new file mode 100644
index 000000000..922db657e
--- /dev/null
+++ b/Core/Resgrid.Services/AdminAssist/AdminAssistService.cs
@@ -0,0 +1,82 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Resgrid.AdminAssist;
+using Resgrid.Config;
+using Resgrid.Model.AdminAssist;
+
+namespace Resgrid.Services.AdminAssist
+{
+ public sealed class AdminAssistService(IAdminAssistAccessService access, IAdminAssistCatalog catalog,
+ IConfigurationSnapshotProvider snapshots, IAdminAssistRepository repository, TimeProvider clock) : IAdminAssistService
+ {
+ public async Task GetOverviewAsync(AdminAssistActor actor, bool setup, CancellationToken ct = default)
+ {
+ using var timeout = CancellationTokenSource.CreateLinkedTokenSource(ct);
+ timeout.CancelAfter(TimeSpan.FromSeconds(Math.Clamp(AdminAssistConfig.SnapshotTimeoutSeconds, 1, 60)));
+ ct = timeout.Token;
+ await RequireAccessAsync(actor, setup, ct);
+ var workspace = await repository.GetWorkspaceAsync(actor.DepartmentId, actor.UserId, catalog.Version, ct).WaitAsync(ct);
+ var snapshot = await snapshots.ReadAsync(actor, ct).WaitAsync(ct);
+ var now = clock.GetUtcNow().UtcDateTime;
+ var findings = catalog.Rules.Select(r => new ConfigurationRule(r).Evaluate(snapshot, now,
+ TimeSpan.FromSeconds(Math.Clamp(AdminAssistConfig.EvidenceFreshnessSeconds, 1, 300)))).ToArray();
+ var availability = await access.GetCapabilitiesAsync(actor, ct).WaitAsync(ct);
+ await RequireAccessAsync(actor, setup, ct);
+ var report = new ConfigurationReport(snapshot, findings, workspace.Areas.Where(a => a.Value == SetupAreaChoice.UseNow).Select(a => a.Key).ToArray());
+ return new AdminAssistOverview(catalog.Version, workspace, report, availability,
+ catalog.Capabilities.Select(capability => CapabilitySetupEvaluator.Evaluate(capability, availability.SingleOrDefault(a => a.CapabilityId == capability.Id), report,
+ clock.GetUtcNow().UtcDateTime, TimeSpan.FromSeconds(Math.Clamp(AdminAssistConfig.EvidenceFreshnessSeconds, 1, 300)))).ToArray());
+ }
+
+ public async Task UpdateSetupAsync(AdminAssistActor actor, SetupProgressCommand command, CancellationToken ct = default)
+ {
+ await RequireAccessAsync(actor, true, ct);
+ if (command == null || command.ExpectedRevision < 0 || command.ExpectedRevision == long.MaxValue || command.CatalogVersion != catalog.Version)
+ throw new ArgumentException("A current catalog and workspace revision are required.");
+ command = command with { ReviewEvidence = null }; // Never trust review counts supplied by a caller.
+ bool valid = command.Operation switch
+ {
+ "area" => catalog.Areas.Any(a => a.Id == command.TargetId) && Enum.GetNames().Contains(command.Choice) &&
+ (command.Choice != nameof(SetupAreaChoice.NotApplicable) ? command.ReasonCode == null : Enum.GetNames().Contains(command.ReasonCode)),
+ "mode" => command.TargetId == null && Enum.GetNames().Contains(command.Choice),
+ "learn" or "interest" => catalog.Capabilities.Any(c => c.Id == command.TargetId) && (command.Choice == "true" || command.Choice == "false"),
+ "review" => command.TargetId == null && command.Choice == null && !string.IsNullOrWhiteSpace(command.EvidenceRevision),
+ "revisit" => command.TargetId == null && command.Choice == null && (!command.RevisitOnUtc.HasValue ||
+ command.RevisitOnUtc.Value.Kind == DateTimeKind.Utc && command.RevisitOnUtc > clock.GetUtcNow().UtcDateTime && command.RevisitOnUtc <= clock.GetUtcNow().UtcDateTime.AddDays(365)),
+ "dismiss" => command.TargetId == null && (command.Choice == "true" || command.Choice == "false"),
+ _ => false
+ };
+ if (!valid) throw new ArgumentException("Invalid setup choice.");
+ // Baseline security applies regardless of scope or personal orientation progress.
+ if (command.Operation == "area" && command.TargetId == "security" && command.Choice != nameof(SetupAreaChoice.UseNow))
+ throw new ArgumentException("Baseline security cannot be removed from setup scope.");
+ if (command.Operation == "review")
+ {
+ var overview = await GetOverviewAsync(actor, true, ct);
+ if (!overview.Report.Snapshot.Consistent || overview.Report.Snapshot.Revision != command.EvidenceRevision) throw new AdminAssistConcurrencyException();
+ command = command with { ReviewEvidence = new SetupReviewEvidence(catalog.Version, overview.Report.Snapshot.Revision,
+ overview.Report.Snapshot.AsOfUtc, overview.Report.Required, overview.Report.Verified, overview.Report.Failed, overview.Report.Unknown, overview.Workspace.ScopeRevision) };
+ }
+ await RequireAccessAsync(actor, true, ct);
+ return await repository.UpdateWorkspaceAsync(actor, command, ct);
+ }
+
+ public async Task> GetHistoryAsync(AdminAssistActor actor, int skip, int take, CancellationToken ct = default)
+ {
+ await RequireAccessAsync(actor, false, ct);
+ var history = await repository.GetHistoryAsync(actor.DepartmentId, actor.UserId, Math.Max(0, skip),
+ Math.Clamp(take, 1, Math.Clamp(AdminAssistConfig.MaxHistoryPageSize, 1, 100)), ct);
+ await RequireAccessAsync(actor, false, ct);
+ return history;
+ }
+
+ private async Task RequireAccessAsync(AdminAssistActor actor, bool setup, CancellationToken ct)
+ {
+ ct.ThrowIfCancellationRequested();
+ if (!await access.CanAccessAsync(actor, setup, ct).WaitAsync(ct)) throw new UnauthorizedAccessException();
+ }
+ }
+}
diff --git a/Core/Resgrid.Services/AdminAssist/AdminAssistTraceWriter.cs b/Core/Resgrid.Services/AdminAssist/AdminAssistTraceWriter.cs
new file mode 100644
index 000000000..edd6b91d0
--- /dev/null
+++ b/Core/Resgrid.Services/AdminAssist/AdminAssistTraceWriter.cs
@@ -0,0 +1,57 @@
+using System;
+using System.Collections.Generic;
+using System.Text.Json;
+using System.Threading;
+using System.Threading.Tasks;
+using Resgrid.Model;
+using Resgrid.Model.AdminAssist;
+using Resgrid.Model.Services;
+
+namespace Resgrid.Services.AdminAssist
+{
+ public sealed class AdminAssistTraceWriter(IAdminAssistTraceStore store, IProtectedWriteService write,
+ IDepartmentDataProtectionService protection, IFeatureToggleService flags) : IAdminAssistTraceWriter
+ {
+ private static readonly IReadOnlyDictionary, Action)> Fields =
+ new Dictionary, Action)>
+ { ["adminassistdispatchtraces.content"] = (row => row.Content, (row, value) => row.Content = value) };
+ public async Task PersistAsync(DispatchTraceObservation observation, CancellationToken ct)
+ {
+ var prepared = await PrepareAsync(observation, ct);
+ if (prepared != null) await PersistPreparedAsync(prepared, ct);
+ }
+ public async Task PrepareAsync(DispatchTraceObservation observation, CancellationToken ct)
+ {
+ ArgumentNullException.ThrowIfNull(observation);
+ // This check runs in the background, never on the emergency sender's critical path.
+ if (!Config.AdminAssistConfig.CaptureDispatchTraces ||
+ !await AdminAssistFeatureAvailability.IsEnabledAsync(flags, observation.DepartmentId, false, ct)) return null;
+ var row = new AdminAssistDispatchTraceRow { AdminAssistDispatchTraceId = observation.Id, DepartmentId = observation.DepartmentId,
+ CallId = observation.CallId, AttemptId = observation.AttemptId, Stage = observation.Stage.ToString(), ResolverVersion = observation.ResolverVersion ?? "legacy-unrecorded",
+ OccurredOn = observation.OccurredOnUtc, Content = JsonSerializer.Serialize(observation) };
+ DispatchTraceEnvelope.Validate(row);
+ await ProtectAsync(row, ct);
+ return row;
+ }
+ public async Task PersistPreparedAsync(AdminAssistDispatchTraceRow row, CancellationToken ct)
+ {
+ DispatchTraceEnvelope.Validate(row);
+ // A late queue replay must not resurrect a deleted department's derived evidence. A concurrent
+ // deletion is fenced by SaveTraceAsync's department lock and is retried without acknowledging.
+ if (!await store.TraceDepartmentExistsAsync(row.DepartmentId, ct)) return;
+ // Enrollment may have started while this envelope was queued. Recheck the owning write gate;
+ // existing protected envelopes are preserved even if the subscription has since expired.
+ await ProtectAsync(row, ct);
+ await store.SaveTraceAsync(row, ct);
+ }
+ private async Task ProtectAsync(AdminAssistDispatchTraceRow row, CancellationToken ct)
+ {
+ if (await protection.ShouldEncryptNewWritesAsync(row.DepartmentId).WaitAsync(ct) && await protection.GetPinnedCatalogVersionAsync(row.DepartmentId).WaitAsync(ct) < 30)
+ throw new InvalidOperationException("Trace protection catalog upgrade required.");
+ var result = await write.PrepareRecordsEntityWriteAsync(row.DepartmentId, row, null, row.AdminAssistDispatchTraceId, Fields,
+ () => { row.IsProtected = true; row.ProtectedCatalogVersion = 30; }, null, null, true, ct);
+ if (result?.Success != true || result.IsProtected && !ProtectedDataEnvelope.HasEnvelopePrefix(row.Content)) throw new UnauthorizedAccessException();
+ DispatchTraceEnvelope.Validate(row);
+ }
+ }
+}
diff --git a/Core/Resgrid.Services/AdminAssist/AdminAssistWorklistService.cs b/Core/Resgrid.Services/AdminAssist/AdminAssistWorklistService.cs
new file mode 100644
index 000000000..b1a7b6064
--- /dev/null
+++ b/Core/Resgrid.Services/AdminAssist/AdminAssistWorklistService.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Newtonsoft.Json;
+using Resgrid.AdminAssist;
+using Resgrid.Model;
+using Resgrid.Model.AdminAssist;
+using Resgrid.Model.Repositories.Queries;
+using Resgrid.Model.Repositories;
+using Resgrid.Model.Services;
+
+namespace Resgrid.Services.AdminAssist
+{
+ public sealed class AdminAssistWorklistService(IAdminAssistAccessService access, IAdminAssistService assist,
+ IAdminAssistRepository repository, IUnitOfWork unit, IDomainEventOutboxService outbox,
+ IRecordsAuthorizationService authorization, IProtectedGrantContext grant, Lazy write,
+ Lazy read, IDepartmentDataProtectionService protection, TimeProvider clock,
+ IAuditLogsRepository audits) : IAdminAssistWorklistService
+ {
+ private static readonly IReadOnlyDictionary, Action)> Fields =
+ new Dictionary, Action)>
+ { ["adminassistfindings.content"] = (row => row.Content, (row, value) => row.Content = value) };
+
+ public async Task