- Post History
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
2 hours ago - edited 2 hours ago
Our first post introduced AI Identified Risks in Project Workspace. The most common question since then has been the one we left at a high level: what exactly does the AI look at, and why does it sometimes find nothing?
This article walks through the topics it considers, how far back it looks, where the thresholds live, and what the severity labels mean.
How Risks Are Generated
A set of rule-based checks run against your project data first and produce plain-language findings, like “this task is 12 days past its end date”, “this resource is at 140% in October”. Only those findings go to the model, along with your project details and the risks already on your RIDAC register. The AI’s job is to group related findings into well-written risks with an impact, probability, rationale, and suggested mitigation plan.
Each run follows a six-step pipeline. Steps 2 to 4 are deterministic, they use rules and thresholds to turn project data into short insight statements. Step 5 is a single LLM call that consolidates those statements into risks.
Output Structure
The final output per run consists of:
- Risks: Up to five risks, each with
short_description,description,probability,impact,mitigation_planand an HTMLai_rationale. - Record Links:
numberToSysIdMapsreturned alongside the risks so record numbers in the rationale render as clickable links.
Data Fetch Window
AI Identified Risks uses the project insights cadence to size its data window. NARIDACGenerationContextualDataProvider.fetchConfigDetails() reads the project's email insight configuration (sn_spm_gen_ai_email_insight_config). If one exists, run_type sets the cadence and report_configurations sets effort_type and heatmap_view. If none exists, the defaults below apply.
How to Read This Guide
Each data source is presented with the following information:
- What It Fetches: A plain-language description of the data loaded.
- Fetch Query: The table, access type and filter conditions used.
- Fields Loaded: The columns read for each record.
- When It Fires: The conditions under which an insight is produced from that data.
- Default Configuration: The thresholds in effect.
- Data Scope: What date range or project scope bounds the fetch.
- Severity and Sent to the LLM As: How urgency is labelled and what the prompt receives.
All 12 RIDAC Data Sources at a Glance
Detailed Breakdown of Each Data Source
The following sections take a closer look at each of the 12 RIDAC data sources:
Context Data (Risks and Project Details):
Why You Might See No Risks
Cause 1: No Configured Threshold Is Crossed
The project data does not cross any configured threshold. Risks are generated only from issues found in project tasks, milestones, resource assignments and financials, based on the thresholds defined in the risk assessment configuration (for example, tasks or milestones delayed by at least 1 day, resources allocated above 101 percent, or a budget or cost variance). If no issue is found, the AI is instructed to return no risks.
Where: NARiskGenerationLLMService.getRIDACRiskAssessmentConfig() (script include function).
Cause 2: The Issues Are Already Covered by Existing Risks
The AI is instructed not to create risks that duplicate or overlap risks already on the project, including AI risks that were accepted earlier.
Where: Project RIDAC generation skill (prompt instructions).
Cause 3: There Is Not Enough Project Content for the AI to Provide Insights
In this case, the request returns the message "There is not enough content for AI to provide insights" and no risks are created.
Where: NARiskGenerationLLMService.errorHandler() (script include function).
Cause 4: The AI Response Contains No Risks, or the Response Is Not in the Expected Format
Risks are read only from the risks list in the AI response. If the list is empty or the response cannot be read, the message "No risks were generated" is shown.
Where: NARiskGenerationLLMService._extractRisks() (script include function).
Cause 5: The User Does Not Have Permission to Create Risk Records
Risks are saved using the logged-in user's access rights. If a create ACL on the risk table blocks the insert, the record is not created and no error is shown.
Where: NARisksGenerationDataService.saveRisks() (script include function).
Quickest Way to Prove It End to End: Take a test project, set a task’s end date to last week, leave the actual end date empty, and click "Generate AI Risks." That’s the simplest condition that should produce a draft.
I hope this helps clarify how AI Identified Risks evaluates project data and generates risks. Have feedback or questions? Drop them in the comments below!
Related Articles
- AI Identified Risks in Project Workspace
- Project Insights Engine: Configuration and Severity Levels
- Project Insights Engine: What Gets Surfaced and Why
