应用接入 JMOS 指南
更新日期:2026-10-09,Asia/Shanghai。适用对象:做界面的 UI/UX 同事(包括刚入门的)、写服务的后端同事。
本文说明一个应用怎样“接入 JMOS”:前端怎样长得像 JMOS、怎样出现在应用中心和工作台里、怎样把数据和提交交给可替换的适配器;后端怎样按 JMOS 架构找到负责的模块、按版本化契约对接、不绕路。全文用 13 故障诊断 做贯穿示例,对应的可运行样张在 prototypes/app-integration-13/。
依据与时效(请先读)
- 分层原则以本仓 JMOS 前后端分层与契约边界(docs/JMOS前后端分层与契约边界.md) 为准,本文是它的操作手册,不改变其中任何规则。
- 架构与契约来自契约仓
jmos-n31(HEAD3e081bfb6c1c09ff49301bc65c3ac6d7f8ad7637,提交于 2026-09-22 15:55 UTC+8),契约为设计 v0.1、contract_version0.1.0、审批 D-S4,由生成器确定性生成、不手改。Bridge 缓存最近全量同步为 2026-09-18 19:13:44 UTC+8;14 份文档的摘要与 来源记录(reviews/2026-10-07/layering/bridge-contract-sources.json) 一致。- 未完成实时复核:2026-10-07 门户不可达;2026-10-09 14:08 UTC+8 本机
jmos status因配置键不匹配无法运行(未修改配置)。下文所有契约事实都是“9-18 缓存 + 契约 v0.1”,待实时复核。设计线正在修订 v0.2,换版后需重核本文引用。- 契约原文里没有的东西,本文一律写作 契约缺口,不猜路径、不补字段。
1. 一页总览
一句话:页面只管显示和交互;数据、判断和提交都经过“能力接口 → 适配器 → JMOS 模块”这条路,演示和正式可以一键切换,正式失败时如实报错,不偷偷换回演示数据。
flowchart LR
subgraph 前端["前端(本仓)"]
V["页面视图<br/>HTML/CSS/图表/局部交互"] --> U["前端用例<br/>加载·草稿·提交·重试"]
U --> P{{"能力接口<br/>如 diagnosisPort"}}
P --> D["演示适配器<br/>固定数据·可重置"]
P --> F["正式适配器<br/>按契约映射"]
U --> H["宿主桥接<br/>导航·主题·上下文·生命周期"]
end
B["初始化入口 boot<br/>选择并注入适配器"] -.-> P
F -->|"浏览器入口(多数仍是契约缺口)"| E["entry / mat 等 JMOS 模块"]
E --> S["dsvc 读取 · upc 身份 · rt→down 受控写 · twin→ver→eval 排练与签发"]
H <-->|"postMessage(只编排,不做业务)"| W["07 工作台 / 05 应用中心"]接入一个应用的完整流程:
flowchart TD
A["1 写清能力:用户在这页要做什么"] --> B["2 经 Bridge 查模块归属与契约<br/>记录路径·版本·审批·来源·同步时间"]
B --> C["3 定义能力接口(port)<br/>方法、结果信封、错误语义"]
C --> D["4 写演示适配器<br/>把剧本/样例/模拟提交搬进来"]
D --> E["5 页面改为只依赖接口<br/>导航与提交分开"]
E --> F["6 写正式适配器骨架<br/>已定字段映射,缺的标契约缺口"]
F --> G["7 登记:05 应用中心、07 工作台、问小锦"]
G --> H["8 验收:视觉对照、交互、两种适配器、内嵌"]
H --> I["9 契约补齐后逐项接通<br/>真实集成另行验收"]| 你是谁 | 先看哪几节 |
|---|---|
| UI/UX,第一次做 JMOS 页面 | §2 设计基础 → §3 登记 → §8 自查清单 |
| 前端,要把页面拆成可接后端 | §4 宿主桥接 → §5 适配器 → §6 状态归属 → §9 13 示例 |
| 后端 | §7 按 Bridge 接入 → §7.5 契约缺口登记 → §9 |
2. 前端接入清单:设计基础
新应用首先要“看起来、用起来就是 JMOS”。这些是硬要求,来源见各行。
| 项 | 要求 | 依据 |
|---|---|---|
| 色彩 v1 | 只用已有语义变量(--jm-text-*、--jm-bg-*、--jm-border、--jm-ok-* / --jm-bad-*、--jm-chart-* 等)。不新增 HEX、rgba、color-mix;不加暖色、米白或整页罩色。状态色只表达状态 | 色彩规范 v1(docs/JMOS色彩规范-v1.md),唯一源 design-system/color/v1.json |
| 分级与状态 | 严重度(sev critical/high/medium)和状态(st ok/warn/bad/info/neutral)按规范选择;后端严重度与前端选中/焦点/请求中等状态分开映射,不合成一个字段 | 分级与状态选择(docs/JMOS分级与状态选择.md) |
| 几何 | 克制小圆角(按角色 4/6/8/2px,用 --jm-radius-* 变量),细线分层,不套多层卡片,不加装饰 | 设计语言不变量(docs/设计语言不变量.md) |
| 图标 | 只用官方图标族 icons/jmos-icons.js:<i data-ic="名称"></i> 后调用 jmIcons.hydrate(),或 jmIcons.svg('名称')。不用 legacy assets/icons.js,不自画图标 | app/jmos/icons/ |
| 手机底栏 | 有模块导航的页面用统一底栏 方案 A 配方(已并入,提交 0f512bf):≤640 显示前 5 项,官方图标,当前项 brand-soft 底 + --jm-radius-sm,徽标 16×16,行间隔 4px、space-around | 04 两页与 01/02 现行实现 |
| 深浅主题同步 | 加载 assets/mvp.js(或 theme-sync.js)。主题来源顺序:?theme= → localStorage['jmos-theme'] → 默认;内嵌时响应宿主 jmos-theme 消息;同源其他页通过 storage 事件同步。重绘图表监听 jm-theme 事件。不在页面里写死颜色 | assets/mvp.js |
| 无级自适应 | 从 390 手机(触屏)到 768 平板、1440 笔记本、2560/4K 都可用:用 minmax(0,1fr)、clamp()、流式网格,不按设备挡位写死宽度;不横向溢出;触控目标够大。MacBook Air 上滚动和切换要流畅 | 设计规范 §14 流式布局 |
| 减少动态效果 | 尊重 prefers-reduced-motion;动效不承载业务含义 | 不变量“动效与适配” |
| 随处问小锦、就地完成 | 加载 assets/assist.js 并声明 data-page="页号";可问的对象(报警、证据、表格行、图表)要能被它标记;按 / 或 ⌘K 在本页打开对话,不跳走。“问小锦”跳完整对话只作为补充入口 | assets/assist.js |
| 文案 | 中文、短句、说人话;演示页必须写明“演示数据为虚构示例” | 现有各页 |
13 示例:13 原本就满足以上各项,接入样张没有改任何颜色、圆角、字体或布局;新增的两处样式(第 6 步“尚未提交”、接入状态面板)只用已有变量,见 §9。
3. 登记:出现在 05 应用中心和 07 工作台
JMOS 里“应用存在”的权威是 reg 注册中心(architecture.json 节点 reg:制品与能力目录,“一切契约的挂靠点”)。但契约仓目前没有 reg__* 契约目录,前端拿不到权威目录 —— 这是 契约缺口。在补齐之前,UI 仓里按下面的位置静态登记,并且把“目录存在”“有权限”“运行健康”“业务摘要”当成四件不同的事。
| 位置 | 登记什么 | 13 的现状 |
|---|---|---|
05-应用卡片首页.html 应用清单 | code、名称、一句话简介、插图、状态三元组、meta;搜索关键词 KW | C-01 故障诊断,关键词“报警 故障 根因 …” |
07-台前调度工作台.html META / SCENE | 名称与状态;src: t => './页面.html?theme=' + t、预览图、mvp: 1(表示页面支持主题消息) | 'C-01': { src: t => './13-故障诊断.html?theme=${t}', … mvp: 1 } |
07 FLUIDP | 页面已做流式布局、手机上可按真实宽度显示时才加入 | 含 C-01 |
assets/mvp.js JM_APPS | 文件名 → 应用编号;内嵌时页内链接会变成 jmos-open 交给工作台打开 | '13-故障诊断.html': 'C-01' |
assets/assist.js PAGES | 页号、名称、文件、编号;问小锦的页面上下文 | '13': { name: '故障诊断', … code: 'C-01' } |
重复清单本身是已登记的耦合(分层文档“05 及 07:重复应用清单”),以后应收敛为“单一展示目录 + 可替换目录适配器”,届时目录适配器对接 reg。
4. 宿主桥接:页面和工作台之间能说什么
内嵌在 07(iframe)时,页面与宿主只交换导航、主题、上下文、视图生命周期四类消息。审批、执行、计数这类业务事实不能靠 postMessage 决定。
| 方向 | 消息 | 含义 | 规则 |
|---|---|---|---|
| 07 → 页面 | jmos-theme {theme} | 切主题 | 页面立即应用,不回发 |
| 07 → 页面 | jmos-ctx、jmos-cmdk | 上下文、命令面板 | 只影响展示与选择 |
| 07 → 页面 | jmos-pause / jmos-resume | 视图隐藏/恢复 | 只暂停渲染;不暂停真实任务 |
| 07 → 页面 | jmos-queue {n} | 待确认数量 | 仅显示用;以后应来自同一队列读模型 |
| 页面 → 07 | jmos-open {code, q} | 打开另一应用 | 由 mvp.js 统一转换页内链接 |
| 页面 → 07 | jmos:flyto、jmos:pin、jmos-close、jmos-summon、jmos-esc | 定位孪生、钉住、关闭、唤起小锦、退出 | 只编排视图 |
| 页面 → 07 | jmos:queue | 通知“刚有一张单进入待确认” | 只在服务受理后发;载荷是结构化变更 + 证据引用(见 §9),不带 HTML |
| 07 → 10 | jmos-queue-add {item} | 把队列项交给 10 显示 | 过渡做法;最终 10 应从 entry 队列读模型刷新 |
| 05 ↔ 07 | jmos-focus、jmos-search | 应用中心焦点与搜索 | — |
要求:来源与载荷校验集中在宿主桥接适配器里做;“视图已就绪”“消息已投递”“服务已受理”“业务已完成”分开记录。页面不读别的页面的全局变量,也不覆盖别的页面的函数。
5. 能力接口与适配器:演示和正式怎么装配
5.1 三件东西
- 能力接口(port):用业务语言写的一组方法,例如“读取诊断”“生成变更草稿”“提交到待确认”。页面和用例只认它。
- 演示适配器:实现接口,返回固定、可复现、可重置的数据;演示状态放在独立命名空间(例如
sessionStorage的jmos-demo/13,?demo-reset=1清空)。剧本、样例数据、模拟提交、演示时钟都放这里。 - 正式适配器:实现同一接口,按契约组请求、解析信封、转换错误。失败时返回真实错误或降级,绝不回退成演示数据。
5.2 结果统一用响应信封的外形
所有方法返回 Promise<Result>,外形沿用 contracts/_common/response-envelope.schema.json(v0.1.0):
| 字段 | 必需 | 说明 |
|---|---|---|
status | 是 | ok / degraded / error。degraded 要在界面上看得出来(例如证据包 missing[] 非空) |
code | 是 | <节点>.<类别>.<编号>;成功为 <节点>.<资源>.000。类别见 contracts/_common/error-codes.yaml(client 400、auth 401、perm 403、notfound 404、conflict 409、gone 410、contract 412、taint 422、quota 429、internal 500、upstream 502、unavailable 503、timeout 504) |
message、data、correlation_id、contract_version | 是 | 关联 ID 用于排障;契约版本要显示在接入状态里 |
evidence_refs[] | 否 | {ref_type: ts/ev/curve/media/biz/prog/know/pack, ref_id, as_of, note}。事实类回答必须带非空证据引用,并带 knowledge_version 与 model_version |
error_data | 出错时 | http_status、retryable、details、upgrade_required、approval_ref |
前端可以加一个自己的 source: 'demo'|'bridge' 字段区分来源,但要注明它不属于契约。注意:现有错误码只覆盖 ev/dsvc/gw/upc/obs,mat、entry、reg 没有错误码表(契约缺口),前端在缺口期用 frontend.* 前缀标记自己产生的错误,不冒充服务端码。
5.3 装配:初始化入口显式选择
// boot.js —— 启动时明确选一个,不做“失败就换另一个”
const q = new URLSearchParams(location.search);
const port = q.get('adapter') === 'bridge'
? JMDiagnosisBridgeAdapter.create({ /* 身份、范围等由宿主或登录流程提供 */ })
: JMDiagnosisDemoAdapter.create();
const app = JMDiagnosisApp.create({ port, host: JMHostBridge.create(window) });
JMDiagnosisView.mount(app);
app.start(q.get('case'));
页面上要有一个默认收起的“接入状态”说明(13 样张在左栏底部),告诉看的人当前是演示还是正式、契约版本、数据来自哪里。
5.4 写操作的三条前端规矩
- 导航不是提交:切步骤、自动播放、刷新、深链到某一步,都只改视图;提交只在用户点明确的提交按钮时发生。
- 幂等:同一份草稿重复点提交,用同一个幂等键(对应
X-Idempotency-Key);按钮防连点不等于服务端幂等。 - 以服务确认推进:只有服务受理后才显示“已提交”、才通知宿主;超时且结果未知时先查证,不能当失败重试。
6. 状态与存储归属
| 状态 | 归谁 | 13 的例子 |
|---|---|---|
| 悬停、焦点、展开、滚动、当前步骤 | 当前视图,不进契约 | 当前步骤 ?step=、推理过程展开、引用高亮 |
| 主题、布局、固定、最近使用 | 前端本地偏好(jmos-theme 等) | 主题 |
| 演示会话、模拟提交、演示时钟 | 演示命名空间,可重置 | jmos-demo/13(提交回执、停机分钟数) |
| 正式查询缓存、未发送草稿、待处理请求 | 前端持有副本,标清身份、范围、版本、新鲜度;身份变化即清退;旧响应不覆盖新选择 | 勾选措施后的草稿(用例丢弃过期响应) |
| 正式会话、队列、任务、权限、设备结果 | 后端权威 | 待确认队列、审批、执行与读回 |
7. 后端按 Bridge 接入
7.1 先查模块归属(每个新能力都走一遍)
- 用 Bridge 查:
jmos status确认连接与同步时间,再查模块、上下游连线和完整契约(Bridge 的 MCP 工具或门户)。查不到实时结果时,用 Bridge 缓存或契约仓原文,并在登记表写明“缓存/原文,同步时间,待实时复核”。 - 在
architecture.json找节点:看layer_name、one_liner、target、分期任务phase_tasks、认领状态status。节点之间的连线E-xx才是服务间约定。 - 找契约目录:
contracts/<from>__<to>/(每条连线一个)或contracts/<node>__north/(北向公共契约)。每个目录只有README.md、openapi.yaml、asyncapi.yaml、mcp-tools.yaml、*.schema.json;README 写明连线标签、形态、contract_version、N/N-1 截止、审批编号。 - 记录:原文路径、版本、审批、来源(实时/缓存)、同步时间、明确字段、开放问题(
待定)、浏览器能否直接调用。 - 服务间连线 ≠ 浏览器 API。E-21、E-25、E-26 等是服务之间的约定,前端不能直接调用;浏览器能调用哪个入口必须有北向或专门的消费契约,没有就是契约缺口。
7.2 模块职责(摘自 architecture.json,事实源 v0,抽取于 2026-09-11)
| 节点 | 名称(层) | 一句话职责 | 应用接入时的含义 |
|---|---|---|---|
entry | 统一入口与收件箱(④ 治理层) | 人侧的权威模型与交互终局 | 待确认队列、确认/拒绝、值班权威、超时规则在这里;三期任务是“对话+看板+待确认” |
mat | 场景应用矩阵(⑤ 应用层) | 场景包机制的产物清单 | 诊断、问答、监控等场景的业务逻辑;二期任务含诊断场景 |
gw | 模型网关+模型生命周期(③ 能力层) | 一个逻辑推理门,多个物理通道 | 场景经 E-08 调模型;不是网页 API 网关 |
dsvc | 统一数据服务(② 数据层) | 逻辑单读取口 | 所有分析读取、证据包都走它,不逐页直连数据源 |
reg | 注册中心(④ 治理层) | 一切契约的挂靠点 | 应用与能力目录;目前无契约(缺口) |
upc | 统一身份+内容信任(④ 治理层) | 谁在调用、内容可不可信 | 登录、委托、访问范围、污点 |
rt | 智能体运行时(③ 能力层) | 长任务执行内核的事务语义 | 长任务与恢复;不是普通对话编排器 |
sch | 任务调度与三层仲裁(④) | 冲突裁决 | 任务冲突由它裁决,页面不排队 |
act | 动作分级与安全包线(④) | 四档自治的闭环 | 生效档位由它给出,页面不自算 |
eval | 评测门禁(④) | 唯一签发权威 | 上线、升档、证据通过由它签发 |
down | 命令网关(① 接入层) | 全厂命令权威 | 唯一真实写门 |
twin / ver | 产线孪生与排练场(③)/ 验证设施(横切) | 先在不伤产线的地方失败 / 产证 | 排练产证据,签发仍在 eval |
obs | 审计与可观测(④) | 事后审计不可抵赖 | 写操作留审计 |
ev | 事件(② 数据层) | 智能的主食 | 报警、事件经统一事件信封 |
7.3 硬规则
- 不旁路:不从页面或应用后端直连 PLC、MES、数据库或内部服务;读取走
dsvc,模型走gw。 - 写设备只走
rt → down(E-25):contracts/rt__down/规定写入经POST /v1/down/intents,并明确禁止直连 PLC/DB。请求里confirm_token_ref、capability_token_ref、lock_id是三样东西,不能合并成一个“已授权”。 - 审批、下发、读回分开:E-26(
contracts/entry__rt/)的确认令牌token_id / long_task_id / intent_id / watch_authority / evidence_pack_ref各指不同实体,过期令牌不会被自动执行;E-25 的命令状态(accepted / dispatched / readback / rejected / voided / aborted,枚举待定)与readback_match分开显示。审批通过 ≠ 已执行 ≠ 读回一致。 - 响应信封:所有业务响应带
status ok/degraded/error、错误码、证据引用、correlation_id、contract_version(contracts/_common/response-envelope.schema.json)。OAuth 响应按其协议,不套信封。 - 公共头(
contracts/_common/headers.yaml):Authorization(Bearer,UPC 签发)、X-Actor-Id({kind}:{id},human/agent/tool)、条件必需的X-On-Behalf-Of、X-Access-Scope(只能是子集,不扩权)、X-Correlation-Id(UUIDv7)、X-Contract-Version、写请求的X-Idempotency-Key;X-Read-Semantics只用于 dsvc,X-Model-Policy只用于 gw。 - 身份走 upc:令牌由
upc签发(E-10contracts/upc__entry/:POST /v1/upc/tokens:issue只返回token_ref / expires_at / scope,不回明文);委托主体、执行主体、责任主体、授权主体分别保留(GET /v1/upc/assertions的exec_subject / duty_subject / authz_subject)。前端的“能不能点”不是授权。 - 排练不是执行证明:
twin → ver(E-07contracts/twin__ver/)给出的docket_ref只是证据清单引用,尚未裁决;裁决在ver → eval(E-20)。3D 动画不能充当试算结果。 - 密钥不进仓:密钥只放被忽略的
.secrets/,不打印、不提交、不明文发布。
7.4 前端能用的后端结果怎么显示
| 后端结果 | 前端显示 |
|---|---|
status=ok | 正常显示;事实类内容旁边可展开证据 |
status=degraded | 显示内容并标出缺了什么(例如证据包 missing[]),不装作完整 |
status=error 且 retryable=true | 显示原因和“重试”;重试用同一幂等键 |
status=error 且 upgrade_required / approval_ref | 引导去确认或升级流程,不在本页绕过 |
| 超时/结果未知 | 显示“结果未知,正在查证”,先查状态,不直接重发 |
| 正式适配器未接通 | 显示“未接通”和契约缺口;不显示演示数据 |
7.5 契约缺口登记表(模板)
每个应用接入时复制此表,逐项填写。“能力存在、界面已做、演示通过、契约对齐、服务接通、集成通过”分别记录,不能互相代替。
| 编号 | 能力与场景 | 模块 / 连线 | 原文路径与版本 | 已明确字段 | 缺口或待定 | 浏览器入口 | 权威数据来源 | 错误/取消/重试/顺序 | 演示适配 | 接通与验证 | 负责人 / 跟进 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| G-xx | contracts/…,0.1.0,D-S4,缓存 2026-09-18 | 有 / 无(缺口) | 已做 / 未做 | 未接通 / 已接通 / 集成通过 |
8. 每个应用的接入步骤、验收表与自查清单
8.1 接入步骤
- 拍基线:独立页与 07 内嵌、浅/深、390 触屏/768/1440/2560 各截一组,记下已批准的交互。
- 写能力表:页面上每个“读、判断、写”的动作列出来,标出属于哪个模块(§7.2)。
- 查契约:按 §7.1 登记,缺的进 §7.5。
- 定义能力接口:方法名用业务语言;每个方法返回信封外形;写清哪些只读、哪些是写。
- 抽演示适配器:把页面里的剧本、样例数据、模拟提交、演示时钟原样搬过去,页面不再内嵌数据。
- 页面只依赖接口:保持原 HTML 结构和类名,像素不变;把“导航”和“提交”拆开;跨页只传结构化数据和证据引用。
- 正式适配器骨架:已定字段写映射;未定的标
TODO 契约缺口;在接通前不发真实请求,返回“未接通”。 - 登记(§3)并检查宿主消息只在允许范围(§4)。
- 验收(§8.2),记录结果和截图,人眼看过再下结论。
- 契约补齐后逐个方法接通正式适配器;真实授权、幂等并发、受控写、审计属于集成验收,演示通过不算。
8.2 验收表
| 层面 | 检查项 | 通过标准 |
|---|---|---|
| 视觉 | 演示模式与原页逐步对照 | 几何一致、像素一致(新增说明面板与合规改动除外并列出) |
| 视觉 | 浅/深 × 390 触屏/768/1440/2560 × Chromium/WebKit | 无横向溢出、无裁切,主题正确 |
| 交互 | 导航不提交 | 步骤条、上一步/下一步、键盘、自动播放、深链都不触发写 |
| 交互 | 明确提交 | 只在点提交时发生;重复点击幂等;受理后才通知宿主 |
| 交互 | 问小锦 | 本页就地打开,对象标记数不变 |
| 适配器 | 演示 | 可复现、可重置;成功/失败场景可测 |
| 适配器 | 正式 | 未接通时显示真实错误或降级;页面上不出现任何演示数据或演示成功 |
| 宿主 | 07 内嵌 | 打开、主题同步、队列通知、关闭正常;消息不带 HTML |
| 契约 | 引用 | 每条引用写原文路径、版本、审批、来源与同步时间;缺口已登记 |
| 质量 | 控制台 | 0 报错、0 个 4xx/5xx 资源 |
8.3 新应用自查清单
- 只用色彩 v1 已有变量,没有新 HEX / rgba / color-mix,没有暖色或新装饰
- 图标全部来自
icons/jmos-icons.js - 圆角、细线、状态标签与同类组件一致
- 有模块导航时,手机底栏用方案 A 配方
?theme=、本地偏好、宿主jmos-theme三条路都能切主题;图表随主题重绘- 390 到 2560 无级自适应,无横向溢出;触屏可用;减少动态效果生效
- 加载
assist.js并声明页号,可问对象被标记,/就地打开 - 已在 05、07(META/SCENE、需要时 FLUIDP)、
mvp.jsJM_APPS、assist.jsPAGES 登记 - 页面不含业务数据、剧本或模拟提交;都在演示适配器里
- 页面不直接用
fetch、localStorage(主题除外)、postMessage;经接口或宿主桥接 - 导航与提交分开;提交幂等;受理后才显示成功、才通知宿主
- 跨页只传结构化数据与证据引用,不传 HTML
?adapter=bridge时显示“未接通”或真实错误,不回退演示数据- 默认收起的接入状态说明写清当前层次与契约版本
- 每个契约引用带路径、版本、审批、来源与同步时间;缺口已登记
- 后端:读取走 dsvc、模型走 gw、身份走 upc、写设备只走 rt→down,审批/下发/读回分开
- 演示页写明“演示数据为虚构示例”;不提交密钥,不明文发布
9. 贯穿示例:13 故障诊断
样张:prototypes/app-integration-13/(node prototypes/app-integration-13/server.mjs,本机 (本机预览地址))。原页 app/jmos/13-故障诊断.html 未改。
9.1 能力表与模块归属
| 页面上的动作 | 能力接口方法 | 模块与契约 | 浏览器入口 |
|---|---|---|---|
| 看报警、诊断叙述、关联信号、根因与置信度、处置建议 | loadCase(caseRef) | mat 诊断场景(二期);模型经 gw__mat E-08;数据经 dsvc | 缺口:无 mat__north |
| 点引用角标看来源 | expandEvidence({caseId, cite}) | dsvc__north POST /evidence-pack(02 §4.6);E-05 dsvc__rt 的 evidence_pack_ref / dsvc_get_evidence_pack | 证据包有北向 HTTP;角标与 ref_id 的对应关系是缺口 |
| 勾选措施、生成变更单草稿(只预览) | draftChange({caseId, actionIds}) | mat 场景输出;询档 mat__act E-21 POST /v1/act/intended-actions:check(服务间) | 缺口 |
| 提交到待确认 | submitChange({draft, idempotencyKey}) | entry 待确认队列;之后 E-26 确认令牌、E-25 受控写只在服务端 | 缺口:无 entry__north |
| 放弃草稿 | discardDraft | entry / mat | 缺口 |
| 待确认队列预览 | readQueuePreview | entry 队列读模型 | 缺口 |
| 停机分钟数随时间变化 | watchCase | E-05 订阅(dsvc→rt) | 缺口:无浏览器推送 |
| 在孪生中定位 | 宿主桥接(导航) | 前端;真实排练走 twin→ver→eval | 不需要 |
9.2 拆掉的两处耦合
- 第 5 步到第 6 步不再连带提交。原页里任何“去第 6 步”的点击都会弹“已提交到待确认”并发队列消息。样张中:步骤条、下一步、键盘、自动播放、深链都只切换视图;第 5 步的主按钮改为
data-submit,只有点它才调用submitChange,受理后再跳到第 6 步。未提交时进入第 6 步显示“变更单尚未提交”的预览态(合规改动,见 §9.4)。 - 跨页不再传 HTML。原页发给 07 的
jmos:queue携带拼好 HTML 的队列项。样张发送{type:'jmos:queue', v:2, id, change, evidence_refs}:change是结构化变更(对象、变更前后、生效条件、检查、升级、执行方式、时间线),evidence_refs是信封格式的证据引用。07 里由投影脚本把它渲染成 10 现有的队列项格式,经验证与原页产生的队列项完全一致;以后应由 10 直接渲染结构化数据。
9.3 正式适配器的契约映射(摘要)
| 前端字段 | 契约字段 | 原文 |
|---|---|---|
| 证据窗口 | window_before_s / window_after_s,默认 10/5 分钟为开放问题 C-02-1 | contracts/dsvc__north/openapi.yaml(02 §4.6),0.1.0 |
| 证据缺失提示 | missing[] 非空 → degraded | 同上 |
| 证据角标来源 | evidence_refs[].ref_type / ref_id / as_of / note | contracts/_common/response-envelope.schema.json |
| 生效档位、是否必须确认 | effective_grade / allowed / must_confirm / whitelist_only / reject_code | contracts/mat__act/openapi.yaml(E-21) |
| 确认令牌状态 | token_id / intent_id / watch_authority / expires_at / grade_required / evidence_pack_ref;entry.confirm.closed 的 close_reason | contracts/entry__rt/(E-26) |
| 执行与读回 | command_id / state / reject_code / readback_match | contracts/rt__down/(E-25) |
| 排练证据 | docket_ref / accept_state / reject_code | contracts/twin__ver/(E-07) |
完整映射与缺口表见 app-integration-13.md 与 prototypes/app-integration-13/integration/diagnosis-bridge-adapter.js。
9.4 相对原页的可见变化(全部列出)
| 变化 | 原因 |
|---|---|
| 第 5 步主按钮行为:只提交(文字、样式不变) | 拆开导航与提交 |
| 未提交时的第 6 步:灰色“尚未提交”框 + “回到变更单”,流程第一项为“待提交”,队列预览只有已有的 2 项 | 不能在没提交时显示“已提交” |
| 左栏底部新增“接入状态”,默认收起,12px 次级文字,≤800 隐藏 | 让人看懂分层 |
?adapter=bridge:显示“诊断服务未接通”与契约缺口,案件信息与各步为空 | 正式适配器不回退演示数据 |
仍未拆的耦合(不在本样张范围):assets/assist.js 内部依赖页面全局 go 和 DOM;“问小锦”链接的上下文仍是静态文本;反馈按钮(有帮助/不准确)的写入尚无契约。
10. 术语速查
| 词 | 意思 |
|---|---|
| 能力接口(port) | 页面需要的一组业务能力,用方法表示 |
| 适配器 | 实现能力接口的一方:演示的用固定数据,正式的按契约请求 |
| 信封 | 统一响应外形:status / code / message / data / evidence_refs / correlation_id / contract_version |
| 契约缺口 | 契约原文里没有、但接入需要的东西;登记,不猜 |
| 受控写 | 改变设备或业务状态的写入,只经 rt → down |
| 值班权威 | 有权确认写操作的人(E-26 watch_authority) |