From 706dc7f238980f313e29c192e9dc1756310c5088 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 6 Sep 2026 10:39:00 +0000 Subject: [PATCH 1/2] docs: re-scope the pin claims the 17.3.0 bump left asserting 17.2.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #1577 moved all twelve `@objectstack/*` dependencies to 17.3.0 and did not re-scope the comments naming the previous pin. Thirty-three occurrences across twenty-three files still asserted, in the present tense, that 17.2.0 is what this repo pins. This is the third recurrence of the same defect and it is handled the way the first two were ruled: re-scope, do not renumber. A measurement that has not been re-taken cannot be relabelled with a version it was never taken on — renumbering converts a stale claim into a fabricated one, which is strictly worse, because the original text at least dated itself honestly. Fifteen occurrences were RE-MEASURED on 17.3.0 and are written as current readings. The evidence is the nine measurement-pinning test files, which run green on 17.3.0, plus a direct re-read of the quoted engine internals in the installed tree: the readonly strip is still guarded by `if (!opCtx.context?.isSystem)` in `@objectstack/objectql`, and `resolveRunDataContext` in `@objectstack/service-automation` still returns `isSystem: true` for `runAs: 'system'` and only for it. The other eighteen were RE-SCOPED to date themselves honestly: they name the pin the reading was taken on and say plainly that it has not been re-taken since. One re-measurement came back CHANGED and is re-stated rather than carried over: the `@objectstack/objectql` runtime export list is 147 names on 17.3.0 where the 17.2.0 taking counted 103. It is a control for "the list does not carry `installFlatInput`", not a fact the harness depends on, and the load-bearing half is unchanged. Two occurrences were false in a second way. `test/i18n-references.test.ts` claimed the repo pins 17.1.0 — two bumps stale — and read "the KPI labels are not authorable" as a current fact; whether `translatePage` widened on 17.3.0 is now marked unmeasured rather than answered by guess. `src/views/task.view.ts` carried a four-row fixture count that was not re-taken, so those counts are labelled a 17.2.0 reading while the throw/resolve verdict beside them is re-confirmed on the current pin. Of the 89 lines under `src/` `test/` `docs/` naming 17.2.0, 33 carried a present-tense pin claim; the other 56 say only "measured on 17.2.0", are historically true, and are untouched. So are the `.changeset/` entries, which are records of what a past change did. Prose only — no metadata, schema, assertion or behaviour change. Verified mechanically with the repo's own `stripComments()`: the comment-stripped text of all twenty-two changed `.ts` files is byte-identical before and after. Co-authored-by: Claude --- ...n-claims-rescoped-after-the-17-3-0-bump.md | 53 +++++++++++++++++ docs/architecture/module-split-plan.md | 9 ++- src/dashboards/sales.dashboard.ts | 8 +-- src/flows/campaign-enrollment.flow.ts | 10 ++-- src/objects/_hook-api.ts | 11 ++-- src/objects/knowledge_article.object.ts | 4 +- src/objects/lead.hook.ts | 4 +- src/objects/opportunity.hook.ts | 4 +- src/objects/quote.hook.ts | 4 +- src/objects/task.object.ts | 5 +- src/profiles/tenant-admin.profile.ts | 9 +-- src/views/forecast.view.ts | 7 ++- src/views/opportunity.view.ts | 13 +++-- src/views/task.view.ts | 57 ++++++++++++------- test/case-create-form-narrowing.test.ts | 5 +- test/forecast-current-quarter-view.test.ts | 9 +-- test/freeze-guard-reference-cleanup.test.ts | 4 +- test/helpers/action-sandbox.ts | 4 +- test/helpers/hook-harness.ts | 28 +++++---- test/i18n-references.test.ts | 18 ++++-- test/readonly-write-semantics.test.ts | 16 ++++-- test/sharing-posture-declaration.test.ts | 6 +- test/undeclared-key-probe.test.ts | 11 +++- test/view-references.test.ts | 5 +- 24 files changed, 207 insertions(+), 97 deletions(-) create mode 100644 .changeset/pin-claims-rescoped-after-the-17-3-0-bump.md diff --git a/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md b/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md new file mode 100644 index 00000000..170fe562 --- /dev/null +++ b/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md @@ -0,0 +1,53 @@ +--- +--- + +Re-scope thirty-three source comments that asserted, in the present tense, that +`17.2.0` **is the version this repo pins**. It is not, and has not been since PR +#1577 moved all twelve `@objectstack/*` dependencies to 17.3.0 — so each of +those sentences was telling a maintainer, in the place they read before acting, +that a measurement was taken on the current pin when it was not. + +This is the **third** recurrence of the same defect (#1460 at the 17.2.0 bump, +#1467 nine more it missed, now this at 17.3.0), and it is handled the way the +first two were ruled. + +Deliberately **not** a find-and-replace to 17.3.0. A measurement that has not +been re-taken cannot be relabelled with a version it was never taken on: +renumbering would convert *stale* claims into *fabricated* ones — strictly +worse, because the original text at least dated itself honestly. Each occurrence +took one of two routes: + +- **Re-measured on 17.3.0**, then written as a current reading. Fifteen + occurrences, backed by the nine measurement-pinning test files, which run + green on 17.3.0, and by re-reading the quoted engine internals in the + installed tree: the readonly strip is still guarded by + `if (!opCtx.context?.isSystem)` in `@objectstack/objectql`, and + `resolveRunDataContext` in `@objectstack/service-automation` still returns + `isSystem: true` for `runAs: 'system'` and only for it. +- **Re-scoped to date itself honestly**, saying which pin the reading was taken + on and stating plainly that it has not been re-taken since. + +One re-measurement came back **changed** and is re-stated rather than carried +over: the `@objectstack/objectql` runtime export list is **147 names on 17.3.0** +where the 17.2.0 taking counted 103. It is a control for "the list does not +carry `installFlatInput`", not a fact the harness depends on, and the +load-bearing half — absent from the export list and from both `.d.*` files — is +unchanged. + +Two occurrences were false in a second way and are corrected: +`test/i18n-references.test.ts` claimed the repo pins `17.1.0` (two bumps stale) +and read "the KPI labels are not authorable" as a current fact; whether +`translatePage` widened on 17.3.0 is now marked unmeasured rather than answered +by guess. `src/views/task.view.ts` carried a four-row fixture count that was not +re-taken, so the counts are labelled a 17.2.0 reading while the throw/resolve +verdict beside them is re-confirmed on the current pin. + +Of the 89 lines under `src/` `test/` `docs/` that named `17.2.0`, 33 carried a +present-tense pin claim and are re-scoped here. The other 56 say only "measured +on 17.2.0" — historically true, and untouched. So are the `.changeset/` +entries, which are records of what a past change did. + +Comments and one design document's prose only — no metadata, schema, assertion +or behaviour change. Verified mechanically: with the repo's own +`stripComments()`, the comment-stripped text of all twenty-two changed `.ts` +files is byte-identical before and after. diff --git a/docs/architecture/module-split-plan.md b/docs/architecture/module-split-plan.md index 3c7a3142..482e9db1 100644 --- a/docs/architecture/module-split-plan.md +++ b/docs/architecture/module-split-plan.md @@ -166,7 +166,9 @@ navigationContributions: [ ] ``` -The shape is read off `ManifestSchema` in the pinned `@objectstack/spec` 17.2.0: +The shape is read off `ManifestSchema` in `@objectstack/spec` 17.2.0 — the version +this repo pinned when this plan was measured, not the current pin (17.3.0 since PR +#1577); the shape has not been re-read on it (#1676): `{ app, group?, priority, items }`. The app package keeps the group scaffolding — `Sales`, `My Work`, `Activity`, `Marketing`, `Service`, `Insights` — and each module contributes its items into the named group, so the information architecture a user sees is unchanged. @@ -336,8 +338,9 @@ would otherwise slug the heading to `#上游缺口--upstream-gaps` — the exact - Studio's writable verdict — [objectstack#14430](https://github.com/objectstack-ai/objectstack/issues/14430). - An objectstack release carrying both, and the version bump in this repository. HotCRM is - pinned to `@objectstack/*` 17.2.0 today. Merged upstream is not the same as available in - the pin (AGENTS.md, *Platform Upgrades*). + pinned to `@objectstack/*` 17.3.0 today (PR #1577; this plan's own measurements were taken + at the 17.2.0 pin and are labelled as such). Merged upstream is not the same as available + in the pin (AGENTS.md, *Platform Upgrades*). **New, found by this analysis — for the PM to file upstream.** None of these is worked around here: diff --git a/src/dashboards/sales.dashboard.ts b/src/dashboards/sales.dashboard.ts index d904650a..f700ecd8 100644 --- a/src/dashboards/sales.dashboard.ts +++ b/src/dashboards/sales.dashboard.ts @@ -319,10 +319,10 @@ export const SalesDashboard: Dashboard = { // the `period_start` equality (#730) and the `close_date` range (#743) — // through a real engine and pins a three-way outcome (current quarter // only: not zero rows, not every quarter). First taken on 17.0.0-rc.2; - // RE-RUN 2026-09-03 on the pinned 17.2.0 (#1467) — the version - // `package.json` pins and `node_modules` installs since PR #1442 — green - // both times, so the outcome holds on the CURRENT pin and not only on - // the one it was first taken on. + // RE-RUN 2026-09-03 on 17.2.0 (#1467) and RE-RUN again on 17.3.0 + // (#1676) — the version `package.json` pins and `node_modules` installs + // since PR #1577 — green all three times, so the outcome holds on the + // CURRENT pin and not only on the one it was first taken on. // // What stood here before described the two paths as asymmetric and told // the next author not to generalise between them. That was true on diff --git a/src/flows/campaign-enrollment.flow.ts b/src/flows/campaign-enrollment.flow.ts index cb85fd90..26314d06 100644 --- a/src/flows/campaign-enrollment.flow.ts +++ b/src/flows/campaign-enrollment.flow.ts @@ -61,11 +61,11 @@ export const CampaignEnrollmentFlow: Flow = { * * Both branch edges (`e4` / `e7`) read `vars.memberSource`, so it must be * bound on every path reaching them. On the 17.1.0 spec — the version this - * repo pinned AT THE TIME of the measurement, not the current pin (#1460: - * 17.2.0 since PR #1442) — `FlowVariableSchema` DOES carry `defaultValue`, - * and it still does on 17.2.0 (schema key re-checked 2026-09-03; the - * SEEDING behaviour asserted next was not re-measured), and the engine - * seeds it + * repo pinned AT THE TIME of the measurement, not the current pin (#1676: + * 17.3.0 since PR #1577) — `FlowVariableSchema` DOES carry `defaultValue`, + * and it still did on 17.2.0 (schema key re-checked 2026-09-03; neither + * that key nor the SEEDING behaviour asserted next has been re-checked on + * 17.3.0), and the engine seeds it * before the start node runs, so this key alone binds the name — while a * caller-supplied `context.params.memberSource` still WINS over it. * diff --git a/src/objects/_hook-api.ts b/src/objects/_hook-api.ts index 82415115..ede0cf93 100644 --- a/src/objects/_hook-api.ts +++ b/src/objects/_hook-api.ts @@ -47,10 +47,13 @@ type Doc = Record; * safety consequences: believing the stale one makes an author over-estimate * the blast radius of every `filter` call site, in the unsafe direction. * - * MEASURED per method against the pinned `@objectstack` packages (17.2.0), on - * the object the kernel actually injects as `ctx.api`. Every line is pinned by - * an assertion in `test/hook-query-predicate.test.ts`, against a real engine - * rather than the test harness: + * MEASURED per method against the object the kernel actually injects as + * `ctx.api`. First taken on 17.2.0; RE-TAKEN on the current pin 17.3.0 during + * #1528 — the legal key sets and the `filter` fold both came back UNCHANGED, + * so the readings below are current, not merely inherited. Every line is + * pinned by an assertion in `test/hook-query-predicate.test.ts`, against a + * real engine rather than the test harness, and that file runs green on the + * current pin: * * - `find` — `filter` is ALIASED to `where`; the predicate is applied. * - `findOne` — `filter` is ALIASED to `where`; the predicate is applied. diff --git a/src/objects/knowledge_article.object.ts b/src/objects/knowledge_article.object.ts index f7ca19f5..cbbe4594 100644 --- a/src/objects/knowledge_article.object.ts +++ b/src/objects/knowledge_article.object.ts @@ -32,8 +32,8 @@ export const KnowledgeArticle = ObjectSchema.create({ // declared while every key below is enforced. // // MEASURED on `@objectstack/plugin-sharing@17.1.0` — the version - // installed AT THE TIME of the measurement, not the current pin (#1460: this - // repo has installed 17.2.0 since PR #1442, and this table has NOT been + // installed AT THE TIME of the measurement, not the current pin (#1676: this + // repo has installed 17.3.0 since PR #1577, and this table has NOT been // re-taken on it) — against the real `ShareLinkService` and a real engine, // not read off a grep count: // diff --git a/src/objects/lead.hook.ts b/src/objects/lead.hook.ts index 2631debe..0d92d1db 100644 --- a/src/objects/lead.hook.ts +++ b/src/objects/lead.hook.ts @@ -257,8 +257,8 @@ const leadHook: Hook = { // forever (a GDPR erasure that cannot be carried out). // // Measured on 17.1.0 — the version this repo pinned AT THE TIME of - // the measurement, not the current pin (#1416: this repo has pinned - // 17.2.0 since PR #1442, and the cascade shape below has NOT been + // the measurement, not the current pin (#1676: this repo has pinned + // 17.3.0 since PR #1577, and the cascade shape below has NOT been // re-measured on it) — with a probe hook at priority 199 immediately // ahead of each guard, not assumed. // The engine builds its cleanup write on the CALLER's own context diff --git a/src/objects/opportunity.hook.ts b/src/objects/opportunity.hook.ts index d50e9542..d57293ba 100644 --- a/src/objects/opportunity.hook.ts +++ b/src/objects/opportunity.hook.ts @@ -106,8 +106,8 @@ const opportunityValidationHook: Hook = { // erasure that cannot be carried out). // // Measured on 17.1.0 — the version this repo pinned AT THE TIME of - // the measurement, not the current pin (#1416: this repo has pinned - // 17.2.0 since PR #1442, and the cascade shape below has NOT been + // the measurement, not the current pin (#1676: this repo has pinned + // 17.3.0 since PR #1577, and the cascade shape below has NOT been // re-measured on it) — with a probe hook at priority 199 immediately // ahead of each guard, not assumed. // The engine builds its cleanup write on the CALLER's own context diff --git a/src/objects/quote.hook.ts b/src/objects/quote.hook.ts index 7f402e32..45f6975a 100644 --- a/src/objects/quote.hook.ts +++ b/src/objects/quote.hook.ts @@ -105,8 +105,8 @@ const quoteValidation: Hook = { // master-detail cascade) that person's account undeletable forever. // // Measured on 17.1.0 — the version this repo pinned AT THE TIME of - // the measurement, not the current pin (#1416: this repo has pinned - // 17.2.0 since PR #1442, and the cascade shape below has NOT been + // the measurement, not the current pin (#1676: this repo has pinned + // 17.3.0 since PR #1577, and the cascade shape below has NOT been // re-measured on it) — with a probe hook at priority 199 immediately // ahead of each guard, not assumed. // The engine builds its cleanup write on the CALLER's own context diff --git a/src/objects/task.object.ts b/src/objects/task.object.ts index 4cec87a4..14be099c 100644 --- a/src/objects/task.object.ts +++ b/src/objects/task.object.ts @@ -225,8 +225,9 @@ export const Task = ObjectSchema.create({ // audit trail), and defaulted to `false` by `task.hook.ts` on insert. // // NOT readonly — but the old reason here ("16.x drops flow writes to - // readonly fields") does not survive measurement. Taken on 17.1.0 and - // RE-TAKEN on the current pin 17.2.0 (#1460), same verdict both times: + // readonly fields") does not survive measurement. Taken on 17.1.0, + // RE-TAKEN on 17.2.0 (#1460) and RE-CONFIRMED on the current pin 17.3.0 + // (#1676), same verdict all three times: // `task_due_reminder` declares `runAs: 'system'`, so its write WOULD // survive a `readonly: true`, and the hook's insert-time default is on the // insert path, which is exempt from the strip anyway. See diff --git a/src/profiles/tenant-admin.profile.ts b/src/profiles/tenant-admin.profile.ts index 662a3284..63fed62e 100644 --- a/src/profiles/tenant-admin.profile.ts +++ b/src/profiles/tenant-admin.profile.ts @@ -57,11 +57,12 @@ import { SystemAdminProfile } from './system-admin.profile'; * They are KEPT, and they are bounded by the organization, not by them. * * Two measurements, both against the 17.1.0 line — the version - * installed AT THE TIME they were taken, not the current pin (#1460: this - * repo has installed 17.2.0 since PR #1442). + * installed AT THE TIME they were taken, not the current pin (#1676: this + * repo has installed 17.3.0 since PR #1577). * - * ⚠️ The zero-occurrence result in 1 — the load-bearing half — still - * reproduces on 17.2.0. The three CONTROL counts in it do NOT: they are + * ⚠️ The zero-occurrence result in 1 — the load-bearing half — reproduced on + * 17.2.0 and has not been re-run since (#1676). The three CONTROL counts in + * it do NOT reproduce: they are * as-measured-then figures and have since moved. They are kept at their * measured values on purpose rather than refreshed, because what they are * evidence FOR is that the sweep can find a name it looks for — never a diff --git a/src/views/forecast.view.ts b/src/views/forecast.view.ts index 63ee852c..eb286ca1 100644 --- a/src/views/forecast.view.ts +++ b/src/views/forecast.view.ts @@ -55,9 +55,10 @@ export const ForecastViews = defineView({ // saved-view filters included. Measured rather than inferred; // `test/forecast-current-quarter-view.test.ts` runs THIS filter through a // real engine and pins the three-way outcome (one quarter selected, not - // zero and not all of them). First taken on 17.0.0-rc.2 and RE-RUN - // 2026-09-03 on the pinned 17.2.0 (#1467: the current pin since PR - // #1442), green both times — so this is a reading on the CURRENT pin. + // zero and not all of them). First taken on 17.0.0-rc.2, RE-RUN + // 2026-09-03 on 17.2.0 (#1467) and RE-RUN again on the current pin + // 17.3.0 (#1676, after the PR #1577 bump), green all three times — so + // this is a reading on the CURRENT pin. // // Both halves of the key are load-bearing, same as the quota-attainment // widget in `src/dashboards/sales.dashboard.ts`: `period: 'quarter'` diff --git a/src/views/opportunity.view.ts b/src/views/opportunity.view.ts index 17cf35d5..bcc62d27 100644 --- a/src/views/opportunity.view.ts +++ b/src/views/opportunity.view.ts @@ -248,9 +248,10 @@ export const OpportunityViews = defineView({ // is a first-class vocabulary member — it matches the parameterised // grammar `DATE_MACRO_PARAM_RE`, `{N_(minutes|hours|days|weeks|months| // years)_(ago|from_now)}` — and it reaches the driver already substituted - // for an ISO date. Measured on 17.0.0-rc.2 and RE-MEASURED 2026-09-03 - // on the pinned 17.2.0 (#1467: the current pin since PR #1442), so it - // is a reading on the CURRENT pin, and unchanged: over four rows parked + // for an ISO date. Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on + // 17.2.0 (#1467) and RE-RUN on the current pin 17.3.0 (#1676, after the + // PR #1577 bump), so it is a reading on the CURRENT pin, and unchanged + // at every taking: over four rows parked // 30d / 15d / 13d / 1d, `stage_entry_date < {14_days_ago}` returned the // 30d and 15d rows — the same two the equivalent day-start literal // returns, and not all four, which is what an unsubstituted token would @@ -303,9 +304,9 @@ export const OpportunityViews = defineView({ // was wired into the ObjectQL read path in 17.0.0-rc.0 (objectql #3582, // covering find/findOne/count/aggregate ahead of the middleware chain), // so a saved-view filter value reaches the driver already substituted. - // Measured on 17.0.0-rc.2 and RE-MEASURED 2026-09-03 on - // the pinned 17.2.0 (#1467: the current pin since PR #1442), - // unchanged — see the runtime block in + // Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on 17.2.0 (#1467) + // and RE-RUN on the current pin 17.3.0 (#1676, after the PR #1577 + // bump), unchanged at every taking — see the runtime block in // `test/forecast-current-quarter-view.test.ts`, which is that // re-measurement and runs green on the current pin. // diff --git a/src/views/task.view.ts b/src/views/task.view.ts index c25c7800..e84259ad 100644 --- a/src/views/task.view.ts +++ b/src/views/task.view.ts @@ -140,10 +140,15 @@ export const TaskViews = defineView({ // Operator-only filter — priority and status, no tokens — and the reason // recorded here for that has expired (#782). Two claims stood here; both // were wrong already on 17.0.0-rc.2 — the version this repo pinned AT - // THE TIME they were measured, not the current pin, which is 17.2.0 - // since PR #1442 (#1467; every reading below is re-taken on it) — in - // different ways. "Wrong" is about those two retired claims, not about - // the engine: nothing in this block reports broken platform behaviour. + // THE TIME they were measured, not the current pin, which is 17.3.0 + // since PR #1577 (#1676) — in different ways. "Wrong" is about those two + // retired claims, not about the engine: nothing in this block reports + // broken platform behaviour. + // + // ⚠️ READ THE VERSION ON EACH READING BELOW. They were taken at three + // different pins and are labelled individually; a reading labelled + // 17.2.0 was taken there and has NOT been re-taken on 17.3.0 unless it + // says so. // // `{current_user_id}` DOES interpolate. `resolveFilterTokens()` was wired // into the ObjectQL READ path at 17.0.0-rc.0 (objectql #3582) ahead of @@ -154,8 +159,12 @@ export const TaskViews = defineView({ // {current_org_id}` returned 0 rows (the filter is not being dropped) // while `owner_id = {current_user_id}` returned every seeded task (not a // literal-string compare either — the literal matches no owner at all). - // RE-MEASURED 2026-09-03 on the pinned 17.2.0 (#1467), unchanged: both - // probes report exactly those results on the current pin. + // RE-MEASURED 2026-09-03 on 17.2.0 (#1467), unchanged: both probes + // reported exactly those results there. NOT re-run on 17.3.0 (#1676) — + // the two-probe result is a 17.2.0 reading, and the seam it rests on + // (`resolveFilterTokens()` on the read path) is re-confirmed on the + // current pin by `test/flow-filter-today-token.test.ts`, which runs + // green there. // // `{TODAY()}` is not a spelling of anything and never was. The vocabulary // is `{today}` / `{yesterday}` / `{tomorrow}` / `{now}`, the period @@ -167,8 +176,10 @@ export const TaskViews = defineView({ // rc.2 `{TODAY()}` was not REJECTED either: the placeholder grammar was // `/^\$?\{([a-zA-Z0-9_]+)\}$/`, parentheses fell outside it, // `classifyFilterToken('{TODAY()}')` returned null, and the string - // reached the driver verbatim and compared as text. On the pinned 17.2.0 - // that is FALSE — `FILTER_TOKEN_WRAPPED_RE` in `@objectstack/spec/data` + // reached the driver verbatim and compared as text. From 17.2.0 on — + // re-confirmed on the current pin 17.3.0 (#1676) by the PREMISE case in + // `test/flow-filter-today-token.test.ts`, which drives a real engine — + // that is FALSE: `FILTER_TOKEN_WRAPPED_RE` in `@objectstack/spec/data` // now reads `/^\$?\{([^{}]+)\}$/`, which DOES match `TODAY()`, so it // classifies as `kind: 'unknown'` and `resolveFilterTokens()` throws // `UnknownFilterTokenError` (`FILTER_TOKEN_UNKNOWN`, HTTP 400) — the same @@ -179,8 +190,11 @@ export const TaskViews = defineView({ // sees the filter at all. // // Measured on rc.2 over a four-row `crm_task` fixture (due 30d ago / 1d - // ago / today / in 7d), and RE-MEASURED 2026-09-03 on the pinned 17.2.0 - // (#1467) over the same fixture — three rows unchanged, the fourth not: + // ago / today / in 7d), and RE-MEASURED 2026-09-03 on 17.2.0 (#1467) + // over the same fixture — three rows unchanged, the fourth not. ⛔ The + // row COUNTS below are a 17.2.0 reading and were NOT re-taken on 17.3.0 + // (#1676); what WAS re-confirmed there is the throw/resolve verdict in + // the right-hand column, by `test/flow-filter-today-token.test.ts`: // // rc.2 17.2.0 // due_date < '{today}' -> 2 rows (past-due) 2 rows @@ -237,18 +251,21 @@ export const TaskViews = defineView({ // `due_date < {TODAY()}`, and that only `{current_user_id}` interpolates. // Both halves were wrong already on 17.0.0-rc.2 — the version this repo // pinned AT THE TIME they were measured, not the current pin, which is - // 17.2.0 since PR #1442 (#1467) — and the file said the opposite of + // 17.3.0 since PR #1577 (#1676) — and the file said the opposite of // itself: the note on `todays_tasks` above asserted that // `{current_user_id}` does NOT interpolate. It does. - // That comment carries the measurements, re-taken there on the current - // pin, INCLUDING the one that moved: `{TODAY()}` is REJECTED on 17.2.0 - // (`FILTER_TOKEN_UNKNOWN`) where on rc.2 it shipped to the driver as - // text, so "cannot resolve `{TODAY()}`" is wrong on the current pin for a - // different reason than it was wrong on rc.2. The canonical `{today}` - // resolves on the read path either way, so a strictly past-due filter IS - // expressible: `due_date < '{today}'` selected exactly the past-due rows - // out of four on rc.2, and does again on 17.2.0 (RE-MEASURED - // 2026-09-03). + // That comment carries the measurements with their versions, INCLUDING + // the one that moved: `{TODAY()}` is REJECTED from 17.2.0 on + // (`FILTER_TOKEN_UNKNOWN`, re-confirmed on the current pin 17.3.0 by + // `test/flow-filter-today-token.test.ts`) where on rc.2 it shipped to + // the driver as text, so "cannot resolve `{TODAY()}`" is wrong on the + // current pin for a different reason than it was wrong on rc.2. The + // canonical `{today}` resolves on the read path either way, so a + // strictly past-due filter IS expressible: `due_date < '{today}'` + // selected exactly the past-due rows out of four on rc.2, and did again + // on 17.2.0 (RE-MEASURED 2026-09-03; that row count was not re-taken on + // 17.3.0, where the token's resolution is re-confirmed by the test file + // named above). // // So the honest statement is narrower than the one that stood here: this // view CAN be given a strictly past-due cut through `{today}`, and is not diff --git a/test/case-create-form-narrowing.test.ts b/test/case-create-form-narrowing.test.ts index 4b77e424..08d01a95 100644 --- a/test/case-create-form-narrowing.test.ts +++ b/test/case-create-form-narrowing.test.ts @@ -259,8 +259,9 @@ describe('crm_case create form — retention direction', () => { * * The reason is NOT the blanket this comment used to carry ("the platform * DROPS writes to readonly fields"). Measured in - * `test/readonly-write-semantics.test.ts` on 17.1.0 and re-measured there on - * the current pin 17.2.0 (#1460), same result: the strip is one branch of the + * `test/readonly-write-semantics.test.ts` on 17.1.0, re-measured there on + * 17.2.0 (#1460) and re-measured again on the current pin 17.3.0 (#1676), + * same result every time: the strip is one branch of the * UPDATE path, `if (!opCtx.context?.isSystem)`, over CALLER-supplied keys — * so a `beforeUpdate` hook's own stamp survives it, an insert is exempt from * it entirely, and a FLOW write survives it exactly when the flow's diff --git a/test/forecast-current-quarter-view.test.ts b/test/forecast-current-quarter-view.test.ts index dcc1c72c..fbd1f34c 100644 --- a/test/forecast-current-quarter-view.test.ts +++ b/test/forecast-current-quarter-view.test.ts @@ -46,10 +46,11 @@ import stack from '../objectstack.config'; * | all | the filter is unscoped — the #730 defect | * | 1 quarter | resolved AND scoped — the contract | * - * First taken on 17.0.0-rc.2; RE-RUN 2026-09-03 on the pinned 17.2.0 (#1467 — - * the version `package.json` pins and `node_modules` installs since PR #1442), - * green on both. So the outcome above is a reading on the CURRENT pin, not only - * on the one it was first taken on. + * First taken on 17.0.0-rc.2; RE-RUN 2026-09-03 on 17.2.0 (#1467) and RE-RUN + * again on the pinned 17.3.0 (#1676 — the version `package.json` pins and + * `node_modules` installs since PR #1577), green on all three. So the outcome + * above is a reading on the CURRENT pin, not only on the one it was first + * taken on. * * The STRUCTURAL block is the one that stops the lie coming back: it re-derives * the claim from the labels themselves, in all four locales, so a view renamed diff --git a/test/freeze-guard-reference-cleanup.test.ts b/test/freeze-guard-reference-cleanup.test.ts index 514317fd..ffd194e7 100644 --- a/test/freeze-guard-reference-cleanup.test.ts +++ b/test/freeze-guard-reference-cleanup.test.ts @@ -38,8 +38,8 @@ import { extractSandboxBody } from './helpers/action-sandbox'; * ### The measurement the yield rests on * * Re-taken on `@objectstack/*` 17.1.0 — the version this repo pinned AT THE - * TIME of the measurement, not the current pin (#1460: this repo has pinned - * 17.2.0 since PR #1442, and the CONTEXT table below has not been re-taken on + * TIME of the measurement, not the current pin (#1676: this repo has pinned + * 17.3.0 since PR #1577, and the CONTEXT table below has not been re-taken on * it, though this file's own behavioural assertions do run green there) — by * registering a probe hook at priority 199 (immediately ahead of each guard) on * `crm_opportunity`, `crm_quote` and `crm_lead`, and varying the one thing an diff --git a/test/helpers/action-sandbox.ts b/test/helpers/action-sandbox.ts index c9138fa2..acdc58f3 100644 --- a/test/helpers/action-sandbox.ts +++ b/test/helpers/action-sandbox.ts @@ -394,8 +394,8 @@ export async function runHookBody(hook: Rec, opts: HookRunOpts): Promise { * merged as objectstack#13111, with the extractor's matching walk following in * objectstack#13109 / #13215. * - * Neither is in a published release yet: `translatePage` in the shipped - * 17.2.0 tarball still maps `region.components` only, and this repo pins - * 17.1.0. So the KPI labels are NOT authorable here today, and writing them - * would be inert copy. When the pin moves (hotcrm#1376 owns that chain), the - * walk below should widen to `properties.children` to match `translatePage` — + * That reading was taken while this repo pinned 17.1.0 and the newest + * published tarball was 17.2.0: `translatePage` there mapped + * `region.components` only, so the KPI labels were NOT authorable and + * writing them would have been inert copy. + * + * ⚠️ The pin has since moved TWICE and this paragraph has NOT been re-taken + * on it — the repo pins 17.3.0 (PR #1577; #1676 re-scoped this label without + * re-measuring). ⛔ Do not read "not authorable" as a current fact: whether + * `translatePage` widened to `properties.children` on 17.3.0 is unmeasured + * here, and the assertions below are unaffected either way. When that is + * measured and the walk is confirmed to have widened (hotcrm#1376 owns that + * chain), the walk below should widen to `properties.children` to match + * `translatePage` — * and to `properties.children` ONLY. `slots.*` and a `page:tabs` item's * `children` are deliberately outside the resolver's scope, so widening to * them would recreate the other half of the drift pair: offering keys the diff --git a/test/readonly-write-semantics.test.ts b/test/readonly-write-semantics.test.ts index 3cf99f63..72966fad 100644 --- a/test/readonly-write-semantics.test.ts +++ b/test/readonly-write-semantics.test.ts @@ -12,7 +12,8 @@ type AnyRec = Record; type Flow = Automation.Flow; /** - * WHAT `readonly: true` ACTUALLY STRIPS ON THE PINNED 17.2.0 (#1429, #1460). + * WHAT `readonly: true` ACTUALLY STRIPS ON THE PINNED 17.3.0 (#1429, #1460, + * #1676). * * `case.object.ts` carried a blanket claim — "the platform drops writes to * readonly fields" — that had grown load-bearing: it was the stated reason for @@ -64,12 +65,15 @@ type Flow = Automation.Flow; * depends on, or perturbs, the shipped `crm_case` declaration. * * First measured on `@objectstack/* 17.1.0`. RE-MEASURED 2026-09-03 against - * the PINNED `@objectstack/* 17.2.0` in `package.json` (#1460) — every case - * below reports the same verdict it did then, and the two engine internals - * quoted above still read as quoted: the strip is still guarded by + * `@objectstack/* 17.2.0` (#1460), and RE-MEASURED AGAIN against the PINNED + * `@objectstack/* 17.3.0` in `package.json` (#1676, after the PR #1577 bump) + * — every case below reports the same verdict it did at both earlier takings, + * and the two engine internals quoted above still read as quoted on the + * current pin: the strip is still guarded by * `if (!opCtx.context?.isSystem)` in `@objectstack/objectql/dist/core.js`, - * and `resolveRunDataContext` still returns `isSystem: true` for - * `runAs: 'system'` and only for it. + * and `resolveRunDataContext` in + * `@objectstack/service-automation/dist/index.js` still returns + * `isSystem: true` for `runAs: 'system'` and only for it. * * ⚠️ The parenthetical this replaces ("dependabot PRs #1388-#1393 propose * 17.2.0; this is not that") was false in a second way by the time it was diff --git a/test/sharing-posture-declaration.test.ts b/test/sharing-posture-declaration.test.ts index c4bd52a6..e5192d78 100644 --- a/test/sharing-posture-declaration.test.ts +++ b/test/sharing-posture-declaration.test.ts @@ -21,8 +21,10 @@ import { REPO_ROOT } from './helpers/repo-root'; * **zero** rules — where 17.1.0 seeded them unconditionally, once, * organization-less. * - * Re-measured on the pin this repo runs (17.2.0), same config, `memory` - * driver, zero organizations: + * Re-measured on 17.2.0 — the pin this repo ran AT THE TIME, not the current + * pin (17.3.0 since PR #1577; not re-taken on it, though this file's own + * assertions run green there) — same config, `memory` driver, zero + * organizations: * * | tenancy service | `sys_sharing_rule` rows | * | ------------------- | ------------------------------ | diff --git a/test/undeclared-key-probe.test.ts b/test/undeclared-key-probe.test.ts index 5d4eb437..7dc68e6e 100644 --- a/test/undeclared-key-probe.test.ts +++ b/test/undeclared-key-probe.test.ts @@ -23,9 +23,14 @@ import { QuoteLineItem } from '../src/objects/quote_line_item.object'; * and field-level security by construction. * * This file is the re-measurement taken on 17.1.0 — the version this repo - * pinned AT THE TIME, not the current pin (#1460: 17.2.0 since PR #1442; the - * probe below has not been re-taken on it, though its assertions do run green - * there) — and it says two different things about two different write paths. + * pinned AT THE TIME, not the current pin (#1676: 17.3.0 since PR #1577) — + * and it says two different things about two different write paths. + * + * ⚠️ The two halves are at DIFFERENT takings, so read the label on each. Half + * 1 (the caller path) is still the 17.1.0 reading and has not been re-taken + * since, though its assertions run green on the current pin. Half 2 (the hook + * path) WAS re-taken on the 17.2.0 -> 17.3.0 upgrade and its finding changed + * — see the block above that `describe`. * * ## The caller path is CLOSED, and that is what half 1 pins * diff --git a/test/view-references.test.ts b/test/view-references.test.ts index fc263936..12355821 100644 --- a/test/view-references.test.ts +++ b/test/view-references.test.ts @@ -130,8 +130,9 @@ describe('filter template tokens are resolvable', () => { * `test/forecast-current-quarter-view.test.ts` runs a shipped view filter * through a real engine and pins one quarter selected out of three, plus * the throw on the retired `{this_quarter_start}` spelling. First taken on - * 17.0.0-rc.2 and RE-RUN 2026-09-03 on the pinned 17.2.0 (#1467: the - * current pin since PR #1442), green both times. + * 17.0.0-rc.2, RE-RUN 2026-09-03 on 17.2.0 (#1467) and RE-RUN on the + * current pin 17.3.0 (#1676: the pin since PR #1577), green all three + * times. * * What DID move between those two pins is WHICH spellings throw. The * wrapped-token grammar widened at 17.0.0-rc.6 from From cb72c94444ae879fa85374484141ccb2ce0bff24 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 6 Sep 2026 10:44:39 +0000 Subject: [PATCH 2/2] docs(i18n): point the KPI-label note at the probe that answered it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The paragraph re-scoped in the previous commit said only that whether `translatePage` widened to `properties.children` on 17.3.0 was unmeasured here. It had in fact been measured: #1639 probed the installed 17.3.0 directly and found the resolver DOES descend a container's declared `properties.children`. So the note now says which half is actually outstanding — this repo's own extraction walk, not the platform — and cites #1639 rather than #1376, which is closed and no longer owns that chain. Still prose only; the comment-stripped text of the file is unchanged. Co-authored-by: Claude --- ...n-claims-rescoped-after-the-17-3-0-bump.md | 12 ++++++----- test/i18n-references.test.ts | 20 +++++++++++-------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md b/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md index 170fe562..cea6bfe8 100644 --- a/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md +++ b/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md @@ -36,11 +36,13 @@ unchanged. Two occurrences were false in a second way and are corrected: `test/i18n-references.test.ts` claimed the repo pins `17.1.0` (two bumps stale) -and read "the KPI labels are not authorable" as a current fact; whether -`translatePage` widened on 17.3.0 is now marked unmeasured rather than answered -by guess. `src/views/task.view.ts` carried a four-row fixture count that was not -re-taken, so the counts are labelled a 17.2.0 reading while the throw/resolve -verdict beside them is re-confirmed on the current pin. +and read "the KPI labels are not authorable" as a current fact — it now cites +the probe on #1639, which verified against the installed 17.3.0 that +`translatePage` DOES descend `properties.children`, and points at that card +rather than the closed #1376. `src/views/task.view.ts` carried a four-row +fixture count that was not re-taken, so the counts are labelled a 17.2.0 +reading while the throw/resolve verdict beside them is re-confirmed on the +current pin. Of the 89 lines under `src/` `test/` `docs/` that named `17.2.0`, 33 carried a present-tense pin claim and are re-scoped here. The other 56 say only "measured diff --git a/test/i18n-references.test.ts b/test/i18n-references.test.ts index b728b629..701449d6 100644 --- a/test/i18n-references.test.ts +++ b/test/i18n-references.test.ts @@ -445,14 +445,18 @@ describe('every locale is complete on every authored surface', () => { * `region.components` only, so the KPI labels were NOT authorable and * writing them would have been inert copy. * - * ⚠️ The pin has since moved TWICE and this paragraph has NOT been re-taken - * on it — the repo pins 17.3.0 (PR #1577; #1676 re-scoped this label without - * re-measuring). ⛔ Do not read "not authorable" as a current fact: whether - * `translatePage` widened to `properties.children` on 17.3.0 is unmeasured - * here, and the assertions below are unaffected either way. When that is - * measured and the walk is confirmed to have widened (hotcrm#1376 owns that - * chain), the walk below should widen to `properties.children` to match - * `translatePage` — + * ⚠️ The pin has since moved TWICE — the repo pins 17.3.0 (PR #1577) — and + * that paragraph is now history in BOTH halves. ⛔ Do not read "not + * authorable" as a current fact: the upstream precondition IS met at the + * installed 17.3.0. `translatePage` descends a container's declared + * `properties.children`, probed directly against the installed tree on + * hotcrm#1639 (which re-homed the work item off the now-closed hotcrm#1376; + * #1676 re-scoped this label and did not re-take that probe). + * + * So what is outstanding is no longer the platform — it is this repo's own + * walk, which has NOT been widened yet. The assertions below are unaffected + * either way. When it is widened it should widen to `properties.children` to + * match `translatePage` — * and to `properties.children` ONLY. `slots.*` and a `page:tabs` item's * `children` are deliberately outside the resolver's scope, so widening to * them would recreate the other half of the drift pair: offering keys the