Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .changeset/pin-claims-rescoped-after-the-17-3-0-bump.md
Original file line number Diff line number Diff line change
@@ -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.
9 changes: 6 additions & 3 deletions docs/architecture/module-split-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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:
Expand Down
8 changes: 4 additions & 4 deletions src/dashboards/sales.dashboard.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions src/flows/campaign-enrollment.flow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down
11 changes: 7 additions & 4 deletions src/objects/_hook-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,13 @@ type Doc = Record<string, unknown>;
* 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.
Expand Down
4 changes: 2 additions & 2 deletions src/objects/knowledge_article.object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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:
//
Expand Down
4 changes: 2 additions & 2 deletions src/objects/lead.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/objects/opportunity.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/objects/quote.hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 3 additions & 2 deletions src/objects/task.object.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 5 additions & 4 deletions src/profiles/tenant-admin.profile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 4 additions & 3 deletions src/views/forecast.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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'`
Expand Down
13 changes: 7 additions & 6 deletions src/views/opportunity.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.
//
Expand Down
Loading
Loading