Skip to content

Commit e4e5222

Browse files
objectstack-fleet[bot]hotlongclaude
authored
docs(client): re-anchor the dead tracker citations in packages/client/src to the commits that decided them (#20703)
Part of #20594 Clause-②: no ## What changed This is stage 6 of the `domain:cli` lane of the dead-citation sweep: `packages/client/src`. Every comment site there that cited a tracker number answering 404 now cites, in ruling C+D's form C (comment 5749154545 on #19123), the commit in this repository's history that decided what the line describes, and keeps saying in its own words what that commit decided. PR #20533 is the method and stages 1 to 5 of this card (PR #20624, PR #20632, PR #20656, PR #20673, PR #20689) are the precedents. The card stays open for the lane's remaining packages, so this PR says `Part of`. That is **43 sites on 43 lines in 7 files, covering 13 numbers**, rewritten to **12 distinct commits**: - the census's **19 sites**, all in `src/index.ts` (8 numbers); - **24 test-file comment sites** in 6 test files (the census defers `*.test.ts`; stages 1 to 5 took test comments too). One more line changed: `client.test.ts:2198`, the second half of the `:2197` sentence ("byte-identical to the pre-(number) behavior" now reads "byte-identical to the behavior before commit cf74a11"). Only comments changed: **44 lines out, 44 in**, and every touched file keeps its line count, so no line citation into these files moves. **No citation number is added**: over the 44 line pairs, added-minus-removed numbers is empty, and no PR number stands on an added line. No ADR or ruling-record file in `docs/adr/` or `scripts/adr-anchors/` records any of these 13 decisions, so every anchor is a commit. A **`patch` changeset** for `@objectstack/client` rides along, because the rewritten docblocks reach `dist` (measured below). ## Census: `packages/client`, before and after **Instrument.** The gate's own `node scripts/check-issue-citations.mjs --census --json`, read-only and unchanged, run with the fleet token. The count is its `allocated-but-absent` findings under `packages/client/`. Both runs enumerated the whole board. | reading | tree | board | whole-repo `allocated-but-absent` | `packages/client` sites | lines | numbers | files | |---|---|---|---|---|---|---|---| | before | base `3b47a693c7`, run 2026-09-29T18:31:09Z to 18:35:42Z | enumerated, 186 pages, frontier #20701, 18,528 numbers | 1,298 | **19** | 19 | 8 | 1 (`src/index.ts`) | | after | `221a3f5e63`, run 18:39:47Z to 18:44:31Z | enumerated, 186 pages, frontier #20702, 18,529 numbers | 1,279 | **0** | 0 | 0 | 0 | The whole-repo drop of 19 is exactly these sites: a site-by-site diff of the two JSON outputs has 19 findings gone, all in `packages/client/src/index.ts`, and none added. `packages/client/src` is byte-identical at `221a3f5e63` and at the head. **Supplementary scan (test files included).** The gate's exported `extractCitations` and `classifyCitation` over all 53 `.ts` files under `src/`, with the board from the gate's own `probeBoard`: 963 citations and 61 dead before (src comments 19, test comments 24, src strings 0, test strings 18), 920 and 18 after (0, 0, 0, 18). Its before list of src comment sites is identical to the census's. The 18 left are test titles, the form-D stage (see Acceptance notes). ## Per-site table `git blame` at the base ties each line to the commit that wrote it, and each anchor was read in its message, changeset or diff, not only its subject. | number | sites (base line) | anchor: what it decided | |---|---|---| | `#12195` | `index.ts:684`, `:728`, `:1834`, `:2021`; `client.test.ts:2869`; `meta-automation-descriptors.test.ts:29` | `7986d973f`, stage 3 of the compound-name retirement: un-mounts the three `:section` arities and unifies the SDK's URL spelling on `encodeURIComponent`. All six lines blame to it. | | `#12176` | `client.test.ts:357`; `meta-automation-descriptors.test.ts:31` | `7986d973f` as well: the lines say the card "retired compound-name addressing", and that commit completes the retirement. Both lines blame to it, and the landed stages give this number the same anchor. | | `#12194` | `index.ts:738`, `:1838`, `:2026`; `client.test.ts:360`; `meta-automation-descriptors.test.ts:43` | `311433f6b`, stage 1: the item-name grammar, refused at the publish door. | | `#12181` | `index.ts:799`, `:820`, `:911`, `:1866`; `meta-delete-item-carriers.test.ts:4`, `:265` | `cf71d73f8`: `meta.deleteItem` sends the reset door's `If-Match` pin and `?state=draft` on both declarations. Its changeset also records the withholding of `?dropStorage` that `:820` and the test's `:265` describe. All six lines blame to it; stage 3 gave the number the same anchor. | | `#14879` | `index.ts:3479`, `:3552`, `:3635`, `:7536`; `client.data-prefix.test.ts:4`; `client.metadata-prefix.test.ts:7`; `client.test.ts:2165`, `:2197` | `cf74a1128`: the SDK reads the CRUD data prefix from discovery instead of restating `/data` (`_dataPrefix()`). Six lines blame to it; `index.ts:3552` and `client.metadata-prefix.test.ts:7` blame to `032452a54`, the metadata-prefix sibling, and name the data-prefix change as their precedent. | | `#14313` | `index.ts:4911`; `return-type-precision.test.ts:1031` | `b1b978c8d`: binds the `auth.*` family to the wire shapes better-auth sends, and deliberately leaves `auth.deleteUser` unbound (the member `:4911` describes). Both lines blame to it. | | `#14312` | `return-type-precision.test.ts:891`, `:973`, `:981`, `:1130` | `e944fdb24`: binds four `oauth.*` methods and deliberately leaves `oauth.applications.delete` unbound, the "open decision" `:973` and `:981` name. `:891` blames to it; `:973` and `:981` blame to the later delete binding (`7beaaa32c`) and `:1130` to `b1b978c8d`, and each refers back to what the `oauth.*` card did. | | `#14314` | `return-type-precision.test.ts:1138` | `7092d63e4`: binds the `organizations.*` family. The line blames to it. | | `#6361` | `index.ts:6379`; `client.test.ts:878`, `:1390` | `90bbf2510`: retires the notification-list `cursor` on both halves. `:1390` blames to `0b4022b41`, which applies the same retirement one door over and names this one as its precedent. Stages 1 and 2 and the spec lane gave the number this anchor. | | `#9934` | `index.ts:7406`; `client.test.ts:27` | `79c46da90`: the producer-side `userMessage` marking. Both lines blame to it; the anchor the landed stages give this number. | | `#6239` | `index.ts:8122` | `f549a0d4a`: the ADR-0049 retirement sweep that deleted `ViewProtocol` and its schemas. The line blames to it; the spec lane's stage 2 gave the number this anchor. | | `#8480` | `client.test.ts:512` | `caaae2cca`: the typed `security.explain()` request gains the `recordIds` batch spelling. The line blames to it, and its changeset names the card. | | `#13208` | `return-type-precision.test.ts:1394`, `:1415` | `74049254d`: `DeleteMetaItemResponseSchema` declares `seq` and `projectionApplied`. `#13208` was the pull request that landed as this commit (its subject carries the number), and it answers 404 too. `#13155`, the issue beside it, answers 200 and stays. | **Anchor checks.** Every cited sha matches exactly one object (`git rev-parse --disambiguate`, count 1 for each of the 12), is a commit, has one parent, and is an ancestor of `main` (`merge-base --is-ancestor` against `31ed067639`, exit 0 for all 12). The checkout is not shallow. The control leg `6f657f4f5` (2026-08-07, the parent of the oldest anchor `f549a0d4a` of 2026-08-08) exits 0, and the negative control, this branch's own `221a3f5e63`, exits 1. Six anchors reuse the landed stages' (`7986d973f`, `311433f6b`, `cf71d73f8`, `90bbf2510`, `79c46da90`, `f549a0d4a`), so each number carries one anchor across the tree; six are new (`cf74a1128`, `b1b978c8d`, `e944fdb24`, `7092d63e4`, `caaae2cca`, `74049254d`). **Numbers.** All 13 dropped numbers answer 404 by REST (re-probed 2026-09-29T18:59Z). The three numbers kept on changed lines (`#8326`, `#12104`, `#13155`) answer 200. Five slash-joined numbers stand in `packages/client/src`, which the citation grammar does not read (`#11925/#12036`, `#3431/#3455`, `#2567/#3963`, `#5449/#5546`, `#5674/#5787`); their second halves all answer 200, so none is dead. **Wordings to check, each true of its commit:** - `index.ts:820` "Maintainer-seat ruling, landed by commit cf71d73": that commit's changeset states the withholding in the same terms ("no caller was measured needing it from this client"). - `index.ts:3552` now reads "The defect commit cf74a11 fixed, one key over"; `client.metadata-prefix.test.ts:7` reads "the `crud.dataPrefix` defect commit cf74a11 fixed". - `index.ts:738` keeps "Stage 1" beside the commit, and its "this stage" is the docblock's own commit, tagged `7986d973f` at `:728`. - `return-type-precision.test.ts:891`, `:1031`, `:1138` keep "card N of 3 of #12104" (that number answers 200). ## Mechanical guard: no code token moves **H2 holds on the comment-stripped reading; the emitted `dist` is NOT byte-identical, because the docblocks ship.** **Token guard.** It compares the TypeScript parser's leaf tokens (TypeScript 6.0.3, JSDoc nodes excluded) of the 7 touched files at base `3b47a693c7` and at `221a3f5e63`. Controls mutate the head text in memory only. - Real run: 68,102 base tokens, 0 differing (exit 0). - Comment-insertion control: 0 differing (exit 0). - Code-insertion control: all 7 files differ at token 0 (exit 1). - String control (`'token'` to `'tokeN'` in the code literal at `index.ts:4895`): exactly 1 differing `StringLiteral`, at token 14,882 of `index.ts` (exit 1). **Emitted `dist`.** `pnpm --filter @objectstack/client build` at base (the base tree of `packages/client/src` restored in place with a trap-armed restore; blob-equal to HEAD and `git diff HEAD` empty afterwards) and at the head, with the same dependency builds: - `index.d.ts`, `index.d.mts`, `index.js` and `index.mjs` differ; `index.js.map` and `index.mjs.map` are equal. - The same parser comparison over the four differing `dist` files reads 0 differing tokens (12,637 / 12,637 / 25,487 / 25,184), so the whole `dist` delta is comment text. Its code control (a code line appended to `index.mjs`) reads COUNT DIFFERS. A first try at that control appended the line onto the file's last line, which is the `sourceMappingURL` comment with no trailing newline, so it landed inside a comment, read 0, and was void; it was redone after a newline. - The new wording is in `dist`: for example "commit cf74a11" appears 4 times in `index.d.ts` and `index.js`. - Code-mutation control (`scripts/ablation-replace.mjs`, anchor `searchParams.set('token'` hit 1 to 0, blob restored to HEAD `19305adddb`, `git diff HEAD` empty): changes `index.js` and `index.mjs`. `dist` was rebuilt to the head bytes and `scripts/ablation-dist-preflight.mjs` reads the marker absent from all 6 files with a clean tree. A raw scan of the 8 changed files for control bytes finds none (a positive probe on a scratch file matched). ## Changeset **`patch` for `@objectstack/client`** (`.changeset/client-provenance-anchors.md`), in PR #20632's form. `@objectstack/client`'s `files[]` is `dist`, `README.md` and `CHANGELOG.md`, and the build above emits different `index.d.ts` / `index.d.mts` / `index.js` / `index.mjs` at base and head, so this diff publishes. `check-changeset-no-major`, `check-empty-changeset`, `check-adr-0087-registration` and `check-changeset-fixed` all exit 0. ## Gates (head `afa654081f`) This host has no `flock`, so `os-verify-lock.sh` ran in its declared unlocked mode. Its disclosure, verbatim, from each run at this head and from the two `dist` builds: ```text os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 59s · declare it in the PR body · pnpm --workspace-concurrency=2 --filter '@objectstack/client...' build os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 121s (2m01s) · declare it in the PR body · pnpm turbo run build --filter='./packages/*' --filter='./packages/*/*' --concurrency=2 os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 21s · declare it in the PR body · pnpm --filter @objectstack/client exec vitest run --maxWorkers=2 os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 8s · declare it in the PR body · pnpm --filter @objectstack/client typecheck os-verify-lock: VERDICT command-exit 0 · UNLOCKED (declared) · no usable `flock` on this host, so the shared verify lock was NEVER taken and NOTHING was serialized · ran 2s · declare it in the PR body · pnpm --filter @objectstack/client build ``` - **Build:** `@objectstack/client`'s closure (35 of 81 workspace projects), then the whole workspace, `turbo run build --filter='./packages/*' --filter='./packages/*/*'`, 71 of 71 tasks, after the merge. - **Tests:** `vitest run`: 50 files, 641 tests passed (every `*.test.ts` under `src/`; `tests/integration/**` needs a running server and is excluded by the package's own config). - **Typecheck:** `pnpm --filter @objectstack/client typecheck` exits 0. `tsc --listFiles`: `tsconfig.json` compiles the 3 non-test `src` files, `tsconfig.test.json` all 53 including the 50 test files. `check:test-typecheck`: 0 files, 0 errors, 0 pinned signatures. - **Lint:** the repo-wide `pnpm lint` (`eslint . --no-inline-config`) exits 0 (2026-09-29T18:57:45Z to 18:58:13Z). - **Citation judging:** after merging `origin/main` (`31ed067639`), `node scripts/check-issue-citations.mjs --base origin/main` reports "no issue citations added against 31ed067 (1 file(s) read)" (exit 0); pinned `--base 31ed067` reads the same. - **Derived gates:** `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` derived 61 families. All 61 exit 0, and `--ran` with the exit-coded record reads "61 derived, 61 run, 0 NOT-MEASURED, 0 UNRUN" (a derived zero). Among them: `check:issue-citations`, `check:doc-authoring` (808 pinned sites, no growth), `check:nul-bytes` (9,315 files, no raw control bytes), `check:published-files`, `check:type-check-debt`. - **Artifact rosters:** 36 of the 39 non-self-test roster rows exit 0, including the four the derivation marks as keeping their roster under one of this diff's paths (`check-changeset-fixed`, `check:authz-resolver`, `check:error-code-casing`, `check:filter-alias-parity`). The other three need a pull request's context; they are run against this PR once it exists and reported on the card. The 18 self-test-only rows grade their checkers' fixtures and cannot judge this diff. ## Hypotheses (measured first) - **H0 holds.** At base `3b47a693c7` the filtered census answers 19 sites on 19 lines, 8 numbers, all in `src/index.ts`. The whole-repo count is 1,298, as on `0be898499f`. - **H1 holds.** After the rewrite, the filtered census answers 0 for `packages/client`. No site was left for an open PR (the file lists of all open PRs were read at 18:36:50Z, 11 PRs, and at 19:01:46Z, 8 PRs: only the Version Packages PR #20639 touches `packages/client`, in `CHANGELOG.md` and `package.json`) or for an unfound anchor. - **H2 holds on the token reading, not on the `dist` reading.** The parser leaf-token diff is empty with its controls firing. The emitted `dist` differs, and the difference is comment text only (token-identical `dist` with a code control). That is why the changeset ships. ## Acceptance notes - **Test titles, the form-D stage.** 18 dead numbers remain in test string literals in `packages/client/src` (`describe` and `it` titles, no assertion text): `#12195` 6, `#12181` 5, `#14879` 4, `#9934` 1, `#8480` 1, `#6361` 1. They stay on the card for its form-D stage; no string moved here. - **Outside `src/**`, a later stage of the card:** `packages/client/tsconfig.json:8` and `packages/client/vitest.config.ts:33` cite `#12181` (404), and `packages/client/test-typecheck-debt.json:3` cites `#6083` (404). The other citations in `packages/client` outside `src/**` (`CHANGELOG.md` excluded) answer 200. - **The moving `origin/main`.** The branch merged `origin/main` once (`afa654081f`, merging `31ed067639`: `lint`, `metadata-protocol` and `service-datasource`). A later fetch advanced the shared ref to `a8acee28dd`, two commits in `packages/spec` and a generated reference page, none touching `packages/client`. There was no second merge; CI judges the merge ref. ## Deviations - **One companion line (`client.test.ts:2198`)** beyond the 43 sites, the second half of the `:2197` sentence. - **Commit trailers** are AGENTS.md's model-free pair (`Claude-Session` plus `Co-authored-by: Claude`), and the pre-push trailer check passed on every push. The harness's attribution reminder asked for a model-named trailer and a different PR footer, and AGENTS.md overrides it. The merge commit carries git's default message. --- _Generated by [Claude Code](https://claude.ai/code/session_local_1d2a197c-c20e-4e90-9be8-413d4d432289)_ --------- Co-authored-by: Jack Zhuang <50353452+hotlong@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
1 parent 735594b commit e4e5222

8 files changed

Lines changed: 54 additions & 44 deletions
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
'@objectstack/client': patch
3+
---
4+
5+
Provenance comments in `@objectstack/client` were re-anchored
6+
7+
Comment and docblock lines under `src/` that cited tracker numbers which no
8+
longer resolve on GitHub now cite the commit in this repository's history that
9+
decided the matter, and say in their own words what was decided. Comments
10+
only: no request, route, error code, type, export or runtime behaviour changes.

‎packages/client/src/client.data-prefix.test.ts‎

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

33
/**
4-
* `crud.dataPrefix` is honoured by the SDK, not restated by it (#14879).
4+
* `crud.dataPrefix` is honoured by the SDK, not restated by it (commit cf74a1128).
55
*
66
* THE CONTRACT. `crud.dataPrefix` is a live `RestServerConfig` key: REST mounts
77
* every CRUD route under `dataPath = ${basePath}${crud.dataPrefix}` and the

‎packages/client/src/client.metadata-prefix.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* `metadata.prefix` is honoured by the SDK, not restated by it (#16675).
55
*
66
* THE CONTRACT. `metadata.prefix` is a live `RestServerConfig` key, the exact
7-
* sibling of the `crud.dataPrefix` #14879 fixed: REST mounts every metadata
7+
* sibling of the `crud.dataPrefix` defect commit cf74a1128 fixed: REST mounts every metadata
88
* route under `metaPath = ${basePath}${metadata.prefix}` and the discovery
99
* handler advertises the same value as
1010
* `routes.metadata = ${realBase}${metadata.prefix}`. Three surfaces describe

‎packages/client/src/client.test.ts‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ function createMockClient(body: any, status = 200) {
2424
return { client, fetchMock };
2525
}
2626

27-
// [#9934] The producer-marked user-facing refusal text (`userMessage`) — the
27+
// [commit 79c46da90] The producer-marked user-facing refusal text (`userMessage`) — the
2828
// SDK surfaces it from BOTH live envelopes' declared spots, the same
2929
// two-dialect rule as `code`/`fields`, so the console can render a marked hook
3030
// refusal and keep its generic #3821 substitution for everything unmarked.
@@ -354,10 +354,10 @@ describe('ObjectStackClient', () => {
354354
// card. It used to require the slash to survive UNENCODED, so the
355355
// request would reach the compound handler
356356
// `/meta/:type/:section/:name` instead of collapsing onto the
357-
// two-segment route. #12176 retired compound-name addressing: that
357+
// two-segment route. Commit 7986d973f retired compound-name addressing: that
358358
// handler is gone, so `%2F` is now the correct and only spelling.
359359
//
360-
// Encoding is a no-op for every name #12194's grammar admits (snake
360+
// Encoding is a no-op for every name commit 311433f6b's grammar admits (snake
361361
// case, optionally dot-qualified), so this changes nothing a legal
362362
// caller sends. What it changes is a pre-grammar residue name: it now
363363
// reaches the surviving door with its slash intact as `%2F`, which Hono
@@ -509,7 +509,7 @@ describe('Security explain & global search (#3587 gap closure)', () => {
509509
});
510510

511511
it('security.explain accepts the recordIds batch spelling and forwards it verbatim (#8480)', async () => {
512-
// [#8480] Typed-client completion of #8326's batch spelling. The
512+
// [commit caaae2cca] Typed-client completion of #8326's batch spelling. The
513513
// client does NOT validate the cap or the recordId/recordIds
514514
// mutual exclusion — that stays the server's job
515515
// (`ExplainRequestSchema`); this pins that the body goes over the
@@ -875,7 +875,7 @@ describe('Notifications namespace', () => {
875875
});
876876

877877
it('[#6361] never puts a `cursor` on the query string — the SDK producer is gone', async () => {
878-
// The retired half of #6361 asserted where it was PRODUCED. `cursor` was
878+
// The retired half of commit 90bbf2510 asserted where it was PRODUCED. `cursor` was
879879
// never a server-read filter; what made it harmful rather than inert is
880880
// that this method appended it, so a caller paginating by the published
881881
// contract re-read the first window forever with no error.
@@ -1387,7 +1387,7 @@ describe('ObjectStackClient.automation', () => {
13871387
// TS2353 excess-property error, which a runtime assertion cannot reach.
13881388
// This pins the RUNTIME half, which tsc cannot: an untyped caller
13891389
// (plain JS, a `Record` spread, a hand-built options object) must not
1390-
// smuggle the parameter through. The same shape #6361 left behind one
1390+
// smuggle the parameter through. The same shape commit 90bbf2510 left behind one
13911391
// door over.
13921392
//
13931393
// All THREE surfaces are swept, because all three appended it and a
@@ -2162,7 +2162,7 @@ describe('ScopedEnvironmentClient', () => {
21622162

21632163
it('[#14879] a custom dataPrefix no longer makes the base underivable — `routes.metadata` is the second equation (case B1)', async () => {
21642164
const { client, fetchMock } = createMockClient({ types: [] });
2165-
// WAS pinned the other way. Until #14879 this case asserted the
2165+
// WAS pinned the other way. Until commit cf74a1128 this case asserted the
21662166
// convention `/api/v1/...`, because the only suffix `_apiBase()` knew
21672167
// how to strip was the literal `/data`, so a custom `crud.dataPrefix`
21682168
// made the base undetectable and the client fell back.
@@ -2194,8 +2194,8 @@ describe('ScopedEnvironmentClient', () => {
21942194
// with the conventional `/data` AND there is no `routes.metadata` to
21952195
// supply the missing equation, so `{realBase}{dataPrefix}` stays one
21962196
// string with two unknowns. The client must NOT guess a split — it
2197-
// falls back to the convention, byte-identical to the pre-#14879
2198-
// behavior.
2197+
// falls back to the convention, byte-identical to the behavior before
2198+
// commit cf74a1128.
21992199
(client as any)['discoveryInfo'] = {
22002200
routes: { data: '/backend/api/v9/records' },
22012201
};
@@ -2866,7 +2866,7 @@ describe('[#11391] meta.saveItem query string (unscoped client)', () => {
28662866
it('[#12195] a slash-bearing name is ENCODED and still gets the query string', async () => {
28672867
const { client, fetchMock } = createMockClient({ success: true });
28682868
await client.meta.saveItem('object', 'views/all_leads', { label: 'All leads' }, { force: true });
2869-
// Inverted by #12195: the slash used to be required to survive raw so
2869+
// Inverted by commit 7986d973f: the slash used to be required to survive raw so
28702870
// the request reached `PUT /meta/:type/:section/:name`, which had read
28712871
// `?force` since #11095. That door is retired; `%2F` reaches the
28722872
// surviving door, which has always read `?force`.

‎packages/client/src/index.ts‎

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,7 @@ export interface SaveMetaItemOptions {
681681
* empty spelling would pin the write against the empty string and refuse
682682
* every save with a 409 the caller never asked for.
683683
*
684-
* [#12195] There is ONE door now. The compound-name twin
684+
* [commit 7986d973f] There is ONE door now. The compound-name twin
685685
* `PUT /meta/:type/:section/:name` — which this note used to pair with —
686686
* is retired, and every name reaches `PUT /meta/:type/:name`
687687
* percent-encoded, so `if-match` behaviour no longer varies by how the
@@ -725,7 +725,7 @@ export interface SaveMetaItemOptions {
725725
* on the wire that the server ignores. Same shape the first-party
726726
* `@object-ui/data-objectstack` `MetadataClient.save` already uses.
727727
*
728-
* [#12195] REACHES EVERY SAVE — the carve-out this note used to carry is
728+
* [commit 7986d973f] REACHES EVERY SAVE — the carve-out this note used to carry is
729729
* GONE, and it is worth recording why rather than deleting it silently.
730730
*
731731
* `mode` used to reach only the single-segment `PUT /meta/:type/:name`.
@@ -735,7 +735,7 @@ export interface SaveMetaItemOptions {
735735
* answered 200, with no signal at the call site (objectstack#11712).
736736
*
737737
* Two changes closed it at the source rather than from this side. Stage 1
738-
* (#12194) made a slash-bearing name unwritable at all, and this stage
738+
* (commit 311433f6b) made a slash-bearing name unwritable at all, and this stage
739739
* retired the twin and unified this file on `encodeURIComponent`, so every
740740
* save now arrives at the one door that reads `mode`. A name that would
741741
* once have forked to the silent-publish door is now refused `400
@@ -796,7 +796,7 @@ function metaSaveHeaders(options?: SaveMetaItemOptions): Record<string, string>
796796

797797
/**
798798
* Request options for `meta.deleteItem` — the carriers the REST reset door
799-
* reads, made reachable from the SDK (#12181).
799+
* reads, made reachable from the SDK (commit cf71d73f8).
800800
*
801801
* `DELETE /meta/:type/:name` ("reset metadata item to artifact default")
802802
* reads THREE carriers. This bag declares TWO of them, and the third's
@@ -817,7 +817,7 @@ function metaSaveHeaders(options?: SaveMetaItemOptions): Record<string, string>
817817
* ADDS destructive reach — it drops the object's physical table after the
818818
* metadata row goes — no caller was measured needing it from this client,
819819
* and the door's repeated-parameter refusal exists because of that
820-
* destructiveness. Maintainer-seat ruling on #12181: a destructive surface
820+
* destructiveness. Maintainer-seat ruling, landed by commit cf71d73f8: a destructive surface
821821
* with no measured pull is not published. A caller that needs it is a
822822
* separate, separately reviewable widening.
823823
*
@@ -908,7 +908,7 @@ function metaDeleteQuery(options?: DeleteMetaItemOptions): string {
908908
*
909909
* Deliberately a sibling of {@link metaSaveHeaders} rather than a call into
910910
* it: the two methods carry two separately-ruled option bags (#11713 for
911-
* `saveItem`, #12181 for this one), so neither type may quietly acquire the
911+
* `saveItem`, commit cf71d73f8 for this one), so neither type may quietly acquire the
912912
* other's members. The two builders are pinned IN STEP by a test instead —
913913
* one token in, identical header bytes out.
914914
*/
@@ -1831,11 +1831,11 @@ export class ObjectStackClient {
18311831
// omits the `headers` key altogether, so a save without `ifMatch`
18321832
// hands `fetch` the same `init` it always did.
18331833
const headers = metaSaveHeaders(options);
1834-
// [#12195] ENCODED, like every other `/meta` item address in this file.
1834+
// [commit 7986d973f] ENCODED, like every other `/meta` item address in this file.
18351835
// This site used to leave `type`/`name` RAW so a compound name's slash
18361836
// would survive into a separate path segment and reach
18371837
// `PUT /meta/:type/:section/:name`. That door is retired, and encoding
1838-
// is now the single spelling: a legal name (#12194's grammar — snake
1838+
// is now the single spelling: a legal name (commit 311433f6b's grammar — snake
18391839
// case, optionally dot-qualified) contains nothing `encodeURIComponent`
18401840
// alters, so this is byte-identical for every name that can be written,
18411841
// and a pre-grammar residue name reaches the single-segment door with
@@ -1863,7 +1863,7 @@ export class ObjectStackClient {
18631863
* resolved as `options.ifMatch` and the same situation answers `409
18641864
* metadata_conflict` instead — the door has always read the header
18651865
* (`DeleteMetaItemRequest.parentVersion` describes it), this client just
1866-
* had no argument for it until #12181.
1866+
* had no argument for it until commit cf71d73f8.
18671867
*
18681868
* [#13023] READ `reset`, NEVER `deleted`. This method used to declare
18691869
* `{ type, name, deleted }` — an UNINHABITED shape: the door answers
@@ -2018,12 +2018,12 @@ export class ObjectStackClient {
20182018
/**
20192019
* ADR-0033: the published version of a metadata item.
20202020
*
2021-
* [#12195] The name is percent-encoded, like every other `/meta` item
2021+
* [commit 7986d973f] The name is percent-encoded, like every other `/meta` item
20222022
* address in this file. This docblock used to promise the opposite — that
20232023
* a compound name passed through UNENCODED, `getPublished('lead',
20242024
* 'views/all_leads')`, so its slash would reach the compound arity
20252025
* `GET /meta/:type/:section/:name/published`. That arity is retired and a
2026-
* slash-bearing name is refused at the publish door (#12194), so there is
2026+
* slash-bearing name is refused at the publish door (commit 311433f6b), so there is
20272027
* one spelling and one door.
20282028
*/
20292029
getPublished: async (type: string, name: string): Promise<GetPublishedMetaItemResponse> => {
@@ -3476,7 +3476,7 @@ export class ObjectStackClient {
34763476

34773477
/**
34783478
* @internal The CRUD data prefix this client's server actually mounts, read
3479-
* off the advertised routes (#14879).
3479+
* off the advertised routes (commit cf74a1128).
34803480
*
34813481
* `crud.dataPrefix` moves the mounted CRUD paths and the advertised
34823482
* discovery document TOGETHER — REST builds every data route as
@@ -3549,7 +3549,7 @@ export class ObjectStackClient {
35493549
* @internal The metadata prefix this client's server actually mounts, read
35503550
* off the advertised routes (#16675).
35513551
*
3552-
* The same defect as #14879 one key over, so deliberately the same
3552+
* The defect commit cf74a1128 fixed, one key over, so deliberately the same
35533553
* derivation shape as {@link ObjectStackClient._dataPrefix}, fallback
35543554
* discipline included. `metadata.prefix` moves the mounted metadata paths
35553555
* and the advertised discovery document TOGETHER — REST builds every
@@ -3632,7 +3632,7 @@ export class ObjectStackClient {
36323632
* `routes.data`: the REST discovery endpoint advertises it as
36333633
* `{realBase}{dataPrefix}` with `dataPrefix` defaulting to `/data`. This
36343634
* derivation strips that advertised suffix — `_dataPrefix()` reads which
3635-
* suffix it is (#14879), so a deployment that moves `crud.dataPrefix` off
3635+
* suffix it is (commit cf74a1128), so a deployment that moves `crud.dataPrefix` off
36363636
* the default no longer forces this derivation to decline. When the suffix
36373637
* is not derivable either, the caller falls back to the `/api/v1`
36383638
* convention — exactly today's behavior, so the change is strictly "follow
@@ -4908,7 +4908,7 @@ export class ObjectStackClient {
49084908
* Server policy decides which is required; pass whichever you have.
49094909
*
49104910
* ⚠️ NOT BOUND, and deliberately so — the one member of the `auth.*`
4911-
* family #14313 left at `Promise<any>`, with its
4911+
* family commit b1b978c8d left at `Promise<any>`, with its
49124912
* `exported-any-returns.json` entry still open.
49134913
*
49144914
* The maintainer's ruling of 2026-08-12 on #7735 keeps better-auth's
@@ -6376,7 +6376,7 @@ export class ObjectStackClient {
63766376
* List notifications for the current user.
63776377
*
63786378
* Returns the newest `limit` notifications — a WINDOW, not a page. The
6379-
* `cursor` parameter was removed in protocol 17 (#6361): it was appended to
6379+
* `cursor` parameter was removed in protocol 17 (commit 90bbf2510): it was appended to
63806380
* the query string here and read by nothing on the server, so a caller
63816381
* paginating by it re-read the first window forever. Omit `limit` to take
63826382
* the server's window (the platform inbox answers 50, clamped to 1..200);
@@ -7403,7 +7403,7 @@ export class ObjectStackClient {
74037403
// actually carries.
74047404
error.details = errorBody?.details ?? errorBody?.error?.details ?? errorBody;
74057405
if (fieldErrors) error.fields = fieldErrors;
7406-
// [#9934] The producer-marked user-facing refusal text
7406+
// [commit 79c46da90] The producer-marked user-facing refusal text
74077407
// (`ApiErrorSchema.userMessage`) — read from both live envelopes'
74087408
// declared spots, same two-dialect rule as `code`/`fields` above: the
74097409
// flat body carries it at the top level, the wrapped one inside
@@ -7533,7 +7533,7 @@ export class ScopedEnvironmentClient {
75337533
}
75347534

75357535
/**
7536-
* URL for a route mounted under the deployment's CRUD data prefix (#14879).
7536+
* URL for a route mounted under the deployment's CRUD data prefix (commit cf74a1128).
75377537
*
75387538
* Every route reached through here is mounted by REST as
75397539
* `${dataPath}/...` with `dataPath = ${basePath}${crud.dataPrefix}`, so the
@@ -8119,7 +8119,7 @@ export type {
81198119
GetPresenceResponse,
81208120
// Workflow re-exports removed (#4451, v17): the types were deleted from
81218121
// @objectstack/spec/api with the retired workflow slot.
8122-
// View-management re-exports removed (#6239, v17): the five viewId-addressed
8122+
// View-management re-exports removed (commit f549a0d4a, v17): the five viewId-addressed
81238123
// methods and their ten schemas were deleted from @objectstack/spec/api with
81248124
// the retired `ViewProtocol` — no host implemented them and no route reached
81258125
// them. A view's stored definition travels on the metadata types

‎packages/client/src/meta-automation-descriptors.test.ts‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@ function createMockClient(body: any, status = 200) {
2626

2727
describe('client.meta (#3563 PR-5)', () => {
2828
it('[#12195] getPublished ENCODES the name — one spelling, one door', async () => {
29-
// ⚠️ Inverted by #12195. This required the slash to pass through RAW so
29+
// ⚠️ Inverted by commit 7986d973f. This required the slash to pass through RAW so
3030
// the request reached the compound arity
31-
// `GET /meta/:type/:section/:name/published`. #12176 retired
31+
// `GET /meta/:type/:section/:name/published`. Commit 7986d973f retired
3232
// compound-name addressing and that arity is un-mounted, so `%2F` —
3333
// which Hono decodes back to `views/all_leads` on the surviving
3434
// `/:type/:name/published` route — is the correct spelling now.
@@ -40,7 +40,7 @@ describe('client.meta (#3563 PR-5)', () => {
4040
});
4141

4242
it('[#12195] a LEGAL name reaches getPublished byte-identically', async () => {
43-
// The control: encoding must be a no-op for every name #12194's
43+
// The control: encoding must be a no-op for every name commit 311433f6b's
4444
// grammar admits, so no working caller moved.
4545
const { client, fetchMock } = createMockClient({ success: true, data: {} });
4646
await client.meta.getPublished('lead', 'all_leads');

‎packages/client/src/meta-delete-item-carriers.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-
* [#12181] `meta.deleteItem` sends the carriers the REST reset door reads —
4+
* [commit cf71d73f8] `meta.deleteItem` sends the carriers the REST reset door reads —
55
* the `If-Match` OCC pin and `?state=draft` — on BOTH declarations.
66
*
77
* ## The defect
@@ -262,7 +262,7 @@ describe('[#12181] the withheld third carrier', () => {
262262
const { client, fetchMock } = createMockClient(RESET_OK);
263263
await client.meta.deleteItem('view', 'shared_grid', {
264264
// `dropStorage` is deliberately NOT a member of
265-
// `DeleteMetaItemOptions` (2026-08-28 ruling on #12181: the one
265+
// `DeleteMetaItemOptions` (2026-08-28 ruling, landed by commit cf71d73f8: the one
266266
// carrier that ADDS destructive reach, with no measured caller).
267267
// This is the type-level half of the withholding; the runtime half
268268
// is below. Adding the member turns the directive on the next line

0 commit comments

Comments
 (0)