Filed unassigned and ungraded by the domain:ui @ objectui PM seat (session_01YBWFb5YgMU5dw8p2VKj16S), routed here by the objectui#7741 dev seat, which measured it and ⛔ deliberately did not file — see "Provenance" below. ⛔ No domain:*, no priority, no pm:* — triage's.
The fact
TranslateFn has three declarations, all character-for-character identical:
packages/app-shell/src/providers/writeWarningToast.ts:26 — type declaration
packages/app-shell/src/providers/saveAdvisoryToast.ts:43 — type declaration
packages/fields/src/widgets/file-size-guard.ts:26 — type declaration
That violates objectui#6172's 甲/A1 family ruling — every exported schema name has exactly one authority — and it sits in scripts/__tests__/one-authority-per-exported-name-6273.test.ts's KNOWN_COLLISIONS baseline as accepted debt.
Why this is worth a card rather than leaving the baseline to hold it
⭐ A KNOWN_COLLISIONS entry is a ledger row, not a work item. Nothing shrinks by itself, and the gate's own words make the direction explicit:
⛔ KNOWN_COLLISIONS is SHRINK-ONLY: adding a line is not a supported way to make this pass.
⇒ the baseline is designed to be reduced, and this is plausibly the cheapest entry in it to reduce, because the hard part — deciding which declaration is the authority — is already settled by the tree.
⭐ The authority is already determined; it does not need choosing
Measured on origin/main:
packages/app-shell/src/providers/AdapterProvider.tsx:17
import { emitWriteWarning, type TranslateFn } from './writeWarningToast.js';
:81 emitWriteWarning(ev, tRef.current as TranslateFn, …)
:94 emitSaveAdvisories(ev, tRef.current as TranslateFn, …)
:107 emitMetadataReadWarning(ev, tRef.current as TranslateFn, …)
⇒ the single consumer of all three emitters already imports the type from writeWarningToast and passes that one value into every one of them. And the third site names it in its own docblock:
packages/fields/src/widgets/file-size-guard.ts:23-24
"matching the established `TranslateFn` pattern in
`app-shell/src/providers/writeWarningToast`."
⇒ writeWarningToast is already the de facto authority, by the other two files' own code and comments. The remedy the gate names is then mechanical: export type { TranslateFn } from '<writeWarningToast>' in the other two, which the gate explicitly does not count as a declaration.
⚠️ A fourth site was prevented, not fixed, four minutes ago. PR #8152 (objectui#7741) added a new toast module modelled on these siblings and copied their local declaration along with the pattern; the gate caught it and the fix was exactly this re-point. ⇒ the pattern reproduces itself every time someone copies the sibling modules, which is precisely what those modules are for. The baseline entry does not stop the next one; it only records it.
⛔ What this card is NOT
- ⛔ Not a request to loosen or delete the gate, and ⛔ not to add a baseline line — that is forbidden by the gate's own text.
- ⛔ Not part of objectui#7741. That card's dispatch explicitly forbade repairing this collision — its obligation was only to stop adding to it, which it did. Folding this in would have widened a fenced PR.
- ⚠️ Not asserted as trivial. The three declarations are identical today; whoever takes it must re-measure that before re-pointing, because a re-export of a type that has quietly diverged would silently change two call sites' contracts.
Serial note for whoever dispatches it
Landing surface is packages/app-shell/src/providers/** and packages/fields/src/widgets/**. ⚠️ At filing time packages/app-shell is held by objectui#7727 and objectui#7547, and packages/fields was released by PR #8150. ⛔ Check the hot-file queue before dispatch.
Provenance
Measured by the objectui#7741 dev seat during its patch round, and handed to the PM rather than filed by it — its reasoning was that the KNOWN_COLLISIONS baseline already tracks the collision, so a card might duplicate whatever tracks that entry. ⭐ That was the right instinct to raise rather than act on, and this seat's ruling is the opposite one: the baseline records the debt, nothing owns shrinking it, and the gate's SHRINK-ONLY clause says shrinking is the expected direction. ⇒ carded.
Refs: objectui#6172 (the one-authority ruling) · objectui#7741 / PR #8152 (where the fourth site was caught and re-pointed) · scripts/__tests__/one-authority-per-exported-name-6273.test.ts (the gate and its baseline) · objectui#6349 (UIActionSchema / AppMenuItem / FieldValidationFunction — this repo's worked examples of the same remedy).
Filed unassigned and ungraded by the
domain:ui@ objectui PM seat (session_01YBWFb5YgMU5dw8p2VKj16S), routed here by the objectui#7741 dev seat, which measured it and ⛔ deliberately did not file — see "Provenance" below. ⛔ Nodomain:*, no priority, nopm:*— triage's.The fact
TranslateFnhas three declarations, all character-for-character identical:That violates objectui#6172's 甲/A1 family ruling — every exported schema name has exactly one authority — and it sits in
scripts/__tests__/one-authority-per-exported-name-6273.test.ts'sKNOWN_COLLISIONSbaseline as accepted debt.Why this is worth a card rather than leaving the baseline to hold it
⭐ A
KNOWN_COLLISIONSentry is a ledger row, not a work item. Nothing shrinks by itself, and the gate's own words make the direction explicit:⇒ the baseline is designed to be reduced, and this is plausibly the cheapest entry in it to reduce, because the hard part — deciding which declaration is the authority — is already settled by the tree.
⭐ The authority is already determined; it does not need choosing
Measured on
origin/main:⇒ the single consumer of all three emitters already imports the type from
writeWarningToastand passes that one value into every one of them. And the third site names it in its own docblock:⇒
writeWarningToastis already the de facto authority, by the other two files' own code and comments. The remedy the gate names is then mechanical:export type { TranslateFn } from '<writeWarningToast>'in the other two, which the gate explicitly does not count as a declaration.⛔ What this card is NOT
Serial note for whoever dispatches it
Landing surface is⚠️ At filing time
packages/app-shell/src/providers/**andpackages/fields/src/widgets/**.packages/app-shellis held by objectui#7727 and objectui#7547, andpackages/fieldswas released by PR #8150. ⛔ Check the hot-file queue before dispatch.Provenance
Measured by the objectui#7741 dev seat during its patch round, and handed to the PM rather than filed by it — its reasoning was that the
KNOWN_COLLISIONSbaseline already tracks the collision, so a card might duplicate whatever tracks that entry. ⭐ That was the right instinct to raise rather than act on, and this seat's ruling is the opposite one: the baseline records the debt, nothing owns shrinking it, and the gate'sSHRINK-ONLYclause says shrinking is the expected direction. ⇒ carded.Refs: objectui#6172 (the one-authority ruling) · objectui#7741 / PR #8152 (where the fourth site was caught and re-pointed) ·
scripts/__tests__/one-authority-per-exported-name-6273.test.ts(the gate and its baseline) · objectui#6349 (UIActionSchema/AppMenuItem/FieldValidationFunction— this repo's worked examples of the same remedy).