Skip to content

Upgrade duly to @objectstack 18.3.0 - #186

Merged
os-warren merged 2 commits into
mainfrom
claude/project-thread-38d9ev
Nov 3, 2026
Merged

os-warren merged 2 commits into
mainfrom
claude/project-thread-38d9ev

Conversation

@os-warren

@os-warren os-warren commented Nov 3, 2026 •

Copy link
Copy Markdown
Collaborator

Requested by Warren · project thread

Fixes #185

What changes

Every @objectstack/* range in package.json moves from ^18.2.0 to ^18.3.0 (all 16 resolve to 18.3.0), and pnpm-lock.yaml is regenerated.

On main 16d2644 with only the bump, typecheck passed, validate and build failed with 6 findings, and test failed 9 of 1327. There were three causes, each fixed at its cause:

  1. Action dialog and outcome copy are template slots in 18.3 (upgrade-guide entry action-dialog-outcome-copy-template-holes). An action's description, each params[].helpText and each outcomeMessages entry now parse to { dialect: 'template', source }, and the gates refuse ${…}.
    • The six Apply outcome toasts on duly_catalog_apply and duly_catalog_apply_to_people now use {{ result.x }} holes, in en (src/actions/catalog.actions.ts) and zh-CN (src/translations/zh-CN.ts).
    • src/translations/authored-text.ts gives each envelope's .source a translate verdict at the same bundle key (description, outcomeMessages.<o>, params.<p>.helpText) and .dialect a machine verdict. The stale note on translateAction is refreshed, because 18.3 now applies description, params and outcomeMessages from those addresses.
    • test/catalog-apply-unit.test.ts reads the envelope's .source and matches {{ result.x }} holes.
  2. The platform's translatable metadata types gained book. duly declares no book, so no untranslatable verdict moves. The pin in test/i18n-coverage.test.ts widens, and the rationale is recorded beside it.
  3. plugin-email folds a recipient's locale (objectstack#28880). zh and zh-TW recipients now get the zh-CN row instead of the en-US floor. test/email-templates.test.ts had pinned this so it would go red when folding landed. Only those two rows change, and the comment now explains the 18.3 ladder.

No gate is skipped and no assertion is weakened.

Opening a person lands on the Duly member page (6f8f0ec)

In 18.3 the console no longer renders the #113 stopgap duly_member_open in the person header menu, so the member page had no way in. 18.3 ships PageSchema.apps (objectstack#28979), so src/pages/member.page.ts now declares apps: ['duly_app']. Inside Duly, opening a person shows duly_member. Setup → Users still shows sys_user_detail.

  • The page note is updated with the 18.3 measurement.
  • test/member-page.test.ts pins the app slot. It checks that Duly resolves to duly_member, that no app and Setup resolve to sys_user_detail, and, as a control, that without apps Duly resolves to sys_user_detail.
  • duly_member_open is left as it is.
  • apps also gets a machine verdict in authored-text.ts.

Browser check on this head, in en and zh: the drawer from People renders all three sections, and Setup → Users (both the list click and the direct route) stays sys_user_detail.

Known 18.3 limit: "Open full page" from the drawer, and the route /sys_user/record/<id>/page/duly_member, still answer 400 until objectstack#29946 lands. The record-page request check accepts only lookup and master_detail relationships, and duly_task.owner is a Field.user.

Gates (local)

Gate 5495cc1 6f8f0ec
pnpm validate exit 0 (only the expected hierarchy-security warning) exit 0
pnpm typecheck exit 0 exit 0
pnpm test 47 files, 1327/1327 passed 47 files, 1329/1329 passed
pnpm build exit 0 exit 0

The full browser check (en-US and zh-CN against the 18.2 baseline at 16d2644) and the re-measurement of the workarounds are reported separately, in the project files under duly-18.3-browser-check/.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JQwxbYb3sm2qHar9rVa6Ko

Every @objectstack/* range moves to ^18.3.0 and the lockfile is
regenerated. Three things the bump broke, each fixed at its cause:

- An action's description, params[].helpText and outcomeMessages are
  template slots in 18.3 (action-dialog-outcome-copy-template-holes).
  The six Apply outcome toasts, en and zh-CN, now read {{ result.x }}
  holes instead of ${result.x}. The i18n walk gives each envelope's
  .source a translate verdict at the same bundle key and .dialect a
  machine verdict; the stale translateAction note is refreshed, since
  18.3 now applies description, params and outcomeMessages.
- The platform's translatable metadata types gained 'book'. duly
  declares none, so no untranslatable verdict moves and the pin widens.
- plugin-email folds a recipient locale against the template's locales
  (objectstack#28880): zh and zh-TW recipients now get the zh-CN row
  instead of the en-US floor, the change the test was pinned to catch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JQwxbYb3sm2qHar9rVa6Ko
@os-warren os-warren self-assigned this Nov 3, 2026
…ps (#185)

18.3 ships the app slot for record pages (objectstack#28979). duly_member
names apps: ['duly_app'], so Duly > People > a person opens the member
page, while Setup > Users keeps plugin-auth's sys_user_detail. On 18.3
it is also the only entry: the console no longer renders the
duly_member_open header action, which stays for now and is a follow-up.

The page note records the measurement and the known 18.3 limit: the
full-page route answers 400 because the record-page request refuses a
related list over a user field (objectstack#29946). The drawer renders
every region. test/member-page.test.ts mirrors the 18.3 console rule
and pins both answers; the i18n walk classifies page.apps[] as machine.

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

Copy link
Copy Markdown
Contributor

席位核对

ACCEPT: PR #186 at head 6f8f0ec39827893190ccff7cbe6fc0e2f68af94e (duly lane seat, session session_011HyoSXGRy6L13mYq1Hp4n1, 2026-11-03T16:43Z). Implemented by the #185 card thread session_01JQwxbYb3sm2qHar9rVa6Ko under the #185 Claim and its amendment.

  • Shape: based on main 16d2644, with Fixes #185, Clause-②: no and Metadata-protocol: none.
  • Files (API list): package.json, pnpm-lock.yaml, src/actions/catalog.actions.ts, src/pages/member.page.ts, src/translations/authored-text.ts, src/translations/zh-CN.ts, test/catalog-apply-unit.test.ts, test/email-templates.test.ts, test/i18n-coverage.test.ts and test/member-page.test.ts. All are inside the Claim as amended, and none is a governed path.
  • Gate:
    • Check-run verify is success on 6f8f0ec, and mergeable_state is clean.
    • The thread ran validate, typecheck and build locally (exit 0 each) and test (1329/1329).
    • The lockfile resolves every @objectstack/* entry to 18.3.0 (126 of 126).
  • Read in the diff:
    • All 16 ranges are ^18.3.0.
    • The six outcomeMessages (en and zh) use {{ result.x }}.
    • The action description, params[].helpText and outcomeMessages slots get .source translate and .dialect machine verdicts. Bundle keys keep their addresses.
    • zh and zh-TW recipients fold to the zh-CN email row (objectstack#28880). A language the app never authored still gets English.
    • duly_member gains apps: ['duly_app']. member-page.test.ts pins the app and the no-app resolution, plus a control without apps.
  • Browser check (Warren's standing rule), fresh demos in en-US and zh-CN against the 18.2 baseline 16d2644: the report is in the project files duly-18.3-browser-check/REPORT.md.
  • Re-measured 18.2 workarounds: report only, nothing changed here. The seat files the follow-ups.
    • Fixed upstream: #28979 (apps), #28995 (row url action context), #28898 (Intl.DateTimeFormat in a job body) and #28885 (import required-with-default).
    • #29106: a name-only sys_business_unit mask now leaves admin Setup intact. referenceNameVisible alone breaks Import as duly_admin.
  • Landing: direct-merge repo. The seat flips the PR ready and squash-merges it with expected_head_sha pinned.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 3, 2026 16:44
@os-warren
os-warren merged commit ce6fc4b into main Nov 3, 2026
1 check passed
@objectstack-fleet

Copy link
Copy Markdown
Contributor

Landed

Seat landing at 2026-11-03T16:45Z (duly lane seat, session session_011HyoSXGRy6L13mYq1Hp4n1). The seat flipped the PR ready through the relay, then squash-merged it with expected_head_sha 6f8f0ec pinned.

probe reading
PR object merged: true, merge_commit_sha ce6fc4b
origin/main by content ce6fc4b, single parent 16d2644; package.json carries 16 ^18.3.0 ranges, and duly_member declares apps: ['duly_app']

State: #185 is closed completed by Fixes #185, and pm:dispatched is removed. duly is on @objectstack 18.3.0. Known limit: objectstack-ai/objectstack#29946 (member page full-page route). The seat files the follow-ups from the re-measures.


Generated by Claude Code

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.

Upgrade duly to @objectstack 18.3.0, with the full browser check

2 participants