From fad23e85cb3f4ff357ee3b955ae15b73853420a6 Mon Sep 17 00:00:00 2001 From: Adrian De Leon Date: Tue, 7 Apr 2026 13:20:03 -0300 Subject: [PATCH 1/6] AB#419071 - removed duplicate files --- .../creating_change_request.md | 2 +- .../datatracking/data_tracking_change_logs.md | 6 +- .../data_tracking_troubleshooting.md | 18 +-- .../datatracking/non_triggerable_objects.md | 2 - .../datatracking/set_up_data_tracking.md | 4 +- .../changemanagement/enhanced_cpq_support.md | 37 ------ .../changemanagement/set_up_data_tracking.md | 112 ------------------ .../changemanagement/setting_up_policies.md | 2 +- .../reports/reports_overview.md | 2 +- 9 files changed, 17 insertions(+), 168 deletions(-) delete mode 100644 docs/platgovsalesforce/changemanagement/enhanced_cpq_support.md delete mode 100644 docs/platgovsalesforce/changemanagement/set_up_data_tracking.md diff --git a/docs/platgovsalesforce/changemanagement/creating_change_request.md b/docs/platgovsalesforce/changemanagement/creating_change_request.md index 40527af75e..82c4554eaf 100644 --- a/docs/platgovsalesforce/changemanagement/creating_change_request.md +++ b/docs/platgovsalesforce/changemanagement/creating_change_request.md @@ -12,7 +12,7 @@ types of Change Requests to match the change you want to manage. Here are two op - **Customization** Change request is used for Metadata changes, such as [Customizations](/docs/platgovsalesforce/customizations/customizations_overview.md). - **Data Record** - Change request is used for Data Changes to Revenue Cloud/ - [CPQ](/docs/platgovsalesforce/changemanagement/enhanced_cpq_support.md). + [CPQ](/docs/platgovsalesforce/changemanagement/datatracking/enhanced_cpq_support.md). :::note Data Record Change Requests are only available with an Enterprise Compliance license. diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md index 03144488f4..9917a99d07 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md @@ -66,11 +66,11 @@ The **Netwrix Platform Governance** Change Log has some features specific to dat ## Filtering Change Logs -In some cases, you may want **Change Logs** to be created only when specific conditions are met. +In some cases, you might want **Change Logs** to be created only when specific conditions are met. For example: -- You may want to create an **Opportunity Change Log** only when an admin updates specific fields on a **Closed Won Opportunity**. -- You may want to **exclude Change Logs** for **User-Defined CPQ Discount Schedules**. +- You might want to create an **Opportunity Change Log** only when an admin updates specific fields on a **Closed Won Opportunity**. +- You might want to **exclude Change Logs** for **User-Defined CPQ Discount Schedules**. **Netwrix Platform Governance** allows you to apply filters to tracked objects using either a **Report** or a custom **Apex Class**. diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md index 55ac042fb2..2ee588c3a7 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md @@ -6,9 +6,9 @@ sidebar_position: 4 # Data Tracking - Troubleshooting -This section describes common issues and known errors that users may encounter while working with **Data Tracking**. It provides guidance to help identify the cause of a problem and outlines recommended steps to resolve or mitigate it. +This section describes common issues and known errors that users can encounter while working with **Data Tracking**. It provides guidance to help identify the cause of a problem and outlines recommended steps to resolve or mitigate it. -The topics below highlight frequently reported scenarios, configuration issues, or system behaviors that may affect normal operation. Reviewing these items can help quickly diagnose problems and reduce troubleshooting time. +The topics below highlight frequently reported scenarios, configuration issues, or system behaviors that can affect normal operation. Reviewing these items can help quickly diagnose problems and reduce troubleshooting time. --- @@ -23,7 +23,7 @@ Although tracking is performed on Salesforce objects and fields, their configura ### What to check -- Make sure the scanner has been executed for the relevant Salesforce types. +- Ensure the scanner has been executed for the relevant Salesforce types. - Verify that the corresponding Customization exists in the system. This applies to: @@ -42,13 +42,13 @@ Refer to the following link for instructions on how to run the scanner for speci ## Deployment Errors -When selecting certain standard Salesforce objects for tracking, you may encounter issues that prevent the trigger and its corresponding test class from being successfully deployed. +When selecting certain standard Salesforce objects for tracking, you can encounter issues that prevent the trigger and its corresponding test class from being successfully deployed. Some Salesforce objects have specific characteristics that can affect deployment. ### Known Issue -Objects that do not have a **Name** field (such as `Case` or `WorkOrder`) may behave differently when: +Objects that do not have a **Name** field (such as `Case` or `WorkOrder`) can behave differently when: - Automatically generating the test class - Achieving the required minimum **75% code coverage** for deployment @@ -57,7 +57,7 @@ These cases have already been addressed in the current implementation. ### What to keep in mind -- Other standard objects may still have unique behaviors that could cause deployment conflicts. +- Other standard objects might still have unique behaviors that could cause deployment conflicts. - Errors during deployment are often related to how the test class is generated for those objects. ### Suggested Actions @@ -65,7 +65,7 @@ These cases have already been addressed in the current implementation. - Review the deployment error message to identify the affected object. - Check if the object has any structural differences (e.g., missing common fields like `Name`). -If you encounter a new conflicting object, further investigation or customization may be required. +If you encounter a new conflicting object, further investigation or customization might be required. --- @@ -127,8 +127,8 @@ In this example, the configuration defines that a test record for `sbaa__Approva If the required dependencies are not properly defined: -- The test class may fail during execution -- Deployment may fail due to insufficient code coverage or invalid data +- The test class might fail during execution +- Deployment might fail due to insufficient code coverage or invalid data ### Suggested Actions diff --git a/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md b/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md index 521df0839c..b5c3097a4c 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md @@ -16,8 +16,6 @@ For **Non-Triggerable objects**, such as **Price Book Entry**, **Netwrix Platfor ## Enable Tracking for a Non-Triggerable Object -Follow these steps to enable tracking: - ### 1. Open the Object in Salesforce Navigate to: **Setup → Object Manager** diff --git a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md index 58b8390088..c0fc7cc808 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md @@ -84,7 +84,7 @@ For Salesforce objects that do not support triggers, see the [**Non-Triggerable ::: :::important -Some **Salesforce standard objects** may cause issues when enabling **Data Tracking**. +Some **Salesforce standard objects** can cause issues when enabling **Data Tracking**. If you experience problems while attempting to track certain objects, refer to the [**Troubleshooting**](data_tracking_troubleshooting.md) section for more information about known limitations and possible solutions. ::: @@ -97,7 +97,7 @@ Data Tracking is not designed for **high-volume objects** such as Opportunities ## Select Fields to Track -In some cases, users may need to monitor only specific sensitive fields within a tracked object, rather than tracking all changes to the object. +In some cases, users might need to monitor only specific sensitive fields within a tracked object, rather than tracking all changes to the object. To support this, you can configure which fields should have additional tracking control. diff --git a/docs/platgovsalesforce/changemanagement/enhanced_cpq_support.md b/docs/platgovsalesforce/changemanagement/enhanced_cpq_support.md deleted file mode 100644 index 3765ee00ff..0000000000 --- a/docs/platgovsalesforce/changemanagement/enhanced_cpq_support.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -title: "Data Tracking" -description: "Data Tracking" -sidebar_position: 90 ---- - -# Data Tracking - -Salesforce CPQ (Configure, Price, Quote Software) sales tool provides accurate pricing with any -given product configuration scenario. Behind the scenes, CPQ uses configuration data stored in -custom objects. Manually monitoring this configuration data is the hardest part of SOX compliance. -In the CPQ application, for example, important rules about products, prices, discounts, and -approvals are stored as data in custom objects. Getting visibility into these changes is incredibly -time-consuming, and there are few options for preventing changes that can put your processes and -compliance in jeopardy. - -This is not unique to CPQ. Billing and other applications that touch revenue related data are all -potentially in scope and in your auditor's sights. - -Platform Governance for Salesforce solves this major pain point by treating configuration data with -the same scrutiny it applies to other Apex metadata in your Org. It is the only native solution to -give you visibility into these changes. You can create mitigating controls to automatically block -changes to critical CPQ rules. For example, you can now designate the fields on the **Discount -Schedule** and **Discount Tier** objects to be under change control, and generate compliance logs if -the fields are changed. - -As a result, you no longer have to rely on field history reports and manual review to ensure CPQ and -other configuration data is protected. Auditors are satisfied, audit costs go down and IT leadership -can rest easy knowing there are no surprises. - -You must have an Enterprise Compliance license to benefit from this feature. - -The basic steps for CPQ data tracking: - -1. Ensure your org has been [scanned](../installingstrongpoint/running_scanner.md) at least once. -2. [Set up data tracking](datatracking/set_up_data_tracking.md) for each tracked customization. -3. [Add](datatracking/set_up_data_tracking.md) the tracked customizations to a policy. diff --git a/docs/platgovsalesforce/changemanagement/set_up_data_tracking.md b/docs/platgovsalesforce/changemanagement/set_up_data_tracking.md deleted file mode 100644 index 9c2c14d679..0000000000 --- a/docs/platgovsalesforce/changemanagement/set_up_data_tracking.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -title: "Set Up Data Tracking" -description: "Set Up Data Tracking" -sidebar_position: 100 ---- - -# Set Up Data Tracking - -Data tracking is used for Salesforce CPQ and any sensitive data fields you want to track. Setting up -data tracking enables Platform Governance for Salesforce to track data and create change logs for -any data changes. - -:::note -If you track an object, all changes to the object and fields are tracked. Consult with your security -and audit teams to develop a list of objects before enabling data tracking. -::: - -## Prerequisites - -Here are the requirements to set up data tracking: - -1. Enterprise Compliance license -2. Access to the Configuration app. You must have the **Strongpoint Administrator** and - **Strongpoint Grant Permissions** assignments to access the app. This access is set through: - **Setup** > **Users** > **Permission Sets** > **Strongpoint Administrator** > **Manage - Assignments** - - ![You must have these permissions to open the Configuration tool](/images/platgovsalesforce/change_management/strongpoint_permissions.webp) - -## Add Objects to Track - -1. Open the Salesforce App Launcher. -2. Click **View All** to expand the app list. -3. Select **Strongpoint Configuration**. The **Recommended Objects** list is displayed. - - ![Review the recommended objects for data tracking](/images/platgovsalesforce/change_management/data_tracking_recommended.webp) - -4. Click the checkbox to select each **Recommended Object** to track. -5. Set the **Tracking** for each selected Object: - - - **Not Tracked**: Changes in data records are not tracked. - - **Tracked, Blocking**: Changes in data records are blocked if there is not an approved Change - Request. - - **Tracked, Non-Blocking**: Changes in data records are logged. The Change Logs show the change - as non-compliant if there is not an approved Change Request. - -6. Set the **Update Only** for each selected Object: - - - **No**: Tracks changes to existing and new records. - - **Yes**: Tracks changes to existing records but does not apply to new records. - -7. Click **Apply Recommendations**. -8. Click **Save All Records** if you do not need any additional objects, otherwise continue these - steps. -9. Click **Show Additional Objects for Tracking (Advanced)**. The Additional Objects list is - displayed. -10. Click the checkbox to select each **Additional Object** to track. You can search for objects, or - use the navigation at the bottom of the form to page through the records. -11. Set the **Tracking** and **Update Only** values for each additional selected object. -12. Click **Apply Recommendations**. -13. Click **Save All Records**. -14. Wait until the **Deployment Status** is complete, then click **Done**. - - ![Wait for the Deployment Status to complete](/images/platgovsalesforce/change_management/data_tracking_deployment.webp) - -15. Open the App Launcher and return to the **Strongpoint Lightning** app. - -## Select Customizations to Track - -1. Open **Customizations**. -2. Enter **CustomField** in the **Search** box. - - ![Open CustomField Tracking](/images/platgovsalesforce/change_management/data_tracking_customfield.webp) - -3. Select **CustomField Tracking**. -4. Select a customization and edit the Data Change Tracking field. - - ![Edit the Data Change Tracking](/images/platgovsalesforce/change_management/data_tracking_customfield3.webp) - -5. Click **Save** at the bottom of the form to save your changes. - -## Add Tracked Objects to a Policy - -Adding a tracked object to a specific policy facilitates tracking. For example, you can create a -report based on changes of that policy. In your Change Enablement process, you can set a change -level for tracked components by adding them to a specific policy. - -1. Open **Change / Approval Policies**. Change the view to **All Policies** instead of **Recently - Viewed**. -2. Select a policy to track the object. -3. Open the **Related** tab. -4. Click **Add Customizations**. -5. Enter **(Data Records** in the Search Customization box. - - ![Select the customizations](/images/platgovnetsuite/change_management/policy_add_customizations.webp) - -6. Select the customization to add. Use Shift-click (contiguous items) or Ctrl-click to select - multiple customizations. -7. Click **Add** to add your selections to the Selected Customizations pane. -8. Click **Save** when you are done. - -## Change Logs - -![CPQ Change Log](/images/platgovsalesforce/change_management/cpq_discount_change_log.webp) - -**Tracked, Non-Blocking** generates a Compliant Change Log (CL-11674) if there is an approved Change -Request or a Non-Compliant Change Log (CL-11672) for changes made without an approved Change -Request. - -**Tracked, Blocking** generates a Compliant Change Log (CL-11672) if there is an approved Change -Request. If a user attempts to save a change to a **Tracked, Blocking** object without an approved -Change Request, an error is generated and the change is not saved. diff --git a/docs/platgovsalesforce/changemanagement/setting_up_policies.md b/docs/platgovsalesforce/changemanagement/setting_up_policies.md index 41b2cc6c02..6b05988eaa 100644 --- a/docs/platgovsalesforce/changemanagement/setting_up_policies.md +++ b/docs/platgovsalesforce/changemanagement/setting_up_policies.md @@ -102,7 +102,7 @@ for the specific records on the customization record. Set objects and fields that are **Tracked Non-blocking** or **Tracked Blocking** to be part of the policy and require a Ticket and an approval. -Refer to [Set Up Data Tracking](/docs/platgovsalesforce/changemanagement/set_up_data_tracking.md) for more information on activating and +Refer to [Set Up Data Tracking](/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md) for more information on activating and validating tracked fields. ### Health Check Changes diff --git a/docs/platgovsalesforce/reports/reports_overview.md b/docs/platgovsalesforce/reports/reports_overview.md index 47a4373310..901ba3afd9 100644 --- a/docs/platgovsalesforce/reports/reports_overview.md +++ b/docs/platgovsalesforce/reports/reports_overview.md @@ -79,7 +79,7 @@ Compliant. ![Access Report Profile Permissions Changes](/images/platgovsalesforce/reports/access_reports_profile_changes.webp) - **Changes to Users**: Displays the changes to tracked user data fields. Refer to -[Enhanced CPQ Support](/docs/platgovsalesforce/changemanagement/enhanced_cpq_support.md) for more information on +[Enhanced CPQ Support](/docs/platgovsalesforce/changemanagement/datatracking/enhanced_cpq_support.md) for more information on setting up tracking.

