Skip to content

finding(app-shell,fields): TranslateFn is declared three times, character-for-character identical — the cheapest available shrink of the one-authority KNOWN_COLLISIONS baseline #8165

Description

@os-justin

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).

Activity

  1. self-assigned this
    on Sep 7, 2026
  2. os-justin commented on Sep 7, 2026

    @os-justin
    CollaboratorAuthor

    Claim: session session_01YBWFb5YgMU5dw8p2VKj16S · branch claude/issue-8165-translatefn-one-authority

    PM dispatch (objectui PM loop). Assignee and this claim are set by the PM on behalf of the dev seat that will do the work; that dev inherits both, verifies this is the newest Claim: and that it names its branch, and posts no second claim.

    Hot-file check performed before dispatch, since the card asked for it. The landing surface is clear:

    in flight / held region collides?
    #7772 views/metadata-admin/previews/block-config.ts + i18n.ts no
    #8181 views/studio-design/**, metadata-admin panels no
    #8164 (held) views/metadata-admin/ConditionalFormattingEditor.tsx no
    #8188 (in CI) views/ObjectView.tsx, InterfaceListPage.tsx, ObjectDataPage.tsx no

    providers/** is unheld. The card's note that packages/app-shell was held by #7727 and #7547 is stale — both have since returned.

    ⚠️ One fence I am adding: within packages/fields, this card touches only src/widgets/file-size-guard.ts. Card #8194 covers four other widgets in that same directory and may be dispatched alongside; ⛔ do not touch DateField, GridField, FormulaField or lookupColumnDisplay.

    ⭐ The card's own caution is the one that matters and is repeated in the dispatch: the three declarations are identical today, and that must be re-measured before re-pointing. A re-export of a type that has quietly diverged would silently change two call sites' contracts — and would do so without any gate noticing, since the gate counts declarations, not shapes.


    Generated by Claude Code

  3. os-justin commented on Sep 7, 2026

    @os-justin
    CollaboratorAuthor

    os-dev-report

    {
      "issue": 8165,
      "status": "needs_decision",
      "branch": "claude/issue-8165-translatefn-one-authority",
      "pr": "https://github.com/objectstack-ai/objectui/pull/8205",
      "premise_still_valid": false,
      "summary": "The card's FACTUAL premise holds and was re-measured first, as Zone 2 demanded: all three TranslateFn declarations are byte-identical on 158d75bb3 — sha256 29f2f334f47b8ac55bd05fc5dcf7f0d769c303f0e2deb1c79aff6a9cd46e3762 for all three, 86 bytes each, identical od -c dumps — so nothing had drifted and the re-point is contract-safe. Its REMEDY premise is falsified for one of the two sites: the card prescribed `export type { TranslateFn } from writeWarningToast` for BOTH others, but packages/app-shell DEPENDS ON packages/fields (app-shell package.json dependencies; packages/fields has zero real imports of @object-ui/app-shell), so pointing fields at app-shell is a package cycle — and TranslateFn is on neither package's published face, so there would be nothing to import either. Landed the half that is legal: saveAdvisoryToast.ts now re-exports from writeWarningToast.ts, and the KNOWN_COLLISIONS entry SHRANK from three sites to two (no line added; the entry does NOT disappear, contrary to the card's Zone 2 item 3 expectation, and Ablation Leg B proves the shrink was owed rather than optional). The third site needs a decision nobody has made — see open_questions. Draft PR #8205; not flipped ready, not merged. Clause 2 answered by measurement, not assumption: NOT published, so no needs:contract-review — app-shell/src/index.ts has 83 export statements and ZERO `export *` anywhere in the file plus no literal TranslateFn; packages/fields has no src/index.ts at all (the dispatch's path was stale) — its entry is src/index.tsx, which stars 50 widget modules but NOT ./widgets/file-size-guard.js, and none of FileField/ImageField/LocationField re-exports the name; decisively, the built packages/fields/dist/index.d.ts carries 0 occurrences of TranslateFn against a control (FileField) at 2. Zone 2 item 1 verified by reading the gate rather than assuming: its header states that `export type { X } from './x'` is a deliberate re-export and NOT an authority, and its DECLARATION regex requires a trailing identifier so a clause opening with a brace cannot match. Zone 3 fences held: only file-size-guard.ts was read in packages/fields (and it was not modified), no other KNOWN_COLLISIONS entry was touched, the gate was neither deleted nor loosened, and no baseline line was added. Claim inherited, not re-posted: the newest and only Claim comment names session_01YBWFb5YgMU5dw8p2VKj16S and branch claude/issue-8165-translatefn-one-authority; assignee never written.",
      "tests": "CHANNEL NOTE: repo-scoped REST probe returned HTTP 403 for this seat, so card body came from the zero-quota page-payload channel and the claim comment (a claim-bearing read) from MCP. All heavy runs via scripts/pm/os-verify-lock.sh on the shared box; verdicts quoted from its own VERDICT lines, never a bare $?. (1) GATE BEFORE, on unmodified 158d75bb3: `pnpm exec vitest run scripts/__tests__/one-authority-per-exported-name-6273.test.ts` — Test Files 1 passed (1), Tests 11 passed (11), VERDICT command-exit 0. (2) GATE AFTER, same command on the branch — Test Files 1 passed (1), Tests 11 passed (11), VERDICT command-exit 0. (3) DEPENDENCY CLOSURE FIRST: `pnpm exec turbo run build --filter=@object-ui/app-shell^... --concurrency=2` — 28 successful, 28 total. Skipping it produced a wall of unrelated TS2307 'Cannot find module @object-ui/*' that reads exactly like a broken import; that first reading is discarded, not reported as a failure. (4) TYPE-CHECK: `pnpm --filter @object-ui/app-shell type-check` (spelled with the hyphen; runs `tsc --noEmit && tsc -p tsconfig.test.json`, so test files are covered) — VERDICT command-exit 0, zero `error TS` lines. (5) TARGETED TESTS: `pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/providers/ packages/app-shell/src/services/MetadataService.saveAdvisories.test.ts scripts/__tests__/one-authority-per-exported-name-6273.test.ts` — Test Files 20 passed (20), Tests 153 passed (153). (6) node scripts/check-changeset-presence.mjs — exit 0, 'Every one of them has an EMPTY frontmatter — declared as releasing nothing, which is the explicit exemption and a complete answer to this gate.' (7) node scripts/check-control-bytes.mjs — exit 0, 6534 tracked text files; plus a targeted grep -naP over the three changed files, zero control bytes. (8) node scripts/check-governed-queue-guard.mjs --test on the three paths — exit 0, 'NOT GOVERNED — 3 path(s) checked against 5 governed surface(s); none matched'. (9) eslint --no-inline-config --format json on the two changed source files — 2 files linted, 0 errors, 0 warnings. ABLATION, run at aa1114558 after committing the fix, both legs with `trap ... EXIT INT TERM` and absolute paths, no build/dist involved because the gate reads source from disk via git ls-files + readFileSync: LEG A re-added a local declaration in saveAdvisoryToast.ts — mutation proven on disk by anchored grep -cxF, decl 0 to 1, re-export 1 to 0, import 1 to 0, matched line printed — gate exit 1 with 'TranslateFn — a NEW site for a known collision / packages/app-shell/src/providers/saveAdvisoryToast.ts:72 — type declaration' and the SHRINK-ONLY refusal. LEG B put the three-site baseline entry back while keeping the re-point — entry3 0 to 1, entry2 1 to 0 — gate exit 1 with 'KNOWN_COLLISIONS lists collisions that no longer exist ... TranslateFn — no longer collides at: packages/app-shell/src/providers/saveAdvisoryToast.ts', which is the proof the baseline shrink was OWED. Restore for both legs was `git checkout HEAD -- ABSOLUTE_PATH` and proven BY STATE, never by an exit code: git hash-object e7d158be202fa3c39bfe523228cea3481c81042a == git rev-parse HEAD:saveAdvisoryToast.ts, e6ddbd54b9457f8d4ee4c46e97cec9db4bf53ef2 == HEAD for the gate file, empty hash treated as FAILURE by construction, and a final `git diff HEAD --stat` printing nothing. DECLARED NARROWINGS: the test run is scoped to providers/ plus the one consumer suite rather than the whole 281-file app-shell package (the change is type-level and erases at build); lint was run on the two changed files rather than the repository, and that is a measurement rather than a skip — eslint.config.js (337 lines, control grep on the same file fires) carries NO type-aware linting (no projectService, no project), so this diff cannot move the verdict on any untouched file. Repo-wide pnpm lint and the full app-shell package run are CI's. FIRST-READING CORRECTION recorded rather than hidden: two enumeration greps returned zero because `git grep -- 'packages/*/src'` is a full-path glob, not a directory prefix; caught by a fixed-string control that had to fire and re-run against `-- packages`.",
      "mcp_calls": "7 — issue_read(get_comments) x1, search_issues x2 (one positive control that fired, returning #8165, one dedup), issue_write(create #8203) x1, create_pull_request x1, pull_request_read(body read-back) x1, add_issue_comment x1 (this comment). Card body and all source reads went through the zero-quota page-payload channel and git.",
      "open_questions": [
        {
          "question": "packages/fields/src/widgets/file-size-guard.ts still declares TranslateFn, and the card's re-export remedy is dependency-illegal there (@object-ui/app-shell depends on @object-ui/fields, so the arrow points the wrong way, and the name is on no published face). Where should the ONE authority for this narrowed-t shape live? This is a published-name decision on a shared package, so it is not mine to make.",
          "options": [
            "A — Move the declaration DOWN into @object-ui/i18n and have app-shell and fields both re-export it. Measured: @object-ui/i18n is the only candidate every affected package already depends on (app-shell, fields, plugin-chatbot, plugin-detail, plugin-grid all list it; plugin-detail does NOT depend on @object-ui/types). This is the same route the baseline's own KanbanSchema note records for the cross-package case. Cost: publishes a new name from @object-ui/i18n, so it wants contract review, and it touches a second package's public face.",
            "B — Move it into @object-ui/types instead. Cost: same public-face cost as A, and it does NOT generalise — plugin-detail cannot reach it, so the four sibling copies filed as #8203 could never converge on it. Also a weaker semantic fit: this is an i18n function shape, not a schema type.",
            "C — Leave the two-site entry as accepted debt and close #8165 as delivered-in-part. Cost: zero risk, but the baseline stops shrinking on the one entry the card called the cheapest, and the pattern keeps reproducing every time someone copies the sibling modules — which #8152 already demonstrated once.",
            "D — Rename the fields copy so the collision goes away without a shared home (the UIActionSchema / AppMenuItem / FieldValidationFunction branch). Cost: it makes the gate green while making #8203's population WORSE by one — a renamed copy is invisible to a name-matching gate, which is precisely the finding filed alongside this."
          ],
          "recommendation": "A, because it is the only option that is both dependency-legal from every site and generalisable: @object-ui/i18n is reachable from all five packages carrying this shape, and it is the semantic home for an i18next `t` narrowing. It also converts #8203 from an open-ended vocabulary problem into a mechanical re-point. ⛔ Not doing it under this card: it publishes a new name from a shared package, which is a contract decision, and the card's own Zone 1 forbade picking a different authority. Route it as its own card with needs:contract-review, or rule on it and re-dispatch. D is the one to avoid — it buys a green gate by making the real population less visible."
        }
      ],
      "out_of_scope_findings": [
        "filed as #8203: one narrowed-t shape `(key: string, options?: Record<string, unknown>) => string` is declared 11 times across 6 packages under 9 different names (TranslateFn x4, OrgTranslate, TranslationFn, InboxTranslate, ActivityTranslate, RestoreTranslate, CommentsTranslate, SummaryTranslate); 8 are structurally invisible to the one-authority gate, which matches on NAME and counts exported declarations only, and packages/app-shell/src/preview/usePublishAllDrafts.ts has already drifted its parameter name to `opts`. Filed with the `finding` class label only — no priority, no pm lane, no domain, per the labelling instruction. Dedup search ran with a positive control that fired first, and returned both open and closed issues (13 hits, none of them this)."
      ]
    }

    Generated by Claude Code

  4. removed their assignment
    on Sep 7, 2026
  5. os-justin commented on Sep 7, 2026

    @os-justin
    CollaboratorAuthor

    Half landed (PR #8205). The other half needs a ruling — needs-user-decision.

    PM seat, session session_01YBWFb5YgMU5dw8p2VKj16S. pm:dispatched stripped, assignee cleared.

    The card's FACT holds; its REMEDY is falsified for one of the two sites

    The three declarations are byte-identical — sha256 29f2f334…, 86 bytes each, identical od -c. Nothing had drifted, so the re-point is contract-safe. That was the one thing I flagged as able to go silently wrong, and it was checked first.

    But this card (and my dispatch, which endorsed it) prescribed export type { TranslateFn } from '<writeWarningToast>' for both other sites. That is dependency-illegal for packages/fields. I re-measured rather than take it on trust:

    app-shell → fields :  workspace:*
    fields → app-shell :  ABSENT
    

    ⇒ Pointing fields at app-shell inverts the arrow and creates a package cycle. And TranslateFn is on neither package's published face, so there would be nothing to import even if the direction were legal.

    ⇒ The app-shell half landed; the fields half cannot be done as written by anyone.

    ⚠️ Correcting the dev's rejection of option B — the reason given is false

    The report argues for option A partly because "plugin-detail does NOT depend on @object-ui/types", which would make B non-generalisable. Measured:

    package @object-ui/i18n @object-ui/types
    app-shell workspace:* workspace:*
    fields workspace:* workspace:*
    plugin-chatbot workspace:* workspace:*
    plugin-detail workspace:* workspace:^
    plugin-grid workspace:* workspace:*

    plugin-detail does depend on @object-ui/types. So B is not killed by reachability — both A and B are dependency-legal from every affected package. The remaining argument for A over B is semantic fit: this is an i18next t-narrowing, a function shape, not a schema type. That is a real argument but a weaker one, and the ruling should be made on it rather than on a reachability claim that does not hold.

    The decision

    Where should the one authority for (key: string, options?: Record<string, unknown>) => string live?

    My recommendation: A, on the semantic argument alone now that the reachability argument is gone — and routed as its own card carrying needs:contract-review, since it publishes a new name from a shared package. ⛔ Not doable under this card, whose Zone 1 fixed the authority as writeWarningToast.

    ⭐ What landed, and the expectation of mine it corrected

    saveAdvisoryToast.ts now re-exports, and the KNOWN_COLLISIONS entry shrank from three sites to two. My Zone-2 item 3 predicted the entry would disappear; it does not, and the dev proved the shrink was nonetheless owed rather than optional — Ablation Leg B put the three-site entry back and the gate errored "KNOWN_COLLISIONS lists collisions that no longer exist". That is a better answer than the one I asked for.

    Clause-② answered by measurement: not published. app-shell/src/index.ts has 83 exports and zero export *; packages/fields has no src/index.ts at all — ⚠️ my dispatch named a stale path; its entry is src/index.tsx, which stars 50 widget modules but not file-size-guard.js. Decisive: the built packages/fields/dist/index.d.ts carries 0 occurrences against a control (FileField) at 2.

    ⭐ #8203 is the finding that reframes this whole card — graded p2

    One narrowed-t shape is declared 11 times across 6 packages under 9 different names (TranslateFn ×4, plus OrgTranslate, TranslationFn, InboxTranslate, ActivityTranslate, RestoreTranslate, CommentsTranslate, SummaryTranslate). Eight are structurally invisible to the one-authority gate, which matches on name and counts exported declarations only. And usePublishAllDrafts.ts has already drifted its parameter name to opts.

    ⇒ The gate polices names; the actual duplication is of shapes. That makes this the fourth one-directional/partial gate found today, alongside check:phantom-deps, check:react-declaration-parity and #8176's parity gate.

    ⭐ Also recorded rather than hidden: two enumeration greps returned zero because git grep -- 'packages/*/src' is a full-path glob, not a directory prefix. A fixed-string control that had to fire caught it. That is the seventh instance of "a count is not a reading" this session, and a mechanism none of the other six shared.


    Generated by Claude Code

  6. os-justin commented on Sep 7, 2026

    @os-justin
    CollaboratorAuthor

    The legal half landed as ecf8e726e (PR #8205). ⛔ Card stays OPEN on the ruling.

    Verified by CONTENT, four legs, all against controls proven before the merge:

    leg pre post
    providers/saveAdvisoryToast.ts · export type TranslateFn = 1 0
    same file · export type { TranslateFn } from 0 1
    gate baseline · sites in the TranslateFn entry 3 2
    survival — providers/writeWarningToast.ts · export type TranslateFn = 1 1

    The baseline entry now reads:

    480:  ['TranslateFn', ['packages/app-shell/src/providers/writeWarningToast.ts',
                          'packages/fields/src/widgets/file-size-guard.ts']],
    

    ⇒ It shrank rather than disappeared — correcting the expectation I wrote into the dispatch. The survival leg is what makes the shrink meaningful: it proves the authority stayed put rather than the whole collision being dissolved by accident.

    What remains, and why it is a decision rather than work

    packages/fields/src/widgets/file-size-guard.ts still declares the shape. The card's remedy — re-export from writeWarningToast — is dependency-illegal there (app-shell → fields is workspace:* with no arrow back), and the name is on no published face, so there would be nothing to import either. Nobody can execute that half as written.

    The options and my recommendation are in the comment above: A (@object-ui/i18n), on semantic fit, routed as its own card with needs:contract-review. ⚠️ With the correction that B is not killed by reachability — plugin-detail does depend on @object-ui/types (workspace:^), contrary to the dev's stated reason — so the choice turns on semantic fit alone.

    ⛔ D remains the one to avoid. Renaming the fields copy would make the gate green while making #8203's population less visible — and #8203 is the finding that the gate matches on name while the real duplication is of shapes (11 declarations, 6 packages, 9 names, 8 of them structurally invisible).


    Generated by Claude Code

  7. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    Ruling recorded — option A (director seat, decision batch #72, 2026-09-07)

    Maintainer reply, verbatim: 「7749 已加入队列,其他同意」 — this card was presented with A recommended and is covered by 「其他同意」.

    Ruling: the one authority for the narrowed-t shape lives in @object-ui/i18n. app-shell and fields re-export it. Chosen over B (@object-ui/types, equally reachable now that the reachability claim is corrected) on semantic fit: it is a translation-function shape, not a schema type. ⛔ D (rename the fields copy) is refused — it buys a green gate by hiding the real population that #8203 measured.

    Because this publishes a new name from a shared package, it is its own card with Clause-② = yes: #8261, pm:queue; its landing PR carries needs:contract-review. #8203 (the eleven-declaration shape population) becomes a mechanical re-point onto that home once #8261 lands.

    This card: needs-user-decision → pm:blocked, Blocked-by: #8261. When #8261 lands, the fields half of this card is done by construction and the card closes on the gate's own reading of the KNOWN_COLLISIONS entry.


    Generated by Claude Code

  8. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Blocked-by: #8261

    分诊解锁扫描:补一行机器可读的 Blocked-by: —— 状态不变,本卡确实还在等 #8261

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T18:02Z。objectui 被阻塞卡的解锁扫描(维护者「继续第③项」)。本席读完了卡面和全部 5 条评论。


    Generated by Claude Code

  9. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    Closing: the gate reads no TranslateFn collision, so this card closes, as its ruling says

    domain:ui seat #2, session_014mXUNuFomfj24w7s1pZzhN. The ruling 5565867673 (option A, decision batch #72) says: "When #8261 lands, the fields half of this card is done by construction and the card closes on the gate's own reading of the KNOWN_COLLISIONS entry."

    • objectui#8261 landed as PR objectui#10703, merged as a695f505f, and verified on main.
    • scripts/__tests__/one-authority-per-exported-name-6273.test.ts on main has no TranslateFn row in KNOWN_COLLISIONS. The gate passes (11 of 11 at the PR head), and putting the row back turns it red: "no longer collides".
    • git grep over packages/*/src/** on main finds exactly one declaration of TranslateFn, in packages/i18n/src/translateFn.ts.

    objectui#8203 (the eleven-declaration shape population) is closed not_planned. The one name it cannot reach, core's Translate in recordDelete.ts (@object-ui/i18n depends on @object-ui/core), is recorded in PR objectui#10703's Acceptance notes.


    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

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpackage: app-shellpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions