diff --git a/.superdesign/concept-design-system.md b/.superdesign/concept-design-system.md
index d74e709..3ea4993 100644
--- a/.superdesign/concept-design-system.md
+++ b/.superdesign/concept-design-system.md
@@ -5,12 +5,12 @@
## 设计系统(全部为本原型拟定值)
深绿导航 #102B27;导航选中 #244D41;导航浅色文字 #F3F7F5,次级 #B1C6BE。主工作区 #F3F5F4;卡片 #FFFFFF;浅面板 #F8FAF9;边线 #DCE4DF。主要正文 #182D26;次级 #52675C;注释 #64766C。主按钮 #17634C,悬停 #124F3D,白色文字。警示文字 #805418 配 #FBF2DF;风险 #A33C38 配 #FBEFEC;技术关系线 #226A7A 配 #EDF5F7;正常状态 #17634C 配 #EAF3EC。仅使用这些颜色与其透明度变体。
中文系统无衬线 Microsoft YaHei/PingFang SC,正文16px,标签14px,元信息12px最低,栏目20px,主标题28px,结论24px。间距4/8/12/16/20/24/32/40/48px。面板圆角12px,按钮8px,标签胶囊;细边线,阴影0 4px 20px rgba(16,43,39,.04)。按钮高44px。
-1440x1000桌面画布;导航216px,正文边距32px,内容左右主栏与320px动作侧栏,间隔24px;1100px以下侧栏折叠为纵向,768px以下导航变菜单。克制、留白、清晰金融研究台。用可点击证据关系图体现科技感;不做营销首页,不放炫光大脑或装饰大图,不放虚构概率仪表盘。
+1440x1000桌面画布;导航216px,正文边距32px,内容左右主栏与320px动作侧栏,间隔24px;1100px以下侧栏折叠为纵向,768px以下导航变菜单。克制、留白、清晰金融研究台。用可点击证据关系图体现科技感;不做营销首页,不放炫光大脑或装饰大图,只允许醒目标记为演示值的概率展示,不能冒充真实预测。
正文判断优先于数字;颜色同时有文字/图标。focus2px outline;动效160–200ms,支持reduced-motion。抽屉关闭键/Escape/焦点返回。品牌只写 兴邦金租 / 智审工作台,没有官方图片标识,不发明logo。
## 产品内容(虚构演示)
单项目预审工作台:主审Agent综合证据和历史经验,专项模块可选择本地模型/Jev/关闭,正式审批属于人工流程。
-示例企业 恒远精密设备有限公司(虚构);项目DEMO-026,设备直租,融资3,000万元,36个月,装备制造。主审意见 补充材料后再判断;解释 经营现金流与回款说明存在待核实差异,建议先补齐两项关键证据,再推进评审。引用6份材料、参考3条经验、2项待补充均为演示数量,不显示任何百分比。
+示例企业 恒远精密设备有限公司(虚构);项目DEMO-026,设备直租,融资3,000万元,36个月,装备制造。主审意见 补充材料后再判断;解释 经营现金流与回款说明存在待核实差异,建议先补齐两项关键证据,再推进评审。引用6份材料、参考3条经验、2项待补充均为演示数量。用户新增要求:直观看到审批概率、依据与勾选沙盘后的概率变化;使用下面明确标示的人工演示值。
持久提示 原型演示 · 未连接真实数据与模型。所有材料、判断、数值为虚构演示。综合意见不是正式审批意见。
## 页面层级和交互
@@ -19,7 +19,13 @@
正文页签 综合预审 / 历史经验 / 推进沙盘;右侧 下一步行动 列补充银行流水、核实设备权属。下方两条问题 回款依据尚不完整 / 设备权属证明待核实,每项可看证据和历史依据。
证据抽屉:回款说明.pdf第3页,虚构原文 主要客户账期延长,预计下一季度集中回款;缺证 未提供对应银行流水。抽屉切换原文片段/判断依据。
历史经验页签:初审关注现金流→问询账期原因→补齐银行流水/应收账龄→历史意见由待核实转为附条件推进。经验适用条件 客户结构稳定且回款可逐笔匹配;例外 收入集中或关联回款未穿透。提示 条件相似不等于结论相同。
-推进沙盘页签:勾选补充近六个月银行流水、补充设备权属证明→运行模拟→对比原本2项待核实与假设完成后变化。明确 假设证据真实且完成核验;仍需人工复核;模拟结果,不改变真实项目。有返回真实预审,禁止写通过率提升。
+推进沙盘页签:勾选补充近六个月银行流水、补充设备权属证明→即时更新→对比原本2项待核实与假设完成后变化。明确 假设证据真实且完成核验;仍需人工复核;模拟结果,不改变真实项目。有返回真实预审,可以展示条件情景下的演示概率差值,单位为百分点;不得宣称措施已经造成真实获批率提升。
专项模型选择:本地开源模型(演示)默认;Jev官方服务(未配置)禁用且说明;关闭可选,选后显示专项核查已关闭,主审仍可基于证据与经验给出有限意见。禁止输入密钥/地址,无真实模型请求。
生成补件清单打开含两项具体补件的弹窗,可复制文本。不做假的下载。验证看板入口打开待开展脱敏盲测说明,列基线/本地专项/Jev可选对照,不能编准确率。
按钮、页签、导航、菜单均须有行为或清楚禁用。只生成一个连通的高保真原型,所有状态本地模拟。
+
+## 本轮新增:概率与沙盘即时联动
+保留深色导航/浅色工作区和所有已完成交互。主审意见区增加醒目的“审批通过概率 · 演示值”42%,旁边始终显示“人工设定,仅演示交互;未经历史数据校准”。定义演示目标为“以本次材料版本提交后的首次审批通过”;它不是真实预测事件定义,未来须与客户确认。主审意见仍是补充材料后再判断,不按演示数字自动批准。
+“为什么是这个判断”打开依据抽屉:数据卡(现金流/回款/设备权属)、Skill(回款交叉核验/权属一致性)、历史经验(H-018适用与例外)、规则(尚无已确认硬性阻断,仍有两项缺证)。卡片编号/版本为演示元信息,不声称已执行。明确这些解释展示未来可追溯结构,不构成42%的计算来源;42%来自原型情景表,非模型计算、非历史统计。
+沙盘中“当前基线42%”固定;“所选情景”大数字、对照横条、差值立即随复选框change更新,不需要点击运行才看到数字。初始未勾选42%、0个百分点。勾选“银行流水核验支持回款解释”→58%、+16个百分点;仅“权属材料核验一致”→51%、+9个百分点;同时→64%、+22个百分点。取消选项恢复对应值,全部取消42%;采用预设组合表而非简单加法,合并结果不相加。全部数值同样有紧邻演示标识。
+每次变化同步展示所选假设、变化原因、仍缺资料(勾选一项剩1项,两项剩0项仅为模拟),并注明真实核验未完成、仍需人工复核。补件也可能发现新风险,真实概率未必上升。返回真实预审仍42%,模型本地/关闭切换不得人为调节概率;Jev未配置仍禁用。保留依据按钮,文案为“查看概率与判断依据”,打开追溯抽屉,不能阻止即时反馈。原型数字用独立demoProbability字段/情景表,真实probability仍为空。
diff --git a/.superdesign/resume.json b/.superdesign/resume.json
index 408ae33..91898e8 100644
--- a/.superdesign/resume.json
+++ b/.superdesign/resume.json
@@ -11,17 +11,17 @@
".superdesign/concept-design-system.md"
],
"fingerprints": {
- ".superdesign/concept-design-system.md": "ce41609cd6186253f129b9ae6c90e465c4303b260ef88aeb431c9363c2a5f623"
+ ".superdesign/concept-design-system.md": "77ba2052e2c41f7f716069d6cbfc34314fbe23cbc7ffc17675b40d45613bc2e7"
},
"components": [],
"drafts": {
"7484f5c4-0415-4a87-a772-c42339680737": {
- "title": "兴邦金租智审工作台",
+ "title": "兴邦金租智审工作台 - 演示概率沙盘",
"visualDirection": "深色导航+浅色工作区;深绿金融评审风格",
- "currentVersion": 2
+ "currentVersion": 4
}
},
- "updatedAt": "2026-09-28T09:46:39.856342+00:00"
+ "updatedAt": "2026-09-28T16:36:04.318766+00:00"
}
}
-}
\ No newline at end of file
+}
diff --git a/docs/v2/04-ui-spec.md b/docs/v2/04-ui-spec.md
index 113d74f..ea02634 100644
--- a/docs/v2/04-ui-spec.md
+++ b/docs/v2/04-ui-spec.md
@@ -53,7 +53,7 @@ ProjectContext 拥有 project_id、data_domain 和当前 run_id;RunSummary 只
一次只突出当前选中问题的关联路径,其他弱化;未知项不伪装为否定。补件可能发现新风险,允许意见变得更谨慎。图旁提供等价列表,缩小窗口时改纵向排列,不依赖复杂图才能理解结果。
-P0 顶部不显示百分比“通过率”。展示 recommendation、missing_inputs、degradations 和数据域/版本;不凭空生成完整度或置信度数字。评分若后续加入,须另有明确算法和契约。
+P0 真实业务未校准时不显示百分比“通过率”,展示 recommendation、missing_inputs、degradations 和数据域/版本。用户新增要求在设计原型中展示概率及沙盘联动,因此仅演示域允许使用独立的演示值,紧邻“人工设定、未经校准”标识;不得填入真实 probability。具体语义、依据链和即时联动见 [概率与沙盘设计](13-probability-prototype.md)。真实概率仍须独立算法、数据与验收。
## 6. 文案与视觉
diff --git a/docs/v2/12-prototype.md b/docs/v2/12-prototype.md
index ca9d7bd..123c16f 100644
--- a/docs/v2/12-prototype.md
+++ b/docs/v2/12-prototype.md
@@ -10,13 +10,13 @@
一个连通的项目工作台:综合预审、历史经验、推进沙盘通过页签切换。证据抽屉展示原文与缺证,补件清单弹窗说明具体材料。模型选项展示本地开源模型(演示)、Jev(未配置)和关闭。正式审批不纳入原型操作。
-虚构企业与项目:恒远精密设备有限公司 / DEMO-026;3,000万元、36个月及全部材料数量均为演示数据。主审意见为“补充材料后再判断”,不展示未经校准的通过概率。
+虚构企业与项目:恒远精密设备有限公司 / DEMO-026;3,000万元、36个月及全部材料数量均为演示数据。主审意见为“补充材料后再判断”,不展示未经校准的真实通过概率;按用户新增要求,原型可展示明确标记且与真实结果字段隔离的演示概率,见 [概率与沙盘设计](13-probability-prototype.md)。
## 状态与交互约束
- 综合页:结论、两项重点问题、证据关系和下一步;来源节点可展开,关闭抽屉返回原位置。
- 历史经验:问询→补件→证据变化→历史意见,显示适用条件与例外;相似不直接导出相同结论。
-- 推进沙盘:选择假设补件→运行模拟→比较变化;持续标记假设条件,返回真实预审后原意见不变。
+- 推进沙盘:选择假设补件→即时比较概率、原因与待核实事项;持续标记假设条件,返回真实预审后原意见不变。
- 模型选择:本地仅演示,Jev未配置不可调用,关闭保留主审意见及缺失专项提示;切换不能伪称已连接模型。
- 补件清单:打开/关闭、可复制内容;不提供伪造的报告下载。
- 验证入口:只展示待开展的对照方案,不展示虚构准确率。
@@ -28,11 +28,22 @@
| P-01 | Given 演示项目,When 打开首页,Then 首屏显示预审意见、关键依据、下一步及演示标识 | AC-05/07/12 |
| P-02 | Given 一条问题,When 点击证据,Then 可读原文、定位和缺失项,关闭后回到原页面 | AC-08 |
| P-03 | Given 历史案例,When 切换历史经验,Then 看到问询/补件/判断变化与适用例外 | AC-02/04 |
-| P-04 | Given 模拟补件,When 运行并返回真实预审,Then 原意见未变,模拟结果有持续标识 | AC-11 |
+| P-04 | Given 模拟补件,When 勾选假设并返回真实预审,Then 原意见未变,模拟结果有持续标识 | AC-11 |
| P-05 | Given 模型选项,When 选择关闭,Then 显示未执行专项核查;Jev未配置不可调用 | AC-17/21 |
| P-06 | Given 补件需求,When 生成清单,Then 可查看具体材料要求,无虚假的后端完成状态 | AC-07 |
| P-07 | Given 桌面/窄屏和键盘操作,When 阅读及展开界面,Then 正文无裁切、可见焦点、可退出弹层 | NFR-04 |
+新增原型验收(用户新增概率可视化要求):
+
+| ID | Given / When / Then | 需求关联 |
+|---|---|---|
+| P-08 | Given 未校准的演示项目,When 看首页,Then 42%紧邻演示标识和人为设定说明,真实probability仍为空 | AC-12 |
+| P-09 | Given 四种复选框组合,When 勾选/取消,Then 无需运行按钮即可得到42/58/51/64及0/16/9/22个百分点 | 概率与沙盘设计第2节 |
+| P-10 | Given 多选与再次取消,When 比较,Then 组合结果不作简单相加,原因与剩余事项同步更新 | AC-11 |
+| P-11 | Given 概率展示,When 查看依据,Then 看到数据卡/Skills/经验/规则及示例标识,并知道数字来自演示表 | AC-08/12 |
+| P-12 | Given 模拟或关闭专项核查,When 返回综合预审,Then 基线42%与原意见不变;模型选项不会伪造概率变化 | AC-11/21 |
+| P-13 | Given 窄屏,When 查看概率和比较,Then 数字/演示提示/原因完整可读,无横向裁切 | NFR-04 |
+
## 设计工具与数据边界
使用用户指定的 Superdesign,设计模型 Gemini 3.1 Pro。仅上传本轮独立编写的概念说明与虚构内容;上传现有前端源码的操作被自动审批拒绝,随后改用不含源码的概念设计。原项目源码不作为本次生成载荷。六份源码分析文件仅留本地供设计人员理解,不声称外部设计已与现有组件逐像素一致。
@@ -49,8 +60,23 @@
- [Superdesign 画布](https://superdesign.dev/teams/657ee591-1f83-46ec-8917-918dec0f0d4b/projects/88a8388d-b079-4118-833b-c8b396bf346f)。
- [本地 HTML](prototypes/prescreen-workbench.html) / [首页截图](prototypes/prescreen-overview.png)。HTML使用公开CDN样式和图标,首次打开需要网络。
-草稿 7484f5c4-0415-4a87-a772-c42339680737,保存版本2。初稿由 Superdesign Gemini 3.1 Pro 生成,随后在同稿内直接补齐确定的交互、响应式和文案缺口;未额外生成视觉变体。云端回读HTML与本地已验文件一致;入库HTML仅清理3处行尾空白,内容与行为保持一致。
+首轮草稿 7484f5c4-0415-4a87-a772-c42339680737 保存为版本2(历史记录)。初稿由 Superdesign Gemini 3.1 Pro 生成,随后在同稿内直接补齐确定的交互、响应式和文案缺口;未额外生成视觉变体。云端回读HTML与本地已验文件一致;入库HTML仅清理3处行尾空白,内容与行为保持一致。
导出原型的20项行为检查通过:证据抽屉/关闭焦点、历史经验、空模拟守卫、假设结果与真实基线隔离、Jev禁用、本地/关闭切换、补件与验证弹窗、1440/1024/390三种宽度无文档横向溢出、移动导航及无运行脚本错误。首轮移动导航关闭失败,原因与修复留在fix-record.md,复验保留独立截图。同样20项检查在Superdesign线上预览再次通过,证据在remote-check-03/interaction-checks.json。
-检查边界:使用独立无头浏览器验证演示状态;内置浏览器连接因本机环境故障未成功。作者截图自查不等于独立视觉评审;未完成全量无障碍审计,未连接业务接口或真实模型。现有生产源码不变,不重跑与此次原型无关的旧版应用套件。
+检查边界:使用独立无头浏览器验证演示状态;内置浏览器连接因本机环境故障未成功。作者截图自查不等于独立视觉评审;未完成全量无障碍审计,未连接业务接口或真实模型。首轮为设计文档交付,未重跑旧版套件;本次概率交互增量另按行为改动运行统一验证,结果见后续记录。
+
+## 2026-09-29 概率沙盘增量交付
+
+同一草稿更新为版本4。综合页显示42%演示基线;沙盘勾选与取消立即更新42/58/51/64、百分点、变化原因和待核实事项。依据抽屉串联数据卡、Skills、历史经验和规则,并明确概率数字来自人工情景表。缺证的规则状态为待核实,不视为通过。模型选择与模拟均不修改原项目结论。
+
+- [概率首页截图](prototypes/prescreen-probability-overview.png) / [沙盘对照截图](prototypes/prescreen-probability-simulation.png)。首轮截图保留,不覆盖。
+- [浏览器回归脚本](prototypes/check-probability.cjs):需要Playwright与Chromium;可通过CHROMIUM_PATH指定浏览器,通过PROTOTYPE_URL选择线上预览,通过EVIDENCE_DIR指定新证据目录。默认检查旁边的HTML,不调用业务API。
+- 本地与Superdesign实际预览分别通过74项断言,覆盖P-01–13的本次相关交互:四种组合、正反选择顺序、取消还原、即时原因、人工概率来源、基线隔离、提供方切换、原有弹窗/经验/导航,以及1440/1024/390宽度。
+- 完整计划、交互日志及截图:test-evidence/20260929-probability-prototype/。浏览器检查不等于独立视觉验收或真实概率效果验证。
+- 使用backend/venv运行scripts/verify.py,9项检查全部通过:后端单测、4项UI守卫、前端构建、2项Compose配置与diff。证据:test-evidence/20260929-003310-e2883bb/REPORT.md。运行基于e2883bb及本次未提交原型;最终HTML哈希与绑定说明见本次证据manifest.json。
+- 云端回读版本4与入库HTML仅CRLF/LF换行不同;两端行为测试通过。中断前生成稿缺失即时原因更新、将缺证规则误写为通过,两项均在导入版本4前修正。
+
+本次按原型交互轻量路径记录,沿用AC-08/11/12/21和P-01–13,补充设计与测试;没有越过业务实现门禁。交付为原型及文档备份,没有修改现有src/backend业务代码、没有合并main、没有发布镜像。真实概率仍待审批事件定义、历史数据验证与校准。
+
+远程备份状态(2026-09-29):已配置origin在SSH握手阶段关闭连接,重试与只读诊断均复现。本次增量先保存本地提交,Gitea远端SHA未核验,不能标记本次已远程备份。此前已核验的备份不受本地提交影响。日志在test-evidence/20260929-probability-prototype/gitea-connection.log。
diff --git a/docs/v2/13-probability-prototype.md b/docs/v2/13-probability-prototype.md
new file mode 100644
index 0000000..b8d1626
--- /dev/null
+++ b/docs/v2/13-probability-prototype.md
@@ -0,0 +1,50 @@
+# 审批概率与沙盘联动设计
+
+日期:2026-09-29。用户明确要求:直观看到项目审批通过概率、判断依据,并在推进沙盘勾选后直观看到变化。当前交付为 Superdesign 原型的演示交互;真实概率服务仍未实现、未校准。
+
+## 1. 页面表达
+
+综合预审首屏:审批通过概率、主审意见、数据基础和“查看判断依据”并列。当前数字紧邻“演示值”;解释“人工设定,仅演示交互;未经历史数据校准”。演示事件口径是“以本次材料版本提交后的首次审批通过”,用于避免与最终获批、附条件通过或投放后违约混淆;真实事件定义仍须 OQ-05 确认。
+
+推进沙盘:固定当前基线,展示所选情景、概率对照条、差值(百分点)、所选假设、变化原因和剩余问题。勾选/取消立即更新,无需点击运行;“查看概率与判断依据”打开追溯抽屉。全部取消恢复基线,返回真实预审不得改变原值。
+
+## 2. 原型情景表(人为编写,非业务结果)
+
+| 假设状态 | 演示值 | 较演示基线 | 尚未回应的问题(情景中) |
+|---|---|---|---|
+| 无假设 | 42% | 0个百分点 | 两项 |
+| 银行流水核验支持回款解释 | 58% | +16个百分点 | 设备权属 |
+| 权属材料核验一致 | 51% | +9个百分点 | 回款解释 |
+| 两项均核验支持 | 64% | +22个百分点 | 这两项均回应,仍需整体人工复核 |
+
+组合值来自查表,不是42+16+9。此表只演示交互和非加和关系,不是预测模型、专家估计、历史统计或真实因果效果。实际补件可能揭示新风险,真实预测可能不变或下降。不能仅凭材料上传动作认定争议已解决。
+
+原型数值使用独立 demoProbability / demoScenarios,不写真实 ScreeningRun.probability。生产业务的 BR-12 与 not_calibrated 约束继续有效:没有真实验证条件就保持 null,不把演示值兜底到真实结果。
+
+## 3. 判断依据与原有体系的关系
+
+依据抽屉用业务语言展示可追溯链:
+
+| 层 | 展示内容 | 能说明什么 |
+|---|---|---|
+| 数据卡 | 现金流、回款、权属事实,来源/时间/缺失和版本 | 预审读到了哪些事实 |
+| Skills | 回款交叉核验、权属一致性检查,输入与执行状态 | 用了哪些专业核查方法 |
+| 历史经验 | H-018问询/补件过程、适用条件和例外 | 为什么选择这些核查动作 |
+| 规则 | 硬约束、未完成项、版本和复核要求 | 哪些条件不能被模型分数覆盖 |
+| 主审/概率服务 | 综合意见与概率结果分别记录 | 主审解释结论,不能任意编写概率 |
+
+所有卡片编号、版本和记录在原型中均为示例,不能写“已查询兴邦系统”或伪造执行日志。必须明确:这些示例依据展示未来解释结构,不能从中计算出42%;42%来自原型情景表。不得把这类说明冒充真实的模型特征贡献分析。
+
+miniOpenClaw承载受控编排与运行追溯;数据卡、Skills和经验资产继续复用。Jev/local负责局部判断,最终审批概率需要单独的业务概率估计与校准能力,不能直接拿专项模型置信度当通过概率。
+
+## 4. 真实概率接入后的目标(后续设计)
+
+真实模式要求已确认审批事件、预测时点、有效样本范围和制度版本,并具备保留集验证与校准证据。概率结果需绑定项目快照、模型及校准版本、数据适用范围和有效性状态;不足时显示“暂无法可靠估计”。这些条件由概率服务校验,不能只靠前端文案保证。
+
+真实沙盘会基于相同模型/校准版本,对改变后的假设输入重新估计;只接受有明确含义的假设,不在前端手写加分。多选的交互效应、硬规则、剩余缺证一起评估。请求乱序时只接受当前选择对应的结果;取消/失败保留基线,提示情景未完成,不能用演示表回退。置信区间只有在统计方法和样本支持时才显示,不预先填范围。
+
+正式审批由业务流程决定;预测不是批准指令。生产实现和业务验收在 M6 单独定案,本次不宣称已建成。
+
+## 5. 原型验收映射
+
+延续 [原型验收](12-prototype.md) 的编号,新增 P-08–13;保留原有P-01–07。验证所有四种组合、取消、立即更新、百分点、依据、基线隔离、提供方切换无伪造加分及演示标识。结果与截图存入 test-evidence/20260929-probability-prototype/,不与真实概率模型的验证混称。
diff --git a/docs/v2/DESIGN.md b/docs/v2/DESIGN.md
index 01c820e..f480c7b 100644
--- a/docs/v2/DESIGN.md
+++ b/docs/v2/DESIGN.md
@@ -35,7 +35,7 @@ primary #17634c 来自 src/components/xingbang/navigation.css 的 xb-brand-mark
## Typography
-正文 16px、行高 1.6 来自 globals.css;中文字体延续现有字体栈。预审结果、问题、证据三层信息明确,不把大量技术标签放在首页。数字不得比证据更突出,尤其不放未验证的通过概率。
+正文 16px、行高 1.6 来自 globals.css;中文字体延续现有字体栈。预审结果、问题、证据三层信息明确,不把大量技术标签放在首页。数字不得比证据更突出,真实业务不放未验证的通过概率。原型按用户新增要求展示独立的演示概率与沙盘对照,百分比旁必须有演示标识;解释、缺证与人工复核提示不能被数字淹没。
## Layout
diff --git a/docs/v2/README.md b/docs/v2/README.md
index ae0032e..a44c98e 100644
--- a/docs/v2/README.md
+++ b/docs/v2/README.md
@@ -20,6 +20,7 @@
| [架构](02-architecture.md) | 已有能力、目标边界、职责与 ADR |
| [详细设计](03-detailed-design.md) | 候选接口、数据契约、状态、失败处理 |
| [专项判断模型切换](11-judgment-providers.md) | 无 Jev Key 的本地路径、统一契约、能力差异与切换验收 |
+| [概率与沙盘联动](13-probability-prototype.md) | 演示概率、可追溯依据与即时情景对照;真实概率校准边界 |
| [交互原型](12-prototype.md) | Superdesign 视觉方向、演示范围与原型验收 |
| [UI Spec](04-ui-spec.md) | 页面骨架、状态、权限和演示交互 |
| [设计契约](DESIGN.md) | 已观察视觉来源、语义 token 提案及缺口 |
diff --git a/docs/v2/prototypes/check-probability.cjs b/docs/v2/prototypes/check-probability.cjs
new file mode 100644
index 0000000..ce115e6
--- /dev/null
+++ b/docs/v2/prototypes/check-probability.cjs
@@ -0,0 +1,53 @@
+// Prototype-only browser checks. Requires Playwright and a Chromium installation.
+// PROTOTYPE_URL optionally targets the Superdesign preview; otherwise tests saved HTML.
+const {chromium}=require('playwright');
+const fs=require('fs'),path=require('path'),{pathToFileURL}=require('url');
+(async()=>{
+ const dir=path.resolve(process.env.EVIDENCE_DIR||'test-evidence/20260929-probability-prototype/local');fs.mkdirSync(dir,{recursive:true});
+ const browser=await chromium.launch({headless:true,...(process.env.CHROMIUM_PATH?{executablePath:process.env.CHROMIUM_PATH}:{})});
+ const page=await browser.newPage({viewport:{width:1440,height:1000}});const errors=[],checks=[];page.on('pageerror',e=>errors.push(e.message));
+ const check=(name,value)=>{checks.push({name,passed:!!value});if(!value)throw Error(name)};
+ const shot=async(name)=>page.screenshot({path:path.join(dir,name+'.png'),fullPage:true});
+ try{
+ await page.goto(process.env.PROTOTYPE_URL||pathToFileURL(path.join(__dirname,'prescreen-workbench.html')).href,{waitUntil:'networkidle',timeout:60000});
+ await page.waitForFunction(()=>getComputedStyle(document.querySelector('[data-sd-id="1"]')).display==='flex',{timeout:15000});
+ check('P08 baseline 42%',await page.locator('#baseline-probability').innerText()==='42%');
+ check('P08 explicit demo label',await page.getByText('审批通过概率 · 演示值',{exact:true}).isVisible());
+ check('P08 uncalibrated explanation',await page.getByText('人工设定,仅演示交互;未经历史数据校准。',{exact:false}).isVisible());
+ const baseline=await page.locator('#real-recommendation').innerText();await shot('01-overview');
+ await page.locator('#btn-show-basis').click();check('P11 basis opens',await page.locator('#basis-dialog').isVisible());
+ const basis=await page.locator('#basis-dialog').innerText();
+ for(const word of ['DC-CASH','SKILL-04','H-018','RULE-01','非模型计算','原型情景表','不代表红线核查已经通过'])check('P11 trace '+word,basis.includes(word));
+ await shot('02-basis');await page.keyboard.press('Escape');check('P07 focus restored',await page.locator('#btn-show-basis').evaluate(e=>e===document.activeElement));
+ await page.locator('#tab-simulation').click();
+ for(const [bank,title,prob,delta,remaining,reason] of [[false,false,42,0,'2 项','未选择'],[true,false,58,16,'设备权属','银行流水'],[true,true,64,22,'两项证据','不简单相加'],[false,true,51,9,'实际回款','合同'],[false,false,42,0,'2 项','未选择'],[false,true,51,9,'实际回款','合同'],[true,true,64,22,'两项证据','不简单相加']]){
+ await page.locator('#assume-bank').setChecked(bank);await page.locator('#assume-title').setChecked(title);
+ check(`P09 immediate ${bank}/${title} = ${prob}`,await page.locator('#sim-prob-val').innerText()===prob+'%');
+ check(`P09 delta ${delta}`,await page.locator('#sim-prob-delta').innerText()==='+'+delta+' 百分点');
+ check(`P10 remaining ${bank}/${title}`,(await page.locator('#sim-remaining').innerText()).includes(remaining));
+ check(`P10 reason ${bank}/${title}`,(await page.locator('#sim-explanation').innerText()).includes(reason));
+ check('P10 comparison visible',await page.locator('#simulation-comparison').isVisible());
+ }
+ await page.locator('#panel-simulation').scrollIntoViewIfNeeded();await shot('03-simulation-64');
+ await page.locator('#run-simulation').click();check('P11 scenario basis',await page.locator('#basis-dialog').isVisible());await page.keyboard.press('Escape');
+ await page.getByRole('button',{name:'← 返回真实预审'}).click();check('P12 recommendation unchanged',await page.locator('#real-recommendation').innerText()===baseline);check('P12 baseline unchanged',await page.locator('#baseline-probability').innerText()==='42%');
+ check('P05 Jev disabled',await page.getByRole('radio',{name:'Jev官方服务(未配置)'}).isDisabled());
+ await page.getByRole('radio',{name:'关闭专项核查',exact:true}).check();check('P05 off label',(await page.locator('#model-status').innerText()).includes('已关闭'));check('P12 provider preserves baseline',await page.locator('#baseline-probability').innerText()==='42%');
+ await page.locator('#tab-simulation').click();check('P12 provider preserves scenario',await page.locator('#sim-prob-val').innerText()==='64%');await page.locator('#tab-overview').click();await page.getByRole('radio',{name:'本地开源模型(演示)',exact:true}).check();
+ await page.locator('#btn-open-drawer-1').click();await page.locator('#evidence-basis-tab').click();check('P02 evidence',await page.locator('#evidence-basis').isVisible());await page.keyboard.press('Escape');
+ await page.locator('#tab-experience').click();check('P03 experience',await page.locator('#panel-experience').isVisible());await page.locator('#tab-overview').click();
+ await page.locator('#btn-generate-list').click();check('P06 checklist',await page.locator('#checklist-dialog').isVisible());await page.keyboard.press('Escape');
+ await page.locator('#nav-link-4').click();check('P07 validation',await page.locator('#validation-dialog').isVisible());await page.keyboard.press('Escape');
+ for(const width of [1440,1024,390]){
+ await page.setViewportSize({width,height:1000});
+ for(const tab of ['overview','simulation']){
+ await page.locator('#tab-'+tab).click();await page.locator('[data-sd-id="8"]').evaluate(e=>e.scrollTop=0);await shot(`responsive-${width}-${tab}`);
+ check(`P13 document width ${width}/${tab}`,await page.evaluate(()=>document.documentElement.scrollWidth<=innerWidth));
+ check(`P13 content width ${width}/${tab}`,await page.locator('[data-sd-id="8"]').evaluate(e=>e.scrollWidth<=e.clientWidth+1));
+ }
+ }
+ check('P07 mobile nav closed',!await page.locator('#prototype-navigation').isVisible());await page.locator('#mobile-menu').click();check('P07 mobile nav opens',await page.locator('#prototype-navigation').isVisible());await page.locator('#nav-link-2').click();check('P07 mobile navigation',await page.locator('#panel-experience').isVisible()&&!await page.locator('#prototype-navigation').isVisible());
+ check('no runtime errors',errors.length===0);
+ }catch(e){checks.push({name:'execution',passed:false,error:e.message});await shot('failure');}
+ await browser.close();const result={status:checks.every(x=>x.passed)?'PASS':'FAIL',target:process.env.PROTOTYPE_URL||'saved prototype',checks,errors,boundary:'Fictional prototype only; no backend/model connection or independent visual review'};fs.writeFileSync(path.join(dir,'interaction-checks.json'),JSON.stringify(result,null,2));console.log(JSON.stringify(result,null,2));process.exit(result.status==='PASS'?0:1);
+})();
diff --git a/docs/v2/prototypes/prescreen-probability-overview.png b/docs/v2/prototypes/prescreen-probability-overview.png
new file mode 100644
index 0000000..2e26e8d
Binary files /dev/null and b/docs/v2/prototypes/prescreen-probability-overview.png differ
diff --git a/docs/v2/prototypes/prescreen-probability-simulation.png b/docs/v2/prototypes/prescreen-probability-simulation.png
new file mode 100644
index 0000000..720b40a
Binary files /dev/null and b/docs/v2/prototypes/prescreen-probability-simulation.png differ
diff --git a/docs/v2/prototypes/prescreen-workbench.html b/docs/v2/prototypes/prescreen-workbench.html
index 1c66080..9f51deb 100644
--- a/docs/v2/prototypes/prescreen-workbench.html
+++ b/docs/v2/prototypes/prescreen-workbench.html
@@ -1,6 +1,7 @@
-
+
+
兴邦金租 - 智审工作台
@@ -12,136 +13,53 @@
theme: {
extend: {
colors: {
- // Navigation
- nav: {
- bg: '#102B27',
- active: '#244D41',
- text: '#F3F7F5',
- muted: '#B1C6BE'
- },
- // Workspace
+ nav: { bg: '#102B27', active: '#244D41', text: '#F3F7F5', muted: '#B1C6BE' },
canvas: '#F3F5F4',
card: '#FFFFFF',
panel: '#F8FAF9',
border: '#DCE4DF',
- // Typography
- ink: {
- main: '#182D26',
- sub: '#52675C',
- mute: '#64766C'
- },
- // Interactive
- primary: {
- DEFAULT: '#17634C',
- hover: '#124F3D',
- text: '#FFFFFF'
- },
- // Semantics
- warning: {
- text: '#805418',
- bg: '#FBF2DF'
- },
- risk: {
- text: '#A33C38',
- bg: '#FBEFEC'
- },
- tech: {
- line: '#226A7A',
- bg: '#EDF5F7'
- },
- normal: {
- text: '#17634C',
- bg: '#EAF3EC'
- }
+ ink: { main: '#182D26', sub: '#52675C', mute: '#64766C' },
+ primary: { DEFAULT: '#17634C', hover: '#124F3D', text: '#FFFFFF' },
+ warning: { text: '#805418', bg: '#FBF2DF' },
+ risk: { text: '#A33C38', bg: '#FBEFEC' },
+ tech: { line: '#226A7A', bg: '#EDF5F7' },
+ normal: { text: '#17634C', bg: '#EAF3EC' }
},
- fontFamily: {
- sans: ['Microsoft YaHei', 'PingFang SC', 'sans-serif']
- },
- spacing: {
- 4: '4px',
- 8: '8px',
- 12: '12px',
- 16: '16px',
- 20: '20px',
- 24: '24px',
- 32: '32px',
- 40: '40px',
- 48: '48px'
- },
- borderRadius: {
- button: '8px',
- panel: '12px'
- },
- boxShadow: {
- card: '0 4px 20px rgba(16,43,39,.04)'
- },
- transitionDuration: {
- 160: '160ms',
- 200: '200ms'
- }
+ fontFamily: { sans: ['Microsoft YaHei', 'PingFang SC', 'sans-serif'] },
+ spacing: { 4: '4px', 8: '8px', 12: '12px', 16: '16px', 20: '20px', 24: '24px', 32: '32px', 40: '40px', 48: '48px' },
+ borderRadius: { button: '8px', panel: '12px' },
+ boxShadow: { card: '0 4px 20px rgba(16,43,39,.04)' },
+ transitionDuration: { 160: '160ms', 200: '200ms' }
}
}
}
-
+#probability-hero{flex-wrap:wrap}#probability-hero>div{flex-wrap:wrap;gap:12px}#probability-hero>div>span:last-child{white-space:nowrap}#sim-prob-delta{white-space:nowrap}#basis-dialog>div{padding:0;height:auto!important}body [data-sd-id="9"]{flex-shrink:0}
+
+
-
-
-
-
+
+
原型演示 · 未连接真实数据与模型。所有材料、判断、数值为虚构演示。综合意见不是正式审批意见。
@@ -164,53 +81,51 @@ body [data-sd-id="60"]{min-width:112px;max-width:none;white-space:nowrap;text-al
- 演示评审员
-
+ 演示评审员
+
-
-
-
-
-
-
主审意见:补充材料后再判断
+
+
+
+
+42%
+审批通过概率 · 演示值
+
+
+
+
+ 人工设定,仅演示交互;未经历史数据校准。目标定义:以本次材料版本提交后的首次审批通过。
+
+
+
主审意见:补充材料后再判断
- 经营现金流与回款说明存在待核实差异,建议先补齐两项关键证据,再推进评审。
-
+ 经营现金流与回款说明存在待核实差异,建议先补齐两项关键证据,再推进评审。
+
+ 生成补件清单
+
@@ -228,22 +143,18 @@ body [data-sd-id="60"]{min-width:112px;max-width:none;white-space:nowrap;text-al
-
-
-
- 证据关系图
-
-
+ 证据关系图
+
- 主审补件建议
-
+ 主审补件建议
+
-
关键问题核实
@@ -294,7 +204,7 @@ body [data-sd-id="60"]{min-width:112px;max-width:none;white-space:nowrap;text-al
+
@@ -309,7 +219,7 @@ body [data-sd-id="60"]{min-width:112px;max-width:none;white-space:nowrap;text-al
+
@@ -328,26 +238,66 @@ body [data-sd-id="60"]{min-width:112px;max-width:none;white-space:nowrap;text-al
例外边界收入集中、关联回款未穿透或材料真实性未核实。
条件相似不等于结论相同。当前项目仍缺银行流水与权属核验。
+
-SCENARIO / 条件推演
补齐证据之后,会发生什么?
-模拟结果,不改变真实项目。以下仅假设证据真实且完成核验。
-选择准备补充的材料,比较哪些争议可能得到回应。
+SCENARIO / 条件推演
+补齐证据之后,审批概率如何变化?
+模拟结果,不改变真实项目。以下仅假设证据真实且完成核验;补件也可能发现新风险,真实概率未必上升,仍需人工复核。
+
+
+
选择准备补充的材料,观察演示概率变化:
-
-
真实预审 · 保持不变2 项待核实
补充材料后再判断
-
+
+
+
+
+
+
所选情景 (演示值)
+
+42%
++0 百分点
+
+
+
+
+
+ 人工设定,仅演示交互;未经历史数据校准
+
+
+
+
+概率、原因与待核实事项随勾选即时更新。
+
+
真实预审 · 保持不变2 项待核实
补充材料后再判断
+
+
+
-
@@ -404,28 +353,94 @@ body [data-sd-id="60"]{min-width:112px;max-width:none;white-space:nowrap;text-al
回款说明.pdf · 第3页 · 虚构演示
主要客户账期延长,预计下一季度集中回款。
尚未提供对应银行流水,不能仅凭解释确认回款。
来源可定位不代表材料真实性已经核验。
从解释到判断,仍缺一环
现有说明提出了账期变化的解释,但需要银行流水与应收账龄交叉核验。专项判断不能替代主审综合意见。
建议下一步
补充近六个月银行流水,逐笔匹配主要客户回款。
+
+
-
+ (()=>{
+ const $=s=>document.querySelector(s),all=s=>[...document.querySelectorAll(s)],sd=n=>$('[data-sd-id="'+n+'"]');
+ let active='overview'; const openers=new WeakMap();
+ function showDialog(id){const d=$('#'+id);openers.set(d,document.activeElement);d.showModal();d.querySelector('button').focus();}
+ all('dialog').forEach(d=>{d.addEventListener('close',()=>openers.get(d)?.focus());d.addEventListener('click',e=>{if(e.target===d){const b=d.getBoundingClientRect();if(e.clientXb.right||e.clientYb.bottom)d.close();}})});
+ all('[data-close]').forEach(b=>b.onclick=()=>$('#'+b.dataset.close).close());
+ function tab(name){if(name==='validation'){showDialog('validation-dialog');return;}if(!['overview','experience','simulation'].includes(name))return;active=name;all('[role=tabpanel][id^="panel-"]').forEach(p=>p.hidden=p.id!=='panel-'+name);all('[role=tab][data-tab]').forEach(b=>{const selected=b.dataset.tab===name;b.setAttribute('aria-selected',selected);b.tabIndex=selected?0:-1;b.classList.toggle('text-primary',selected);b.classList.toggle('border-primary',selected);b.classList.toggle('border-transparent',!selected)});all('[data-nav]').forEach(a=>a.classList.toggle('is-active',a.dataset.nav===name));$('#prototype-navigation').classList.remove('mobile-open');$('#mobile-menu').setAttribute('aria-expanded','false');}
+ all('[data-tab]').forEach(b=>b.onclick=()=>tab(b.dataset.tab));all('[data-nav]').forEach(a=>a.onclick=e=>{e.preventDefault();tab(a.dataset.nav)});
+ all('[role=tab][data-tab]').forEach((b,i)=>b.addEventListener('keydown',e=>{if(!['ArrowLeft','ArrowRight','Home','End'].includes(e.key))return;e.preventDefault();const tabs=all('[role=tab][data-tab]');const j=e.key==='Home'?0:e.key==='End'?2:(i+(e.key==='ArrowRight'?1:2))%3;tabs[j].click();tabs[j].focus()}));
+ $('#mobile-menu').onclick=()=>{const on=$('#prototype-navigation').classList.toggle('mobile-open');$('#mobile-menu').setAttribute('aria-expanded',on)};
+ function evidence(kind='current'){const history=kind==='history';$('#evidence-title').textContent=history?'历史回款证据示例':'回款说明与判断依据';$('#source-location').textContent=history?'历史案例 H-018 · 补件记录 · 虚构演示':'回款说明.pdf · 第3页 · 虚构演示';$('#source-quote').textContent=history?'历史示例中,主要客户实际回款与应收明细逐笔匹配。':'主要客户账期延长,预计下一季度集中回款。';$('#source-gap').textContent=history?'仅为说明经验形成过程的虚构材料,不能替代当前项目核查。':'尚未提供对应银行流水,不能仅凭解释确认回款。';$('#basis-copy').textContent=history?'历史案例补充证据支持当时的解释,适用前提是客户结构稳定且回款可逐笔匹配。当前项目尚未满足同样的证据条件。':'现有说明提出了账期变化的解释,但需要银行流水与应收账龄交叉核验。专项判断不能替代主审综合意见。';$('#evidence-source-tab').click();showDialog('evidence-dialog');}
+ ['node-1','node-2','node-3','node-4','btn-open-drawer-1'].forEach(id=>$('#'+id).onclick=()=>evidence());all('[data-open-evidence]').forEach(b=>b.onclick=()=>evidence(b.dataset.openEvidence));
+ all('[data-evidence-tab]').forEach(b=>b.onclick=()=>{all('[data-evidence-tab]').forEach(x=>x.setAttribute('aria-selected',x===b));$('#evidence-source').hidden=b.dataset.evidenceTab!=='source';$('#evidence-basis').hidden=b.dataset.evidenceTab!=='basis'});
+
+ $('#btn-generate-list').onclick=()=>showDialog('checklist-dialog');sd(81).onclick=()=>tab('experience');sd(96).onclick=()=>{tab('simulation');$('#assume-bank').focus()};sd(100).onclick=()=>showDialog('validation-dialog');
+ $('#btn-show-basis').onclick=()=>showDialog('basis-dialog');
+
+ all('input[name=model]').forEach(r=>r.onchange=()=>{const off=r.value==='off';$('#model-status').textContent=off?'专项核查已关闭。主审仍可基于证据与经验给出有限意见。':'本地开源模型(演示)。无真实模型请求;主审负责综合预审意见。';sd(56).textContent=off?'未执行':'不足';sd(55).textContent=off?'专项核查':'专项支持'});
+
+ // Artificial prototype lookup only: never writes a production probability.
+ const demoScenarios = {
+ '00': {demoProbability:42, remaining:'2 项仍待核实(模拟)', reason:'未选择假设。回款与设备权属证据仍有缺口,保持演示基线。'},
+ '10': {demoProbability:58, remaining:'设备权属仍待核实(模拟)', reason:'假设银行流水逐笔核验后支持账期变化解释,回款不确定性减小;设备权属缺口仍在。演示变化 +16 个百分点。'},
+ '01': {demoProbability:51, remaining:'实际回款仍待核实(模拟)', reason:'假设合同、发票与清单一致且经核验,权属争议得到回应;实际回款仍缺银行流水。演示变化 +9 个百分点。'},
+ '11': {demoProbability:64, remaining:'两项证据缺口在假设下得到回应', reason:'假设回款与权属核验均支持项目解释。组合情景为 64%,变化 +22 个百分点;组合影响不简单相加,仍需综合复核其他风险。'}
+ };
+ function updateSimulation(){
+ const key=Number($('#assume-bank').checked)+''+Number($('#assume-title').checked);
+ const scenario=demoScenarios[key];
+ $('#sim-prob-val').textContent=scenario.demoProbability+'%';
+ $('#sim-prob-delta').textContent='+'+(scenario.demoProbability-42)+' 百分点';
+ $('#sim-prob-delta').style.opacity='1';
+ $('#sim-prob-bar').style.width=scenario.demoProbability+'%';
+ $('#sim-remaining').textContent=scenario.remaining;
+ $('#sim-explanation').textContent=scenario.reason;
+ $('#simulation-comparison').hidden=false;
+ }
+ ['assume-bank','assume-title'].forEach(id=>$('#'+id).addEventListener('change',updateSimulation));
+ $('#run-simulation').onclick=()=>showDialog('basis-dialog');
+ updateSimulation();
+ $('#copy-checklist').onclick=async()=>{const text='DEMO-026 演示补件清单\n1.近六个月银行流水及应收账龄,逐笔匹配主要客户回款。\n2.设备采购合同、发票和清单,解释品名差异。';try{await navigator.clipboard.writeText(text);$('#copy-status').textContent='演示清单已复制。';}catch{$('#copy-status').textContent='浏览器未允许复制,请选择上方清单文字手动复制。'}};
+ tab('overview');
+ })();
+
+
+
+