If you see the message: _--String too long - Skipped lines due to CPU limit reached--_ it means the governor limits have been reached. Profiles and PermissionSets are very data heavy. Platform Governance for Salesforce skips the record and continues the scan the next day to ensure From fc28c5152645843c80e859bea7192e6d86e335a2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 7 Apr 2026 16:36:59 +0000 Subject: [PATCH 2/6] fix(vale): auto-fix substitutions and removals --- .../creating_change_request.md | 10 +++++----- .../datatracking/data_tracking_change_logs.md | 8 ++++---- .../data_tracking_troubleshooting.md | 10 +++++----- .../datatracking/non_triggerable_objects.md | 6 +++--- .../datatracking/set_up_data_tracking.md | 18 +++++++++--------- .../changemanagement/setting_up_policies.md | 4 ++-- .../reports/reports_overview.md | 2 +- 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/platgovsalesforce/changemanagement/creating_change_request.md b/docs/platgovsalesforce/changemanagement/creating_change_request.md index 82c4554eaf..f1f5461313 100644 --- a/docs/platgovsalesforce/changemanagement/creating_change_request.md +++ b/docs/platgovsalesforce/changemanagement/creating_change_request.md @@ -142,12 +142,12 @@ Review the change request: ### Run Impact Analysis Open the **Impact Analysis** tab and review the information on the tabs: **Can Be Safely Deleted or Modified**, -**Cannot Be Safely Deleted or Modified**, and **Inactive Customizations**. +**Can't Be Safely Deleted or Modified**, and **Inactive Customizations**. -Here is an example of items on the **Cannot Be Safely Deleted or Modified** tab. The Customizations +Here is an example of items on the **Can't Be Safely Deleted or Modified** tab. The Customizations and Impacted Customizations are links to each customization record. -![Impact Analysis Cannot Be Safely Deleted or Modified tab](/images/platgovsalesforce/change_management/change_request_impact_analysis_light.webp) +![Impact Analysis Can't Be Safely Deleted or Modified tab](/images/platgovsalesforce/change_management/change_request_impact_analysis_light.webp) ### View the DRD @@ -178,5 +178,5 @@ add additional approvers, approver notes and begin the approval process. :::note -For new objects that do not yet exist in Production, edit the Change Request and enter the full API -Names of these objects into the Proposed Customization fields in the Scope Section. You can add \ No newline at end of file +For new objects that don't yet exist in Production, edit the Change Request and enter the full API +Names of these objects into the Proposed Customization fields in the Scope Section. You can add diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md index 9917a99d07..484a53253e 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md @@ -37,7 +37,7 @@ When an object is configured as **Tracked, Blocking**, the system enforces stric - If a change is associated with an **approved Change Request**, the system records it as a **Compliant Change Log**. - If a user attempts to make a change **without an approved Change Request**, the system blocks the operation. -In this case, an error message is displayed and the change is not saved. This mode ensures that all modifications follow the required approval process before being applied. +In this case, an error message is displayed and the change isn't saved. This mode ensures that all modifications follow the required approval process before being applied. ::: @@ -90,8 +90,8 @@ The report must meet the following requirements: - The **standard date filter** must be set to the **Created Date** of the record type being filtered. - The **first column** in the report must be the **Id** of the record. -Example: Do not create Change Logs for changes in “User-Defined” CPQ Discount Schedules -This report returns only the Discount Schedule Ids of records that do not have the “User Defined” checkbox checked. +Example: Don't create Change Logs for changes in “User-Defined” CPQ Discount Schedules +This report returns only the Discount Schedule Ids of records that don't have the “User Defined” checkbox checked. ![Data Tracking - Report Filter](/images/platgovsalesforce/change_management/data_tracking_report_filter.webp) @@ -120,7 +120,7 @@ global Set getFilteredIds(Datetime start, Datetime end) The start and end times should be used by your filtering logic to return a Set of record Ids that have been modified during that time interval. ::: -#### Example: Do not create Change Logs for changes in “User-Defined” CPQ Discount Schedules. +#### Example: Don't create Change Logs for changes in “User-Defined” CPQ Discount Schedules. Here’s an example that does the same job as the Report filter above. diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md index 2ee588c3a7..332a479550 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md @@ -19,7 +19,7 @@ If you are unable to find a Salesforce object or field to track, this is usually Although tracking is performed on Salesforce objects and fields, their configuration depends on the **Customization** level. This means that: - Objects and fields must first exist as Customizations in the system. -- If they are not available, they cannot be selected for tracking or filtering. +- If they aren't available, they can't be selected for tracking or filtering. ### What to check @@ -48,7 +48,7 @@ Some Salesforce objects have specific characteristics that can affect deployment ### Known Issue -Objects that do not have a **Name** field (such as `Case` or `WorkOrder`) can behave differently when: +Objects that don't have a **Name** field (such as `Case` or `WorkOrder`) can behave differently when: - Automatically generating the test class - Achieving the required minimum **75% code coverage** for deployment @@ -125,7 +125,7 @@ In this example, the configuration defines that a test record for `sbaa__Approva ### Common Issue -If the required dependencies are not properly defined: +If the required dependencies aren't properly defined: - The test class might fail during execution - Deployment might fail due to insufficient code coverage or invalid data @@ -139,6 +139,6 @@ If the required dependencies are not properly defined: Proper configuration of these dependencies is essential for successful test class generation and deployment. :::note -The **Test Class SObject Dependency – Custom Metadata Type** is not a protected component. This means you can add or modify dependencies as needed without requiring a new package version. +The **Test Class SObject Dependency – Custom Metadata Type** isn't a protected component. This means you can add or modify dependencies as needed without requiring a new package version. ::: ---- \ No newline at end of file +--- diff --git a/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md b/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md index b5c3097a4c..58b4536f5b 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md @@ -6,7 +6,7 @@ sidebar_position: 2 # Non-Triggerable Objects -Some **Standard Salesforce objects are not triggerable**, which means it is not possible to generate and deploy triggers for them in the Salesforce environment. Because of this limitation, **Netwrix Platform Governance** cannot block the creation of records for these objects. +Some **Standard Salesforce objects aren't triggerable**, which means it isn't possible to generate and deploy triggers for them in the Salesforce environment. Because of this limitation, **Netwrix Platform Governance** can't block the creation of records for these objects. As a result, the tracking process for these objects is different. @@ -24,7 +24,7 @@ Then select the object you want to track. ### 2. Enable Field History Tracking -If Field History Tracking is not already enabled: +If Field History Tracking isn't already enabled: 1. Go to **Details** 2. Click **Edit** @@ -76,5 +76,5 @@ Each Change Log is marked as either: - **Non-Compliant** — if no approved Change Request can be associated with the update. :::important -A **Change Log is not created when a data record is deleted**, because Salesforce does not generate **Field History records** for deleted records. +A **Change Log isn't created when a data record is deleted**, because Salesforce doesn't generate **Field History records** for deleted records. ::: diff --git a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md index c0fc7cc808..9f00961b1c 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md @@ -52,22 +52,22 @@ In this section, users can apply tracking recommendations to one or more objects The available tracking options for objects are: -- **Not Tracked**: Changes to data records are not monitored. +- **Not Tracked**: Changes to data records aren't monitored. - **Tracked, Blocking**: Changes to data records are blocked if there is no approved Change Request. - **Tracked, Non-Blocking**: Changes to data records are logged. If there is no approved Change Request, the Change Log marks the change as non-compliant. :::note -While metadata changes in Salesforce can be tracked but not blocked, **Data Tracking** allows you to block most data record changes that are not pre-approved. +While metadata changes in Salesforce can be tracked but not blocked, **Data Tracking** allows you to block most data record changes that aren't pre-approved. -Changes to records in **Non-Triggerable objects** cannot be blocked. See the [**Non-Triggerable Objects**](non_triggerable_objects.md) section for more information about how these objects behave. +Changes to records in **Non-Triggerable objects** can't be blocked. See the [**Non-Triggerable Objects**](non_triggerable_objects.md) section for more information about how these objects behave. ::: Users can also choose whether tracking should apply to **Updates Only** for each object. - **No**: Tracks changes to both new and existing records. -- **Yes**: Tracks changes to existing records only. Changes to new records are not tracked. +- **Yes**: Tracks changes to existing records only. Changes to new records aren't tracked. -If you want to enable tracking for objects that are not included in the recommended list, follow these steps: +If you want to enable tracking for objects that aren't included in the recommended list, follow these steps: 1. Click **Show Additional Objects for Tracking (Advanced)**. The **Additional Objects** list appears. 2. Search for the object by typing its name. @@ -80,7 +80,7 @@ If you want to enable tracking for objects that are not included in the recommen :::note To track objects that support triggers, **Netwrix Platform Governance** automatically creates and deploys a trigger and a test class for each selected object. -For Salesforce objects that do not support triggers, see the [**Non-Triggerable Objects**](non_triggerable_objects.md) section. +For Salesforce objects that don't support triggers, see the [**Non-Triggerable Objects**](non_triggerable_objects.md) section. ::: :::important @@ -92,7 +92,7 @@ If you experience problems while attempting to track certain objects, refer to t :::tip We recommend using Data Tracking only for **critical configuration objects**. -Data Tracking is not designed for **high-volume objects** such as Opportunities or Quotes. For these types of objects, Salesforce’s standard **Field History Tracking** feature is a better option for monitoring changes. +Data Tracking isn't designed for **high-volume objects** such as Opportunities or Quotes. For these types of objects, Salesforce’s standard **Field History Tracking** feature is a better option for monitoring changes. ::: ## Select Fields to Track @@ -113,11 +113,11 @@ To support this, you can configure which fields should have additional tracking :::note ## Fields Excluded from Tracking (Default) -By default, **Netwrix Platform Governance** does not track changes in certain field types or standard system fields. +By default, **Netwrix Platform Governance** doesn't track changes in certain field types or standard system fields. ### Field Types Not Tracked -Changes to the following field types are not tracked: +Changes to the following field types aren't tracked: - ADDRESS - BASE64 diff --git a/docs/platgovsalesforce/changemanagement/setting_up_policies.md b/docs/platgovsalesforce/changemanagement/setting_up_policies.md index 6b05988eaa..bf87b3c0dc 100644 --- a/docs/platgovsalesforce/changemanagement/setting_up_policies.md +++ b/docs/platgovsalesforce/changemanagement/setting_up_policies.md @@ -32,7 +32,7 @@ You can create a New Policy, or edit an existing one: - **Customization Policies** impacted customization approval. - **Management Policies** executive approver and approval settings. - **Change Enablement Defaults** merge approval list, non conforming alerts, and sequential approval requests. -- **System Information**, **Created By** and **Last Modified By** dates. Informational only, cannot be edited. +- **System Information**, **Created By** and **Last Modified By** dates. Informational only, can't be edited. Once the policy is saved, **System Information** is added show the **Created By** and **Last Modified By** user and time stamp. The information you entered on the form is shown on the @@ -136,7 +136,7 @@ impacted Customization owners. **Maximum number of Approvals Required**: approval is granted once the specified number of approvals is complete. If this field is blank, all approvers must approve. -**No Order Required**: select this option to allow approvals in any order. If it is not checked, +**No Order Required**: select this option to allow approvals in any order. If it isn't checked, approvals occur in the order specified. ### Change Enablement Defaults diff --git a/docs/platgovsalesforce/reports/reports_overview.md b/docs/platgovsalesforce/reports/reports_overview.md index 901ba3afd9..6011a5ea00 100644 --- a/docs/platgovsalesforce/reports/reports_overview.md +++ b/docs/platgovsalesforce/reports/reports_overview.md @@ -66,7 +66,7 @@ users that have Admin profiles, you can set two filters: - Salesforce type Equals Profile - **Date Assigned** and **Expires on** are only relevant for PermissionSets. They are blank for -Profiles. If your org does not use the **Expires on** feature, you can remove the column from the +Profiles. If your org doesn't use the **Expires on** feature, you can remove the column from the report. ![Users to Profile/PermissionSets](/images/platgovsalesforce/reports/access_reports_users_to_profile.webp) From f54568910a030916619dbd6e9b86a650e60fc2d1 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:41:50 +0000 Subject: [PATCH 3/6] fix(vale): auto-fix rewrites (AI-assisted) --- .../changemanagement/creating_change_request.md | 4 ++-- .../datatracking/data_tracking_change_logs.md | 8 ++++---- .../datatracking/data_tracking_troubleshooting.md | 2 +- .../datatracking/set_up_data_tracking.md | 8 ++++---- .../changemanagement/setting_up_policies.md | 13 ++++++------- docs/platgovsalesforce/reports/reports_overview.md | 9 ++++----- 6 files changed, 21 insertions(+), 23 deletions(-) diff --git a/docs/platgovsalesforce/changemanagement/creating_change_request.md b/docs/platgovsalesforce/changemanagement/creating_change_request.md index f1f5461313..52462ed59f 100644 --- a/docs/platgovsalesforce/changemanagement/creating_change_request.md +++ b/docs/platgovsalesforce/changemanagement/creating_change_request.md @@ -6,7 +6,7 @@ sidebar_position: 40 # Creating a Change Request -Change requests are the method to plan, analyze, track and approve changes. You can create different +Change requests are the method to plan, analyze, track, and approve changes. You can create different types of Change Requests to match the change you want to manage. Here are two options: - **Customization** Change request is used for Metadata changes, such as @@ -94,7 +94,7 @@ Data Record Change Requests are only available with an Enterprise Compliance lic - Review existing customizations to identify the correct format. - This allows you to reference real examples from your account and ensure the API Name follows the correct structure. + Use this to reference real examples from your account and ensure the API Name follows the correct structure. ::: diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md index 484a53253e..9bcf605dee 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md @@ -8,7 +8,7 @@ sidebar_position: 3 ## Overview -Change Logs allow you to view details about modifications made to records on tracked objects. +Change Logs let you view details about modifications made to records on tracked objects. **Data Tracking – Change Logs** can be accessed from the **Change Logs** tab by selecting the **Data Tracking Changes** list view. @@ -28,7 +28,7 @@ When an object is configured as **Tracked, Non-Blocking**, the changes are monit - If the change is associated with an **approved Change Request**, the system records it as a **Compliant Change Log**. - If the change occurs **without an approved Change Request**, the system records it as a **Non-Compliant Change Log**. -This mode allows users to complete their changes while ensuring that all activity is tracked and evaluated for compliance. +In this mode, users can complete their changes while all activity is tracked and evaluated for compliance. #### Tracked, Blocking @@ -55,7 +55,7 @@ The **Netwrix Platform Governance** Change Log has some features specific to dat - **Customization:** Data record Customization for the tracked object. - **Metadata Type:** Always blank, because it’s not metadata. -- **Field Name:** Always “Data Change Tracking”. Can be used for creating filtered Change Log Reports and List Views. +- **Field Name:** Always “Data Change Tracking”. Use this field to create filtered Change Log Reports and List Views. - **Change Overview:** Data record name, API Name of the tracked object, and operation that was done. - **Data Record Id:** Data record’s Salesforce Id. Use this to URL-hack directly to the updated record. - **Data Record Name:** Data record name. @@ -72,7 +72,7 @@ For example: - You might want to create an **Opportunity Change Log** only when an admin updates specific fields on a **Closed Won Opportunity**. - You might want to **exclude Change Logs** for **User-Defined CPQ Discount Schedules**. -**Netwrix Platform Governance** allows you to apply filters to tracked objects using either a **Report** or a custom **Apex Class**. +With **Netwrix Platform Governance**, you can apply filters to tracked objects using either a **Report** or a custom **Apex Class**. --- diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md index 332a479550..f555ece521 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md @@ -55,7 +55,7 @@ Objects that don't have a **Name** field (such as `Case` or `WorkOrder`) can beh These cases have already been addressed in the current implementation. -### What to keep in mind +### Considerations - Other standard objects might still have unique behaviors that could cause deployment conflicts. - Errors during deployment are often related to how the test class is generated for those objects. diff --git a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md index 9f00961b1c..73b31782c3 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md @@ -57,9 +57,9 @@ The available tracking options for objects are: - **Tracked, Non-Blocking**: Changes to data records are logged. If there is no approved Change Request, the Change Log marks the change as non-compliant. :::note -While metadata changes in Salesforce can be tracked but not blocked, **Data Tracking** allows you to block most data record changes that aren't pre-approved. +While metadata changes in Salesforce can be tracked but not blocked, with **Data Tracking** you can block most data record changes that aren't pre-approved. -Changes to records in **Non-Triggerable objects** can't be blocked. See the [**Non-Triggerable Objects**](non_triggerable_objects.md) section for more information about how these objects behave. +Changes to records in **Non-Triggerable objects** can't be blocked. See [**Non-Triggerable Objects**](non_triggerable_objects.md) to understand which objects can't be blocked and how they are handled. ::: Users can also choose whether tracking should apply to **Updates Only** for each object. @@ -86,11 +86,11 @@ For Salesforce objects that don't support triggers, see the [**Non-Triggerable O :::important Some **Salesforce standard objects** can cause issues when enabling **Data Tracking**. -If you experience problems while attempting to track certain objects, refer to the [**Troubleshooting**](data_tracking_troubleshooting.md) section for more information about known limitations and possible solutions. +If you experience problems while attempting to track certain objects, see [**Troubleshooting**](data_tracking_troubleshooting.md) for known limitations and possible solutions. ::: :::tip -We recommend using Data Tracking only for **critical configuration objects**. +Use Data Tracking only for **critical configuration objects**. Data Tracking isn't designed for **high-volume objects** such as Opportunities or Quotes. For these types of objects, Salesforce’s standard **Field History Tracking** feature is a better option for monitoring changes. ::: diff --git a/docs/platgovsalesforce/changemanagement/setting_up_policies.md b/docs/platgovsalesforce/changemanagement/setting_up_policies.md index bf87b3c0dc..b0a40e5cea 100644 --- a/docs/platgovsalesforce/changemanagement/setting_up_policies.md +++ b/docs/platgovsalesforce/changemanagement/setting_up_policies.md @@ -19,11 +19,11 @@ You can create a New Policy, or edit an existing one: - **Information** general information about the policy. - **Code and Data Model Changes** change control level for code and data model changes. -- **Automation Changes** change control level for approval process, business process, flow, workflow and process builder changes. +- **Automation Changes** change control level for approval process, business process, flow, workflow, and process builder changes. - **Sharing and Visibility Changes** change control level for role, profile, permission set, data security, sharing non material and indirect changes to profile changes. - **Integration Changes** change control level for external site, identity, and access changes. - **Configuration Changes** change control level for data quality and general settings changes. -- **Display and UI Changes** change control level for application, label and translation, layout and template changes. +- **Display and UI Changes** change control level for application, label, translation, layout, and template changes. - **Analytics Changes** change control level for reports, dashboards, list view, and Einstein changes. - **Control Changes** change control level for control changes. - **Application Configuration Changes (Data)** @@ -34,7 +34,7 @@ You can create a New Policy, or edit an existing one: - **Change Enablement Defaults** merge approval list, non conforming alerts, and sequential approval requests. - **System Information**, **Created By** and **Last Modified By** dates. Informational only, can't be edited. -Once the policy is saved, **System Information** is added show the **Created By** and **Last +After the policy is saved, **System Information** is added show the **Created By** and **Last Modified By** user and time stamp. The information you entered on the form is shown on the **Details** tab. The Related tab is available to add Customizations and view additional information and history. @@ -102,8 +102,7 @@ for the specific records on the customization record. Set objects and fields that are **Tracked Non-blocking** or **Tracked Blocking** to be part of the policy and require a Ticket and an approval. -Refer to [Set Up Data Tracking](/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md) for more information on activating and -validating tracked fields. +See [Set Up Data Tracking](/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md) for instructions on activating and validating tracked fields. ### Health Check Changes @@ -133,7 +132,7 @@ impacted Customization owners. **Executive Approver**: a business executive who must approve the change. -**Maximum number of Approvals Required**: approval is granted once the specified number of approvals +**Maximum number of Approvals Required**: approval is granted when the specified number of approvals is complete. If this field is blank, all approvers must approve. **No Order Required**: select this option to allow approvals in any order. If it isn't checked, @@ -194,7 +193,7 @@ the CustomObject Policy when added. ### Select Change Level by Salesforce Type -This feature enables you to add customizations to the policy based on Salesforce type. It is +Use this feature to add customizations to the policy based on Salesforce type. It is available on the **Related** tab on the policy. 1. Open the policy and click the **Related** tab. diff --git a/docs/platgovsalesforce/reports/reports_overview.md b/docs/platgovsalesforce/reports/reports_overview.md index 6011a5ea00..54d52dc77c 100644 --- a/docs/platgovsalesforce/reports/reports_overview.md +++ b/docs/platgovsalesforce/reports/reports_overview.md @@ -58,7 +58,7 @@ Set and Profile. ![Access report by PermissionSet/Profile](/images/platgovsalesforce/reports/access_reports_permission_by_permset.webp) -- **Users to Profiles/PermissionSets**: Displays the Profile, PermissionSet and PermissionSet Group +- **Users to Profiles/PermissionSets**: Displays the Profile, PermissionSet, and PermissionSet Group assigned to each user. You can filter the report information. For example, if you want a list of users that have Admin profiles, you can set two filters: @@ -78,8 +78,8 @@ Compliant. ![Access Report Profile Permissions Changes](/images/platgovsalesforce/reports/access_reports_profile_changes.webp) -- **Changes to Users**: Displays the changes to tracked user data fields. Refer to -[Enhanced CPQ Support](/docs/platgovsalesforce/changemanagement/datatracking/enhanced_cpq_support.md) for more information on +- **Changes to Users**: Displays the changes to tracked user data fields. See +[Enhanced CPQ Support](/docs/platgovsalesforce/changemanagement/datatracking/enhanced_cpq_support.md) for instructions on setting up tracking.

If you see the message: _--String too long - Skipped lines due to CPU limit reached--_ it means the governor limits have been reached. Profiles and PermissionSets are very data heavy. Platform Governance for Salesforce skips the record and continues the scan the next day to ensure @@ -168,8 +168,7 @@ including: These reports are available from **Netwrix Dashboard** **Reports** **Customizations**. -- **All Customizations**: This enables you to use Salesforce functionality to filter searches -quickly for specific customizations. +- **All Customizations**: Use Salesforce functionality to filter searches quickly for specific customizations. - **Customization Impact**: This report shows your customizations and how they impact other objects. ## Clean Up From 4ee9ab1231df32121157dc88cd246b393797e55e Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 16:48:50 +0000 Subject: [PATCH 4/6] fix(dale): auto-fix documentation issues (AI-assisted) --- .../changemanagement/creating_change_request.md | 7 +++---- .../datatracking/data_tracking_change_logs.md | 2 +- .../data_tracking_troubleshooting.md | 4 ++-- .../datatracking/non_triggerable_objects.md | 2 +- .../datatracking/set_up_data_tracking.md | 2 +- .../changemanagement/setting_up_policies.md | 4 +--- .../reports/reports_overview.md | 17 ++++++----------- 7 files changed, 15 insertions(+), 23 deletions(-) diff --git a/docs/platgovsalesforce/changemanagement/creating_change_request.md b/docs/platgovsalesforce/changemanagement/creating_change_request.md index 52462ed59f..70b8f67745 100644 --- a/docs/platgovsalesforce/changemanagement/creating_change_request.md +++ b/docs/platgovsalesforce/changemanagement/creating_change_request.md @@ -98,7 +98,7 @@ Data Record Change Requests are only available with an Enterprise Compliance lic ::: -6. **Save** the **Change Request**. A confirmation is displayed when the change request is saved and the user is redirected to the record view page. +6. **Save** the **Change Request**. When you save the change request, a confirmation appears and the system redirects you to the record view page. ![Continue with the Change Request](/images/platgovsalesforce/change_management/change_request_new2_light.webp) @@ -157,7 +157,7 @@ Open the **DRD** tab to review the dependency diagram. ### Submit the Change Request for Approval -Change request approvers are automatically assigned based on the policy. In this section, you can +The policy automatically assigns approvers to the change request. In this section, you can add additional approvers, approver notes and begin the approval process. ![Expand Approval section](/images/platgovsalesforce/change_management/change_request_approvals_light.webp) @@ -171,8 +171,7 @@ add additional approvers, approver notes and begin the approval process. 2. Click **Save**. -3. Click **Submit for Approval** on the path to start the approval process. Approval notifications are sent to the - approvers. +3. Click **Submit for Approval** on the path to start the approval process. The system sends approval notifications to the approvers. ![Change Request Pending Approval](/images/platgovsalesforce/change_management/change_request_submit_approval.webp) diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md index 9bcf605dee..3bab98ffc9 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_change_logs.md @@ -80,7 +80,7 @@ With **Netwrix Platform Governance**, you can apply filters to tracked objects u Using a **Report** is the simplest way to implement a filter. -Create a report that returns a list of **record Ids**. If a tracked record update matches the report’s filter criteria, a **Change Log** will be created for that record. +Create a report that returns a list of **record Ids**. If a tracked record update matches the report’s filter criteria, the system creates a **Change Log** for that record. #### Report Requirements diff --git a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md index f555ece521..3a4de3c6aa 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/data_tracking_troubleshooting.md @@ -8,7 +8,7 @@ sidebar_position: 4 This section describes common issues and known errors that users can encounter while working with **Data Tracking**. It provides guidance to help identify the cause of a problem and outlines recommended steps to resolve or mitigate it. -The topics below highlight frequently reported scenarios, configuration issues, or system behaviors that can affect normal operation. Reviewing these items can help quickly diagnose problems and reduce troubleshooting time. +The following topics highlight frequently reported scenarios, configuration issues, or system behaviors that can affect normal operation. Reviewing these items can help quickly diagnose problems and reduce troubleshooting time. --- @@ -65,7 +65,7 @@ These cases have already been addressed in the current implementation. - Review the deployment error message to identify the affected object. - Check if the object has any structural differences (e.g., missing common fields like `Name`). -If you encounter a new conflicting object, further investigation or customization might be required. +If you encounter a new conflicting object, you may need to investigate further or customize the configuration. --- diff --git a/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md b/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md index 58b4536f5b..74c41dea83 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/non_triggerable_objects.md @@ -76,5 +76,5 @@ Each Change Log is marked as either: - **Non-Compliant** — if no approved Change Request can be associated with the update. :::important -A **Change Log isn't created when a data record is deleted**, because Salesforce doesn't generate **Field History records** for deleted records. +The system **doesn't create a Change Log when a data record is deleted**, because Salesforce doesn't generate **Field History records** for deleted records. ::: diff --git a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md index 73b31782c3..e6ac7585d0 100644 --- a/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md +++ b/docs/platgovsalesforce/changemanagement/datatracking/set_up_data_tracking.md @@ -31,7 +31,7 @@ Here are the requirements to set up Data Tracking: 1. **Enterprise Compliance** license. 2. Access to the **Netwrix Configuration** app. You must have the **Netwrix Administrator** and **Netwrix Grant Permissions** permission sets to access the app. - Access can be granted to user through the following path: + You can grant access through the following path: **Setup** > **Users** > **Permission Sets Assignments** > **Edit Assignments** ![You must have these permissions to open the Configuration tool](/images/platgovsalesforce/change_management/netwrix_permissions_assignment.webp) diff --git a/docs/platgovsalesforce/changemanagement/setting_up_policies.md b/docs/platgovsalesforce/changemanagement/setting_up_policies.md index b0a40e5cea..4fbdb424da 100644 --- a/docs/platgovsalesforce/changemanagement/setting_up_policies.md +++ b/docs/platgovsalesforce/changemanagement/setting_up_policies.md @@ -34,9 +34,7 @@ You can create a New Policy, or edit an existing one: - **Change Enablement Defaults** merge approval list, non conforming alerts, and sequential approval requests. - **System Information**, **Created By** and **Last Modified By** dates. Informational only, can't be edited. -After the policy is saved, **System Information** is added show the **Created By** and **Last -Modified By** user and time stamp. The information you entered on the form is shown on the -**Details** tab. The Related tab is available to add Customizations and view additional +After you save the policy, the **System Information** section displays the **Created By** and **Last Modified By** user and timestamp. The **Details** tab shows the information you entered on the form. The Related tab is available to add Customizations and view additional information and history. ### Information diff --git a/docs/platgovsalesforce/reports/reports_overview.md b/docs/platgovsalesforce/reports/reports_overview.md index 54d52dc77c..3412c857d8 100644 --- a/docs/platgovsalesforce/reports/reports_overview.md +++ b/docs/platgovsalesforce/reports/reports_overview.md @@ -22,8 +22,7 @@ You can define and save your own reports. - Customization objects have additional data to enable searching with complex queries. For example, search for _all objects with script dependencies that have not been used for six months_, _or all objects used by workflows_. -- You can filter test scripts from regular scripts. Test scripts can be queried to review test - coverage and determine if they being used. +- You can filter test scripts from regular scripts. You can query test scripts to review test coverage and determine if they are being used. :::note To access all reports, the following setting must be enabled: @@ -81,7 +80,7 @@ Compliant. - **Changes to Users**: Displays the changes to tracked user data fields. See [Enhanced CPQ Support](/docs/platgovsalesforce/changemanagement/datatracking/enhanced_cpq_support.md) for instructions on setting up tracking.

If you see the message: _--String too long - Skipped lines due to CPU limit reached--_ it -means the governor limits have been reached. Profiles and PermissionSets are very data heavy. +means you have reached the governor limits. Profiles and PermissionSets are very data heavy. Platform Governance for Salesforce skips the record and continues the scan the next day to ensure there is no impact to your org. @@ -194,14 +193,12 @@ These reports are available from **Netwrix Dashboard** **Reports** **Change En - **Approval Override**: shows all changes approved with an approval override. - **What Changed?**: shows all changes that have occurred. - **Unresolved Non-Compliant Changes**: displays open non-compliant changes. A non-compliant change -indicates something was changed without the required approvals. By looking at this report, you can -investigate changes and get an understanding of what the impacts are and see if any additional -changes need to be made. This report is used to track changes that require action. +indicates something was changed without the required approvals. Use this report to investigate changes, understand their impacts, and determine whether additional changes are needed. Use this report to track changes that require action. - **Managed Package Updates**: displays managed package update details for auditing. - **Resolved Non-Compliant Changes**: displays resolved non-compliant changes with the change overview and the difference summary. - **Compliant Changes**: displays all compliant changes. Compliant changes are automatically marked -as closed. This report is used to review changes that have been automatically cleared. +as closed. Use this report to review changes that have been automatically cleared. - **Consolidated Change By Type**: displays changes summarized and grouped by Salesforce Type. - **Deployed Changes**: displays an end to end summary of deployed changes to enable tracking and reporting of changes to the system. @@ -224,13 +221,11 @@ These reports are available from **Netwrix Dashboard** **Reports** **Release a ## Audit Reports - **Unresolved Non-Compliant Changes**: displays open non-compliant changes. A non-compliant change -indicates something was changed without the required approvals. By looking at this report, you can -investigate changes and get an understanding of what the impacts are and see if any additional -changes need to be made. This report is used to track changes that require action. +indicates something was changed without the required approvals. Use this report to investigate changes, understand their impacts, and determine whether additional changes are needed. Use this report to track changes that require action. - **Managed Package Updates**: displays managed package update details for auditing. - **Resolved Non-Compliant Changes**: displays managed package update details for auditing. - **Compliant Changes**: displays all compliant changes. Compliant changes are automatically marked as -closed. This report is used to review changes that have been automatically cleared. +closed. Use this report to review changes that have been automatically cleared. - **Platform Changes**: displays any platform changes that have occurred. - **Consolidated Changes By Type**: displays changes summarized and grouped by Salesforce Type. - **Deployed Changes**: displays an end to end summary of deployed changes to enable tracking and From cd2fccd02d7b132fb6878c28a36b9a0699b2ecef Mon Sep 17 00:00:00 2001 From: Hil-Ram-NWX <212961752+hilram7@users.noreply.github.com> Date: Wed, 8 Apr 2026 11:07:22 -0400 Subject: [PATCH 5/6] feat: auto-fix missing .md extensions on PRs + fix fs_sdd_delete pages (#720) * feat(md-autofix): scaffold script with detection functions and tests * feat(md-autofix): add link rewriting function with tests * feat(md-autofix): implement main loop and JSON output * feat(md-autofix): add workflow to auto-fix missing .md extensions on PRs * fix(docs): add .md extension and frontmatter to fs_sdd_delete (accessanalyzer 11.6, 12.0); fix KB links * fix(md-autofix): use mv + git add instead of git mv to support untracked files * chore: remove test files from md-autofix local testing * fix(vale): auto-fix substitutions and removals * fix(vale): auto-fix rewrites (AI-assisted) * fix(dale): auto-fix documentation issues (AI-assisted) * Potential fix for pull request finding 'CodeQL / Checkout of untrusted code in trusted context' Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> * fix(dale): auto-fix documentation issues (AI-assisted) * docs: convert blockquote warnings to :::warning admonitions Convert raw Markdown blockquote WARNING to Docusaurus :::warning admonition blocks in fs_sdd_delete.md for both 11.6 and 12.0. Co-Authored-By: Claude * fix(dale): auto-fix documentation issues (AI-assisted) * fix(workflow): checkout base branch to prevent untrusted code execution Tested locally: 17 unit tests passed, live script test confirmed rename and git staging of extensionless file, test article verified in dev server sidebar. * fix(dale): auto-fix documentation issues (AI-assisted) * fix(dale): auto-fix documentation issues (AI-assisted) --------- Co-authored-by: github-actions[bot] Co-authored-by: claude[bot] <41898282+claude[bot]@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <62310815+github-advanced-security[bot]@users.noreply.github.com> Co-authored-by: Claude --- .github/workflows/md-extension-autofix.yml | 156 ++++++++++++++++++ .../{fs_sdd_delete => fs_sdd_delete.md} | 31 ++-- .../admin/jobs/instantjobs/fs_sdd_delete.md | 27 +-- .../delete-sdd-matches.md | 8 +- scripts/md-extension-autofix.sh | 134 +++++++++++++++ scripts/test-md-extension-autofix.sh | 155 +++++++++++++++++ 6 files changed, 486 insertions(+), 25 deletions(-) create mode 100644 .github/workflows/md-extension-autofix.yml rename docs/accessanalyzer/11.6/admin/jobs/instantjobs/{fs_sdd_delete => fs_sdd_delete.md} (61%) create mode 100644 scripts/md-extension-autofix.sh create mode 100644 scripts/test-md-extension-autofix.sh diff --git a/.github/workflows/md-extension-autofix.yml b/.github/workflows/md-extension-autofix.yml new file mode 100644 index 0000000000..269c5aec91 --- /dev/null +++ b/.github/workflows/md-extension-autofix.yml @@ -0,0 +1,156 @@ +name: MD Extension Auto-Fix + +on: + pull_request: + types: [opened, synchronize] + branches: + - dev + +concurrency: + group: md-extension-autofix-${{ github.event.pull_request.number }} + +jobs: + md-extension-autofix: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: write + steps: + - name: Check if triggered by bot commit + id: bot-check + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + COMMIT=$(gh api repos/${{ github.repository }}/commits/${{ github.event.pull_request.head.sha }} \ + --jq '{message: .commit.message}') + MESSAGE=$(echo "$COMMIT" | jq -r '.message') + echo "Latest commit message: $MESSAGE" + if echo "$MESSAGE" | grep -qE '^fix\(docs\): add missing \.md extension'; then + echo "Skipping: commit is from md-extension-autofix workflow" + echo "skip=true" >> "$GITHUB_OUTPUT" + else + echo "skip=false" >> "$GITHUB_OUTPUT" + fi + + - name: Checkout PR branch + if: steps.bot-check.outputs.skip != 'true' + uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.base.ref }} + fetch-depth: 0 + + + - name: Configure git identity + if: steps.bot-check.outputs.skip != 'true' + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Get changed files in docs/ + id: changed-files + if: steps.bot-check.outputs.skip != 'true' + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER=${{ github.event.pull_request.number }} + CHANGED=$(gh pr diff "$PR_NUMBER" --name-only | grep -E '^docs/' || true) + if [ -z "$CHANGED" ]; then + echo "No docs/ files changed" + echo "count=0" >> "$GITHUB_OUTPUT" + else + echo "$CHANGED" > /tmp/changed-files.txt + echo "count=$(echo "$CHANGED" | wc -l | tr -d ' ')" >> "$GITHUB_OUTPUT" + fi + + - name: Run md-extension-autofix + id: autofix + if: steps.changed-files.outputs.count > 0 + run: | + chmod +x scripts/md-extension-autofix.sh + SUMMARY=$(./scripts/md-extension-autofix.sh /tmp/changed-files.txt) + echo "$SUMMARY" > /tmp/md-extension-summary.json + RENAMED_COUNT=$(echo "$SUMMARY" | jq '.renamed | length') + SKIPPED_COUNT=$(echo "$SUMMARY" | jq '.skipped | length') + echo "renamed=$RENAMED_COUNT" >> "$GITHUB_OUTPUT" + echo "skipped=$SKIPPED_COUNT" >> "$GITHUB_OUTPUT" + echo "Renamed: $RENAMED_COUNT, Skipped: $SKIPPED_COUNT" + + - name: Commit renamed files + id: commit + if: steps.autofix.outputs.renamed > 0 + run: | + if git diff --quiet && git diff --staged --quiet; then + echo "committed=false" >> "$GITHUB_OUTPUT" + else + git add -A docs/ + git commit -m "fix(docs): add missing .md extension to renamed files" + echo "committed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Push fixes + if: steps.commit.outputs.committed == 'true' + continue-on-error: true + env: + VALE_TOKEN: ${{ secrets.VALE_TOKEN }} + run: | + git remote set-url origin "https://x-access-token:${VALE_TOKEN}@github.com/${{ github.repository }}.git" + git push + + - name: Post PR comment + if: steps.changed-files.outputs.count > 0 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + PR_NUMBER=${{ github.event.pull_request.number }} + REPO=${{ github.repository }} + + RENAMED_COUNT=0 + SKIPPED_COUNT=0 + if [ -f /tmp/md-extension-summary.json ]; then + RENAMED_COUNT=$(jq '.renamed | length' /tmp/md-extension-summary.json) + SKIPPED_COUNT=$(jq '.skipped | length' /tmp/md-extension-summary.json) + fi + + # Nothing to report — exit silently + if [ "$RENAMED_COUNT" -eq 0 ] && [ "$SKIPPED_COUNT" -eq 0 ]; then + exit 0 + fi + + { + if [ "$RENAMED_COUNT" -gt 0 ]; then + echo "**Auto-fix: Missing \`.md\` extensions added**" + echo "" + echo "The following files were missing a \`.md\` extension and would not have appeared on the docs site. They've been renamed automatically:" + echo "" + echo "| Original filename | Renamed to |" + echo "|---|---|" + jq -r '.renamed[] | "| `\(.from)` | `\(.to | split("/") | last)` |"' /tmp/md-extension-summary.json + echo "" + echo "Links to these files in other pages have been updated. Please review the changes in the commit above." + fi + + if [ "$SKIPPED_COUNT" -gt 0 ]; then + if [ "$RENAMED_COUNT" -gt 0 ]; then echo ""; fi + echo "**Action needed: Possible missing \`.md\` extension**" + echo "" + echo "The following files were added to a docs directory without a \`.md\` extension, but couldn't be auto-renamed:" + echo "" + echo "| File | Reason |" + echo "|---|---|" + jq -r '.skipped[] | "| `\(.file)` | \(.reason) |"' /tmp/md-extension-summary.json + echo "" + echo "If these are markdown pages, add the \`.md\` extension and push again." + fi + } > /tmp/md-extension-comment.md + + # Delete previous comments from this workflow + COMMENT_IDS=$(gh api "repos/${REPO}/issues/${PR_NUMBER}/comments" \ + --jq '[.[] | select( + .user.login == "github-actions[bot]" and + (.body | (contains("Auto-fix: Missing `.md` extensions") or contains("Action needed: Possible missing `.md` extension"))) + ) | .id] | .[]' 2>/dev/null || true) + for ID in $COMMENT_IDS; do + gh api "repos/${REPO}/issues/comments/${ID}" -X DELETE 2>/dev/null || true + done + + gh pr comment "$PR_NUMBER" --repo "$REPO" --body-file /tmp/md-extension-comment.md diff --git a/docs/accessanalyzer/11.6/admin/jobs/instantjobs/fs_sdd_delete b/docs/accessanalyzer/11.6/admin/jobs/instantjobs/fs_sdd_delete.md similarity index 61% rename from docs/accessanalyzer/11.6/admin/jobs/instantjobs/fs_sdd_delete rename to docs/accessanalyzer/11.6/admin/jobs/instantjobs/fs_sdd_delete.md index e7acec3d49..1169360a09 100644 --- a/docs/accessanalyzer/11.6/admin/jobs/instantjobs/fs_sdd_delete +++ b/docs/accessanalyzer/11.6/admin/jobs/instantjobs/fs_sdd_delete.md @@ -1,5 +1,10 @@ +--- +title: "FS_SDD_DELETE Job" +description: "FS_SDD_DELETE Job" +sidebar_position: 45 +--- -# FS_SDD_DELETE Instant Job +# FS_SDD_DELETE Job The FS_SDD_DELETE instant job deletes Sensitive Data Discovery (SDD) data from the Tier 1 database for specified criteria, hosts, or combinations thereof. This job is available in the Instant Job Library under the File System library. @@ -7,34 +12,36 @@ The FS_SDD_DELETE instant job deletes Sensitive Data Discovery (SDD) data from t ## Runtime Details -- **Dependencies**: The 0.Collection Job Group must be successfully run before running this job +- **Dependencies**: Run the 0.Collection Job Group successfully before running this job - **Target Hosts**: None (select Local host) -- **Scheduling**: Can be run as desired, typically on an ad-hoc basis -- **History Retention**: Not supported and must be turned off +- **Scheduling**: Run as needed, typically on an ad-hoc basis +- **History Retention**: Not supported. Turn off history retention before running this job. - **Multi-console Support**: Not supported -- **Additional Notes**: This job performs permanent data deletion with no undo capability. All analysis tasks are disabled by default to prevent accidental data loss. +- **Additional Notes**: This job performs permanent data deletion with no undo capability. Access Analyzer disables all analysis tasks by default to prevent accidental data loss. -The FS_SDD_DELETE instant job provides a controlled method for removing Sensitive Data Discovery data from your Tier 1 database. Use this job to clean up SDD data for specific criteria, remove data associated with decommissioned hosts, or delete specific host-and-criteria combinations. Because this job permanently deletes data with no recovery option, all analysis tasks are disabled by default as a safety measure. +The FS_SDD_DELETE instant job provides a controlled method for removing Sensitive Data Discovery data from your Tier 1 database. Use this job to delete SDD data for specific criteria, remove data associated with decommissioned hosts, or delete specific host-and-criteria combinations. Because this job permanently deletes data with no recovery option, Access Analyzer disables all analysis tasks by default as a safety measure. ## Analysis Tasks for the FS_SDD_DELETE Job To see the analysis tasks for this job, navigate to **Jobs > Instant Job Library > File System > FS_SDD_DELETE** and select the **Analysis Tasks** tab. -> **WARNING**: This job permanently deletes data from the database. This action cannot be undone. All analysis tasks are disabled by default to prevent accidental data loss. Carefully review the data to be deleted before enabling and running any analysis task. +:::warning +This job permanently deletes data from the database. You can't undo this action. Access Analyzer disables all analysis tasks by default to prevent accidental data loss. Carefully review the data to be deleted before enabling and running any analysis task. +::: The following analysis tasks are available for the FS_SDD_DELETE job: -- **Delete Criteria** – Deletes all SDD data for specified criteria from all hosts. Use this task when you want to remove all occurrences of specific criteria across your entire environment. +- **Delete Criteria** – Deletes all SDD data for specified criteria from all hosts. Use this task to remove all occurrences of specific criteria across your entire environment. - **Delete Host** – Deletes all SDD data related to a specific host. Use this task when decommissioning a host or removing all SDD data associated with a particular system. -- **Remove Host & Criteria** – Deletes all SDD data for a specific host and criteria combination. Use this task for targeted removal of SDD data for a specific criterion on a specific host. +- **Remove Host & Criteria** – Deletes all SDD data for a specific host and criteria combination. Use this task to remove SDD data for a specific criterion on a specific host. ### Configuring the Analysis Tasks -Each analysis task requires manually populating temporary database tables before execution. Follow these steps to configure and run an analysis task: +Each analysis task requires manually populating temporary database tables before execution: 1. Open SQL Server Management Studio and connect to your Tier 1 database. 2. Determine which analysis task you need to run based on the data you want to delete. -3. Populate the required temporary table(s): +3. Populate the required temporary tables: - For **Delete Criteria**: Populate the `#Criteria` temporary table with the criteria names you want to delete - For **Delete Host**: Populate the `#hosts` temporary table with the host names you want to delete - For **Remove Host & Criteria**: Populate both the `#hosts` and `#Criteria` temporary tables with the specific host and criteria combinations @@ -43,5 +50,5 @@ Each analysis task requires manually populating temporary database tables before 6. Right-click the appropriate analysis task and select **Enable**. 7. Review the enabled task to verify it will delete the correct data. 8. Run the job by clicking **Run Job** and selecting **Local** as the target host. -9. After the job completes, verify the data has been deleted as expected. +9. After the job completes, verify the job deleted the data as expected. 10. Disable the analysis task to prevent accidental future deletions. diff --git a/docs/accessanalyzer/12.0/admin/jobs/instantjobs/fs_sdd_delete.md b/docs/accessanalyzer/12.0/admin/jobs/instantjobs/fs_sdd_delete.md index 6e0a7de4f4..1788f04a9d 100644 --- a/docs/accessanalyzer/12.0/admin/jobs/instantjobs/fs_sdd_delete.md +++ b/docs/accessanalyzer/12.0/admin/jobs/instantjobs/fs_sdd_delete.md @@ -1,5 +1,10 @@ +--- +title: "FS_SDD_DELETE Job" +description: "FS_SDD_DELETE Job" +sidebar_position: 45 +--- -# FS_SDD_DELETE Instant Job +# FS_SDD_DELETE Job The FS_SDD_DELETE instant job deletes Sensitive Data Discovery (SDD) data from the Tier 1 database for specified criteria, hosts, or combinations thereof. This job is available in the Instant Job Library under the File System library. @@ -7,26 +12,28 @@ The FS_SDD_DELETE instant job deletes Sensitive Data Discovery (SDD) data from t ## Runtime Details -- **Dependencies**: The 0.Collection Job Group must be successfully run before running this job +- **Dependencies**: Run the 0.Collection Job Group successfully before running this job - **Target Hosts**: None (select Local host) -- **Scheduling**: Can be run as desired, typically on an ad-hoc basis -- **History Retention**: Not supported and must be turned off +- **Scheduling**: Run as needed, typically on an ad-hoc basis +- **History Retention**: Not supported. Turn off history retention before running this job. - **Multi-console Support**: Not supported -- **Additional Notes**: This job performs permanent data deletion with no undo capability. All analysis tasks are disabled by default to prevent accidental data loss. +- **Additional Notes**: This job performs permanent data deletion with no undo capability. Access Analyzer disables all analysis tasks by default to prevent accidental data loss. -The FS_SDD_DELETE instant job provides a controlled method for removing Sensitive Data Discovery data from your Tier 1 database. Use this job to clean up SDD data for specific criteria, remove data associated with decommissioned hosts, or delete specific host-and-criteria combinations. Because this job permanently deletes data with no recovery option, all analysis tasks are disabled by default as a safety measure. +The FS_SDD_DELETE instant job provides a controlled method for removing Sensitive Data Discovery data from your Tier 1 database. Use this job to delete SDD data for specific criteria, remove data associated with decommissioned hosts, or delete specific host-and-criteria combinations. Because this job permanently deletes data with no recovery option, Access Analyzer disables all analysis tasks by default as a safety measure. ## Analysis Tasks for the FS_SDD_DELETE Job To see the analysis tasks for this job, navigate to **Jobs > Instant Job Library > File System > FS_SDD_DELETE** and select the **Analysis Tasks** tab. -> **WARNING**: This job permanently deletes data from the database. This action can't be undone. All analysis tasks are disabled by default to prevent accidental data loss. Carefully review the data to be deleted before enabling and running any analysis task. +:::warning +This job permanently deletes data from the database. You can't undo this action. Access Analyzer disables all analysis tasks by default to prevent accidental data loss. Carefully review the data to be deleted before enabling and running any analysis task. +::: The following analysis tasks are available for the FS_SDD_DELETE job: -- **Delete Criteria** – Deletes all SDD data for specified criteria from all hosts. Use this task when you want to remove all occurrences of specific criteria across your entire environment. +- **Delete Criteria** – Deletes all SDD data for specified criteria from all hosts. Use this task to remove all occurrences of specific criteria across your entire environment. - **Delete Host** – Deletes all SDD data related to a specific host. Use this task when decommissioning a host or removing all SDD data associated with a particular system. -- **Remove Host & Criteria** – Deletes all SDD data for a specific host and criteria combination. Use this task for targeted removal of SDD data for a specific criterion on a specific host. +- **Remove Host & Criteria** – Deletes all SDD data for a specific host and criteria combination. Use this task to remove SDD data for a specific criterion on a specific host. ### Configuring the Analysis Tasks @@ -43,5 +50,5 @@ Each analysis task requires manually populating temporary database tables before 6. Right-click the appropriate analysis task and select **Enable**. 7. Review the enabled task to verify it will delete the correct data. 8. Run the job by clicking **Run Job** and selecting **Local** as the target host. -9. After the job completes, verify the data has been deleted as expected. +9. After the job completes, verify the job deleted the data as expected. 10. Disable the analysis task to prevent accidental future deletions. diff --git a/docs/kb/accessanalyzer/file-system-and-sensitive-data-discovery/delete-sdd-matches.md b/docs/kb/accessanalyzer/file-system-and-sensitive-data-discovery/delete-sdd-matches.md index 806ab1ba79..4c2b6e2944 100644 --- a/docs/kb/accessanalyzer/file-system-and-sensitive-data-discovery/delete-sdd-matches.md +++ b/docs/kb/accessanalyzer/file-system-and-sensitive-data-discovery/delete-sdd-matches.md @@ -50,8 +50,10 @@ SET MatchData = NULL, ### Removing All SDD Matches Use the `FS_SDD_DELETE` instant job to remove SDD matches entirely: -- **NAA v12.0:** [InstantJobs\FS_SDD_DELETE](https://docs.netwrix.com/docs/accessanalyzer/12_0/admin/jobs/instantjobs/fs_sdd_delete) -- **NAA v11.6:** [InstantJobs\FS_SDD_DELETE](https://docs.netwrix.com/docs/accessanalyzer/11_6/admin/jobs/instantjobs/fs_sdd_delete) +- **Access Analyzer 12.0:** [FS_SDD_DELETE Job](https://docs.netwrix.com/docs/accessanalyzer/12_0/admin/jobs/instantjobs/fs_sdd_delete) +- **Access Analyzer 11.6:** [FS_SDD_DELETE Job](https://docs.netwrix.com/docs/accessanalyzer/11_6/admin/jobs/instantjobs/fs_sdd_delete) -## Related Link +## Related Links - [Configure the (SEEK) File System Scan Query](https://docs.netwrix.com/docs/accessanalyzer/12_0/solutions/filesystem/collection/seek_system_scans#configure-the-seek-file-system-scan-query) +- [FS_SDD_DELETE Job — Access Analyzer 12.0](https://docs.netwrix.com/docs/accessanalyzer/12_0/admin/jobs/instantjobs/fs_sdd_delete) +- [FS_SDD_DELETE Job — Access Analyzer 11.6](https://docs.netwrix.com/docs/accessanalyzer/11_6/admin/jobs/instantjobs/fs_sdd_delete) diff --git a/scripts/md-extension-autofix.sh b/scripts/md-extension-autofix.sh new file mode 100644 index 0000000000..faa6bd1b89 --- /dev/null +++ b/scripts/md-extension-autofix.sh @@ -0,0 +1,134 @@ +#!/usr/bin/env bash +# md-extension-autofix.sh — detect and fix missing .md extensions in docs/ files +# Usage: md-extension-autofix.sh +# Output: JSON summary to stdout +set -euo pipefail + +# Extensions that are intentionally non-markdown — never rename these +IGNORE_EXTENSIONS=("html" "htm" "py" "ps1" "plantuml" "tmp" "DS_Store" "png" "jpg" "jpeg" "webp" "gif" "svg" "pdf" "zip" "json" "js" "mjs" "ts" "sh" "yml" "yaml" "css" "txt" "xml" "csv" "lock") + +has_extension() { + local file="$1" + local basename + basename=$(basename "$file") + [[ "$basename" == *.* ]] +} + +is_ignored_extension() { + local file="$1" + local basename ext + basename=$(basename "$file") + ext="${basename##*.}" + if [ "$ext" = "$basename" ]; then + return 1 # no extension + fi + for ignored in "${IGNORE_EXTENSIONS[@]}"; do + if [ "$ext" = "$ignored" ]; then + return 0 + fi + done + return 1 +} + +is_markdown_content() { + local file="$1" + local has_frontmatter=0 + local has_heading=0 + if head -10 "$file" | grep -qE '^---'; then + has_frontmatter=1 + fi + if grep -qE '^#{1,6} ' "$file"; then + has_heading=1 + fi + [ "$has_frontmatter" -eq 1 ] && [ "$has_heading" -eq 1 ] +} + +rewrite_links_in_docs() { + local old_basename="$1" + local new_basename="$2" + local expr1="s|](\([^)]*\)${old_basename})|](\1${new_basename})|g" + local expr2="s|](\([^)#]*\)${old_basename}#|](\1${new_basename}#|g" + # macOS BSD sed requires `sed -i ''`; GNU sed (Linux/CI) uses `sed -i` + if [[ "$(uname -s)" == "Darwin" ]]; then + find docs/ -name '*.md' -exec sed -i '' -e "$expr1" -e "$expr2" {} + + else + find docs/ -name '*.md' -exec sed -i -e "$expr1" -e "$expr2" {} + + fi +} + +# Allow sourcing for tests +case "${1:-}" in + --test) + return 0 2>/dev/null || exit 0 + ;; +esac + +CHANGED_FILES_LIST="${1:?Usage: md-extension-autofix.sh }" + +if [ ! -f "$CHANGED_FILES_LIST" ]; then + echo '{"renamed": [], "skipped": []}' + exit 0 +fi + +RENAMED_FROM=() +RENAMED_TO=() +SKIPPED_FILES=() +SKIP_REASONS=() + +while IFS= read -r file; do + # Only process files inside docs/ + [[ "$file" == docs/* ]] || continue + + # Skip deleted files + [ -f "$file" ] || continue + + # Skip files that already have an extension + has_extension "$file" && continue + + # Skip files with a known non-markdown extension + is_ignored_extension "$file" && continue + + new_file="${file}.md" + + # Skip if destination already exists + if [ -f "$new_file" ]; then + SKIPPED_FILES+=("$file") + SKIP_REASONS+=("$(basename "$new_file") already exists in the same folder") + continue + fi + + # Skip if content doesn't look like markdown + if ! is_markdown_content "$file"; then + SKIPPED_FILES+=("$file") + SKIP_REASONS+=("Content doesn't look like markdown — please check and rename manually if needed") + continue + fi + + # Rename and rewrite links + # Use mv + git add instead of git mv so it works for both tracked and untracked files + mv "$file" "$new_file" + git add "$new_file" + git rm --cached "$file" 2>/dev/null || true + rewrite_links_in_docs "$(basename "$file")" "$(basename "$new_file")" + + RENAMED_FROM+=("$file") + RENAMED_TO+=("$new_file") + +done < "$CHANGED_FILES_LIST" + +# Output JSON summary +RENAMED_JSON="[" +for i in "${!RENAMED_FROM[@]}"; do + [ "$i" -gt 0 ] && RENAMED_JSON+="," + RENAMED_JSON+="{\"from\": \"${RENAMED_FROM[$i]}\", \"to\": \"${RENAMED_TO[$i]}\"}" +done +RENAMED_JSON+="]" + +SKIPPED_JSON="[" +for i in "${!SKIPPED_FILES[@]}"; do + [ "$i" -gt 0 ] && SKIPPED_JSON+="," + SKIPPED_JSON+="{\"file\": \"${SKIPPED_FILES[$i]}\", \"reason\": \"${SKIP_REASONS[$i]}\"}" +done +SKIPPED_JSON+="]" + +echo "{\"renamed\": ${RENAMED_JSON}, \"skipped\": ${SKIPPED_JSON}}" diff --git a/scripts/test-md-extension-autofix.sh b/scripts/test-md-extension-autofix.sh new file mode 100644 index 0000000000..29d6bd3eef --- /dev/null +++ b/scripts/test-md-extension-autofix.sh @@ -0,0 +1,155 @@ +#!/usr/bin/env bash +# test-md-extension-autofix.sh — unit tests for md-extension-autofix.sh +set -euo pipefail + +# Source just the functions (--test mode skips the main script logic) +source "$(dirname "$0")/md-extension-autofix.sh" --test + +PASS=0 +FAIL=0 + +assert_true() { + local label="$1" + local result="$2" + if [ "$result" = "0" ]; then + PASS=$((PASS + 1)) + else + FAIL=$((FAIL + 1)) + echo "FAIL (expected true): $label" + fi +} + +assert_false() { + local label="$1" + local result="$2" + if [ "$result" != "0" ]; then + PASS=$((PASS + 1)) + else + FAIL=$((FAIL + 1)) + echo "FAIL (expected false): $label" + fi +} + +# ---- has_extension ---- + +has_extension "docs/kb/some-article" && R=$? || R=$? +assert_false "no extension: docs/kb/some-article" "$R" + +has_extension "docs/kb/some-article.md" && R=$? || R=$? +assert_true "has extension: .md" "$R" + +has_extension "docs/kb/.DS_Store" && R=$? || R=$? +assert_true "has extension: .DS_Store (hidden file with ext)" "$R" + +has_extension "docs/kb/script.ps1" && R=$? || R=$? +assert_true "has extension: .ps1" "$R" + +# ---- is_ignored_extension ---- + +is_ignored_extension "docs/kb/article.ps1" && R=$? || R=$? +assert_true "ignored: .ps1" "$R" + +is_ignored_extension "docs/kb/diagram.plantuml" && R=$? || R=$? +assert_true "ignored: .plantuml" "$R" + +is_ignored_extension "docs/kb/advisory.html" && R=$? || R=$? +assert_true "ignored: .html" "$R" + +is_ignored_extension "docs/kb/no-extension" && R=$? || R=$? +assert_false "not ignored: no extension" "$R" + +is_ignored_extension "docs/kb/article.md" && R=$? || R=$? +assert_false "not ignored: .md" "$R" + +# ---- is_markdown_content ---- + +TMPDIR_TEST=$(mktemp -d) + +# File with both frontmatter and heading → markdown +cat > "$TMPDIR_TEST/good.md" <<'EOF' +--- +title: Test +--- + +# My Heading + +Some content here. +EOF +is_markdown_content "$TMPDIR_TEST/good.md" && R=$? || R=$? +assert_true "markdown: has frontmatter and heading" "$R" + +# File with only heading, no frontmatter → not markdown +cat > "$TMPDIR_TEST/no-frontmatter" <<'EOF' +# My Heading + +Some content here. +EOF +is_markdown_content "$TMPDIR_TEST/no-frontmatter" && R=$? || R=$? +assert_false "not markdown: heading only, no frontmatter" "$R" + +# File with only frontmatter, no heading → not markdown +cat > "$TMPDIR_TEST/no-heading" <<'EOF' +--- +title: Test +--- + +Some content here with no heading. +EOF +is_markdown_content "$TMPDIR_TEST/no-heading" && R=$? || R=$? +assert_false "not markdown: frontmatter only, no heading" "$R" + +# Empty file → not markdown +touch "$TMPDIR_TEST/empty" +is_markdown_content "$TMPDIR_TEST/empty" && R=$? || R=$? +assert_false "not markdown: empty file" "$R" + +# PowerShell script → not markdown +cat > "$TMPDIR_TEST/script.ps1" <<'EOF' +param([string]$AgentPath) +Write-Host "Installing agent..." +Start-Process $AgentPath +EOF +is_markdown_content "$TMPDIR_TEST/script.ps1" && R=$? || R=$? +assert_false "not markdown: powershell script" "$R" + +rm -rf "$TMPDIR_TEST" + +# ---- rewrite_links_in_docs ---- + +TMPDIR_LINKS=$(mktemp -d) +mkdir -p "$TMPDIR_LINKS/docs/product/1.0" + +# File that links to the old extensionless path +cat > "$TMPDIR_LINKS/docs/product/1.0/overview.md" <<'EOF' +--- +title: Overview +--- + +# Overview + +See [delete matches](delete-sdd-matches) for details. +Also see [this page](../other/delete-sdd-matches) and [anchored](delete-sdd-matches#section). +EOF + +# Run rewrite from inside the temp dir +(cd "$TMPDIR_LINKS" && rewrite_links_in_docs "delete-sdd-matches" "delete-sdd-matches.md") + +# Check plain link was rewritten +grep -q '](delete-sdd-matches.md)' "$TMPDIR_LINKS/docs/product/1.0/overview.md" && R=0 || R=1 +assert_true "link rewrite: plain link updated" "$R" + +# Check anchored link was rewritten +grep -q '](delete-sdd-matches.md#section)' "$TMPDIR_LINKS/docs/product/1.0/overview.md" && R=0 || R=1 +assert_true "link rewrite: anchored link updated" "$R" + +# Check relative path link was rewritten +grep -q '](../other/delete-sdd-matches.md)' "$TMPDIR_LINKS/docs/product/1.0/overview.md" && R=0 || R=1 +assert_true "link rewrite: relative path link updated" "$R" + +rm -rf "$TMPDIR_LINKS" + +echo "" +echo "Results: $PASS passed, $FAIL failed" +if [ "$FAIL" -gt 0 ]; then + exit 1 +fi From 224e11584087c27372b4a6f10b9587f94815afac Mon Sep 17 00:00:00 2001 From: jth-nw Date: Wed, 8 Apr 2026 10:44:57 -0500 Subject: [PATCH 6/6] build-and-deploy on PRs to main --- .github/workflows/build-and-deploy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-and-deploy.yml b/.github/workflows/build-and-deploy.yml index 3af88da5ae..64480d69e1 100644 --- a/.github/workflows/build-and-deploy.yml +++ b/.github/workflows/build-and-deploy.yml @@ -8,6 +8,7 @@ on: pull_request: branches: - dev + - main workflow_dispatch: inputs: environment: