@validate.qa/runner 1.0.65 → 1.0.66

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.
Files changed (3) hide show
  1. package/dist/cli.js +51 -11
  2. package/dist/cli.mjs +51 -11
  3. package/package.json +1 -1
package/dist/cli.js CHANGED
@@ -73624,6 +73624,7 @@ var require_inbox_tools = __commonJS({
73624
73624
  exports2.buildInboxPromptBlock = buildInboxPromptBlock;
73625
73625
  exports2.guardVerificationCodeFabrication = guardVerificationCodeFabrication;
73626
73626
  exports2.hasRegisterIntent = hasRegisterIntent;
73627
+ exports2.hasSignupTestIntent = hasSignupTestIntent;
73627
73628
  exports2.resolveInboxRegistration = resolveInboxRegistration;
73628
73629
  exports2.applyInboxRegistrationIdentity = applyInboxRegistrationIdentity;
73629
73630
  exports2.isThrowawayRegisterSeedEmail = isThrowawayRegisterSeedEmail;
@@ -74167,6 +74168,9 @@ This project asked to REGISTER a new account, but this runner CANNOT receive ema
74167
74168
  const v = variableContext.allTestVariables?.DISCOVERY_SHOULD_REGISTER ?? variableContext.publicTestVariables?.DISCOVERY_SHOULD_REGISTER ?? "";
74168
74169
  return String(v).trim().toLowerCase() === "true";
74169
74170
  }
74171
+ function hasSignupTestIntent(variableContext) {
74172
+ return variableContext?.allTestVariables?.DISCOVERY_ALLOW_SIGNUP_TESTS !== "false";
74173
+ }
74170
74174
  function resolveInboxRegistration(opts) {
74171
74175
  const config = (0, verification_inbox_js_1.loadVerificationInboxConfig)(opts.env ?? process.env);
74172
74176
  if (!config)
@@ -95115,6 +95119,8 @@ var require_discover_generator = __commonJS({
95115
95119
  Object.defineProperty(exports2, "__esModule", { value: true });
95116
95120
  exports2.MIN_BUG_DESCRIPTION_LENGTH = exports2.VALID_PLAYWRIGHT_GETBY_METHODS = exports2.BLOCKED_MCP_TOOLS_SCENARIO_GEN = void 0;
95117
95121
  exports2.scenarioLooksLikeRegistration = scenarioLooksLikeRegistration;
95122
+ exports2.signupFeatureTestingAllowed = signupFeatureTestingAllowed;
95123
+ exports2.scenarioTouchesSignupAuthSurface = scenarioTouchesSignupAuthSurface;
95118
95124
  exports2.filterMcpToolsForScenarioGen = filterMcpToolsForScenarioGen;
95119
95125
  exports2.detectScenarioSignals = detectScenarioSignals;
95120
95126
  exports2.scenarioStepsCoverAuth = scenarioStepsCoverAuth;
@@ -95202,6 +95208,19 @@ EMIT (the code you put in finish_generate) \u2014 do NOT hardcode the throwaway
95202
95208
  - Tag the test \`@email-verify\`. Emit EXACTLY ONE test() in this file (one registration per run).
95203
95209
  - End with a DURABLE assertion of the post-verification signed-in state (e.g. a Logout control, an account/dashboard landmark) in your OWN test body \u2014 the helper call is not itself a proof.`;
95204
95210
  }
95211
+ function signupFeatureTestingAllowed(credentials) {
95212
+ if (!(0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)() || !(0, verification_inbox_js_1.loadVerificationInboxConfig)())
95213
+ return false;
95214
+ return credentials?.DISCOVERY_ALLOW_SIGNUP_TESTS !== "false";
95215
+ }
95216
+ var SIGNUP_AUTH_ROUTE_RE = /\/(sign-?up|verify-?email|email-?verification|create-?account|confirm-?email)\b/i;
95217
+ function scenarioTouchesSignupAuthSurface(scenario, pages) {
95218
+ const routes = [scenario.entryRoute, ...scenario.targetPages ?? []].filter((r) => !!r);
95219
+ if (routes.some((r) => SIGNUP_AUTH_ROUTE_RE.test(r)))
95220
+ return true;
95221
+ const authRoutes = new Set(pages.filter((p) => (p.pageType ?? "").toUpperCase() === "AUTH").map((p) => p.route));
95222
+ return routes.some((r) => authRoutes.has(r));
95223
+ }
95205
95224
  exports2.BLOCKED_MCP_TOOLS_SCENARIO_GEN = /* @__PURE__ */ new Set([
95206
95225
  "browser_install",
95207
95226
  "browser_close",
@@ -98313,9 +98332,16 @@ ${tailBlock}`;
98313
98332
  extraAuthEvidence: !!opts?.recipe || hasConfiguredLoginCredentials(credentials)
98314
98333
  });
98315
98334
  const baseSkeletonHadRegression = tags.includes("@regression");
98335
+ const selfProvisioningSignupScenario = signupFeatureTestingAllowed(credentials) && scenarioLooksLikeRegistration(scenario) && scenarioTouchesSignupAuthSurface(scenario, siteMap.pages);
98336
+ if (selfProvisioningSignupScenario) {
98337
+ for (const prereqTag of ["@needs-auth", "@inline-login", "@auth-guarded"]) {
98338
+ const idx = tags.indexOf(prereqTag);
98339
+ if (idx !== -1)
98340
+ tags.splice(idx, 1);
98341
+ }
98342
+ }
98316
98343
  const hasVerifiedRecipe = !!opts?.recipe && tags.includes("@needs-auth");
98317
- const projectHasRegisterIntent = credentials?.DISCOVERY_SHOULD_REGISTER === "true";
98318
- const inboxGenConfig = (0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)() && projectHasRegisterIntent && !hasVerifiedRecipe && scenarioLooksLikeRegistration(scenario) ? (0, verification_inbox_js_1.loadVerificationInboxConfig)() : null;
98344
+ const inboxGenConfig = selfProvisioningSignupScenario ? (0, verification_inbox_js_1.loadVerificationInboxConfig)() : null;
98319
98345
  let genInboxState = null;
98320
98346
  let genInboxCredentials = credentials;
98321
98347
  let genInboxSecret = null;
@@ -99262,7 +99288,8 @@ Scenario: "${scenario.name}" (${scenario.type})`);
99262
99288
  } catch {
99263
99289
  }
99264
99290
  const recipe = authRecipe;
99265
- const replayLogin = shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, recipe);
99291
+ const selfProvisioningSignupScenario = signupFeatureTestingAllowed(credentials) && scenarioLooksLikeRegistration(scenario) && scenarioTouchesSignupAuthSurface(scenario, siteMap.pages);
99292
+ const replayLogin = !selfProvisioningSignupScenario && shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, recipe);
99266
99293
  let effectiveRecipe = null;
99267
99294
  if (replayLogin && recipe) {
99268
99295
  const planLeaks = findSensitiveLiteralLeaks(JSON.stringify(recipe.replayPlan ?? []), credentials);
@@ -99369,7 +99396,8 @@ Scenario: "${scenario.name}" (${scenario.type})`);
99369
99396
  return;
99370
99397
  }
99371
99398
  let effectiveRecipe = null;
99372
- if (shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, authRecipe) && authRecipe) {
99399
+ const selfProvisioningSignupScenario = signupFeatureTestingAllowed(credentials) && scenarioLooksLikeRegistration(scenario) && scenarioTouchesSignupAuthSurface(scenario, siteMap.pages);
99400
+ if (!selfProvisioningSignupScenario && shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, authRecipe) && authRecipe) {
99373
99401
  const planLeaks = findSensitiveLiteralLeaks(JSON.stringify(authRecipe.replayPlan ?? []), credentials);
99374
99402
  if (planLeaks.length > 0) {
99375
99403
  scenarioLogs.push(` Warning: login replay plan contains literal credential value(s) for ${planLeaks.join(", ")} \u2014 falling back to model-authored login for "${scenario.name}"`);
@@ -335170,6 +335198,7 @@ var require_discover_agent = __commonJS({
335170
335198
  var discover_ai_planner_js_1 = require_discover_ai_planner();
335171
335199
  var discovery_lint_flags_js_1 = require_discovery_lint_flags();
335172
335200
  var verification_inbox_js_1 = require_verification_inbox();
335201
+ var inbox_tools_js_1 = require_inbox_tools();
335173
335202
  var sitemap_builder_js_1 = require_sitemap_builder();
335174
335203
  Object.defineProperty(exports2, "buildInMemorySiteMap", { enumerable: true, get: function() {
335175
335204
  return sitemap_builder_js_1.buildInMemorySiteMap;
@@ -335183,11 +335212,16 @@ var require_discover_agent = __commonJS({
335183
335212
  var canvas_detector_js_1 = require_canvas_detector();
335184
335213
  var auth_recipe_js_1 = require_auth_recipe();
335185
335214
  function plannerEmailVerifyArmed(ctx) {
335186
- if (!(0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)())
335187
- return false;
335188
- if (ctx.variableContext?.allTestVariables?.DISCOVERY_SHOULD_REGISTER !== "true")
335215
+ if (!(0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)() || !(0, verification_inbox_js_1.loadVerificationInboxConfig)())
335189
335216
  return false;
335190
- return (0, verification_inbox_js_1.isVerificationInboxConfigured)();
335217
+ return (0, inbox_tools_js_1.hasSignupTestIntent)(ctx.variableContext);
335218
+ }
335219
+ var PLANNER_AUTH_NAME_RE = /\b(auth|authentication|log[\s-]?in|sign[\s-]?in|sign[\s-]?up|signup|account|password|verify[\s-]?email)\b/i;
335220
+ var PLANNER_AUTH_ROUTE_RE = /\/(auth|login|sign-?in|sign-?up|signup|verify-?email|create-?account)\b/i;
335221
+ function featureLooksLikeAuth(featureName, focusRoutes) {
335222
+ if (featureName && PLANNER_AUTH_NAME_RE.test(featureName))
335223
+ return true;
335224
+ return (focusRoutes ?? []).some((r) => PLANNER_AUTH_ROUTE_RE.test(r));
335191
335225
  }
335192
335226
  async function runCanvasPreflight(ctx, sharedBrowser, log2) {
335193
335227
  const cached = ctx.appRenderType ?? null;
@@ -335839,6 +335873,11 @@ Explore complete: ${exploreResult.pagesDiscovered} pages, ${exploreResult.elemen
335839
335873
  authRedirectRoute: (0, shared_1.parseBoolFlag)(process.env.AUTH_RECIPE_STAMP) ? ctx.authRecipe?.redirectRoute ?? void 0 : void 0,
335840
335874
  // Email-verify capability — only for scenario-producing modes; a survey emits
335841
335875
  // featureGroups (no scenarios), so keep its prompt free of the round-trip block.
335876
+ // This site serves survey + FULL mode. Full mode is app-wide (no single feature
335877
+ // identity here), so we deliberately do NOT apply the auth-feature scope: the
335878
+ // per-scenario generator gates (scenarioLooksLikeRegistration +
335879
+ // scenarioTouchesSignupAuthSurface) still isolate non-auth scenarios. The
335880
+ // auth-feature scope IS applied at the DEEP call site where ctx.featureName is known.
335842
335881
  emailVerifyArmed: mode !== "survey" && plannerEmailVerifyArmed(ctx),
335843
335882
  testBudget
335844
335883
  }, {
@@ -336427,9 +336466,10 @@ Plan (reused): ${resumeSavedScenarios.length} scenarios from the paused run.`);
336427
336466
  // Email-verify capability: when armed, let the planner plan the full
336428
336467
  // register→verify and forgot-password→reset round trips to completion
336429
336468
  // (see the planner's "## Verification Inbox Available" block). Armed on the
336430
- // SAME project-level predicate the generator uses (flag + register intent +
336469
+ // SAME project-level predicate the generator uses (flag + consent +
336431
336470
  // configured inbox), so the planner never promises what generation can't do.
336432
- emailVerifyArmed: plannerEmailVerifyArmed(ctx),
336471
+ // Scoped to AUTH features: a non-auth feature has no signup surface to test.
336472
+ emailVerifyArmed: plannerEmailVerifyArmed(ctx) && featureLooksLikeAuth(ctx.featureName, augmentedFeatureFocusAreas),
336433
336473
  testBudget: featureTestBudget
336434
336474
  }, {
336435
336475
  modelOverride: ctx.planModel ?? ctx.generateModel,
@@ -351055,7 +351095,7 @@ var require_package4 = __commonJS({
351055
351095
  "package.json"(exports2, module2) {
351056
351096
  module2.exports = {
351057
351097
  name: "@validate.qa/runner",
351058
- version: "1.0.65",
351098
+ version: "1.0.66",
351059
351099
  description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
351060
351100
  bin: {
351061
351101
  "validate-runner": "dist/cli.js"
package/dist/cli.mjs CHANGED
@@ -73629,6 +73629,7 @@ var require_inbox_tools = __commonJS({
73629
73629
  exports.buildInboxPromptBlock = buildInboxPromptBlock;
73630
73630
  exports.guardVerificationCodeFabrication = guardVerificationCodeFabrication;
73631
73631
  exports.hasRegisterIntent = hasRegisterIntent;
73632
+ exports.hasSignupTestIntent = hasSignupTestIntent;
73632
73633
  exports.resolveInboxRegistration = resolveInboxRegistration;
73633
73634
  exports.applyInboxRegistrationIdentity = applyInboxRegistrationIdentity;
73634
73635
  exports.isThrowawayRegisterSeedEmail = isThrowawayRegisterSeedEmail;
@@ -74172,6 +74173,9 @@ This project asked to REGISTER a new account, but this runner CANNOT receive ema
74172
74173
  const v = variableContext.allTestVariables?.DISCOVERY_SHOULD_REGISTER ?? variableContext.publicTestVariables?.DISCOVERY_SHOULD_REGISTER ?? "";
74173
74174
  return String(v).trim().toLowerCase() === "true";
74174
74175
  }
74176
+ function hasSignupTestIntent(variableContext) {
74177
+ return variableContext?.allTestVariables?.DISCOVERY_ALLOW_SIGNUP_TESTS !== "false";
74178
+ }
74175
74179
  function resolveInboxRegistration(opts) {
74176
74180
  const config = (0, verification_inbox_js_1.loadVerificationInboxConfig)(opts.env ?? process.env);
74177
74181
  if (!config)
@@ -95120,6 +95124,8 @@ var require_discover_generator = __commonJS({
95120
95124
  Object.defineProperty(exports, "__esModule", { value: true });
95121
95125
  exports.MIN_BUG_DESCRIPTION_LENGTH = exports.VALID_PLAYWRIGHT_GETBY_METHODS = exports.BLOCKED_MCP_TOOLS_SCENARIO_GEN = void 0;
95122
95126
  exports.scenarioLooksLikeRegistration = scenarioLooksLikeRegistration;
95127
+ exports.signupFeatureTestingAllowed = signupFeatureTestingAllowed;
95128
+ exports.scenarioTouchesSignupAuthSurface = scenarioTouchesSignupAuthSurface;
95123
95129
  exports.filterMcpToolsForScenarioGen = filterMcpToolsForScenarioGen;
95124
95130
  exports.detectScenarioSignals = detectScenarioSignals;
95125
95131
  exports.scenarioStepsCoverAuth = scenarioStepsCoverAuth;
@@ -95207,6 +95213,19 @@ EMIT (the code you put in finish_generate) \u2014 do NOT hardcode the throwaway
95207
95213
  - Tag the test \`@email-verify\`. Emit EXACTLY ONE test() in this file (one registration per run).
95208
95214
  - End with a DURABLE assertion of the post-verification signed-in state (e.g. a Logout control, an account/dashboard landmark) in your OWN test body \u2014 the helper call is not itself a proof.`;
95209
95215
  }
95216
+ function signupFeatureTestingAllowed(credentials) {
95217
+ if (!(0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)() || !(0, verification_inbox_js_1.loadVerificationInboxConfig)())
95218
+ return false;
95219
+ return credentials?.DISCOVERY_ALLOW_SIGNUP_TESTS !== "false";
95220
+ }
95221
+ var SIGNUP_AUTH_ROUTE_RE = /\/(sign-?up|verify-?email|email-?verification|create-?account|confirm-?email)\b/i;
95222
+ function scenarioTouchesSignupAuthSurface(scenario, pages) {
95223
+ const routes = [scenario.entryRoute, ...scenario.targetPages ?? []].filter((r) => !!r);
95224
+ if (routes.some((r) => SIGNUP_AUTH_ROUTE_RE.test(r)))
95225
+ return true;
95226
+ const authRoutes = new Set(pages.filter((p) => (p.pageType ?? "").toUpperCase() === "AUTH").map((p) => p.route));
95227
+ return routes.some((r) => authRoutes.has(r));
95228
+ }
95210
95229
  exports.BLOCKED_MCP_TOOLS_SCENARIO_GEN = /* @__PURE__ */ new Set([
95211
95230
  "browser_install",
95212
95231
  "browser_close",
@@ -98318,9 +98337,16 @@ ${tailBlock}`;
98318
98337
  extraAuthEvidence: !!opts?.recipe || hasConfiguredLoginCredentials(credentials)
98319
98338
  });
98320
98339
  const baseSkeletonHadRegression = tags.includes("@regression");
98340
+ const selfProvisioningSignupScenario = signupFeatureTestingAllowed(credentials) && scenarioLooksLikeRegistration(scenario) && scenarioTouchesSignupAuthSurface(scenario, siteMap.pages);
98341
+ if (selfProvisioningSignupScenario) {
98342
+ for (const prereqTag of ["@needs-auth", "@inline-login", "@auth-guarded"]) {
98343
+ const idx = tags.indexOf(prereqTag);
98344
+ if (idx !== -1)
98345
+ tags.splice(idx, 1);
98346
+ }
98347
+ }
98321
98348
  const hasVerifiedRecipe = !!opts?.recipe && tags.includes("@needs-auth");
98322
- const projectHasRegisterIntent = credentials?.DISCOVERY_SHOULD_REGISTER === "true";
98323
- const inboxGenConfig = (0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)() && projectHasRegisterIntent && !hasVerifiedRecipe && scenarioLooksLikeRegistration(scenario) ? (0, verification_inbox_js_1.loadVerificationInboxConfig)() : null;
98349
+ const inboxGenConfig = selfProvisioningSignupScenario ? (0, verification_inbox_js_1.loadVerificationInboxConfig)() : null;
98324
98350
  let genInboxState = null;
98325
98351
  let genInboxCredentials = credentials;
98326
98352
  let genInboxSecret = null;
@@ -99267,7 +99293,8 @@ Scenario: "${scenario.name}" (${scenario.type})`);
99267
99293
  } catch {
99268
99294
  }
99269
99295
  const recipe = authRecipe;
99270
- const replayLogin = shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, recipe);
99296
+ const selfProvisioningSignupScenario = signupFeatureTestingAllowed(credentials) && scenarioLooksLikeRegistration(scenario) && scenarioTouchesSignupAuthSurface(scenario, siteMap.pages);
99297
+ const replayLogin = !selfProvisioningSignupScenario && shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, recipe);
99271
99298
  let effectiveRecipe = null;
99272
99299
  if (replayLogin && recipe) {
99273
99300
  const planLeaks = findSensitiveLiteralLeaks(JSON.stringify(recipe.replayPlan ?? []), credentials);
@@ -99374,7 +99401,8 @@ Scenario: "${scenario.name}" (${scenario.type})`);
99374
99401
  return;
99375
99402
  }
99376
99403
  let effectiveRecipe = null;
99377
- if (shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, authRecipe) && authRecipe) {
99404
+ const selfProvisioningSignupScenario = signupFeatureTestingAllowed(credentials) && scenarioLooksLikeRegistration(scenario) && scenarioTouchesSignupAuthSurface(scenario, siteMap.pages);
99405
+ if (!selfProvisioningSignupScenario && shouldReplayAuthRecipe(scenario.targetPages, siteMap.pages, authRecipe) && authRecipe) {
99378
99406
  const planLeaks = findSensitiveLiteralLeaks(JSON.stringify(authRecipe.replayPlan ?? []), credentials);
99379
99407
  if (planLeaks.length > 0) {
99380
99408
  scenarioLogs.push(` Warning: login replay plan contains literal credential value(s) for ${planLeaks.join(", ")} \u2014 falling back to model-authored login for "${scenario.name}"`);
@@ -335175,6 +335203,7 @@ var require_discover_agent = __commonJS({
335175
335203
  var discover_ai_planner_js_1 = require_discover_ai_planner();
335176
335204
  var discovery_lint_flags_js_1 = require_discovery_lint_flags();
335177
335205
  var verification_inbox_js_1 = require_verification_inbox();
335206
+ var inbox_tools_js_1 = require_inbox_tools();
335178
335207
  var sitemap_builder_js_1 = require_sitemap_builder();
335179
335208
  Object.defineProperty(exports, "buildInMemorySiteMap", { enumerable: true, get: function() {
335180
335209
  return sitemap_builder_js_1.buildInMemorySiteMap;
@@ -335188,11 +335217,16 @@ var require_discover_agent = __commonJS({
335188
335217
  var canvas_detector_js_1 = require_canvas_detector();
335189
335218
  var auth_recipe_js_1 = require_auth_recipe();
335190
335219
  function plannerEmailVerifyArmed(ctx) {
335191
- if (!(0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)())
335192
- return false;
335193
- if (ctx.variableContext?.allTestVariables?.DISCOVERY_SHOULD_REGISTER !== "true")
335220
+ if (!(0, discovery_lint_flags_js_1.isTestgenEmailVerifyEnabled)() || !(0, verification_inbox_js_1.loadVerificationInboxConfig)())
335194
335221
  return false;
335195
- return (0, verification_inbox_js_1.isVerificationInboxConfigured)();
335222
+ return (0, inbox_tools_js_1.hasSignupTestIntent)(ctx.variableContext);
335223
+ }
335224
+ var PLANNER_AUTH_NAME_RE = /\b(auth|authentication|log[\s-]?in|sign[\s-]?in|sign[\s-]?up|signup|account|password|verify[\s-]?email)\b/i;
335225
+ var PLANNER_AUTH_ROUTE_RE = /\/(auth|login|sign-?in|sign-?up|signup|verify-?email|create-?account)\b/i;
335226
+ function featureLooksLikeAuth(featureName, focusRoutes) {
335227
+ if (featureName && PLANNER_AUTH_NAME_RE.test(featureName))
335228
+ return true;
335229
+ return (focusRoutes ?? []).some((r) => PLANNER_AUTH_ROUTE_RE.test(r));
335196
335230
  }
335197
335231
  async function runCanvasPreflight(ctx, sharedBrowser, log2) {
335198
335232
  const cached = ctx.appRenderType ?? null;
@@ -335844,6 +335878,11 @@ Explore complete: ${exploreResult.pagesDiscovered} pages, ${exploreResult.elemen
335844
335878
  authRedirectRoute: (0, shared_1.parseBoolFlag)(process.env.AUTH_RECIPE_STAMP) ? ctx.authRecipe?.redirectRoute ?? void 0 : void 0,
335845
335879
  // Email-verify capability — only for scenario-producing modes; a survey emits
335846
335880
  // featureGroups (no scenarios), so keep its prompt free of the round-trip block.
335881
+ // This site serves survey + FULL mode. Full mode is app-wide (no single feature
335882
+ // identity here), so we deliberately do NOT apply the auth-feature scope: the
335883
+ // per-scenario generator gates (scenarioLooksLikeRegistration +
335884
+ // scenarioTouchesSignupAuthSurface) still isolate non-auth scenarios. The
335885
+ // auth-feature scope IS applied at the DEEP call site where ctx.featureName is known.
335847
335886
  emailVerifyArmed: mode !== "survey" && plannerEmailVerifyArmed(ctx),
335848
335887
  testBudget
335849
335888
  }, {
@@ -336432,9 +336471,10 @@ Plan (reused): ${resumeSavedScenarios.length} scenarios from the paused run.`);
336432
336471
  // Email-verify capability: when armed, let the planner plan the full
336433
336472
  // register→verify and forgot-password→reset round trips to completion
336434
336473
  // (see the planner's "## Verification Inbox Available" block). Armed on the
336435
- // SAME project-level predicate the generator uses (flag + register intent +
336474
+ // SAME project-level predicate the generator uses (flag + consent +
336436
336475
  // configured inbox), so the planner never promises what generation can't do.
336437
- emailVerifyArmed: plannerEmailVerifyArmed(ctx),
336476
+ // Scoped to AUTH features: a non-auth feature has no signup surface to test.
336477
+ emailVerifyArmed: plannerEmailVerifyArmed(ctx) && featureLooksLikeAuth(ctx.featureName, augmentedFeatureFocusAreas),
336438
336478
  testBudget: featureTestBudget
336439
336479
  }, {
336440
336480
  modelOverride: ctx.planModel ?? ctx.generateModel,
@@ -351060,7 +351100,7 @@ var require_package4 = __commonJS({
351060
351100
  "package.json"(exports, module) {
351061
351101
  module.exports = {
351062
351102
  name: "@validate.qa/runner",
351063
- version: "1.0.65",
351103
+ version: "1.0.66",
351064
351104
  description: "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
351065
351105
  bin: {
351066
351106
  "validate-runner": "dist/cli.js"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@validate.qa/runner",
3
- "version": "1.0.65",
3
+ "version": "1.0.66",
4
4
  "description": "validate local test runner - execute Playwright tests on your machine, connected to validate.qa cloud.",
5
5
  "bin": {
6
6
  "validate-runner": "dist/cli.js"