Skip to content

docs(adr): ADR-0144 settles Open items 2, 3, 4, 6 and 9, records ruling 6539345871 (A′ and B), the rounding mode and CLDR fraction digits (multi-currency, epic #8345) - #30182

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-b5ine2
Nov 5, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/project-thread-b5ine2

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Bill · project thread

epic:#8345#1 · os-bill · session_01Utp6CZWjnSeed8H4dMjt9d

Fixes #30102
Supersedes #30174 (same branch and head a0c8d7ca, body unchanged; reopened through the fleet relay, which the dispatch protocol requires for a pull request).
Ruling-ref: 6539345871
Not release-paired: docs/adr/** only, no changeset — the diff publishes nothing from any released package (skip-changeset).

Clause-②: no
Metadata-protocol: none

维护者速读

What changes

One file, docs/adr/0144-…, eleven edits, each in the dated-note form PR #28181 used for Open items 11–13. Every claim about behaviour cites the tree on main at f68b47ca by file#symbol, read for this PR, not recalled; every landing cites the pull request and its merge commit.

Open items (the Task list's first bullet):

  • Item 2 — which rate row. Settled as workload row M2-2 read it: the organization's sys_exchange_rate row for the record's currency with the latest effective_date on or before the document date; a later row never applies; none in force refuses ERR_EXCHANGE_RATE_MISSING. Evidence: the find under $lte / desc / limit: 1, as a system read in the row's own organization (engine.ts#homeAmountServing); a non-positive rate counts as missing and the read is memoized per (organization, currency, day) (home-amount-projection.ts#projectHomeAmounts, #memoizeHomeAmountServing). Ruling 6539345871 letter B is recorded here: a datetime document date is its calendar day in the organization's localization.timezone, UTC when unset or unknown, never the request zone (#documentDateOf); not chosen: A. The blank-date VALIDATION_FAILED / required refusal is named. Review 6539117549 and its delta 6539668963 are cited.
  • Item 3 — arithmetic and rounding. Settled with one correction to the item's own sentence: the digit count is CLDR's, not ISO 4217's. Amount ÷ rate in exact scaled-decimal (BigInt), rounded once, half away from zero (1.005 → 1.01, -0.125 → -0.13) to the home currency's fraction digits, stored as the bare number ADR-0104 D1 requires (#divideToPlaces, #divideRoundHalfAwayFromZero, #toScaledDecimal); the rate is stored unrounded so the home amount reproduces from the stored pair; a declared scale on the rate field reaches display only because every numeric column takes the one decimal(65, 30) representation (numeric-column-representation.ts#numericColumnFor), and the spec-side refusal of a scale below 12 is named as spec-lane work, not decided. CURRENCY_FRACTION_DIGITS is CLDR currencyData (IQD 0 vs 3; HUF, COP, IDR, PKR and other unused-minor-unit codes 0 vs 2), exported from @objectstack/spec/data for this one reader; review F1 / should-fix S2 and the ruling's S2 order are cited.
  • Item 4 — unset home currency. Settled by refusal: ERR_HOME_CURRENCY_UNSET / 400 before anything is written, no default (#HomeCurrencyUnsetError, thrown by #projectHomeAmounts); the review's reasoning against D5's rejected fallbacks and D8 rule 5, and why the code is its own ledger member, are recorded (6539117549 ③.1). The settings bridge is named (engine.ts#setHomeLocalizationResolver, plugin.ts): no service or unregistered key reads as unset and refuses; any other settings error is the write's failure. The refusal is at write, not registration. The lock (service-settings: lock localization.currency once a sys_exchange_rate row or a homeAmount declaration exists; Setup shows what uses it (multi-currency M1-3, epic #8345) #27198, PR feat(service-settings): the default currency locks once an exchange rate or a home-currency amount uses it, and Setup names what uses it (multi-currency M1-3) #28297 291bf44a) refuses a change to a set value and passes the first setting of an unset one (localization-currency-lock.ts#localizationCurrencyWritePredicate).
  • Item 6 — same currency as home. Settled as the row read it: rate 1, no lookup, no rate row needed, still rounded, rate field stores 1 (#projectHomeAmounts, the code === home arm).
  • Item 9 — refusal codes. Settled: three codes in ADR-0112's extension ledger under @objectstack/objectql (error-code-ledger.zod.ts#ERROR_CODE_LEDGER): ERR_CURRENCY_CODE_REQUIRED (objectql: record-mode guards — blank code refuses the write; ungrouped sum/avg/min/max over a record-mode field refused; summary roll-up over one refused at registration (multi-currency M0-2, epic #8345) #27186, 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 57c51aab; record-currency-code.ts#RecordCurrencyCodeRequiredError), ERR_EXCHANGE_RATE_MISSING (#ExchangeRateMissingError, what its message names) and ERR_HOME_CURRENCY_UNSET (#HomeCurrencyUnsetError), the last two in PR feat(objectql): store a record-mode amount converted into the home currency on every write (multi-currency M2-2) #28302. The two VALIDATION_FAILED reuses (required on a blank document date; invalid_value on a divergent predicate update, #settleBulkHomeAmounts) and the validate() preview (engine-references-and-master-detail.ts#previewHomeAmounts, engine-validate.ts) are recorded.

Ruling 6539345871 letter A′ (second bullet): a dated note at the end of D9: 18.3.0 (Version Packages #26517, version commit 83d7e4ae, merged 2026-11-03) carries R1 and the R2 core together — sys_exchange_rate (#27185, PR #27246 194e66c0), currencyConfig.homeAmount (#27191, PR #28096 73b72709), the write-time projection (#27192, PR #28302 6762dd91) and the localization.currency lock (#27198, PR #28297 291bf44a), each named in its package's ## 18.3.0 CHANGELOG section and on content/docs/releases/v18/18-3.mdx; the pairing rule holds as written; what changed is the release gate of ruling 6522614678 (letter A), in one respect, with the ruling's reason; #27193 / #27190 / #27196 are R2.1; the options not chosen (A, B, C). The TL;DR delivery bullet gets a two-sentence note pointing at D9, since the claim's file surface lists TL;DR and the bullet otherwise contradicts it.

Rounding mode and the unrounded rate (third bullet): in the Item 3 note, as above.

CLDR, not ISO 4217 minor units (fourth bullet): in the Item 3 note; in Context §1 (the ISO 4217 value-domain bullet, whose "no reader" sentence gets a dated note: the values have their reader, and they are CLDR fraction digits); and in Consequences ("may get their first reader" — they did, as CLDR digits).

"The only ledger additions" (fifth bullet): the Status block's "Builds on" line now reads three codes — a blank code, a missing rate, an unset home currency (Open items 4 and 9) — registered in the ledger, with a dated note saying what the sentence said before and why the "only" claim is dropped. The Evidence line says where the 2026-11-04 notes were read (f68b47ca).

Open item 13 (sixth bullet): untouched. The seat reported PR #28128 S1 unruled at this head.

Not touched: code, skills/**, .claude/**, every other ADR, docs/adr/README.md (adr-index --report says it is current: the record's first status line did not change).

Why

The record's Open items preamble says "This record is amended with each answer." Items 2, 3, 4, 6 and 9 were answered by PR #28302 (its body's "ADR-0144 open items settled here" and its two contract-review records), and 18.3.0 shipped them on 2026-11-03; ruling 6539345871 amended the release pairing (A′) and settled the datetime day (B) and ordered the ADR amendment (review should-fix S4). On main the five items still read as open, the Status block still says two ledger codes, and Item 3 and Context §1 still say ISO 4217 minor units where the tree reads CLDR digits. Card #30102 carries this amendment from the predecessor's sign-off ledger.

Verification

Head a0c8d7ca: two docs commits on claude/project-thread-b5ine2, branched from origin/main at f68b47ca — the amendment (244f2ff0) and the contract review's two should-fixes (Provenance §1 names ruling 6539345871 and §3 the f68b47ca reading; the Open item 2 note quotes the rate predicate verbatim). The four ADR checks below were re-run on a0c8d7ca, all exit 0; the 21-command gate sweep and its --ran reconciliation ran on 244f2ff0, and the second commit changes prose in the same file only.

  • pnpm check:adr-anchors (self-test 133 assertions + full sweep): exit 0.

  • pnpm check:adr-index (self-test 46 assertions + --report): exit 0, docs/adr/README.md current.

  • pnpm check:adr-symbol-anchors: exit 0 — every file#symbol this PR adds resolves (the sweep reports 3107 anchors across 149 records, 0 line anchors).

  • node scripts/check-adr-links.mjs: exit 0 (979 relative links resolve).

  • node scripts/check-commit-card-trailers.mjs --range origin/main..HEAD: exit 0.

  • node scripts/pm/dispatch-gates.mjs --commands <the ADR path> derives 21 commands (13 by path, 8 whole-tree). Each was run with its exit code captured before any pipe:

    Command Exit
    node scripts/check-adr-links.mjs 0
    node scripts/check-adr-links.mjs --self-test 0
    node scripts/check-closing-keyword-parity.mjs 0
    node scripts/check-closing-keyword-parity.mjs --self-test 0
    node scripts/check-comment-mask-corpus.mjs 0
    node scripts/ci/plan-test-core-shards.mjs --self-test 0
    pnpm --filter @objectstack/lint run check:doc-formula-expressions 0
    pnpm check:adr-anchors 0
    pnpm check:adr-index 0
    pnpm check:adr-symbol-anchors 0
    pnpm check:ci-filter-parity 0
    pnpm check:closed-ceremony-text 0
    pnpm check:cross-package-test-inputs 0
    pnpm check:doc-authoring 0
    pnpm check:driver-memory-census 0
    pnpm check:gitlink-declared 0
    pnpm check:nul-bytes 0
    pnpm check:pm-governed-merges 0
    pnpm check:pm-prior-rulings 0
    pnpm check:refd-timer-probe 0
    pnpm check:watch-hint-literal 0

    pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint unbuilt in a fresh clone; the gate measured nothing); after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint it exited 0, the code recorded above. dispatch-gates --ran reconciliation on 244f2ff0: 21 derived families accounted for, 21 run, 0 NOT-MEASURED, 0 UNRUN.

  • Clone depth: this checkout is shallow (50 commits), so the merge commits of chore: version packages #26517 (83d7e4ae, 2026-11-03T14:44Z), feat(objectql): store a record-mode amount converted into the home currency on every write (multi-currency M2-2) #28302 (6762dd91), feat(service-settings): the default currency locks once an exchange rate or a home-currency amount uses it, and Setup names what uses it (multi-currency M1-3) #28297 (291bf44a) and feat(spec): currencyConfig.homeAmount — a record-mode amount declares its stored home-currency projection by pointer (multi-currency M2-1) #28096 (73b72709) were confirmed against the GitHub API and against the ## 18.3.0 CHANGELOG sections and content/docs/releases/v18/18-3.mdx on main; 194e66c0, a3d24c99, 6dc06b2e and 57c51aab are in the clone or confirmed the same way.

  • Model tier: dispatch-gates --tier derives the mandated tier for docs/adr/** at effort xhigh; the text was drafted and read at that tier.

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind. (no names added)
  • 3. No formatter ran; markdown only.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset: this diff publishes nothing (docs/adr/** only), so skip-changeset; both declaration lines are above.
  • 6. packages/spec touched: n/a.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the 维护者速读 block and quoted rulings are Chinese by the Communication rule).

🤖 Generated with Claude Code

https://claude.ai/code/session_01Utp6CaFs7UbZV5xCiu37Kk

…ng 6539345871 (A′ and B), the rounding mode and CLDR fraction digits

Each settled Open item gets a dated note in the form PR #28181 used for items 11 to 13, citing the tree
on main at f68b47c by file#symbol: the rate row is the latest effective_date on or before the document
date (item 2), the home amount is amount ÷ rate in exact decimal, rounded once, half away from zero, to
the home currency's CLDR fraction digits with the rate stored unrounded (item 3), an unset home currency
refuses ERR_HOME_CURRENCY_UNSET (item 4), the same currency converts at 1 with no lookup (item 6), and
three codes are in the ledger (item 9). D9 and the TL;DR record ruling 6539345871 letter A′ (18.3.0
shipped R1 and the R2 core together; #27193, #27190, #27196 are R2.1), and Open item 2 records letter B
(a datetime document date is its calendar day in the organization's localization.timezone). The Context
and Consequences lines on the fraction-digit table say CLDR fraction digits, not ISO 4217 minor units,
and the "only ledger additions" sentence is corrected to three codes. Open item 13 is untouched.

Co-Authored-By: Claude <[email protected]>
Claude-Session: https://claude.ai/code/session_01Utp6CaFs7UbZV5xCiu37Kk
…reading; Open item 2 quotes the rate predicate verbatim

Two should-fixes from the contract review of the amendment, prose only. Provenance §1 says that ruling
6539345871 amends D9's release gate (A′) and settles Open item 2's datetime day (B), carried as dated notes,
and §3 says the 2026-11-04 notes read origin/main at f68b47c. The Open item 2 note quotes the engine's
rate predicate as written in homeAmountServing (onOrBefore, the orderBy clause, limit 1) instead of a
paraphrase in code spans.

Co-Authored-By: Claude <[email protected]>
Claude-Session: https://claude.ai/code/session_01Utp6CaFs7UbZV5xCiu37Kk
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Nov 4, 2026
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation labels Nov 4, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

epic:#8345#1 · os-bill · session_01Utp6CZWjnSeed8H4dMjt9d

Reviewer: fable subagent of the epic PM seat (CONTRACT_REVIEW_TIER); carried over from #30174 (comment 6641599233), same branch and same head. Full pass at 244f2ff, then delta 244f2ff..a0c8d7c. Final head a0c8d7c: PASS, no must-fix, no open should-fix.

Contract review (delta) · PR #30174 · 244f2ff..a0c8d7c · CONTRACT_REVIEW_TIER
Verdict: PASS

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: a0c8d7c (one docs commit over 244f2ff on origin/claude/project-thread-b5ine2)
Scope: docs/adr/0144-multi-currency-record-currency-dated-rates-write-time-home-projection.md, +9/-5, two hunks (Provenance §1 and §3; Open item 2 note). No other file.

Must-fix

None.

Should-fix

None.

Checks run

  1. S1 closed faithfully (Provenance, lines 66-78 at the new head):
  2. S2 closed faithfully (Open item 2 note, lines 377-380): the quoted predicate now reads where: { currency, effective_date: { $lte: onOrBefore } }, orderBy: [{ field: 'effective_date', order: 'desc' }], limit: 1. Compared character-for-character with packages/objectql/src/engine.ts#homeAmountServing on origin/main (9a53fc9), lines 3576-3578: identical. The gloss "with onOrBefore the document day" matches the parameter's role (rateOn(organizationId, currency, onOrBefore) is called with date from documentDateOf). The rest of the sentence (system read in the row's own organization; one organization's rate never converts another's amount; #homeAmountServing) is unchanged.
  3. Nothing else changed in meaning: git diff 244f2ff0 a0c8d7ca shows only the two hunks above; Open item 13, numbering 1–13, headings, D9 note, TL;DR note, Status block and all other dated notes are untouched. The 244f2ff record's findings carry.
  4. Gates on a scratch worktree at a0c8d7c (removed afterwards): node scripts/check-adr-links.mjs exit 0 (979 links resolve); node scripts/check-adr-symbol-anchors.mjs exit 0 (3108 anchors across 149 records resolve); node scripts/check-adr-anchors.mjs exit 0; node scripts/adr-index.mjs --report exit 0 (README current). Head-pinned CI check-runs not read here (docs-only; the seat's ACCEPT step pins them).

Contract review · PR #30174 @ 244f2ff · CONTRACT_REVIEW_TIER
Verdict: PASS

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 244f2ff (one commit on origin/claude/project-thread-b5ine2; merge-base with origin/main = f68b47c; origin/main at 9a53fc9)
Scope: docs/adr/0144-multi-currency-record-currency-dated-rates-write-time-home-projection.md (1 file, +119/-3)
Card: #30102 (open). Sources read: PR #28302 body ("ADR-0144 open items settled here", "Hand-off points"), ruling 6539345871 (A′ and B), ruling 6522614678 (A), contract review 6539117549 and its delta 6539668963 on PR #28302, PR #28181's diff (form of earlier dated notes), card #30102 body. Every file#symbol below opened on origin/main (9a53fc9); the only cited file that moved between f68b47c and origin/main is packages/objectql/src/engine.ts, and that diff touches none of the home-amount symbols (grep on the diff for homeAmount|HomeLocalization|effective_date: 0 lines).

Must-fix

None.

Should-fix

  • S1 — docs/adr/0144-…md:67-68 (Provenance §1, unchanged by this PR) still reads "Ruling 6465431966 fixes … Ruling 6469382727 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 fixes parameter 4's unit. [Decision] carries only these two." After this PR, D9 (line 291) carries a third ruling, 6539345871, by dated note. The note itself is correctly sourced and labelled "amended by ruling", so the Provenance rule (Decision carries only ruled text) holds in substance, but the enumeration is now stale. One clause in Provenance §1 naming 6539345871 as the amendment of D9's release gate would close it. Same class, lower weight: Provenance §3 says readings were "measured at cdec7473" while the Evidence line (line 36-37) now also names f68b47ca for the 2026-11-04 notes.
  • S2 — docs/adr/0144-…md:375 (Open item 2 note) quotes the engine's predicate as where: { currency, effective_date: { $lte: day } }; the tree spells the bound onOrBefore (packages/objectql/src/engine.ts#homeAmountServing, effective_date: { $lte: onOrBefore }). The shape is the same and the sentence does not claim verbatim quotation, but a backticked predicate reads as a quote; onOrBefore or a prose "the document day" would remove the gap.

Checks run

  1. Card docs(adr): ADR-0144 amendment — settle Open items 2, 3, 4, 6, 9 from PR #28302, record ruling 6539345871 A′ and B, the rounding mode and CLDR fraction digits (multi-currency, epic #8345) #30102 Task list against the diff:
  2. Every landed-code claim opened at file#symbol on origin/main:
    • packages/objectql/src/home-amount-projection.ts: projectHomeAmounts (same-currency arm stores rate 1 and rounds; blank date throws ValidationError required on the rateDate field; rate.digits <= 0n counts as missing; rate stored as the row holds it), memoizeHomeAmountServing (per organization/currency/day), documentDateOf + calendarDayIn (Intl en-CA in the org zone; UTC when absent/unknown), toScaledDecimal, divideToPlaces, divideRoundHalfAwayFromZero (half away from zero; checked 1.005→1.01, −0.125→−0.13 by hand against the code), ExchangeRateMissingError (message names currency, date, home currency, "Setup → Exchange Rates", "never replaced by 1, by a later rate, or by an empty home amount"; status 400), HomeCurrencyUnsetError (unset or non-ISO code; status 400), settleBulkHomeAmounts (invalid_value, "update those rows by id"). All exist and say what the notes say.
    • packages/objectql/src/engine.ts#homeAmountServing (lines 3557-3590): where: { currency, effective_date: { $lte: onOrBefore } }, orderBy effective_date desc, limit: 1, context { ...context, isSystem: true, tenantId: organizationId }; docblock says one organization's rate never converts another's. #setHomeLocalizationResolver (line 3535) exists (body delegated to engine-references-and-master-detail.ts by the Codemod split: generate the objectql engine.ts split with a deterministic script, verified byte-identical #29986 codemod; the method remains in engine.ts).
    • packages/objectql/src/plugin.ts lines 1334-1376: getMany('localization', ['currency','timezone']) grouped read; no settings service / SETTINGS_UNKNOWN_NAMESPACE / SETTINGS_UNKNOWN_KEY read as unset; other errors propagate. Matches item 4 note.
    • packages/spec/src/api/error-code-ledger.zod.ts#ERROR_CODE_LEDGER, '@objectstack/objectql' block (lines 777-825): ERR_CURRENCY_CODE_REQUIRED, ERR_EXCHANGE_RATE_MISSING, ERR_HOME_CURRENCY_UNSET all present.
    • packages/spec/src/data/index.ts:204 export * from './currency-fraction-digits'.
    • packages/spec/src/data/currency-fraction-digits.ts: header says CLDR 48.0 currencyData snapshot; table has IQD 0, HUF 0, COP 0, IDR 0, PKR 0, JPY 0, USD 2, CNY 2, KWD 3.
    • packages/spec/src/data/numeric-column-representation.ts#numericColumnFor exists; file documents the one decimal(65, 30) column.
    • packages/services/service-settings/src/localization-currency-lock.ts#localizationCurrencyWritePredicate: if (isUnset(current)) return undefined; then refuses when any rate row or homeAmount declaration exists — "passes the first setting of an unset value" is what the code does and what its header says.
    • packages/objectql/src/validation/record-currency-code.ts#RecordCurrencyCodeRequiredError: field names the code field (docblock lines 32-34).
    • packages/objectql/src/engine-references-and-master-detail.ts#previewHomeAmounts (line 118) and packages/objectql/src/engine-validate.ts (lines 573, 606-608): a home-amount refusal is answered as the row's finding { field, code, message } with the same code.
    • No registration-time check of localization.currency against a homeAmount declaration exists on main (grep of spec field.zod.ts/object.zod.ts and objectql for HOME_CURRENCY_UNSET: only the projection, engine and tests), so "the refusal is at write, not at registration" is a reading of the tree, consistent with ruling 6539345871 rejecting option C.
  3. Every ruling/review claim against its source:
  4. Landing evidence for the D9 note (GitHub API): chore: version packages #26517 merged 2026-11-03T14:44Z at 83d7e4a; feat(platform-objects): sys_exchange_rate — an organization's dated exchange rates, admin-written and audited, with a Setup list under Localization #27246 194e66c; feat(spec): currencyConfig.homeAmount — a record-mode amount declares its stored home-currency projection by pointer (multi-currency M2-1) #28096 73b7270; feat(service-settings): the default currency locks once an exchange rate or a home-currency amount uses it, and Setup names what uses it (multi-currency M1-3) #28297 291bf44; feat(objectql): store a record-mode amount converted into the home currency on every write (multi-currency M2-2) #28302 6762dd9; 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 57c51aa (Fixes objectql: record-mode guards — blank code refuses the write; ungrouped sum/avg/min/max over a record-mode field refused; summary roll-up over one refused at registration (multi-currency M0-2, epic #8345) #27186). ## 18.3.0 sections of packages/objectql, packages/spec, packages/platform-objects, packages/services/service-settings CHANGELOG.md each name the cited entry; content/docs/releases/v18/18-3.mdx lines 811, 932, 933, 950 name them.
  5. Nothing ruled that no ruling or landed code settled: every "settled" sentence is traced to ruling 6539345871, review 6539117549/6539668963, or a symbol on main; open questions (rateField scale < 12; 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 S1 on item 13) are left explicitly undecided.
  6. Residual phrasings: grep of the head file for "ISO 4217 minor|minor unit|only ledger" hits only the dated notes that correct them and the preserved original item-3 sentence they correct. Anchors #open-items, #decision resolve (heading ## Open items at line 348).
  7. Gates run locally on a scratch worktree at 244f2ff (no node_modules; scripts are plain node): node scripts/check-adr-links.mjs exit 0 (979 links resolve); node scripts/check-adr-symbol-anchors.mjs exit 0 (3108 anchors across 149 records resolve); node scripts/check-adr-anchors.mjs exit 0; node scripts/adr-index.mjs --report exit 0 (README current). Head-pinned CI check-runs were not read in this record (docs-only PR; the seat's ACCEPT step pins them).
  8. Scope: one file under docs/adr/**, no code, no changeset (docs-only, skip-changeset declared in the PR body), no content/docs/releases/ change. PR body first line cites the card; Fixes #30102 is correct since the card's whole Task list is covered (item 13 branch: "otherwise leave item 13 as it is" — the seat reports S1 unruled, and item 13 is untouched).

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

epic:#8345#1 · os-bill · session_01Utp6CZWjnSeed8H4dMjt9d

Seat ACCEPT · PR #30182 (supersedes #30174, same head) · Head-sha: a0c8d7ca9451da2185b167731d1004108512f05b · 2026-11-04T22:09Z

维护者速读

  • 改了什么: ADR-0144 开放项 2、3、4、6、9 各加一条注记标为已定(取单据日当天或之前最近一条汇率,datetime 按组织时区取日;精确小数、一次远离零舍入到本位币 CLDR 小数位,汇率原样存;未设本位币拒写;同币种汇率 1;三个错误码);D9 与 TL;DR 记裁决 6539345871 A′;ISO 4217 最小单位的说法改为 CLDR 小数位;「only ledger additions」改为三个码。开放项 13 未动。
  • 为什么改: main 上这几项仍写「未决」,与 18.3.0 已发出的代码不一致;ADR 每有答复就修订。
  • 风险与回滚: 只改一个 ADR 文件(+125/-5),不动代码、schema、skills;回滚即撤 PR。
  • 先看: 开放项 2、3、4、6、9 末尾注记,D9 末尾注记,Provenance §1 新增一句。
  • 两分钟验证: node scripts/check-adr-anchors.mjs、node scripts/check-adr-symbol-anchors.mjs、node scripts/check-adr-links.mjs、node scripts/adr-index.mjs --report 均退出 0。
  • 需要您做的: Tier H(docs/adr/**):契约复审 PASS 在本 head(comment 6643375642,Head-sha a0c8d7ca),请 os-zhuang 或 hotlong 批准;批准后席位落地。

席位意见:照原文落地已裁与已合的规则,不新增任何决定;可批。

席位核对

  1. 形态: 一个文件 docs/adr/0144-…,两个 docs 提交(244f2ff0 + a0c8d7c),无 rebase;skip-changeset(不发布任何包)。
  2. 前提实测: 每条 file#symbol 由复审者在 origin/main 上逐个打开核对;engine.ts 自 f68b47c 后有漂移,但不在任何 home-amount 符号上。
  3. 门禁 check-runs: head a0c8d7ca 上 success 26、skipped 19、失败 0。check-governed-merges --pr 30182:GOVERNED(docs/adr/**),Tier H,130 行 ≤ 3000。
  4. 接受的偏差: 无。原 PR docs(adr): ADR-0144 settles Open items 2, 3, 4, 6 and 9, records ruling 6539345871 (A′ and B), the rounding mode and CLDR fraction digits (multi-currency, epic #8345) #30174 由 GitHub MCP 开出(席位派发令漏 Writes: 行),已经中继关闭并在同分支同 head 重开为本 PR。全量复审的两条 should-fix(Provenance 列举、谓词引文)已在 a0c8d7c 修好,增量复审 PASS。
  5. 范围外去向: 开放项 13(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 S1:云租户无 CLI、多组织单一 --code)待维护者裁决,裁后另立注记;spec 侧 scale<12 拒收在 spec(field): refuse a homeAmount rateField whose declared scale is below 12, and document CURRENCY_FRACTION_DIGITS as CLDR fraction digits, not ISO 4217 minor units (multi-currency, epic #8345) #30103(spec 队列)。Skills-docs: none(不动 skills)。
  6. 落地条款: 草稿保持;GOVERNED_APPROVERS(os-zhuang、hotlong)任一 APPROVED 后,席位过落地前检、清 needs-user-decision、ready、auto-merge。

@objectstack-fleet objectstack-fleet Bot added the needs-user-decision Blocked on a maintainer decision — do not dispatch; decision cards only, never on a PR label Nov 4, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 5, 2026 00:30
@os-zhuang
os-zhuang enabled auto-merge November 5, 2026 00:30
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 5, 2026
@objectstack-fleet

objectstack-fleet Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor Author

epic:#8345#1 · os-bill · session_01Utp6CZWjnSeed8H4dMjt9d

Seat note · PR #30182 · Head-sha: a0c8d7ca9451da2185b167731d1004108512f05b · 2026-11-05T00:32Z

@os-zhuang marked this ready and enabled auto-merge at 00:30Z; the seat reads that as the Tier H landing decision and removes needs-user-decision in this pass.

What still holds it: mergeable_state is blocked with every check green. The main ruleset has require_extra_approval_for_unattributed_changes: true, and this PR is authored and pushed by objectstack-fleet[bot], so it needs one approving review before the queue takes it. Requested reviewers: os-zhuang, hotlong. One Approve from either lands it; nothing else is owed.

[Edit: wrong reading, withdrawn. The PR entered the merge queue at 00:31Z; the blocked state the seat read was the queue's, not a missing approval. Nothing is owed by a reviewer.]

After merge the seat removes pm:dispatched from #30102.

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

Labels

documentation Improvements or additions to documentation size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants