saffron-ai 0.9.5 → 0.9.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,135 @@ the VS Code extension (`ChathurangaJayasinghe.saffron-vscode`) and the
5
5
  JetBrains plugin (`ai.saffron.jetbrains`). Dates are publish dates. Each
6
6
  release heading names its main feature: `## <version>: <title>`.
7
7
 
8
+ ## 0.9.7: CI results without importing
9
+
10
+ Released 2026-10-05.
11
+
12
+ Runner
13
+
14
+ - **See what a CI run found before you import it.** `saffron report --run
15
+ <id>` downloads the run's Saffron bundles once into
16
+ `.saffron/ci/<provider>-<id>/attempt-<n>/`, checks them as `saffron
17
+ import` does (repository, digests, sizes, format, the run, attempts and
18
+ shards), judges each proposal against this checkout without filing it,
19
+ and opens the run's report page. Your `.saffron/reports/`,
20
+ `.saffron/proposals/`, `.saffron/artifacts/` and import ledger are left
21
+ as they were. `--json` gives the run, its totals, each scenario with its
22
+ failing step, first error line, screenshot and trace, each proposal as
23
+ importable or not with the reason, and warnings: what the VS Code and
24
+ JetBrains CI runs views show under a run.
25
+ - **A run without results says why.** `running` (not finished),
26
+ `expired` (the service deleted the artifact) or `none` (nothing
27
+ uploaded; the guide's workflow exports only on failure, and `if:
28
+ always()` on the export and upload steps keeps every run's results), as
29
+ `reasonKind` and `reason`, exit 0.
30
+ - **Large runs ask first.** `--max-download <MB>` refuses a run whose
31
+ bundles add up to more, with `{"error", "kind": "too-large",
32
+ "sizeBytes"}` and exit 2, so an editor can ask and run again.
33
+ - **Replay a CI run, view only.** `saffron trace --run <id> [scenario]`
34
+ replays the run's traces from `.saffron/ci/`, taking the same scenario
35
+ forms as `saffron trace` (`<feature>:<scenario>` included). The page has
36
+ no Accept or Reject and its server no review routes: nothing was filed.
37
+ - **View, then import, downloads once.** `saffron import --run <id>`
38
+ reuses the viewed download of the run's latest attempt.
39
+ - **A cache that looks after itself.** `.saffron/ci/` keeps the newest 10
40
+ runs and at most 1 GB, removing the oldest first; a download goes
41
+ through a `.partial` folder and is renamed whole, so a cancelled one
42
+ leaves nothing behind. The folder writes its own `.gitignore` (`*`), so
43
+ it never shows in `git status`, even in a project set up before it
44
+ existed, and `saffron init` adds `.saffron/ci/` to the entries it
45
+ manages.
46
+
47
+ VS Code extension 0.6.0
48
+
49
+ - **Expand a CI run to see what it found, without importing it.** The
50
+ run lists its totals, each failed and healed scenario with its failing
51
+ step and first error line (the tooltip has what the agent changed), and
52
+ "N proposals: M importable" with the reason each one would not import.
53
+ Your reports, proposals and evidence are left alone. Needs saffron-ai
54
+ 0.9.7 or later; an older runner says so.
55
+ - **Open Report and Open Trace on a viewed run.** Open Report shows the
56
+ run's report in your browser; Open Trace replays a traced scenario,
57
+ view only. Import stays the only action that files proposals.
58
+ - **Large results ask first.** Results above the new
59
+ `saffron.ciMaxDownloadMB` setting (default 100, 0 for no limit) ask
60
+ "This run's results are N MB. Download?". Loading can be cancelled,
61
+ which stops the whole download, and never runs while the CI runs view
62
+ is hidden.
63
+ - **A run with no results says why:** still running, its artifacts
64
+ expired, or it uploaded none.
65
+
66
+ JetBrains plugin 0.6.0
67
+
68
+ - **CI Runs shows what a run found without importing it.** Select a run
69
+ to see its totals, each failed and healed scenario with its failing
70
+ step and first error line (the narrative in the tooltip), and
71
+ "N proposals: M importable" with the reason for each one that is not.
72
+ It loads in a background task you can cancel, only while the tab is on
73
+ screen. Needs saffron-ai 0.9.7 or later; an older runner says so.
74
+ - **Open Report and Open Trace on a viewed run.** Open Trace (or a
75
+ double-click) replays a failed or healed scenario's trace, view only.
76
+ Import Run stays the only action that brings proposals into the
77
+ checkout.
78
+ - **Large results ask first**, above the limit in Settings, Tools, Saffron
79
+ (default 100 MB, 0 for no limit), the same as the VS Code setting.
80
+ - **A run with no results says why:** still running, expired, or none
81
+ uploaded.
82
+
83
+ ## 0.9.6: Dashboard figures you can trust
84
+
85
+ Released 2026-10-05.
86
+
87
+ Runner
88
+
89
+ - **Three dashboard figures no longer flatter the suite.** *Recorded*
90
+ counted a stale recording, one whose scenario was edited since and
91
+ needs the agent again, so the dashboard could say 100% while `saffron
92
+ status` said otherwise; it now counts current recordings only, and at
93
+ 100% says "every scenario has a current recording". *Passing* and the
94
+ last run's pass rate counted a heal whose zero-AI proof had failed;
95
+ such a heal is now "healed, unverified", out of the pass rate, with its
96
+ own stripe in the health bar, a count on the tiles and a mark in the
97
+ healed-again list. *Flaky* counted a scenario that was red on one base
98
+ URL and green on another as flipping; flips are now counted between
99
+ consecutive runs on the same base URL, and a first recording that
100
+ failed is left out. `status --json` gains `quality.suite.unverified`,
101
+ `quality.lastRun.unverified`, and `unverified` on tags and healing
102
+ entries. Both IDE dashboards show the runner's page, so they follow
103
+ without a plugin update.
104
+ - **An upload whose file does not exist says so.** Under a project path
105
+ reached through a link (a temp folder on macOS), the message was
106
+ "outside the project". The repository's own example now names its
107
+ upload file relative to the project, as replay has resolved it since
108
+ 0.9.4.
109
+ - **Uploads are single files.** A folder passed to a file input was let
110
+ through, and a folder upload sends everything inside it, dotfiles such
111
+ as `.env` included. The agent's upload and replay both refuse a folder
112
+ now.
113
+ - **`saffron report --merge` never hides another environment's result.**
114
+ A re-run attempt replaced the earlier attempt of the same shard number
115
+ before checking that both ran the same suite against the same base
116
+ URL, so a green production attempt could silently drop a red staging
117
+ one. An attempt now replaces only the same shard of the same suite,
118
+ split and base URL; anything else is refused, naming the base URLs.
119
+ - **`saffron export --branch` works with `"features": "."`.** With the
120
+ scenarios at the project root, the shared StepSets were left out of the
121
+ check against the commit the branch starts on, so a correctly bound
122
+ proposal was refused as using a StepSet "not defined anywhere".
123
+ - A replay that finds its recording stale no longer leaves a listener on
124
+ the browser context.
125
+
126
+ VS Code extension 0.5.1
127
+
128
+ - **The dashboard tab shows the Saffron mark in dark themes.** It used the
129
+ activity bar icon, one dark shape that VS Code tints there and a tab
130
+ draws as is, so it was dark on a dark tab.
131
+ - **Cancelling an import stops every process it started, on macOS and
132
+ Linux too.** The CLI runs in a process group of its own, so a `gh` or
133
+ `az` download that outlives it is stopped as well, with a forced stop
134
+ for one that ignores the first request. Output over 16 MB ends the
135
+ command with a clear message.
136
+
8
137
  ## 0.9.5: CI heals you can trust
9
138
 
10
139
  Released 2026-10-04.