Skip to content

chore(core): upgrade to ObjectStack 18.3.0 and retire the fixed workarounds - #99

Merged
marchtian merged 1 commit into
mainfrom
claude/project-thread-sa2lct
Nov 3, 2026
Merged

marchtian merged 1 commit into
mainfrom
claude/project-thread-sa2lct

Conversation

@marchtian

Copy link
Copy Markdown
Collaborator

Requested by 田騏 · project thread

What

Upgrade from ObjectStack 18.1.0 to 18.3.0 (released 2026-11-03), following the 18.1.0 upgrade (#84).

Upgrade

  • All @objectstack/* pins, CLI overrides and engines.protocol → 18.3.0.
  • 18.3.0 checks translations for positions, permission sets and reports: English labels added to the bundle (objectstack#25652, #25788).

Workarounds retired (fixed in 18.3.0)

  • PF14 objectstack#25683: zh-CN bundle that only carried two KPI help texts removed; help texts written back on the fields.
  • objectui#13436: readonlyWhen id guard removed from bank account and change request (disposition keeps it, since "only on create" there means "saved").
  • objectstack#25672: portal hides risk_level again; supplier search still works (new assertion in test/portal-isolation.test.ts).
  • objectui#13470: delivery report label/description moved into the bundle, English added.
  • objectui#13471: audit calendar title is the supplier again.

Behaviour changes in 18.3.0 handled here

  • modifyAllRecords now overrides the same set's read-only field mask (lint security-superuser-field-mask-inert), so srm_admin could edit performance-review scores. Replaced with allowEdit + allowDelete and two row policies (delete, update) scoped to performance reviews; all fields stay read-only for the admin. Reviews are system-generated with no owner, so neither ownership nor writeScope can admit the delete.
  • File fields only accept files the writer can open (objectstack#25692): test uploads now carry an owner (test/support/files.ts).
  • PF18 objectstack#29050 fixed: flow start doors read recordId as the caller first; a portal user's direct trigger on another supplier's record is now a 404 before any run. Tests assert that; the in-flow roster checks stay as a second line (they still refuse internal users and plain portal users who can read the record). Direct triggers need objectName, which stack.flows.run cannot send, so tests use test/support/flows.ts.
  • PF16 objectstack#26133 / PF10 objectstack#25579: rows sharing a match key are no longer written; a second primary contact in one sheet is refused. Both import trials re-pinned (the legacy trial now imports once raw, then again after removing duplicates per checklist §6.2 item 5); guides §6 / §5 updated.

Docs: 07 §6.1 / §6.3 status column now reflects 18.3.0 for every platform issue, plus a short list of 18.3.0 behaviour changes; 03/04/05/06 notes updated.

Not in this PR (platform feature available, adopting it changes behaviour): #96 approval excludeSubmitter (PF5), #97 import create-only columns / ordered match keys / transforms (PF8, PF9, PF11), #98 {{baseUrl}} links, mail to non-portal contacts, SCAR api heartbeat (PF20, PF3, #25675). #95 will use referenceNameVisible (director ruling 2026-11-03, posted on #95) after this merges.

How it was verified

  • pnpm verify (validate, lint --strict, typecheck, i18n --strict, 358 tests, build) green locally.
  • Local browser + REST regression on a fresh pnpm setup:local (18.3.0): two portal users opened through the real invite → sign-up → accept → 开通门户 flow. 27 REST isolation checks passed: list/search/query across 12 portal objects show no other supplier's rows, by-id read of the other supplier is 404, direct trigger on the other supplier's record is 404 and without objectName 400, sys_user shows only self, material catalogue refused, and after the contact is deactivated the same session reads zero rows. Browser screenshots: create forms for bank account / change request / disposition / application are editable, the audit calendar shows supplier names, the delivery report renders in zh and en, the portal profile hides 风险等级, opening another supplier's record shows 未找到记录. Non-admin user search returns 200. Hosted recheck V6 is still outstanding, as before.

Generated by Claude Code

…rounds

- Pin every @objectstack/* package and the CLI overrides to 18.3.0 and
  require protocol ^18.3.0.
- Translate positions, permission sets and the delivery report through the
  translation bundle (18.3.0 makes them translatable; objectstack#25652,
  objectui#13470). Drop the zh-CN bundle that only carried KPI help texts
  (objectstack#25683).
- Retire the objectui#13436 id guard on the bank account and change request
  readonlyWhen conditions, hide risk_level from the portal again
  (objectstack#25672) and show the supplier as the audit calendar title
  (objectui#13471).
- srm_admin no longer uses modifyAllRecords on performance reviews: 18.3.0
  lets it override the set's own read-only field mask, so the admin could
  change scores. Deletion now comes from delete/update row policies on the
  admin set, and every field stays read-only.
- Tests: file fields only take files the writer may open (objectstack#25692),
  so test uploads carry an owner; direct flow triggers name the record's
  object, and a portal user's trigger on another supplier's record is now
  refused at the door with 404 (objectstack#29050). Flow roster checks stay
  as a second line.
- Import trials: rows sharing a match key are no longer written
  (objectstack#26133) and a second primary contact in one sheet is refused
  (objectstack#25579); re-pin both trials and update the import guides.
- Record the 18.3.0 status of every platform dependency in 07 §6. Features
  that change behaviour are follow-ups: #96 (excludeSubmitter), #97 (import
  features), #98 (e-mail links, non-portal contacts, api heartbeat); #95 now
  uses referenceNameVisible per the director ruling.

Claude-Session: https://claude.ai/code/session_017ihL2gLXX4axWXAm8MYCPE
Co-authored-by: Claude <noreply@anthropic.com>
@marchtian marchtian self-assigned this Nov 3, 2026
@marchtian
marchtian merged commit 2d28a25 into main Nov 3, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants