Repository navigation
fix(app-shell): a rolled-back Studio publish shows its "Nothing was published" banner again (objectui#11985) - #11994
Merged
objectstack-fleet[bot] merged 1 commit intoOct 8, 2026
Conversation
formatPublishFailures compared the rolled-back sibling code to a lower-case 'batch_aborted', while publishPackageDrafts emits 'BATCH_ABORTED'. The banner branch never ran: the author got one parallel line per draft. BATCH_ABORTED_CODE is now 'BATCH_ABORTED', compared exactly (no case-folding), and tied to the spec's error-code ledger with a type-only 'satisfies RegisteredErrorCode'. The test fixtures use the producer's spelling, and a new pin covers the producer's rollback answer plus a causal-only control. publishRefusal.ts's header sentence describing the old bug is corrected (comment only). Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
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
Size Limits
|
objectstack-fleet
Bot
deleted the
claude/issue-11985-batch-aborted-banner
branch
October 8, 2026 17:53
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #11985
Clause-②: no
What changes
Studio's publish message comes from
formatPublishFailuresinpackages/app-shell/src/views/studio-design/metadataError.ts. It told a rolled-back sibling apart withBATCH_ABORTED_CODE = 'batch_aborted', compared with===. ButpublishPackageDraftsgives each rolled-back siblingcode: 'BATCH_ABORTED'. So the banner branch never ran, and the author got one parallel line per draft.BATCH_ABORTED_CODEis now'BATCH_ABORTED'and is compared exactly, with no case-folding (triage direction6063923729).'BATCH_ABORTED' satisfies RegisteredErrorCode, throughimport type { RegisteredErrorCode } from '@objectstack/spec/api'.ERROR_CODE_LEDGER), and importing that at runtime would add bytes.Bundle Analysisis the reading.RegisteredErrorCodeand the ledger's'BATCH_ABORTED'entry are in both@objectstack/spec@17.6.0(the floor of app-shell's range) and17.7.0(the lockfile's resolution).PublishFailure.codeand the docblock on the function now name the producer's spelling.packages/app-shell/src/preview/publishRefusal.ts, comment only: its header gave this renderer's case bug as one reason the package doors do not reuseformatPublishFailures. That sentence is now false. It is replaced by the reason that still holds (the English banner) and a note on how the two compare the code.StudioDesignSurface.tsx'sdoPublish, and the AI chat page's publish summary, get the fix through the formatter..changeset/11985-batch-aborted-banner.md,patchon@object-ui/app-shell. Nothing is added to the package entry:BATCH_ABORTED_CODEandformatPublishFailuresare not exported frompackages/app-shell/src/index.ts.Tests
metadataError.test.ts, the existing fixtures now use the producer's spelling (BATCH_ABORTED,INVALID_METADATA).formatPublishFailures on the producer rollback answer (objectui#11985):object/leadplus twoBATCH_ABORTEDsiblings, each carrying the producer's own sentence. The output has three lines: the "Nothing was published" banner first, thenobject/lead: failed spec validation, then2 other drafts aborted. Neither sibling is listed.ablation-replaceput back the oldexport const BATCH_ABORTED_CODE = 'batch_aborted';with anchor 1 to 0 and blobbf192cc32060to19ad0503540a. Result:Tests 3 failed | 2 passed (5).bf192cc32060) andgit diff HEADempty.'BATCH_ABORTEDX'andtsc --noEmitfailed witherror TS1360: Type '"BATCH_ABORTEDX"' does not satisfy the expected type(the ledger union). So the check reads the built spec type, not a cache. It was restored with blob == HEAD andgit diff HEADempty. The old lower-case spelling would fail the same way, so a return to it no longer compiles.Gates (all at HEAD
34eda28f5, run from the worktree root)pnpm exec turbo run build --filter='@object-ui/app-shell^...' --concurrency=2:Tasks: 28 successful, 28 total,TURBO_EXIT=0.pnpm --filter @object-ui/app-shell type-check(echoestsc --noEmit && tsc -p tsconfig.test.json;tsconfig.test.jsonincludessrc/**/*.test.ts): exit 0.pnpm exec vitest runonmetadataError.test.tsalone:Tests 5 passed (5).pnpm exec vitest runon the narrowed publish-path set, 15 files:Test Files 15 passed (15),Tests 76 passed (76).pnpm exec eslinton the three touched.tsfiles,--format json: 3 files, 0 errors, 0 warnings.pnpm check:control-bytes,pnpm check:test-path-roots,pnpm check:changeset-claims,pnpm check:pending-changeset-literals: each exit 0, each with its own OK line.node scripts/check-changeset-presence.mjs: exit 0.pnpm check:new-line-citations:0 new citation(s), exit 0.node scripts/check-governed-queue-guard.mjs --testover the four paths:NOT GOVERNED.Declared narrowing: the whole
packages/app-shell/suite was NOT MEASURED locally. CI runs all of it in its shards.--maxWorkers=2) held the shared verify lock for 29m51s without finishing, while another dev's run waited behind it. I stopped my own run (exit 143).git grep -il batch_abortedover*.test.tsand*.test.tsx: three files,metadataError.test.tsamong them as the positive control). It also includes every publish-path test of both callers and of the two sibling doors.formatPublishFailures, and no test imports it. So a test's verdict can change only if it sends a code spelledbatch_abortedorBATCH_ABORTEDthrough that function.eslint.config.js: itsfiles: ['**/*.{ts,tsx}']blocks cover the three touched.tsfiles, and the changeset.mdis outside everyfilesglob.parserOptions.projectorprojectService, so linting is not type-aware. No rule undereslint-rules/reads the filesystem. So this diff cannot change the verdict on any file it does not touch.Acceptance notes
BATCH_ABORTEDexactly, as triage directed.refusedItemsTextinpublishRefusal.ts, and the rollback check inPackagesPage.tsx'spublishDrafts) still useerrorCodeIs(f, 'BATCH_ABORTED'), which ignores case.AiChatPage.tsx(a caller, off the surface) keeps a code comment that describes the publish answer as an item plusbatch_abortedmarkers. That comment now names a spelling the producer never emits. It is prose only. Carrier: the next PR that touches that file. Noted here, not filed.origin/main7b926f76,publishPackageDraftsinpackages/metadata-protocol/src/protocol.ts: the rollback branch setscode: 'BATCH_ABORTED'on each sibling.@objectstack/spec@17.6.0and17.7.0tags lists'BATCH_ABORTED'inERROR_CODE_LEDGER.fff07fbbahad the lower-case constant and lower-case fixtures.6064407722. A second claim (6064415932) arrived 28 s later and was withdrawn in6064445227before the first edit.Session:
https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8Generated by Claude Code