diff --git a/src/resources/extensions/gsd/auto-dispatch.ts b/src/resources/extensions/gsd/auto-dispatch.ts index d04687307..a51d2d47d 100644 --- a/src/resources/extensions/gsd/auto-dispatch.ts +++ b/src/resources/extensions/gsd/auto-dispatch.ts @@ -155,7 +155,7 @@ const DISPATCH_RULES: DispatchRule[] = [ uatContent ?? "", basePath, ), - pauseAfterDispatch: uatType !== "artifact-driven", + pauseAfterDispatch: uatType !== "artifact-driven" && uatType !== "browser-executable" && uatType !== "runtime-executable", }; }, }, diff --git a/src/resources/extensions/gsd/files.ts b/src/resources/extensions/gsd/files.ts index a2c939279..4db0f459d 100644 --- a/src/resources/extensions/gsd/files.ts +++ b/src/resources/extensions/gsd/files.ts @@ -775,7 +775,7 @@ export function parseTaskPlanIO(content: string): { inputFiles: string[]; output * The four UAT classification types recognised by GSD auto-mode. * `undefined` is returned (not this union) when no type can be determined. */ -export type UatType = 'artifact-driven' | 'live-runtime' | 'human-experience' | 'mixed'; +export type UatType = 'artifact-driven' | 'live-runtime' | 'human-experience' | 'mixed' | 'browser-executable' | 'runtime-executable'; /** * Extract the UAT type from a UAT file's raw content. @@ -799,6 +799,8 @@ export function extractUatType(content: string): UatType | undefined { const rawValue = modeBullet.slice('UAT mode:'.length).trim().toLowerCase(); if (rawValue.startsWith('artifact-driven')) return 'artifact-driven'; + if (rawValue.startsWith('browser-executable')) return 'browser-executable'; + if (rawValue.startsWith('runtime-executable')) return 'runtime-executable'; if (rawValue.startsWith('live-runtime')) return 'live-runtime'; if (rawValue.startsWith('human-experience')) return 'human-experience'; if (rawValue.startsWith('mixed')) return 'mixed'; diff --git a/src/resources/extensions/gsd/prompts/run-uat.md b/src/resources/extensions/gsd/prompts/run-uat.md index 0752ac30a..9028cbce3 100644 --- a/src/resources/extensions/gsd/prompts/run-uat.md +++ b/src/resources/extensions/gsd/prompts/run-uat.md @@ -25,6 +25,8 @@ You are the UAT runner. Execute every check defined in `{{uatPath}}` as deeply a ### Automation rules by mode - `artifact-driven` — verify with shell commands, scripts, file reads, and artifact structure checks. +- `browser-executable` — use browser tools to navigate to the target URL and verify expected behavior. Capture screenshots as evidence. Record pass/fail with specific assertions. +- `runtime-executable` — execute the specified command or script. Capture stdout/stderr as evidence. Record pass/fail based on exit code and output. - `live-runtime` — exercise the real runtime path. Start or connect to the app/service if needed, use browser/runtime/network checks, and verify observable behavior. - `mixed` — run all automatable artifact-driven and live-runtime checks. Separate any remaining human-only checks explicitly. - `human-experience` — automate setup, preconditions, screenshots, logs, and objective checks, but do **not** invent subjective PASS results. Mark taste-based, experiential, or purely human-judgment checks as `NEEDS-HUMAN` and use an overall verdict of `PARTIAL` unless every required check was objective and passed.