From ee911667cbe664d7cbf8a914ee076d766a048c64 Mon Sep 17 00:00:00 2001
From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Date: Sat, 24 Oct 2026 19:28:53 +0800
Subject: [PATCH 1/2] fix(research): give native measurements a clear reading
hierarchy
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
---
.../goal-research-progress.css | 34 +++--
.../goal-research-progress.tsx | 37 +++--
examples/personal-workspace-browser-smoke.mjs | 2 +
.../research-history.mjs | 30 ++--
.../research-native-reading.mjs | 131 ++++++++++++++++++
5 files changed, 201 insertions(+), 33 deletions(-)
create mode 100644 examples/personal-workspace-browser/research-native-reading.mjs
diff --git a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.css b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.css
index d1a782b36e..a5eaf49c60 100644
--- a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.css
+++ b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.css
@@ -67,19 +67,28 @@
.research-progress .research-effect-citations button { display: inline-flex; align-items: center; gap: 4px; min-height: 44px; font: inherit; font-size: var(--text-body); background: transparent; border: 0; border-radius: 0; padding: 4px 0; color: var(--pw-muted); cursor: pointer; }
.research-effect-citations button:hover { text-decoration: underline; }
.research-native-results { border-block-start: 1px solid var(--pw-line); margin-block-start: 16px; padding-block-start: 16px; }
-.research-native-results h4 { margin: 0; font-size: var(--text-caption); font-weight: 600; }
+.research-native-results h4 { margin: 0; font-size: var(--text-body); font-weight: 600; }
.research-native-results > p { margin-block: 8px; }
-.research-native-values { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px 16px; margin-block: 12px; }
-.research-native-values > div { min-width: 0; }
-.research-native-values dt, .research-native-values dd > span { font-size: var(--text-caption); color: var(--pw-muted); }
-.research-native-values dd { margin: 0; }
-.research-native-values dd button { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0; font: inherit; background: none; border: 0; color: var(--pw-text); cursor: pointer; }
-.research-native-values dd button:hover { text-decoration: underline; }
-.research-native-values dd button:focus-visible { outline: 2px solid var(--pw-blue); outline-offset: 2px; }
+.research-native-reading { display: flex; align-items: center; flex-wrap: wrap; gap: 16px 48px; margin-block: 16px; }
+.research-native-best { min-width: 0; }
+.research-native-reading dl { margin: 0; }
+.research-native-reading dt { font-size: var(--text-body); color: var(--pw-muted); }
+.research-native-reading dd { margin: 4px 0 0; }
+.research-native-reading dd button { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 8px; max-width: 100%; min-height: 44px; padding: 0; font: inherit; background: none; border: 0; color: var(--pw-text); text-align: start; cursor: pointer; }
+.research-native-best dd button { align-items: baseline; }
+.research-native-reading dd button svg { align-self: center; flex-shrink: 0; color: var(--pw-muted); }
+.research-native-reading dd button:hover strong { text-decoration: underline; }
+.research-native-reading dd button:focus-visible { outline: 2px solid var(--pw-blue); outline-offset: 2px; }
+.research-native-reading strong { font-weight: 600; font-variant-numeric: tabular-nums; font-size: var(--text-lead); }
+.research-native-best strong { font-size: var(--text-display); line-height: var(--leading-title); }
+.research-native-unit { font-size: var(--text-body); color: var(--pw-muted); }
+.research-native-best > p { margin: 4px 0 0; font-size: var(--text-body); }
+.research-native-context { display: flex; align-items: baseline; flex-wrap: wrap; gap: 12px 32px; }
+.research-native-context > div { min-width: 0; }
+.research-native-unknown { display: inline-block; padding-block: 10px; font-size: var(--text-body); color: var(--pw-muted); }
+.research-native-scope { display: flex; flex-wrap: wrap; gap: 4px 16px; color: var(--pw-muted); font-size: var(--text-body); }
.research-native-basis dd { margin: 4px 0 12px; }
-.research-native-values strong { font-size: var(--text-body); font-weight: 600; font-variant-numeric: tabular-nums; }
-.research-native-values small { display: block; }
-.research-native-basis { font-size: var(--text-caption); }
+.research-native-basis, .research-progress .research-native-basis p, .research-native-basis > summary { font-size: var(--text-body); }
.research-usage-basis { display: grid; grid-template-columns: 140px minmax(0, 1fr); gap: 12px 24px; margin-block: 8px 20px; font-size: var(--text-body); line-height: var(--leading-prose); }
.research-progress-basis dt, .research-usage-basis dt { color: var(--pw-muted); }
.research-progress-basis dd, .research-usage-basis dd { margin: 0; }
@@ -122,7 +131,8 @@
.research-progress select { max-width: 100%; }
.research-effect-metrics { gap: 8px; }
.research-assessment > summary { gap: 8px; }
- .research-native-values { grid-template-columns: repeat(2, minmax(0, 1fr)); }
+ .research-native-reading { align-items: flex-start; flex-direction: column; gap: 20px; }
+ .research-native-context { gap: 12px 24px; }
.research-progress-values { grid-template-columns: 1fr; gap: 16px; }
.research-request-values { grid-template-columns: 1fr; }
.research-usage-basis { grid-template-columns: 1fr; gap: 4px; }
diff --git a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.tsx b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.tsx
index 148c5affeb..d6cd03b4d0 100644
--- a/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.tsx
+++ b/apps/presentation/dashboard/src/features/personal-workspace/goal-research-progress.tsx
@@ -1,5 +1,5 @@
import {useId, useRef, useState} from "react";
-import {ArrowUpRight, ChevronDown, X} from "lucide-react";
+import {ArrowUpRight, ChevronDown, FileText, X} from "lucide-react";
import {TRAJECTORY_METRICS} from "../../../../../../loopx/control_plane/capabilities/trajectory_assessment_types.js";
import type {AssessmentCitation, AssessmentVerdict, TrajectoryAssessment, TrajectoryEpisode, TrajectoryInput, TrajectoryMetric, TrajectorySolverUsage} from "../../../../../../loopx/control_plane/capabilities/trajectory_assessment_types.js";
import type {TrajectoryNativeOutcomes} from "../../../../../../loopx/control_plane/capabilities/trajectory_native_outcomes.js";
@@ -121,27 +121,38 @@ function NativeResults({native, zh, onCitation}: {native: ResearchProgressPack["
const outcomes = native?.projection;
if (!native || !outcomes) return
{zh ? "原生测量 · 未采集" : "Native measurements · not captured"}
;
const historical = native.applicability === "historical";
- const points = [["initial", "首次提交", "Initial submission"], ["best_valid", "窗口内最佳有效值", "Best valid in capture"], ["retained", "原生保留结果", "Native retained result"], ["final_valid", "最后有效提交", "Final valid submission"]] as const;
+ const points = [["best_valid", "窗口内最佳有效值", "Best valid in capture"], ["initial", "首次提交", "Initial submission"], ["final_valid", "最后有效提交", "Final valid submission"], ["retained", "原生保留结果", "Native retained result"]] as const;
+ const period = new Intl.DateTimeFormat(zh ? "zh-CN" : "en", {timeZone: "UTC", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", hour12: false,
+ ...(new Date(outcomes.start).getUTCFullYear() !== new Date(outcomes.end).getUTCFullYear() ? {year: "numeric"} : {})});
+ const value = ([key, cn, en]: typeof points[number]) => {
+ const point = outcomes[key];
+ return
{zh ? cn : en} {point ?
+ onCitation(point.citation, event.currentTarget)} aria-label={`${zh ? cn : en}: ${String(point.value)} ${outcomes.metric.unit} · ${zh ? "查看原始证据" : "Read original evidence"}`}>
+ {String(point.value)} {key === "best_valid" ? {outcomes.metric.unit} : null}
+ : {zh ? "未知" : "Unknown"}{key === "best_valid" ? · {outcomes.metric.unit} : null} } ;
+ };
return
{historical ? (zh ? "历史原生测量" : "Historical native measurements") : (zh ? "原生测量" : "Native measurements")}
{zh ? "最佳只限本次捕获窗口;原生保留与最后提交可能不同。未采集的值保留未知,不记零。" : "Best is limited to this capture; retained and final submissions can differ. Uncaptured values remain unknown, not zero."}
{zh ? "检验过收益、采用了证据及原目标达成各需各自证据,不能由这些数值推断。" : "Utility testing, evidence adoption and original-objective success each need their own evidence; these values cannot establish them."}
{historical ? {zh ? "来源已变化或不可读;以下仅为历史捕获,当前结果未核验。" : "The source changed or is unavailable. These are historical captures; current results are unverified."}
: null}
- {outcomes.metric.name} · {outcomes.metric.unit} · {outcomes.metric.higher_is_better ? (zh ? "越高越好" : "higher is better") : (zh ? "越低越好" : "lower is better")} · {outcomes.valid_count} / {outcomes.sample_count} {zh ? "项有效结果" : "valid results"}
- {outcomes.complete ? (zh ? "声明为完整前缀" : "Declared complete prefix") : (zh ? "部分窗口,起点未知" : "Partial window; initial unknown")} · {outcomes.start} — {outcomes.end}
- {points.map(([key, cn, en]) => {
- const point = outcomes[key];
- return {zh ? cn : en} {point ? <>
- onCitation(point.citation, event.currentTarget)} aria-label={`${zh ? cn : en}: ${String(point.value)} · ${zh ? "查看原始证据" : "Read original evidence"}`}>{String(point.value)}
- {zh ? "提交" : "Submission"} {point.submission_index}
- > : {zh ? "— 未知" : "— Unknown"} } ;
- })}
+
+
{value(points[0])} {outcomes.metric.name} · {outcomes.metric.higher_is_better ? (zh ? "越高越好" : "higher is better") : (zh ? "越低越好" : "lower is better")}
+
{points.slice(1).map(value)}
+
+ {outcomes.valid_count} / {outcomes.sample_count} {zh ? "项有效结果" : "valid results"}
+ {period.formatRange(new Date(outcomes.start), new Date(outcomes.end))} UTC
+ {!outcomes.complete ? {zh ? "部分窗口 · 起点未知" : "Partial window · initial unknown"} : null}
+
{zh ? "测量来源与限制" : "Measurement sources and limits"}
- {native.artifact}{native.artifact_sha256}
+
{zh ? "捕获窗口" : "Capture window"} {outcomes.start} — {outcomes.end} {outcomes.complete ? (zh ? "声明为完整前缀" : "Declared complete prefix") : (zh ? "部分窗口,起点未知" : "Partial window; initial unknown")}
+
{zh ? "指标与单位" : "Metric and unit"} {outcomes.metric.name} · {outcomes.metric.unit}
+
{zh ? "方法" : "Method"} {outcomes.method}
+
{zh ? "来源" : "Source"} {native.artifact}{native.artifact_sha256}
{points.map(([key, cn, en]) => {
const point = outcomes[key];
- return point ?
{zh ? cn : en} {point.candidate_ref} {zh ? "提交" : "Submitted"}: {point.submitted_at ?? (zh ? "未知" : "Unknown")} {zh ? "收到结果" : "Result received"}: {point.observed_at} : null;
+ return point ?
{zh ? cn : en} {point.candidate_ref} {zh ? "提交" : "Submission"} {point.submission_index} · {zh ? "提交时间" : "Submitted at"}: {point.submitted_at ?? (zh ? "未知" : "Unknown")} {zh ? "收到结果" : "Result received"}: {point.observed_at} : null;
})}
{outcomes.limitations.map((line, i) => {line} )}
diff --git a/examples/personal-workspace-browser-smoke.mjs b/examples/personal-workspace-browser-smoke.mjs
index 9bf71d6c7d..6d310b86fc 100644
--- a/examples/personal-workspace-browser-smoke.mjs
+++ b/examples/personal-workspace-browser-smoke.mjs
@@ -76,6 +76,7 @@ import { researchRecordSearchScenario } from "./personal-workspace-browser/resea
import { researchRouteReadingScenario } from "./personal-workspace-browser/research-route-reading.mjs";
import { researchDisplayLanguageScenario } from "./personal-workspace-browser/research-display-language.mjs";
import { researchMeasurementsScenario } from "./personal-workspace-browser/research-measurements.mjs";
+import { researchNativeReadingScenario } from "./personal-workspace-browser/research-native-reading.mjs";
import { loopxModeScenario } from "./personal-workspace-browser/loopx-mode.mjs";
import { progressiveLoadingScenario } from "./personal-workspace-browser/progressive-loading.mjs";
import { stewardJourneyScenario } from "./personal-workspace-browser/steward-journey.mjs";
@@ -129,6 +130,7 @@ scenarioCatalog.push(attentionUserActionScenario);
scenarioCatalog.push(researchResultsScenario);
scenarioCatalog.push(researchHistoryScenario);
scenarioCatalog.push(researchMeasurementsScenario);
+scenarioCatalog.push(researchNativeReadingScenario);
scenarioCatalog.push(researchFindingReaderScenario);
scenarioCatalog.push(researchRecordSearchScenario);
scenarioCatalog.push(researchRouteReadingScenario);
diff --git a/examples/personal-workspace-browser/research-history.mjs b/examples/personal-workspace-browser/research-history.mjs
index 881a7c2447..e04d0047be 100644
--- a/examples/personal-workspace-browser/research-history.mjs
+++ b/examples/personal-workspace-browser/research-history.mjs
@@ -137,7 +137,14 @@ export const researchHistoryScenario = {
const native = nativePage.getByRole('region', {name: '原生测量', exact: true});
await native.waitFor();
assert.match(await native.innerText(), /2 \/ 3.*项有效结果/s);
- assert.match(await native.innerText(), /首次提交.*7.*窗口内最佳有效值.*3.*原生保留结果.*未知/s);
+ assert.equal(await native.locator('[data-native-point="best_valid"] strong').textContent(), '3');
+ assert.equal(await native.locator('[data-native-point="initial"] strong').textContent(), '7');
+ assert.match(await native.locator('[data-native-point="retained"]').innerText(), /未知/);
+ assert(await native.locator('[data-native-point="best_valid"] strong').evaluate(e => parseFloat(getComputedStyle(e).fontSize) >= 32));
+ assert(await native.locator('[data-native-point="initial"] strong').evaluate(e => parseFloat(getComputedStyle(e).fontSize) >= 16));
+ assert.match(await native.locator('.research-native-scope').innerText(), /UTC/);
+ assert.doesNotMatch(await native.locator('.research-native-scope').innerText(), /T00:00:00Z/);
+ assert.equal(await native.locator('.research-native-basis').evaluate(e => e.open), false);
assert.equal(await nativePage.locator('.research-progress-basis').evaluate(e => e.open), false);
assert.equal(await nativePage.locator('.research-effect-empty').isVisible(), true, 'Measured progress remains readable before model analysis');
await nativePage.screenshot({path: resolve(outputDir, 'research-native-default-desktop.png'), animations: 'disabled'});
@@ -149,6 +156,7 @@ export const researchHistoryScenario = {
await original.press('Escape');
assert.equal(await nativePage.locator('.research-analysis').count(), 0, 'Reading a native citation does not open or run model analysis');
await nativePage.setViewportSize({width: 390, height: 844});
+ await native.getByRole('heading', {name: '原生测量', exact: true}).click();
await nativePage.evaluate(() => {for (const e of document.querySelectorAll('*')) if (e.scrollTop) e.scrollTop = 0;});
assert(await nativePage.evaluate(() => document.documentElement.scrollWidth <= innerWidth + 1));
await nativePage.screenshot({path: resolve(outputDir, 'research-native-default-mobile.png'), animations: 'disabled'});
@@ -202,6 +210,8 @@ export const researchHistoryScenario = {
await synthesisPage.evaluate(() => {for (const e of document.querySelectorAll('*')) if (e.scrollTop) e.scrollTop = 0;});
assert(await synthesisPage.evaluate(() => document.documentElement.scrollWidth <= innerWidth + 1));
await synthesisPage.screenshot({path: resolve(outputDir, 'research-synthesis-ordinary-mobile.png'), animations: 'disabled'});
+ await reading.getByRole('button', {name: '汇报', exact: true}).click();
+ await synthesisPage.screenshot({path: resolve(outputDir, 'research-synthesis-report-mobile.png'), animations: 'disabled'});
await synthesisPage.getByRole('button', {name: '深入解读', exact: true}).click();
const analysis = synthesisPage.getByRole('region', {name: '轨迹深度分析', exact: true});
await analysis.waitFor();
@@ -889,8 +899,11 @@ Path(sys.argv[1]).write_text(json.dumps({'goal_id':goal,'display_name':'Syntheti
await improvement.locator('summary').click();
await basis.locator(':scope > summary').click();
const nativeResults = progress.getByRole('region', {name: '原生测量', exact: true});
- assert.match(await nativeResults.innerText(), /首次提交.*7.*提交 1/s, 'Native measurements retain their source-bound endpoints');
- assert.match(await nativeResults.innerText(), /原生保留结果.*3.*提交 3/s);
+ assert.equal(await nativeResults.locator('[data-native-point="initial"] strong').textContent(), '7', 'Native measurements retain their source-bound endpoints');
+ assert.equal(await nativeResults.locator('[data-native-point="retained"] strong').textContent(), '3');
+ await nativeResults.locator('.research-native-basis > summary').click();
+ assert.match(await nativeResults.locator('.research-native-basis').innerText(), /candidate-first.*提交 1/s, 'Exact submission identity is available on demand');
+ await nativeResults.locator('.research-native-basis > summary').click();
assert.match(await nativeResults.innerText(), /越低越好/);
await nativeResults.getByRole('button', {name: /首次提交.*查看原始证据/}).scrollIntoViewIfNeeded();
assert(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth + 1), 'Native details remain readable on a narrow screen');
@@ -980,8 +993,8 @@ Path(sys.argv[1]).write_text(json.dumps({'goal_id':goal,'display_name':'Syntheti
assert.equal(await improvement.locator('[data-retained-improvement]').textContent(), '0', 'A rejected candidate does not create realized gain');
await basis.locator(':scope > summary').click();
assert.match(await nativeResults.innerText(), /历史原生测量.*当前结果未核验/s, 'Stale measurements never appear current');
- assert.match(await nativeResults.locator('[data-native-point="retained"]').innerText(), /3.*提交 3/s);
- assert.match(await nativeResults.locator('[data-native-point="final_valid"]').innerText(), /5.*提交 4/s, 'The last submission is not silently presented as retained or best');
+ assert.equal(await nativeResults.locator('[data-native-point="retained"] strong').textContent(), '3');
+ assert.equal(await nativeResults.locator('[data-native-point="final_valid"] strong').textContent(), '5', 'The last submission is not silently presented as retained or best');
await page.reload({waitUntil: "networkidle"});
await analysis.locator("header p").first().filter({hasText: /^Synthetic analysis B$/}).waitFor();
await page.setViewportSize({width: 390, height: 844});
@@ -1017,6 +1030,7 @@ Path(sys.argv[1]).write_text(json.dumps({'goal_id':goal,'display_name':'Syntheti
await analysis.locator("header p").first().filter({hasText: /^Synthetic analysis B$/}).waitFor();
await analysis.press("Escape");
await analysis.waitFor({state: "hidden"});
+ await page.waitForFunction(() => document.activeElement?.textContent?.trim() === "查看分析");
assert.equal(await history.getByRole("button", {name: "查看分析", exact: true}).evaluate(button => button === document.activeElement), true);
await progress.getByRole("combobox").focus();
await progress.getByRole("combobox").selectOption("c".repeat(64));
@@ -1054,9 +1068,9 @@ Path(sys.argv[1]).write_text(json.dumps({'goal_id':goal,'display_name':'Syntheti
assert.equal(await analysis.count(), 0, 'Choosing an unanalysed source never requests analysis');
assert.equal(await improvement.locator('[data-retained-improvement]').textContent(), '—', 'Missing comparison evidence is unknown, never zero');
await basis.locator(':scope > summary').click();
- assert.match(await nativeResults.innerText(), /原生保留结果.*3.*提交 3/s, 'Native facts do not require an analyzer result');
- assert.match(await nativeResults.innerText(), /部分窗口,起点未知/);
- assert.match(await nativeResults.locator('[data-native-point="initial"]').innerText(), /— 未知/);
+ assert.equal(await nativeResults.locator('[data-native-point="retained"] strong').textContent(), '3', 'Native facts do not require an analyzer result');
+ assert.match(await nativeResults.innerText(), /部分窗口 · 起点未知/);
+ assert.match(await nativeResults.locator('[data-native-point="initial"]').innerText(), /未知/);
const nativeCitation = nativeResults.getByRole('button', {name: /原生保留结果.*查看原始证据/});
await nativeCitation.focus(); await nativeCitation.press('Enter');
await citedOriginal.waitFor();
diff --git a/examples/personal-workspace-browser/research-native-reading.mjs b/examples/personal-workspace-browser/research-native-reading.mjs
new file mode 100644
index 0000000000..9e9f3dec0d
--- /dev/null
+++ b/examples/personal-workspace-browser/research-native-reading.mjs
@@ -0,0 +1,131 @@
+import assert from "node:assert/strict";
+import {createHash} from "node:crypto";
+import {mkdtemp, readFile, rm, writeFile} from "node:fs/promises";
+import {tmpdir} from "node:os";
+import {resolve} from "node:path";
+import {outputDir, repoRoot} from "./fixture.mjs";
+import {startHistoryOwner} from "./research-history.mjs";
+
+// Real registration, native projection and HTTP readback. Independent expected
+// values protect role identity: a highlighted best is never invented retention.
+export const researchNativeReadingScenario = {
+ id: "research-native-reading",
+ async run({browser, collectCoverage}) {
+ const cases = [
+ {id: "lower-negative", values: [-1, -3, -2], higher: false, retained: 0, expected: [-3, -1, -2, -1]},
+ {id: "higher-zero", values: [-3, 0, -1], higher: true, retained: 0, expected: [0, -3, -1, -3]},
+ {id: "invalid-first", values: [null, 0, -1], higher: true, retained: null, expected: [0, null, -1, null]},
+ {id: "all-invalid", values: [null, null], higher: false, retained: null, expected: [null, null, null, null]},
+ {id: "partial", values: [8, 7, 9], higher: true, retained: 1, partial: true, expected: [9, null, 9, 7]},
+ {id: "empty", values: [], higher: true, retained: null, partial: true, expected: [null, null, null, null]},
+ {id: "long-unit", values: [3, 1, 2], higher: false, retained: 0, unit: "synthetic-unit-".repeat(5), expected: [1, 3, 2, 3]},
+ ];
+ const root = await mkdtemp(resolve(tmpdir(), "loopx-native-reading-"));
+ let owner, page;
+ try {
+ const fixture = JSON.parse(await readFile(resolve(repoRoot, "apps/presentation/dashboard/src/data/fixtures/research-native-readback.json"), "utf8"));
+ const original = fixture.analyses[0];
+ fixture.events = [];
+ fixture.analyses = cases.map(c => {
+ const a = structuredClone(original), native = JSON.parse(a.artifacts["native.json"]);
+ a.title = c.id;
+ a.input.scope.run_id = c.id;
+ native.scope = {...a.input.scope};
+ native.complete = !c.partial;
+ native.metric.higher_is_better = c.higher;
+ if (c.unit) native.metric.unit = c.unit;
+ native.retained_result_id = c.retained === null ? null : `result-${c.retained}`;
+ native.samples = c.values.map((value, index) => ({
+ submission_index: index + (c.partial ? 7 : 1), result_id: `result-${index}`, candidate_ref: `candidate-${index}`,
+ submitted_at: null, observed_at: `2026-01-01T00:0${index + 1}:00Z`, valid: value !== null, value,
+ citation: {source_id: "facts", first_line: index + 1, last_line: index + 1},
+ }));
+ const text = c.values.map((v, i) => `Synthetic observation ${i}: value ${v ?? "unknown"}; valid ${v !== null}.`).join("\n") || "No measurements captured.";
+ a.artifacts["facts.txt"] = text;
+ a.artifacts["native.json"] = JSON.stringify(native);
+ Object.assign(a.input.sources[0], {text, artifact_sha256: createHash("sha256").update(text).digest("hex")});
+ return a;
+ });
+ const path = resolve(root, "cases.json");
+ await writeFile(path, JSON.stringify(fixture));
+ owner = await startHistoryOwner(path);
+ page = await browser.newPage({viewport: {width: 1280, height: 900}, hasTouch: true});
+ const errors = [];
+ page.on("pageerror", error => errors.push(error.message));
+ if (collectCoverage) await page.coverage.startJSCoverage({resetOnNavigation: false});
+ await page.addInitScript(() => {if (!localStorage.getItem("loopx-pw-locale")) localStorage.setItem("loopx-pw-locale", "zh-CN");});
+ await page.goto(`${owner.base}/chat/?goalId=${fixture.goal_id}&view=research&statusUrl=%2Fstatus.json`, {waitUntil: "domcontentloaded"});
+ const native = page.getByRole("region", {name: "原生测量", exact: true});
+ const selector = page.locator(".research-progress select");
+ for (const c of cases) {
+ await selector.selectOption({label: c.id});
+ const selected = await selector.inputValue();
+ await page.locator(`.research-progress-scope[data-pack-id="${selected}"]`).waitFor();
+ await native.waitFor();
+ for (const [index, key] of ["best_valid", "initial", "final_valid", "retained"].entries()) {
+ const reading = native.locator(`[data-native-point="${key}"]`);
+ if (c.expected[index] === null) {
+ assert.equal(await reading.locator("button").count(), 0);
+ assert.match(await reading.innerText(), /未知/);
+ } else assert.equal(await reading.locator("strong").textContent(), String(c.expected[index]));
+ }
+ assert.match(await native.innerText(), c.higher ? /越高越好/ : /越低越好/);
+ assert.match(await native.locator(".research-native-best .research-native-unit").textContent(), new RegExp(c.unit ?? "points"), "The raw unit remains visible even when no valid measurement exists");
+ assert.match(await native.locator(".research-native-scope").innerText(), new RegExp(`${c.values.filter(v => v !== null).length} / ${c.values.length}.*有效结果`));
+ if (c.partial) assert.match(await native.innerText(), /部分窗口 · 起点未知/);
+ await page.setViewportSize({width: 390, height: 844});
+ const details = native.locator(".research-native-basis");
+ if (await details.evaluate(e => e.open)) await details.locator(":scope > summary").click();
+ await details.locator(":scope > summary").focus();
+ await page.keyboard.press("Enter");
+ assert.match(await details.innerText(), /2026-01-01T00:00:00Z/);
+ assert(await details.evaluate(e => parseFloat(getComputedStyle(e).fontSize) >= 14));
+ assert(await native.evaluate(e => e.scrollWidth <= e.clientWidth + 1));
+ if (c.id === "lower-negative") {
+ await native.evaluate(e => e.scrollIntoView({block: "start"}));
+ await page.screenshot({path: resolve(outputDir, "research-native-sources-phone.png"), animations: "disabled"});
+ await page.setViewportSize({width: 1280, height: 900});
+ await page.screenshot({path: resolve(outputDir, "research-native-sources-desktop.png"), animations: "disabled"});
+ await page.setViewportSize({width: 390, height: 844});
+ await details.locator("li").last().scrollIntoViewIfNeeded();
+ await page.screenshot({path: resolve(outputDir, "research-native-source-tail-phone.png"), animations: "disabled"});
+ }
+ await details.locator(":scope > summary").tap();
+ if (c.id === "lower-negative") {
+ const retained = native.getByRole("button", {name: /原生保留结果.*查看原始证据/});
+ await retained.focus(); await retained.press("Enter");
+ const citation = page.getByRole("region", {name: "引用原文", exact: true});
+ await citation.waitFor();
+ await citation.getByText(/Synthetic observation 0: value -1/).waitFor();
+ assert.match(await citation.innerText(), /Synthetic observation 0: value -1/);
+ await citation.press("Escape");
+ await page.waitForFunction(() => document.activeElement?.getAttribute("aria-label")?.startsWith("原生保留结果:"));
+ await page.screenshot({path: resolve(outputDir, "research-native-negative-phone.png"), animations: "disabled"});
+ }
+ if (c.unit) {
+ await page.evaluate(() => document.documentElement.style.fontSize = "200%");
+ assert(await native.evaluate(e => e.scrollWidth <= e.clientWidth + 1), "Long unit remains readable at 200% text");
+ await page.screenshot({path: resolve(outputDir, "research-native-large-text-phone.png"), animations: "disabled"});
+ await page.evaluate(() => document.documentElement.style.removeProperty("font-size"));
+ }
+ await page.setViewportSize({width: 1280, height: 900});
+ }
+ await page.evaluate(() => localStorage.setItem("loopx-pw-locale", "en"));
+ await page.reload({waitUntil: "domcontentloaded"});
+ await page.getByRole("region", {name: "Native measurements", exact: true}).waitFor();
+ await page.getByRole("button", {name: "About native measurements", exact: true}).focus();
+ await page.getByRole("tooltip").waitFor({state: "visible"});
+ await page.keyboard.press("Escape");
+ const readback = await (await page.request.get(`${owner.base}/fixture/readback`)).json();
+ assert.equal(readback.source_unchanged, true);
+ assert.equal(readback.mutation_attempts, 0);
+ assert.deepEqual(errors, []);
+ return {coverageEntries: collectCoverage ? await page.coverage.stopJSCoverage() : [],
+ note: "real-owner native result roles: signed/zero/invalid/missing/partial, exact citations, readable desktop/390/200%, Chinese and English; no mutation"};
+ } finally {
+ await page?.close();
+ await owner?.close();
+ await rm(root, {recursive: true, force: true});
+ }
+ },
+};
From 0090106a92a98407e868a1f1c42298f6e1ce26ec Mon Sep 17 00:00:00 2001
From: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Date: Sat, 24 Oct 2026 19:30:24 +0800
Subject: [PATCH 2/2] docs(research): record native measurement reading views
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
---
.../assets/research-native-results/README.md | 33 ++++++++++++++++++
.../hierarchy-desktop.png | Bin 0 -> 100580 bytes
.../hierarchy-mobile.png | Bin 0 -> 50912 bytes
.../hierarchy-report-desktop.png | Bin 0 -> 105748 bytes
.../hierarchy-report-mobile.png | Bin 0 -> 61578 bytes
.../hierarchy-sources-desktop.png | Bin 0 -> 108646 bytes
.../hierarchy-sources-mobile.png | Bin 0 -> 52674 bytes
7 files changed, 33 insertions(+)
create mode 100644 docs/development/assets/research-native-results/hierarchy-desktop.png
create mode 100644 docs/development/assets/research-native-results/hierarchy-mobile.png
create mode 100644 docs/development/assets/research-native-results/hierarchy-report-desktop.png
create mode 100644 docs/development/assets/research-native-results/hierarchy-report-mobile.png
create mode 100644 docs/development/assets/research-native-results/hierarchy-sources-desktop.png
create mode 100644 docs/development/assets/research-native-results/hierarchy-sources-mobile.png
diff --git a/docs/development/assets/research-native-results/README.md b/docs/development/assets/research-native-results/README.md
index c52b0762f0..c553c58f65 100644
--- a/docs/development/assets/research-native-results/README.md
+++ b/docs/development/assets/research-native-results/README.md
@@ -32,3 +32,36 @@ return focus, unknown retention and invalid results are exercised by the same
packaged scenario. Browsing starts no model or experiment and leaves the source
unchanged. These captures qualify a proposed packaged surface, not installed
adoption, user comprehension improvement or release readiness.
+
+## Native measurement hierarchy
+
+The UI source is `ee911667cbe664d7cbf8a914ee076d766a048c64`, based on main
+`44050e953aa21f6deb932935fa158b5e415894c1`. The packaged capture run used
+those source bytes; this documentation commit only records its visual evidence.
+
+The `hierarchy-desktop.png` and `hierarchy-mobile.png` captures use the same
+native-only fixture as `after-desktop.png` and `after-mobile.png`. The capture's
+best valid value is now primary; initial, last valid and actually retained
+results are compact context. Unknown retention stays explicit. A document icon
+opens original evidence without suggesting a trend. Raw unit, direction,
+valid-result coverage and a concise UTC window remain visible. Full timestamps,
+submission identities, method, source digest and limitations are available in
+one disclosure with body-sized text.
+
+The `hierarchy-report-*.png` images show the same synthesis fixture as the
+earlier ordinary report captures. The `hierarchy-sources-*.png` images use a
+separate synthetic signed-value fixture: best, last and retained differ, so the
+source view can be checked without treating best as adoption. These are whole
+packaged workspace viewports, not live operating context or installed-App
+readback. Desktop is 1280 × 900; narrow is 390 × 844. The narrow report view
+uses the existing one-step report navigation; it is a selected reading position,
+not the default top of the page.
+
+The existing research-history scenario covers ordinary/deep/history reading,
+historical results and source switching. The focused `research-native-reading`
+scenario crosses the same real registration, typed native projection, SQLite
+store and HTTP reader for higher/lower directions, negative and zero values,
+invalid first/all-invalid/empty samples, partial windows, distinct retained
+results and long units. It also checks exact citation return, source disclosure,
+Chinese/English help, narrow layout and 200% text. No model or experiment is
+executed; original sources and mutation counts are checked separately.
diff --git a/docs/development/assets/research-native-results/hierarchy-desktop.png b/docs/development/assets/research-native-results/hierarchy-desktop.png
new file mode 100644
index 0000000000000000000000000000000000000000..b36efcaef03154c8427b5022fddd86d5d268c6cf
GIT binary patch
literal 100580
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