Skip to content

docs(changeset): the read-rate banner and its hook are not exported from the package entry (objectui#10913) - #10954

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10913-read-rate-banner-export-claim-2
Sep 28, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-10913-read-rate-banner-export-claim-2

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #10913
Clause-②: no

Supersedes PR objectui#10949, which was re-cut to drop a model-named commit trailer: this head d28ba66c9 (base 5c94589f0) carries the same diff (stable patch-id 2e6c60c1 for both commits), so the measurements below, taken at 1df262efb, carry over, and the changeset gates and check-control-bytes were re-run on this head with exit 0.

What this does

The pending changeset .changeset/9954-read-rate-banner.md says that useReadRateReading and ReadRateBanner are exported from @object-ui/app-shell. The package entry exports neither of them. A pending changeset is published verbatim into the CHANGELOG at the next release, so this sentence would ship false. An author who read it and imported either name would get a module-not-exported error.

The fix edits that one sentence, as triage 5865850392 execution note 1 directs:

  • Before: "Both are exported from @object-ui/app-shell."
  • After: "Neither is exported from the package entry; a host reaches the banner only through ConsoleShell, which mounts it."

The sentence before it already says the banner is "mounted in ConsoleShell", so the paragraph now says both things triage asked for. The wording follows the sibling entry .changeset/10439-storage-usage-banner.md from PR objectui#10910, which says "Neither banner is exported from the package entry." The frontmatter is byte-identical: the md5 of the frontmatter block is 968447af at base 3b469c8ea and at head. git diff --numstat gives 2 insertions and 1 deletion in this one file. The only other change is the line wrap of the replaced sentence.

Premise, re-measured at base 3b469c8ea (still true at origin/main 5c94589f0, which changed none of these files)

  • packages/app-shell/src/index.ts: grep -c ReadRate gives 0. As a control, grep -c ConsoleShell on the same file gives 2, so the instrument does read the entry. The entry imports named members from ./hooks/index.js and ./layout/index.js. It has no export * from either, and neither named list includes the read-rate hook, its types, classifyReadRate, or the banner. The two sub-barrels do list the pair, but nothing outside the package can address them.
  • packages/app-shell/package.json exports maps only . and ./styles.css.
  • ConsoleShell renders the private ConsoleShellProviders, and that component mounts ReadRateBanner beside ImpersonationBanner and StorageUsageBanner. Outside tests, ConsoleShell.tsx is the only module that imports ReadRateBanner. ConsoleShell itself is exported from the entry.
  • The changeset is still pending. It is on main, and release PR objectui#5400 is still open.

No new changeset, and why the edit is in place

  • check-changeset-presence says none is owed: the diff touches .changeset/ only.
  • check-changeset-overwrite is report-only. It lists this file as a pre-existing changeset that was modified, with the declared packages identical at base and head (@object-ui/app-shell: minor, @object-ui/i18n: minor). That is its case 2, a deliberate prose correction. The precedents PR objectui#10828 and PR objectui#10891 got the same report-only reading and landed with no new changeset.
  • Those two precedents appended dated supersession notes and deleted nothing. Their sentences were true when written and a later PR made them false. This sentence was false when it was written: the entry has never exported the pair. Triage's binding note says to edit the sentence itself, and changeset-polarity-census says the same in its own output: "ROTTED and BORN FALSE take opposite repairs".

Gates (at head 1df262efb, hand-derived from package.json and .github/workflows/, each exit captured by redirect-then-status)

Command Verdict line Exit
node scripts/check-changeset-presence.mjs ✅ No source or published contract of a released package changed in this range, so no changeset is owed. 0
node scripts/check-changeset-claims.mjs ✅ No pending changeset names a file this change touches. 0
node scripts/check-changeset-overwrite.mjs report-only: 1 modified, declared packages identical at base and head 0
node scripts/check-changeset-no-major.mjs ✅ No changeset declares a major bump. 0
node scripts/check-changeset-fixed.mjs ✅ All workspace packages are in the changeset fixed group. 0
node scripts/check-pending-changeset-literals.mjs ✅ No test source names a pending changeset. 0
node scripts/check-control-bytes.mjs ✅ check-control-bytes: OK 0
node scripts/check-new-cross-file-line-citations.mjs VERDICT new-cross-file-line-citations: 0 new citation(s) 0
node scripts/check-spec-symbol-derivation.mjs ✅ spec member citations: nothing cites a key its spec symbol does not declare. 0
node scripts/check-installed-spec-pin-claims.mjs OK (it excludes .changeset/, so it was run for completeness only) 0
node scripts/check-governed-queue-guard.mjs --test (the one path) ✅ NOT GOVERNED 0

Tests. These ran from the repo root, under the shared verify lock, at head 1df262efb. The set is every scripts/__tests__ test file that names .changeset, derived with git grep -l (24 files), plus the suites of the other scripts that read .changeset/ (9 files). Result: Test Files 33 passed (33), Tests 1451 passed (1451), lock VERDICT command-exit 0.

No package test or type-check was run, and none is owed: the diff touches no package, and no gate above reads dist/. The Spec Main Shape Gate and the rest of CI run on the PR.

Session of this run: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk (the domain:ui seat #1 dispatch, dev subagent).


Generated by Claude Code

…rom the package entry (objectui#10913)

The pending 9954-read-rate-banner changeset said `useReadRateReading` and
`ReadRateBanner` are exported from `@object-ui/app-shell`. The package entry
names neither: its named re-exports from the hooks and layout sub-barrels
leave both out, and `exports` addresses only `.` and `./styles.css`. The
sentence now says neither is exported and that a host reaches the banner
through `ConsoleShell`, which mounts it. The frontmatter is byte-identical.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuWo5bdP9SdVebamn99GGk
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: d28ba66c99073450bc682b13a71ed39084ddac3c

Scope: PR objectui#10954, card objectui#10913. One commit on claude/issue-10913-read-rate-banner-export-claim-2, parent 5c94589f0 (the PR base). git diff --numstat against the merge base: 2 1 .changeset/9954-read-rate-banner.md, one file. Read 2026-09-28T10:57Z at objectui origin/main 06a96e948, which changed none of the files named below since the base. Successor of PR objectui#10949 (1df262efb, closed unmerged 2026-09-28T10:51:09Z): git patch-id --stable gives 2e6c60c1c9aaff0ada2c91c0b464c8fb68e78718 for both commits and the changeset blob is e53cf5683 on both heads. Dev report 5868163799 was read as a claim; every measurement below is this reviewer's own.

① Derived judgments

The new sentence, "Neither is exported from the package entry; a host reaches the banner only through ConsoleShell, which mounts it.", is TRUE of main:

  • packages/app-shell/src/index.ts at origin/main: grep -c ReadRate = 0, control grep -c ConsoleShell = 2. The file has no export *. Its two re-export lists from ./hooks/index.js and ./layout/index.js are named lists, and neither names useReadRateReading, ReadRateBanner, classifyReadRate or any read-rate type. The two sub-barrels do list the pair; nothing exports the barrels themselves. index.ts is identical at the head and at origin/main.
  • packages/app-shell/package.json exports maps only . and ./styles.css, so no subpath reaches src/hooks or src/layout. No file under apps/ or examples/ deep-imports @object-ui/app-shell/src or /dist.
  • ConsoleShell IS exported from the entry, in the ./console/ConsoleShell.js block. It renders the module-private ConsoleShellProviders, which mounts ReadRateBanner beside ImpersonationBanner and StorageUsageBanner. ConnectedShell, the other shell exported from that module, mounts only the data layer.
  • "only through ConsoleShell" does not overclaim. Outside tests, ConsoleShell.tsx is the only importer of ReadRateBanner in the repository (the layout barrel re-exports it, and nothing outside the package can address the barrel). ConsoleLayout and ConsoleNotificationBanners, both exported, do not mount it, and the banner's own docblock records why both were rejected. The hook is reachable from no export at all, which "Neither is exported" covers.
  • The rest of the changeset still holds at origin/main: useAiUsage sits in the same hooks barrel; the three pinned properties map to useReadRateReading.test.tsx (an absent readRate reported as unmeasured, an absent readsPerWrite classified as the no-writes case, state read and never re-derived) and to ReadRateBanner.test.tsx (the no-writes wording, the threshold taken from the wire, admin-only with no request from an ordinary session); the banner gates the request on useWorkspaceAdminStatus; each of the ten locale packs carries exactly four console.readRate.* keys. The edited paragraph reads coherently: line 16 still says "mounted in ConsoleShell", and the new sentence adds the non-export fact and the host's one route to the banner.
  • Frontmatter: byte-identical to origin/main's. Lines 1 to 4 diff empty, md5 968447afe5dcc68a61ebd72735515e1f on both sides.
  • Commit message at the head (git log -1 --format=%B): no model name. The trailer pair is Co-Authored-By: Claude plus Claude-Session:. Observation, not a defect: the last 30 agent commits on main spell the key Co-authored-by; git and GitHub read trailer keys case-insensitively, and no objectui gate reads the commit message.

② Semver level

Declared bumps unchanged: '@object-ui/app-shell': minor and '@object-ui/i18n': minor, the same bytes as origin/main. No new changeset is owed: the diff touches .changeset/ only, and no released package source or published contract changed. Head check-runs on d28ba66c9, read over REST: 41 runs, 38 success, 3 skipped (Test (coverage), the coverage shard matrix placeholder, dependabot). Every changeset gate is success: Changeset Declaration, Changeset Claim Re-read, Changeset Overwrite Report, Changeset Bump Policy, Changeset Fixed Group Check. Control Byte Scan, Line Citation Gate, Lint, Type Check, Test shards 1 to 8, Test (dist pins), Build and E2E, Spec Main Shape Gate: all success.

③ Boundary flags

  • In-place edit versus dated note: the sentence WAS born false. The changeset's only commit on main is its adding commit c698a814a (PR objectui#10052, 2026-09-20). index.ts at that commit: 0 ReadRate hits, control 2, no export *. git log -S ReadRate on index.ts over the whole history returns nothing (control -S ConsoleShell returns one commit). The in-place edit that triage 5865850392 note 1 directs is the right repair; the two dated-note precedents repaired sentences a later PR had rotted, which is not this case.
  • PR body: no angle brackets, no path:NN line addresses, no model name. Every checkable claim re-measured true: numstat 2/1, frontmatter md5 968447af, patch-id 2e6c60c1, sole importer, ConsoleShell exported, base 3b469c8ea equal to 5c94589f0 on every named file, and check-changeset-overwrite's own case 2 ("prose that no longer matches the change") is the report-only reading it gives. The gate table is stamped at 1df262efb and says so; the check-runs above are the evidence for this head.
  • Release PR objectui#5400 is OPEN (changeset-release/main, last updated 2026-09-18). .changeset/9954-read-rate-banner.md is still on origin/main 06a96e948, its blob unchanged from the PR base. Not moot.
  • PR objectui#10949 is closed unmerged with a comment naming this successor. Its commit 1df262efb carries the model-named trailer, and nothing from it lands.

Defects found: none.

Implemented-by: claude/issue-10913-read-rate-banner-export-claim-2
Reviewed-by: session_01DuWo5bdP9SdVebamn99GGk

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 28, 2026 10:59
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 28, 2026
Merged via the queue into main with commit a4fb708 Sep 28, 2026
43 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-10913-read-rate-banner-export-claim-2 branch September 28, 2026 11:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants