scenescout 3.19.0 → 3.19.1

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
@@ -1,5 +1,11 @@
1
1
  # scenescout
2
2
 
3
+ ## 3.19.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 3a302b4: A saved flow that fails after typing into a form with an unsaved-changes guard no longer stops the flows after it. During a flow, a page asking to confirm leaving is left, as the flow's `navigate` and its hand-back mean, so the next flow's first `navigate` is not cancelled (`net::ERR_ABORTED`). The session's own answer is restored once the flow hands back.
8
+
3
9
  ## 3.19.0
4
10
 
5
11
  ### Minor Changes
@@ -5047,6 +5047,10 @@ export class BrowserEngine {
5047
5047
  // The write policy judges by writeRule, so the flow's rule holds from here until the flow has handed back (finally).
5048
5048
  const crawlMode = this.mode;
5049
5049
  this.setMode(mode);
5050
+ // A flow's navigate means leave, and so does handing back: a page that asks to confirm leaving (an unsaved-changes
5051
+ // guard on a form a failed step left half filled) is left, or it would cancel the next flow's first navigate.
5052
+ const leaveBefore = this.leaveChoice;
5053
+ this.leaveChoice = true;
5050
5054
  const context = this.context;
5051
5055
  const violations = [];
5052
5056
  const here = () => {
@@ -5300,6 +5304,7 @@ export class BrowserEngine {
5300
5304
  // Pages the session no longer drives are closed only now, at about:blank and under the held rule, and each only
5301
5305
  // once what it sent as it was left has been judged (leftSettled).
5302
5306
  await BrowserEngine.settleWithin(Promise.allSettled(context.pages().map(async (p) => (p === this.page ? undefined : (await this.leftSettled(p), await p.close().catch(() => { }))))), 5000);
5307
+ this.leaveChoice = leaveBefore;
5303
5308
  page.off("websocket", onSocket);
5304
5309
  context.off("response", onResponse);
5305
5310
  this.refs.clear();
@@ -83,6 +83,17 @@ export function buildPairs(archives, keys) {
83
83
  }
84
84
  return out;
85
85
  }
86
+ /**
87
+ * The archives dated on or after `since` (YYYY-MM-DD), so a decider can be
88
+ * scored out of sample: on pairs from runs made after it was tuned, none of
89
+ * whose findings it has seen. Filtered before pairing, so a pair never joins
90
+ * a new finding to an old one.
91
+ */
92
+ export function archivesSince(archives, since) {
93
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(since))
94
+ throw new Error(`The date must be YYYY-MM-DD, not ${JSON.stringify(since)}.`);
95
+ return archives.filter((a) => a.date >= since);
96
+ }
86
97
  /**
87
98
  * At most `cap` pairs, chosen by a hash of their texts: the same pairs every
88
99
  * time for the same archives, whatever order they were built in, and no
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scenescout",
3
- "version": "3.19.0",
3
+ "version": "3.19.1",
4
4
  "description": "SceneScout — exploratory UI testing for AI coding agents. An MCP server that gives any agent (Claude Code, Cursor, VS Code Copilot, Codex, Gemini CLI and others) a structured view of a running web app, always-on oracles, a network-level write policy, memory across runs and a gap-checked report.",
5
5
  "license": "MIT",
6
6
  "author": "brunoboto96",