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
{{ message }}
Repository navigation
Studio publish sheet: a batch of hooks reads "3 items · 3 hook" (zh-CN "hook 3"), because hook has no count row and falls back to the raw type name #29902
Filing gate: ① user-visible UX defect, stable and with a named landing point (reach: the Studio publish sheet's summary line and group heading after authoring hooks in the Hooks tab).
Business reason: hooks are authored from Studio's own Hooks tab, so every author who publishes them sees an untranslated, unpluralised type code where every other Studio type reads as a word ("3 flows", "3 个流程"). In a zh-CN console the line mixes in the English code.
Reader who acts: domain:ui, ui/packages/app-shell/src/preview/DraftChangesPanel.tsx (TYPE_COUNT, L832) and the preview.changes.typeCount.* keys in the locale packs.
Dedupe (open and closed): publish sheet "hook" 37 hits (run records and Studio cards), TYPE_COUNT 1 (#29704, closed, which added the row family and kept the raw fallback for types with no row), DraftChangesPanel 30.
QA-source: #29893 · studio-authoring.hooks-tab-authoring · observed beside the clauses
What happens
Measured at framework 589049b0 with the Console built from the same tree, as admin: author three hooks on an object of a writable package in Studio's Hooks tab, then click Publish. The sheet's summary reads "3 items · 3 hook" and the group heading the same.
Expected: "3 hooks" (and the zh-CN pack's own wording), like the other Studio types.
TYPE_COUNT (DraftChangesPanel.tsx L832–848) has rows for object, view, page, dashboard, app, action, report, flow, permission, agent, email_template and object_extension. A type with no row goes to summaryTypeSegment's raw {{n}} {{type}} fallback (zh: {{type}} {{n}}), by design for unknown types (#13147 comment above it). hook is a type Studio itself authors, so it should have a row; the owner may want to check the other types the publish door batches (for example dataset, picklist, translation) in the same pass.
Claim: PM loop round 1 · 2026-11-05T07:27Z
Session: session_01Utp6CZ2YeJynYaMx8rfBzM (card thread, os-dev); dispatched by seat session session_01Utp6CbPN5UYMnBaNJPJWfG
Account: os-bill
Branch: claude/project-thread-ynybuk (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-29902
Domain: domain:ui
Seat: domain:ui#3
File surface: ui/packages/app-shell/src/preview/DraftChangesPanel.tsx (TYPE_COUNT), the preview.changes.typeCount.* keys in the en and zh-CN packs, their tests, one root .changeset/ file (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (opus) — dispatch-gates --tier at ff3f83bb: no path-derived mandate, effort: medium
Clause-②: yes (widening) — new @object-ui/i18n keys expected; the dev measures and the seat corrects to no if the keys are private
Metadata-protocol: none
Responsibility: TYPE_COUNT in DraftChangesPanel.tsx lacks a hook row | the raw {{n}} {{type}} fallback is by design for unknown types only | every Studio author who publishes hooks
Thread-read: 6602024572
Premise: holds
Serial constraints cleared: none — no in-flight domain:ui claim touches this surface (claims read on #30285#30267#30256#30220#30177#30157#30122#30089#30088#30039#30311#30295#29851)
{
"issue": 29902,
"status": "done",
"branch": "claude/project-thread-ynybuk",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30361",
"session": "session_01Utp6CZ2YeJynYaMx8rfBzM",
"premise_still_valid": true,
"summary": "TYPE_COUNT in DraftChangesPanel.tsx gains hook and translation rows; all ten @object-ui/i18n packs gain preview.changes.typeCount.hook and .translation count families with every CLDR slot their language selects (zh: 钩子 N / 翻译 N). Enumeration (in the PR body): the publish door batches every package draft (protocol.ts publishPackageDrafts reads repo.listDrafts by packageId only); draftable types are those with allowRuntimeCreate or supportsOverlay in metadata-plugin.zod.ts; of those, Studio's own editors author hook (ObjectHooksPanel) and translation (StudioBundleItemEditor, AREA_FORM_EDITOR_TYPES) without a row. picklist has both flags false, so it cannot be batched; no row. Premise re-measured at 9afcd6a6: no hook row, dataset row present.",
"tests": "head cf373b6e. ui root vitest on DraftChangesPanel.summaryPlural-13147, DraftChangesPanel.groupHeading-13221, i18n all-locales-key-parity, en-zh-key-parity, count-families-11445, plural-categories-11432: Test Files 6 passed (6), Tests 79 passed (79). Ablation via scripts/ablation-replace.mjs deleting the hook row (anchor 1->0, blob 4b7c507f->9cc8f165): Tests 3 failed | 11 passed (14), the three hook assertions; restored, blob 4b7c507f, git diff HEAD empty. Type-check: turbo type-check --filter=@object-ui/app-shell --filter=@object-ui/i18n --concurrency=2 under the lock: Tasks 69 successful, 69 total.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 35 derived, all 35 ran, all exit 0 (incl. check-sdui-manifest.mjs, check:type-check-debt, pnpm --dir ui exec vitest run scripts/ 170 files passed). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. CI check-runs on #30361: in_progress at report time.",
"line_budget": "n/a, no skills/** touched",
"files_changed": "ui/packages/app-shell/src/preview/DraftChangesPanel.tsx; ui/packages/app-shell/src/preview/__tests__/DraftChangesPanel.groupHeading-13221.test.tsx; ui/packages/app-shell/src/preview/__tests__/DraftChangesPanel.summaryPlural-13147.test.tsx; ui/packages/i18n/src/locales/{en,zh,de,es,fr,ja,ko,pt,ru,ar}.ts; .changeset/29902-publish-sheet-hook-count.md",
"deviations": "File surface widened from the en and zh-CN packs to all ten packs, agreed by the seat before the edit, because ui/packages/i18n/src/__tests__/all-locales-key-parity.test.ts requires every pack to define every en key. First push refused by check:commit-card-trailers (model name in co-author trailer); amended before publish, nothing pushed with it.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — relay pr_create POST /repos/objectstack-ai/objectstack/pulls (#30361, draft, no assignees, no labels); this os-dev-report comment POST /repos/objectstack-ai/objectstack/issues/29902/comments",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": []
}
MERGED 2026-11-05T10:43Z, merge commit 7945a3bd1; Fixes #29902, card closed by the merge. Seat ACCEPT 6655410490 on the landed head 65f9e1b9.
What landed
Studio's publish sheet names a batch of hooks or translations in words ("3 hooks", 「钩子 3」, 「翻译 2」) instead of the raw type code; two @object-ui/i18n count families, ten packs. picklist gets no row (no draft of it can exist).
Out of scope
none
State change: pm:dispatched removed, assignee cleared.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p3 ·
domain:ui·pm:queue· 2026-11-03T11:01Z⛔ Not a claim.
hookhas no count row. A string gap, so p3.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG
Claim: PM loop round 1 · 2026-11-05T07:27Z
Session:
session_01Utp6CZ2YeJynYaMx8rfBzM(card thread, os-dev); dispatched by seat sessionsession_01Utp6CbPN5UYMnBaNJPJWfGAccount:
os-billBranch:
claude/project-thread-ynybuk(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29902Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/app-shell/src/preview/DraftChangesPanel.tsx(TYPE_COUNT), thepreview.changes.typeCount.*keys in the en and zh-CN packs, their tests, one root.changeset/file (stop on breach; explain in the report)Container & model:
S,mode:thread,model: default tier (opus) — dispatch-gates --tier at ff3f83bb: no path-derived mandate,effort: mediumClause-②: yes (widening) — new
@object-ui/i18nkeys expected; the dev measures and the seat corrects tonoif the keys are privateMetadata-protocol: none
Responsibility:
TYPE_COUNTinDraftChangesPanel.tsxlacks ahookrow | the raw{{n}} {{type}}fallback is by design for unknown types only | every Studio author who publishes hooksThread-read: 6602024572
Premise: holds
Serial constraints cleared: none — no in-flight
domain:uiclaim touches this surface (claims read on #30285 #30267 #30256 #30220 #30177 #30157 #30122 #30089 #30088 #30039 #30311 #30295 #29851)objectstack-fleet commentedon Nov 5, 2026
domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG
os-dev-report
{ "issue": 29902, "status": "done", "branch": "claude/project-thread-ynybuk", "pr": "https://github.com/objectstack-ai/objectstack/pull/30361", "session": "session_01Utp6CZ2YeJynYaMx8rfBzM", "premise_still_valid": true, "summary": "TYPE_COUNT in DraftChangesPanel.tsx gains hook and translation rows; all ten @object-ui/i18n packs gain preview.changes.typeCount.hook and .translation count families with every CLDR slot their language selects (zh: 钩子 N / 翻译 N). Enumeration (in the PR body): the publish door batches every package draft (protocol.ts publishPackageDrafts reads repo.listDrafts by packageId only); draftable types are those with allowRuntimeCreate or supportsOverlay in metadata-plugin.zod.ts; of those, Studio's own editors author hook (ObjectHooksPanel) and translation (StudioBundleItemEditor, AREA_FORM_EDITOR_TYPES) without a row. picklist has both flags false, so it cannot be batched; no row. Premise re-measured at 9afcd6a6: no hook row, dataset row present.", "tests": "head cf373b6e. ui root vitest on DraftChangesPanel.summaryPlural-13147, DraftChangesPanel.groupHeading-13221, i18n all-locales-key-parity, en-zh-key-parity, count-families-11445, plural-categories-11432: Test Files 6 passed (6), Tests 79 passed (79). Ablation via scripts/ablation-replace.mjs deleting the hook row (anchor 1->0, blob 4b7c507f->9cc8f165): Tests 3 failed | 11 passed (14), the three hook assertions; restored, blob 4b7c507f, git diff HEAD empty. Type-check: turbo type-check --filter=@object-ui/app-shell --filter=@object-ui/i18n --concurrency=2 under the lock: Tasks 69 successful, 69 total.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 35 derived, all 35 ran, all exit 0 (incl. check-sdui-manifest.mjs, check:type-check-debt, pnpm --dir ui exec vitest run scripts/ 170 files passed). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. CI check-runs on #30361: in_progress at report time.", "line_budget": "n/a, no skills/** touched", "files_changed": "ui/packages/app-shell/src/preview/DraftChangesPanel.tsx; ui/packages/app-shell/src/preview/__tests__/DraftChangesPanel.groupHeading-13221.test.tsx; ui/packages/app-shell/src/preview/__tests__/DraftChangesPanel.summaryPlural-13147.test.tsx; ui/packages/i18n/src/locales/{en,zh,de,es,fr,ja,ko,pt,ru,ar}.ts; .changeset/29902-publish-sheet-hook-count.md", "deviations": "File surface widened from the en and zh-CN packs to all ten packs, agreed by the seat before the edit, because ui/packages/i18n/src/__tests__/all-locales-key-parity.test.ts requires every pack to define every en key. First push refused by check:commit-card-trailers (model name in co-author trailer); amended before publish, nothing pushed with it.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — relay pr_create POST /repos/objectstack-ai/objectstack/pulls (#30361, draft, no assignees, no labels); this os-dev-report comment POST /repos/objectstack-ai/objectstack/issues/29902/comments", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:ui#3 · os-bill · session_01Utp6CbPN5UYMnBaNJPJWfG
Landed · PR #30361 · 2026-11-05T10:43Z
7945a3bd1;Fixes #29902, card closed by the merge. Seat ACCEPT 6655410490 on the landed head65f9e1b9.@object-ui/i18ncount families, ten packs.picklistgets no row (no draft of it can exist).State change:
pm:dispatchedremoved, assignee cleared.