From a461f7c053d2b96902e51c9465d79207f2a922db Mon Sep 17 00:00:00 2001 From: 732642856 <732642856@qq.com> Date: Wed, 24 Jun 2026 16:53:21 +0800 Subject: [PATCH] Expose validation transparency in Trust Center --- jyotish-app/main.js | 46 ++++++++++++++++++++++++ jyotish-app/style.css | 51 +++++++++++++++++++++++++++ progress.md | 2 ++ task_plan.md | 3 +- tests/test_frontend_productization.py | 28 +++++++++++++++ 5 files changed, 129 insertions(+), 1 deletion(-) diff --git a/jyotish-app/main.js b/jyotish-app/main.js index 1719b755..fcbfecb3 100644 --- a/jyotish-app/main.js +++ b/jyotish-app/main.js @@ -1573,6 +1573,7 @@ function renderTrustCenterPanel() { ${renderTrustStatus('运行体检', runtime.label, runtime.note)} ${renderRuntimeHealthPanel(runtime)} + ${renderValidationTransparencyPanel()} ${renderTerminologyModePanel()}

出生资料、保存星盘、配对记录、问事记录和计算设置默认保存在本机浏览器。导出报告会写入你主动下载的文件;PDF 后端工件仅由本地 API 生成。

@@ -1589,6 +1590,51 @@ function renderTrustCenterPanel() { `; } +const VALIDATION_TRANSPARENCY = { + source: 'Yoga logic benchmark', + charts: '60 charts', + comparableRules: '82 comparable rules', + precision: 'Precision 96.48%', + recall: 'Recall 93.99%', + f1: 'F1 95.22%', + unmappedPyjhora: 'unmapped_pyjhora: 718', + gates: ['golden cases', 'BPHS invariants', 'release-quality-gate'], +}; + +function renderValidationTransparencyPanel() { + return ` +
+
+ Validation Transparency + ${escapeHtml(VALIDATION_TRANSPARENCY.source)} · ${escapeHtml(VALIDATION_TRANSPARENCY.charts)} · ${escapeHtml(VALIDATION_TRANSPARENCY.comparableRules)} +
+
+ ${renderValidationTransparencyMetric('Precision', VALIDATION_TRANSPARENCY.precision, '命中的规则中,与参考比较一致的比例。')} + ${renderValidationTransparencyMetric('Recall', VALIDATION_TRANSPARENCY.recall, '参考可比较规则中,被当前引擎找回的比例。')} + ${renderValidationTransparencyMetric('F1', VALIDATION_TRANSPARENCY.f1, 'Precision 与 Recall 的综合分。')} + ${renderValidationTransparencyMetric('Coverage gap', VALIDATION_TRANSPARENCY.unmappedPyjhora, '仍未映射的 PyJHora/B.V. Raman 规则保持可见。')} +
+
+ 边界 + 这些数字来自 references/validation_logic_report.json 的 Yoga 规则对照,不是个人事件预测准确率;出生时间、地点、星历、流派选择和现实事件记录仍会影响解读。 +
+
+ ${VALIDATION_TRANSPARENCY.gates.map(gate => `${escapeHtml(gate)}`).join('')} +
+
+ `; +} + +function renderValidationTransparencyMetric(label, value, note) { + return ` +
+ ${escapeHtml(label)} + ${escapeHtml(value)} + ${escapeHtml(note)} +
+ `; +} + function getTrustCenterStatusMessage(pwa, runtime = getRuntimeHealthStatus()) { const health = window.__jyotishRuntimeHealth || {}; if (health.status === 'checking') return '正在运行健康检查...'; diff --git a/jyotish-app/style.css b/jyotish-app/style.css index 2da09cfe..a152a34e 100644 --- a/jyotish-app/style.css +++ b/jyotish-app/style.css @@ -5725,6 +5725,56 @@ body { font-family: var(--font-body); background: var(--bg-page); color: var(--t font-size: 12px; line-height: 1.5; } +.validation-transparency-panel { + margin: 10px 0; + padding: 10px; + border: 1px solid var(--border-light); + border-left: 3px solid var(--green); + border-radius: var(--radius-sm); + background: var(--bg-surface); +} +.validation-transparency-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 8px; + margin-top: 8px; +} +.validation-transparency-metric { + min-width: 0; + padding: 9px; + border: 1px solid var(--border-light); + border-radius: var(--radius-sm); + background: var(--bg-white); +} +.validation-transparency-metric span, +.validation-transparency-metric small { + display: block; + color: var(--text-muted); + font-size: 11px; + line-height: 1.45; +} +.validation-transparency-metric strong { + display: block; + margin: 3px 0; + color: var(--text-heading); + font-size: 13px; + overflow-wrap: anywhere; +} +.validation-transparency-boundary { + display: grid; + gap: 4px; + margin: 8px 0; + padding: 9px; + border: 1px solid var(--border-light); + border-radius: var(--radius-sm); + background: var(--bg-white); + color: var(--text-secondary); + font-size: 12px; + line-height: 1.5; +} +.validation-transparency-boundary strong { + color: var(--text-heading); +} .terminology-mode-panel { margin: 10px 0; padding: 10px; @@ -6115,6 +6165,7 @@ body { font-family: var(--font-body); background: var(--bg-page); color: var(--t .trust-status-grid, .terminology-mode-options, .case-workspace-controls { grid-template-columns: 1fr; } + .validation-transparency-grid { grid-template-columns: 1fr; } .case-workspace-counts, .case-bulk-actions, .workspace-chart-list, diff --git a/progress.md b/progress.md index 15e9b9db..f10c6c64 100644 --- a/progress.md +++ b/progress.md @@ -306,3 +306,5 @@ - 云端复查:PR #6 head `5399c6f` 的 `validate`、`test`、`release-quality-gate` 均失败;step metadata 显示依赖安装和 Vite 环境诊断已成功,失败仍发生在 pytest/quality gate 内部。GitHub annotations 仍只显示 exit code,日志/API 受权限限制;本机 Docker daemon 未运行,暂不能用 Linux 容器复现。 - 增补 CI 失败诊断:`.github/workflows/test.yml` 的 pytest 改为 `-vv --maxfail=1 --junitxml=artifacts/pytest.xml` 并上传 `pytest-diagnostics`;`ci.yml` 与 `release-quality-gate.yml` 将 quality gate stdout tee 到 artifact 并上传,下一轮云端失败可直接定位首个 Linux runner 差异。 - 云端 CI 收口完成:推送 `925e73e` 后,GitHub PR #6 最新 head 的 `validate`、`test`、`release-quality-gate` 三条检查均为 success;release-only browser/release 守门已在云端可运行。 +- 完成准确率透明度页面:Trust Center 新增 Validation Transparency,直接展示 `references/validation_logic_report.json` 当前 Yoga 对照口径:60 charts、82 comparable rules、Precision 96.48%、Recall 93.99%、F1 95.22%、unmapped_pyjhora 718,并明确这些是 Yoga 规则对照指标,不是个人事件预测准确率。 +- TDD/验证完成:先让 `test_trust_center_exposes_validation_transparency` 红灯确认缺口,再实现转绿;修复移动端 selector 回归后,`python3 -B -m pytest tests/test_frontend_productization.py::test_first_use_onboarding_is_actionable tests/test_frontend_productization.py::test_mobile_layout_keeps_dense_sections_single_column tests/test_frontend_productization.py::test_trust_center_exposes_validation_transparency -q` 通过;`npm run build --prefix jyotish-app` 通过;`python3 scripts/run_quality_gate.py --profile quick --skip-yoga-logic` 通过,覆盖 201 个核心 pytest、npm build 与 runtime smoke。 diff --git a/task_plan.md b/task_plan.md index cea07b28..b9f6c54d 100644 --- a/task_plan.md +++ b/task_plan.md @@ -100,4 +100,5 @@ - [x] PR merge ref 复现与 release-only workflow 守门:在 `/tmp/yinduzhanxing-pr6-merge` 拉取 PR #6 merge ref,确认完整依赖安装后 pytest 与 quick gate 通过;新增手动发布质量门 workflow 跑 release profile 与 Playwright Chromium,并为 CI/test workflow 增加 Vite/Node/Python 诊断。 - [x] CI 失败 artifact 诊断:pytest 改为 `-vv --maxfail=1 --junitxml`,quick/release quality gate 输出 tee 到 artifact,避免云端只暴露 exit code。 - [x] 云端 CI 收口:PR #6 head `925e73e` 的 `validate`、`test`、`release-quality-gate` 三条 GitHub Actions 检查均已通过。 -- [ ] 下一步:进入成品化最后一批缺口,优先补普通用户交付形态(部署/桌面打包/公开演示环境)和准确率透明度页面。 +- [x] 准确率透明度页面:Trust Center 新增 Validation Transparency 面板,展示 Yoga logic benchmark 的 60 charts、82 comparable rules、Precision/Recall/F1、unmapped_pyjhora 与“不是个人事件预测准确率”的边界说明。 +- [ ] 下一步:进入成品化最后一批缺口,优先补普通用户交付形态(部署/桌面打包/公开演示环境)。 diff --git a/tests/test_frontend_productization.py b/tests/test_frontend_productization.py index 48d5d34a..1c215072 100644 --- a/tests/test_frontend_productization.py +++ b/tests/test_frontend_productization.py @@ -402,6 +402,34 @@ def test_runtime_smoke_covers_ai_and_report_recovery() -> None: assert token in smoke +def test_trust_center_exposes_validation_transparency() -> None: + main = read("main.js") + style = read("style.css") + for token in [ + "renderValidationTransparencyPanel", + "VALIDATION_TRANSPARENCY", + "Validation Transparency", + "Yoga logic benchmark", + "60 charts", + "82 comparable rules", + "Precision 96.48%", + "Recall 93.99%", + "F1 95.22%", + "unmapped_pyjhora", + "golden cases", + "release-quality-gate", + "不是个人事件预测准确率", + ]: + assert token in main + for token in [ + ".validation-transparency-panel", + ".validation-transparency-grid", + ".validation-transparency-metric", + ".validation-transparency-boundary", + ]: + assert token in style + + def test_click_smoke_covers_core_interactive_workflows() -> None: smoke_path = ROOT / "tests" / "run_frontend_click_smoke.py" quality_gate = (ROOT / "scripts" / "run_quality_gate.py").read_text(encoding="utf-8")