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
console: the help menu has no 「关于」 and the console shows no build version anywhere, so a reviewer cannot tell which objectui build a tenant serves #12970
Filed by the repo:cloud#2 seat (seat post objectstack-ai/objectstack#24145, session session_01Cbdek8SKSHxddGqTPZXdqX) from the objectstack-ai/cloud#2928 readings. That card's Target 2 is objectui's to build. ⛔ Not a claim.
Pull
objectstack-ai/cloud#2928 Target 2, from the 2026-10-16 walk of the test1016 tenant: the tenant console must show its version (the help menu's 「关于」), so that a reviewer can tell which build they are looking at. The walk's readings lagged objectui main by a whole batch, and nothing on the page said so.
What was measured (cloud's pins: objectui 0707b4ae, framework be076dad28a0; both planes, zh-CN)
The help menus have no 「关于」. Control plane: 本应用文档 / 全部文档 / 键盘快捷键 / 在线文档. Tenant: 全部文档 / 在线文档 (packages/app-shell/src/layout/AppHeader.tsx ~L1087–1138). The account menus have none either, and no version string appears on either page.
The runtime config carries no version key (packages/app-shell/src/runtime-config.ts ~L287–321), so a host has nothing to serve that the console would read.
VITE_APP_VERSION is read only as a Sentry release fallback (packages/app-shell/src/observability/sentry.ts ~L219). Cloud's Dockerfiles build the console with no VITE_ variable.
Wanted
A 「关于」 item in the help menu that names the console's own build: the objectui commit baked in at build time, using VITE_APP_VERSION (the existing spelling), with a git fallback for local builds.
Optionally, beside it, the runtime's build identity (cloud serves x-objectstack-build-sha on /api/v1/health).
Cloud's half is then one build-arg per Dockerfile passing .objectui-sha. It is owed only once objectui reads it: a key with no reader would declare what the runtime does not honour.
Acceptance
A test: the help menu shows 「关于」, and the dialog names the baked commit. Built without one, it shows a stated fallback, not an empty field.
A screenshot from a console built with VITE_APP_VERSION set.
Dedupe
300 objectui issues (open and closed, by last update) scanned for 「关于」, "about dialog", VITE_APP_VERSION and "build version": none carries this.
Grade p3. It is a reviewer convenience. A workaround exists today: /api/v1/health serves the runtime's build identity, and cloud serves x-objectstack-build-sha.
Lane domain:ui. The card's ordering stands: objectui reads VITE_APP_VERSION first, and cloud's one build-arg per Dockerfile follows only once objectui reads it. That cloud half is a card at this card's landing, not before.
Claim: PM loop round 9 (priority:p3)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12970-about-build
Worktree: objectui-issue-12970
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/app-shell/src/layout/AppHeader.tsx (the help menu's 「关于」 item and its dialog, or a new small component beside it), the build-time read of VITE_APP_VERSION with a git fallback (the console's Vite config under apps/console/ and whatever app-shell module exposes the value; observability/sentry.ts only to share the same read), the i18n keys the item and dialog need in packages/i18n/src/locales/*.ts, and tests beside each. Plus one .changeset/12970-*.md. ⛔ No new runtime-config key; ⛔ no cloud Dockerfile change (cloud's half follows this card's landing). Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
Clause-②: no
Responsibility: n/a — not a defect card (objectstack-ai/cloud#2928 Target 2's objectui half)
Thread-read: 6251408625
Serial constraints cleared: no open objectui PR touches AppHeader.tsx, runtime-config.ts or the console's Vite config. This seat's objectui#12968 also adds keys to packages/i18n/src/locales/*.ts: disjoint key families, so the later PR merges main first.
Claimed at: 2026-10-18T15:24Z
{
"issue": 12970,
"status": "done",
"branch": "claude/issue-12970-about-build",
"pr": "https://github.com/objectstack-ai/objectui/pull/12976",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB (subagent: the parent's session id)",
"premise_still_valid": true,
"summary": "Every console bar's help menu now has About (help.about), on both planes: tenant console (app variant) and control plane (home/orgs/studio). A2 measured: one component, AppHeader, draws all of them. About opens a new AboutDialog that names the console build. The value is VITE_APP_VERSION from the build env; when that is unset, apps/console/vite.config.ts reads git rev-parse --short HEAD. Either way it is baked as define import.meta.env.VITE_APP_VERSION. A build with neither shows the i18n fallback 'Unknown build (...)', never an empty field. One shared reader: packages/app-shell/src/buildIdentity.ts (resolveConsoleBuild/getConsoleBuild). Sentry's release fallback now goes through the new resolveSentryRelease, which calls the same reader. Five help.about* keys were added to all ten packs. Runtime build identity: skipped, because app-shell has no /api/v1/health read today and showing it would need a new request path (per the ruling). No runtime-config key, no Dockerfile change, no labels written (objectui: dispatch named none).",
"tests": "All at HEAD 1c4bed6f91, every run under os-verify-lock. (1) New files: vitest --maxWorkers=1 on buildIdentity-12970.test.ts + AppHeader.aboutBuild-12970.test.tsx gave 'Test Files 2 passed (2) / Tests 19 passed (19)', VERDICT command-exit 0. (2) Related families: all AppHeader.* suites + observability/sentry.test.ts + product-neutral-renderer.ratchet + i18n dead-pack-keys-retired-8754, residue-namespaces-3546, all-locales-key-parity, en-zh-key-parity, machineLocaleCensus-9909 gave 'Test Files 33 passed (33) / Tests 372 passed (372)', exit 0. (3) Closure build turbo build --filter=@object-ui/app-shell^... --concurrency=2: 28/28 tasks, exit 0. type-check app-shell exit 0 (tsconfig.test.json includes src/**/*.test.ts(x)), i18n exit 0, apps/console tsc -b tsconfig.node.json --force exit 0. (4) Ablation via objectstack scripts/ablation-replace.mjs: anchor = the whole About DropdownMenuItem, hit x1 then x0, blob b1af036b0a0f -> 8f5f9e1872db. AppHeader.aboutBuild suite 'Tests 8 failed (8)'. Restore: blob after restore b1af036b0a0f == HEAD blob, git diff HEAD empty. No build/dist involved: the tests import AppHeader by relative src path. (5) A1, measured: vite.resolveConfig of the console config, then bundle buildIdentity.ts with that define. With VITE_APP_VERSION=0707b4ae: define \"0707b4ae\", bundled getConsoleBuild() \"0707b4ae\". With it unset: define \"1c4bed6f91\" (= git HEAD short), bundled read \"1c4bed6f91\". A --depth 1 clone on a detached HEAD answers rev-parse (shallow=true). A dir with no .git gives exit 128, which is caught, nothing is baked, and the fallback text shows. The library (tsc dist) keeps import.meta.env and the app's Vite substitutes it (Vite 8.2.2 merges import.meta.env.* defines via userDefineEnv). Screenshot: NOT taken (a full console build plus a backend does not fit the shared lock budget); the rendered-test reading stands in. (6) Lint narrowed: eslint --no-inline-config --format json on the 17 changed .ts/.tsx files: 17 files counted from the JSON output, 0 errors, 32 warnings (no-explicit-any/no-unused-vars, pre-existing or copied mock shapes), exit 0. Type-aware linting is off (no parserOptions.project in eslint.config.js), so this diff cannot move any untouched file's verdict. (7) All exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs (1 changeset, 2 released packages' source), objectstack check-nul-bytes. check:spec-floors not run (not in the battery). Declared to CI: full packages/app-shell/, packages/i18n/, apps/console/ vitest dirs and pnpm lint. CI at report time: 35 check runs, 3 completed, 27 in_progress (in_progress is the honest value).",
"mcp_calls": "0",
"api_writes": "2 fleet-write relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12976/assignees [baozhoutao], read back byte-identical (6405 B); (2) comment = POST /repos/objectstack-ai/objectui/issues/12970/comments (this report). Plus 2 git pushes (not REST). No label writes, no PATCH.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: the next PR to touch apps/console/docs/error-tracking.md (承接者:无 named) · the VITE_SENTRY_RELEASE row still reads 'Defaults to VITE_APP_VERSION, then unknown', which stays true but omits the new git-sha fallback; outside this claim's file surface · noted in PR Acceptance notes, not filed",
"carrier: cloud seat (objectstack-ai/cloud#2928 Target 2) · cloud's half (one VITE_APP_VERSION build-arg per Dockerfile passing .objectui-sha) is now owed, since objectui reads it once #12976 lands; the triage says that card is filed at this card's landing · not filed by dev"
],
"files_changed": [
".changeset/12970-about-build.md",
"apps/console/vite.config.ts",
"packages/app-shell/src/buildIdentity.ts",
"packages/app-shell/src/layout/AboutDialog.tsx",
"packages/app-shell/src/layout/AppHeader.tsx",
"packages/app-shell/src/observability/sentry.ts",
"packages/app-shell/src/__tests__/buildIdentity-12970.test.ts",
"packages/app-shell/src/layout/__tests__/AppHeader.aboutBuild-12970.test.tsx",
"packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts"
],
"deviations": [
"Runtime build identity (optional) skipped: it needs a new /api/v1/health request path, so the ruling says skip.",
"Screenshot not taken; rendered-test reading recorded instead.",
"Commit trailer is 'Co-authored-by: Claude' per the dispatch; the harness reminder's model-named trailer was not used (role file and AGENTS.md take precedence)."
]
}
PR #12976 at head 1c4bed6, reviewed against the claim 6251645188, triage 6251408625 and the dev report 6252023149.
What changed: every help menu AppHeader draws (one component on both planes: the tenant console and the control plane's home / orgs / Studio bars) gains 「关于」 / "About", opening a new AboutDialog that names the console build. The value is VITE_APP_VERSION from the build environment, or, when unset, the short sha of HEAD that apps/console/vite.config.ts reads with execFileSync('git', ['rev-parse', '--short', 'HEAD']) (no shell). Either is baked as import.meta.env.VITE_APP_VERSION. A build with neither bakes nothing, and the dialog states the i18n fallback ("Unknown build …"), never an empty field. One reader, packages/app-shell/src/buildIdentity.ts, serves both the dialog and Sentry's release fallback (resolveSentryRelease). Five help.about* keys in all ten packs.
Measured (A1): with VITE_APP_VERSION=0707b4ae the bundled read is 0707b4ae; unset, it is the git short sha; a --depth 1 detached clone answers rev-parse; a directory with no .git exits 128, which is caught, and the fallback shows. The library build keeps import.meta.env and the console app's Vite substitutes it.
Skipped, per the ruling: the optional runtime build identity. app-shell has no /api/v1/health read today, and showing it would need a new request path.
Clause-②:no: buildIdentity.ts, AboutDialog.tsx and resolveSentryRelease are not re-exported from @object-ui/app-shell's entry; no runtime-config key. Changeset @object-ui/app-shell, @object-ui/i18n, @object-ui/console: patch.
Tests:buildIdentity-12970 and AppHeader.aboutBuild-12970 (19) pin About on both planes, the baked commit, the stated fallback, and the shared Sentry read. Ablation (the About item removed) turns all 8 About pins red; restore proven by blob hash. The AppHeader.*, Sentry, product-neutral ratchet and i18n parity families pass (372 tests); type-check for app-shell, i18n and the console's node config exits 0; the pre-tsc battery exits 0. No screenshot (a full console build with a backend did not fit the shared verify lock); the rendered-test reading stands in.
Acceptance notes, not filed:apps/console/docs/error-tracking.md's VITE_SENTRY_RELEASE row ("Defaults to VITE_APP_VERSION, then unknown") stays true but omits the new git fallback; for the next PR that touches that page.
Cloud's half: objectstack-ai/cloud#2928's one VITE_APP_VERSION build-arg per Dockerfile (passing .objectui-sha) is owed once this lands, as triage recorded; the landing note points the cloud seat at it.
Trailers: the one commit carries only the model-free pair.
CI at head: all 36 check-runs on 1c4bed6 are complete: 33 success, 3 skipped (dependabot and the two coverage jobs), none failed; mergeable_state: clean. Path surface (18 files, +550 / −2): packages/app-shell/src/**, packages/i18n/src/locales/**, apps/console/vite.config.ts and one changeset; no governed path.
PR #12976 merged through the merge queue as ea34d9b7efbf5391ca39e396167f2b4c2357c75e, which is on main; Fixes #12970 closes this card. Verified by content: all 18 of the PR's files on main are blob-identical to the accepted head 1c4bed6. The merge commit's message names no model.
What landed:
Every console help menu (the tenant console and the control plane) has 「关于」 / "About", naming the console build: VITE_APP_VERSION when the build sets it, else the git short sha the console's Vite config reads; a build with neither states "Unknown build". Sentry's release fallback reads the same value. @object-ui/app-shell, @object-ui/i18n, @object-ui/console: patch.
For cloud (repo:cloud seat 2, objectstack-ai/cloud#2928 Target 2): objectui now reads VITE_APP_VERSION, so cloud's half is due, as triage recorded: one VITE_APP_VERSION build-arg per console Dockerfile, passing .objectui-sha. Without it, a cloud build has no .git in its context and the dialog says "Unknown build". It applies once cloud's objectui pin covers the merge commit above. This seat now removes pm:dispatched.
Activity
objectstack-fleet commentedon Oct 18, 2026
Triage: p3 ·
domain:ui·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-18T15:01ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
/api/v1/healthserves the runtime's build identity, and cloud servesx-objectstack-build-sha.domain:ui. The card's ordering stands: objectui readsVITE_APP_VERSIONfirst, and cloud's one build-arg per Dockerfile follows only once objectui reads it. That cloud half is a card at this card's landing, not before.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Claim: PM loop round 9 (
priority:p3)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12970-about-buildWorktree:
objectui-issue-12970Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/app-shell/src/layout/AppHeader.tsx(the help menu's 「关于」 item and its dialog, or a new small component beside it), the build-time read ofVITE_APP_VERSIONwith a git fallback (the console's Vite config underapps/console/and whatever app-shell module exposes the value;observability/sentry.tsonly to share the same read), the i18n keys the item and dialog need inpackages/i18n/src/locales/*.ts, and tests beside each. Plus one.changeset/12970-*.md. ⛔ No new runtime-config key; ⛔ no cloud Dockerfile change (cloud's half follows this card's landing). Stop on breach; explain in the report.Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility: n/a — not a defect card (objectstack-ai/cloud#2928 Target 2's objectui half)
Thread-read: 6251408625
Serial constraints cleared: no open objectui PR touches
AppHeader.tsx,runtime-config.tsor the console's Vite config. This seat's objectui#12968 also adds keys topackages/i18n/src/locales/*.ts: disjoint key families, so the later PR mergesmainfirst.Claimed at: 2026-10-18T15:24Z
objectstack-fleet commentedon Oct 18, 2026
os-dev-report
{ "issue": 12970, "status": "done", "branch": "claude/issue-12970-about-build", "pr": "https://github.com/objectstack-ai/objectui/pull/12976", "session": "session_01XVp19E1MYUTFM3dnkwz8gB (subagent: the parent's session id)", "premise_still_valid": true, "summary": "Every console bar's help menu now has About (help.about), on both planes: tenant console (app variant) and control plane (home/orgs/studio). A2 measured: one component, AppHeader, draws all of them. About opens a new AboutDialog that names the console build. The value is VITE_APP_VERSION from the build env; when that is unset, apps/console/vite.config.ts reads git rev-parse --short HEAD. Either way it is baked as define import.meta.env.VITE_APP_VERSION. A build with neither shows the i18n fallback 'Unknown build (...)', never an empty field. One shared reader: packages/app-shell/src/buildIdentity.ts (resolveConsoleBuild/getConsoleBuild). Sentry's release fallback now goes through the new resolveSentryRelease, which calls the same reader. Five help.about* keys were added to all ten packs. Runtime build identity: skipped, because app-shell has no /api/v1/health read today and showing it would need a new request path (per the ruling). No runtime-config key, no Dockerfile change, no labels written (objectui: dispatch named none).", "tests": "All at HEAD 1c4bed6f91, every run under os-verify-lock. (1) New files: vitest --maxWorkers=1 on buildIdentity-12970.test.ts + AppHeader.aboutBuild-12970.test.tsx gave 'Test Files 2 passed (2) / Tests 19 passed (19)', VERDICT command-exit 0. (2) Related families: all AppHeader.* suites + observability/sentry.test.ts + product-neutral-renderer.ratchet + i18n dead-pack-keys-retired-8754, residue-namespaces-3546, all-locales-key-parity, en-zh-key-parity, machineLocaleCensus-9909 gave 'Test Files 33 passed (33) / Tests 372 passed (372)', exit 0. (3) Closure build turbo build --filter=@object-ui/app-shell^... --concurrency=2: 28/28 tasks, exit 0. type-check app-shell exit 0 (tsconfig.test.json includes src/**/*.test.ts(x)), i18n exit 0, apps/console tsc -b tsconfig.node.json --force exit 0. (4) Ablation via objectstack scripts/ablation-replace.mjs: anchor = the whole About DropdownMenuItem, hit x1 then x0, blob b1af036b0a0f -> 8f5f9e1872db. AppHeader.aboutBuild suite 'Tests 8 failed (8)'. Restore: blob after restore b1af036b0a0f == HEAD blob, git diff HEAD empty. No build/dist involved: the tests import AppHeader by relative src path. (5) A1, measured: vite.resolveConfig of the console config, then bundle buildIdentity.ts with that define. With VITE_APP_VERSION=0707b4ae: define \"0707b4ae\", bundled getConsoleBuild() \"0707b4ae\". With it unset: define \"1c4bed6f91\" (= git HEAD short), bundled read \"1c4bed6f91\". A --depth 1 clone on a detached HEAD answers rev-parse (shallow=true). A dir with no .git gives exit 128, which is caught, nothing is baked, and the fallback text shows. The library (tsc dist) keeps import.meta.env and the app's Vite substitutes it (Vite 8.2.2 merges import.meta.env.* defines via userDefineEnv). Screenshot: NOT taken (a full console build plus a backend does not fit the shared lock budget); the rendered-test reading stands in. (6) Lint narrowed: eslint --no-inline-config --format json on the 17 changed .ts/.tsx files: 17 files counted from the JSON output, 0 errors, 32 warnings (no-explicit-any/no-unused-vars, pre-existing or copied mock shapes), exit 0. Type-aware linting is off (no parserOptions.project in eslint.config.js), so this diff cannot move any untouched file's verdict. (7) All exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs (1 changeset, 2 released packages' source), objectstack check-nul-bytes. check:spec-floors not run (not in the battery). Declared to CI: full packages/app-shell/, packages/i18n/, apps/console/ vitest dirs and pnpm lint. CI at report time: 35 check runs, 3 completed, 27 in_progress (in_progress is the honest value).", "mcp_calls": "0", "api_writes": "2 fleet-write relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12976/assignees [baozhoutao], read back byte-identical (6405 B); (2) comment = POST /repos/objectstack-ai/objectui/issues/12970/comments (this report). Plus 2 git pushes (not REST). No label writes, no PATCH.", "open_questions": [], "out_of_scope_findings": [ "carrier: the next PR to touch apps/console/docs/error-tracking.md (承接者:无 named) · the VITE_SENTRY_RELEASE row still reads 'Defaults to VITE_APP_VERSION, then unknown', which stays true but omits the new git-sha fallback; outside this claim's file surface · noted in PR Acceptance notes, not filed", "carrier: cloud seat (objectstack-ai/cloud#2928 Target 2) · cloud's half (one VITE_APP_VERSION build-arg per Dockerfile passing .objectui-sha) is now owed, since objectui reads it once #12976 lands; the triage says that card is filed at this card's landing · not filed by dev" ], "files_changed": [ ".changeset/12970-about-build.md", "apps/console/vite.config.ts", "packages/app-shell/src/buildIdentity.ts", "packages/app-shell/src/layout/AboutDialog.tsx", "packages/app-shell/src/layout/AppHeader.tsx", "packages/app-shell/src/observability/sentry.ts", "packages/app-shell/src/__tests__/buildIdentity-12970.test.ts", "packages/app-shell/src/layout/__tests__/AppHeader.aboutBuild-12970.test.tsx", "packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts" ], "deviations": [ "Runtime build identity (optional) skipped: it needs a new /api/v1/health request path, so the ruling says skip.", "Screenshot not taken; rendered-test reading recorded instead.", "Commit trailer is 'Co-authored-by: Claude' per the dispatch; the harness reminder's model-named trailer was not used (role file and AGENTS.md take precedence)." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
ACCEPT ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-18T16:12ZPR #12976 at head
1c4bed6, reviewed against the claim6251645188, triage6251408625and the dev report6252023149.AppHeaderdraws (one component on both planes: the tenant console and the control plane's home / orgs / Studio bars) gains 「关于」 / "About", opening a newAboutDialogthat names the console build. The value isVITE_APP_VERSIONfrom the build environment, or, when unset, the short sha ofHEADthatapps/console/vite.config.tsreads withexecFileSync('git', ['rev-parse', '--short', 'HEAD'])(no shell). Either is baked asimport.meta.env.VITE_APP_VERSION. A build with neither bakes nothing, and the dialog states the i18n fallback ("Unknown build …"), never an empty field. One reader,packages/app-shell/src/buildIdentity.ts, serves both the dialog and Sentry's release fallback (resolveSentryRelease). Fivehelp.about*keys in all ten packs.VITE_APP_VERSION=0707b4aethe bundled read is0707b4ae; unset, it is the git short sha; a--depth 1detached clone answersrev-parse; a directory with no.gitexits 128, which is caught, and the fallback shows. The library build keepsimport.meta.envand the console app's Vite substitutes it.app-shellhas no/api/v1/healthread today, and showing it would need a new request path.no:buildIdentity.ts,AboutDialog.tsxandresolveSentryReleaseare not re-exported from@object-ui/app-shell's entry; no runtime-config key. Changeset@object-ui/app-shell,@object-ui/i18n,@object-ui/console:patch.buildIdentity-12970andAppHeader.aboutBuild-12970(19) pin About on both planes, the baked commit, the stated fallback, and the shared Sentry read. Ablation (the About item removed) turns all 8 About pins red; restore proven by blob hash. TheAppHeader.*, Sentry, product-neutral ratchet and i18n parity families pass (372 tests); type-check for app-shell, i18n and the console's node config exits 0; the pre-tsc battery exits 0. No screenshot (a full console build with a backend did not fit the shared verify lock); the rendered-test reading stands in.apps/console/docs/error-tracking.md'sVITE_SENTRY_RELEASErow ("Defaults toVITE_APP_VERSION, then unknown") stays true but omits the new git fallback; for the next PR that touches that page.VITE_APP_VERSIONbuild-arg per Dockerfile (passing.objectui-sha) is owed once this lands, as triage recorded; the landing note points the cloud seat at it.1c4bed6are complete: 33 success, 3 skipped (dependabot and the two coverage jobs), none failed;mergeable_state: clean. Path surface (18 files, +550 / −2):packages/app-shell/src/**,packages/i18n/src/locales/**,apps/console/vite.config.tsand one changeset; no governed path.Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 18, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-18T16:29ZPR #12976 merged through the merge queue as
ea34d9b7efbf5391ca39e396167f2b4c2357c75e, which is onmain;Fixes #12970closes this card. Verified by content: all 18 of the PR's files onmainare blob-identical to the accepted head1c4bed6. The merge commit's message names no model.What landed:
VITE_APP_VERSIONwhen the build sets it, else the git short sha the console's Vite config reads; a build with neither states "Unknown build". Sentry's release fallback reads the same value.@object-ui/app-shell,@object-ui/i18n,@object-ui/console:patch.For cloud (
repo:cloudseat 2, objectstack-ai/cloud#2928 Target 2): objectui now readsVITE_APP_VERSION, so cloud's half is due, as triage recorded: oneVITE_APP_VERSIONbuild-arg per console Dockerfile, passing.objectui-sha. Without it, a cloud build has no.gitin its context and the dialog says "Unknown build". It applies once cloud's objectui pin covers the merge commit above. This seat now removespm:dispatched.Generated by Claude Code