Repository navigation
chore(deps): upgrade @objectstack/* 17.0.0-rc.5 → 17.0.0-rc.6 (maintainer order), and re-measure tracked upstream-mirror behavior #1059
Copy link
Copy link
Closed
Labels
configurationBuild and app configuration filesBuild and app configuration filespm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2High: required for production / M2
Description
Mandate
Maintainer order (huangyi, 2026-08-11, PM chat session session_01NM6o28jmBgsyTRQHutn7LC), verbatim:
objectstack 应该升级到最新的 17.0.0-rc.6 立一单立刻处理。
Current state (measured at filing)
package.jsonpins all@objectstack/*packages at 17.0.0-rc.5 (13 entries: account, cli, driver-memory, driver-sql, driver-sqlite-wasm, metadata, objectql, runtime, service-analytics, service-automation, spec, formula, + create tooling where applicable).- Upstream tag
create-objectstack@17.0.0-rc.6exists on objectstack-ai/objectstack; the dev must verify the full@objectstack/*family is published at rc.6 on npm before bumping (re-check:pnpm view @objectstack/spec versions --json | tail).
Scope (precedent: #901, the rc.2 → rc.3 upgrade card)
- Bump every
@objectstack/*dependency inpackage.jsonto17.0.0-rc.6; regeneratepnpm-lock.yaml. - Keep
objectstack.config.tsengines.protocolandobjectstack.manifest.jsonconsistent with the new pin ([17.0-rc2验收] objectstack.config.ts 的 engines.protocol 仍是 ^17.0.0-rc.1,与 objectstack.manifest.json(rc.2)及 build 产物不一致 #728 precedent: config/manifest/build must not diverge). - Full verification:
pnpm build,pnpm validate,pnpm lint, full test suite, and a dev-server boot smoke check. - Re-measure tracked upstream-mirror cards where a cheap repro exists and report which changed on rc.6 (do not deep-dive; one probe each): [17.0-rc][疑似平台]
member_default的*通配授权(C/R/E)并集合并进每个成员 —— 应用的 explicit-allow 对象门在建/读/改三轴上被整体架空,任何 profile 都能在任何对象上建记录 #703 [17.0-rc][疑似平台] 写扩权全部失灵:modifyAllRecords对行级写门无效,edit 级sys_record_share实际只给读 —— sales_manager 改不了任何非本人创建的记录 #705 回归:#547 实测通过的marketing_campaign_updatesRLS 写扩权在 rc.2 上失效(403);同 PR 的 campaign_member 扩权仍工作 #706 [17.0-rc][疑似平台] 自动化引擎 create_record(系统扫)插入的行 owner_id/organization_id/created_by 全 NULL —— 出生即连 admin 都无法改删;demo_bootstrap 十分钟内会"自愈" owner_id,真实安装没有这根拐杖 #700 [17.0-rc][疑似平台] crm_case 自动编号计数器落后于既有 case_number:REST 建单连续 409,每次失败还烧掉一个号(实测重试 25 次才成功) #698 (permissions/RLS/counter), Address fields render as raw JSON on the record detail page #664 (address JSON),FlowVariableSchemahas nodefaultValue, so a flow variable cannot be declared bound — the obvious remedy for an unbound-variable condition does not exist #651 (FlowVariableSchema.defaultValue), 批量写(multi: true)路径上 ctx.previous 恒为空 —— 15 个读 previous 的 hook 在该路径全部空转,知识文章可被批量写成「已发布但从未复核」 #779 (ctx.previous on multi), 页面组件文案没有翻译位:12 处用户可见字符串(首页占 10)在 zh/ja/es 下只能是英文,而 dashboards.widgets 有同形的翻译面 #1004 (page component i18n), [17.0-rc][疑似平台] datetime 字段的时间窗过滤返回空集(客服仪表盘全空) #520 [17.0-rc][疑似平台] script action 的 body 写库被 FORBIDDEN(admin 用户) #521 [17.0-rc][疑似平台] 全局(无 objectName)action 无法派发,且 UI 把失败当成功静默吞掉 #522 [17.0-rc][疑似平台] flow 型 action 菜单项无响应;screen flow 服务端失败无任何 UI 回显 #524 [17.0-rc][疑似平台] 多 tab 新建表单校验失败后丢失已填值且布局错乱 #525 (p0/p1 platform suspects). A one-line verdict per card in the PR body is enough; behavior changes get a comment on the respective card. - Changeset required by CI.
Known adjacencies
- Dependabot PRs chore(deps-dev): bump tsx from 4.23.1 to 4.23.12 #1057 (better-sqlite3) / chore(deps): bump better-sqlite3 from 12.11.1 to 13.0.3 #1058 (tsx) also touch
package.json— do not merge or rebase them; expected to self-rebase after this lands. - i18n: 205 warnings hidden by --skip-i18n; broken option keys and untranslated navigation #494's successor card (drop
--skip-i18n) is deliberately blocked behind this card to avoid a same-file (package.json) collision.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
configurationBuild and app configuration filesBuild and app configuration filespm:dispatchedDispatched to a dev agent by /pm-dispatchDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2High: required for production / M2
Activity
huangyiirene commentedon Aug 11, 2026
Claim: PM loop round 1 (hotcrm whole-repo seat)
Session:
session_01NM6o28jmBgsyTRQHutn7LCBranch:
claude/issue-1059-upgrade-objectstack-rc6Worktree: dedicated cloud session (fresh clone)
Domain: hotcrm whole-repo seat
File surface:
package.json,pnpm-lock.yaml,objectstack.config.ts,objectstack.manifest.json,.changeset/*Container & model: M,
mode:cloud(dedicated session),model: claude-opus-5Serial constraints cleared: dependabot #1057/#1058 touch
package.json(left open, expected to self-rebase after this lands); the #494 successor card is deliberatelypm:blockedbehind this card to avoid a same-file collision; no other in-flight claim touches these files.Generated by Claude Code
huangyiirene commentedon Aug 11, 2026
{ "issue": 1059, "status": "done", "branch": "claude/issue-1059-upgrade-objectstack-rc6", "pr": "https://github.com/objectstack-ai/hotcrm/pull/1066", "premise_still_valid": true, "summary": "PM premise confirmed before any edit: all 12 @objectstack/* packages this app depends on are published at 17.0.0-rc.6 on npm (pnpm view, spot-checked across spec/runtime/cli/metadata/objectql/account/driver-memory/driver-sql/driver-sqlite-wasm/service-analytics/service-automation/formula). Bumped every pin to 17.0.0-rc.6, regenerated pnpm-lock.yaml (402 rc.6 refs, zero rc.5 left), and moved objectstack.config.ts engines.protocol + objectstack.manifest.json specVersion/engines.protocol to ^17.0.0-rc.6 per #728. Five upstream behavior changes reached the app and were each baselined against rc.5 before being followed (the six affected test files were re-run on rc.5 with the bumped files stashed: 164/164 passed, so every failure was rc.6-induced, not pre-existing): (1) filter-empty-node is a NEW author-time error that FAILED THE BUILD - forecast_snapshot's 'find every user' node declared filter:{}, which reduces to TRUE and is indistinguishable from an absent key; the key is deleted, as the rule prescribes; (2) $regex is retired upstream - no app metadata used it, only the premise block in account-name-normalized-match, which now measures the retirement and reaches the same conclusion via $icontains, the declared replacement; (3) the restrict-delete message now speaks in display labels instead of API names - the refusal is unchanged, so two assertions follow the wording while still pinning that the message names the blocking object and field; (4) ctx.permissions now enumerates the platform baseline set member_default - reach is unchanged (every sharing assertion still passes), so the negative control now pins the absence of admin_full_access directly instead of an exact one-element list; (5) the approvals plugin relabelled my_pending in zh-CN (我的待办 -> 待我审批) - four docs pages follow, and the #973 guard that retired 待我审批 as 'a sidebar label, not a view' is released with its reasoning recorded, since the string now occurs exactly once in the shipped bundle, as that view's label. Docs stating the installed platform version moved to rc.6; docs/MAINTENANCE.md's rc.5 reference was deliberately left, being a historical fact about which release added a migration rather than a current-version claim. Scope kept tight: e2e/** untouched, dependabot #1057/#1058 neither merged nor rebased, no unrelated riders.", "tests": "pnpm build -> exit 0 (failed first on the new filter-empty-node rule; green after the fix). pnpm validate -> exit 0, 'Validation passed'. pnpm lint -> exit 0, 153 warnings / 10 suggestions, all pre-existing advisory. pnpm test -> 81 files, 1887 passed, 1 skipped, 0 failed (first run after the bump: 10 failed across 6 files; all 10 traced to rc.6 behavior changes and resolved). rc.5 baseline control: same 6 files re-run with the bumped files stashed and rc.5 reinstalled -> 6 files, 164 passed, 0 failed, proving the failures were upgrade-induced. Dev-server boot smoke check: pnpm start on a reset datastore -> 'Server is ready', GET /_console/login -> HTTP 200, SqlDriver(better-sqlite3), 38 plugins loaded, 24 flows with 18 trigger-bound; one pre-existing warning (inline seed exceeding its 8s budget, continuing in background), no rc.6-related boot error.", "open_questions": [ "Self-resolved, recorded not blocking: the 5 test files whose expectations moved were adapted rather than reverted, since the underlying behavior (delete still refused, reach unchanged, premise still true) is intact in every case and only the observable wording/enumeration changed. Two that changed an assertion's SHAPE rather than its wording - the member_default enumeration and the released #973 guard - each carry an in-file comment recording the measurement that justified it.", "Follow-up work surfaced by the probes but deliberately NOT done in this PR (dependency bump only, each has its own review surface): #651's workaround in lead_conversion (the init_defaults assignment node) is now removable since FlowVariableSchema.defaultValue and its engine seeding both exist; #1004's pages.components translation face now exists, so the 12 page-component strings could be populated across 4 locales and test/i18n-references.test.ts extended to walk the new face. Both noted in comments on those cards.", "#705 got a partial verdict only: the owner_only_writes/owner_only_deletes RLS floor still ships, while access_level narrowed to ['read','edit'] with the source stating read AND write gates match it. That is static evidence; confirming whether writes actually widen needs the live multi-token matrix, which is outside a bounded probe." ], "out_of_scope_findings": [] }Generated by Claude Code
huangyiirene commentedon Aug 11, 2026
Pushed
fb8dfa0toclaude/issue-1059-upgrade-objectstack-rc6(fast-forward, no force): regenerated the stalepackage-lock.jsonto 17.0.0-rc.6 via the gate's ownnpm install --package-lock-only --ignore-scriptsrecipe (360 rc.6 refs, 0 rc.5), and mergedorigin/main(#1064/#1065/#1067) with no conflicts — both sides' intent verified intact in the three shared docs files — after whichpnpm build/validate/lintall exit 0 and the suite is 80 files / 1875 passed / 1 skipped.Generated by Claude Code
huangyiirene commentedon Aug 11, 2026
Pushed
46dee87. A sixth rc.6 behavior change reached the app — recording it here because it is the one my first-pass gates could not have caught.ReportInputis retired from@objectstack/spec/ui. Read from the installed.d.mts, rc.5 vs rc.6:ReportInputz.input<typeof ReportSchema>Reportz.infer(parsed)z.input(authoring)ReportParsedz.inferz.infer(parsed)So this is not a plain rename — rc.6 moved the bare name onto the opposite shape, under the ADR-0122 convention that
Xis the input type andXParsedthe post-parse one.Reportis therefore the correct replacement forReportInput(identical underlying type), and the fivesrc/reports/*.report.tsannotations now use it with their typing intent preserved.The part worth carrying to other apps making this jump:
Action,DashboardandPageswapped the same way. Because those names survived, any annotation already sayingReport/Action/Dashboard/Pagechanged meaning silently rather than failing to compile. OnlyReportInput, removed outright, announced itself. This app happens to use all four on authoring literals — the side the swap made more correct — so nothing broke behaviourally, but that was luck, not design. The rename and this trap are written intosrc/reports/index.tsso the next reader does not re-derive it.On the miss.
pnpm typecheckwas not in my verification list, andobjectstack builddoes not typecheck app sources — so build, validate, lint, 1875 tests and a dev-server boot all passed green whiletsc --noEmithad five errors. Type-level upstream changes are invisible to every other gate in this repo.typecheckis in my gate list from here on; it ran first this round.Now verified:
pnpm typecheck/build/validate/lintall exit 0, suite 80 files / 1875 passed / 1 skipped.git fetch && git merge origin/mainbefore pushing: already up to date (#595 / #1017 not landed yet). PR body change list updated to six.Generated by Claude Code
huangyiirene commentedon Aug 11, 2026
ACCEPT — PR #1066 reviewed and MERGED (
e9c4996). The maintainer's order is fulfilled: every@objectstack/*pin is at 17.0.0-rc.6, both lockfiles regenerated, config/manifest carried across per #728.Review notes:
package-lock.jsonstale — this repo keeps two lockfiles and onlypnpm-lock.yamlhad been regenerated; (2)tsc --noEmitred on fivesrc/reports/*.report.ts. The second was a real rc.6 breaking change and its root cause is worth keeping:pnpm typecheckwas absent from the verification list, andobjectstack builddoes not typecheck app sources — build, validate, lint, the full suite and a dev-server boot were all green while five type errors stood. Type-level upstream changes are invisible to every other gate in this repo.ReportInputfinding is bigger than its own fix and is recorded in the PR body: under ADR-0122,Report/Action/Dashboard/Pageswapped from the parsed shape to the authoring shape while keeping their names, so annotations using them changed meaning silently. OnlyReportInput, removed outright, announced itself. This app uses all four on authoring literals — the side the swap made more correct — so nothing broke behaviourally.Upstream-mirror re-probe (the second deliverable of this card): 8 of 14 tracked cards changed behavior on rc.6. The table lives in the PR body; the follow-up sweep to re-test and unblock them is queued for the next round.
Generated by Claude Code