docs(collaboration): compile the collaboration README's 7 blocks and drop its ledger entry - #8017
Merged
Merged
Conversation
…drop its ledger entry Every ts/tsx block in packages/collaboration/README.md now compiles against the built types, so the document leaves UNGATED_DOCS in scripts/check-doc-snippet-types.mjs. The gate file's only change is the two lines of that one entry. Five of the 18 measured diagnostics were real drift rather than fragment shape: usePresence ships as usePresence(sendPresence, config) and returns updateCursor, not updatePresence; PresenceConfig has no channel key; RealtimeSubscriptionConfig has no event key and RealtimeResult has no data field; useConflictResolution takes (userId, userName?) and returns resolveConflict; CommentThreadProps requires comments and currentUser and has onAddComment, not onSubmit. The README now spells each of them the way the shipped dist/*.d.ts declares it. The remaining blocks were continuation fragments and gained real self-imports plus declare-const placeholders typed to the shipped surface. No packages/** source touched, no public type widened, no gate loosened, and no new fragment marker: declared fragments stay at 158. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Batch 18 (PR #8009) and objectui#7307 batch 2 (PR #8013) landed while this batch was measuring. Both gate-file changes are removals inside UNGATED_DOCS on different lines, for different documents. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
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
|
Contributor
|
Standing-down note — Generated by Claude Code |
baozhoutao
marked this pull request as ready for review
September 6, 2026 10:21
baozhoutao
pushed a commit
that referenced
this pull request
Sep 6, 2026
Batch 19 (PR #8017, packages/collaboration/README.md) and objectui#7692 (PR #8016) landed while this batch was measuring. The two UNGATED_DOCS removals are different lines of the same object literal, so the merge is clean; every gate, test, probe and reading is re-run on the merged head. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
This was referenced Sep 6, 2026
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.
Part of #5174 — batch 19 of the
UNGATED_DOCSburn-down.packages/collaboration/README.mdleaves the ledger and all 7 of its ts/tsxblocks now compile against the built types. The gate file's only change is the
two lines of that one entry.
Notation, read this first
This repository has measured that GitHub's body sanitizer deletes tag-shaped
fragments even inside backticks and fenced blocks, which is how a before/after
table can render as though nothing changed. So generic parameters and JSX
elements are spelled out in words below — "RealtimeResult of unknown", "the
LiveCursors element" — rather than in their real angle-bracket form. The README
itself carries the real spellings; this page does not.
Batch 18 (PR #8009) and objectui#7307 batch 2 (PR #8013) both merged while
this batch was measuring.
origin/mainmoved from28cfff4toeeda78a, soorigin/mainwas merged into this branch (merge commit83be4e9) and everygate, test, probe and reading reported below was re-run on the merged head after
a second forced rebuild. The merge was clean: batch 18's removal and this one
are two line deletions in the same object literal, on different lines, for
different documents.
No open pull request touches
packages/collaboration/README.mdor the gatefile — all 7 open PRs' file lists were read at the final head.
packages/auth/README.mdis still held by draft PR #7685 (67 paths, read again here).
Live E2E (informational)is red on every branch today for an upstream reason(objectui#7990 / objectstack#16186), not because of this diff.
Ledger arithmetic
eeda78a83be4e9UNGATED_DOCSentriesBoth rows were MEASURED, not computed: the base row is a real
pnpm check:doc-snippetsrun with both changed files checked out atorigin/mainbytes (on-disk hashes proven equal to theorigin/mainblobs) andrestored afterwards under a trap.
Programmatic diff of the two
UNGATED_DOCSobjects (both imported as objects,never diffed as text): removed =
['packages/collaboration/README.md'],added =
[], reason-changed =[], key order preserved for survivors = true,survivors = 18.
git diff --numstaton the gate file is exactly0 2.The strictness region — the
Fence scanningbanner line to EOF, 1178 lines onboth sides — hashes to
f46b5662ba336f026bca3a0003e0b7979789d48d0291fa5760be7d23c8ed0160onorigin/mainand on the branch. Re-measured here rather than inherited; it isthe value batches 15 to 18 recorded, as it must be with nothing landing in the
region since.
Census and the rung that decided
Re-taken on this branch's base through the gate's exported
analyze()/compileSnippets()over every non-excluded ledger candidate — first on theoriginal base
28cfff4(20 entries, 16 candidates), then again on thepost-merge base
eeda78a(19 entries, 16 candidates). Both runs give the sametable and the same pick.
Rung 1 (larger measured debt: blocks, then diagnostics) TIES at 7 blocks / 18
diagnostics. Rung 2 (more distinct diagnostic codes) decided: 7 against 4.
Collaboration's 7 codes: TS2304x10 TS2339x2 TS7006x2 TS2353x1 TS2552x1 TS2554x1
TS2739x1. Permissions' 4: TS2304x12 TS2322x4 TS2345x1 TS2353x1.
The dispatch's assumption A1 is CONFIRMED on both bases, tie and tie-break
alike. Exclusions re-verified against GitHub on this base, not inherited: the
root
README.mdis not apackages/NAME/README.md;packages/auth/README.mdis held by open draft PR #7685;
packages/plugin-gantt/README.mdwas batch 18'sand has now landed, so it is out of the ledger entirely rather than merely
reserved;
packages/plugin-chatbot/README.mdis deferred by an earlier rulingon the card.
A2 is CONFIRMED: the gate reads README bytes from the working tree and
compiles against BUILT types, so the forced package build came first, twice —
once on
28cfff4and again after the merge.What the 18 diagnostics were, and what each repair did
Zero parse failures, zero bound failures: all 18 were semantic. Five of them
were real drift — the README taught an API this package has never shipped —
and the rest were continuation-fragment shape. Every replacement was checked
against
packages/collaboration/dist/*.d.tsafter the forced build.usePresencecalled with ONE argument and achannelkey, destructuringupdatePresence;useRealtimeSubscriptiongiven aneventkey and destructured fordata; an ambientEditorname; an implicitly-anyposparameter; the CommentThread element missing two required propsusePresence(sendPresence, config)with the config'suserkey, destructuringupdateCursor;useRealtimeSubscriptionwithchannelonly, destructuringlastMessage; theEditorelement replaced by a plain div carrying the same cursor handler, whose event parameter now types itself;commentsandcurrentUsersupplied fromdeclare constplaceholders typed to the shippedCommenttypeevent: 'update'is not a key ofRealtimeSubscriptionConfig, anddatais not a field of RealtimeResulteventdropped; destructureslastMessage,messages,connectionState,error, which the interface really declareschannel;updatePresencedestructuredusers,updateCursor,currentUserresourceIdobject;resolvedestructureduseConflictResolution('user-1', 'Alice')— the declared(userId, userName?, config?)— destructuringresolveConflictLiveCursorsandpresenceUsersboth undefineddeclare const presenceUserstypedPresenceUser[], and the element bound to a name with no re-indentationonSubmitis not a prop ofCommentThreadProps,currentUseris required and was absent, andcomments/saveCommentwere ambientcomments,currentUserand the save callback, andonAddComment— the prop the component really declares, with its real(content, mentions)arityEvery one of these five contradictions is between the README and the SHIPPED
type of the same package, so each is corrected in the README, per this card's
standing ruling. None is a contradiction between two shipped surfaces, so
nothing here is deferred to a maintainer the way batch 18's registry gap was
(objectui#8008).
No
packages/**source touched, no public type widened, no lenient alias added,no gate loosened, and no new fragment marker — declared fragments stay at
158, so all 7 blocks earn their coverage by COMPILING.
Probes — one base measurement and six probes, each predicted in writing first
Predictions were written to the scratchpad before any leg ran. Every mutation is
proven on disk by occurrence counts of BOTH the injected and the deleted text
plus
git hash-objectagainst the HEAD blob; every restore isgit checkout HEAD -- ABSOLUTE_PATH, never a bare checkout, proven by an emptygit diff HEAD; every leg runs under atrapwith absolute paths. No rebuild isowed on any leg, and that was reasoned rather than assumed: the gate reads the
mutated bytes straight from the working tree and no leg touches
dist/.207 covered … 20 ungated,668 — 510 to compile,510 of 510 judged, 0 failed28cfff4. (Re-run oneeda78afor the table above:208 covered … 19 ungated,686 — 528 to compile.)207 covered (105 …), 20 ungated,668 — 510 to compile,510 of 510 judged, 0 failed. The entry is what suppressed the verificationpresenceUsersfromPresenceUser[]tonumber[], aimed BY LINE so the sibling block keeps its own declaration517 of 517 judged, 1 failed,README.md:113:30 TS2322: Type 'number[]' is not assignable to type 'PresenceUser[]'— exactly one, and the PresenceAvatars block stayed greenLiveCursorsNope)check:readme-exportscontrol green first, then exit 1 with 1 fabricated459 real, 0 wrong-path, 0 fabricated; mutated exit 1,458 real, 0 wrong-path, 1 fabricated, namingpackages/collaboration/README.md:109updateCursortoupdatePresencein the Quick Start blockPresenceResult1 failed,README.md:42:18 TS2339: Property 'updatePresence' does not exist on type 'PresenceResult'event: 'update'to the subscription config1 failed,README.md:75:3 TS2353: … 'event' does not exist in type 'RealtimeSubscriptionConfig'P5 and P6 exist because five of this diff's repairs are corrections of the
documented API rather than fragment plumbing: they show the gate reds on each
lie individually, so the repair is load-bearing and not cosmetic.
P4's FIRST attempt was a no-op and is reported rather than quietly retried: the
line anchor was off by one and landed on a blank line, the on-disk proof caught
it — injected count 0, hash unchanged — and the leg refused to run. The anchor
was corrected and the whole probe, control leg included, was re-run.
Gates — all at
83be4e9, clean tree, nothing pushed afterExit codes captured by redirect-then-capture, never read through a pipe; each row
quotes the gate's own verdict line.
pnpm check:doc-snippetsScanned 227 document(s): 209 covered (107 of them hold a ts/tsx block), 18 ungated·535 of 535 block(s) judged, 0 failed·Every covered documentation snippet compiles against the built types.pnpm check:doc-fencesevery TypeScript block in 227 document(s) is fenced ts/tsx/typescriptpnpm check:readme-exports465 of them self-imports judged (465 real, 0 wrong-path, 0 fabricated)pnpm check:doc-typesEvery documented component type is registered.node scripts/check-doc-links.mjsLinks are valid across 17 scan roots.pnpm check:doc-example-readersOK 80 documented symbol(s), 3947 call site(s)pnpm check:control-bytesOK (scanned 6444 tracked text file(s); skipped 85 binary); plus a manual C0/DEL scan of both changed paths, no hitnode scripts/check-node-esm-load.mjsProvenance leg: 37 of 37 gradable entries were built by this tree.pnpm type-check:scriptsnode scripts/check-changeset-presence.mjsno changeset is owed(2 files changed, 0 of them published source of a released package)check-governed-queue-guard.mjs --test(both paths)NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matchedThe build came first and was FORCED, both before the merge and again after it:
turbo run build --filter=./packages/* --concurrency=2 --force,39 successful, 0 cached. Forced because turbo shares one cache across every worktree of acheckout and
check-node-esm-load's provenance leg refuses artifacts adifferent tree produced — the failure batch 17 measured. Every reading here
rests on
dist/this tree produced.Tests:
pnpm exec vitest runover every test file that reads either changedpath, derived with
git grep -lon both paths and not guessed — 16 files,Test Files 16 passed (16) / Tests 597 passed (597). That set includesscripts/__tests__/check-doc-snippet-types.test.ts, which this diff's ownedited script owes, and
scripts/__tests__/doc-version-claims.test.ts, whichnames this README path and which a docs-only diff would otherwise reach only
inside the merge-group build. Owning package:
pnpm exec vitest run packages/collaboration/—Test Files 5 passed (5) / Tests 72 passed (72);pnpm --filter @object-ui/collaboration type-checkexit 0, its output echoing
tsc --noEmit && tsc -p tsconfig.test.jsonso thetest tsconfig really is included.
Lint, as a declared narrowing with its three evidence items:
pnpm linthere is
turbo run lintper package, so the repository-wide sweep is CI's run.The narrowed run over exactly this diff is
pnpm exec eslint --no-inline-config --format jsonon both paths — 2 entries,0 errors; eslint's own answer for the README is
File ignored because no matching configuration was supplied, so the real lint surface of this diff isthe one
.mjsat 0 errors / 0 warnings. (1) The population eslint wouldotherwise judge is 4354 files by its own count. (2) That run exits 1 with 93
errors and 12145 warnings, all of them in files this diff does not touch and all
pre-existing on the base — reported rather than smoothed, so nobody reads the
narrowed green as a statement about the repository. (3)
eslint.config.jsdeclares no
project/projectService/parserOptions.project(grep count0), so type-aware linting is off and this diff cannot move the verdict on any
untouched file.
Readers of the changed paths
Derived with
git grep -lfor the README path and for the package name overscripts/andpackages/, then run — not assumed.scripts/check-doc-snippet-types.mjs— the gate itself, which now COMPILESthis page instead of excusing it (P1 proves the entry was what suppressed it).
scripts/check-doc-fence-languages.mjs(check:doc-fences) — reads everyfence in this README; green at the final commit over 227 documents.
scripts/check-readme-exports.mjs— reads this README's self-imports; provenlive by P4. This diff ADDS self-imports (459 to 465 across the repository), so
it hands that gate more to check than it had.
scripts/__tests__/doc-version-claims.test.ts— names this README path; greeninside the 16-file run, and no version literal on this page moved.
assumed:
git grep -lfor the path over*.test.ts/*.test.tsxreturnsonly
doc-version-claims.test.ts, andpackages/collaboration/src/__tests__/holds no README-reading suite (unlike gantt's
readme-navigation-example.test.ts,which batch 18 found and which is exercised here anyway inside the 16-file run).
content/docs/teaches this package's API:git grep -lforusePresence,useRealtimeSubscription,useConflictResolution,PresenceAvatars,LiveCursorsandCommentThreadacrosscontent,docs,apps,examples,skillsand the other package READMEs returns this READMEalone. So the five corrected lies had exactly one carrier, and it is fixed here.
One measurement worth recording
The removed entry's reason string was stale in both directions. It read
13 undefined-name diagnostic(s) … plus TS2339x2 TS2353x1 TS2554x1 TS2739x1;the measurement on this base reads 11 undefined-name (TS2304x10 + TS2552x1),
and it never mentioned the two implicit-any diagnostics (TS7006x2) at all. The
entry is gone either way, so there is nothing left to correct — but it is the
third batch running to find a reason string that disagrees with the measurement,
which is why the census is re-measured on every batch rather than read off the
ledger.
This PR is a DRAFT and stays a draft: this seat does not flip ready, does not
enable auto-merge, and touches no labels or assignee.
🤖 Generated with Claude Code
https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Generated by Claude Code