Skip to content

finding: area-level fixtures recipes carry no revision/history, so a semantic recipe edit silently re-validates every run record that depends on it #10885

Closed as not planned

Description

@os-zhuang

Observation from the #10809 work (PR #10883). Filed unassigned; recording the gap, not claiming the work.

The asymmetry

The checklist's change lifecycle (docs/qa/platform-checklist/README.md) pins semantic edits to a revision:

Change — edit the fields, bump revision, append a history entry saying what changed and why. The revision matters because run records pin the revision they ran against: a semantic edit silently re-validating old results is exactly what the validator's revision/history check exists to stop.

That mechanism is item-scoped only. scripts/check-platform-checklist.mjs enforces revision/history inside its per-item loop, and none of the four area-level recipes in the tree carries either field:

area file recipe has revision has history
areas/attachments-storage.json qa-scratch-authz no no
areas/attachments-storage.json qa-media-constraints no no
areas/automation.json qa-flow-status-doors no no
areas/search.json qa-contributor-bound-member no no

Why that matters

A recipe is executable content — sequence steps with expected responses, a premise guard, a teardown. Editing step 4's expect (say, the premise guard that distinguishes "403 = binding did not take" from "12 rows = a VAMA set") changes what a run of every consuming item actually proves. Six items currently carry a provisioning.use. Today that edit lands with no revision anywhere to pin it, so a run record from before the edit and one from after are indistinguishable — the precise failure the item-level mechanism exists to prevent, reachable through a door it does not cover.

The exposure scales with reuse, which is the direction the convention is moving: recipes exist because several items share one call sequence.

Worked instance

PR #10883 had to correct a stale clause on qa-contributor-bound-member's knownGaps. There was no recipe revision to bump, so the correction was pinned by bumping search.rls-both-personas (the item that uses the recipe) to revision 5 — an item whose own fields did not change. Its history entry says so explicitly. That workaround is legible for one consumer; it does not generalize, and it is silently wrong for records-forms.crud-roundtrip, which consumes the same recipe by prose cross-reference and has no use edge to notice.

Adjacent to #10593, not inside it

#10593's two gaps are about the reference spelling — resolving a use (landed) and how cross-area reuse should be spelled (open). This is a third, independent axis: how a recipe's own content is versioned. Worth noting the interaction, though: if the answer to that open question relocates recipes into a shared areas/_fixtures.json, the versioning question changes shape with it, so sequencing this after that ruling may be cheaper.

Options worth weighing (not a recommendation)

  1. Give recipes their own revision/history and extend the item-scoped check to cover them.
  2. Require every consuming item to re-pin when a recipe changes — mechanical, but it multiplies edits and cannot reach prose-only consumers.
  3. Rule that recipes are immutable once referenced: a semantic change means a new recipe key, with the old one retired in place.

Not urgent

Nothing is known to be wrong in the current run records. The cost is that the guarantee the revision mechanism advertises does not extend to recipe content, and the recipe surface is growing.

Activity

  1. huangyiirene commented on Aug 21, 2026

    @huangyiirene
    Collaborator

    Triage (first-touch grading, 2026-08-21): finding → pm:on-hold, type Task. Reason: this is a third axis of the recipe convention whose revisit is already sitting in the maintainer's decision inbox as #10593 (cross-area reuse spelling), and the card itself notes that if that ruling relocates recipes into a shared areas/_fixtures.json, the versioning question changes shape with it — deciding recipe content-versioning before the convention's home is ruled risks building on a moved floor. The three options here (recipe-own revision / consumer re-pin / immutable-once-referenced) diverge enough that they should ride the same discussion, not a second decision card. Source: seat-graded sequencing hold; the card's own "sequencing this after that ruling may be cheaper" clause.

    Restart-when: closed #10593

    On restart: re-read #10593's ruling first; pick the option compatible with it (or close this as absorbed if the ruling covers recipe versioning directly), then queue as devx tooling work extending scripts/check-platform-checklist.mjs.


    Generated by Claude Code

  2. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    关 not_planned —— 维护者逐张复核 on-hold 卡时同意关闭;纯开发工具卡

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ),2026-09-23T09:17Z。维护者 2026-09-23 在分诊会话里逐张复核 pm:on-hold 卡,对第五组的回复原文:「10164 不考虑旧的;11182 当前版本就优先处理,统一为cel;其他同意」。 本卡在那一组里的建议是关闭。

    呈给维护者的事实

    卡面的测量和设计笔记原样保留;重开是免费的。

    关闭理由:not_planned,同时摘掉 pm:on-hold。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions