Yogesh Shinde
ServiceNow Employee

 

What is the Group Action Framework β€” and why does it exist?

When an AI agent handles a support ticket in isolation, it has context for only that one record. It cannot see that forty similar incidents were logged in the past two weeks, what resolution worked across that cluster, or what pattern of short descriptions signals a specific infrastructure problem. That single-record blindspot limits the quality of AI-generated summaries, resolution steps, and recommendations.

Group Action Framework (GAF) is a feature on the Now Platform that clusters related records β€” incidents, cases, KB articles β€” using machine learning, then executes LLM-driven actions on those clusters to generate summaries, resolution steps, and pattern-level insights. It gives Now Assist AI agents and Agentic Workflows access to cross-record knowledge rather than single-record context.

GAF operates through five modular skills that run in sequence:

Skill What it does
Grouping skill Clusters related records using machine learning techniques
Topic-labeling skill Applies LLM-generated, human-readable names to each cluster (e.g., "Email server down")
Action strategy skill Selects representative records from each cluster for deeper processing
Action mapper skill Runs LLM inference on the selected representative records to extract insights
Action reducer skill Consolidates mapper outputs into a single cluster-level summary

This output β€” cluster-level summaries and representative record sets β€” is what Now Assist AI agents and Agentic Workflows consume. Skills like Generate Resolution Plan and Suggested Steps for ITSM rely on GAF to surface patterns across similar tickets before generating a recommendation. Without GAF running, those skills operate on single-record context only, or return no output at all.


You activated GAF β€” but is it actually running?

You followed the setup guide, ran the activation script, and ticked all the checkboxes. But when you navigate to the clustering output table, it is empty. The scheduled jobs may or may not be there. The skill config records exist, but nothing is clustering.

When this happens β€” skill configs seeded but activation incomplete β€” sn_gaf_record_group stays empty and agents receive no cluster-level context. Working through each prerequisite layer in sequence is the only way to isolate where activation stalled.

This article walks through every verification layer in the order the official documentation prescribes.


Five things teams get wrong about GAF

Misconception Reality
"If sn_nowassist_skill_config records exist, GAF is active" Those records confirm GAF is seeded, not activated. Activation requires running the GAFUtils background script with valid skill IDs, and AI Search must be indexed first.
"GAF works automatically after installing Now Assist for ITSM" GAF requires explicit activation via a background script and AI Search configuration before it produces any clustering output.
"An empty sn_gaf_record_group means activation failed" Most often it means the offline flow has not run yet, or fewer than 2,000 eligible records exist in the target table β€” both recoverable conditions, not failures.
"predictGroup() can verify clustering for any record" predictGroup() only works on new or unclustered records. It returns undefined for records already processed by the offline flow β€” that is expected behavior, not an error.
"Both offline and online scheduled jobs are always created after activation" Only GAF – Run Offline Flow is confirmed in official documentation. A second online flow job may appear depending on instance configuration and use case, but it is not guaranteed on all instances.

GAF Activation Verification Runbook

Work through these steps in order. Each step confirms one layer of the activation chain. Do not skip to later steps before the earlier ones are confirmed β€” a missing prerequisite silently invalidates everything downstream.

Required role: sn_aia.admin plus admin


Before you start β€” confirm AI Search is ready

This is the step most teams skip β€” and it is the leading cause of silent GAF failures. Official documentation states: "AI Search is the backup search for certain workflows, and if it is not enabled and ready, GAF will not return any results." Complete all prerequisite steps before running the activation script.

Step P1 β€” Verify AI Search status

Navigate to All > AI Search > AI Search Status and confirm the page reads "AI Search is ready." If it does not, request AI Search installation. Installation can take between 2 and 24 hours.

Step P2 β€” Install Now Assist for AI Search

Install a Now Assist application that includes Now Assist in AI Search. Refer to the Install Now Assist in AI Search guide in the official ServiceNow documentation.

Step P3 β€” Activate the embedding model

Navigate to the Semantic Index Configuration table:

Navigate to:

ais_semantic_index_configuration.list

Filter by Indexed Source for the table you want to cluster (for example, Incident) and by the Semantic Index Name for that table. Set Active to true.

To find the correct Semantic Index Name: open the Indexed Source record for your target table and read the value in the Name field. For the Incident table, the documented value is body.

Step P4 β€” Index the target table

Navigate to All > AI Search > AI Search Index > Indexed Source, filter by the name of your target table, open the record, and click Index All Tables.

Step P5 β€” Confirm indexing completed

Check the Indexed Source History related list on that record. Both Keyword Ingestion State and Semantic Ingestion State must show Indexed before proceeding to Step 1.


Step 1: Check for skill config records

Navigate to:

sn_nowassist_skill_config.list

Filter by Name contains grouping. You should see records such as GAF ITSM grouping and GAF HR grouping if GAF has been seeded for those applications.

Presence of these records alone does not confirm activation. It only confirms that GAF configuration was seeded on the instance β€” typically as part of a Now Assist application install.

Step 2: Confirm the activation script was run

Navigate to System Definition > Scripts - Background. Before running the script, retrieve the groupSkillId and actionSkillId values from the sn_nowassist_skill_config table β€” copy the sys_id of the grouping skill record and the action strategy skill record for your use case.

Activation script (from official documentation):

var groupSkillId = "";       // Replace with sys_id of GAF grouping skill config
var actionSkillId = "";      // Replace with sys_id of GAF action strategy skill config
var topicSkillId = "43bce9e477e012103f075cea5b5a998f";  // Constant β€” do not change

new sn_gaf.GAFUtils().activate(groupSkillId, topicSkillId, actionSkillId, "run_once");

The topicSkillId value 43bce9e477e012103f075cea5b5a998f is a platform-provided constant confirmed in the official configure-gaf documentation. Do not replace it. On a test instance, this sys_id corresponds to the GAF topics skill config record β€” the topic-labeling skill responsible for applying LLM-generated, human-readable names to clusters.

After execution, the system log may display entries similar to the following:

sn_gaf_sysauto_script insert
sys_trigger insert
GAFutils activated skill config IDs for Group skill with ID ...
The above log messages reflect observed output from field deployments and are not guaranteed text documented by ServiceNow. If you see log entries referencing GAF activation and sysauto_script insertions, the script executed successfully. Absence of these specific strings does not indicate failure β€” confirm scheduled job creation in Step 3.

Step 3: Verify scheduled jobs

Navigate to:

sysauto_script.list

Filter by Name contains GAF. On a test instance, a successful activation produces the following job types β€” all confirmed in sysauto_script:

  • GAF – Run Offline Flow β€” the primary clustering job; may appear as multiple records with different schedules (Periodically every ~28 days, Once, or On Demand) depending on how many times activation was run
  • GAF ML Training Job β€” created per activation run with run type "Once"; handles ML model training for clustering
  • List GAF group process new records β€” runs Daily; processes newly created records against existing clusters
A "Preemptive Online Flow" job does not exist on a test instance and is not confirmed in official ServiceNow documentation. If you encounter references to it, treat it as unverified. For offline clustering use cases, GAF – Run Offline Flow is the job to monitor.

Remediation if no GAF scheduled jobs appear: Re-run the activation script from Step 2 with valid groupSkillId and actionSkillId values. Scheduled jobs are created as part of activation script execution β€” if they are missing, the script either was not run or ran with empty skill IDs.


Step 4: Run the offline flow (if needed)

If the offline flow has not run since activation, execute it manually:

  1. Navigate to sysauto_script.list
  2. Search for GAF – Run Offline Flow
  3. Open the record and click Execute Now
  4. Wait a few minutes, then proceed to Step 5
Important: At least 2,000 eligible records are recommended in the target table for GAF to produce clustering output. This is stated in the official configure-gaf documentation. If your instance has fewer records, the offline flow may complete without creating groups.

Step 5: Check for clustering output

Navigate to:

sn_gaf_record_group.list

Look for:

  • Recent entries matching the last offline flow run date
  • Populated Description fields containing LLM-generated, human-readable cluster names β€” for example, on a test instance: "Login failure after Alectri update", "Mobile app performance and access issues", "Delayed price updates in cart causing checkout errors". The number of groups and their sizes will vary by instance depending on data volume and clustering criteria
  • Group Skill ID referencing the grouping skill (for example, GAF ITSM grouping)
  • Non-empty Group size field. Note: the Quality field is empty on all records on a test instance β€” do not rely on it as a confirmation signal

If sn_gaf_record_group is empty, no clustering has been executed yet. Remediation steps:

  1. Go to sysauto_script.list
  2. Search for GAF – Run Offline Flow
  3. Open the record and click Execute Now
  4. Wait a few minutes, then check:
    • sn_gaf_record_group β€” for group clusters
    • sn_gaf_record_group_detail β€” for record-to-group mappings

If still empty after running the flow, verify:

  • The skill config is correctly linked to a valid task table (for example, incident, case)
  • There are at least 2,000 eligible records in that table with meaningful short descriptions
  • The groupSkillId used in the activation script was not left blank
  • The topicSkillId was not modified from the platform-provided constant

Step 6: Confirm record assignment

Navigate to:

sn_gaf_record_group_detail.list

