@ihyeon/flow-qa 0.1.0-alpha.2 → 0.1.0-alpha.3

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/README.ko.md CHANGED
@@ -11,10 +11,10 @@
11
11
 
12
12
  ## 로컬 데모 시작
13
13
 
14
- Node.js 24 이상이 필요합니다. 패키지는 `@ihyeon/flow-qa@0.1.0-alpha.2`입니다. 브라우저는 첫 실행 전에 설치합니다.
14
+ Node.js 24 이상이 필요합니다. 패키지는 `@ihyeon/flow-qa@0.1.0-alpha.3`입니다. 브라우저는 첫 실행 전에 설치합니다.
15
15
 
16
16
  ```sh
17
- npm install -g @ihyeon/flow-qa@0.1.0-alpha.2
17
+ npm install -g @ihyeon/flow-qa@0.1.0-alpha.3
18
18
  flow-qa browser install
19
19
  flow-qa ui --demo
20
20
  ```
package/README.md CHANGED
@@ -14,7 +14,7 @@ Flow QA turns a user flow into reviewable test cases, runs them in a real browse
14
14
  Requires Node.js 24 or later. Install Chromium before the first run:
15
15
 
16
16
  ```sh
17
- npm install -g @ihyeon/flow-qa@0.1.0-alpha.2
17
+ npm install -g @ihyeon/flow-qa@0.1.0-alpha.3
18
18
  flow-qa browser install
19
19
  flow-qa ui --demo
20
20
  ```
@@ -166,11 +166,18 @@ export function normalizeReport1(raw, context) {
166
166
  const attempts = array(result.attempts, 'result.attempts').map((attempt) => normalizeAttempt(attempt, context.rawDir));
167
167
  if (status !== 'skipped' && attempts.length === 0)
168
168
  throw new Error(`Test result has no attempts: ${id}`);
169
- if (status === 'passed' && attempts.at(-1)?.status !== 'passed')
169
+ const finalAttemptStatus = attempts.at(-1)?.status;
170
+ if (status === 'passed' && (attempts.length !== 1 || attempts[0]?.index !== 0 || finalAttemptStatus !== 'passed')) {
170
171
  throw new Error(`Passed status and attempts disagree: ${id}`);
171
- if (status === 'flaky' && (attempts.at(-1)?.status !== 'passed' || !attempts.slice(0, -1).some((attempt) => attempt.status !== 'passed'))) {
172
+ }
173
+ if (status === 'flaky' && (attempts.length < 2 || finalAttemptStatus !== 'passed'
174
+ || attempts.some((attempt, index) => attempt.index !== index
175
+ || (index < attempts.length - 1 && attempt.status !== 'failed' && attempt.status !== 'timed-out')))) {
172
176
  throw new Error(`Flaky status and attempts disagree: ${id}`);
173
177
  }
178
+ if ((status === 'failed' || status === 'timed-out') && finalAttemptStatus === 'passed') {
179
+ throw new Error(`Failed or timed-out status and attempts disagree: ${id}`);
180
+ }
174
181
  if (context.blockedReasons.has(id) && status !== 'skipped')
175
182
  throw new Error(`A blocked case was recorded as executed: ${id}`);
176
183
  const skip = result.skip === undefined ? undefined : object(result.skip, 'result.skip');
@@ -753,6 +753,8 @@ export async function startUIServer(options) {
753
753
  closing = true;
754
754
  controller?.abort();
755
755
  closeTask = (async () => {
756
+ const stopped = new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
757
+ server.closeIdleConnections();
756
758
  if (requestTasks.size) {
757
759
  let requestTimeout;
758
760
  try {
@@ -765,8 +767,7 @@ export async function startUIServer(options) {
765
767
  clearTimeout(requestTimeout);
766
768
  }
767
769
  }
768
- const stopped = new Promise((resolve, reject) => server.close((error) => error ? reject(error) : resolve()));
769
- server.closeIdleConnections();
770
+ server.closeAllConnections();
770
771
  await stopped;
771
772
  const pending = runTask;
772
773
  if (pending) {
package/docs/releases.md CHANGED
@@ -1,9 +1,40 @@
1
1
  # Alpha release and verification
2
2
 
3
+ ## 0.1.0-alpha.3
4
+
5
+ This maintenance release keeps the existing CLI, UI, and case schema. It tightens result validation, bounds UI shutdown, and checks the command that npm installs for consumers.
6
+
7
+ - A result marked `passed` must contain a single first attempt that passed. A passing retry must have a consistent `flaky` history. Contradictory histories are rejected instead of producing a misleading success report.
8
+ - UI shutdown stops accepting connections immediately, allows existing requests up to one second to finish, and then closes remaining HTTP connections. An incomplete JSON request can no longer hold shutdown open. Planner cancellation responses and run cancellation are preserved.
9
+ - Consumer smoke checks verify npm's installed `flow-qa` command and invoke it offline for help, workspace initialization, validation, and runtime diagnostics. The installed UI still runs three real Chromium cases.
10
+
11
+ Both runtime fixes have regression tests that failed before the changes and passed afterward. Verification uses local test data and no model calls; it does not establish external authentication or model quality.
12
+
13
+ Checked on macOS with Node.js 24.14.1 on 2026-10-12: all 47 tests, type checking, UI syntax, and the design-system audit passed. Real Chromium checks preserved normal pass, intentional assertion failure, and unreachable-app classifications. The bilingual UI smoke passed, including report downloads and a 390px viewport. The runtime dependency audit reported zero known vulnerabilities at that time.
14
+
15
+ - Package: [`@ihyeon/flow-qa@0.1.0-alpha.3`](https://www.npmjs.com/package/@ihyeon/flow-qa/v/0.1.0-alpha.3)
16
+ - Source and package: [GitHub alpha release](https://github.com/hyeonse-swing/flow-qa/releases/tag/v0.1.0-alpha.3)
17
+ - Public checks: [GitHub Actions](https://github.com/hyeonse-swing/flow-qa/actions/workflows/ci.yml)
18
+
19
+ To reproduce this release's checks from its source:
20
+
21
+ ```sh
22
+ npm ci
23
+ npm run check
24
+ npm run qa -- browser install
25
+ npm run demo:smoke
26
+ npm run smoke:ui
27
+ npm run check:package
28
+ npm run smoke:package
29
+ FLOWQA_PACKAGE_SPEC=@ihyeon/flow-qa@0.1.0-alpha.3 npm run smoke:package
30
+ ```
31
+
3
32
  ## 0.1.0-alpha.2
4
33
 
5
34
  This update replaces the introductory video link with two UI screenshots. Runtime behavior is unchanged from alpha.1. Media files are not included in the npm tarball.
6
35
 
36
+ The verification record and reproduction commands below describe alpha.2. Use its matching source tag when reproducing that historical release.
37
+
7
38
  This public alpha provides a local CLI and UI, structured case validation, browser-run orchestration, and QA reports linked to evidence. Its bundled to-do app demo runs without a model.
8
39
 
9
40
  - Package: [`@ihyeon/flow-qa@0.1.0-alpha.2`](https://www.npmjs.com/package/@ihyeon/flow-qa/v/0.1.0-alpha.2), with the `alpha` dist-tag
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ihyeon/flow-qa",
3
- "version": "0.1.0-alpha.2",
3
+ "version": "0.1.0-alpha.3",
4
4
  "license": "MIT",
5
5
  "author": "Hyeonse Im",
6
6
  "repository": {