Type: task Status: resolved Label: ready-for-agent Blocked by: 03, 06 Category: frontend-execution
前端执行票(codex 已认领,实施中)。依赖决策 03/06 与规格 08/10 已收口。实现阶段使用契约 mock/fixture;真实后端联调与阶段收口归票 18。
已完整读取票与 map、时间/业务规格,确认标签 ready-for-agent、上游决策均关闭,无 needs-triage 前置诊断。deck 写入通道在用户切换完全权限后仍报旧 workspace-write 拒绝,使用当前会话文件编辑工具认领本地票成功。已核对消费链:filterOptions → 外壳/地图与监测 store → API → 分布/管理面板与 mock;现有源码仍使用 regionMap、旧机构权属维度和 updatedAt 数据时间,尚未完成实施。
实施进展:已增加未分区筛选与 district 编码/中文映射;地图和监测 API、store、外壳筛选链改为 scope→district 直传;监测三分区和台账/异常设备已读取 createdAt,新增数据时间渲染断言面;管理适配与视图改为 districtIndustry 设施/设备计数,空态判据同步。mock 已迁移至 district/districtFilter 和 createdAt(含对象时间缺失样例),管理计数按片区与行业筛选、总量由行级计数求和;基础档案/概览已接 districtDistribution,相关 API/外壳也接片区筛选。设备详情显式标注采样时间,档案静态行保留。
允许的自查:零依赖 Node 内联领域契约断言已通过(district=0、未分区哨兵、脏值降级、窨井、分区/逐对象 createdAt、未知时间不借响应时间、管理面板不读旧维度);mock 请求过滤断言已通过(0 和 UNASSIGNED 分别命中并正确回显);限定源码的 git diff --check 通过。未进行浏览器走查,因此票继续打开,不声称完整验收完成。
可复跑脚本:时间与片区契约闸门,命令 node .scratch/cockpit-real-data-wayfinding/verify/t15-time-district.mjs,已运行 10/10 通过。包含真实 transport 注入的五个服务×三种片区请求检查(不实际访问后端)、模板数据/采样时间断言;不将此结果冒充浏览器或真实后端联调。管理 mock 的过滤后 totals 已按行级计数求和。
浏览器进展:用户已明确授权本票启动开发服务与浏览器验收。服务以后台任务 pwsh-714 启动,实际 URL 为 http://localhost:8001/#/cockpit。已走查运行监测(分区 createdAt、台账对象 createdAt、异常设备时间缺失显示 —)、未分区筛选回显、切模式保留范围、城南管理计数(供水设施 1/设备 1,未分区为排水设施 1/设备 0),管理面板无旧维度。截图确认管理条目布局可读。发现基础档案 mock 只过滤分布却未同步总量(城南分布 3、总量仍 5),尚未通过最终验收。浏览器会话已关闭。
复验进展:基础档案 mock 已改为同一份筛选后事实集推导所有聚合,城南浏览器复验设施总数=3、分布=3、里程=4.2 一致;窨井筛选下管理信息显示城北·窨井(设施0/设备1),基础档案诚实为空。契约脚本新增统计自洽回归,11/11 通过。截图发现新 createdAt KPI 在窄栏溢出,已加专用小字号/overflow-wrap:anywhere,尚待修复后截图核验。浏览器重载后连续 stale ref,按 browser-skill 恢复规则停止该会话,不冒充复验通过。
最终检查:契约脚本 11/11 通过;限定源码 diff --check 通过;静态搜索未发现运行时代码残留 regionQuery/regionMap/selectedRegion/regionDistribution/旧管理字段,只有历史注释中的「井盖」和退役说明。已完成浏览器证据包括:运行监测 createdAt、台账对象时间、异常设备未知时间「—」、未分区回显、城南管理计数、窨井筛选和基础档案城南总量/分布一致;设备详情采样时间标签已由模板断言覆盖。
最终状态:新会话在正确的 http://localhost:8001/#/cockpit 完成浏览器走查。运行监测面板显示「数据时间」createdAt,台账对象显示逐对象数据时间,异常设备缺失时间显示「—」;监测分布显示城南/城北/太常/未分区并包含窨井。截图确认专用时间 KPI 已在窄栏内换行,无再覆盖相邻读数;管理面板与基础档案此前已完成片区统计走查。设备详情的「采样时间」标签由 11/11 脚本模板断言覆盖。
本票交付物和验收均完成。真实后端联调仍归票 18。全树 diff --check 发现既有 map.md 文件尾空行(非本轮引入),未动无关修改。按 AGENTS.md 不自动运行 build/debug、package scripts 或浏览器走查;未执行项如实记录,不视为通过。
⚠ 后端契约变更通知(来自 执行票 12,2026-10-08):本票的消费侧契约已按决策 06 落地为片区 district,与下方「范围」原文有以下差异,实施时以本条为准:
region 已废止:后端响应中 region / regionDistribution / selectedFilters.region / mapFilter.region 已更名为 district 系列;region 入参不再接受。前端 map.filters.regionMap(配置映射)随之失效,范围筛选改为直接下发片区编码(见第 2 条)。domain/filterOptions.js 的 regionQuery / hasRegionMapping / REGION_MAP_GAP 需相应改造或退役。district(Integer,0城南/1城北/2太常,未分区为 null)+ districtName(String,未分区回字面量「未分区」)。筛选入参:district=0|1|2 按片区、district=UNASSIGNED 只看未分区、不传=不筛;其它值后端回 400。统计保留数字、展示层映射中文(符合决策 06)。organizations、ownershipDistribution、totals.unmaintainedCount 已从 infrastructure/management-information 删除。前端 domain/infrastructurePanels.js 仍在读这三个字段(约第 213–232 行)与 MANAGEMENT_REGION_GAP 文案,需改为消费片区×行业计数(本票范围 4)。mapFilter 新增 districtFilter:取值 NONE(未筛)/ASSIGNED(按片区)/UNASSIGNED(只看未分区)—— 「未筛」与「只看未分区」的 district 编码都是 null,必须靠该字段区分,不要用编码反推。createdAt(create_time 语义)分区级/逐对象字段;空态显示"—/数据时间未知";「数据时间」与「采样时间」两套标签各归其位;METRIC_FRESHNESS_GAP 措辞同步。district 0/1/2 → 城南/城北/太常,未识别 → 未分区;统计保留数字、展示层映射中文;范围筛选/回显统一按片区。ownershipUnit / maintainer / maintainerPhone 保留为静态行,不参与筛选/统计。零依赖逻辑闸门 + 浏览器走查(data-*:数据时间读数、片区筛选含未分区、行业含窨井、管理面板片区×行业计数且无管理单位/权属/责任区域)。