You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] os-regen-merge.sh partitions by merge=os-regen ROUTING, not by generatedness — a generated-but-NOT_DRIVER_MANAGED path (migrations/registry.ts) lands in the "NON-generated, resolve by hand" bucket, which the same message forbids #18047
Filed by the epic PM for #15939 (session_015c5G6TmpMKgnusmTpD7Ntt), 2026-09-13T15:30Z, at the maintainer's direction. ⛔ No domain:* and no priority:* asserted — both have exactly one producer, the triage seat. ⚠️ Triage's first touch is owed.
Surfaced live in PR #18016's round; verified here from source and from git check-attr.
Not a duplicate of #14671 — its fix left a third class
#14671 reported this same message misfiring on a MIXEDmerge=os-regen path, and was closed completed by merged PR #14733, "partition os-regen-merge.sh's step-1 conflict message by class". That fix is present and is what the script does today — a three-way partition into regen-only / non-regen-only / both.
⚠️ But #14671's own suggested shape said to "partition the conflicted paths against the merge=os-regen pattern list", and that is what was implemented. The partition key is routing, not generatedness — so the conflation was moved rather than removed, and a third class was never handled.
The mechanism, read from source
scripts/pm/os-regen-merge.sh:355-378:
done<<(git diff --name-only --diff-filter=U)# all_conflictsdone<<(git diff --name-only --diff-filter=U -- "${regen_paths[@]}")# regen_conflicts
…
forcin"${all_conflicts[@]}";docase"$regen_set"in*"$NL$c$NL"*) ;;
*) non_regen_conflicts+=("$c") ;; # ← set difference, nothing asks "is it generated?"esacdoneif [ "${#regen_conflicts[@]}"-eq 0 ];thenecho"✗ merge stopped on conflicts in NON-generated files — resolve those by hand">&2echo" (semantic merge, both intents stack), then rerun this script to redo the">&2echo" generated-artifact half. ⛔ Do not resolve generated files textually.">&2
⇒ non_regen_conflicts is everything not routed to the driver. A generated path that is deliberately unrouted is labelled NON-generated and sent to a hand merge — while the third line of the same message forbids exactly that for generated files. The operator cannot satisfy both sentences, and nothing in the output tells them which one governs.
The path this bites, and the repo's own words for it
packages/spec/src/migrations/registry.ts. .gitattributes:32-34 describes it, unprompted, as exactly the unhandled class:
every conflicting case also conflicts in packages/spec/src/migrations/registry.ts — generated, committed, unsharded, NOT_DRIVER_MANAGED — and every registration touches it by construction.
Measured with git's own attribute resolution, 2026-09-13T15:29Z:
⚠️ Control limit, stated: the dark control returns the same value as the subject, because unspecified is the default for anything unmatched. It is the lit control that carries the reading — it proves routing resolves at all, so the subject's unspecified is a real "not routed" rather than a broken probe.
⇒ registry.ts is generated, is never routed, and "every registration touches it by construction" — so this is not an exotic path. Every ADR-0087 registration round can hit it.
The live instance
PR #18016 (#17785, the last card of the #15939 epic) was dequeued at 15:12:44Z with MERGE_CONFLICT after sibling PR #18007 merged ~193 lines into registry.ts. bash scripts/pm/os-regen-merge.sh exited 1 with the NON-generated … resolve those by hand message naming registry.ts.
The round did not follow it. It took a placeholder side purely to reach a committable state, committed the merge first per AGENTS.md §11, then regenerated and committed that as the discharge, citing check:migration-registry exit 0 as proof that registry.ts == f(entries/). Independently verified afterwards: the sibling's six registrations all survive at their pre-merge counts (2 / 2 / 6 / 6 / 2 / 14, lit controls 10 and 4, dark control 0).
⇒ the correct resolution was reached against the script's instruction, by an operator who knew the file was generated. One who trusted the message would have hand-merged a generated file — and .gitattributes:36 exists because that silently drops rows.
Suggested shape
Partition by generatedness, with routing as a sub-distinction, and print three cases rather than two:
generated + NOT routed (NOT_DRIVER_MANAGED) → "resolve by REGENERATION, never textually: take either side to reach a committable state, commit the merge, then run the generator and commit that. ⛔ Do not hand-merge."
The generated-but-unrouted set is already declared — .gitattributes names registry.ts in prose. Whether to make that machine-readable (a NOT_DRIVER_MANAGED marker the script can read, rather than prose) is the design call; ⛔ this seat is not making it.
⚠️ The script's --self-test already builds synthetic repos and asserts on printed notices, so class 3 is pinnable there — and #14671's fix was pinned the same way, which is why this limb needs its own fixture rather than trusting the existing ones.
Filed by the epic PM for #15939 (⚠️ Triage's first touch is owed.
session_015c5G6TmpMKgnusmTpD7Ntt), 2026-09-13T15:30Z, at the maintainer's direction. ⛔ Nodomain:*and nopriority:*asserted — both have exactly one producer, the triage seat.Surfaced live in PR #18016's round; verified here from source and from
git check-attr.Not a duplicate of #14671 — its fix left a third class
#14671 reported this same message misfiring on a MIXED
merge=os-regenpath, and was closedcompletedby merged PR #14733, "partition os-regen-merge.sh's step-1 conflict message by class". That fix is present and is what the script does today — a three-way partition into regen-only / non-regen-only / both.merge=os-regenpattern list", and that is what was implemented. The partition key is routing, not generatedness — so the conflation was moved rather than removed, and a third class was never handled.The mechanism, read from source
scripts/pm/os-regen-merge.sh:355-378:⇒
non_regen_conflictsis everything not routed to the driver. A generated path that is deliberately unrouted is labelledNON-generatedand sent to a hand merge — while the third line of the same message forbids exactly that for generated files. The operator cannot satisfy both sentences, and nothing in the output tells them which one governs.The path this bites, and the repo's own words for it
packages/spec/src/migrations/registry.ts..gitattributes:32-34describes it, unprompted, as exactly the unhandled class:Measured with git's own attribute resolution, 2026-09-13T15:29Z:
git check-attr mergepackages/spec/src/migrations/registry.tsunspecified← generated, not routedpackages/spec/authorable-surface/system.json(lit control)os-regenunspecifiedunspecifiedis the default for anything unmatched. It is the lit control that carries the reading — it proves routing resolves at all, so the subject'sunspecifiedis a real "not routed" rather than a broken probe.⇒
registry.tsis generated, is never routed, and "every registration touches it by construction" — so this is not an exotic path. Every ADR-0087 registration round can hit it.The live instance
PR #18016 (#17785, the last card of the #15939 epic) was dequeued at 15:12:44Z with
MERGE_CONFLICTafter sibling PR #18007 merged ~193 lines intoregistry.ts.bash scripts/pm/os-regen-merge.shexited 1 with theNON-generated … resolve those by handmessage namingregistry.ts.The round did not follow it. It took a placeholder side purely to reach a committable state, committed the merge first per AGENTS.md §11, then regenerated and committed that as the discharge, citing
check:migration-registryexit 0 as proof thatregistry.ts == f(entries/). Independently verified afterwards: the sibling's six registrations all survive at their pre-merge counts (2 / 2 / 6 / 6 / 2 / 14, lit controls 10 and 4, dark control 0).⇒ the correct resolution was reached against the script's instruction, by an operator who knew the file was generated. One who trusted the message would have hand-merged a generated file — and
.gitattributes:36exists because that silently drops rows.Suggested shape
Partition by generatedness, with routing as a sub-distinction, and print three cases rather than two:
NOT_DRIVER_MANAGED) → "resolve by REGENERATION, never textually: take either side to reach a committable state, commit the merge, then run the generator and commit that. ⛔ Do not hand-merge."The generated-but-unrouted set is already declared —
.gitattributesnamesregistry.tsin prose. Whether to make that machine-readable (aNOT_DRIVER_MANAGEDmarker the script can read, rather than prose) is the design call; ⛔ this seat is not making it.--self-testalready builds synthetic repos and asserts on printed notices, so class 3 is pinnable there — and #14671's fix was pinned the same way, which is why this limb needs its own fixture rather than trusting the existing ones.Dedupe
search_issues⇒ 16 results. Directly relevant:migrations/registry.tsstill text-merges: two ADR-0087 entries with adjacent ids conflict server-side, which is the residue #7297's source sharding could not reach #8360 (open) — "migrations/registry.tsstill text-merges", the underlying condition that makes this reachable. Adjacent, not the same defect:migrations/registry.tsstill text-merges: two ADR-0087 entries with adjacent ids conflict server-side, which is the residue #7297's source sharding could not reach #8360 is about the file conflicting at all; this is about what the script tells you when it does. Whoever takesmigrations/registry.tsstill text-merges: two ADR-0087 entries with adjacent ids conflict server-side, which is the residue #7297's source sharding could not reach #8360 may make this moot.merge=os-regendriver exited 0 on a live merge while DISCARDING main's side ofcontent/docs/references/ui/view.mdx— caught and repaired in-round, but a zero exit from that driver is not evidence the merge happened #17602 (open) — the driver exiting 0 while discarding one side. Same family of "a zero from this tooling is not evidence", different limb.merge=os-regencannot be wired for a root-owned generated artifact —git-merge-regenresolvesgen:/check:names inpackages/speconly #13585, [finding]skills/**/references/_index.mdis generator-owned but not routed tomerge=os-regen— two branches that regenerate it text-merge instead #13335 (closed) — othermerge=os-regenrouting defects.Refs:
scripts/pm/os-regen-merge.sh:355-378·.gitattributes:32-34,:140-157· #14671 / PR #14733 · #8360 · #17602 · PR #18016 (the live instance) · #15939