Skip to content

chore(deps): upgrade @objectstack/* 17.0.0-rc.5 → 17.0.0-rc.6 (maintainer order), and re-measure tracked upstream-mirror behavior #1059

Closed

Description

@huangyiirene

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.json pins 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.6 exists 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)

  1. Bump every @objectstack/* dependency in package.json to 17.0.0-rc.6; regenerate pnpm-lock.yaml.
  2. Keep objectstack.config.ts engines.protocol and objectstack.manifest.json consistent 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).
  3. Full verification: pnpm build, pnpm validate, pnpm lint, full test suite, and a dev-server boot smoke check.
  4. 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_updates RLS 写扩权在 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), FlowVariableSchema has no defaultValue, 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.
  5. Changeset required by CI.

Known adjacencies

Activity

  1. self-assigned this
    on Aug 11, 2026
  2. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: PM loop round 1 (hotcrm whole-repo seat)
    Session: session_01NM6o28jmBgsyTRQHutn7LC
    Branch: claude/issue-1059-upgrade-objectstack-rc6
    Worktree: 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-5
    Serial constraints cleared: dependabot #1057/#1058 touch package.json (left open, expected to self-rebase after this lands); the #494 successor card is deliberately pm:blocked behind this card to avoid a same-file collision; no other in-flight claim touches these files.


    Generated by Claude Code

  3. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor
    {
      "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

  4. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Pushed fb8dfa0 to claude/issue-1059-upgrade-objectstack-rc6 (fast-forward, no force): regenerated the stale package-lock.json to 17.0.0-rc.6 via the gate's own npm install --package-lock-only --ignore-scripts recipe (360 rc.6 refs, 0 rc.5), and merged origin/main (#1064/#1065/#1067) with no conflicts — both sides' intent verified intact in the three shared docs files — after which pnpm build / validate / lint all exit 0 and the suite is 80 files / 1875 passed / 1 skipped.


    Generated by Claude Code

  5. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    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.

    ReportInput is retired from @objectstack/spec/ui. Read from the installed .d.mts, rc.5 vs rc.6:

    rc.5 rc.6
    ReportInput z.input<typeof ReportSchema> removed
    Report z.infer (parsed) z.input (authoring)
    ReportParsed z.infer z.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 X is the input type and XParsed the post-parse one. Report is therefore the correct replacement for ReportInput (identical underlying type), and the five src/reports/*.report.ts annotations now use it with their typing intent preserved.

    The part worth carrying to other apps making this jump: Action, Dashboard and Page swapped the same way. Because those names survived, any annotation already saying Report / Action / Dashboard / Page changed meaning silently rather than failing to compile. Only ReportInput, 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 into src/reports/index.ts so the next reader does not re-derive it.

    On the miss. pnpm typecheck was not in my verification list, and objectstack build does not typecheck app sources — so build, validate, lint, 1875 tests and a dev-server boot all passed green while tsc --noEmit had five errors. Type-level upstream changes are invisible to every other gate in this repo. typecheck is in my gate list from here on; it ran first this round.

    Now verified: pnpm typecheck / build / validate / lint all exit 0, suite 80 files / 1875 passed / 1 skipped. git fetch && git merge origin/main before pushing: already up to date (#595 / #1017 not landed yet). PR body change list updated to six.


    Generated by Claude Code

  6. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    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:

    • Diff scope matches the claim (pins + both lockfiles + config/manifest + the files rc.6 forced to move); no riders.
    • Two patch rounds, both diagnosed by signature rather than re-queued: (1) package-lock.json stale — this repo keeps two lockfiles and only pnpm-lock.yaml had been regenerated; (2) tsc --noEmit red on five src/reports/*.report.ts. The second was a real rc.6 breaking change and its root cause is worth keeping: pnpm typecheck was absent from the verification list, and objectstack build does 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.
    • The ReportInput finding is bigger than its own fix and is recorded in the PR body: under ADR-0122, Report/Action/Dashboard/Page swapped from the parsed shape to the authoring shape while keeping their names, so annotations using them changed meaning silently. Only ReportInput, 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

  7. added
    priority:p1High: required for production / M2
    and removed on Sep 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

configurationBuild and app configuration filespm:dispatchedDispatched to a dev agent by /pm-dispatchpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions