diff --git a/AGENTS.md b/AGENTS.md index b79b472..62fe37a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -89,7 +89,8 @@ Before visual implementation, read the canonical AlvenX parent `AGENTS.md`, `foundation/brand/brand-tokens.json`, `assets/README.md`, `interface/alvenx-ui.css`, `interface/README.md` and `INTERFACE_DESIGN_SYSTEM.md`. The shared master is the design source; use exact committed copies for standalone runtime and CI. README: centered 320px subtitle-free -wordmark before H1. UI: canonical `.ax-product-header` with 160px wordmark, approved Instrument +wordmark, then `
` and `FUNCTIONAL REGRESSION EVIDENCE` before H1. +UI: canonical `.ax-product-header` with 160px wordmark, approved Instrument Sans/fallbacks, static canvas, glass controls, focus and reduced-motion behavior. Run `pnpm brand:verify` (included in `pnpm check`/CI). In the AlvenX workspace also run diff --git a/README.md b/README.md index 0250068..091c6d7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@

AlvenX +
+ FUNCTIONAL REGRESSION EVIDENCE

# ReproLock @@ -48,7 +50,9 @@ This demonstrates one supplied case. It does not establish incremental value ove baseline or implement a general “issue → test” flow. See the [brand contract](docs/brand.md) and [actual acceptance record](harness/context/03-brand-verifiable-demo.md). -![A real 20+20 local differential, with independent verification](docs/demo-evidence/demo-1440.png) +![English Demo showing a saved, independently verified 20+20 differential](docs/demo-evidence/demo-1440.png) + +The screenshot shows the saved 2026-09-04 run in the current English interface; it is not a new execution. ## Development diff --git a/docs/assets/alvenx-wordmark.svg b/docs/assets/alvenx-wordmark.svg index b72f315..256c0d5 100644 --- a/docs/assets/alvenx-wordmark.svg +++ b/docs/assets/alvenx-wordmark.svg @@ -29,7 +29,7 @@ - + diff --git a/docs/assets/provenance.json b/docs/assets/provenance.json index da6d940..99a0f96 100644 --- a/docs/assets/provenance.json +++ b/docs/assets/provenance.json @@ -7,7 +7,7 @@ { "path": "docs/assets/alvenx-wordmark.svg", "source": "foundation/brand/assets/alvenx-wordmark.svg", - "sha256": "8ae10e02c27091e29e0191a7934506118f144aae11898b20222d7f9d587e2662" + "sha256": "6cc422fb2ed289bee723f1c6e6d19baec63c18d988616eb5b90d8332a30b7b1e" }, { "path": "docs/assets/alvenx-monogram.svg", @@ -29,5 +29,6 @@ "source": "projects/BrowserAgentRegression/src/browser_agent_regression/assets/fonts/InstrumentSans-OFL.txt", "sha256": "bc29b497c4e8316b2d248322a9cea670c2f0afc24ae0eb7bbaa54e02e00eebab" } - ] + ], + "wordmarkAlignmentRevision": "2026-09-04.1" } diff --git a/docs/brand.md b/docs/brand.md index 9dba311..605d233 100644 --- a/docs/brand.md +++ b/docs/brand.md @@ -5,20 +5,31 @@ revision **2026-08-25.2**. The canonical sources remain in `AlvenX/foundation/br `brand-tokens.json`, `assets/README.md`, `interface/alvenx-ui.css`, `interface/README.md` and `INTERFACE_DESIGN_SYSTEM.md`. Read these and the parent `AGENTS.md` before changing a visual surface. +The wordmark also uses approved canvas-alignment revision **2026-09-04.1**. Only the master +translation changed to center its artwork; paths, colors, scale and the 330×100 canvas are unchanged. + `docs/assets/provenance.json` records source paths and SHA-256 of the exact controlled copies. It is an inventory, not a second token source. Runtime, standalone export and CI use only the committed copies. Instrument Sans and its SIL Open Font License are included. The README uses -the subtitle-free 330×100 master, centered at 320px before the H1. The Demo reuses that SVG at -160px inside `.ax-product-header`; do not map ReproLock into the older 430×150 subtitle lockups. +the subtitle-free 330×100 master, centered at 320px, followed by `
` and the separate +`FUNCTIONAL REGRESSION EVIDENCE` line before the H1. The Demo reuses that SVG at +160px inside `.ax-product-header`. The shared CSS controls the static four-layer background, typography, glass surfaces and header geometry. Product CSS may arrange the case/run workflow and add visible focus/reduced-motion behavior; it must not override approved header values or redraw the logo. +The product interface is English, consistent with the other AlvenX Demos. Keep document language, +accessible labels, controls, status/error messages, setup instructions and current screenshots +consistent. Historical reports and earlier screenshots remain original evidence, not translation inputs. + Run `pnpm brand:verify` and `pnpm check` in a standalone checkout. In AlvenX also run `python foundation/brand/validate_brand.py` and `python operations/tools/validate_workspace.py`. Check actual asset/font loading and browser layout at 390, 900 and 1440px, compare computed desktop header styles against an accepted Studio, and inspect GitHub's actual README rendering. -AlvenX is a non-Git workspace. The registration-only companion patch records the shared consumer -and validator changes; it does not regenerate or alter published product/website assets. +AlvenX is a non-Git workspace. The parent already registers ReproLock's controlled assets. +`docs/brand-registration.patch` is the unchanged historical snapshot of that first registration; +its earlier README assertion is not the current contract. Do not replay the historical patch. +Later cross-project changes update the current parent tokens, release manifest and validator +directly; the parent contract and this repository's standalone check govern the current header. diff --git a/docs/demo-evidence/demo-1440.png b/docs/demo-evidence/demo-1440.png index 95b1fbb..a8eeb91 100644 Binary files a/docs/demo-evidence/demo-1440.png and b/docs/demo-evidence/demo-1440.png differ diff --git a/docs/demo.md b/docs/demo.md index cbe89d8..b026c61 100644 --- a/docs/demo.md +++ b/docs/demo.md @@ -34,7 +34,7 @@ pnpm demo --config demo.local.json ``` Open **http://127.0.0.1:4317**. `--port 4318` changes only the Demo's UI port; target execution stays -on 4173. Click **检查运行条件**, then **运行 20 + 20 次验证**. The same frozen test executes sequentially +on 4173. Click **Check prerequisites**, then **Run 20 + 20 checks**. The same frozen test executes sequentially on both revisions, with one worker, zero retries and no model calls. Expected pre-fix failure is `processing-cleared`: “Analyzing locally...” stays visible. Post-fix must pass every outcome check. @@ -72,7 +72,7 @@ derived attempts, repetition identities, assertion diagnostics, and verified cle cross-checks streaming observations against the actual Playwright report before completion. Hashes establish integrity and internal consistency, not authenticated proof of who ran the test. -Download **测试** and **配置** to a separate directory to replay without ReproLock. Install only +Download **Download test** and **Download config** to a separate directory to replay without ReproLock. Install only `@playwright/test@1.62.1` and its Chromium, start the chosen supplied target as above, then run: ```sh diff --git a/harness/context/03-brand-verifiable-demo.md b/harness/context/03-brand-verifiable-demo.md index 57b82b5..3d3b20f 100644 --- a/harness/context/03-brand-verifiable-demo.md +++ b/harness/context/03-brand-verifiable-demo.md @@ -111,10 +111,75 @@ The recorded-run CI gate explicitly requires the three expected final statuses a differential only for the complete run. A valid cancelled/partial export cannot silently replace the checked-in complete demonstration. -## Remaining handoff gates and limits +## Original delivery integration and limits -Final GitHub README rendering, PR CI and merge/main synchronization are the remaining integration -gates; their exact remote receipts will be retained in the local audit and PR. Historical -experimental results have not been relabeled as current execution. +Original delivery completed in [PR #3](https://github.com/AlbertXXuu/ReproLock/pull/3), main +`a83195f22f01aedfd3595b1890a39c5d14dac66b`. [PR CI](https://github.com/AlbertXXuu/ReproLock/actions/runs/33884213031) +and [main CI](https://github.com/AlbertXXuu/ReproLock/actions/runs/33885702203) passed both Node jobs. +The local integration receipt records the actual GitHub rendering and clean D-main synchronization. +Historical experimental results have not been relabeled as current execution. Product decision remains **SPIKE_CONDITIONAL**: one unusually detailed case, equivalent manual baseline, no measured effort/maintenance advantage, no general issue-to-test flow, no public release. + +## README signal alignment — 2026-09-04 + +The owner requested the same pure 320px AlvenX wordmark across project READMEs with a separate +small signal. ReproLock now places `
` and `FUNCTIONAL REGRESSION EVIDENCE` below +the existing SVG, before the unchanged H1 and body. The standalone brand assertion and active +brand instructions use this format. The historical registration patch remains unchanged; the +current AlvenX parent contract owns later shared changes. + +Checks on this bounded update: + +- `node scripts/verify-brand.mjs`: PASS, five controlled assets and one README. +- `node_modules/.bin/biome.cmd format scripts/verify-brand.mjs`: PASS, one file, no fixes. +- `node_modules/.bin/biome.cmd lint scripts/verify-brand.mjs`: PASS, one file, no fixes. +- `git diff --check`: PASS. +- Independent source comparison: exact requested header; README body unchanged from HEAD; + SVG byte-identical to the canonical master, SHA-256 + `8ae10e02c27091e29e0191a7934506118f144aae11898b20222d7f9d587e2662`; + no diff in `docs/brand-registration.patch`. + +The coordinating task verifies the parent brand/workspace contract and shared README rendering. +This update does not rerun the real target or change Demo UI/logic, versions, frozen evidence, +dependencies or Git references. GitHub rendering is not revalidated by these local source checks. + +## English interface alignment — 2026-09-04 + +The owner requested English throughout the Demo, consistent with the other AlvenX products. +The cross-project brand task explicitly transferred its six finished files and stopped writing +ReproLock; the preserved changes became `28c17d3`. Its subsequent owner-approved centered +wordmark became `273d75f`. The wordmark changes only its master translation; the shared header +geometry and product CSS remain unchanged. + +Changed static copy, `lang="en"`, accessible labels, dynamic statuses/errors, matching setup +instructions and the current README screenshot. No language selector, new dependency or execution +logic was introduced. `Execution finished`, `Inconclusive` and `Unconfirmed` preserve the original +meaning; saved results explicitly say `Not re-executed`. + +Actual baseline: `pnpm brand:verify` and `pnpm test:browser` passed (4/4). After translation: +`pnpm check` passed 80/80 unit/process tests and 4/4 browser tests, historical evidence and all three +recorded Demo checks. The first full check found two formatter wraps; the scoped formatter fixed +those, then the complete check passed. Both logs are retained. Shared `validate_brand.py` passed +22 resources / 5 unified README headers; `validate_workspace.py` passed five independent repos. + +Manual browser inspection confirmed actual English content at 390/900/1440px, no Han characters +in the rendered owned UI, no horizontal overflow and the canonical header/font. Reopened actual +complete, cancelled (8/8), timed-out (3 starts / 2 completed) and startup-failed (0/0) records; +all are explicitly saved results. Partial states retain an unconfirmed differential. No new +20+20 experiment was needed because the runner and evidence sources are unchanged. + +Current screenshots and observed checks: `output/playwright/english-demo-20260904/`. +`docs/demo-evidence/demo-1440.png` shows saved run `20260904T134401616Z-abed6b50` in the current +English UI. The earlier Chinese screenshot remains in Git history and its original local output. +Of 250 protected files, 247 are byte-identical; only the newly approved wordmark, its provenance +and this current screenshot changed. Frozen tests, raw reports, exports and runner code remain exact. + +Independent read-only review found no remaining blocker. `pnpm package:smoke` passed with 108 +entries / 369,157 bytes before this receipt update. A `git archive` of +`0e02daca5b4aab4c6a5b02e876aa10480f243849` was extracted into a new directory outside AlvenX; +`pnpm install --frozen-lockfile`, `pnpm brand:verify` and `pnpm test:browser` passed (4/4). +Ten current computed header properties match the preserved accepted Studio reference; canonical +CSS is unchanged. Exact PR/main integration receipts are retained in +`.workspace/audits/reprolock-english-demo-20260904/` in the parent AlvenX workspace and the PR, +so recording the final merge does not change the tested source tree. diff --git a/plans/03-brand-verifiable-demo.md b/plans/03-brand-verifiable-demo.md index 663337d..dfb9a80 100644 --- a/plans/03-brand-verifiable-demo.md +++ b/plans/03-brand-verifiable-demo.md @@ -65,7 +65,43 @@ preserve the failure record. Do not silently repair or terminate another task's - [x] Brand commit `0ed04d9`, independent asset validation and parent checks. - [x] Runnable Demo, meaningful regression tests and current evidence verification. - [x] Real differential, lifecycle tests, standalone install and browser acceptance. -- [ ] Review, PR/CI/merge, D main sync and exact delivery record. +- [x] Review, PR #3/CI/merge, D main sync and exact delivery record (main `a83195f`). Actual commands, observations, screenshots and limits belong in `harness/context/03-brand-verifiable-demo.md`. Product GO is not a source-merge condition. + +## README signal alignment — 2026-09-04 + +Owner request: every project README uses the same pure AlvenX wordmark followed by a separate +small signal line. ReproLock's signal is `FUNCTIONAL REGRESSION EVIDENCE`. The existing SVG +already matches the canonical master. Change only the README header and its brand instructions, +standalone assertion and registration reference; preserve the title, research state and Demo. + +Baseline: clean working tree; `node scripts/verify-brand.mjs` passed for five assets and one +README; the local and canonical SVG SHA-256 values both begin `8ae10e02c27091e29`. +Acceptance: exact requested header, byte-identical README body/SVG, standalone brand validation, +targeted script format/lint and diff checks. Parent brand/workspace verification is owned by the +coordinating task. No real target replay, dependency/version change, commit or push is required. + +## English Demo alignment — 2026-09-04 + +The owner requested an English Demo consistent with the other AlvenX products. This includes +static copy, dynamic statuses and errors, accessible labels, document language, matching setup +instructions and a current README screenshot. Use English only; no language switch or new dependency. +Keep the existing brand geometry, runner behavior, classifications, frozen sources and all original +experiment evidence unchanged. A new screenshot may display a saved run only if it says so explicitly. + +Baseline: main `a83195f`; `pnpm brand:verify` and `pnpm test:browser` passed (4/4). The parallel +brand task explicitly transferred its six completed changes and stopped writing this repository; +those changes were backed up and committed separately as `28c17d3` before Demo editing. + +One writer in the fixed D checkout, branch `codex/english-demo`. Translate the existing public +files and affected assertions/docs, inspect actual 390/900/1440px layout and all retained terminal +states, run the configured checks, verify an independent export and review the focused diff. +After required CI passes, merge under the existing authorization and synchronize D main. Remote +merge receipts are retained in the PR and local audit without changing the tested source tree. + +- [x] Inspect baseline, preserve incoming changes and obtain exclusive ownership. +- [x] English copy, documentation and current screenshot. +- [x] Browser/resource/layout, independent-export and configured engineering checks. +- [x] Independent review; exact-head PR/merge receipts close integration in the PR/local audit. diff --git a/scripts/verify-brand.mjs b/scripts/verify-brand.mjs index 656ddac..473cc0e 100644 --- a/scripts/verify-brand.mjs +++ b/scripts/verify-brand.mjs @@ -33,8 +33,8 @@ export async function verifyBrand(root) { const source = await readFile(join(root, name), "utf8"); assert.match( source, - /^

\s*AlvenX(?:\s*)<\/p>\s*# ReproLock\b/u, - `${name}: centered 320px canonical wordmark must precede the title`, + /^

\s*AlvenX\s*\s*FUNCTIONAL REGRESSION EVIDENCE<\/sub>\s*<\/p>\s*# ReproLock\b/u, + `${name}: centered 320px canonical wordmark and separate signal must precede the title`, ); } return { diff --git a/src/demo/public/app.js b/src/demo/public/app.js index a6c1dcb..5fbcb25 100644 --- a/src/demo/public/app.js +++ b/src/demo/public/app.js @@ -7,22 +7,22 @@ let active = false; let viewGeneration = 0; let pendingControl = false; const labels = { - preparing: "准备中", - running: "执行中", - completed: "执行已结束", - cancelled: "已取消", - timeout: "已超时", - "startup-error": "启动失败", - "execution-error": "执行错误", - "cleanup-error": "清理未确认", + preparing: "Preparing", + running: "Running", + completed: "Execution finished", + cancelled: "Cancelled", + timeout: "Timed out", + "startup-error": "Startup failed", + "execution-error": "Execution error", + "cleanup-error": "Cleanup unverified", }; const results = { - pass: "通过", - "functional-failure": "功能失败", - inconclusive: "无法判定", - "reset-error": "重置错误", - "target-startup-error": "启动错误", - "browser-runtime-error": "执行错误", + pass: "Passed", + "functional-failure": "Functional failure", + inconclusive: "Inconclusive", + "reset-error": "Reset error", + "target-startup-error": "Target startup error", + "browser-runtime-error": "Browser runtime error", }; async function control(action) { @@ -32,7 +32,7 @@ async function control(action) { body: "{}", }); const value = await response.json(); - if (!response.ok) throw new Error(value.error ?? "操作失败"); + if (!response.ok) throw new Error(value.error ?? "Operation failed"); return value; } @@ -40,10 +40,10 @@ function display(current, stored = false) { if (!current) return; const { run, attempts, verification } = current; byId("state-badge").textContent = - `${stored ? "已存记录 · " : ""}${labels[run.status] ?? run.status}`; + `${stored ? "Saved run · " : ""}${labels[run.status] ?? run.status}`; byId("phase").textContent = run.diagnostic ?? run.phase; byId("timing").textContent = - `${stored ? "读取旧记录;未重新执行。" : "本次开始:"}${run.startedAt}${run.finishedAt ? ` · 结束:${run.finishedAt}` : ""} · 已开始 ${current.started ?? attempts.length} 次 / 已完成 ${attempts.length} 次`; + `${stored ? "Not re-executed. Started: " : "Started: "}${run.startedAt}${run.finishedAt ? ` · Finished: ${run.finishedAt}` : ""} · ${current.started ?? attempts.length} started / ${attempts.length} completed`; for (const [side, name] of [ ["pre-fix", "pre"], ["post-fix", "post"], @@ -64,8 +64,8 @@ function display(current, stored = false) { ).length; const first = attempts.find((entry) => entry.firstFailedCheckpoint); byId("checkpoint").textContent = - `首个失败检查点:${first ? `${first.side} #${first.attempt} / ${first.firstFailedCheckpoint}` : "尚无观察"}`; - byId("observed-count").textContent = `${attempts.length} 次已完成`; + `First failed checkpoint: ${first ? `${first.side} #${first.attempt} / ${first.firstFailedCheckpoint}` : "none observed"}`; + byId("observed-count").textContent = `${attempts.length} completed`; byId("attempts").replaceChildren( ...attempts.map((entry) => { const row = document.createElement("tr"); @@ -83,8 +83,8 @@ function display(current, stored = false) { ); byId("verification").classList.toggle("confirmed", verification?.differential === true); byId("verification").textContent = verification - ? `完整性:${verification.integrity ? "通过" : "未通过"} · 记录一致性:${verification.consistent ? "通过" : "未通过"} · 20 + 20 差分:${verification.differential ? "独立校验通过" : "未确认"}${verification.issues.length ? `。${verification.issues.join(";")}` : ""}` - : "进度是暂存观察;执行、报告和清理完成后,再独立校验结论。"; + ? `Integrity: ${verification.integrity ? "Passed" : "Failed"} · Record consistency: ${verification.consistent ? "Passed" : "Failed"} · 20 + 20 differential: ${verification.differential ? "Independently verified" : "Unconfirmed"}${verification.issues.length ? `. ${verification.issues.join("; ")}` : ""}` + : "Progress is provisional. Independent verification follows execution, reporting and cleanup."; byId("export").hidden = !verification; byId("export").href = `/api/export/${run.id}`; byId("export").download = `reprolock-${run.id}.json`; @@ -96,7 +96,7 @@ async function refresh() { busy = true; try { const response = await fetch("/api/state"); - if (!response.ok) throw new Error("无法读取本地运行状态"); + if (!response.ok) throw new Error("Could not read local run state"); const state = await response.json(); active = state.active; byId("pre-revision").textContent = state.case.revisions["pre-fix"]; @@ -106,8 +106,8 @@ async function refresh() { byId("check").disabled = state.active; if (!showingStored) display(state.current); byId("history-verification").textContent = state.historical.verification.ok - ? "已存完整证据包:一致性与冻结输入校验通过" - : "已存证据包未通过校验;请检查来源"; + ? "Stored bundle: consistency and frozen inputs verified" + : "Stored bundle verification failed; inspect the source"; byId("history-json").textContent = JSON.stringify(state.historical, null, 2); if (JSON.stringify(state.runs) !== lastRuns) { lastRuns = JSON.stringify(state.runs); @@ -122,7 +122,7 @@ async function refresh() { const requestedView = ++viewGeneration; try { const response = await fetch(link.href); - if (!response.ok) throw new Error("这次运行尚未完成归档"); + if (!response.ok) throw new Error("This run has not finished archiving"); const stored = await response.json(); if (active || pendingControl || requestedView !== viewGeneration) return; showingStored = true; @@ -137,7 +137,8 @@ async function refresh() { ); } } catch (error) { - byId("phase").textContent = `${error.message};状态未知,不代表运行成功。`; + byId("phase").textContent = + `${error.message}. Run state is unknown; success has not been established.`; } finally { busy = false; } @@ -162,7 +163,7 @@ byId("cancel").addEventListener("click", async () => { byId("cancel").disabled = true; try { await control("cancel"); - byId("phase").textContent = "正在取消并清理所属进程…"; + byId("phase").textContent = "Cancelling and cleaning up owned processes…"; } catch (error) { byId("phase").textContent = error.message; } @@ -171,7 +172,8 @@ byId("check").addEventListener("click", async () => { byId("check").disabled = true; try { const result = await control("check"); - byId("prerequisites").textContent = `${result.ok ? "已就绪" : "未就绪"} · ${result.diagnostic}`; + byId("prerequisites").textContent = + `${result.ok ? "Ready" : "Not ready"} · ${result.diagnostic}`; } catch (error) { byId("prerequisites").textContent = error.message; } finally { @@ -187,7 +189,7 @@ fetch("/test/safe-unfollow-163.spec.ts") byId("test-source").textContent = source; }) .catch(() => { - byId("test-source").textContent = "源码加载失败,请检查本地资源"; + byId("test-source").textContent = "Source could not be loaded; check local resources"; }); void refresh(); setInterval(() => { diff --git a/src/demo/public/index.html b/src/demo/public/index.html index 15ab340..4766217 100644 --- a/src/demo/public/index.html +++ b/src/demo/public/index.html @@ -1,57 +1,57 @@ - + - ReproLock · 可查验的本地回归 + ReproLock · AlvenX - +

AlvenX - +
-

FUNCTIONAL REGRESSION · SINGLE CASE

让修复,
有据可查。

-
SPIKE_CONDITIONAL

同一份 Playwright 测试,在修复前后各执行 20 次。
用真实界面结果、独立校验和保留的证据,检查一次修复。

这是 Safe Unfollow #163 的技术演示。人工基线也能达到稳定差分;节省时间和维护成本尚未证明。

+

FUNCTIONAL REGRESSION · SINGLE CASE

Make fixes
verifiable.

+
SPIKE_CONDITIONAL

Run the same Playwright test 20 times on each revision.
Check the fix with actual UI outcomes, independent verification and retained evidence.

A technical Demo of Safe Unfollow #163. The manual baseline also achieves a stable differential; time and maintenance savings remain unproven.

-
01 / 案例用户提供的本地目标
+
01 / CASEUser-supplied local target

Safe Unfollow #163

-

中断分析后,上传页应恢复可用。

-

重开上传页时,残留的加载状态不应阻止下一次上传。每次测试先清空并验证同源状态,再注入固定的中断场景。

-
修复前
修复后
-
目标地址
127.0.0.1:4173
执行方式
Chromium · 1 worker · 0 retries
独立检查点
处理提示消失、输入可用、空闲提示可见
模型调用
0 · 重放无需模型
-
查看实际冻结测试

普通 Playwright 源码,独立运行不依赖 ReproLock。

加载源码…
+

The upload page should recover after interrupted analysis.

+

A stale loading state should not block the next upload. Each attempt clears and verifies origin state, then injects the same interruption scenario.

+
Pre-fix
Post-fix
+
Target
127.0.0.1:4173
Execution
Chromium · 1 worker · 0 retries
Independent checkpoints
Processing cleared, input enabled, idle message visible
Model calls
0 · Model-free replay
+
Inspect the frozen test

Plain Playwright source. Runs independently without ReproLock.

Loading source…
-
02 / 本次运行尚未执行
-

验证这次差分

-

先检查明确配置的两个本地版本,顺序启动、执行、清理。新运行会创建独立证据目录。

-
-
需要配置目标路径并安装本地依赖
-
等待开始已存实验显示在下方,不计入本次结果。
-
修复前 0 / 20
修复后 0 / 20
-
0通过
0功能失败
0无法判定
0执行错误
-

首个失败检查点:尚无观察

-
执行、报告和清理完成后,再独立校验本次结论。
- -
检查逐次结果 0 次已完成
版本 / 次数结果首个失败位置
+
02 / RUNNot run
+

Verify the differential

+

Check the two configured local revisions, then start, test and clean up each in sequence. Every run creates a separate evidence directory.

+
+
Configure target paths and install local dependencies
+
Waiting to startStored experiments are shown below and do not count toward this run.
+
Pre-fix 0 / 20
Post-fix 0 / 20
+
0Passed
0Functional failures
0Inconclusive
0Execution errors
+

First failed checkpoint: none observed

+
Independent verification follows execution, reporting and cleanup.
+ +
Inspect individual attempts 0 completed
Version / attemptResultFirst failed checkpoint
-
03 / 已存实验 · 非本次运行

保留结论,也保留边界。

2026-09-01 盲测;2026-09-04 独立复验。生成测试与诚实的人工基线都得到 20/20 预期失败、20/20 通过。

-

正在校验已存证据…

来源:revalidation/2026-09-04/execution.json

查看已存实验摘要与校验
+
03 / STORED EXPERIMENTS

Keep the evidence and its limits.

Stored experiments, not this run. Blind test: 2026-09-01. Independent revalidation: 2026-09-04. Both the generated test and manual baseline recorded 20/20 expected pre-fix failures and 20/20 post-fix passes.

+

Verifying stored evidence…

Source: revalidation/2026-09-04/execution.json

Inspect stored summaries and verification
-

本机保留的运行

包含成功、失败和取消记录。重新打开旧记录不会重新执行测试。

-
ReproLock / AlvenX单案例技术验证 · 无公开部署 · 产品价值仍待验证字体许可
+

Saved local runs

Includes completed, failed and cancelled runs. Opening a saved record does not execute the test again.

+
diff --git a/tests/playwright/demo.spec.ts b/tests/playwright/demo.spec.ts index 9a1bf6b..b12efc9 100644 --- a/tests/playwright/demo.spec.ts +++ b/tests/playwright/demo.spec.ts @@ -32,7 +32,8 @@ test("Demo loads standalone brand resources and preserves canonical responsive h const errors: string[] = []; page.on("pageerror", (error) => errors.push(error.message)); await page.goto(demo.address); - await expect(page.locator("#history-verification")).toContainText("校验通过"); + await expect(page.locator("html")).toHaveAttribute("lang", "en"); + await expect(page.locator("#history-verification")).toContainText("frozen inputs verified"); for (const width of [390, 900, 1440]) { await page.setViewportSize({ width, height: 1000 }); await page.evaluate(() => document.fonts.ready); @@ -88,15 +89,15 @@ test("startup failure has zero current observations and can be reopened without page, }) => { await page.goto(demo.address); - await page.getByRole("button", { name: "运行 20 + 20 次验证" }).click(); - await expect(page.locator("#state-badge")).toHaveText("启动失败"); - await expect(page.locator("#observed-count")).toContainText("0 次已完成"); - await expect(page.locator("#verification")).toContainText("20 + 20 差分:未确认"); - await expect(page.locator("#history-verification")).toContainText("已存完整证据包"); + await page.getByRole("button", { name: "Run 20 + 20 checks" }).click(); + await expect(page.locator("#state-badge")).toHaveText("Startup failed"); + await expect(page.locator("#observed-count")).toContainText("0 completed"); + await expect(page.locator("#verification")).toContainText("20 + 20 differential: Unconfirmed"); + await expect(page.locator("#history-verification")).toContainText("Stored bundle:"); const id = (await page.locator("#run-id").innerText()).replace("output/demo/", ""); await page.locator("#retained-runs").getByText(id, { exact: true }).click(); - await expect(page.locator("#state-badge")).toHaveText("已存记录 · 启动失败"); - await expect(page.locator("#timing")).toContainText("未重新执行"); + await expect(page.locator("#state-badge")).toHaveText("Saved run · Startup failed"); + await expect(page.locator("#timing")).toContainText("Not re-executed"); const exported = await page.request.get(`${demo.address}/api/export/${id}`); expect((await exported.json()).schemaVersion).toBe(1); }); @@ -126,5 +127,5 @@ test("concurrent controls admit exactly one configured run and reject foreign co headers: { Origin: "https://example.invalid" }, }); expect(rejected.status()).toBe(403); - await expect(page.locator("#state-badge")).toHaveText("启动失败"); + await expect(page.locator("#state-badge")).toHaveText("Startup failed"); });