跳转至

解释应用从其他字段推导出的值

Issue:https://github.com/morluto/rea/issues/4933

结果

在五个应用中的三个里,由提示词构建的代理拒绝了一些 create 操作;每次都是因为某个值写入模型无法解释,而应用本身却确定性地推导出了该值:

  • Linkding 的 web_archive_snapshot_url 为 https://web.archive.org/web/<creation time as YYYYMMDDhhmmss>/<sent url>。 计划将其视为常量,从而把 url 固定到了已记录的值上,因此之后使用另一个 URL 的 create 被拒绝。
  • Grafana 的 folder url 为 /dashboards/f/<uid>/<slug of the title>,同样以相同方式固定了 uid;其数值型 id 是一个大的基于时间的整数,计划从第一次 create 中复制而来,第二次 create 的回读结果与之矛盾。
  • Homebox 使用 Go 编写,其纳秒时钟在表示时会去掉末尾的小数零(…34.38812218Z),因此后来一次 create 的时钟没有遵循从第一次 create 学到的格式。

行为

  • 组合字符串。 某个没有其他规则解释的已创建字段可以是一个 composed 字符串:由字面文本和从其他规则写入的字段中读取的部分组成,每个部分可以是某个字段的值、其 slug,或时钟的日历数字(YYYYMMDDhhmmss、 YYYYMMDD、YYYY-MM-DD、YYYY/MM/DD,按时钟所在时区)。这些部分从左到右识别,最长的优先,以非字母数字字符作为分隔符;生成的值可以很短,其他值需要八个字符,正如复制所做的那样。一次 create 只有在至少一个同类型的其他实体用相同的部分拼出该字符串、且没有任何实体以其他方式拼出它时,才组合该字符串;并且绝不在一个文本来自服务端能够区分的两个来源时组合(当写入时间戳的两个时钟表示相同 zone 时,它们属于同一来源);也绝不在另一个实体将该字段持有为不同于这些部分所拼出的内容时组合,包括非字符串值。一次 update 的未发送变更可以由它已存为 sent 的成员和它保持原样的字段组合而成,前提是相同的部分在调用前也能拼出该值,并且没有其他实体以其他方式拼出它。服务端在应用所有其他规则后,从已写入的字段重建该字符串;当某个部分所依赖的字段没有可拼出的内容时,拒绝该调用;组合字段不再固定它所读取的成员。在较晚调用中学到的组合规则会与每一次较早调用核对;如果较晚的 create 在其响应中以其他方式表示某个组合字段,则该 create 被拒绝。
  • 裁剪时钟。 一种时钟格式可以是 trimmed:其值之间的差别仅在于显示的小数位数,且没有任何值的小数部分以零结尾。该格式从类型所持有的字段值、后来的 create 以及后来的 update 中学习;计划盖上的其他时钟也采用这种表示。一旦某个被持有的实体、样例或计划接受的任何调用以固定宽度显示该字段,就没有任何时钟再采用该格式;之后较晚的调用若显示得更短,则被拒绝。fraction 是最多显示的小数位数,服务端会丢弃末尾的零以及随之的小数点。
  • 生成的整数。 一个由 create 创建、10 到 20 位、且类型中没有实体持有的整数,如果每个被持有的实体都持有一个相同长度和 JSON 种类且互不相同的整数,并且没有一个是时钟,则该整数是 unique。服务端会抽取一个该长度和种类的种子整数,且该整数不被任何已持有实体拥有。如果创建实体的另一个字段也持有该整数(作为值、任意深度的数字,或嵌套字符串中以分隔符分隔的部分),则该整数不是 unique,create 会以 unexplained-change 为由被拒绝,因为种子生成无法保持两者相等。当另一个字符串持有其数字,且没有 template 或 composed 规则从该整数重建该字符串时,create 也会被拒绝;或者当较晚的 create 以该长度和种类之外的任何内容响应此字段时,同样被拒绝。Compare 在 unique 规则下将两个这种相同 JSON 种类和长度的整数视为生成值。

不需要这些机制的计划保持不变。

较晚的 create 必须保留样例(exemplar)的唯一值族系(UUID、具有相同位数和 JSON 种类的整数,或不透明令牌)。它们记录的组合字段必须等于计划重建出的值;模拟不能先用矛盾的捕获值进行替换,然后把这次替换算作确认。

验收

  • 由提示词构建的 Linkding、Homebox 和 Grafana 捕获记录能够放行它们此前拒绝的 create 和 rename,并且使用这些记录的写入任务通过。
  • 在 50 个已发布捕获记录或更早的由提示词构建的捕获记录中,没有任何写入工具从放行变为拒绝。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 rea2/rea