chore(deps): upgrade ObjectStack to 17.0.0-rc.2 and migrate the metadata it broke - #663
Merged
xuyushun441-sys merged 2 commits intoAug 3, 2026
Merged
Conversation
…ata it broke Bumps every `@objectstack/*` package from 17.0.0-rc.1 to 17.0.0-rc.2, with `specVersion` and `engines.protocol` following. Four of the changes in that window were live defects in metadata this app already had: - `demo_bootstrap` opened with `get_record(sys_user)` on an empty filter. 17.0.0-rc.2 refuses a `findOne` that names no record (#4419), so the sweep failed on its second node and every seeded record stayed ownerless — the "My …" views empty for everyone and every owner-addressed notify reaching nobody. It now reads a list and binds the first row through an `assignment` node, stating the arbitrary pick instead of smuggling it through a call that claimed to name one, and guards the branch with `has(vars.firstUser)`. - `lead_conversion` marked `createOpportunity` — a checkbox with `defaultValue: false` — as `required`. rc.2 holds a screen resume to its declared field contract (#4477), so a runner posting only what the user touched had the resume refused with INVALID_SCREEN_INPUT and the lead could not convert. A checkbox has no unanswered state; the flag is gone. - Nine `decision` nodes carried an inert copy of their branch predicate, now flagged by `flow-inert-node-condition` (#4414). The engine reads the out-edges, so the copy restated the gate without being the gate. Deleted, with the totality rationale moved to the edges that decide. - `translation.validationMessages` is retired (#4667); its three messages matched no rule here and had never been read. Two pinned platform-gap assertions flip because the platform closed the gap — a filtered measure selecting nothing now reports 0, so a lead source that only ever lost reads 0% rather than blank (#4708), and a bare-string condition inside a loop body is CEL-parsed like its envelope twin (#4336). The explicit envelopes stay. Validation predicates now fail closed (#4649), which does not change HotCRM's already-total predicates but does change what an author gets, so AGENTS.md and the predicate test say so. Verified on a booted server and in a real browser session: navigation, all nine list views, record detail, UI create, four dashboards (49 analytics calls, zero failures), reports, global search, and each touched flow — escalate_case, lead_conversion, quote_generation, lead_assignment, and the two-tier opportunity_approval routing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UEVSbh8TdK8NRdF7mxVB1a
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
`check-stackblitz-lock.mjs` failed on the upgrade commit: the version bump touched `package.json` and `pnpm-lock.yaml` but left `package-lock.json` on the rc.1 line, so the StackBlitz demo would fall back to a full re-resolve instead of installing from the lock. Regenerated with the command the gate prints; it now carries rc.2 for all twelve `@objectstack/*` packages and no rc.1 references remain. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UEVSbh8TdK8NRdF7mxVB1a
This was referenced Aug 3, 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.
Description
Bumps every
@objectstack/*package from17.0.0-rc.1to17.0.0-rc.2, withspecVersionandengines.protocolfollowing.The version bump alone leaves the app broken. Four of the changes in the rc.1 → rc.2 window are live defects in metadata HotCRM already had — two of them silently disable a whole tier of the product — so this PR migrates them and re-verifies each one against a booted server and a real browser session, not only the unit harness.
Type of Change
Related Issues
Upstream platform changes migrated here: objectstack-ai/objectstack#4419, #4477, #4414, #4667, #4708, #4336, #4649.
Changes Made
Four live defects, each with the failure it produced:
demo_bootstrapcould no longer find its user. The sweep opened withget_record(sys_user)on an empty filter, whichfindOneused to answer with an arbitrary row. rc.2 refuses afindOnethat names no record (#4419), so the flow failed on its second node and every seeded record stayed ownerless — "My Leads" / "My Deals" / "My Cases" empty for everyone, and every owner-addressednotifyreaching nobody. It now reads a list and binds the first row through anassignmentnode, which states the arbitrary pick instead of smuggling it through a call that claimed to name one. Branch guarded withhas(vars.firstUser)so a zero-user org still completes.lead_conversioncould no longer convert a lead. rc.2 holds a screen resume to the screen's declared field contract (#4477), andcreateOpportunity— a checkbox withdefaultValue: false— was markedrequired. A runner posting only what the user touched had its resume refused outright withINVALID_SCREEN_INPUT. A checkbox has no unanswered state; the flag is gone, and the default (plus theinit_defaultsassignment) supplies the answer as it always actually did.decisionnodes carried an inert copy of their branch predicate, now flagged byflow-inert-node-condition(#4414). The engine reads the out-edges, so the node copy restated the gate without being the gate — and a copy that drifts is a lie about what the flow does. Copies deleted; the totality rationale moved to the edges that decide. Behaviour unchanged.translation.validationMessagesremoved from all four locale bundles — rc.2 retires the key (#4667), and its three messages matched no rule in this app.Two pinned "platform gap" assertions flip, because the platform closed the gap — which is exactly what they were written to detect:
0, so a lead source that only ever lost reads 0% instead of blank (#4708).loopbody is now CEL-parsed like its envelope twin (#4336). The explicit envelopes stay: they declare which dialect a predicate is in, and they keep these flows correct on a runtime that still carries the old path.Validation predicates now fail closed (#4649) — the upstream question
test/object-validation-predicates.test.tsfiled, answered. An unevaluable predicate used to be skipped silently; it now rejects the write. HotCRM's predicates are already total so nothing changes at runtime, butAGENTS.mdand that file now describe the outcome an author actually gets.Testing
pnpm test) — 48 files, 1165 passed / 1 skippedpnpm lint) — warnings 10 → 1 (the remaining one pre-dates this PR)pnpm build), pluspnpm validate,pnpm typecheck,pnpm hygieneBrowser verification (Chromium driving a real Console session against
pnpm devon a freshly seeded + staffed demo org):account_protectionhook normalized the namedemo_bootstrapescalate_case['reason']; resume 200; record escalated / critical / reason / date stampedrecordId→ 400Unknown screen field, record untouchedlead_conversionquote_generationneeds_analysis→proposallead_assignmentopportunity_approvaldirector_signoffpendingposition:sales_director; $250K → approved outrightChecklist
.changeset/upgrade-objectstack-17-rc2.md)AGENTS.md,CHANGELOG.md)@objectstack/*17.0.0-rc.2 is on npm under thercdist-tag)Additional Notes
Correction to an earlier revision of this description. It claimed the e2e Playwright suite fails 11 of 16 as a pre-existing defect. That was wrong, and is retracted: the E2E workflow is green on
mainand green on this PR. The failures were an artefact of my local run — I pointed the suite at a dev server whose seeds had already been claimed bydemo_bootstrapand staffed bydemo:staff, so the suite's self-signed-upe2e-admin@hotcrm.test(a plain orgmember) could read nothing undersharingModel: 'private'. In CI the database is empty and nothing has claimed the seeds, which is why it passes there. The only real content left in that observation is a local-DX footgun: runningpnpm test:e2eagainst a long-lived dev server will start failing once the 10-minutedemo_bootstrapschedule fires. Not a blocker and not this PR's to fix.One genuine pre-existing finding, deliberately not fixed here:
billing_addressrenders as raw JSON on the account detail page instead of a formatted address. Reproduced byte-identically on anorigin/main(rc.1) worktree booted side by side, so it is not caused by this upgrade.Generated by Claude Code