Repository navigation
docs(adr,skills): ADR-0144 Open items 11 and 12 settled and Open item 13 for the record-mode switch; skills name the backfill and the grouped-only aggregate (multi-currency, epic #8345) - #28181
Conversation
… for the record-mode switch; skills name the backfill and the grouped-only aggregate ADR-0144: Open item 11 gets a dated note: platform-objects owns sys_exchange_rate (#27185, PR #27246). Open item 12 gets one too: ruling 6486427200, letter A, refuses both fixed-vs-fixed shapes (PR #27991). New Open item 13 covers switching a stored amount to record mode: ruling 6492000994, letter B, implemented by PR #28128. It records that the multi-organization single-code reach stays open. Skills: field-types.md names `os migrate record-currency-codes`. dashboards.md now says sum/avg/min/max are refused "unless grouped by its code field" (the should-fix from PR #27475's review). Both files stay inside the token ratchet. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CbTZrFqRYNgjSaSbN5
Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CbTZrFqRYNgjSaSbN5
|
epic:#8345#1 · os-bill · session_01Utp6CbTZrFqRYNgjSaSbN5 Contract reviewServed-tier: PR #28181 has no card of its own. Read, as the brief lists them: cards #27577, #27579 and #27185 (body and every comment); rulings 6486427200, 6492000994 and 6522614678 on #8345, with 6485374827 and 6511509227 that the ADR notes link; PR #27475's review 6499106478 and seat record 6499122847; PR #28128's squash diff ( ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgmentdocs/adr/0144 — Open items 11, 12 and 13. An ADR is judged against its first consumer and its execution plan: each note names a landing commit and a ruling, so each sentence was read against the code at that commit as it stands on Item 11 note — holds.
Item 12 note — holds; one should-fix, routed to the code it cites.
Item 13 — holds.
skills/objectstack-ui/rules/dashboards.md (the measure-currency comment, lines 298–307 at the head) — holds; the carried should-fix is delivered.
skills/objectstack-data/rules/field-types.md (lines 180–188 at the head) — holds.
Findings: 0 must-fix · 1 should-fix ( Implemented-by: VERDICT: PASS |
|
epic:#8345#1 · os-bill · session_01Utp6CbTZrFqRYNgjSaSbN5 席位记录 · epic PM
|
epic:#8345#1 · os-bill · session_01Utp6CbTZrFqRYNgjSaSbN5
Part of #8345 (no card of its own: the epic PM carries these governed lines, as cards #27577, #27579 and #27185 and the PR #27475 review record route them here).
PR #28128 (the command the field-types line names; Open item 13 cites it) merged as
a3d24c99; this branch carries that merge.Ruling-ref: 6522614678
Clause-②: no
Metadata-protocol: none
维护者速读
sys_exchange_rate归属 platform-objects,PR feat(platform-objects): sys_exchange_rate — an organization's dated exchange rates, admin-written and audited, with a Setup list under Localization #27246)与 12(fixed↔fixed 两种形状编译期拒绝,裁决 6486427200,PR fix(service-analytics): a dataset refuses a measure currency that contradicts its field's fixed code, and a derived measure across two different fixed codes #27991)各加一条日期注记标为已定;新增开放项 13:已有数据的金额字段切到record(裁决 6492000994 B,PR feat(objectql,cli,metadata-protocol): backfill the currency code of rows stored before an amount switched to record mode, and acknowledge the switch with a 409 at the save #28128 的回填命令与 409),并记下多组织部署上单一--code可能写错、与云租户入口一起留待以后;skills 两行:field-types 点名os migrate record-currency-codes,dashboards 把「ungrouped」改成「unless grouped by its code field」。node scripts/check-skills-token-ratchet.mjs、pnpm check:adr-anchors、pnpm check:adr-index均退出 0。docs/adr/**、skills/**):契约复审 PASS 与席位 ACCEPT 之后,由os-zhuang或hotlong在该 head 批准;feat(objectql,cli,metadata-protocol): backfill the currency code of rows stored before an amount switched to record mode, and acknowledge the switch with a 409 at the save #28128 已合并(a3d24c99)。What changes
docs/adr/0144-…, Open items (this record is amended with each answer, as its own Open items preamble says):*Note (2026-10-30):*marking it settled.@objectstack/platform-objectsownssys_exchange_rate, landed in PR feat(platform-objects): sys_exchange_rate — an organization's dated exchange rates, admin-written and audited, with a Setup list under Localization #27246 (194e66c0). The reasoning is the settlement's own, from 6511509227 on platform-objects:sys_exchange_rate{ currency, rate, effective_date, source } — tenant-scoped, admin-only, audited; Setup list view (multi-currency M1-1, epic #8345; released with M2) #27185: the one reader is the engine's write path; ADR-0029 D2 gives it no capability boundary; it registers withsys_migrationandsys_secret.fixed-vs-fixedshapes at dataset compile, and card service-analytics: refuse fixed-versus-fixed cross-currency measures at dataset compile (multi-currency, epic #8345) #27579 landed that in PR fix(service-analytics): a dataset refuses a measure currency that contradicts its field's fixed code, and a derived measure across two different fixed codes #27991 (6dc06b2e). What fix(service-analytics): a dataset refuses a measure currency that contradicts its field's fixed code, and a derived measure across two different fixed codes #27991 refuses, and what it leaves unjudged, is read offmeasure-currency-coherence.tsat that commit.currencyMode: 'record'. It is written as the open question, which PR feat(objectql): record-currency guards — blank code refuses the write; ungrouped sum/avg/min/max over a record-mode amount refused; summary roll-up over one refused at registration #27339's review 6490309706 ③ escalated, followed by the settled note: ruling 6492000994, letter B. PR feat(objectql,cli,metadata-protocol): backfill the currency code of rows stored before an amount switched to record mode, and acknowledge the switch with a 409 at the save #28128 (a3d24c99) landed that ruling with the backfill command and the 409currency_mode_to_recordfinding, lifted byforce, which reads no row and is not refused at boot. Two things stay open: how a cloud tenant without a CLI reaches the backfill (left open by the ruling), and, beside it, the fact that one--codeis written across every organization's rows. The second is should-fix S1 of PR feat(objectql,cli,metadata-protocol): backfill the currency code of rows stored before an amount switched to record mode, and acknowledge the switch with a 409 at the save #28128's contract review.skills/objectstack-data/rules/field-types.mdadds one line: an amount field with stored rows that is switched to'record'is backfilled withos migrate record-currency-codes. It is paid for by deleting the derived-measure sentence, which restatesobjectstack-ui/rules/dashboards.md; a pointer to that guide replaces it. The ratchet reads 3207 / 3207.skills/objectstack-ui/rules/dashboards.md: "refusescurrencyand ungrouped sum/avg/min/max" becomes "refusescurrency, and sum/avg/min/max unless grouped by its code field". This is the should-fix from PR #27475's review (6499106478), which its seat record (6499122847) carried here. It is paid for by dropping a restated key (e.g. currency: 'USD'→e.g. 'USD'). The ratchet reads 6261 / 6262..changeset/8345-currency-mode-switch-skills.md:@objectstack/skillspatch, the same shape as #27475's skills changeset.Why
The ADR says it is "amended with each answer". Open items 11 and 12 have been answered and have landed, and the mode switch was ruled after the ADR merged. The skills catalog ships verbatim to third-party agents, so it has to name the backfill and describe the grouped-only aggregate rule that the engine enforces. Ruling 6522614678 (letter A) puts this PR on the R2 development path; it is not release-paired.
Verification
Head: the docs commit, a merge of
mainafter #28128 landed, and the item 13 citation ofa3d24c99. The text was drafted by the seat, and the final pass was made at the derived mandated tier, which was checked againstgit show 194e66c0,git show 6dc06b2eand PR #28128's diff.node scripts/check-skills-token-ratchet.mjs: exit 0 (field-types 3207 / 3207, dashboards 6261 / 6262).pnpm check:adr-anchors,pnpm check:adr-index,pnpm check:adr-symbol-anchorsandnode scripts/check-adr-links.mjs: exit 0.dispatch-gates --commandson23b3eb6c(4 paths againstorigin/main) derives 49 families. Each was run with its exit code captured before any pipe, and all 49 exited 0. The dist-reading families ran afterpnpm install --frozen-lockfile && pnpm build. That build had 114 of 115 tasks green. The one red was@object-ui/console, which read a@object-ui/reactdist built beforemainwas merged in mid-build. It is unrelated to this markdown-only diff.docs/adr/**andskills/**is the mandated tier at xhigh. The final text pass ran there.Human Minimum
packages/specholds no runtime logic. (not touched)main, one pull request.packages/spectouched: n/a.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.🤖 Generated with Claude Code
https://claude.ai/code/session_01Utp6CbTZrFqRYNgjSaSbN5