Skip to content

docs: repair and pin QUICK_REFERENCE's "Current Release" block, drop the console README's hand-written versions (#4143) - #4150

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-4143-console-version-drift
Aug 10, 2026
Merged

docs: repair and pin QUICK_REFERENCE's "Current Release" block, drop the console README's hand-written versions (#4143)#4150
yinlianghui merged 1 commit into
mainfrom
claude/issue-4143-console-version-drift

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#4143

Two files, two treatments, per the delegated ruling on the card.

1. apps/console/README.md:5 — remove the numbers (the #4125 precedent)

-> **Version:** 0.5.1 | **Spec:** @objectstack/spec v3.0.7 | [Full Roadmap](./CONSOLE_ROADMAP.md)+> **Version:** see the [npm page](...) | **Spec:** the `@objectstack/spec` range declared in [`package.json`](./package.json) | [Full Roadmap](./CONSOLE_ROADMAP.md)

Manifest says 17.4.0 and ^17.0.0-rc.5. Following PR #4144's worked asymmetry: a pointer where a pointer helps (npm page for a published package's version), the declaring manifest for the spec range. The badge row keeps its shape.

README sweep, as ordered. No other hand-written version or dependency claim on the page — the Architecture block names packages without versions, and the remaining numbers are ports and feature counts. One different-shaped finding, reported and not touched: see the findings section.

2. QUICK_REFERENCE.md "Current Release" — update, and pin

RowWasNowAnchor
Versionv3.3.217.4.0every manifest in the fixed group of .changeset/config.json
Spec^4.0.4^17.0.0-rc.5root + apps/console manifests
Client^4.0.4^17.0.0-rc.5apps/console + packages/data-objectstack
Node.js≥ 20≥ 22root engines.node
pnpm≥ 9 / pnpm@10.31.0unchanged — accurateroot engines.pnpm + packageManager
React18.x or 19.xunchanged — accuratepeerDependencies.react
TypeScript≥ 5.0unchanged — no anchor existssee below

The card's premise did not fully survive verification

The issue and the triage comment both state the Node/pnpm/React rows are "currently accurate". Two of the three were. Node was not — the row read ≥ 20 while root engines.node has been >=22, and the row cites that anchor in its own text. A claim that names its anchor and disagrees with it is the strongest available argument that review alone does not hold this block: the reviewer had the pointer and still did not follow it.

Also corrected: the trailing note named mobile-ux-round2.md as the queued changeset. That file is gone; .changeset/ currently holds nine others. An enumeration of a directory that churns daily has no stable form, so it is replaced by a pointer to the directory.

3. The anti-rot pin — shipped as a test, not as a comment

scripts/__tests__/quick-reference-current-release-4143.test.ts, following the ci-cd-pipeline-doc.test.ts idiom the card named. The block's bullet format parses cleanly, so the fallback (a comment anchoring the duty to the release process) was not needed.

Every expected value is derived FROM a manifest. No version literal is written twice, so the test cannot itself go stale — that was the explicit instruction on the card and it is what makes the anchor-side reverse verification below possible.

Two directions:

  • Forward — each row must state what its anchor says.
  • Reverse — no version literal may appear in the block that the test did not derive. Without this the gate would cover only today's rows, and a future hand-written - **Turbo:** 2.x would join and rot beside the pinned ones: the same defect class, one bullet to the left.

Plus the unanchored row. **TypeScript:** ≥ 5.0 has no anchor — no workspace manifest declares a typescript peer or engine range. The row now says so in its own text, the test allowlists that one literal by exact value, and it fails the moment such an anchor appears, so the exemption cannot outlive its justification. (The ci-cd-pipeline-doc.test.ts move of covering the dangerous direction twice.)

Why not widen the existing ratchet instead

doc-version-claims.test.ts (objectui#3697) already inventories version literals, and its header states the residual hole: scan roots are content/docs and each package README, so "a version literal in a file OUTSIDE the two scan roots is invisible here". QUICK_REFERENCE.md and apps/console/README.md both sit in that hole — which is how #4143 became a card.

Widening it was considered and rejected for this change. That gate is a ratchet: its own header says it decides whether a literal was recorded with a reason, explicitly not whether it is true. It would have inventoried ^4.0.4 as a known-stale entry rather than caught it. Every row in this block has a real per-claim anchor, so the stronger instrument is available and was used. Widening SCAN_ROOTS to cover apps/** remains worth doing on its own merits — filed as part of #4148.

Verification

$ pnpm exec vitest run scripts/__tests__/quick-reference-current-release-4143.test.ts
Test Files 1 passed (1)
Tests 8 passed (8)
$ pnpm exec vitest run scripts/ # whole pin-test suite
Test Files 29 passed (29)
Tests 552 passed (552)
$ pnpm run type-check:scripts # tsc -p tsconfig.scripts.json
$ pnpm run check:control-bytes
✅ check-control-bytes: OK (scanned 3836 tracked text file(s); skipped 85 binary).
$ pnpm run docs:check-links
Links are valid across 7 scan roots.
$ pnpm exec eslint scripts/__tests__/quick-reference-current-release-4143.test.ts # exit 0

Reverse verification — both directions, predicted red, red

Doc side (fix taken out with git checkout + a patch file, never git stash) — restoring the stale block turns 6 of 8 red:

AssertionError: QUICK_REFERENCE.md must state the workspace version as "17.4.0": expected 'v3.3.2 (latest published patch; ...' to contain '17.4.0'
AssertionError: QUICK_REFERENCE.md must state the spec range as "^17.0.0-rc.5": expected '`@objectstack/spec` ^4.0.4 ...' to contain '^17.0.0-rc.5'
AssertionError: QUICK_REFERENCE.md must state the Node floor as "≥ 22" to match engines.node ">=22": expected '≥ 20 (see root `engines.node`)' to contain '≥ 22'
AssertionError: ... block states ["v3.3.2","v3.3.0","^4.0.4","3.3.x","^4.0.4","≥ 20"], which no manifest in this tree produced.

The two that stayed green are the two rows that genuinely had not drifted — pnpm and React. That asymmetry is the evidence the gate is measuring the doc rather than the edit.

Note the reverse-direction test caught v3.3.0 and 3.3.x as well, which no row-specific assertion targets — literals living inside parentheticals, exactly what a row-by-row gate misses.

Anchor side — temporarily moving root engines.node to >=24 against the repaired doc:

AssertionError: QUICK_REFERENCE.md must state the Node floor as "≥ 24" to match engines.node ">=24": expected '≥ 22 (see root `engines.node`)' to contain '≥ 24'

This is the direction that proves the expected value is computed from the manifest rather than hardcoded a second time. Both mutations were reverted; git status clean apart from this change.

Changeset

None owed — arbitrated by the script, not by judgement:

$ node scripts/check-changeset-presence.mjs
Compared the working tree with d86d372ad (merge-base with origin/main): 2 file(s) changed,
0 of them under the src/ of a package the release covers, 0 under a package changesets ignores,
0 changeset(s) added.
✅ No source of a released package changed in this range, so no changeset is owed.

No skip-changeset label is applied, deliberately: in this repo that label is not real. scripts/__tests__/ci-cd-pipeline-doc.test.ts records that .github/WORKFLOWS.md was deleted by objectui#3724 for documenting, among other phantoms, "a changeset gate skippable with a skip-changeset label; neither the workflow nor the label was ever real". changeset-presence.yml decides this from the diff.

Out-of-scope findings — filed, not fixed


Generated by Claude Code

…e console README's hand-written versions (#4143)
`apps/console/README.md:5` claimed `**Version:** 0.5.1` and
`**Spec:** @objectstack/spec v3.0.7` against a manifest carrying `17.4.0` and
`^17.0.0-rc.5`. Per the #4125 / #3577 / #3715 precedent the hand-written numbers
are removed rather than refreshed, and replaced with pointers to the two things
that cannot drift: the npm page for the published version, the package manifest
for the declared spec range. Nothing else on that page states a version.
`QUICK_REFERENCE.md`'s "Current Release" block is a maintained status section,
so it is updated rather than gutted: `v3.3.2` -> `17.4.0`, spec and client
`^4.0.4` -> `^17.0.0-rc.5`.
The card described the block's Node/pnpm/React rows as currently accurate. Two
of the three were. Node was not: the row read `≥ 20` while root `engines.node`
has been `>=22`, and the row cites that anchor in its own text — a claim that
names its anchor and disagrees with it is the clearest evidence that review
alone does not hold this block.
Hence the pin, `scripts/__tests__/quick-reference-current-release-4143.test.ts`.
Every expected value is derived FROM a manifest, so no version literal is
written twice and the test cannot itself go stale. It also refuses any version
literal in the block that it did not derive, so a future hand-written row cannot
join and rot beside the pinned ones. The one unanchored row (TypeScript) says so
on the row and is guarded to fail if an anchor for it ever appears.
The existing `doc-version-claims.test.ts` ratchet was considered and not
widened: its own header states that it decides whether a literal was recorded
with a reason, not whether it is true, so it would have inventoried `^4.0.4` as
known-stale rather than caught it. Every row here has a real anchor, so the
stronger instrument applies.
The trailing `.changeset/` note named a changeset file that no longer exists;
that enumeration has no stable form and is replaced by a pointer to the
directory.
Fixes#4143
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
@vercel

vercelBot commented Aug 10, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 10, 2026 1:58pm

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation apps tests labels Aug 10, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.3 KB350 KB
Entry fileindex-B0RJaW8v.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.66KB3.13KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)485.06KB107.21KB
core (index.js)3.04KB1.15KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)140.66KB36.25KB
fields (index.js)229.40KB56.93KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.87KB10.80KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)45.23KB12.45KB
plugin-charts (index.js)61.52KB17.49KB
plugin-chatbot (index.js)180.33KB42.79KB
plugin-dashboard (index.js)118.52KB30.68KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)237.80KB59.48KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)114.58KB27.68KB
plugin-gantt (index.js)162.81KB39.67KB
plugin-grid (index.js)188.04KB49.91KB
plugin-kanban (index.js)48.60KB13.41KB
plugin-list (index.js)110.04KB26.67KB
plugin-map (index.js)17.00KB5.32KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)26.21KB7.52KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)23.71KB7.95KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.23KB0.66KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

appsdocumentationImprovements or additions to documentationtests

Projects

None yet

2 participants

@yinlianghui@claude