Skip to content

feat(plugin-grid,console): list cells show the record a referenceVia pointer names; the empty inbox says who else is waiting - #12658

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-12608-approvals-names
Oct 16, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-12608-approvals-names

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #12608
Clause-②: yes

This is the objectui half of the card. The column set, the step and flow labels, Waiting on and the Action History record column are producer work on objectstack-ai/objectstack. They are listed under Producer proposals, so this PR does not close the card.

What changed

Target 1 and 2 (objectui half): the pointer cell. In ObjectGrid, a column for a text field that declares referenceVia now draws the record the row's pointer pair names: the target object's icon and the record's name. The raw id moves to the tooltip. The pair is resolved per row by the existing resolveRecordPointer from @object-ui/fields, the same rule the record details grid uses. The new cell, RecordPointerCell in plugin-grid, only draws what that rule returns. The name comes from getRecordDisplayName after withoutDeniedFields. The page's targets are read with one find per target object, using an id $in filter; object definitions come from getObjectSchema. Both answers are cached per data source. The face is wired into all four column paths of the grid, so every referenceVia field in every list gets it: sys_approval_request.record_id, sys_activity.source_id, and the sharing, audit and mail pointers.

Target 4. A target that cannot be read shows Opportunity · record unavailable, with the id only in the tooltip. Deleted records, rows outside the viewer's access, an unavailable definition and failed reads all get this one rendering, for the same no-existence-oracle reason RecordPreviewCard gives.

Target 3. When the caller's pending tab in the Approvals Inbox is empty, the page sends one count query: listRequests with status pending and limit 1, so the server returns total. The server counts under the same visibility as the All tab's own read. If the total is above zero, the empty state adds one muted line: N requests are waiting on other approvers · Browse all requests. The existing Browse all requests control moves into that line, so it still appears once. If the count read fails, no line is shown.

New language-pack keys in all ten shipped locales: grid.recordUnavailable and the approvalsInbox.waitingOnOthers plural family, with the CLDR categories each language needs.

Deviations

  • Names are not links in console lists yet. The cell links through the host's recordHref / openRecord, and a unit test pins the link. The console list host, listRecordActionsValue in app-shell ObjectView.tsx, deliberately answers recordHref only for the object being listed, so in Setup the name renders without a link. That is outside this claim's files, and changing it would also turn every lookup cell in every list into a link. It is left to the seat.
  • Browse all requests keeps its existing destination, the inbox's All tab, which reads the same approvals door as the count. It does not point to the object list view.
  • New language-pack keys can be reached from the @object-ui/i18n entry. The claim's file surface names them; the seat decides whether Clause-② covers them. No export, prop or type member is added; RecordPointerCell is internal to plugin-grid.

Producer proposals (objectstack)

  • Step label: sys_approval_request.current_step and sys_approval_action.step_name store the node id (manager_review). The engine should write a label snapshot when it opens or advances a step, and the list views should show that instead.
  • Flow label: process_name is flow:NAME. The engine should write a process_label snapshot of the flow's label, keeping the api name in process_name.
  • Waiting on: pending_approvers is a textarea of slot addresses. It needs an engine-served display column, resolved by the approvals service's own resolver, in all_requests and my_pending.
  • Action History record column: request_id displays the request's display_title formula, which is process_name · record_id, so the raw id leaks. Add the pointer pair (object_name and record_id with referenceVia) to sys_approval_action; this PR's cell then draws it.
  • Action History acted_as shows a raw user id. It needs a served display label.

Screenshots (HotCRM, 1280 px)

Record cells read from the DOM at capture, first three rows of all_requests:

  1. unreadable, Opportunity · record unavailable, title SzIsIKdI_MYlObTf (its opportunity was deleted)
  2. readable, Globex Manufacturing Suite, title 28W5lzLQhZs_53LL, icon lucide-dollar-sign
  3. readable, Initech Cloud Migration, title 9C2hdzZMz96ZbHzk, icon lucide-dollar-sign

The 50-row page sent exactly one crm_opportunity data request. The inbox read 52 requests are waiting on other approvers · Browse all requests: 53 requests, one of them cancelled.

About the seed: a fresh HotCRM boot (e50d048) has no approval requests. I created 53 through the flows by raising 10 open deals to $100K or more and adding 43 new ones. I then ran pnpm demo:staff, reassigned the admin's 10 slots to the sales manager, and deleted one target.

Test evidence (head b04cf2e)

  • New pins: ObjectGrid.recordPointerCell-12608 3/3 passed; ApprovalsInboxPage.waitingOnOthers-12608 3/3 passed. Each pin was ablated once and went red: pointer face off, 2 failed; unreadable cell prints the id, 1 failed; line never drawn, 1 failed; line always drawn, 2 failed. Each mutant was restored to HEAD.
  • pnpm --filter @object-ui/app-shell test: 1437 files passed, 13596 tests passed, exit 0.
  • plugin-grid, fields and i18n suites: 560 files, 7431 tests passed, exit 0. apps/console: 206 files, 2191 tests passed, exit 0.
  • type-check (plugin-grid, fields, i18n, console), eslint on touched files (0 errors), the console closure build plus the console build, and check:i18n-keys, i18n-drift, i18n-designer-parity, changeset presence: all exit 0.

Session: https://claude.ai/code/session_018mfTYw2pCvEqHeGZDvybj8


Generated by Claude Code

…s who else is waiting (objectui#12608)

A list grid column for a `text` field declaring `referenceVia` now draws
the record the row's pointer pair names: the target object's icon and
the record's name, linking to the record, with the raw id as the
tooltip. An unreadable target reads "OBJECT · record unavailable". The
pair is resolved per row by `resolveRecordPointer`; the page's targets
are read with one `find` per object.

The Approvals Inbox's empty pending tab makes one count query and, for
a non-zero total, adds "N requests are waiting on other approvers ·
Browse all requests".

Claude-Session: https://claude.ai/code/session_018mfTYw2pCvEqHeGZDvybj8
Co-authored-by: Claude <noreply@anthropic.com>
…erCell (objectui#12608)

The annotation every other `resolveIcon` call site carries:
`react-hooks/static-components` cannot see that the seam returns a
stable, cached component.

Claude-Session: https://claude.ai/code/session_018mfTYw2pCvEqHeGZDvybj8
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · objectui#12608 · head b04cf2e · 2026-10-16T11:30Z

Seat domain:ui#4, session session_01SJn1GEkrbbBQkhGC26wEDw. Checked against GitHub and the diff, not against the report (relayed on the card). The seat opened this PR from the dev's drafts (degraded channel). The body is the dev's, except line 2: the seat corrected it to Clause-②: yes, matching the amended claim 6214494863.

Checklist

  • Form:

    • Draft → main, assignee os-sales.
    • The first line is Part of #12608: the producer half stays on the card. The second line is Clause-②: yes.
    • git merge-tree against current main (f62b6ff) is clean. Two commits; no PNG on the branch.
  • Diff, 17 files:

    • packages/plugin-grid/src/RecordPointerCell.tsx is new and internal.
    • ObjectGrid.tsx routes a referenceVia column through recordPointerFace on all four column paths. The pair is resolved by the existing resolveRecordPointer (@object-ui/fields), so there is no second resolver.
    • The face is skipped for a column the viewer's field permissions withhold (withheld ? null).
    • Targets are read with one find per target object per page, with an id $in filter. A target that cannot be read draws OBJECT · record unavailable and never the bare id.
    • ApprovalsInboxPage.tsx: one count query (listRequests, pending, limit: 1) when the caller's pending tab is empty. The muted "N requests are waiting on other approvers · Browse all requests" line is drawn only for a total above zero, and nothing is drawn on a failed read.
    • New keys in all ten locales; the change in packages/fields is a doc comment.
  • Tests:

    • Two new pin files (3 + 3), each ablated, and the invalid first ablation was redone.
    • @object-ui/app-shell in full: 1437 files, 13596 tests.
    • plugin-grid, fields and i18n: 560 files, 7431 tests.
    • apps/console: 206 files, 2191 tests.
    • type-check, lint, build and the i18n checks all exit 0.
  • Changeset: four released packages, user-facing prose.

  • Contract faces: Clause-②: yes. The new keys land in @object-ui/i18n's en pack, the source of the exported TranslationKeys type. No code export, prop or type member is added. The TIER_DEFAULT review is its own comment.

  • Screenshots: HotCRM, 1280 px, light and dark, on the never-merged claude/issue-12608-evidence (d2979a6). The seat read Approval Requests and the Inbox in light:

    • the Record ID column shows the deal names (Globex Manufacturing Suite, Initech Cloud Migration, and so on) with the opportunity icon;
    • the cancelled row reads Opportunity · record unavailable;
    • the empty inbox reads "52 requests are waiting on other approvers · Browse all requests".

    Sent to the maintainer at 2026-10-16T11:30Z.

  • CI: running at this record. Landing waits for green.

Rulings

  1. Should names link to records of other objects in console lists: not in this PR. listRecordActionsValue answers recordHref only for the listed object, by design. Linking every lookup in every list is a product change outside the claim. It is put to the maintainer, and filed only on a yes. The cell already links whenever a host answers, and that is pinned.
  2. RecordPointerCell internal to plugin-grid (A): accepted. There is no measured second list surface, so implementation comes first.
  3. Degraded channel: A.
  4. Producer proposals: the step label snapshot, the flow label snapshot, the "Waiting on" display column, the Action History pointer pair and the acted_as label are filed on objectstack as one card, linked here. The empty submitter_id did not reproduce on HotCRM e50d048, so it is not filed.
  5. Out of scope: referenceDeletedWhen (the cancel reason in place of "record unavailable") is objectui#12489's, as the dev found. The per-session pointer cache is noted in the PR's acceptance notes.

Implemented-by: cloud session session_018mfTYw2pCvEqHeGZDvybj8, branch claude/issue-12608-approvals-names
Reviewed-by: seat domain:ui#4, session_01SJn1GEkrbbBQkhGC26wEDw


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: TIER_DEFAULT
Head-sha: b04cf2ed2db77cec6857b47605d3a12049056f69
Local-runs: none

Face: the Clause-②: yes declaration of the amended claim 6214494863 on objectui#12608. The PR's file list carries no packages/spec/src/** path and no governed path. Inputs read: the card, both claims, the diff at the head above, and the PR body. Nothing was built or run locally.

① Derived judgments

  • Published types: the new keys grid.recordUnavailable and the approvalsInbox.waitingOnOthers plural family join @object-ui/i18n's en pack, the source of the exported TranslationKeys type. That is an additive widening of the key union; nothing is removed or retyped. Correct, and declared.
  • No code surface: RecordPointerCell is internal to @object-ui/plugin-grid, not re-exported from its entry. @object-ui/fields changes only a doc comment. Correct.
  • Behaviour:
    • A referenceVia list cell now draws the target record's name through the existing resolveRecordPointer.
    • A withheld column keeps its masked face.
    • An unreadable target draws OBJECT · record unavailable, the same no-existence-oracle rule as RecordPreviewCard.
    • No authored key, schema or accept set changes.
    • Correct.

② Semver level

The changeset bumps @object-ui/plugin-grid, @object-ui/i18n, @object-ui/fields and the console, in pre mode on tag next. The changeset presence and no-major checks exit 0. Minor fits a new cell face and new pack keys. Consistent.

③ Boundary flags

  • Cross-object links in lists are a product decision, put to the maintainer (ACCEPT ruling 1).
  • The producer proposals are filed on objectstack (ACCEPT ruling 4).
  • referenceDeletedWhen is objectui#12489's.

Implemented-by: session_018mfTYw2pCvEqHeGZDvybj8
Reviewed-by: session_01SJn1GEkrbbBQkhGC26wEDw

VERDICT: PASS


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 70 chunks) 3117.0 KB 3119.4 KB
Main entry chunk (gzip) 64.8 KB 350 KB
Entry file index-DDFpL2FO.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.19KB 7.76KB
app-shell (runtime-config.js) 22.59KB 7.89KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.39KB 6.02KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 41.19KB 11.12KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 597.83KB 144.29KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.20KB 69.22KB
fields (index.js) 290.12KB 74.14KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 40.67KB 11.85KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 16.04KB 3.92KB
plugin-calendar (index.js) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 201.89KB 48.13KB
plugin-dashboard (index.js) 146.15KB 39.55KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 262.91KB 69.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.92KB 46.73KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 270.08KB 74.80KB
plugin-kanban (index.js) 59.42KB 18.48KB
plugin-list (index.js) 131.40KB 33.50KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 93.43KB 23.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 1.13KB 0.65KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Live E2E (informational) red on b04cf2e · not this PR's · 2026-10-16T11:32Z


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Landing · head b04cf2e · 2026-10-16T11:54Z

  • Head unchanged since the ACCEPT 6214533237: b04cf2e, 2 commits, no push since.
  • Checks on b04cf2e: every run is green or an expected skip except Live E2E (informational) (objectui#12649, not this PR's; the note above). That includes Type Check, all 16 test shards and the Test roll-up, Lint, Build & E2E, Test (dist pins), Repo Gates, Bundle Analysis (eager closure 3117.0 KB of 3119.4 KB), Build Docs, Line Citation Gate, the changeset checks and Governed Surface Queue Guard.
  • Contract review: TIER_DEFAULT, PASS at this head (6214541723). The amended claim 6214494863 declares Clause-②: yes for the new @object-ui/i18n keys.
  • Producer half: filed as plugin-approvals: serve display labels for the approval lists — the step and flow labels, "Waiting on", the Action History record pointer and acted_as objectstack#23889 (step label, flow label, Waiting on, the Action History pointer pair, acted_as).
  • Open question, held for the maintainer: names in console lists are not links yet, because listRecordActionsValue answers recordHref only for the listed object. No card is filed until the maintainer answers.
  • Action: mark it ready for review and enable auto-merge through the merge queue. The body reads Part of #12608, so the card stays open for the producer half.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 16, 2026 11:55
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 16, 2026 11:55
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 16, 2026
Merged via the queue into main with commit f78efdd Oct 16, 2026
36 of 37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-12608-approvals-names branch October 16, 2026 12:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants