Repository navigation
fix: store the nine record titles so an export imports back, on ObjectStack 18.1.0 (#2230) - #2274
Merged
Merged
Conversation
All 23 entries move 18.0.0 -> 18.1.0, exact. specVersion and engines.protocol follow to ^18.1.0 in the manifest and both package indexes; pnpm-lock.yaml regenerated by pnpm install. docs/STATUS.md names the new pin, and the three What's new pages say 6.0.0 shipped on 18.0.0 and the release after it runs on 18.1.0, as #2204 worded the last mid-cycle bump. One comment that called 18.0.0 the installed version now dates its reading. Claude-Session: https://claude.ai/code/session_01FbPJaRZ8tRqzdA9z8JVwJ9 Co-authored-by: Claude <noreply@anthropic.com>
18.1.0 creates the tenant column NOT NULL (objectstack#24940), so the tests that write through a bare ObjectQL or driver over SQLite were refused at the database: 213 of the 216 failures the bump caused, all reproduced on a bump-only tree. Each such file now names one ORG and passes it as tenantId on every context it writes with; no assertion changed. The two tenant-scope files re-measure the index 18.1.0 materializes: the per-organization unique index keys the plain organization column (objectstack#24893), and a row with no organization is refused by the column itself. view-predicate-dialect sets aside a bulk action's confirmText, which compiles to a template envelope since 18.1.0 (objectstack#25451), and pins that nothing else is set aside. Claude-Session: https://claude.ai/code/session_01FbPJaRZ8tRqzdA9z8JVwJ9 Co-authored-by: Claude <noreply@anthropic.com>
…#2230) objectstack#24981 ruling A: the import matches a lookup cell against a STORED title only. The titles of account, contact (full_name), lead, forecast, product, quote, campaign, case and knowledge article were formulas, so an export's lookup column could not be imported. Each is now Field.text({ readonly: true, expression }) with the same expression; 18.1.0 computes it on every insert and every update by id, after the autonumber is issued (objectstack#25073). Account and campaign fall back to the name when the record has no number, as the product title already did (#2168). scripts/backfill-record-titles.ts titles rows stored before this change by re-sending one unchanged field (report-only without --apply, rerunnable, verified by re-read). The quote and lead freezes list the title as a key that is not a user edit, because the engine computes it before the hook; a real edit is still refused. docs/MAINTENANCE.md 3.4 documents the upgrade step. Claude-Session: https://claude.ai/code/session_01FbPJaRZ8tRqzdA9z8JVwJ9 Co-authored-by: Claude <noreply@anthropic.com>
…-JP and es-ES (#2060) lint --strict on 18.1.0 asks for 60 new keys: the six approval flows' labels and their approvals.<node>.label step names (#2060 item 13, C-15), and the Details / Related / Activity tabs of opportunity_detail_page and case_detail_page. Claude-Session: https://claude.ai/code/session_01FbPJaRZ8tRqzdA9z8JVwJ9 Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbPJaRZ8tRqzdA9z8JVwJ9 Co-authored-by: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
#2272 added both package indexes on ^18.0.0 while this branch moved the other two and the manifest to ^18.1.0; they follow. Claude-Session: https://claude.ai/code/session_01FbPJaRZ8tRqzdA9z8JVwJ9 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对ACCEPT · Contract review of hotcrm#2230: PASS. I read the diff against the card's "Done when" and the claim's file surface.
Landing authority. The maintainer, verbatim, in the seat thread: 「后续你按照pm-dispatch 规则审核通过的issue都可以落地」 (2026-10-23T13:14Z). The freeze is lifted: 「发版冻结已经解除了啊」 (2026-10-24T13:21Z). Generated by Claude Code |
This was referenced Oct 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Requested by Elon · project thread
Clause-②: no
Description
Nine record titles become stored fields, existing rows get a backfill, and every
@objectstack/*dependency moves to 18.1.0, which carries the two platform fixes the stored titles need. objectstack-ai/objectstack#24981 ruling A (6308445871): the import matches a lookup cell against a STORED title only, so a composite title that must round-trip through import is a stored field with anexpression, computed on every write.The card's restart condition holds on 18.1.0. objectstack-ai/objectstack#25073 (closed by #25218,
c8f4c43907) is an ancestor of@objectstack/objectql@18.1.0and@objectstack/driver-sql@18.1.0, and #25033 (dfe60e3a0) is an ancestor of@objectstack/core@18.1.0. A REST insert of acrm_casestoresCASE-00039 - Probe 2230 case.Type of Change
Related Issues
Fixes #2230
Part of #2060 (item 13's C-15 row; see Acceptance notes for the rest)
Changes Made
crm_account,crm_contact.full_name,crm_lead,crm_forecast,crm_product,crm_quote,crm_campaign,crm_case,crm_knowledge_article):Field.formula→Field.text({ readonly: true, expression }), same expression.nameFieldis unchanged.readonlykeeps the title off forms; the engine overwrites a client value anyway.6366357146): there,dyn<null> + stringleft both untitled. No other expression changes.scripts/backfill-record-titles.ts(new): report-only without--apply. It takes only untitled rows, re-sends one unchanged field per row (the update by id recomputes the title), and re-reads to verify. It is rerunnable.test/backfill-query-bodies.test.tscovers its query bodies.quote.hook.ts(accepted/expired) andlead.hook.ts(converted) list the title as a key that is not a user edit. The engine computes it before the hook, so the backfill's re-save of an untitled frozen row carried it and was refused 409 (measured: 2 of 6 seeded quotes). A real edit is still refused.pnpm-lock.yaml.specVersionandengines.protocolmove to^18.1.0(manifest and both package indexes), anddocs/STATUS.mdnames the new pin.lint --strictasks for on 18.1.0: 60 new warnings, all now authored in zh-CN, ja-JP and es-ES. These are the six approval flows' labels plus theirapprovals.<node>.labelstep names (Browser pass #2058 — HotCRM-side defects (18 items: accepted quote still takes lines, half-converted leads, agents losing their cases, unreachable Sales Home, …) — list card, split per item at dispatch #2060 item 13, C-15; objectstack#24863), and the Details / Related / Activity tab labels ofopportunity_detail_pageandcase_detail_page(components.<tabs>.items.<value>.label).NOT NULL(objectstack#24940), so 30 files that write through a bareObjectQLor driver over SQLite now carrytenantIdon every context they write with (oneORGconstant per file). No assertion changed.case-number-tenant-scopeandaccount-name-tenant-scope: 18.1.0 keys the per-organization unique index on the plain column (objectstack#24893), so thenullSafeColumns/COALESCEexpectations are gone. The untenanted cases now pin that the database refuses a row with no organization. The reverse-verification block says why the old spelling still stays out.view-predicate-dialect: a bulk actionconfirmTextcompiles to atemplateenvelope since 18.1.0 (objectstack#25451). The sweep sets those aside as messages, and a new case pins that onlyconfirmTextkeys are set aside.docs-declared-versions: the three What's new pages now say 6.0.0 shipped on 18.0.0 and the release after it runs on 18.1.0, as chore(deps): upgrade the ObjectStack platform to 18.0.0 #2204 worded the last mid-cycle bump.18.0.0(not-next) oversrc,test,docs,content,scriptsandREADME.md: 47 hits. One asserted the installed version (campaign-enrollment.flow.ts, "the installed 18.0.0") and is now dated. The rest say "measured on 18.0.0" or name a release, and stay. A grep finds only text that carries the version number; the same fact in other words is not covered.docs/MAINTENANCE.md§3.4 (the upgrade step) andcontent/docs/service/cases*.mdx(the title is stored, not a formula). One changeset.Testing
All on this head, with Node 22.22.0.
pnpm validate0 ·pnpm typecheck0 ·pnpm lint(--strict) 0, 16 suggestions ·pnpm hygiene0 ·pnpm hygiene:tokens0 ·pnpm build0 ·pnpm test0, 219 files, 4313 passed, 1 skipped (all onepnpm verifyrun, exit 0)pnpm buildprints 8 author-time warnings: sevenapproval-approvers-may-resolve-empty(every approver on the node is a position) and thehierarchy-securitycapability note. That rule ships in 18.0.0 too (spec changeset2e11d90), so I read these as not new, but I did not re-run the build onmainto compare.test/stored-record-titles.test.ts(15 tests). It pins:crm_account.display_titleto a formula turns exactly 5 tests red: the account metadata, the import, the open-account re-save, and the quote and lead re-saves. Restored withgit diffclean.backfill-record-titles.ts --applytitled 134/134, each equal by id to its pre-upgrade formula value. Before the freeze entries, it titled 132/134: the accepted and the expired quote answered 409.internal_noteswas still accepted.GET /data/crm_contact/export(10 rows, afterpnpm demo:staffgranted the admin export) was re-imported with its columns mapped. The Account cell readsACC-000003 - Initech Solutions. All 10 rows were created, each linked to the same account as its exported row.ACC-999999 - Nobodyanswersreference_not_found.crm_account.display_titlemakes the import pin red.translatePage, andplugin-approvals' reader-locale labels in 18.1.0), but I did not see them in the console.Acceptance notes
lint --strictdoes not ask for them, so the seat needs to decide.page:tabsitem by itsvalue, andsales_home_page's three items (andlead_detail_page's) declare none, so there is no pack key to author. Addingvalues changes the?tab=URL token.objects.OBJECT._views.VIEW.title(objectstack#24969).web_to_leadandweb_to_caseauthor notitle, so they first need an authored title plus four pack keys.summary-nulls,recomputeUndefinedOnEmpty). A hosted operator runs the same script against their URL. That gap was observed and not filed (it is not a defect against a declared contract).case_escalation'srecord-after-updateleg can escalate an open Critical case that was never escalated. The script header says so.Checklist
pnpm changeset):.changeset/2230-stored-record-titles.md(minor, because the upgrade needs an operator step; the seat may re-grade it)@objectstack/*18.1.0)🤖 Generated with Claude Code
https://claude.ai/code/session_01FbPJaRZ8tRqzdA9z8JVwJ9