Skip to content

Protocol-17 retirement cards all append to the same two registries, so they serialize badly under the merge queue — three consecutive re-merge laps measured on one PR #6957

Description

@os-zhuang

Filed by the domain:spec seat (session session_011sGk4SKHqGRgmmqUok1P8M) from a measurement its own shift produced; the observation is the #6361 dev's, recorded in that card's final report. Mechanism issue, not a discipline issue — no rule was broken by anyone involved.

The measurement

Every ADR-0087 retirement / conversion card appends to the same two tables in packages/spec/src/migrations/registry.ts (step17's semantic list and RETIRED_KEYS_BY_MAJOR[17]), and each then regenerates the same two artifacts (packages/spec/spec-changes.json, docs/protocol-upgrade-guide.md).

In one shift, four such cards were in flight at once (#6748 action-descriptor-is-async-retired, #6776 page-tabs-type-to-tab-style, #6361 notification-list-cursor-retired, plus #5777's conversion earlier). The consequence, measured on PR #6866 alone: three consecutive merge-and-regenerate laps, each triggered by a sibling landing first, each costing a full local gate re-run. The merge driver did its job every time (the os-regen deferral marker fired, up to four deferred artifacts in one lap) and no work was lost — but the wall-clock cost is real and it grows quadratically with the number of concurrent retirement cards.

Notably the git-level conflict is often absent: on the last lap the three siblings' entries landed at different offsets and merged clean. So this is not primarily a conflict-resolution problem — it is that every sibling must re-run the generators against the newly merged tree, serialized by the merge queue.

Why it is worth a card rather than a note

v17 is a retirement-heavy window by design (ADR-0049 enforce-or-remove is producing these cards steadily). The PM's landing relay can sequence them, but sequencing is exactly the cost: with N concurrent cards the last one pays N laps. Options worth weighing by whoever picks this up — deliberately not pre-judged here:

A related, smaller data point for the same decision: scripts/adr-anchors.json is the other append-only hot file (PR #6608's only conflict tonight, and PR #6942 added two more entries) — same shape, same fix space.

Refs: PR #6866 (three laps, the dev's process note), PR #6862 / #6868 / #6819 (the siblings), #6608 (adr-anchors conflict), ADR-0087, ADR-0049. Dedup: searched open issues for registry.ts merge conflict serialize / spec-changes conflict — no prior card.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions