feat(operations): support canonical source providers

This commit is contained in:
lingniu
2026-07-16 22:50:55 +08:00
parent 9a5e6e0c4f
commit 65b4e4f055
17 changed files with 1050 additions and 52 deletions

View File

@@ -341,7 +341,7 @@ Content-Type: application/json
}
```
The diagnostic response exposes every current location candidate, including the current verified `providerOverride` and gateway-policy `policyRemark`, but never exposes the raw source key. `sourceRef` is a SHA-256 reference resolved only by the server. Operator principals may read this diagnostic; only administrators may write.
The diagnostic response exposes every current location candidate, including the current verified `providerOverride` and gateway-policy `policyRemark`, but never exposes the raw source key. `sourceRef` is a SHA-256 reference resolved only by the server. A connected protocol that currently has no independent location candidate is represented by a `CANONICAL` protocol snapshot with an opaque `sourceRef`, so its verified provider can still be maintained. Canonical snapshots are provider-only targets: attempts to change `enabled`, `priority` or `remark` return `SOURCE_POLICY_CANONICAL_READ_ONLY`. Operator principals may read this diagnostic; only administrators may write.
`providerEvidence` is mandatory whenever `providerName` changes, including removal. It is written to the immutable provider audit and is deliberately separate from `remark`, which belongs only to source enable/priority policy. A provider-only update must preserve the existing policy remark. Both change types share the vehicle-level optimistic `version`; stale writes return `SOURCE_POLICY_VERSION_CONFLICT`.

View File

@@ -158,6 +158,8 @@ Production smoke must create an export for an active VIN, wait for `completed`,
Before a customer demonstration, run `deploy/verify-customer-demo.py` with the password supplied only through `DEMO_PASSWORD`. The gate logs in as the actual customer, requires the exact four customer menus, compares the complete realtime VIN set with the approved cohort, verifies representative source/location states, confirms an out-of-Scope VIN cannot resolve, checks optional track and mileage evidence, loads the four customer SPA routes and logs out. The script never creates an account, changes grants or persists the password; account identity and VIN Scope must be approved separately. See `docs/customer-demo-acceptance.md`.
For an authoritative JT808 provider list, use `deploy/import-source-providers.py`. The command reads its administrator credential only from `SOURCE_PROVIDER_ADMIN_TOKEN`. `--export-missing <new.csv>` produces an Excel-compatible, masked template for current provider gaps and refuses to overwrite an existing path. A filled CSV must first pass the default read-only preflight; add `--apply` only after reviewing the `ready` summary. The importer validates every row before the first write, preserves the current enabled state, priority and policy remark, and updates only provider/evidence through the audited optimistic-version API. Protocol-level canonical snapshots receive an opaque provider reference even when no independent location source exists, but their terminal policy fields remain read-only. The importer stops on source/protocol/current-provider drift and never accepts a missing evidence reference. See `docs/meeting-goal-external-input-handoff.md`.
`AUTH_MODE=enforce` is mandatory on ECS. Tokens are stored as SHA-256 comparisons in memory and sent as Bearer credentials; the browser stores the entered token only in `sessionStorage`. Roles are cumulative:
| Role | Permissions |

View File

@@ -0,0 +1,105 @@
# 0716 会议 Goal 外部输入交接单
更新时间2026-07-16 22:49Asia/Shanghai
本交接单只记录开发侧无法推断、且会改变真实客户可见范围或主数据事实的输入。收到资料后按本文验证,不修改 `ln-asset-management`
## 1. 当前生产阻塞快照
| 待办 | 当前生产事实 | 缺少的权威输入 | 输入责任方 |
| --- | --- | --- | --- |
| P0-08 客户账号与演示 | 目前共 2 个账号1 个管理员、1 个既有客户;既有客户严格四菜单并授权 1 辆车 | 秦总、蒲总各自登录名/手机号、显示名、车辆 VIN Scope、初始密码安全交付方式可选客户/租户映射 | 业务负责人 |
| P1-02 接入资料校准 | 1,024 辆权威车辆中101 辆仍有 `JT808 接入方未维护`8 辆仍有 `车辆品牌未维护` | 当前终端/手机号或协议接入到 JT808 提供方的权威清单8 辆车的品牌主数据及来源依据 | GPS 运维/厂家、资产资料责任人 |
| P1-04 OneOS 正式接口 | ECS 未配置 `ONEOS_SCOPE_SOURCE`、正式 URL、Service Token、HMAC 密钥;同步定时器未安装 | 正式内网 URL、独立 Service Token、独立 HMAC 密钥、ECS 私网源地址白名单、完整快照 | OneOS 团队 |
禁止用终端号规律、来源 IP、旧里程来源、注册报文厂商码或历史聚合值猜测当前提供方禁止为了演示倒签车辆授权起点。
## 2. P0-08 账号输入格式
每个账号至少提供:
```text
loginName:
displayName:
vehicleVins:
passwordDeliveryMethod:
customerRef: # 可选
tenantRef: # 可选
```
固定菜单只能是:
```text
monitor,vehicles,tracks,statistics
```
初始密码不得写入 Git、会议纪要或本交接单应通过独立安全渠道交付。账号建立后分别运行 `deploy/verify-customer-demo.py`,并为两个账号各选择一个对方未授权 VIN 验证越权阻断。
## 3. P1-02 提供方清单导出与导入
生产 release `canonical-provider-access-fallback-20260716224816` 内置 `deploy/import-source-providers.py`。令牌只通过临时环境变量传入不写命令行、CSV 或日志。
先导出当前待补清单:
```bash
read -s SOURCE_PROVIDER_ADMIN_TOKEN
export SOURCE_PROVIDER_ADMIN_TOKEN
/opt/lingniu-vehicle-platform/current/deploy/import-source-providers.py \
--base-url http://127.0.0.1:20300 \
--export-missing /root/jt808-provider-gaps-20260716.csv
```
导出文件是 UTF-8 BOM CSV适合 Excel 打开,包含:
- `vin``plate`
- 不可逆的 `source_ref`
- 脱敏终端标签;若网关只保留协议接入快照而没有独立位置来源,该列为空,仍可按车辆/协议维护提供方;
- 预期协议和当前提供方,用于防止清单处理期间来源漂移;
- 待填写的 `provider_name``evidence`
GPS 运维或厂家必须为每行填写规范提供方名称和可追溯依据。依据可以是权威终端清单版本、厂家确认记录编号等,不能只写“已确认”。
导入前先只读预检:
```bash
/opt/lingniu-vehicle-platform/current/deploy/import-source-providers.py \
--base-url http://127.0.0.1:20300 \
--csv /root/jt808-provider-gaps-20260716-filled.csv
```
只有输出 `source_provider_import=ready` 后才执行:
```bash
/opt/lingniu-vehicle-platform/current/deploy/import-source-providers.py \
--base-url http://127.0.0.1:20300 \
--csv /root/jt808-provider-gaps-20260716-filled.csv \
--apply
unset SOURCE_PROVIDER_ADMIN_TOKEN
```
工具会在任何写入前完成全表预检,并逐条复用当前启停、优先级和策略备注,只修改提供方及其独立核验依据。每次修改继续走管理员 API、乐观版本和不可变审计单批最多 500 行。协议级融合快照只能维护提供方,前后端均禁止从快照修改终端启停、优先级或策略备注。若中途发生并发版本变化,工具立即停止,已成功项保留审计,剩余项需重新导出/预检。
品牌缺口必须先在 OneOS/资产主数据中取得正式品牌事实,再按现有主数据同步路径进入中台;不得直接猜测或覆盖已有品牌。
## 4. P1-04 OneOS 交付检查
OneOS 交付时必须同时确认:
1. 内网 URL 与路径;
2. Service Token 和 HMAC 密钥互相独立;
3. OneOS 网关只允许 ECS 指定私网源地址;
4. 时间戳窗口不超过 60 秒request ID 防重放;
5. 分页内 `scopeVersion``generatedAt` 稳定且 `complete=true`
6. 返回客户、部门、负责人、合同/项目、正式交车启用时间和机器可读隔离原因;
7. 草稿交车/还车时间不作为正式授权事实。
配置密钥后先手工执行一次影子同步,核对总数、抽样车辆、拒绝项和内容版本。验证通过前不得安装或启用两分钟同步定时器;失败时必须保持当前投影,不得退化为全量车辆。
## 5. Goal 解除阻塞的验收证据
- 两个实际客户账号分别通过四菜单、车辆集合、授权时间、轨迹、里程和对方 VIN 越权门禁;
- 接入管理中 `JT808 接入方未维护=0``车辆品牌未维护=0`,每次补录可追溯;
- OneOS 正式快照完成手工影子校验并启用定时同步,接口故障演练证明失败关闭;
- 业务负责人完成客户演示并确认首期交付范围。

View File

@@ -292,7 +292,7 @@
已完成准备:
- 演示门禁已随 release `customer-demo-gate-20260716172056` 进入 ECS 不可变发布目录Python 3.6 编译、帮助入口、鉴权健康与三个服务状态烟测通过。
- 生产只读核确认当前只有管理员和 1 个既有客户账号尚无能明确对应秦总、蒲总的两个账号;未修改既有账号和车辆 Scope。
- 2026-07-16 20:04 生产只读核确认当前共 2 个账号:管理员和 1 个既有客户账号;既有客户严格只有四个客户菜单并授权 1 辆车。尚无能明确对应秦总、蒲总的两个账号;未修改既有账号和车辆 Scope。
- 已筛选在线多来源、在线单来源、无位置、离线有位置四类真实演示样本,并验证三台有历史能力的车辆具备当天轨迹和近 7 天里程。
- 新增无明文密码落盘的客户演示门禁,可验证客户角色、严格四菜单、车辆集合、四类样本状态、越权 VIN 阻断、轨迹、里程和四个 SPA 路由;脚本及测试兼容 ECS Python 3.6.8。
- 已形成 `docs/customer-demo-acceptance.md`,记录授权时间边界、建议样本、演示顺序、成功证据和现场问题模板。
@@ -384,9 +384,18 @@
- 生产烟测以 `LB9A32A21R0LS1464` 的既有 `g7s` 识别结果写入同义规范值 `G7s`:策略版本 `v1→v2`,提供方审计包含核验依据,原策略备注保持不变,接入明细立即显示 `JT808 / G7s`,响应中不存在 `sourceKey`。平台、两类告警评估器和对账定时器均为 active。
- Go 全量测试、前端 49 个文件/259 项测试、TypeScript/Vite 生产构建和 23 个当前 Web 资源门禁通过。
权威清单批量落库准备:
- 新增 `deploy/import-source-providers.py`,可从生产按当前资料缺口导出带 VIN、车牌、不可逆 `sourceRef`、脱敏终端和防漂移字段的 UTF-8 CSV 模板。
- 填写后的清单先完成全表只读预检,再通过管理员 API 逐条应用;工具复用当前启停、优先级和策略备注,只修改提供方及独立核验依据,继续使用乐观版本和不可变审计。
- 管理员令牌只从临时环境变量读取,单批最多 500 行;导出拒绝覆盖已有文件,导入拒绝缺依据、重复来源、协议变化、当前提供方变化和失效 `sourceRef`
- Python 自动化覆盖只读预检、成功写入、策略字段保持、缺依据失败、并发前置值漂移失败和缺口模板导出;发布安装器同步携带该工具。
- 生产只读烟测发现缺口车辆当前只有协议融合快照、没有独立终端候选release `canonical-provider-access-fallback-20260716224816` 已为协议级来源生成不可逆 `sourceRef`。管理员可维护权威提供方,但前后端均禁止从融合快照修改终端启停、优先级或策略备注。
- 生产导出与接入管理逐车集合一致:当前生成 101 行/101 辆缺口模板,全部通过真实 CSV 防漂移只读预检;未执行 `--apply`,没有写入任何未经确认的提供方。
剩余业务资料依赖:
- 当前动态复核仍有 104 辆 JT808 提供方缺失。注册报文厂商码在生产中同时对应 G7s、东方北斗和赛格不能唯一映射OneOS 只标记为“氢气智能管理平台”,这是聚合来源而非终端提供方。
- 2026-07-16 22:49 动态复核仍有 101 辆 JT808 提供方缺失。该数量会随实时快照中新增的有效平台名变化;导出工具以执行时的接入管理集合为准。注册报文厂商码在生产中同时对应 G7s、东方北斗和赛格不能唯一映射OneOS 只标记为“氢气智能管理平台”,这是聚合来源而非终端提供方。
- 进一步只读核对 `lingniu_prod` 后确认:旧 `tab_truck_device_info``view_addgpsdata``historical_data` 设备厂家表当前均无有效数据;仅存的 `v_vehicle_daily_stats.source=G7S/TBOX/NONE` 最晚截至 2025-12-08属于历史里程来源不能证明 2026 年当前终端提供方。
- 因此这 104 辆继续留在待处理队列,需 GPS 运维/厂家提供当前 phone/终端到提供方的权威清单。平台不会根据终端号、IP、位置、旧里程来源或厂商码猜测提供方。
- 另有 8 辆 OneOS 车型主数据本身无品牌,需资产资料责任人补录后再通过正式 API 同步。
@@ -450,6 +459,7 @@
- 正式内网 URL、独立服务令牌、HMAC 密钥和允许访问的 ECS 私网源地址;
- 符合契约的全客户完整快照,包含稳定版本、客户/部门/负责人、合同/项目、正式交车启用时间及机器可读隔离原因;
- OneOS 侧完成时间戳窗口、request ID 去重、来源限制和接口监控。取得后先手工影子同步、核对抽样与总数,再启用两分钟定时器。
- 2026-07-16 20:04 ECS 复核确认 `ONEOS_SCOPE_SOURCE``ONEOS_SCOPE_API_URL``ONEOS_SCOPE_API_SERVICE_TOKEN``ONEOS_SCOPE_API_SIGNING_SECRET` 均未配置OneOS 同步 timer unit 未安装;当前保持失败关闭。
目标: