# 执行-批次1:品牌/图标替换 Type: execution Status: ready-for-agent Label: ready-for-agent Blocked by: None Category: execution **What to build:** 把驾驶舱 6 个内联 SVG 占位图标(`brand` / `layers` / `points` / `event` / `resource` / `blank`)替换为正式素材,经统一资产解析层按语义 key 消费;全部素材在 manifest 登记并通过校验。图标注册表与渲染组件的接缝不变——只换素材来源,不改引用点。 ## 引用规格(单一决策事实来源) - [规格 09:运行时资产 manifest 与版本策略](09-runtime-asset-manifest-spec.md)——素材入库、hash、fallback、语义 key。 - [规格 03:正式视觉系统与现有 token 映射](../specs/03-visual-token-mapping.md)——ICONS 接缝与 token 规则。 - [规格 12:设计稿差异判断表](12-design-diff-structure-boundary-spec.md)——进入自查用。 ## 进入自查(开工前逐项确认,记录进本票证据区) - [x] 本批素材已入 manifest 且通过校验(存在、hash、fallback 齐全)。 - 事实修正:蓝湖正式导出包不在仓库(票 02 结论:无已确认可直接运行时资源),故六枚图标为**原内联几何原样迁移的临时 SVG**,`status: temporary`、真实 sha256、`fallbackKey: null`(图标无跨语义回退,加载失败渲染为空);`validateManifest()` 模块加载期校验通过(schema/唯一性/路径安全/hash 格式/fallback 引用)。 - [x] 差异判断表自查:本批涉及的差异逐项分类(结构项暂停并升新票;视觉项放行)。 - 七类逐项对照:仅「视觉资产」类命中(图标资源来源由内联改为 manifest 登记文件);布局尺寸、信息层级、组件状态、地图/设备语义、数据契约、交互行为均未触碰 → 全部归视觉放行,无结构项。 - [ ] 既有结构断言面全绿(四模式 / 16 `panelId` / 状态词表冻结)。 - 未运行:按 `AGENTS.md`,本会话未获明确要求,不运行 build/dev/test。静态核对:本次改动只涉及 `icons.js` / `runtimeAssets.js` / `CockpitIcon.vue` / `public/cockpit/**`,未触碰 `panelCatalog.js`、状态词表、模式与面板结构。 - [x] 若统一资产解析层尚未实现,先按规格 09 实现最小可用子集(manifest 校验 + 语义 key 解析),再进入本批素材替换。 - 已实现:`domain/runtimeAssets.js`(manifest 校验 + 语义 key 解析 + BASE_URL 兼容)。最小子集边界:manifest 随包内置(构建期固化),运行时远程拉取/短缓存/整包回滚留待规格 09 完整实现,对外 `resolveAsset(key)` 语义不变。 ## 验收清单 **实现者自测(纯逻辑 + 静态检查):** - [x] 图标注册表六键齐全,全部经语义 key 解析,组件与地图服务中无散落物理路径。 - `ICON_SPECS` 六键 → `icon.*` 语义 key → `resolveAsset()`;全仓 grep `cockpit/assets` 仅命中 `domain/runtimeAssets.js`(manifest 导入)一处。 - [x] 未知图标渲染为空不抛错(既有不变量保持)。 - `iconFor()` 未知名/无 URL 返回 `null` → `CockpitIcon` `v-if` 不渲染;不变量改为组件模板条件渲染承载。 - [x] manifest 条目字段齐全:语义 key、来源、hash、fallback、状态(正式/临时)。 - 六条目含 `key/path/source/format/dimensions/transparent/density/version/hash(sha256 实测)/status(temporary)/appliesTo/fallbackKey/core`;`fallbackKey: null` 为显式无回退(图标失败渲染为空,不跨语义借用,符合规格 09 语义边界)。 - [x] 资源引用走查:全部图标有消费点,无死资源。 - `brand`→CockpitShell 顶栏;`layers/points/event/resource`→MapCanvas `LAYERS`;`points`→MapCoordinateBlocked;`blank`→PanelPlaceholder。 - [ ] 结构回归全绿(四模式 / 16 面板 / 图例与标记一致)。 - 未运行(`AGENTS.md`:未经明确要求不运行 build/dev/test)。需维护者放行验证命令或人工走查时补。 **维护者走查(真实 `/cockpit`):** - [ ] 品牌位与五个功能图标视觉符合设计稿(或偏差已登记)。 - [ ] 走查单逐项勾选 + 截图。 **缺口登记:** - [x] 本批归视觉偏差已在签收前写入[票 06 缺口清单](06-font-and-fallback-policy.md)(语义 key、缺口类型、回退结果、责任人)。 - 已在票 06 新建「缺口清单」表并登记 6 条;**票 19 盘点后已修正分类**:六条从「正式素材未交付」改记为「设计稿未覆盖」(品牌位无 logo 图形、四个功能图标在稿中为纯文字 chip),处置为按规格 12 维持现状并标记无设计稿依据。 ## 证据区(完成后填写) - 走查单路径:未走查(维护者真实 `/cockpit` 走查待做;本会话按 `AGENTS.md` 未运行 dev/浏览器)。 - 截图路径:无(同上)。 - `data-*` 读数:未实测;观察接缝已落地——`CockpitIcon` 输出 `data-icon-name` / `data-asset-status`(当前应读作六处 `temporary`),manifest 级读数可经 `manifestStatus()` 取得。 - 已登记缺口数:6(票 06 缺口清单)。 - 维护者签收:未签收。 ## 真实状态与下一步 - **已完成**:① 规格 09 最小可用子集——`domain/runtimeAssets.js`(manifest 校验:schema/字段齐全/语义 key 唯一/路径安全/hash 格式/fallback 引用;语义 key 解析经 `import.meta.env.BASE_URL` 拼 URL,兼容相对 publicPath 与 qiankun 注入);② 六枚图标由原内联几何**原样迁移**为 `public/cockpit/assets/icons/*.svg`(零视觉增量,不虚构设计),manifest 登记为 `temporary` 并附真实 sha256;③ `CockpitIcon` 改 CSS mask 渲染(颜色仍由 currentColor 控制,与原视觉一致),引用点 `name`/`size` 接缝不变。 - **盘点结论(票 19,2026-10)**:蓝湖 9 个画板中**不存在**这六个图标的正式素材——品牌位是渐变文字无 logo 图形、四个功能图标在稿中为纯文字 chip、空面板占位图示无对应物。因此本批**不再等待"正式素材替换"**;按规格 12 处置为「设计稿未覆盖的现有 UI 维持现状 + 标记无设计稿依据」,缺口分类已在票 06 修正。 - **未完成**:结构断言面与结构回归未运行(`AGENTS.md`:未经明确要求不运行 build/dev/test);维护者走查与签收未做。 - **下一步**:① 维护者在真实 `/cockpit` 走查并签收(当前视觉即设计稿未覆盖的占位几何,走查结论应记为「无设计稿依据、维持现状」);② 维护者明确要求后运行结构断言面/回归;③ 若维护者希望品牌位出现 logo 或 chip 出现图标,属**新增设计需求**,需设计方确认后另立决策票,不在本票内实现。 - 本票**不关闭**:验收清单中「结构回归」「维护者走查」两项未完成。 ## Out of Scope - token 色值替换(批次 2)、位置符号(批次 3)、字体(批次 4)、装饰(批次 5)。 - 结构变更(面板/状态语义/交互契约)——按判断表升级路径另立票。 - 按 `AGENTS.md`,实施时未经用户明确要求不运行 build/dev。