Skip to content

chore(deps): upgrade the ObjectStack platform to 18.0.0-next.5 - #2181

Merged
objectstack-fleet[bot] merged 7 commits into
mainfrom
claude/issue-2179-platform-next-5
Oct 19, 2026
Merged

objectstack-fleet[bot] merged 7 commits into
mainfrom
claude/issue-2179-platform-next-5

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #2179
Clause-②: no

Description

This PR upgrades HotCRM from @objectstack/* 18.0.0-next.3 to 18.0.0-next.5: the card's steps 1–3. Step 4 (release, tag, marketplace) stays the maintainer's (#2132).

On the bump alone, os validate, os lint and os build refused one key: width: 'large' on a page's main region. That is fixed by the changeset's own FROM → TO on four pages. The test suite then went red in four places, each a pin on a platform contract that next.4 moved; each follows the new contract. The browser pass found nothing the gates missed in the app, and no platform regression on the journeys.

pnpm demo:staff needed two edits, which ride this PR (claim amendment 6268235977): see pnpm demo:staff: option A landed below. pnpm verify is green.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Code refactoring
  • Performance improvement
  • CI/CD update

Related Issues

Fixes #2179

Held follow-ups, measured here and each left to its own card (Held follow-ups below): #2146, objectstack-ai/objectui#12942 and objectstack-ai/objectstack#24326. Nothing was written on any of them.

Changes Made

Pins. All 23 @objectstack/* entries move 18.0.0-next.3 → 18.0.0-next.5, exact: 19 in dependencies, 4 in devDependencies. The registry was read for all 23 first: each has 18.0.0-next.5, dist-tag next points at it, latest is still 17.7.0. specVersion and engines.protocol move to ^18.0.0-next.5 in objectstack.manifest.json, src/sales/index.ts and src/service/index.ts. The console ships objectui 4016370af3c9 (its dist/.objectui-sha).

Lockfile delta. pnpm install regenerated pnpm-lock.yaml (+509 / −509), exit 0 in 16 s. packages: keys: 707 before, 707 after; the 56 @objectstack/* and create-objectstack keys moved one for one, nothing was added or removed, and no third-party package changed version. The one peer warning (better-auth wants better-sqlite3@^12, 13.0.3 installed) is the same as on main.

Release notes read

  • docs.objectstack.ai refuses this container's egress (CONNECT tunnel failed, response 403), so the release pages were read from objectstack's source. content/docs/releases/v18 is tree dfc75535 and upgrading.mdx is blob 5faa4507 at next.3 (2c9bf9430a), next.4 (725a5b131) and next.5 (820fd5aef) alike. The v18 page says the changesets are the record.
  • The range 2c9bf9430a..820fd5aef is 189 commits (157 of them up to next.4).
  • The two version commits moved 174 changesets into .changeset/pre/: 146 at next.4 (objectstack#24168) and 28 at next.5 (objectstack#24477). All 174 were read: headline and frontmatter for each, the full body of every one that is breaking or names an authoring key, door or behaviour this app uses, and both console digests in full.
  • Each pinned package's installed CHANGELOG.md was read for its next.4 and next.5 sections. Every consumed changeset that names a pinned package appears in that package's CHANGELOG (152 package entries, 0 missing).
  • Six changesets sat unconsumed at 820fd5aef, and their code ships in next.5: 24375, 24414, 24448, 24450, 24464, 24471. Each file is in the release commit's tree, and the code is in the installed dist/ (for example, 24450's refusal text is in @objectstack/spec). None is in a next.5 CHANGELOG. One is breaking: 24450, a navigation entry whose visible reads data must declare dataSource. No navigation entry here reads data, and os validate is green.

Per-change list: the changes that reached this app

  1. A main region takes only width: 'full' (24326-main-region-width-refused, spec next.4). Sources: src/sales/pages/home.page.ts, lead_detail.page.ts, opportunity_detail.page.ts, src/service/pages/case_detail.page.ts.
    • On the bump alone (aafb8d29), pnpm validate exited 1: pages.0.regions.1.width: Region 'main' is refused with width: 'large'. lint, lint:i18n-gate and build refused the same stack, and tsc was green.
    • FROM → TO, as the changeset prescribes: width: 'large' deleted from the four main regions. Every other region keeps its width.
    • Measured after, Sales Home at 1440: header 1136 px, main 792 px, aside 320 px. 792 px is the width objectstack#24326 measured for main on next.3, so nothing moved on screen.
  2. Declared sharing rules are read from the registry and have no sys_sharing_rule row (23952-declared-sharing-rules-registry, plugin-sharing next.4; 24421 makes them read-only by name in next.5). A declared rule's id is its name, and its grants carry that name as source_id.
    • test/escalated-case-previous-owner.test.ts mapped grants to rule names through sys_sharing_rule rows and read undefined→agent:read. It now reads the name off source_id; the access assertions were green throughout.
    • test/demo-staffing.test.ts's territory block looked each rule up in sys_sharing_rule and failed sharing rule north_america_territory is not installed. It now reads GET /sharing/rules/NAME and evaluates by name. The arithmetic it guards is unchanged and green: the NA rep reads six accounts, the EU rep two.
    • scripts/demo-staff.ts step 4 read the same rows and would have evaluated nothing. It now lists the rules through the sharing door (below).
    • Measured: sys_sharing_rule holds 0 rows, and GET /api/v1/sharing/rules lists the 11 rules the app declares.
  3. ComponentPropsMap gains a list-view row (22444-list-view-component-props-row, spec next.4; the spec half of hotcrm#2137). test/metadata-references.test.ts's staleness guard went red on its one NO_PROPS_CONTRACT entry, list-view. The entry is gone, Sales Home's list blocks now join the props parse, and they pass. os validate is green on the data / type spelling chore(deps): upgrade the ObjectStack platform to 18.0.0-next.3 #2140 wrote.
  4. Setup's audit entry is one "Audit Log" (23890-one-audit-entry, plugin-audit next.4). test/docs-setup-navigation-names.test.ts went red on four pages that sent readers to Setup → Audit Logs. The English and zh-Hant pages now name Audit Log, six files in all (automation, faq, security-and-compliance); zh-Hans already said 审计日志. Measured: Setup › Diagnostics › Audit Log opens /component/audit/log with 50 rows, and no Audit Logs entry is served.
  5. A public-form submit that leaves a form-required field empty answers 400 (24131-rest-public-form-required, rest next.4). No change here. Measured anonymously: POST /api/v1/forms/contact-us/submit without description → 400 VALIDATION_FAILED, fields: [{ field: 'description', code: 'required', message: 'Description is required' }]; /forms/support the same. The changeset tells integrators.
  6. The import door's opt-outs are the system principal's only (24348-import-control-opt-out-gate, rest next.4). This is what stopped pnpm demo:staff at step 3. Option A landed (below).
  7. A formula reads one hop through a reference (24197-*, objectql/lint next.4; 24316, 24410). None of the 19 formula fields here reads through a lookup (probe over the composed stack), so no value changes. Three comments said a formula cannot read through a lookup. They now date that measurement: opportunity_line_item.object.ts, contract.object.ts and test/line-item-product-title.test.ts. The line items keep their stored title, because a formula value is stored nowhere and so cannot be searched (24197's own note), and that title is their search target.
  8. A param-less declarative update action refuses undeclared wire params (24268, runtime next.4, which names complete_task as a measured consumer). No change here. Measured: Complete on a task record posts POST /api/v1/actions/crm_task/complete_task with { recordId, params: {} } → 200, the task reads completed, and the button is gone.
  9. The metric tile's value scales before it would clip (console 0707b4ae3, next.4 digest). No change here; it answers object-metric: a money KPI's value is cut with an ellipsis (1,290,00… / 2,017,50…) at 1024 and 1440 px inside a page:card — viewport-based spans give a narrowed column's tile too little width objectui#12942 (Held follow-ups).
  10. 18.0 runs fresh single installs only (15212-180-guards-fresh-single-only, cli next.5). os serve refuses OS_TENANCY_POSTURE=group|isolated and OS_MULTI_ORG_ENABLED=true at boot, and os migrate organization-ownership refuses with NOT_IMPLEMENTED. Nothing in src/ sets a posture, and the dev box boots under single. It is in the changeset's operator notes, and it bears on After the 4.0.1 → 5.0.0 upgrade on a hosted environment every seeded event appears twice (Upcoming Events), while leads do not double — measure which upgrade step re-inserts the upsert dataset #2146 (below).

Changes measured as not reaching this app

  • Retired or narrowed authoring keys, not authored here: record:json (24162), marketplace:installed-list (24230), a page action row's patch (24394), an objectExtensions entry (24314), an install manifest.scope (24062), scale on a record:line_items column (24190; the app has no such block), and a cross-reference inside a page:tabs / page:accordion panel (24349; the five panels here hold no inline action target or identity-only column). os validate, os build and os lint are green on all of it.
  • A top-level action bound to an object no package registers fails the boot (24400). Every boot here reached Server is ready.
  • search over an object with no searchable field answers 400 (24284). Every object here has a non-empty search set (probe).
  • Seed and ownership changes: an organization-scoped seed load refuses a key a NULL-organization row holds (24301; the dev boot is the unscoped single load), the ceremony's mirror deletion and guards (15212-8c0, 24282, 24343-*), defaultRowScope (24338, 24340; not declared), and the first-user admin grant under single (11979; the dev admin was promoted and signs in).
  • New authoring keys, not used: the app page record binding (24265), the record blocks' emptyState (24266), current_user.hasCapability (24414), a navigation entry's API data source (24332).
  • Doors and host changes with no app surface: the disabled-package /meta and /data doors (24097, 24210 ×10), install and reseed (24040, 24086), API key outage (24299), storage gate (24366), cloud connection (23933, 24148, 24150), OAuth / MCP organization (24137, 24165, 24166, 24186), the request-context refactor (23217 ×5), the /meta route moves and liveness citations (23050 ×11, 24063), export of hidden and named fields (24143, 24183), draft provenance (24298, 24395 ×3), import undo (24380 ×2), the CLI and dev-host fixes, and the sys_organization actions (24016, 24271, 24273, 24384 ×2).
  • Console digests, read in full. The two BREAKING lines of next.4's digest and the one in next.5's are objectui-internal faces (a boolean label argument on deriveDetail, form SelectOption kind / default, the retired permission-set facets). This app authors no form select options and depends on no @object-ui/* package.

Pin-claim sweep (AGENTS.md "Platform Upgrades" step 5)

18.0.0-next.3 appeared 50 times in 34 files at cc0608c, outside the lockfile, CHANGELOG.md, package.json, the manifest and .changeset/. Two were the engines.protocol pins, bumped above. The rest were classified by hand.

Re-scoped, because they asserted next.3 is the pin:

  • docs/STATUS.md, the runtime row.
  • The three What's new latest-release sections. 5.1.2 shipped on next.3, and the release after it runs on next.5, in chore(deps): upgrade the ObjectStack platform to 18.0.0-next.3 #2140's wording.
  • campaign-enrollment.flow.ts: its "not re-checked through 18.0.0-next.3" list now runs through next.5, because this bump did not re-check it either.

Kept as dated truth: every "measured on 18.0.0-next.3" line in src/ and test/, the "18.0.0-next.3 console" lines in home.page.ts, and the release-history lines in What's new ("5.1.0 moves to 18.0.0-next.3").

A grep finds only text that carries a version token. Item 7's three comments were found by reading, not by grep, so this sweep is not claimed complete.

Held follow-ups

Card In 18.0.0-next.5? Result
objectstack-ai/objectui#12942 (KPI values cut with an ellipsis) Yes, console 0707b4ae3 ("A metric tile's value now scales before it would clip"), in next.4's digest. Whole at 1440. Sales Home as the admin: Revenue (Won) 1,290,000.00 and Pipeline Value 2,017,500.00 each read scrollWidth 124 = clientWidth 124, at 18 px (stepped down from 24 px). Deals Won 8 and Open Leads 21 stay at 24 px. The card measured 152 / 124, an ellipsis, on next.3.
objectstack-ai/objectstack#24326 (a region's declared width not rendered) Yes, as a refusal: spec next.4, 24326-main-region-width-refused. The question was a main region's width. The platform answered it by refusing small / medium / large on main, so the four main widths are removed (item 1). On Sales Home at 1440, the right column (aside, width: 'medium') renders 320 px, and main renders 792 px. Both are the widths the card measured on next.3.
#2146 (events doubled after a hosted upgrade) Yes. objectstack#24325 (51ad8e4fb) and objectstack#24372 (41c740536), run in /home/user/objectstack. merge-base --is-ancestor of each on 820fd5aef: exit 0, and on 725a5b131 (next.4): exit 0. On 2c9bf9430a (next.3): exit 1 for both. Control on that shallow checkout: e5136ff10f on 2c9bf9430a exits 0, 158 commits deep, deeper than the 102 / 119 commits each tested commit sits past next.3. objectstack#24282 is the issue, and objectstack#24325 is the pull that carried its change. Reported only. ⚠ For the seat's restart: next.5 also ships 15212-180-guards-fresh-single-only, so os migrate organization-ownership (plan and --apply) now exits 1 with NOT_IMPLEMENTED, and os dev's in-place 17 → 18 upgrade stops the same way. The hold comment's step 3, "re-run the 4.0.1 → 5.x upgrade path", cannot run through that command on this pin. NOT MEASURED here.

pnpm demo:staff: option A landed (claim amendment 6268235977)

next.4 refuses runAutomations: false on the import door to every caller but the system principal (24348-import-control-opt-out-gate, which names this script as a known consumer). On the bump, the script stopped at step 3 with POST /api/v1/data/crm_opportunity/import → 403 and exit 1. It also read the rules for step 4 from sys_sharing_rule, which holds 0 rows on this pin. Both edits are in scripts/demo-staff.ts, added to the file surface by the claim amendment.

  • Step 4, mechanical (objectstack#23952). The script lists GET /api/v1/sharing/rules?activeOnly=true and evaluates each rule by its id. A declared rule's id is its name.
  • Step 3: option B was measured first, and it does not hold. On a fresh 18.0.0-next.5 box, under the lock, on Acme Platform Upgrade:
    1. The dev admin's hand-over (PATCH owner_id, automations on) answered 200. It opened manager_review with the dev admin as submitter, waiting on the sales manager, and set approval_status: pending. The rep's save then answered 409 RECORD_LOCKED.
    2. The dev admin's POST /api/v1/approvals/requests/ID/recall answered 200. The request reads recalled, its actions are submit and recall, and the rep's save now answers 200, so the recall does unlock the deal.
    3. The platform mirrors the request status onto the deal, so approval_status reads recalled. opportunity_approval enters only from not_required or null, so the rep's save opened no request: 0 pending after it.
  • So option A landed. Every routed row goes over through the same PATCH, with every control in force. On each of the two large open deals, the hand-over opens manager_review with the dev admin as submitter, waiting on the sales manager (Marta Quinn). Step 5, the owners' save, is gone. The closing banner reads the pending requests back.
  • Measured, pnpm demo:staff on a fresh database after the seed settled: exit 0, with "demo org staffed".
    • Re-stamped: 23 opportunities, 21 leads, 7 tasks and 29 events.
    • The NA rep sees 6 accounts and the EU rep 2.
    • "2 crm_opportunity approval request(s) pending, submitted by the dev admin, in the Approvals inbox of sales.manager@objectos.ai".
    • A second run converges: it re-stamps 0 rows and exits 0.
  • Tests. test/demo-staffing.test.ts re-pins its two spawn tests to that outcome: the submitter is the dev admin, and the request waits on the sales manager at manager_review. test/backfill-query-bodies.test.ts's door stub answers the sharing-rule list, which the script now reads in place of a query. Without it, that probe would see the script exit through console.error.
  • The changed demo fact, for the maintainer: since this PR, the two seeded large-deal approvals are submitted by the dev admin, not by the rep who owns the deal (Demo data: approval requests with a submitter and an approver, knowledge articles per category, fewer identical rows #2129).

Testing

pnpm verify at HEAD aa09ea25, the final commit, under os-verify-lock.sh (OS_VERIFY_LOCK_SLOT=hotcrm-2179-verify), on a clean tree:

Link Exit Result
pnpm validate 0 ✓ Validation passed
pnpm typecheck 0 tsc --noEmit, no output
pnpm lint 0 16 suggestion(s)
pnpm lint:i18n-gate 0 ✓ i18n lint gate: 0 i18n/missing-* issues
pnpm hygiene 0 ✓ source hygiene clean
pnpm hygiene:tokens 0 ✓ source token ratchet clean
pnpm build 0 ✓ Build complete, 8 author-time warning(s)
vitest run --shard=1/3 0 Test Files 66 passed (66), Tests 1107 passed (1107); VERDICT command-exit 0
vitest run --shard=2/3 0 Test Files 65 passed (65), Tests 1226 passed / 1 skipped (1227); VERDICT command-exit 0; the two re-pinned demo:staff spawn tests green
vitest run --shard=3/3 0 Test Files 65 passed (65), Tests 1579 passed (1579); VERDICT command-exit 0

The build half and the shards also ran on 0bebe975, the head before the last comment-only commit, with the same results.

Warnings against main. On a detached cc0608c worktree (next.3), pnpm lint gives the same 16 suggestions line for line (an empty diff of the suggestion lines) and pnpm build the same 8 warnings (all approval-approvers-may-resolve-empty).

The bump alone (aafb8d29): validate 1, typecheck 0, lint 1, lint:i18n-gate 1 (the lint JSON carried the refusal and no issues), hygiene 0, hygiene:tokens 0, build 2. After item 1 (9efdcc22), the build half was all 0, and the shards were red in the places items 2–4 name: shard 1 had 1 test (escalated case grants); shard 2 had the territory beforeAll plus the two demo:staff tests; shard 3 had 4 tests (two version guards, the Audit Logs path, NO_PROPS_CONTRACT).

Ablations: none. No behaviour a test pins was changed by this diff. Each test edit moves a fixture onto the platform's new contract, and the before / after evidence is the red on the bump and the green after.

Token readings, cc0608c → this branch (check-source-token-ratchet.mjs --json, comments stripped). src/sales interaction layer goes 28,600 → 28,584, and src/service 5,527 → 5,522: the four deleted widths. Business semantics are unchanged in every package.

Browser pass

The server was this worktree's objectstack dev (the dev script's command, on port 4179) over a fresh database, and every boot ran under the shared lock. Chromium was /opt/pw-browsers/chromium at 1440 × 900, and each reading came from a DOM, REST or network probe. On every page, the only console errors are non-API resource 404s. The public forms add the anonymous GET /auth/get-session 401. No /api call answered 4xx or 5xx on any journey below except where stated.

This walk ran before the round that fixed pnpm demo:staff, which then exited 1 at step 3. The personas existed and the dev admin still owned the whole seeded book, so the journeys were walked as the admin, and the new records were created as na.rep. They stand as walked. Re-measured since: pnpm demo:staff is green on the bumped head (see pnpm demo:staff: option A landed).

  • Leads → convert (as na.rep). I created two leads through New (201 each), then ran Convert Lead → Submit on each. Each run answered POST /api/v1/automation/lead_conversion/runs/RUN/resume → 200, with the toast "Lead converted successfully!". Both leads read is_converted: true, status: converted, with an account and a contact set. The lead for "Acme Corporation" went to the seeded Acme account, the only account of that name. The other got a new one.

  • Opportunities (admin). The list showed 10 rows. Vertex Enterprise Rollout drew Details / Related / Activity, with Generate Quote, Clone Opportunity, Log a Call and Edit in its header.

  • Quotes (admin). The list showed 6 rows. QTE-0005 drew Details / Related / Attachments.

  • Cases (admin). The list showed 38 rows. CASE-00037 drew Details / Related / Activity.

  • Web forms (anonymous). /forms/contact-us and /forms/support redirect to /_console/f/SLUG and render their sections.

    • Contact Us submitted 201. The web lead lands with owner na.rep and lead_source: web.
    • On Support, Priority is not preselected. Left empty, the page refuses "Required: Priority" and sends nothing. The same empty select shows on next.3 (A/B on cc0608c), so this is not the bump's (acceptance notes). With Medium picked, it submitted 201: CASE-00039, origin: web, owner service.agent.
    • The 400 probes are in item 5.
  • Dashboards (admin). All five draw, and each one's every dataset/query call answered 200:

    Dashboard Chart wrappers Chart marks dataset/query calls
    Executive Overview 4 13 10
    Sales Performance 5 21 18
    Customer Service 4 14 15
    Sales Activity 4 12 14
    CRM Overview 4 17 10

    Four rows equal chore(deps): upgrade the ObjectStack platform to 18.0.0-next.3 #2140's next.3 readings. Sales Activity drew 12 marks where chore(deps): upgrade the ObjectStack platform to 18.0.0-next.3 #2140 saw 13 (acceptance notes).

  • Reports group (admin, PR feat(nav): a Reports group with an entry for every shipped report (#2073 item 1) #2173). The collapsed Reports group expands to its 10 entries: 7 sales and 3 case. Each entry opened, drew a table, and answered GET /meta/report plus each dataset/query with 200. Rows / chart marks: Opportunities by Stage 7 / 6, Won Opportunities by Owner 2 / 2, Pipeline Coverage 4 / 0, Opportunity Funnel by Owner 7 / 6, Lead Inflow 7 / 0, Accounts by Industry & Type 9 / 0, Customer Churn Signals 10 / 0, Cases by Status and Priority 22 / 6, SLA Performance 5 / 4, Cases Opened by Day 5 / 0.

  • Sales Home (admin). The KPIs and region widths are under Held follow-ups. The My Leads, My Open Deals and My Open Tasks tabs each drew rows, and Upcoming Events in the right column lists the soonest events.

  • Other lists and records (admin). Accounts, contacts, contracts, products, campaigns, events, tasks, knowledge and forecasts each drew rows, and each first record opened.

  • Setup (admin). Diagnostics › Audit Log and the sharing rules: item 4 and item 2.

Screenshots were captured in the session (Sales Home, the five dashboards, the ten reports, both forms, the record pages). They are not committed.

Risk

  • 18.0.0-next.5 is a prerelease of protocol major 18. A 17.x host still refuses the artifact at the handshake.
  • 18.0 refuses a walled posture at os serve boot, and the 17 → 18 ceremony. A hosted environment that runs HOTCRM_COMPOSITION=saas under group / isolated, or that has not been upgraded from 17 yet, should not move to this pin through os serve. Kernel-level hosts are not affected, per the changeset. Production is held anyway (chore(release): HotCRM 5.0.0, the version PR (ruling #2131 B): the first release on ObjectStack 18 #2132).
  • No stored data changes. No object, field or value changes.

Rollback: revert this PR. The next.3 pins, the lockfile, the four page widths and the test fixtures come back together, and no data migration ran.

Checklist

  • I have added a changeset (.changeset/2179-objectstack-18-next-5.md, patch)
  • My code follows the style guidelines of this project
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings: the 16 lint suggestions and 8 build warnings are main's, line for line
  • I have added tests that prove my fix is effective or that my feature works: no test was added. Item 1 is judged by the parsers, and the test edits move fixtures onto the new contracts
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published (@objectstack/* 18.0.0-next.5 is on npm)

Acceptance notes

  • os validate names one refused page at a time. On aafb8d29, four pages carried the refused main width, three of them in the app stack. defineStack reported (1 issue), pages.0 only. With lead_detail alone carrying it, the report was pages.2. z.array(PageSchema).safeParse over three such pages returns all three. The dev report carries the finding.
  • The public Support form does not preselect Priority on next.3 or next.5. The internal New Case form preselects Low on both, from the option's default: true, and the field has no defaultValue. A visitor must pick one, though the server defaults it (REST without priority: 201, priority: low). The dev report carries the finding.
  • Six changesets ship in next.5 without a CHANGELOG entry (Release notes read). This is the "listed one prerelease late" pattern chore(deps): upgrade the ObjectStack platform to 18.0.0-next.3 #2140 recorded for next.2.
  • Sales Activity drew 12 chart marks, not 13. Not investigated. The seed's dates are relative to the boot, and its queries all answered 200.
  • test/sharing-seeding.test.ts's docblock still describes the retired seeder (declared rules seeded into sys_sharing_rule). Its assertions run the platform's compiler and stay green. It was not edited, because it was not red. Carrier: none.
  • src/sales/objects/index.ts keeps two waits on upstream fixes "in the pinned version" (the attachment and comment-delete gates on controlled_by_parent parents). No changeset in this range names them, and they were not re-measured.
  • contract.object.ts's title could now carry the account name through one hop (item 7). It is left as shipped.
  • Release-notes host. docs.objectstack.ai answered 403 at this container's egress proxy.

Generated by Claude Code

All 23 @objectstack/* entries move 18.0.0-next.3 -> 18.0.0-next.5
together; specVersion and engines.protocol follow in the manifest and
both package stacks. pnpm-lock.yaml regenerated by pnpm install.

The bump alone: os validate, os lint and os build refuse Sales Home's
`main` region `width: 'large'` (objectstack#24326, spec 18 refuses
small/medium/large on a region named main).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDgipbNowaGa139em8Fhoq
… spec 18.0.0-next.4 refuses

@objectstack/spec 18.0.0-next.4 (changeset 24326-main-region-width-refused)
refuses `small` / `medium` / `large` on a region named `main`: the console
draws `main` at the width its template leaves it, so the key changed nothing
on screen. FROM `width: 'large'` TO no `width`, on Sales Home, the lead,
opportunity and case record pages. Every other region keeps its width.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDgipbNowaGa139em8Fhoq
… list-view has a props contract

- `test/escalated-case-previous-owner.test.ts` and the territory block of
  `test/demo-staffing.test.ts` resolved declared sharing rules through their
  `sys_sharing_rule` rows. Since 18.0.0-next.4 plugin-sharing reads a declared
  rule from the registry and writes no row (changeset
  23952-declared-sharing-rules-registry): its id is its name, and its grants
  carry that name as `source_id`. The grants are read by that name, and the
  territory rules are read and evaluated through `/sharing/rules/NAME`.
- `test/metadata-references.test.ts`: `ComponentPropsMap` gained a `list-view`
  row (changeset 22444-list-view-component-props-row), so the one
  `NO_PROPS_CONTRACT` exemption goes and Sales Home's list blocks join the parse.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDgipbNowaGa139em8Fhoq
…Log entry, and formula one-hop reads

- The three What's new latest-release sections and docs/STATUS.md: 5.1.2
  shipped on 18.0.0-next.3, the release after it runs on 18.0.0-next.5.
- Setup's audit entry is now one "Audit Log" that opens the audit browser
  (changeset 23890-one-audit-entry); the English and zh-Hant pages that sent
  readers to "Setup → Audit Logs" name it.
- Three comments said a formula cannot read through a lookup. Since
  18.0.0-next.4 it reads one hop (changeset 24197-objectql-formula-one-hop);
  each now dates the old measurement, and the line items' stored title keeps
  its reason (a formula value is stored nowhere, so search cannot scan it).

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDgipbNowaGa139em8Fhoq
…gh 18.0.0-next.5

The key and the seeding behaviour it names were not re-checked on this bump
either; the list says so for next.4 and next.5 too.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDgipbNowaGa139em8Fhoq
@vercel

vercel Bot commented Oct 19, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Oct 19, 2026 1:33pm UTC

Request Review

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

CI red on ba6e8e31, expected and owned · repo:hotcrm seat · session session_01BDgipbNowaGa139em8Fhoq · 2026-10-19T13:30Z

What fails: Build and Test (22.x), run 39258793026, exactly the two test/demo-staffing.test.ts tests that spawn pnpm demo:staff:

  • :618, "scripts/demo-staff.ts did not connect";
  • :632, "Acme Platform Upgrade is owned by … not by a demo person".

Why: this PR's own item, not a flake. 18.0.0-next.4 refuses runAutomations: false on the import door to every caller but the system principal (objectstack-ai/objectstack#24348). scripts/demo-staff.ts step 3 hands the large deals over that way, so it exits at step 3 and nothing is handed over.

Fix, in flight on this branch:

  • The claim's surface now includes scripts/demo-staff.ts (card comment 6268235977).
  • Step 4 lists and evaluates sharing rules by name.
  • Step 3 takes a recall-then-owner-save route (B), falling back to dropping the opt-out (A).

No re-run is spent: the next push carries the fix.

…he sharing rules through the sharing door

Two edits 18.0.0-next.4 forces on `pnpm demo:staff` (claim amendment
6268235977 on #2179):

- Step 4 listed the rules to re-evaluate from `sys_sharing_rule`. A declared
  rule has no row there any more (objectstack#23952): it now lists
  `GET /api/v1/sharing/rules?activeOnly=true` and evaluates each rule by its
  id, which for a declared rule is its name.
- Step 3 handed the large deals over through the import door with
  `runAutomations: false`, and step 5 had each owner save them, so the rep
  submitted the approval (#2129). The import door now refuses that opt-out to
  every caller but the system principal (objectstack#24348). The seat's
  option B, recall then the owner's save, was measured first on
  18.0.0-next.5: the recall unlocks the deal (the rep's save 409 before, 200
  after), but it leaves `approval_status` at `recalled` and
  `opportunity_approval` enters only from `not_required`, so the owner's save
  opens nothing. So option A lands: every routed row goes over through the
  same PATCH, the hand-over opens each large-deal request with the dev admin
  as submitter, waiting on the sales manager, and step 5 is gone.

`test/demo-staffing.test.ts` re-pins its two spawn tests to that outcome.
`test/backfill-query-bodies.test.ts`'s door stub answers the sharing-rule
list, which the script now reads instead of a query.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BDgipbNowaGa139em8Fhoq
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT (#2179, maintainer direct dispatch 「你不用下班,继续处理 objectstack 升级到 next.5」, p1) · PR #2181 at aa09ea25aa · repo:hotcrm seat · os-project-manager · session session_01BDgipbNowaGa139em8Fhoq · 2026-10-19T13:53Z · reports on hotcrm#2179 (6268190358; round 2 6268806585) · after one patch round (surface amended 6268235977)

  1. Shape:
    • Draft, opening with Fixes #2179 and Clause-②: no. Assignee os-project-manager.
    • 29 files, +742 / −781 (lockfile 1,018 of them). No governed path; under the 3,000-line line.
    • 0 model-identifier lines in the commits. The only closing keyword is Fixes #2179.
    • The head contains main cc0608c, which is main's tip.
    • The body was corrected by the seat after round 2 with issue_patch: the Stopped section became "option A landed", plus the Testing rows, the checklist item and the browser-pass line. The read-back is identical (26,769 bytes).
  2. Premise: npm next = 18.0.0-next.5, published 2026-10-19T11:06Z, for all 23 pinned packages. Framework 820fd5aef (chore: version packages (next) objectstack#24477); next.4 is 725a5b131.
  3. The diff, read:
    • Pins: all 23 pins move together. specVersion / engines.protocol are ^18.0.0-next.5 in objectstack.manifest.json and both package manifests. pnpm regenerated the lockfile: 56 @objectstack keys moved one for one, with no third-party change.
    • The one forced metadata edit: width: 'large' is gone from four main regions (home, lead, opportunity and case pages), which spec next.4 refuses (Seam: a page region's declared width on the three-column template's main region is accepted and never applied (ThreeColumnTemplate draws main as flex-1 and reads no main.width) objectstack#24326).
    • Test moves onto next.4 contracts:
      • a declared sharing rule has no sys_sharing_rule row, and its id is its name (#23952);
      • list-view gains a ComponentPropsMap row, so NO_PROPS_CONTRACT empties;
      • Setup's one Audit Log entry;
      • the version guards.
    • Comment-only src edits: three files that date a next.3 measurement.
    • scripts/demo-staff.ts: step 4 lists GET /api/v1/sharing/rules. Step 3 hands every row over with its controls on, and step 5 is gone.
  4. Accepted deviations:
  5. Gates:
    • pnpm verify on aa09ea25 through the lock: the build half exits 0 (16 suggestions and 8 warnings, both unchanged from main), and shards 1/3, 2/3 and 3/3 each exit 0.
    • pnpm demo:staff on a fresh database, once the seed settled, exits 0 with "demo org staffed". A second run converges.
    • CI on aa09ea25: 10 of 10 checks success.
    • The red on ba6e8e31 (comment 6268430263) is fixed by this head.
  6. Changeset, read: a patch for the release-notes reader. Each user-visible line matches a measurement in the body:
    • the KPI figures read whole at 1440;
    • one Audit Log entry;
    • a public form refuses an empty required field with 400;
    • the app's sharing rules are served by name and are no longer rows.
      The operator line, "18.0 runs fresh, single-organization installs only … os migrate organization-ownership refuses to run until a later 18.x", is quoted from the platform changesets. It is flagged to the maintainer before the next HotCRM release.
  7. Out of scope, one line each:
  8. Held follow-ups:
  9. Landing: ready plus auto-merge now. Every check on this head reads success, and the head contains main's tip.

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

Labels

backend Server-side behaviour — hooks, flows, actions ci/cd CI plumbing and the verification pipeline dependencies Dependency bumps and lockfile changes documentation Improvements or additions to documentation metadata Declarative metadata — schema, security posture, UI surfaces

Projects

None yet

Development

Successfully merging this pull request may close these issues.

chore(deps): upgrade the ObjectStack platform to 18.0.0-next.5

2 participants