Skip to content

Commit ff241ad

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-20822-retired-matcher-pointers
2 parents f1d77a9 + db0cf22 commit ff241ad

34 files changed

Lines changed: 982 additions & 136 deletions
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
'@objectstack/driver-memory': patch
3+
---
4+
5+
Provenance comments in `@objectstack/driver-memory` cite the commits that decided them, not tracker numbers that no longer resolve
6+
7+
Clause-②: no
8+
9+
Docblocks and comments across the package cited issue-tracker numbers that now answer 404 on GitHub.
10+
Each one now cites the commit in this repository's history that made the decision it describes. Some of
11+
these docblocks sit on exported members, so the reworded text appears in the published `index.d.ts` /
12+
`index.d.mts`, and comments that esbuild keeps appear in the JavaScript output.
13+
14+
Comment only: no export, type, error code, status, message text or runtime behaviour changes.

‎.github/workflows/lint.yml‎

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -563,12 +563,14 @@ jobs:
563563
# agent typed the command by hand.
564564
#
565565
# ⛔ NOT a hole in `check:self-test-wired`, whose green is correct by its
566-
# own definition: its population is the scripts CI RUNS, and this file is a
567-
# MODULE no workflow can invoke, so it sat in that gate's remainder by
568-
# construction. The blast radius and the population rule point in opposite
569-
# directions here: the file with the largest inheritance surface in the
570-
# farm is the one shape the wiring gate cannot see. Naming it in this step
571-
# is what moves it INTO that population (161 -> 162 scripts CI runs that
566+
# own definition: its population is the scripts CI RUNS plus, since
567+
# #21351, the scripts a root `package.json` alias self-tests, and this
568+
# file is a MODULE no workflow can invoke and no alias names, so it sat in
569+
# that gate's remainder by construction. The blast radius and the
570+
# population rule point in opposite directions here: the file with the
571+
# largest inheritance surface in the farm is the one shape the wiring gate
572+
# cannot see. Naming it in this step is what moves it INTO that population
573+
# (161 -> 162 scripts CI runs that
572574
# ship a `--self-test`), and it is the smaller of the two remedies — the
573575
# other being to widen the gate to a transitive closure, which #14007
574576
# explicitly does not ask for. ⛔ It is also not a licence to sweep the
@@ -1545,11 +1547,12 @@ jobs:
15451547
# just as green, and a wrong transfer is a write against a shared board,
15461548
# not a report.
15471549
#
1548-
# ⛔ `check:self-test-wired` does not hold this step. No other workflow
1549-
# names this script, and that gate's population is the scripts a
1550-
# workflow names, so deleting this step drops the script back out of it
1551-
# with every gate still green — the same hole the stale-`finding` sweep
1552-
# step below records, which only the step itself closes.
1550+
# `check:self-test-wired` holds this step through the declared alias. No
1551+
# other workflow names this script, but since #21351 that gate's
1552+
# population includes every root `package.json` alias whose expansion
1553+
# carries `--self-test`, so deleting this step reds it with
1554+
# `[alias-self-test-not-run] pnpm check:pm-issue-transfer`. The
1555+
# stale-`finding` sweep step below is held the same way.
15531556
- name: Issue-transfer door self-test
15541557
run: pnpm check:pm-issue-transfer
15551558

@@ -1584,9 +1587,12 @@ jobs:
15841587
#
15851588
# Until this step existed the instrument was UNFIRED: the tool shipped a
15861589
# 91-case `--self-test` that nothing in CI ran, which is the second half
1587-
# of the pair `check:self-test-wired` exists for (a script is IN its
1588-
# population only once a workflow names it, so an unwired tool's self-test
1589-
# is not a hole the gate can see — it is a hole only this step closes).
1590+
# of the pair `check:self-test-wired` exists for. A script was then IN
1591+
# that gate's population only once a workflow named it, so the unwired
1592+
# self-test was a hole only this step could close. Since #21351 the gate
1593+
# also reads every root `package.json` alias whose expansion carries
1594+
# `--self-test`, so it holds this step through `check:pm-stale-finding`:
1595+
# deleting the step reds `[alias-self-test-not-run]`.
15901596
#
15911597
# What the self-test instruments is the set of rules a clean tree cannot
15921598
# exercise: the screen's ungraded verdict, which is the ONE thing the

‎.github/workflows/release.yml‎

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ name: Release
5151
# push to main → `release-integrity` audits ONLY the version at
5252
# `github.sha`, and names the VERSION
5353
# COMMIT — the landing that brought
54-
# main to that version. Never publishes,
54+
# main to that version; when it queues
55+
# the publish, it also warns of every
56+
# changeset that commit carries but did
57+
# not consume. Never publishes,
5558
# never pushes a tag. May backfill GitHub
5659
# Releases / the ADR-0087 D4 asset /
5760
# the runtime image — but only for a
@@ -913,6 +916,30 @@ jobs:
913916
echo "${version}, i.e. what the Version Packages PR decided — and nothing that"
914917
echo "landed after it, whatever main's head is by then."
915918
} >> "$GITHUB_STEP_SUMMARY"
919+
920+
# ── what ${version} ships without a CHANGELOG entry (#21361) ───
921+
# The merge queue lands the Version Packages PR on top of the
922+
# current main, and the PR cannot be refreshed while queued, so
923+
# the version commit's tree can carry landings whose changesets
924+
# it never consumed: their code ships in this release and its
925+
# CHANGELOG does not name them (17.3.0 through 17.6.0 each did).
926+
# This is the run that queues the publish, so the approver reads
927+
# the list here, before the release is cut. A warning annotation:
928+
# the level this job gives every finding that leaves the release
929+
# incomplete without stopping it (the Releases, the D4 asset, the
930+
# image, an unreadable range). It REPORTS and never refuses, so
931+
# it neither fails this step nor holds the publish job. A report
932+
# that cannot be measured says so in an error annotation (a
933+
# shallow clone is refused, never answered from a graft
934+
# boundary), and the publish stays queued all the same.
935+
if ! node scripts/release-pending-publish.mjs unconsumed --version-commit "$version_commit" --version "$version"; then
936+
echo "The changesets the version commit ${version_commit} did not consume were NOT MEASURED (reason above). This report never holds a release, so the publish of ${version} stays queued."
937+
{
938+
echo
939+
echo "**Changesets: NOT MEASURED.** Whether ${version}'s CHANGELOG leaves out a change that landed in"
940+
echo "the version commit's tree is unknown; the reason is in this step's log."
941+
} >> "$GITHUB_STEP_SUMMARY"
942+
fi
916943
exit 0
917944
fi
918945
echo "publish-pending=false" >> "$GITHUB_OUTPUT"

‎packages/drivers/driver-memory/objectstack.config.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@ const MemoryDriverPlugin: ObjectStackManifest = {
1616
scope: 'project',
1717
description: 'A reference specification implementation of the IDataDriver interface using in-memory arrays. Suitable for testing and development.',
1818

19-
// `configuration` and `capabilities` were retired (#11332, ADR-0049
19+
// `configuration` and `capabilities` were retired (commit dce5cd4f0, ADR-0049
2020
// enforce-or-remove): nothing ever read either container. The settings this
2121
// driver needs are passed by the host that composes it (the options object
2222
// handed to its constructor), and protocol/capability discovery never
2323
// consulted the declaration — dependency resolution runs off top-level
2424
// `dependencies`.
2525

26-
// `contributes.drivers` was retired (#10724, ADR-0049): the declaration drove
26+
// `contributes.drivers` was retired (commit be21955ba, ADR-0049): the declaration drove
2727
// nothing — this driver is wired by registering the `driver.memory` kernel
2828
// service (the objectql plugin calls `registerDriver` on `driver.*` services),
2929
// which is the enforced channel.

‎packages/drivers/driver-memory/src/index.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,21 @@ export {
1818
MULTI_TENANT_UNSUPPORTED_CODE,
1919
assertSingleTenantPosture,
2020
assertObjectsNotTenantScoped,
21-
// [#16589] Seam 3 — the per-call refusal. Exported on the same reasoning as
21+
// [commit 555a89cbd] Seam 3 — the per-call refusal. Exported on the same reasoning as
2222
// the two boot seams above: a consumer asserting this driver's behaviour under
2323
// a tenant scope needs the refusal's identity, not its message text.
2424
assertCallNotTenantScoped,
2525
declaresTenantScope,
2626
} from './memory-tenancy-guard.js';
2727
export type { TenancyAwareSchema } from './memory-tenancy-guard.js';
2828

29-
// [#13197, #13239] Uniqueness on BOTH declaration surfaces — field-level
29+
// [commit 56c093c4d, #13239] Uniqueness on BOTH declaration surfaces — field-level
3030
// `unique` and object-level declared `indexes[]` — with the refusal's wire
3131
// identity and the scoping helpers, exported so a consumer can assert the
3232
// envelope (`code` AND `status`, never merely "it threw") without
3333
// string-matching the message.
3434
//
35-
// [#16729] `computeAndRecordTenantField` is published BESIDE `tenantFieldOf`,
35+
// [commit 0f38ab084] `computeAndRecordTenantField` is published BESIDE `tenantFieldOf`,
3636
// not kept private, because publishing only the inner half is what let this
3737
// package diverge in the first place: `tenantFieldOf` mirrors
3838
// `SqlDriver.computeTenantField`, the stickiness lives in the wrapper AROUND

‎packages/drivers/driver-memory/src/memory-20874-contains-membership.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ import { MemoryAnalyticsService } from './memory-analytics.js';
6060

6161
const byId = (a: string, b: string) => a.localeCompare(b);
6262

63-
/** `driver-sql`'s #17590 fixture, plus its #20874 `owners` column. */
63+
/** `driver-sql`'s commit e04a0aff2 fixture, plus its #20874 `owners` column. */
6464
const MEMBERSHIP = {
6565
object: 'mem20874_membership',
6666
fields: {
@@ -107,7 +107,7 @@ const SHAPES = {
107107
type Fixture = typeof MEMBERSHIP | typeof SHAPES;
108108
type Case = readonly [name: string, where: FilterCondition, expected: readonly string[]];
109109

110-
/** Fixture one — `driver-sql`'s #17590 assertions, verbatim, and #20874's. */
110+
/** Fixture one — `driver-sql`'s commit e04a0aff2 assertions, verbatim, and #20874's. */
111111
const MEMBERSHIP_CASES: readonly Case[] = [
112112
['tags: the member row, never the substring row', { tags_: { $contains: 'red' } }, ['1']],
113113
['tags: a whole member', { tags_: { $contains: 'redwood' } }, ['2']],

‎packages/drivers/driver-memory/src/memory-analytics-echo-operator-coverage.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,7 @@ describe('[#7117] the analytics echo renders the query it describes', () => {
364364
});
365365

366366
/**
367-
* [#13195] The one cell where SQL could not say what mingo said — CLOSED,
367+
* [commit 9dac1ae01] The one cell where SQL could not say what mingo said — CLOSED,
368368
* and closed from the mingo side.
369369
*
370370
* This assertion used to be an INEQUALITY, kept so the split could not be
@@ -468,7 +468,7 @@ describe('[#7117] the analytics echo renders the query it describes', () => {
468468
it(`${op}: running the echo returns exactly the rows the query returns`, async () => {
469469
const executed = await executedIds(where);
470470
const echoed = await echoIds(where);
471-
// [#13195] `$exists` used to return early here — the documented residue
471+
// [commit 9dac1ae01] `$exists` used to return early here — the documented residue
472472
// above was asserted there and skipped in this loop, so the loop was a
473473
// statement about every OTHER operator. The residue is gone, the skip
474474
// with it, and this loop is now total over the face's vocabulary.

‎packages/drivers/driver-memory/src/memory-analytics.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ const CUBE_OPERATOR_TO_MONGO_PREDICATE: Readonly<Record<CubeOperator, MongoPredi
358358
// builds for `$notContains` (`memory-driver.ts` `normalizeFieldOperators`) —
359359
// and, since #20874, the SAME test it builds, membership or substring.
360360
notContains: ({ raw, containment }) => ({ $not: containment(raw[0]) }),
361-
// [#13195] A presence flag, not a comparand — and "present" means HAS A
361+
// [commit 9dac1ae01] A presence flag, not a comparand — and "present" means HAS A
362362
// VALUE (`!= null`), never key presence: #5298 leg 3 / #5369, landed in PR
363363
// #5962, ruled onto this face 2026-08-30. It used to emit `{$exists: <bool>}`
364364
// and hand it to mingo, which reads key presence, so this exit EXECUTED the
@@ -555,7 +555,7 @@ function globSubstringPattern(value: unknown): string {
555555
* `memory-analytics-echo-operator-coverage.test.ts` so it could not be closed
556556
* in silence.
557557
*
558-
* [#13195] It was not closed in silence: the maintainer ruled on 2026-08-30
558+
* [commit 9dac1ae01] It was not closed in silence: the maintainer ruled on 2026-08-30
559559
* that `$exists` means HAS A VALUE (`!= null`) on every exit — #5298 leg 3 /
560560
* #5369, shipped in PR #5962 and until then still unmet here — so the mingo
561561
* twin now emits `{$ne: null}` / `{$eq: null}`. SQL's `IS NOT NULL` was already
@@ -660,7 +660,7 @@ function sizeDistinctSet(values: readonly unknown[]): number {
660660
}
661661

662662
/**
663-
* [#11065] `path`, with a BOOLEAN rendered as the number it is worth — the
663+
* [commit 20950404c] `path`, with a BOOLEAN rendered as the number it is worth — the
664664
* aggregand expression `$sum` and `$avg` consume on this face, and, since the
665665
* #11152 ruling (maintainer 2026-08-28: booleans aggregate as numbers on every
666666
* face, no per-aggregate exception), `$min` and `$max` as well.

‎packages/drivers/driver-memory/src/memory-boolean-aggregand.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
22

33
/**
4-
* [#11065] `avg` and `sum` over a BOOLEAN column answer the SQL number here too.
4+
* [commit 20950404c] `avg` and `sum` over a BOOLEAN column answer the SQL number here too.
55
*
66
* ## The measurement this file pins
77
*
@@ -248,7 +248,7 @@ describe('[#11065] InMemoryDriver data face — a boolean aggregand is worth 1 o
248248
*
249249
* It reaches the numbers by a different route — a mingo `$group` expression
250250
* rather than JavaScript — and mingo's `$avg` ignores a non-numeric value
251-
* exactly as MongoDB's does, so before #11065 this face had the identical
251+
* exactly as MongoDB's does, so before commit 20950404c this face had the identical
252252
* divergence on its own account: `{avg: null, sum: 0}` over the same five rows.
253253
* Aligning the data face alone would have left it free to keep that answer,
254254
* which is the same mistake #6814 recorded on `count_distinct`.

‎packages/drivers/driver-memory/src/memory-bulk-create-atomicity.test.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@
2020
* ```
2121
*
2222
* ⛔ Asserting "the refusal still happens" proves NOTHING here — the refusal
23-
* was already correct, and #13197 / #13239 already pin it. That assertion was
23+
* was already correct, and commit 56c093c4d / #13239 already pin it. That assertion was
2424
* green throughout the defect's entire life. **The discriminating fact is that
2525
* THE ROW COUNT DOES NOT MOVE**, so every test below reads the store after the
2626
* refusal rather than stopping at the envelope.
2727
*
28-
* The fix is `updateMany`'s posture, one method over: #13197 made that method
28+
* The fix is `updateMany`'s posture, one method over: commit 56c093c4d made that method
2929
* prepare and check every row before mutating any of it, precisely so a
3030
* half-applied batch cannot happen. The two batch paths of this driver now
3131
* give the SAME answer to "is a batch atomic?" — they disagreed for as long as

0 commit comments

Comments
 (0)