You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/advanced/cli-reference.md
+7-1Lines changed: 7 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -60,6 +60,7 @@ rushti --tasks FILE [options] # 'run' is the default command
60
60
|`--force`|`-f`| FLAG |`false`| Bypass exclusive mode checks and run immediately. |
61
61
|`--optimize`|| CHOICE |*(none)*| Enable task optimization with a scheduling algorithm: `longest_first` or `shortest_first`. |
62
62
|`--no-checkpoint`|| FLAG |`false`| Disable checkpoint saving for this run. |
63
+
|`--detailed-results`|| FLAG |`false`| When pushing results to TM1, emit one row per executed TI instead of summarizing expanded tasks. Each row gets a fresh sequential `task_id`; the original `task_id` is preserved in the new `original_task_id` measure. See the [TM1 integration docs](../features/tm1-integration.md#detailed-results) for the join contract. |
63
64
|`--tm1-instance`|| STR |*(none)*| Read task file from TM1 instead of disk. Requires `--workflow`. |
64
65
|`--workflow`|`-W`| STR |*(none)*| Workflow identifier. Defaults to JSON metadata `workflow` field or the taskfile filename stem if omitted. Required when using `--tm1-instance`. |
65
66
|`--log-level`|`-L`| CHOICE |`INFO`| Override log level for this run. |
Generate an interactive HTML dashboard with Gantt charts, success rates, and execution trends. Automatically opens the dashboard in the default browser.
288
+
Generate an interactive HTML dashboard with Gantt charts, success rates, and execution trends, plus a companion DAG visualization rebuilt from the latest run's recorded predecessors. Automatically opens the dashboard in the default browser.
|`--output`|`-o`| PATH | Output HTML file path (default: `visualizations/rushti_dashboard_<id>.html`) |
299
300
|`--settings`|`-s`| PATH | Path to `settings.ini`|
300
301
302
+
!!! info "DAG reflects the latest executed run"
303
+
Both the dashboard and the DAG are sourced from the stats database — not from the live taskfile or TM1 cube definition. Editing a workflow definition without re-running it will not update either visualization. Re-run the workflow to refresh.
304
+
305
+
When a task expanded via MDX wildcards (one parent task fanned out to N executions), the DAG now renders **one node per executed TI**, suffixing shared `task_id` values (`2.1`, `2.2`, `2.3`). Predecessors fan out to all expansions of the parent. Earlier versions deduped by `task_id`, hiding fan-out and making the DAG appear unchanged across edits to expandable parameters.
Starting with the version that introduces `--detailed-results`, the JSON taskfile schema rejects non-integer `task_id` values. RushTI was always intended to use numeric IDs — the `rushti_task_id` cube dimension is pre-populated with integer-named elements `"1".."5000"` and result rows can only land in the cube if their `task_id` matches an element. Earlier releases were lax about this; the validator now enforces it explicitly.
111
+
112
+
**Accepted forms:**
113
+
114
+
- JSON integer: `"id": 5`
115
+
- Integer-shaped string: `"id": "5"`
116
+
117
+
**Rejected (now raises a `TaskfileValidationError` at parse time):**
118
+
119
+
| Bad value | Reason |
120
+
|-----------|--------|
121
+
|`"id": 0`| Zero is not a positive integer; cube dimension starts at 1 |
122
+
|`"id": -3`| Negatives have no cube element |
123
+
|`"id": "05"`| Leading-zero strings don't match the integer-named cube elements (`"5"` not `"05"`) |
124
+
|`"id": 5.0`| Floats are not integers |
125
+
|`"id": "task-1"`| Non-integer string |
126
+
|`"id": "abc"`| Non-integer string |
127
+
128
+
The same rule applies to entries in `predecessors`.
129
+
130
+
### How to Migrate Legacy Taskfiles
131
+
132
+
If your taskfile uses string IDs like `"task-1"`, `"extract-load"`, or `"e1"`, rewrite them as integers (`1`, `2`, `3`, ...) and update every `predecessors` reference accordingly. The order doesn't matter — pick whatever sequence is convenient.
- Task 0: 'id' must be a positive integer. Got: 'extract-1'. Task IDs must be positive integers (the rushti_task_id cube dimension uses integer member names).
157
+
```
158
+
159
+
---
160
+
161
+
## TM1 Model Auto-Upgrade
162
+
163
+
`rushti build` is now non-destructive by default. When you upgrade RushTI to a release that adds new measure elements (e.g. `original_task_id`), the next `rushti build --tm1-instance <inst>` patches the existing model in place:
164
+
165
+
-**Dimensions.** Missing measure elements are added; existing elements and their attribute values are left alone. Cube data is preserved.
166
+
-**`}rushti.load.results`.** The TI process is application-owned and is always replaced with the latest body — TI processes are stateless, so this is safe.
167
+
-**`--force`.** Still wipes and rebuilds dimensions and the cube (data loss). Use only on dev/test environments.
168
+
169
+
You don't need a separate command — bare `rushti build` does the right thing. CI/CD pipelines that run `rushti build` on every release continue to work across version upgrades without manual intervention.
Copy file name to clipboardExpand all lines: docs/advanced/settings-reference.md
+4-1Lines changed: 4 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -119,6 +119,7 @@ Controls TM1-based read/write integration: reading task files from a TM1 cube an
119
119
|---------|------|---------|-------------|
120
120
|`push_results`| bool |`false`| Upload the results CSV to the TM1 Applications folder after each run. The file is named `rushti_{workflow}_{run_id}.csv` (with `.blb` extension for TM1 < v12). |
121
121
|`auto_load_results`| bool |`false`| After uploading results (requires `push_results = true`), call the `}rushti.load.results` TI process on the target TM1 instance to load the CSV into the rushti cube. Passes `pSourceFile` and `pTargetCube` parameters. The process must exist on the target instance. |
122
+
|`detailed_results`| bool |`false`| Emit one cube row per executed TI when pushing results, instead of summarizing expanded tasks (only meaningful with `push_results = true`). Each row gets a fresh sequential `task_id`; the original IDs are preserved in the new `original_task_id` measure. See [TM1 integration: detailed results](../features/tm1-integration.md#detailed-results). |
122
123
|`default_tm1_instance`| str |*(none)*| Default TM1 instance name (from `config.ini`) used for reading task files and writing results. Required when `push_results` is enabled. |
123
124
|`default_rushti_cube`| str |`rushti`| Name of the TM1 cube for task definitions and execution results. Created by the `rushti build` command. |
124
125
|`default_workflow_dim`| str |`rushti_workflow`| Dimension name for workflow identifiers. |
@@ -128,7 +129,9 @@ Controls TM1-based read/write integration: reading task files from a TM1 cube an
128
129
129
130
**Overridable via CLI:**`--tm1-instance`, `--workflow` / `-W`
130
131
131
-
**Overridable via JSON task file:**`push_results`, `auto_load_results`
132
+
**Overridable via CLI:**`--detailed-results`
133
+
134
+
**Overridable via JSON task file:**`push_results`, `auto_load_results`, `detailed_results`
132
135
133
136
!!! info "Setting Up TM1 Integration"
134
137
Run `rushti build --tm1-instance <instance>` to create the required dimensions and cube automatically before enabling `push_results`.
Copy file name to clipboardExpand all lines: docs/features/dag-execution.md
+3Lines changed: 3 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -139,6 +139,8 @@ Open the HTML file in any browser to see an interactive graph with:
139
139
- Click a node to see task details (instance, process, parameters)
140
140
- Search and filter by task ID or process name
141
141
142
+
`rushti tasks visualize` shows the **definition** (one node per task in the file). For a post-execution view that includes MDX expansions as separate nodes, use `rushti stats visualize --workflow <id>` instead — that one rebuilds the DAG from the latest recorded run, with one node per executed TI.
143
+
142
144
### Validate Before Running
143
145
144
146
Check for structural problems without connecting to TM1:
@@ -184,3 +186,4 @@ Settings are resolved in priority order: CLI arguments > JSON task file settings
-**[Task File Basics](../getting-started/task-files.md)** — Complete format reference (JSON and TXT)
186
188
-**[Self-Optimization](optimization.md)** — Let RushTI learn from past runs and optimize task ordering
189
+
-**[TM1 Integration: Detailed Results](tm1-integration.md#detailed-results)** — Per-execution rows in the cube for expanded tasks, joined via `original_task_id`
Copy file name to clipboardExpand all lines: docs/features/tm1-integration.md
+36Lines changed: 36 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -320,6 +320,42 @@ ExecuteCommand(cmd, 1);
320
320
321
321
---
322
322
323
+
## Detailed Results
324
+
325
+
By default, when a workflow uses [expandable tasks](../advanced/advanced-task-files.md) (parameters with the `*` suffix), all expansions of one parent task share the same `task_id` and the cube load step collapses them into a single summary row per original `task_id`. This is the only viable behaviour with the cube's `task_id` dimension, but it hides per-execution detail (individual durations, which specific parameter combo failed, retry counts per expansion).
326
+
327
+
The `--detailed-results` flag (or `detailed_results = true` in `settings.ini` / the taskfile `settings` block) flips this: every executed TI gets its own row in the cube.
328
+
329
+
### What Changes in the Cube
330
+
331
+
-**One row per executed TI.** A workflow `[1, 2*(60), 3]` produces 62 rows instead of 3.
332
+
-**Sequential gap-free `task_id`.** All rows are renumbered starting at 1 (`1..62`).
333
+
-**`original_task_id` measure preserves identity.** Every row carries the pre-renumber ID, so the 60 expansions of `2*` all show `original_task_id = "2"`.
334
+
-**`predecessors` references `original_task_id`.** Downstream tasks reconcile fan-in by joining `predecessors` against `original_task_id` in the same view — not against the new `task_id`.
335
+
-**The stats DB is unchanged.** Results in the local SQLite/DynamoDB store remain keyed by the original `task_id`. The renumbering is purely a presentation step at upload time.
336
+
337
+
The new `original_task_id` measure is added to the `rushti_measure` dimension automatically the next time you run `rushti build` (the upgrade is non-destructive — existing cube data is preserved). The `}rushti.load.results` TI is also rewritten to populate the new column.
338
+
339
+
### Cross-Run Stability
340
+
341
+
`task_id` values under detailed-results are **not stable across runs** — if the MDX in an expandable task returns a different number of members between runs, every renumbered ID downstream shifts. This is by design. The stable identity that survives across runs is the workflow definition stored under the `Input` element of the `rushti_run_id` dimension. For cross-run analysis, join through that input snapshot, the `task_signature` field in the stats DB, or the `original_task_id` measure.
342
+
343
+
### Stage Grouping Recommendation
344
+
345
+
Assign a unique `stage` value per expandable task so the fan-out groups visually in the cube. Every expansion inherits the parent's stage and lands together in views.
346
+
347
+
### Dimension Sizing
348
+
349
+
The `rushti_task_id` dimension defaults to 5,000 members. A workflow whose detailed-results renumbering exceeds 5,000 will fail to load into the cube — extend the dimension before enabling detailed-results on very wide workflows. RushTI does not auto-grow the dimension at upload time and does not perform extra TM1 round-trips to detect this case.
350
+
351
+
### DAG Visualization Mirrors the Same Behavior
352
+
353
+
`rushti stats visualize` rebuilds the DAG from the latest run's recorded predecessors. When that run involved expansions, the DAG now renders **one node per executed TI**, suffixing shared `task_id` values (`2.1`, `2.2`, `2.3`) and fanning predecessor edges out to every expansion of the parent. This is the visual analog of `--detailed-results` in the cube: per-execution rows in the cube ↔ per-execution nodes in the DAG.
354
+
355
+
The stats database is the single source of truth for both the dashboard and the DAG. Editing the workflow definition (in the cube or in a JSON file) without re-running it will **not** refresh either visualization — re-run the workflow to update.
356
+
357
+
---
358
+
323
359
## Customize Further
324
360
325
361
-**[Statistics & Dashboards](statistics.md)** — The local SQLite database that feeds TM1 integration
Always use integers (`"1"`, `"2"`, `"3"`, ...) for task IDs. This keeps things simple and is required if you plan to use [expandable parameters](../advanced/advanced-task-files.md) with MDX expressions.
32
+
!!! warning "Task IDs must be positive integers"
33
+
`id` must be a positive integer (`1`, `2`, `3`, ...) — either a JSON integer (`"id": 1`) or an integer-shaped string (`"id": "1"`). Zero, negatives, leading-zero strings (`"05"`), floats, and non-numeric strings (`"task-1"`, `"abc"`) are rejected at parse time. Predecessors must follow the same rule.
34
+
35
+
The reason is concrete: the `rushti_task_id` cube dimension is pre-populated with integer-named elements `"1".."5000"`. Result rows can only land in the cube if their `task_id` matches an existing dimension element. See the [migration guide](../advanced/migration-guide.md) if you have legacy taskfiles using string IDs.
0 commit comments