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..cea6bfe8 --- /dev/null +++ b/.changeset/pin-claims-rescoped-after-the-17-3-0-bump.md @@ -0,0 +1,55 @@ +--- +--- + +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 — 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 +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 — 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 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