> ## Documentation Index
> Fetch the complete documentation index at: https://learn.nextedy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SAFe Solution Trains

> Reference for Nextedy PLANNINGBOARD's **SAFe Solution Trains** plans mode (`SAFE_SOLUTION`).

## Overview

The **SAFe Program Increments in Solution** (`SAFE_SOLUTION`) plans mode loads Program Increment plans at the **solution level** — that is, from the portfolio project that sits above individual ART program projects in the Polarion SAFe project hierarchy. Columns represent coordinated PIs spanning all ARTs; swimlanes can be configured to show either Programs (ARTs) or Teams within the solution portfolio.

<Frame>
  <img src="https://mintcdn.com/none-17b4493f/vfRg9jxXRntLqZFW/planningboard/diagrams/reference/plans-modes/safe-solutions/diagram-1.svg?fit=max&auto=format&n=vfRg9jxXRntLqZFW&q=85&s=c886d6bcfcfe0175270c9691a384887a" alt="SAFe Solution Train board layout: columns PI-2401, PI-2402, and PI-2403 as coordinated PI plans, with swimlane rows for Program A, Program B, and Program C each showing their cards per PI column" width="680" height="330" data-path="planningboard/diagrams/reference/plans-modes/safe-solutions/diagram-1.svg" />
</Frame>

<Note title="Requires Polarion SAFe Solution">
  **SAFe Program Increments in Solution** (`SAFE_SOLUTION`) mode requires the Siemens Polarion SAFe Solution to be enabled and a valid SAFe portfolio hierarchy to be configured in Polarion. Without it, the mode cannot discover portfolio, program, or team projects.
</Note>

***

## Plans Mode Value

| Property                              | Value                                                                                                                             |
| ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| Widget parameter name                 | `plansMode`                                                                                                                       |
| Mode identifier                       | `SAFE_SOLUTION`                                                                                                                   |
| Internal enum name (`PlansMode.java`) | `safeSIs`                                                                                                                         |
| Description                           | SAFe Program Increments in Solution mode — displays PI planning at the solution portfolio level, coordinated across multiple ARTs |
| Config class default                  | `PROJECT_PLANS`                                                                                                                   |

Set the widget parameter `plansMode` to `SAFE_SOLUTION` to activate this mode.

***

## How Plans Are Loaded

In **SAFe Program Increments in Solution** (`SAFE_SOLUTION`) mode, Planningboard identifies the **portfolio project** from the current Polarion project's SAFe hierarchy and loads PI-level plans from that portfolio. The data service (`PlanningBoardDataService`) uses the `SAFE_SOLUTION` planning model to:

1. Detect the SAFe portfolio root for the current project via portfolio detection logic.
2. Retrieve all program-level project IDs within the portfolio.
3. Load PI plans from the portfolio scope, filtered to the plan count window defined by `lastPlans` and `nextPlans`.
4. Assign work items to swimlanes based on the configured SAFe assignment mode.

<Warning title="Plan names with dashes">
  SAFe naming conventions commonly produce plan names such as `PI-2401` or `PI-2401-1` (containing dashes). A parsing bug affecting these names was partially addressed in version **23.8.0** and **fully resolved in version 25.3.0**. On earlier versions, dash-containing plan names cause incorrect column spans, zero capacity display, and missing plan shortcuts. Upgrade to 25.3.0 or later before deploying solution-train boards with standard SAFe naming conventions.
</Warning>

***

## Compatible Swimlane Assignment Modes

**SAFe Program Increments in Solution** (`SAFE_SOLUTION`) mode is designed for use with the following assignment modes. Other assignment modes (such as **Users (Assignee)** (`ASSIGNEE`) or **Parent Item** (`PARENT`)) are available but are not the primary intent of solution-train boards.

| Assignment Mode             | `assignmentMode` value | Description                                                                                                  | Required fields                   |
| --------------------------- | ---------------------- | ------------------------------------------------------------------------------------------------------------ | --------------------------------- |
| SAFe Programs               | `SAFE_PROGRAMS`        | Swimlanes represent SAFe programs (ARTs) within the solution portfolio. Intended for portfolio-level boards. | `safeProgramField`                |
| SAFe Team (program scope)   | `SAFE_TEAM`            | Swimlanes represent SAFe teams within the current program, sourced from Polarion SAFe Solution data.         | `safeTeamField`                   |
| SAFe Train Team (ART scope) | `SAFE_TRAIN_TEAM`      | Swimlanes represent teams within a specific ART, filtered by ART ID.                                         | `safeTeamField`, ART ID parameter |

### SAFe Programs Assignment Mode

When `assignmentMode` is set to `SAFE_PROGRAMS`, each swimlane represents one SAFe program (ART) in the solution. Planningboard reads the program assignment from the field identified by `safeProgramField` on each work item.

| Property               | Type    | Default        | Description                                                                                               |
| ---------------------- | ------- | -------------- | --------------------------------------------------------------------------------------------------------- |
| `safeProgramField`     | string  | `safeProgram`  | Custom field ID that stores the SAFe Program assignment on work items. Must be a valid Polarion field ID. |
| `showEmptySwimlanes`   | boolean | `false`        | When `true`, programs with no cards in the visible PI range are still shown as rows.                      |
| `swimlaneSort`         | string  | `alphabetical` | Sort order for program swimlanes.                                                                         |
| `collapsibleSwimlanes` | boolean | `true`         | Allows users to collapse individual program rows.                                                         |

### SAFe Team Assignment Modes

When `assignmentMode` is `SAFE_TEAM` or `SAFE_TRAIN_TEAM`, each swimlane represents a team. The team assignment is read from `safeTeamField` on each work item.

| Property               | Type    | Default        | Description                                                                                        |
| ---------------------- | ------- | -------------- | -------------------------------------------------------------------------------------------------- |
| `safeTeamField`        | string  | `safeTeam`     | Custom field ID storing the SAFe Team assignment on work items. Must be a valid Polarion field ID. |
| `showEmptySwimlanes`   | boolean | `false`        | When `true`, teams with no items in the visible PI range appear as empty rows.                     |
| `swimlaneSort`         | string  | `alphabetical` | Sort order for team swimlanes.                                                                     |
| `collapsibleSwimlanes` | boolean | `true`         | Allows users to collapse individual team rows.                                                     |

For `SAFE_TRAIN_TEAM` specifically, an ART ID parameter must be supplied to filter teams to a single ART. Refer to [SAFe Train Team Mode](/planningboard/reference/assignment-modes/safe-train-team-mode) for the ART ID field details.

***

## Widget Parameters

The following widget parameters are relevant when configuring a solution-train board. See [SAFe Parameters](/planningboard/reference/widget-parameters/safe-parameters) for the complete SAFe parameter reference and [Plans (Columns) Parameters](/planningboard/reference/widget-parameters/plans-parameters) for all plan-column parameters.

### Plans (Columns) Parameters

| Parameter   | Type   | Default                                                                          | Description                                                                                |
| ----------- | ------ | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
| `plansMode` | string | `PROJECT_PLANS`                                                                  | Set to `SAFE_SOLUTION` to activate solution-train PI mode.                                 |
| `lastPlans` | number | `1`                                                                              | Number of past (completed) PI plans to include as columns.                                 |
| `nextPlans` | number | `5`                                                                              | Number of upcoming PI plans to include as columns.                                         |
| `planLink`  | string | `/polarion/#/project/${plan.objectId.projectId}/plan?id=${plan.objectId.itemId}` | URL template for linking column headers to Polarion Plans. Supports `${plan.*}` variables. |

### Swimlane (Rows) Parameters

| Parameter              | Type    | Default        | Description                                                                          |
| ---------------------- | ------- | -------------- | ------------------------------------------------------------------------------------ |
| `assignmentMode`       | string  | `ASSIGNEE`     | Set to `SAFE_PROGRAMS`, `SAFE_TEAM`, or `SAFE_TRAIN_TEAM` for SAFe swimlanes.        |
| `safeProgramField`     | string  | `safeProgram`  | Field ID for SAFe program assignment (used with `SAFE_PROGRAMS` mode).               |
| `safeTeamField`        | string  | `safeTeam`     | Field ID for SAFe team assignment (used with `SAFE_TEAM` / `SAFE_TRAIN_TEAM` modes). |
| `showEmptySwimlanes`   | boolean | `false`        | Show swimlanes with no cards.                                                        |
| `collapsibleSwimlanes` | boolean | `true`         | Enable collapsible swimlane rows.                                                    |
| `swimlaneSort`         | string  | `alphabetical` | Swimlane row sort order.                                                             |

### Work Items Parameters

| Parameter  | Type   | Default   | Description                                                             |
| ---------- | ------ | --------- | ----------------------------------------------------------------------- |
| `query`    | string | `NOT *:*` | Lucene query filtering which work items appear on the board.            |
| `wiType`   | string | none      | Restrict cards to a specific work item type (e.g., `feature`, `story`). |
| `maxItems` | number | `1000`    | Maximum number of work items loaded onto the board.                     |

### Capacity Parameters

| Parameter           | Type    | Default | Description                                                                                                                                    |
| ------------------- | ------- | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| `capacityLoad`      | boolean | `false` | Enable capacity/effort tracking per swimlane and PI column.                                                                                    |
| `multiCapacityLoad` | boolean | `false` | Enable per-swimlane capacity tracking across multiple PI plans simultaneously.                                                                 |
| `capacityField`     | string  | none    | Custom field ID for capacity values (e.g., story points). When unset, time tracking fields (`remainingEstimate` / `initialEstimate`) are used. |
| `hoursPerDay`       | number  | `8`     | Working hours per day used in effort-to-day conversions.                                                                                       |
| `useTeamsService`   | boolean | `false` | Enable integration with the Planningboard Teams Service for team-based capacity data.                                                          |

<Warning title="Capacity limitations in SAFe modes">
  The capacity bar in **SAFe Program Increments in Solution** (`SAFE_SOLUTION`) mode reflects aggregate effort across the swimlane and PI column. Multi-assignee effort distribution (splitting effort across several users) is not currently supported. Parallel PI capacity calculation may also differ from Nextedy GANTT behavior. See [Capacity Parameters](/planningboard/reference/widget-parameters/capacity-parameters) for full details.
</Warning>

***

## SAFe Project Hierarchy Detection

Planningboard uses internal SAFe hierarchy detection (via `SAFeImpl`) to identify the portfolio context and enumerate programs and teams. The detection logic works as follows:

<Frame>
  <img src="https://mintcdn.com/none-17b4493f/vfRg9jxXRntLqZFW/planningboard/diagrams/reference/plans-modes/safe-solutions/diagram-2.svg?fit=max&auto=format&n=vfRg9jxXRntLqZFW&q=85&s=8249078679c675c7261a18b4651871b6" alt="SAFe portfolio hierarchy tree: Portfolio Project at the root, branching into Program A and Program B (ARTs), each branching into their team projects (Team A1/A2 and Team B1/B2)" width="740" height="300" data-path="planningboard/diagrams/reference/plans-modes/safe-solutions/diagram-2.svg" />
</Frame>

The board's scope is determined by the project in which the Planningboard widget is embedded:

* When embedded in the **portfolio project**: all programs and their PI plans are in scope.
* When embedded in a **program project**: the portfolio is detected upward; PI plans from the portfolio are loaded, and team filtering can be applied.

Portfolio-level Lucene queries are built as `project.id:(portfolioId)`. Program IDs and team IDs are retrieved as space-separated strings and used internally for work item filtering.

***

## Configuration Example

The following example configures a solution-train board at the portfolio level, with SAFe Programs as swimlanes, showing the last 1 and next 3 PIs, with capacity tracking enabled.

```properties theme={null}
# Plans mode
plansMode=SAFE_SOLUTION
lastPlans=1
nextPlans=3

# Swimlanes: SAFe Programs (ARTs)
assignmentMode=SAFE_PROGRAMS
safeProgramField=safeProgram
showEmptySwimlanes=false
collapsibleSwimlanes=true
swimlaneSort=alphabetical

# Work items
query=type:feature OR type:story
maxItems=1000

# Capacity
capacityLoad=true
capacityField=storyPoints
hoursPerDay=8
```

<Tip title="Page Parameters and Program Increment Parameter ID">
  In some SAFe configurations, the widget requires a **Page Parameter** to pass the current Program Increment ID dynamically (for example, when a page hosts boards for multiple PIs). Create a Page Parameter in the widget's page settings and reference it via the Program Increment Parameter ID field. Without this, the board may default to the wrong PI range. See [SAFe Parameters](/planningboard/reference/widget-parameters/safe-parameters) for the relevant parameter field.
</Tip>

***

## Comparison with Related Plans Modes

| Mode                                                                               | `plansMode` value  | Scope                                | Typical use                             |
| ---------------------------------------------------------------------------------- | ------------------ | ------------------------------------ | --------------------------------------- |
| [SAFe Sprints (Program)](/planningboard/reference/plans-modes/safe-sprints)        | `SAFE_SPRINTS`     | Iteration plans within a single ART  | Team sprint planning at program level   |
| [SAFe Sprints (Portfolio)](/planningboard/reference/plans-modes/safe-sprints)      | `SAFE_PFL_SPRINTS` | Iteration plans at portfolio level   | Cross-ART sprint overview               |
| [SAFe Program Increments (Program)](/planningboard/reference/plans-modes/safe-pis) | `SAFE_PIS`         | PI plans within a single ART         | PI planning within one program          |
| **SAFe Solution Trains**                                                           | `SAFE_SOLUTION`    | PI plans at solution/portfolio level | PI planning coordinated across all ARTs |
| [Project Plans](/planningboard/reference/plans-modes/project-plans)                | `PROJECT_PLANS`    | Standard project-based plans         | Non-SAFe sprint and release planning    |

***

## Limitations

* **No multi-assignee effort distribution.** Capacity bars reflect total effort per swimlane; effort is not split across multiple assignees within a single card.
* **Parallel PI capacity.** Capacity calculations across overlapping PIs may differ from Nextedy GANTT behavior. If your ARTs run concurrent PIs, validate capacity results against GANTT before relying on the numbers.
* **Plan names with dashes.** Fully supported from version **25.3.0** onward. Earlier versions have rendering issues with plan names matching SAFe naming patterns (e.g., `PI-2401`).
* **SAFe Solution requires Polarion SAFe.** The **SAFe Program Increments in Solution** (`SAFE_SOLUTION`), **Programs (SAFe)** (`SAFE_PROGRAMS`), **Program / Solution Teams (SAFe)** (`SAFE_TEAM`), and **Agile Release Train Teams (SAFe)** (`SAFE_TRAIN_TEAM`) modes require the Polarion SAFe Solution license and a valid SAFe project hierarchy. They cannot be used with standard Polarion project structures.
* **Configuration UI changes by plans mode.** When switching between **Project Plans** (`PROJECT_PLANS`) and SAFe modes in the widget parameter panel, some fields appear or disappear (e.g., plan stemming and sync-to-parent are only shown in **Project Plans** (`PROJECT_PLANS`) mode; the SAFe PI increment field appears only in **SAFe Sprints in Program** (`SAFE_SPRINTS`) / **SAFe Sprints in Portfolio** (`SAFE_PFL_SPRINTS`) modes). This is expected widget behavior, not an error.

***

## Related Pages

* [Plans Modes](/planningboard/reference/plans-modes/index) — overview of all plans modes
* [SAFe Program Increments](/planningboard/reference/plans-modes/safe-pis) — PI planning at program level
* [SAFe Sprints](/planningboard/reference/plans-modes/safe-sprints) — iteration-level SAFe planning
* [SAFe Programs Mode](/planningboard/reference/assignment-modes/safe-programs-mode) — swimlane assignment by SAFe program
* [SAFe Team Mode](/planningboard/reference/assignment-modes/safe-team-mode) — swimlane assignment by SAFe team
* [SAFe Train Team Mode](/planningboard/reference/assignment-modes/safe-train-team-mode) — swimlane assignment filtered by ART
* [SAFe Parameters](/planningboard/reference/widget-parameters/safe-parameters) — all SAFe-specific widget parameters
* [Capacity Parameters](/planningboard/reference/widget-parameters/capacity-parameters) — capacity configuration reference

<Accordion title="Sources">
  **KB Articles**

  * Swimlane Assignment Types

  **Support Tickets**

  * [#5879](https://support.nextedy.com/helpdesk/tickets/5879)
  * [#4711](https://support.nextedy.com/helpdesk/tickets/4711)
  * [#6685](https://support.nextedy.com/helpdesk/tickets/6685)

  **Source Code**

  * `PlanningBoardWidgetRenderer.java`
  * `PlansMode.java`
  * `PlanningBoardDataService.java`
  * `Config.java`
  * `PlanningBoardWidgetDependenciesProcessor.java`
</Accordion>
