Files
Starlight_Lancher/.agents/skills/oil-frontend/references/scope-and-state-integrity-contract.md

5.0 KiB

数据与操作范围规则

当任务涉及数据集合、查询结果、操作范围、忙碌范围、保存结果或流程连续性时读取;视觉呈现由对应界面规则负责。

先明确范围

实现交互前明确:

范围 必须回答
对象 当前查看或修改哪个业务对象?
数据 使用完整可选集合、当前可见集合还是搜索结果?
操作 本次动作影响单项、选中项、当前集合还是全局?
忙碌 哪个最小区域需要防止重复操作?
提交 修改即时生效、自动保存、统一提交还是临时预览?
结果 成功后更新原对象、导航到哪里、保留什么上下文?

范围无法明确时先提问;无法提问时不猜测全局范围,只按最小可验证范围实施并声明假设。

数据集合完整性

  • 浏览集合可以分页;资源选择器必须获得完整可选集合,或提供覆盖完整集合的服务端搜索。
  • 禁止把浏览页当前分页结果直接当作工作流的全部可选资源。
  • 已选资源暂时不在当前分页或筛选结果中时,仍要保留可识别的当前值。
  • 区分 empty(资源集合本身为空)、filtered-empty(筛选或搜索无结果)和 error(数据加载失败);具体文案仍应说明是筛选还是搜索未匹配,并提供对应恢复动作。
  • 筛选和搜索只改变当前视图,不得悄悄改变已保存的业务关系。

查询视图一致性

远程筛选、搜索、排序或分页触发集合变化时,区分用户刚发出的查询与当前已经展示的已提交查询快照。

  • 列表、结果总数、分页范围和已提交查询必须来自同一次响应,并在同一更新边界内生效。
  • 新查询返回前可以保留旧快照,但触发控件或集合容器必须明确表达 refreshing;不得把旧内容无标记地解释为新查询结果。
  • 查询控件可以立即显示用户刚选择的条件,但必须同时显示 refreshing,直到对应结果提交;否则继续显示旧的已提交条件。
  • 请求失败时保留旧快照和查询上下文,并就近显示失败;不得用 empty 或新查询的 0 覆盖仍然可用的旧结果。
  • 用户连续改变条件时只提交最新查询的结果,过期响应不得覆盖新的查询上下文。

操作与忙碌范围

  • 单项请求只锁定该项及其直接操作,不阻塞无关对象、页面或导航。
  • 局部上传、保存、重试和删除不得复用无法区分对象的全局 busy。
  • 批量操作默认只作用于当前可见选择;存在隐藏选择时,清除隐藏选择或明确显示数量和作用范围。
  • 筛选变化后不得静默操作用户看不见的对象。
  • 并发操作必须分别表达状态,不能让一个请求覆盖另一个请求的结果。
  • 异步结果返回时确认对象和上下文仍匹配,避免旧请求覆盖用户的新选择。

动作真实性

每个可见动作必须对应以下至少一项:

  • 持久化的数据变化;
  • 明确的临时预览;
  • 可观察的任务状态变化;
  • 导航或详情展开;
  • 可观察的本地或平台结果,例如复制到剪贴板、下载、导出或播放;
  • 可恢复的错误处理。

禁止:

  • 展示没有持久化能力的编辑、保存、批准或删除;
  • 自动保存已经生效时继续显示虚假的未保存状态或重复保存按钮;
  • 只修改内存却用已完成文案暗示数据已经保存;
  • 成功后复制第二套对象,导致后续阶段维护不同来源;
  • 用禁用按钮长期占位解释当前状态。

临时预览必须明确其范围;失败时保留用户已经输入的内容和当前位置。

示例与兜底数据

  • 示例、演示和兜底数据必须与真实资源明确区分。
  • 没有真实写入能力时隐藏编辑、删除、发布等写操作。
  • 兜底数据只能保证流程可理解,不能伪造已经成功持久化的状态。
  • 真实数据恢复后,兜底对象不得继续参与选择、统计或批量操作。

流程连续性

  • 对象身份和生命周期未改变时,跨阶段继续更新原对象,不复制成第二套状态源。
  • 动作确实生成独立版本、发布记录或产出资源时可以创建新对象,但必须明确关联来源,不能复制并继续维护同一份状态。
  • 上一步选择和输入自动带入下一步。
  • 关闭详情或编辑器后返回原位置,并显示最新状态。
  • 操作完成后不要求用户重新搜索、重新选择或重复确认同一对象。

检查

  • 选择器的数据是否覆盖全部可选资源?
  • 查询条件、列表、总数和分页是否属于同一个已提交查询快照?
  • 单项请求是否错误锁定了无关区域?
  • 筛选后批量操作是否包含不可见对象?
  • 每个编辑、保存和确认是否真实改变状态?
  • 自动保存和显式保存是否重复?
  • 示例数据是否被误当成真实可写资源?
  • 操作完成后是否继续更新原对象并保留上下文?