From eb4b97629b2a3badca12a67655691d8618b69015 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 31 Oct 2026 04:22:17 +0000 Subject: [PATCH 1/2] docs(skills,adr): `homeAmount.rateDate` is `date`/`datetime`, the `currency` row lists all four `currencyConfig` keys, and ADR-0144 Open item 1 records the settled pointer spelling Should-fixes 3-5 of contract review 6526217217 on PR #28096: the field-types paragraph under-taught `rateDate` as `date` only, the Numbers table row named two of the four real `currencyConfig` keys, and ADR-0144 Open item 1 gains a dated note recording `rateDate` / `rateField` as landed. Fixes #28203 Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_016WV4d156vwPo83g9GQuJSt --- ...ord-currency-dated-rates-write-time-home-projection.md | 8 ++++++++ skills/objectstack-data/rules/field-types.md | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/adr/0144-multi-currency-record-currency-dated-rates-write-time-home-projection.md b/docs/adr/0144-multi-currency-record-currency-dated-rates-write-time-home-projection.md index 453bc21267c..de0307382f6 100644 --- a/docs/adr/0144-multi-currency-record-currency-dated-rates-write-time-home-projection.md +++ b/docs/adr/0144-multi-currency-record-currency-dated-rates-write-time-home-projection.md @@ -320,6 +320,14 @@ Where a source leans one way, the lean is quoted here, not adopted. This record workload row M2-1 and #27191 is corrected to required. Workload row M2-1 drafts the names `rateDate` and `rateField`; in that draft, `rateDate` is "a `date`/`datetime` field on the same object (⛔ no default)". The design record §6 says the document date must not default to `created_at` (「⛔ 不默认 created_at」). + *Note (2026-10-31):* settled: the pointers are spelled `rateDate` (the document date) and `rateField` (the rate + used), the names workload row M2-1 drafts, landed in PR #28096 (`73b72709`). Beside them `homeAmount.field` names + the home field, and all three are required with no default + (`packages/spec/src/data/field.zod.ts#HomeAmountSchema`). `rateDate` names a `date` or `datetime` field on the + same object (`packages/spec/src/data/object.zod.ts#HOME_AMOUNT_RATE_DATE_TYPES`) and `rateField` a `number` field; + both the home and the rate field declare `readonly: true`, and the object judges what each pointer names + (`packages/spec/src/data/object.zod.ts#refuseDishonestHomeAmount`). Review: contract review + [`6526217217`](https://github.com/objectstack-ai/objectstack/pull/28096#issuecomment-6526217217) on PR #28096. 2. **Which row counts as "the document date's rate"** (#27192). The ruling says "a platform rate table by effective date". Workload row M2-2 and the measurement round read this as the row with the latest `effective_date` on or before the document date. The measurement round also rules out a "nearest-future rate". The design record §5 says diff --git a/skills/objectstack-data/rules/field-types.md b/skills/objectstack-data/rules/field-types.md index fee7a516257..9221f0c4da1 100644 --- a/skills/objectstack-data/rules/field-types.md +++ b/skills/objectstack-data/rules/field-types.md @@ -50,7 +50,7 @@ fields: { | Type | When to Use | Config | |:-----|:------------|:-------| | `number` | Generic numeric value | `min`, `max`, `precision`, `scale` | -| `currency` | Monetary amounts | `currencyConfig` (currencyMode, defaultCurrency) | +| `currency` | Monetary amounts | `currencyConfig` (currencyMode, defaultCurrency, currencyField, homeAmount) | | `percent` | Percentage values (0-100) | `min`, `max`, `precision` | ## Date & Time @@ -178,8 +178,8 @@ stored field to `'record'`? Backfill: `os migrate record-currency-codes`. `homeAmount` (`'record'` only, all three required): the engine stores the home-currency amount in `field` (a `'dynamic'` `currency`) at the `rateDate` -(`date`) rate, and that rate in `rateField` (`number`), both `readonly: true`. -Cross-currency totals sum `field`. +(`date`/`datetime`) rate, and that rate in `rateField` (`number`), both +`readonly: true`. Cross-currency totals sum `field`. ### Select with Default From 3ec7b99739d4e47da3f260dac55673a815fda67a Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 31 Oct 2026 04:53:03 +0000 Subject: [PATCH 2/2] chore(changeset): `@objectstack/skills` patch for this card's field-types text, and the two skills changesets PR #28170 and PR #28290 missed A `skills/**` change ships in `@objectstack/skills`, so it owes a patch changeset, never `skip-changeset` (contract review 6539232473, must-fix 1). PR #28170 and PR #28290 landed skill text under the same mistaken reading; their entries are carried here. Co-authored-by: Claude Claude-Session: https://claude.ai/code/session_016WV4d156vwPo83g9GQuJSt --- .changeset/28041-skills-connector-input-judged.md | 13 +++++++++++++ .changeset/28203-skills-home-amount-keys.md | 10 ++++++++++ .changeset/28226-skills-grant-kinds.md | 12 ++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 .changeset/28041-skills-connector-input-judged.md create mode 100644 .changeset/28203-skills-home-amount-keys.md create mode 100644 .changeset/28226-skills-grant-kinds.md diff --git a/.changeset/28041-skills-connector-input-judged.md b/.changeset/28041-skills-connector-input-judged.md new file mode 100644 index 00000000000..b1552881c89 --- /dev/null +++ b/.changeset/28041-skills-connector-input-judged.md @@ -0,0 +1,13 @@ +--- +'@objectstack/skills': patch +--- + +docs(skills): the automation guide says a `connector_action` input is judged against the action's `inputSchema` before dispatch + +Clause-②: no +Metadata-protocol: none + +This text shipped in PR #28170 (#28041 / #28162), which missed its `@objectstack/skills` changeset; this entry carries it. + +- **`objectstack-automation/SKILL.md`**: once evaluated, a `connector_action`'s `connectorConfig.input` is judged against the action's `inputSchema` (`required`, `type`, `properties`, `items`) before dispatch, and a breach fails the step `VALIDATION_ERROR` (`fault`-routable) with nothing sent. `registerFlow` and `os validate` refuse a `{…}` template token at `connectorConfig.input.`. +- **`objectstack-automation/references/integration-recipes.md`**: a record value reaches the payload through a CEL envelope (`{ dialect: 'cel', source: 'record.' }`), and the recipes say that envelope is judged against the `inputSchema`. diff --git a/.changeset/28203-skills-home-amount-keys.md b/.changeset/28203-skills-home-amount-keys.md new file mode 100644 index 00000000000..2e36dd1cbd2 --- /dev/null +++ b/.changeset/28203-skills-home-amount-keys.md @@ -0,0 +1,10 @@ +--- +'@objectstack/skills': patch +--- + +docs(skills): the field-types guide teaches `homeAmount.rateDate` as a `date` or `datetime` field and lists all four `currencyConfig` keys + +Clause-②: no +Metadata-protocol: none + +- **`objectstack-data/rules/field-types.md`**: the `homeAmount` paragraph says `rateDate` names a `date` or `datetime` field (it said `date` only; the spec accepts both). The Numbers table `currency` row lists `currencyConfig` as `currencyMode`, `defaultCurrency`, `currencyField` and `homeAmount` (it named the first two only). diff --git a/.changeset/28226-skills-grant-kinds.md b/.changeset/28226-skills-grant-kinds.md new file mode 100644 index 00000000000..13dffbda2ea --- /dev/null +++ b/.changeset/28226-skills-grant-kinds.md @@ -0,0 +1,12 @@ +--- +'@objectstack/skills': patch +--- + +docs(skills): the integration recipes say the connector `auth` union declares `oauth2` and `app-credential`, held degraded until a server runs the grant, and that `signed` signs `aliyun-acs3` and `tencentcloud-tc3` requests + +Clause-②: no +Metadata-protocol: none + +This text shipped in PR #28290 (#28226), which carried a changeset for `@objectstack/lint` only and missed its `@objectstack/skills` one; this entry carries it. + +- **`objectstack-automation/references/integration-recipes.md`**: an OAuth-protected vendor declares `oauth2` (`authorization_code` / `client_credentials`) or `app-credential` (`feishu` / `dingtalk` / `wecom`), but no server runs the grant yet, so the instance is held degraded and calls no upstream. `signed` on `openapi` / `rest` (scheme `aliyun-acs3-hmac-sha256` or `tencentcloud-tc3-hmac-sha256`, with a `keyId`) signs each request; an RSA-signing vendor (Alipay, WeChat Pay) stays blocked on the request-signing card.