testdata_generator¶
Generates synthetic Jira issue JSON files in Jira REST API format.
The generated files can be processed directly by transform_data and are
suitable for development, testing, and demonstrations without real Jira data.
Status: available (Beta)
Manuals¶
| Language | Download |
|---|---|
| Deutsch (DE) | Benutzerhandbuch |
| English (EN) | User Manual |
| Română (RO) | Manual de Utilizator |
| Português (PT) | Manual do Utilizador |
| Français (FR) | Manuel d'utilisation |
Interface¶

Start¶
GUI¶
Or via the start script in the portable package:
- Windows:
TestdataGenerator.bat - macOS:
TestdataGenerator.command - Linux:
TestdataGenerator.sh
Command line¶
python -m testdata_generator \
--workflow workflow_ART_A.txt \
--project ART_A_GEN \
--issues 200 \
--seed 42 \
--output ART_A_generated.json
Parameters¶
| Parameter | Default | Description |
|---|---|---|
--scenario portfolio |
(none) | Generate the complete demo portfolio instead of a single JSON (see below) |
--workflow FILE |
(required without --scenario) |
Workflow definition file |
--output FILE.json |
<project>_generated.json |
Output file |
--project KEY |
TEST |
Jira project key |
--issues N |
100 |
Number of issues to generate |
--from-date YYYY-MM-DD |
2025-01-01 |
Earliest creation date |
--to-date YYYY-MM-DD |
2025-12-31 |
Latest transition date |
--issue-types TYPE:W … |
Feature:0.6 Bug:0.3 Enabler:0.1 |
Issue types with weights |
--completion-rate FLOAT |
0.7 |
Fraction of closed issues (0–1) |
--todo-rate FLOAT |
0.15 |
Fraction of open issues in To Do stages (0–1) |
--backflow-prob FLOAT |
0.1 |
Probability of backward transitions (0–1) |
--seed INT |
(random) | Seed for reproducible output |
--mean-cycle-days FLOAT |
(none) | Target mean cycle time in days (lognormal) |
--std-cycle-days FLOAT |
(30 % of mean) | Standard deviation of cycle time |
--pattern PATTERN |
none |
Flow anti-pattern: none / triangle / flat_triangle / cluster / batch |
--pi-duration-weeks INT |
12 |
PI cycle length in weeks (for cluster/batch) |
--realism 0–100 |
0 |
Untidiness of the stage paths (skips, cancels, parking, self-loops, reopening); about 70 is like a real ART |
--continue OLD.json |
(none) | Continue an earlier extract up to --to-date (since 0.39.0); --issues = number of NEW issues, --rate-per-day alternative |
--rate-per-day FLOAT |
(rate of the first window) | With --continue: new issues per day |
--learn-from FILE.xlsx |
(none) | Learn a transition profile from a real transitions file and stop (since 0.41.0); writes <name>_profile.json |
--transition-profile PROFILE.json |
(none) | Generate or continue with a learned profile: paths and dwell times from the data |
Flow Patterns¶
Use --mean-cycle-days together with --pattern to simulate typical flow anti-patterns:
| Pattern | Description |
|---|---|
none |
Random cycle time without shape (default) |
triangle |
Cycle time increases linearly over time — triangle shape in the scatter plot |
flat_triangle |
Like triangle, but the increase flattens toward the end (tanh) |
cluster |
Deliveries cluster in the last 2 weeks of each PI (Beta distribution) |
batch |
PI clustering with highly variable cycle time (0.1× to 3× mean) |
# Triangle pattern with mean cycle time of 30 days
python -m testdata_generator \
--workflow workflow.txt \
--pattern triangle \
--mean-cycle-days 30 \
--std-cycle-days 10 \
--output triangle.json
Portfolio scenario¶
GUI: the Demo portfolio section at the bottom of the window generates
the complete scenario into a folder of your choice (the seed field is
honoured, default 42) — Open Portfolio Report renders the portfolio
report, Open Delta Briefing renders the shipped
snapshot_prev/now.json pair into the "what changed?" briefing, and
Open Conference Pre-Read the VSC bundle — each opening in the
browser. Two clicks from empty folder to a full portfolio
evaluation, no command line needed.
Command line:
Creates a complete, consistent demo portfolio in one step: two solutions with
three ARTs each, including every artifact of the processing chain — workflow
files, raw Jira JSON, IssueTimes/CFD/Transitions workbooks, two solution
configs (Solution Beta with its own stage_map, schema 2), a ROAM risk
register per solution (risks_alpha.json/risks_beta.json), an NFR/runway
register per solution (nfr_alpha.json/nfr_beta.json), a capability map
per solution (capabilities_alpha.json/capabilities_beta.json), a
dependency register per solution
(dependencies_alpha.json/dependencies_beta.json), a decision/assumption
log per solution (decisions_alpha.json/decisions_beta.json), a portfolio
config, a PI config, and a README describing the built-in stories. The data window is
placed relative to the generation date so the portfolio report's quality
traffic light rates the sources as current.
Built-in stories (deterministic per seed):
- ART Alpha-3 is the outlier (~3× cycle time) — highlighted red in Solution Alpha's comparison report.
- ART Beta-3 delivers weak data (no CFD, few started issues, data 60 days
old) — confidence
lowin the quality table, coverage below 100 %. - Solution Beta pools via its own
stage_map; Solution Alpha uses the default classification path. - ROAM board: both risk registers together hold nine risks; two owned risks are deliberately old (45/50 days) — the aging highlight fires.
- NFR & runway: six NFRs and four runway elements; Beta's API NFR is violated and one runway element is an overdue gap — the dashboard shows red.
- Capability map: six capabilities; Beta's data-insights capability is critical (weak source) and one Alpha capability has no contributing ART — flagged as uncovered.
- Dependency heatmap: five dependencies; Alpha-1 → Alpha-3 is blocked and overdue (the outlier does not deliver), and Beta-1 → Alpha-1 is a cross-solution integration — visible in the portfolio report.
- Decision log: three decisions and two assumptions; Alpha's stage-map decision supersedes an older one, and Beta's open assumption has passed its review date — flagged red as "review due".
- Flow-problem backlog (B6, VSC):
flow_problems_alpha/beta.json— FP-A1 and FP-B1 have survived 3 resp. 4 conferences (the workshop pattern "logged, never mitigated" — flagged red), FP-B1 is cross-VS;--conference preread.htmlrenders the conference pre-read. - Strategic themes & roadmap (B7, VSC):
themes_alpha/beta.json— Alpha's theme "Green operations" is orphaned (declared & forgotten), EP-A9 is a zombie initiative; the matrix shows trains × P1·P2·Y1·Y2·Y3. In the delta briefing: EP-A9 lost its theme, EP-B2 was pulled from P2 to P1 (updated roadmaps). - SLO & error budgets:
slo_alpha.json/slo_beta.json— Beta's "Order Sync API" breaches its SLO, Alpha's "Checkout" has nearly burned its budget (at risk). - DORA & code quality:
dora_alpha.json/dora_beta.json— ART Beta-3 is low tier in the delivery picture too (CFR 38 %, MTTR 30 h, coverage 31 %, rating D); producible/exchangeable viapython -m sources fetch(providers: file, prometheus, github, gitlab, sonarqube — combinable). - Delta briefing:
snapshot_prev.json(the same world two weeks earlier) andsnapshot_now.jsonship with the scenario —python -m portfolio --delta snapshot_prev.json snapshot_now.jsonshows the throughput since, Beta-3's confidence decaying medium → low, AD-1 escalating at_risk → blocked, risk BR-2 appearing, and the runway gap and assumption AS-B1 turning newly overdue.
The folder is directly usable: python -m portfolio demo/portfolio.json
builds the portfolio report; the solution configs also work individually.
Realistic stage paths (since 0.38.0)¶
A real ART does not walk neatly through every stage. Measured on the real ART_A (458 issues, 9 stages): 40 distinct transition pairs, 12 % backward, 7.5 % self-loops, 358 jumps over at least one stage, 149 entries into the final stage without closing, median 4 transitions per issue. The generator before 0.38.0 produced 11 pairs, 0 % loops, median 7.
--realism (0–100) scales eight disturbances of the path: jumps over stages, cancellations
straight into the final stage, parking in a side-track stage (recognised by name: Blocker,
Blocked, On Hold, Waiting …), self-loops, backflow over several stages, reopening, a start
outside the first working stage, and the move from closing into the final stage
(Releasing → Done). 0 is the previous behaviour (only --backflow-prob), about 70
matches the real ART_A — the calibration is pinned by tests. Path and time are separate:
the disturbances apply in every mode, including the flow patterns, where the cycle time is
spread over the longer or shorter path.
The portfolio scenario builds its six ARTs with realism 60 since 0.38.0 (profile field
realism, overridable per ART). Seeds produce different data than before 0.38.0 — the
order of random draws changed.
Continuation — the second extract (since 0.39.0)¶
A generated raw data set is an extract taken on T1. --continue produces the extract one
would have taken on T2 — exactly as if the data had been pulled manually twice:
- The past is untouchable: keys, creation dates and every transition up to T1 stay byte for byte; closed and cancelled issues are not touched at all.
- Open issues move on: new transitions after T1 under the same path and time model (realism, backflow, cycle time) until they finish or T2 is reached — whatever would fall after T2 stays open.
- New issues join in (T1, T2] with continuing keys; their number follows the rate of
the first window, or
--issues N/--rate-per-day X. - Reproducible: the same seed and the same T2 give the same extract; a chain T1 → T2 → T3 keeps every earlier state in full.
For this the generator writes a generator record into the JSON envelope since 0.39.0
(cuts, seed, knobs, stages); transform_data reads only issues and is unaffected. A data
set without the record (older, or a real export) can be continued when the knobs are given —
T1 is then the youngest timestamp. Output: <name>_<T2>.json next to the source, or
--output. GUI: button Continue… next to Generate (To date and realism from the form).
Whole data room (since 0.40.0): --scenario portfolio --continue demo/ --to-date T2
continues the demo portfolio in place: every raw extract under raw/ moves on (a stale
source such as Beta-3 stays exactly as stale), transform_data rewrites
IssueTimes/Transitions/CFD, solution, portfolio and PI configs move to T2 with the same
window length, and the snapshots rotate: the previous snapshot_now.json becomes
snapshot_prev.json, a new snapshot_now.json is frozen — the delta briefing then shows
real elapsed time instead of the staged two-week story. Registers stay unchanged.
GUI: Continue Scenario… (To date from the form).
Learning from real data (since 0.41.0)¶
The knobs approximate a real ART; whoever has one uses it as the template. --learn-from
reads a transitions file from transform_data (XLSX or CSV: Key, Transition, Timestamp) and
estimates a transition profile: distribution of the first stage, first-order transition
matrix with an end state (where issues come to rest) and dwell times per source stage. The
profile holds stage names, counts and hours only — no keys, no texts, no dates. What is
generated with it shares nothing but the structure with the source.
python -m testdata_generator --learn-from ART_A_Transitions.xlsx --workflow workflow.txt
python -m testdata_generator --workflow workflow.txt --transition-profile ART_A_Transitions_profile.json --issues 500
With --transition-profile the stage path and the dwell times come from the profile;
realism, backflow, completion and to-do rate do not act on the path (the completion rate
follows from the data). --mean-cycle-days and the flow patterns stay in force: they spread
the cycle time over the learned path. The continuation uses the profile too when it is part
of the extract's knobs or passed along. GUI: field Transition profile and button
Learn from Transitions…. Learning with --workflow restricts the profile to that
workflow's stages; a profile with foreign stage names is rejected at generation time.
Workflow file¶
Same format as in transform_data:
Output and further processing¶
# Generate
python -m testdata_generator --workflow workflow.txt --project ART_TEST --seed 1
# Process directly with transform_data
python -m transform_data ART_TEST_generated.json workflow.txt
The generated JSON file contains Jira changelog histories with status transitions
along the defined workflow. transform_data processes them into
IssueTimes.xlsx, CFD.xlsx, and Transitions.xlsx.
Direct report (GUI)¶
After a successful generation the "Create Report" button becomes active in
the GUI. Clicking it runs transform_data and build_reports directly and
opens a combined report (a single HTML page with all metrics) in the browser.
The report covers the entire generated date range — no date filter.
Architecture¶
testdata_generator/
├── __main__.py Dispatcher: GUI without arguments, CLI with arguments
├── cli.py run_generate() + argparse CLI
├── generator.py # Core logic: issue simulation (time onto the path)
├── paths.py # Stage paths: realism disturbances, parking stage (0.38.0)
├── continuation.py # Continuation: second extract, envelope record (0.39.0)
├── scenario_continue.py # Scenario continuation with snapshot rotation (0.40.0)
├── learn.py # Transition profile from real transitions (0.41.0)
└── workflow_parser.py Re-export from transform_data.workflow
Tests¶
Note: Random cycle time distribution¶
The generator ensures that completed issues close before the configured to-date. The creation date is sampled from a restricted window [from-date, latest_start] where latest_start leaves enough buffer for the maximum cycle time. This produces an evenly distributed, random point cloud in the Flow Time scatter plot rather than a descending diagonal (right-censoring artefact).