Repository navigation
chore(deps): upgrade the ObjectStack platform to 18.0.0-next.1 - #2106
Conversation
All 23 @objectstack/* pins (19 dependencies, 4 devDependencies) move 18.0.0-next.0 -> 18.0.0-next.1 together, exact. The lockfile was regenerated by pnpm install, not edited by hand: 705 -> 707 package keys; the 55 @objectstack/* keys moved one for one, and @objectstack/connector-imap@18.0.0-next.1 plus postal-mime@4.0.6 arrive through @objectstack/service-mailbox. No other third-party package changed version. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
- crm_campaign_member, crm_event_attendee and crm_article_feedback are controlled_by_parent objects whose master was a required lookup. @objectstack/spec 18.0.0-next.1 (76815b9, #23100) derives a master from exactly one required master_detail and refuses the lookup shape at parse, so os validate exited 1. Each parent field becomes Field.masterDetail, as the release note's FROM -> TO table for these three objects prescribes: deleteBehavior 'restrict' on crm_campaign and crm_event (a parent with rows still cannot be deleted), 'cascade' kept on crm_knowledge_article. - specVersion and engines.protocol move to ^18.0.0-next.1 in objectstack.manifest.json, src/sales/index.ts and src/service/index.ts, as test/docs-declared-versions.test.ts holds them to the installed @objectstack/spec. The major is unchanged, so the handshake is too. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
18.0.0-next.1 (24e064f, objectstack#23284) gives a notification the organization of what it is about and refuses one no organization owns. A schedule run carries no organization, so on an install holding more than one organization each scheduled notify was refused with ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED and the run abandoned that item at the notify node: contract_renewal opened no renewal deal and opportunity_stagnation wrote no nudge task (flow-scheduled-org-partition, red on the bump). Measured with a control: on the boot's one organization the same run notifies and writes the task. The release note's remedy is applied to all five schedule-run notify nodes (contract_renewal, contract_expiration, opportunity_stagnation, task_due_reminder, case_sla_monitor): sourceObject + sourceId name the loop record, the one actionUrl already links to. Record-change and screen flows keep the trigger record's organization and are unchanged. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
- The four reduced kernels that mount createIdentityObjectsPlugin() (cascade-guard-messages, case-creation-date, freeze-guard-reference-cleanup, lead-duplicate-link-cleanup) no longer insert their own Default Organization. 18.0.0-next.1 (917b1a0) has the plugin create it at boot under `single`, so the insert was refused on the slug and every suite failed in beforeAll; the release note says to drop the insert and read the one the boot created. - hierarchy-read-depth saves its three throwaway permission sets through PUT /api/v1/meta/permission/:name. 18.0.0-next.1 (66949b7) retires the sys_permission_set object and names that door as its replacement. The org-wide control arm still sees every seeded row, so the sets grant. - campaign-member-cascade and event-attendee-cascade pin the parent as a required master_detail on `restrict`, the shape the cbp change moved it to; the business fact they guard (a parent with rows refuses to delete) is unchanged, and the attendee suite's end-to-end refusal case passes on the new pin. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
- docs/STATUS.md's runtime table and the three What's new pages state 18.0.0-next.1 and ^18.0.0-next.1 for the release after 4.0.1. - campaign-enrollment.flow.ts dates its "the pin" note per release. - The opportunity and quote line-item comments no longer say the relation resolver accepts a required lookup as the parent: next.1 derives a master from one required master_detail only. - service-agent.profile.ts marks its PositionSchema premise as dated: on next.1 PositionSchema accepts permissionSets (measured) and sys_position_permission_set is retired. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
…n 18.0.0-next.1 Measured in the #2105 browser pass: security/explain for a demo user holding only the service_agent position answers permissionSets [service_agent, member_default]. Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv Co-authored-by: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
席位核对复核人:repo:hotcrm 执行席(#1353)· 判决 ACCEPT · 钉 head 形态:一卡一 PR, 前提实测:23 处 门禁 check-runs(钉 head):Build and Test (22.x) ✓ · Typecheck and Build ✓ · Quality Checks ✓ · Check Changeset ✓ · Playwright ✓ · link-check ✓ · CodeQL ✓ · Analyze Code (javascript) ✓ · Label Pull Request ✓ · Vercel Preview Comments ✓ — 10/10 success,mergeable_state 接受的偏差:STATUS.md / What's new ×3 的 pin 声明随版重定范围,属本卡升级第 5 步,非扩写。 范围外去向: 落地条款:席位经中继 |
Fixes #2105
Clause-②: no
Description
This PR upgrades HotCRM from
@objectstack/*18.0.0-next.0 to 18.0.0-next.1, on the maintainer's order 「18.0.0-next.1 已发布,升级试试」.18.0.0-next.1 is a prerelease step inside protocol major 18. It made
pnpm validatefail once andpnpm testfail in 9 files. Each failure traced to a release-note line, and each fix below applies that line's own FROM → TO. No platform regression was found on the new pin, so nothing here routes around the platform.Type of Change
Related Issues
Fixes #2105
mainwas merged at850f75c2(#2102, which landed while this was in flight). That merge was clean.Changes Made
Pins.
@objectstack/*packages move 18.0.0-next.0 → 18.0.0-next.1, exact: 19 independencies, 4 indevDependencies. The registry was checked for each of the 23 before the bump: every one carries18.0.0-next.1on dist-tagnext.specVersionandengines.protocolmove to^18.0.0-next.1inobjectstack.manifest.json,src/sales/index.tsandsrc/service/index.ts.test/docs-declared-versions.test.ts([17.0-rc2验收] objectstack.config.ts 的 engines.protocol 仍是 ^17.0.0-rc.1,与 objectstack.manifest.json(rc.2)及 build 产物不一致 #728) holds all four declarations to the installed@objectstack/spec, so they move with it.Lockfile delta.
pnpm installregeneratedpnpm-lock.yaml.packages:keys go from 705 to 707.@objectstack/*keys moved one for one.@objectstack/connector-imap@18.0.0-next.1andpostal-mime@4.0.6were added, both pulled in by@objectstack/service-mailbox.better-authwantsbetter-sqlite3@^12, 13.0.3 installed) is the same set of versions as onmain.Release notes read
content/docs/releases/v18/index.mdx, read from objectstack's source at the next.1 release commit0c52e430): docs.objectstack.ai refuses this container's egress. It says the changesets are the record. Its one new paragraph since next.0 is about re-installing the AI skills (Upgrading step 4). HotCRM has no@objectstack/skillsdependency, no skills lock file and no installed skill, so there is nothing to re-install.CHANGELOG.mdsection for18.0.0-next.1: 55 packages, 70 distinct changeset entries after de-duplication (2 Major, 47 Minor, 21 Patch). Each was checked againstsrc/,test/andscripts/.Per-change list: the next.1 changes that reached this app
controlled_by_parentobject derives its master from exactly one requiredmaster_detail(spec76815b9, objectstack#23100).os validaterefusedcrm_article_feedback(exit 1).crm_campaign_member.crm_campaignbecomesField.masterDetail,deleteBehavior: 'restrict';crm_event_attendee.crm_eventbecomesField.masterDetail,deleteBehavior: 'restrict';crm_article_feedback.crm_knowledge_articlebecomesField.masterDetail,cascadekept.campaign-member-cascadeandevent-attendee-cascadepin the new declaration. The attendee suite's end-to-end refusal case passes unchanged.24e064f, objectstack#23284).notifywas refused withERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED, and the sweep abandoned that record at the notify node.flow-scheduled-org-partitionwent red:contract_renewalopened no renewal deal, andopportunity_stagnationwrote no nudge task.contract_renewal,contract_expiration,opportunity_stagnation,task_due_reminderandcase_sla_monitornow carrysourceObject+sourceId, naming the loop record theiractionUrlalready links to.IdentityObjectsPluginkeeps thesingleposture's Default Organization at boot (917b1a0).cascade-guard-messages,case-creation-date,freeze-guard-reference-cleanup,lead-duplicate-link-cleanup) inserted their own Default Organization. The insert was refused on the slug, and each suite failed inbeforeAll.66949b7, ADR-0131 D3).hierarchy-read-depthwrote its three throwaway permission sets assys_permission_setrows.PUT /api/v1/meta/permission/:name, the replacement the note names.next.1 changes measured as not reaching this app
4f68ba1): 0 findings.pnpm validate,buildandlintare green.7958bdf, Major): no braced or template-dialect condition exists here. The three directevaluateConditioncalls in tests pass CEL (an envelope, or a bare CEL string), with no{…}hole, and they pass.5f37d36): each ofcrm_lead,crm_opportunityandcrm_casehas one, andhomeis not a record page.systemflow (c857a93): this app declares noapis:.apidata source retired (1912af4); page action rowonSuccess/operation/navigationnarrowings (4d1e4a8,b529a5c,1623faf,775ed65); token at a typed builtin config key (ca0bdbc): none authored here.os validateis green.last_N_dayspresets now close on today (b4d573a): this app authors nolast_N_dayspreset. One report window is written{ $gte: '{30_days_ago}' }, the shape the note advises closing with$lte: '{today}'. Its evaluation does not change on next.1, so it is left as it is and noted under Acceptance notes.guestrecord-share recipient retired (345d1be) and the guest grants channel (37510aa,e790cfc): this app writes noguestshare. The public form doors keep their own posture: both forms were submitted in the browser pass below.runDashboardWindowProofsloses its fourth argument (06dbc4e): not called here./dataand/uianonymous401,?package=/409metadata doors, migration-ceremony steps, IMAP sync and storageattachFile: no app surface reaches them. All 179 test files pass.Pin-claim sweep (AGENTS.md "Platform Upgrades" step 5)
18.0.0-next.0appears 120 times outside the lockfile andCHANGELOG.md, and each hit was classified by hand. The large majority read "since 18.0.0-next.0 …", "until 18.0.0-next.0 …" or "measured on …". Those are dated facts that stay true, and they are left as written.Re-scoped because they asserted next.0 is the pin:
docs/STATUS.md(runtime table);campaign-enrollment.flow.ts("the pin since chore(deps): upgrade@objectstack/*past 17.7.0 once the next release publishes — it carries the platform fixes #2016, #2000, #1583 and #1585 wait on #2031");A version-agnostic shape search ("the pin", "pinned", "installed platform", "current platform") found two more claims that next.1 makes false, without a version token:
service-agent.profile.ts: "PositionSchemarejectspermissionSets". On next.1 it accepts them (measured). The note is now dated. The name binding it explains still resolves:security/explainfor a demo user holding only theservice_agentposition answerspermissionSets: [service_agent, member_default].A grep finds only text that carries a version token or a pin word. A stale fact stated in other words is found only by reading, so this sweep is not claimed complete.
Upstream unlock table (card §6)
The release commit for 18.0.0-next.1 is objectstack
0c52e430. The console bundle'sdist/.objectui-shais objectuib9814b33; next.0's was1fb1ced3. Each "in the pin" verdict comes from the GitHub compare API, with a known-ancestor control leg per repository: next.0's release commitd889448breadsaheadof0c52e430, and1fb1ced3readsaheadofb9814b33.584e7373584e7373...0c52e430readsbehindby 8: the release commit comes before the fix.24e064fc24e064f(objectql, service-messaging, service-automation, plugin-approvals). It is not in next.0. This PR adopts its remedy (item 2 above).2b06a91e2b06a91e6)". It is an ancestor ofb9814b33and not of1fb1ced3.2722d33c("Part of")2722d33c5)"). It widens the flow-launch selection rule. Its author could not reproduce the card's script-action symptom, and the card stays open.BulkActionDialog.tsxuntouched5c2982ad1fb1ced3).0cd322d739e93efe(docs)d889448b).Testing
Every link of
pnpm verifyran at HEAD19a5418funderos-verify-lock.sh, on a clean tree:pnpm validate✓ Validation passed: 18 Objects, 357 Fields, 33 Flowspnpm typechecktsc --noEmit, no output (test/**is intsconfig.json'sinclude)pnpm lint18 suggestion(s), the same lines asmainon next.0pnpm lint:i18n-gate✓ i18n lint gate: 0 i18n/missing-* issuespnpm hygiene✓ source hygiene cleanpnpm hygiene:tokens✓ source token ratchet cleanpnpm build✓ Build complete,8 author-time warning(s), the same lines asmainon next.0 (the approval-slate notes andhierarchy-security)pnpm testTest Files 179 passed (179),Tests 3660 passed / 1 skipped (3661), 506 sOn the bump alone, before any adaptation, at
a972317b:Test Files 9 failed / 170 passed,Tests 6 failed / 3561 passed / 87 skipped. Every one of those failures is one of the four items above, or one of the two docs guards (STATUS.md and What's new).Browser pass. Chromium at
/opt/pw-browsers/chromium, ownobjectstack devon port 4108 over a fresh database,pnpm demo:staffagainst it. Results were read with DOM and REST probes.analytics/dataset/querycalls, all200;na.rep).Walk Newco ….is_converted: true,status: converted, contact linked.na.rep); cases and knowledge (asservice.agent); campaigns and events (as admin). Lists and record pages render, with no console errors and no failed API call.relatedListColumnson the now-master-detail field.409 DELETE_RESTRICTED, and the parent survives./forms/contact-usand/forms/supportrender and submit (201).CASE-00039land with an owner, and the case is auto-assigned to the service agent.Token readings,
origin/main→ this branch:src/salessrc/servicesrc/revenuesrc/marketingDiff size: 29 files, 1,313 changed lines (291 without
pnpm-lock.yaml).Screenshots
Captured in the session that ran this upgrade, not committed.
Risk
lookuptomaster_detail. The stored column is the same id column, and access and delete behaviour are as before (measured above).os migrate meta --storedlists a stored object still on a required-lookup master. It does not rewrite it.Rollback: revert this PR. The next.0 pins, the lockfile and the three lookup fields come back together, and no data migration ran.
Checklist
.changeset/2105-objectstack-18-next-1.md)main(850f75c2) on next.0, measured in a throwaway worktree.@objectstack/*18.0.0-next.1 is on npm)Acceptance notes
singleinstall. While a scheduled sweep runs on an install holding two organizations, the engine logsrun-history persist failed … Insert on 'sys_automation_run' was REFUSED. That happens in the test harness, with or without this PR's notify change. It was measured in-process only, not through a public door. It is a platform write, not app metadata, and it is recorded here rather than filed.403at this container's egress proxy. The v18 page and the Upgrading page were read from objectstack's own source at the next.1 release commit0c52e430.test/demo-staffing.test.tsstill listssys_position_permission_setamong the identity tables the app may never write. next.1 retires that object. A retired name on a deny list cannot make the guard pass wrongly, so it is left as it is.churn.report.ts. Recently Lost Opportunities filtersclose_date: { $gte: '{30_days_ago}' }. A closed-lost deal whose close date lies in the future would count in it. next.1's preset note (b4d573a) advises closing such windows with$lte: '{today}'. The bump does not change this window's evaluation, and nobody is carrying the change.404(a non-API resource). It showed during the first rep and anonymous walks and did not reproduce when the pages were re-checked for 404 URLs. It is not attributed.Generated by Claude Code