Confirm that incident records are listed with Group Skill ID referencing the grouping skill (for example, GAF ITSM grouping) and Active set to true.

On a test instance, the Document ID column in this table renders as a display value in the format Incident: INCxxxxxxx (for example, Incident: INC0822569). When querying this field programmatically in Step 7, you must use the underlying sys_id of the incident record β€” not the INC number.


Step 7: Verify group membership for a specific record

Use this script in Scripts - Background to confirm whether a specific record has been assigned to a group. Replace <incident_sys_id> with the sys_id of the record you want to check.

Check group membership for a record:

var gr = new GlideRecord('sn_gaf_record_group_detail');
gr.addQuery('document_id', '<incident_sys_id>');
gr.query();
while (gr.next()) {
    gs.info("Record is part of group: " + gr.getValue('record_group'));
}

The document_id field links the clustered record (for example, an incident) to its group. If the script returns group IDs, the record is clustered. Each output line references the sys_id of a group in sn_gaf_record_group:

*** Script: Record is part of group: 48f40abc0fb2aa10ba24c9d530d1b2e0
*** Script: Record is part of group: 22f81def3b4f6a50c74142c643e45ab2
*** Script: Record is part of group: 7d68e5f03bb22e10c74142c643e45a47
*** Script: Record is part of group: b3f642dc3ba66610c74142c643e45aa5
*** Script: Record is part of group: ece642d80faee210ba24c9d530d1b29b
*** Script: Record is part of group: 5d7b0b7d3b6a2610c74142c643e45a00

It is possible for a single record to appear in multiple groups if:

  • The clustering logic was run more than once (for example, manually triggered multiple times)
  • The record matched more than one clustering criterion (overlapping topics or similarity thresholds)
  • Multiple skill configs or flows are active simultaneously (for example, ITSM and HR grouping)

To inspect a specific group, navigate to:

https://<InstanceName>.service-now.com/sn_gaf_record_group_list.do?sysparm_query=sys_id=<group_id>

Optional: Use predictGroup() for new records

Use predictGroup() only for new or unclustered records. It will return undefined for records already processed by the offline flow β€” this is expected behavior, not an error. To test prediction logic on a new, unclustered record:

Prediction test for a new, unclustered record:

var gaf = new sn_gaf.GAFPrediction();
var result = gaf.predictGroup("<new_record_sys_id>", "<groupSkillId>");
gs.info("GAF Prediction Result: " + JSON.stringify(result));

Troubleshooting reference

Problem Likely cause Fix
sn_gaf_record_group is empty after running the offline flow Fewer than 2,000 eligible records in the target table, or groupSkillId was blank when activation script ran Verify record count and re-run activation script with a valid groupSkillId
No GAF scheduled jobs in sysauto_script Activation script ran with empty skill IDs, or was never run Re-run activation script with both groupSkillId and actionSkillId populated
GAF produces no results despite jobs being active AI Search prerequisites not completed β€” embedding model inactive or tables not indexed Complete prerequisite Steps P1–P5 in the AI Search section above
predictGroup() returns undefined Record was already processed by the offline flow β€” expected behavior Use the sn_gaf_record_group_detail GlideRecord script in Step 7 instead
Only one scheduled job appears after activation Online clustering not enabled for this use case β€” offline flow is the confirmed default No action needed if you only require offline clustering

Resources

Resource Where
Configure Group Action Framework ServiceNow Docs β€” configure-gaf (Yokohama)
Set up AI Search for GAF ServiceNow/ServiceNowDocs β€” setup-ai-search-gaf.md (GitHub)
Group Action Framework overview ServiceNow Docs β€” group-action-framework
GAF FAQ ServiceNow Community β€” GAF FAQ
Group-Action Framework plugin ServiceNow Store β€” sn_gaf

Three takeaways

  1. AI Search is a hard dependency, not optional. GAF produces no results if AI Search is not enabled and the target table is not indexed with both Keyword and Semantic Ingestion State at "Indexed." This prerequisite is stated explicitly in official documentation and is the leading cause of silent GAF failures.
  2. Skill config records confirm seeding, not activation. Running the GAFUtils background script with valid skill IDs is what creates the scheduled jobs and triggers clustering. Seeding and activation are separate states.
  3. An empty sn_gaf_record_group is a starting point, not a verdict. Work through the checklist in order β€” AI Search indexing, activation script execution, scheduled job presence, record count, and flow execution β€” before concluding that activation failed.

Start here: Navigate to All > AI Search > AI Search Status and confirm "AI Search is ready" before touching anything else. If AI Search is not ready, everything downstream β€” scheduled jobs, clustering, prediction β€” will silently produce nothing.

1 Comment