Skip to content

chore(console): bump the objectui pin to 53ded82bf7a4 — the shipped console lowers array analytics filters - #16788

Merged
baozhoutao merged 5 commits into
mainfrom
claude/issue-16626-objectui-pin-bump
Sep 8, 2026
Merged

chore(console): bump the objectui pin to 53ded82bf7a4 — the shipped console lowers array analytics filters#16788
baozhoutao merged 5 commits into
mainfrom
claude/issue-16626-objectui-pin-bump

Conversation

@claude

@claude claude Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Fixes #16626

Bumps the objectui pin from a472b07167a3 to 53ded82bf7a4 so the console this repo ships carries objectui#7754's array-analytics lowering, unblocking #15442 / #15449.

The pin moved through scripts/bump-objectui.sh — never a hand edit of .objectui-sha or the generated console dist.

Acceptance criterion — the card's, verbatim, with its control legs

The instrument is only trustworthy once the control legs answer. Taken in a non-shallow objectui clone (9702 commits; git rev-parse --is-shallow-repository = false):

leg command exit reads as
CRITERION git merge-base --is-ancestor 53ded82b "$(git show origin/main:.objectui-sha)" — against this branch's pin 0 ✅ the shipped console now carries the fix
CONTROL-A --is-ancestor NEWPIN~40 NEWPIN 0 instrument alive
CONTROL-A' --is-ancestor NEWPIN~200 NEWPIN 0 alive at depth
CONTROL-C --is-ancestor NEWPIN origin/main 0 the pin is on objectui main
the gap this PR closes --is-ancestor 53ded82b a472b0716 (the OLD pin) 1 the shipped pin lacked the fix

⚠️ Stated honestly: because this bumps to exactly 53ded82b, the criterion holds reflexively (a commit is its own ancestor). The load-bearing legs are CONTROL-C and the functional probe below, not the criterion's exit 0 on its own.

Pre-bump readings agreed with triage to the commit: --is-ancestor 53ded82b a472b0716 → 1, --is-ancestor a472b0716 53ded82b → 0, distance 34.

How far to bump — the measured judgement

Bumped to exactly 53ded82b (34 commits), not to tip.

At measurement time tip was 376 commits away, not the 308 the card recorded — tip moved between filing and execution, which is itself a reason not to chase it. The 34-commit range already carries 2 declared-breaking entries and several ADR-0049 retirements; tip would add 342 more commits of unrelated console change onto a card whose stated purpose is one lowering fix — and, per the card's own headline, CI cannot see any of it.

Functional probe — because CI is blind to this seam

Green CI is not evidence here. Producer side runs the real lowering each pin performs (translateFilterArray at the old pin; lowerAnalyticsFilterForWire = translateFilterArrayisFilterASTparseFilterAST at the new one). Wire side is the real AnalyticsQueryRequestSchema from the built @objectstack/spec.

authored filter form pin a472b0716 (shipped today) pin 53ded82bf (this PR)
record {status:{$ne:'done'}}control ACCEPT ACCEPT
rule array [{field,operator,value}] REFUSE invalid_type@where ACCEPT
comparison tuple ['status','!=','done'] REFUSE invalid_type@where ACCEPT
and-group ['and', rule, rule] REFUSE invalid_type@where ACCEPT
empty array [] REFUSE invalid_type@where ACCEPT (posts no where at all)

What each pin actually puts on the wire as where:

form old pin posts new pin posts
rule array ["status","!=","done"] (still an array) {"status":{"$ne":"done"}}
and-group ["and",["status","!=","done"],["amount",">",100]] {"$and":[{"status":{"$ne":"done"}},{"amount":{"$gt":100}}]}
empty array [] no where key

The control ACCEPTs at both pins, so the probe is measuring the array arms and not a broken harness.

This coverage remains CI-invisible. Nothing added here renders the showcase object-metric tiles through the pinned console; the probe above is a one-off measurement recorded in this PR, not a standing test. Recorded per triage's acceptance point 4.

Clause-② tested and confirmed no — no producer/consumer mismatch

The bumped console does not accept a shape the spec refuses. The fix runs the other way: it narrows what the console posts, lowering an authored FilterArray to the FilterCondition the contract already declares. AnalyticsQueryRequestSchema.where is unchanged on origin/main (FilterConditionSchema.optional(), packages/spec/src/data/analytics.zod.ts — now line 410, the card's :299 having drifted as the file grew) and its own describe text already prescribes exactly this: an authored FilterArray is lowered by parseFilterAST on the client before the wire; this field admits only the lowered FilterCondition.

Four packages/spec/src files ARE touched — the pin-citation records below, and nothing else. They are comment-only, and measured so rather than asserted: the base (8b37a0973d) and head versions of all four compile to AST-identical output under TypeScript with removeComments: true. String literals survive that pass, so no describe text, error-guidance string, tombstone or alias literal moved. analytics.zod.ts and filter.zod.ts have zero diff against origin/main. Hence Clause-② no: the accept set did not widen, and the producer simply stopped emitting a shape that was always refused.

The second half of a pin bump

Pin citations re-measured, not sha-swapped (#10274)

12 asserting citations across 4 spec sources. Three cited objectui files changed over the range, so their anchors were re-derived:

record anchor was now
api-methods-batch-conformance.test.ts ObjectGrid.tsx selection block 3544-3559 3538-3553
dataset.zod.ts dataset-format.ts formatMeasureDate 184-197 185-198
dataset.zod.ts dataset-format.ts datetime arm 194 195
dataset.zod.ts date-display.ts formatDate 104-137 131-164
dataset.zod.ts date-display.ts ±7-day fallback 90 117

The ObjectGrid.tsx block is byte-identical across the hop — git hash-object on both spans returns 6133933199230670e29d8c7f51c558d86a0af1d2 — so it shifted six lines up and no substance moved. No read point died.

Every remaining anchor sat in a file byte-identical over the range and was still re-READ at the new pin rather than carried on that identity (containers.tsx ×4, plugin-kanban ×4, the plugin-dashboard metric chain ×4, button.tsx ×5, resolve-icon.ts ×4, lazy-icon.tsx, useBulkExecutor.ts). All correct as written.

Only the asserting spelling was updated; the 3 bare dated-history mentions of a472b0716 are left as the historical records they are.

Gates

Derived from the actual changed set with node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack and reconciled with --ran.

90 derived families run, 86 exit 0. The other four measured nothing:

gate exit why it is not a red
check:dual-build-cjs-loads 3 PREREQUISITE NOT MET — reads built output; 86 packages have no dist/. Needs a whole-workspace build, which is CI's.
check:type-check-debt 3 --re-measure cannot run: 30 workspace deps unbuilt. The gate itself says a number from here would measure a different world.
check:doc-formula-expressions 3 PREREQUISITE NOT MET@objectstack/formula unbuilt.
check:react-declaration-parity 1 → 0 needed MANIFEST; green once set (see #16715 note above).

Exit 3 is this repo's explicit nothing was measured code, distinct from a finding's 1. Every exit code was captured before any pipe.

Declared narrowing: the three exit-3 families need a full workspace build and are left to CI.

Package-level: pnpm --filter @objectstack/spec typecheck → 0; pnpm --filter @objectstack/spec test465 files / 12952 tests passed. Both through scripts/pm/os-verify-lock.sh (VERDICT command-exit 0).

All 127 changed lines under packages/spec/src are comment lines — verified mechanically, zero non-comment changed lines — so no type or runtime surface moves with them.

验收备注

Triage's acceptance points, answered:

  1. ✅ Bump went through scripts/bump-objectui.sh, not folded into finding(spec): ElementDataSourceSchema.filter (page.zod.ts) still declares the MongoDB-style FilterConditionSchema — the binding-level sibling of #14406 outside ComponentPropsMap, while objectui's composition seam lowers three shapes and its own pins author the tuple array #15442.
  2. ✅ The mandatory second half is done — manifest ratchet re-recorded and the docs/releases-maintenance.md "After the pin moves" procedure followed. Hit the check-react-blocks-declaration-parity.ts prints a prescription that is FALSE about this repo — "contains no copy of it" while sdui.manifest.json is checked in at the root; it made a dev declare a runnable gate NOT MEASURED #16715 false prescription and did not dump from objectui.
  3. ✅ Criterion re-run with all three legs plus the shallow check; readings above.
  4. ✅ Recorded explicitly: the gap remains CI-invisible. The probe is a one-off measurement in this PR, not a standing test.
  5. ⬜ Not this PR's act: unblocking finding(spec): ElementDataSourceSchema.filter (page.zod.ts) still declares the MongoDB-style FilterConditionSchema — the binding-level sibling of #14406 outside ComponentPropsMap, while objectui's composition seam lowers three shapes and its own pins author the tuple array #15442 / finding(spec): four object-* filter doors in ComponentPropsMap declare z.unknown() — no orthography at all — so they still accept the MongoDB-style record ui#6206-B retired, silently; the card that closed the last FilterConditionSchema door assumed they declared the array #15449 and replying on chore(console): bump the objectui pin past 53ded82b — the shipped console refuses every array analytics where, which blocks the ruled #15442/#15449 filter converge #16626. finding(spec): ElementDataSourceSchema.filter (page.zod.ts) still declares the MongoDB-style FilterConditionSchema — the binding-level sibling of #14406 outside ComponentPropsMap, while objectui's composition seam lowers three shapes and its own pins author the tuple array #15442 and finding(spec): four object-* filter doors in ComponentPropsMap declare z.unknown() — no orthography at all — so they still accept the MongoDB-style record ui#6206-B retired, silently; the card that closed the last FilterConditionSchema door assumed they declared the array #15449 are not touched here and stay open.

⚠️ Landing note for the PM: this PR touches generated artifacts, so it needs the four-step bash scripts/pm/os-regen-merge.sh sequence rather than a plain merge.

Out of scope, noted not filed: the range's own changeset records that objectui merged 7 commits carrying no .changeset/*.md; upstream's own gate for that is objectui#3387. Carrier: that upstream card.

Authored by Claude Code in session session_012GKcPZbMoGq7WPzKLfRBTU.


Generated by Claude Code

fix(data-objectstack): lower an array analytics filter through parseFilterAST before the wire (#7752) (#7754)

objectui@53ded82bf7a494f54e344e19099dbf00854b8694
…4 pin bump

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU
…the pin-bump artifacts

Re-derived every asserting `.objectui-sha` citation at 53ded82bf7a4 rather than
swapping the sha (#10274): 12 citations across 4 spec sources. Three cited
objectui files changed over the range and their anchors MOVED; the rest were
re-READ at the new pin rather than carried on byte-identity.

Regenerated the two pin-derived records: scripts/sdui-manifest.record.json and
packages/sdui-parser/objectui-lockstep.json.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU
@github-actions github-actions Bot added the size/m label Sep 8, 2026
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/sdui-parser, @objectstack/spec, touching 6 documentable anchor(s). ⚠️ 1 changed file(s) yielded no anchor (packages/sdui-parser/objectui-lockstep.json), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/data-modeling/analytics.mdx (via DatasetMeasureSchema (symbol, a top-level const))

1 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v15.mdx (via PageTabsProps (symbol, a top-level const object))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/sdui-parser/objectui-lockstep.json) — pages documenting those are invisible to this run
  • the SDK route bridge reached 61 of 219 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 56 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 102 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 131 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json a749dcc4b6f5a40cdffe7958ec576dda6bc2d01epackageMentionDocs.

Which tree this was computed on

This run read content/docs from a6f54625292845073c8cc977b3e440e239754909 — the merge of head 7be42d4145da38602bb4d063684666dc0e96b331 into base a749dcc4b6f5a40cdffe7958ec576dda6bc2d01e, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin a6f54625292845073c8cc977b3e440e239754909 && git checkout a6f54625292845073c8cc977b3e440e239754909
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a749dcc4b6f5a40cdffe7958ec576dda6bc2d01e 7be42d4145da38602bb4d063684666dc0e96b331 && git checkout -B drift-repro a749dcc4b6f5a40cdffe7958ec576dda6bc2d01e && git merge --no-ff 7be42d4145da38602bb4d063684666dc0e96b331

node scripts/docs-audit/affected-docs.mjs --json a749dcc4b6f5a40cdffe7958ec576dda6bc2d01e

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs a749dcc4b6f5a40cdffe7958ec576dda6bc2d01e → pass the list as
args.docs, on the commit named under Which tree this was computed on.

…position

The disposition claimed the diff was `.objectui-sha` plus the changeset and
nothing else. It is not: the four packages/spec/src pin-citation sources and the
two generated pin records are in it too. A changeset ships verbatim to the
published CHANGELOG, so a published artifact must not misdescribe its own diff.

The operative clause is unchanged and still true — no schema, no authorable
metadata key, no protocol surface — and the disposition stays
`not-required (no-migration-prescription)`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GKcPZbMoGq7WPzKLfRBTU
@claude

claude Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

Both required corrections are in, on b715b351c6. Prose only — no code, no pin, no generated JSON.

1. The permanent changeset (.changeset/console-53ded82bf7a4.md, commit b715b351c6, 1 file, 1 line changed). The false sentence "This diff is .objectui-sha plus this changeset and nothing else" is replaced with the real write set: the pin, this changeset, the four packages/spec/src pin-citation sources, and the two generated pin records (scripts/sdui-manifest.record.json, packages/sdui-parser/objectui-lockstep.json). The comment-only claim is now stated as the reviewer measured it — AST-identical under removeComments — rather than asserted. The operative clause is untouched and still true, and the disposition is still not-required (no-migration-prescription).

2. The PR body's Clause-② section. "No spec file is touched by this PR" is gone. It now says four are touched, comment-only, AST-identical base-vs-head under removeComments: true, with analytics.zod.ts and filter.zod.ts at zero diff against origin/main — therefore no.

Verification of the follow-up commit:

  • git diff 4a705a4490..HEAD --name-only.changeset/console-53ded82bf7a4.md only; nothing outside .changeset/*.md.
  • .objectui-sha, scripts/sdui-manifest.record.json and packages/sdui-parser/objectui-lockstep.json are byte-identical to the reviewed commit (git rev-parse on each blob at both commits).
  • check-adr-0087-registration --base origin/mainexit 0, and its echoed reason now prints the corrected sentence.
  • Also green on the corrected file: check-adr-0087-registration --self-test, check-changeset-no-major, check-empty-changeset, check:objectui-changeset, check:changeset-gate-self-tests, check:console-sha, check:nul-bytes, check-comment-mask-corpus, check-closing-keyword-parity — all exit 0, each captured before any pipe.

⚠️ One note for the record: on the first body edit the platform appended its own bare attribution block beneath the session-URL one, leaving two. Corrected in a single follow-up PATCH by sending the body with no footer and keeping the session id as body prose; the stored body now carries exactly one block. Not re-pasted in a loop.

Still draft, auto-merge unarmed — the flip is yours.


Generated by Claude Code

@claude

claude Bot commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

Generated-artifact sync done via bash scripts/pm/os-regen-merge.sh, in a dedicated worktree on the branch — never the shared checkout. Head is now 7be42d4145, 0 behind / 5 ahead.

What the sync produced: nothing changed, and that is a measurement

Both generated records regenerated to byte-identical output. After the merge I rebuilt the spec closure and re-ran the full chain; git status came back empty and every blob hash is unchanged from before the merge:

artifact blob before blob after
scripts/sdui-manifest.record.json 8389fcb5 8389fcb5
packages/sdui-parser/objectui-lockstep.json bc425df3 bc425df3
sdui.manifest.json 78f870e4 78f870e4
.objectui-sha a9b031ce a9b031ce

This is a real regeneration, not a skipped one — both generators printed their writes (wrote sdui.manifest.json (57 components, sha256 49211fee7792…), re-recorded … at pin 53ded82bf7a4, and the lockstep recorded objectui@53ded82bf7a4 — 214 region line(s), 24 diagnostic code(s)). They wrote identical bytes because the merge moved neither input: .objectui-sha is untouched by main's six commits, and none of my artifacts is on the merge=os-regen list, so step 2 had nothing to reconcile and step 3 reported no additional changes to commit. No regeneration commit exists because there was nothing to commit.

The #16797 guard was applied

OBJECTUI_ROOT was pointed at a worktree pinned at 53ded82bf7a4, asserted equal to .objectui-sha before the generator ran. Result: objectui.rev == recordedAgainstPin == 53ded82bf7a4, 24 diagnostic codes — the correct record, unchanged.

The guard still matters today: objectui tip has moved twice since this PR opened (now f76f4362). parse.ts happens to be byte-identical at pin and tip, but the packages/sdui-parser/src tree is not (7b91c2c9 at the pin vs a1ba42c5 at tip), which is where the 25-vs-24 gap lives. Recording from tip would still have shipped the wrong record.

Nothing of main's was swallowed

The strongest available form of step 4.3: git diff origin/main HEAD --name-only returns exactly the 8 files this PR owns and nothing else, so no file of main's is altered in this tree. Corroborated by quoted-exact-name grep with a positive control — BOOLEAN_AGGREGATE_FIELD_TYPES 1/1 and recordsOf 58/58 against origin/main, with a deliberately impossible symbol reading 0/0 to prove the query can miss. All five files main's commits added are present.

Gates re-run on the merged head

Re-derived post-merge (8 paths vs the new merge base b38821d1c) and re-ran the full set: 90 families, 87 exit 0. check:react-declaration-parity is green here (with MANIFEST set), which is the one that moved up from the pre-merge run.

The same three are PREREQUISITE NOT MET (exit 3 — nothing measured, not a finding): check:dual-build-cjs-loads, check:type-check-debt, check:doc-formula-expressions. All three read whole-workspace build output that nothing in this diff feeds; left to CI. Exit codes captured before any pipe.

Still draft, auto-merge unarmed — the flip stays yours.


Generated by Claude Code

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

Labels

Projects

None yet

2 participants