Uh oh!
There was an error while loading. Please reload this page.
docs(comments): date the #3290 session.tenantId removal to v16, not v11 - #9990
Conversation
The removal of the deprecated `ctx.session.tenantId` alias shipped in 16.0.0, but 20 comment sites across the tree dated it to "v11". All of them trace to a single origin: commit 6c270a6, the removal PR itself, which introduced the wrong major 15 times in one diff. The mechanism is worth recording, because it is not carelessness. The root `CHANGELOG.md` still tops out at `[11.10.0] — 2026-07-03`; it was never maintained past the 11 line while the packages moved on to 15, 16 and 17. An author checking "what major are we on" against the repo's own root changelog reads 11. At that commit `packages/spec` was at 15.1.1. The true version is established from the release record, not propagated from another comment: * `packages/{spec,runtime,objectql}/CHANGELOG.md` all place the entry `6c270a6: **BREAKING: remove the deprecated ctx.session.tenantId ...` under `## 16.0.0` (first under `## 16.0.0-rc.0`). * `content/docs/releases/v16.mdx` is the only release page mentioning #3290, and its "Upgrade checklist -> 16.0.0" carries the rename. * `docs/upgrading-to-11.md` is the complete 10.x -> 11.x breaking-change guide and does not mention `tenantId`, #3280 or #3290 at all. Comment text only: no behaviour, no assertion, no test expectation and no gate verdict changes. `content/docs/releases/**` is evidence here, never a target, and is untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
📓 Docs Drift CheckThis PR changes 5 package(s): ⛔ 1 release-owned page(s) name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 122 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 334e66acb0e9189b6a24c8ab218296ae3b87a57c && git checkout 334e66acb0e9189b6a24c8ab218296ae3b87a57c
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 94c58b34c5e0a193598692ed0185c3b6e10cfa71 d9e01627ab78ab773a74f8bc1bec0ec89d7da77b && git checkout -B drift-repro 94c58b34c5e0a193598692ed0185c3b6e10cfa71 && git merge --no-ff d9e01627ab78ab773a74f8bc1bec0ec89d7da77b
node scripts/docs-audit/affected-docs.mjs --json 94c58b34c5e0a193598692ed0185c3b6e10cfa71
|
PM review — ACCEPT. You falsified a leg of the card, caught two false-positive classes, and I am correcting one of your own findings in return. Arming.Verified at ⭐ Ruling 1 worked — one of the card's three legs was FALSEI told you to verify all three legs before editing a comment, because a card that propagates a second unverified number is the same defect with a different digit. One leg was false:
Confirmed from this seat. Had that leg shipped as justification, we would have fixed 20 comments while asserting something false about the release record — inside a PR whose entire subject is "a version number nobody looked up." Your replacements are stronger because they are positive rather than absential: the removal entry sits under ⭐ The two false-positive classes — this is where a mechanical sweep would have done damage
And H1 — 26, not "~10", and the 6 residuals correctly untouched20 comment sites fixed. Using Q1 → B. Split by surface.
On the two you flagged as neither: Q2 → card nothing, and I am correcting your findingYour root-cause tracing is the best part of this report: all 26 sites trace to one origin commit But the remedy you proposed rests on a claim I checked and it does not hold as stated:
The root
So the file announces its own staleness before the reader reaches a number. It is documented, owned, and mid-migration — not silent. ⇒ No card. Option A (a gate cross-checking I am holding your finding to the same standard you held the card's: the leg was checkable, I checked it, and it does not carry the conclusion. The tracing stands; the remedy does not follow from it. H2 — clean, and the negative statedEvery On method
Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Part of #9872 — deliberately not a closing keyword: this lands the comment-only half. A
residue of 6 sites is out of scope under the card's rulings and needs PM triage, so merging
this must not close the card.
The true version, established from the record before any comment was edited
The card asserted v16 on three legs. I verified all three, falsified one of them, and
replaced it with two stronger ones.
v16.mdxmentions #3290content/docs/releases/v16.mdx:125,132,1046— the only release page with a#3290hitUpgrade checklist → 16.0.0lists the renamev16.mdx:977→ "renamectx.session.tenantId/ctx.user.tenantId→organizationIdin every*.hook.ts/*.action.tsbody"v11.mdx, so v11 names a major that does not exist"CHANGELOG.md## [11.0.0] — 2026-06-27, plusdocs/upgrading-to-11.mdand@objectstack/*@11.0.0in the example changelogs. The page is absent by policy, not because the major is:scripts/check-release-notes.mjscarriesconst KNOWN_MISSING = new Set([10, 11]);— "Curated release pages started at v9; v10/v11 were never backfilled"Absence of
v11.mdxtherefore proves nothing. Two replacement legs that do:packages/spec,packages/runtimeandpackages/objectqlalike, the entry
6c270a6: **BREAKING: remove the deprecated `ctx.session.tenantId` / `ctx.user.tenantId` alias…sits under## 16.0.0(and first under## 16.0.0-rc.0).docs/upgrading-to-11.mdis the complete 10.x → 11.xbreaking-change guide — "This guide lists every breaking change from 10.x → 11.x" —
and contains no
tenantId, no Unify the developer-facing org identifier: hooks exposesession.tenantIdwhile RLS/seed/columns useorganizationId(addorganizationIdas the blessed name) #3280 and no Remove the deprecated hook/actionctx.session.tenantIdalias in the next major (converge onorganizationId) #3290.skills/objectstack-data/references/data-hooks.md:627(governed; read, not edited) is the onesite that already said v16, and it corroborates.
Why "v11" got written ~10 times — a single origin, and a cause worth recording
git log -Sputs the origin at6c270a607c— the removal PR itself(
feat(hooks)!: remove deprecated ctx.session.tenantId alias … (#3290) (#3305), 2026-07-20).It introduced "v11" 15 times in one diff. Every later site is a copy.
The cause is not carelessness, and it is still live:
It was never maintained past the 11 line while the packages moved on. At
6c270a607c,packages/spec/package.jsonread15.1.1— but an author sanity-checking "what major are weon" against the repo's own root changelog reads 11. That is the whole defect, once.
Hence the repair shape: the durable anchor is the issue number, not the major. Every edited
site already cites
#3290next to the version, so the version is now redundant corroborationrather than the load-bearing claim, and the single most-copied teaching site — the gate header
that the card notes "teaches the migration" — now names the checkable page:
Population: 26 wrong sites found, 20 fixed here
Re-derived from scratch (every
v11/11.0.0token and every#3290token in the tree), nottaken from the card's "~10".
Fixed — 20 sites / 17 files, all pure comment text:
packages/objectql/src/{engine.ts, plugin.ts,engine.test.ts}·packages/runtime/src/{action-execution.ts,http-dispatcher.test.ts, action-session-shape-contract.test.ts,domains/actions.ts}·packages/spec/src/{data/hook.zod.ts, data/hook.test.ts ×2,ui/action-params.zod.ts ×3 (JSDoc only),contracts/sharing-service.ts}·packages/plugins/plugin-audit/src/{audit-writers.ts,audit-writers.test.ts}·packages/triggers/trigger-record-change/src/record-change-trigger.ts·scripts/check-org-identifier.mjs·.github/workflows/lint.yml(YAML comment) ·content/docs/kernel/runtime-services/sharing-service.mdx(comment inside a sample).Found wrong but deliberately NOT fixed — 6 sites, PM triage:
skills/objectstack-ui/SKILL.md:1934skills/**is a governed surface; a mixed diff forks the whole PRpackages/spec/src/ui/action-params.zod.ts:376,409.describe()— runtime spec surface, regenerates the auto-generatedcontent/docs/references/ui/action-params.mdx:58,59, and would owe a changeset (ruling 6)packages/spec/src/migrations/registry.ts:1555+entries/semantic/17.action-session-roles-to-positions.ts:23rationale— runtime data that regeneratesspec-changes.jsonanddocs/protocol-upgrade-guide.md:317packages/plugins/plugin-audit/src/audit-writers.test.ts:1653scripts/check-org-identifier.mjs:596,600,602,640Also reported, not touched:
.changeset/{org-identifier-session-provenance, audit-tenant-fallback-reads-organization-id}.md(inside the #9465 fence) and the historicalpackages/{spec,runtime}/CHANGELOG.mdentries (published records).Correct
v11citations — verified and deliberately left alone:content/docs/kernel/contracts/metadata-service.mdx:311(IUIServiceremoved in v11) anddocs/audits/2026-07-security-props-liveness-recheck.md:26(PolicySchemaremoved in v11.0) —both appear as their own items in
docs/upgrading-to-11.md(lines 91 and 128).objectui#3290(
packages/spec/src/ui/widget.zod.ts:123,content/docs/protocol/objectui/widget-contract.mdx:145)is a different repo's issue about the widget
requiredstate and is not in the population.Wider sweep — clean
Swept for a habit rather than one wrong digit: every release-version citation near #3290 and the
rename, plus the co-cited ids. #3280 is exactly what the comments claim it is ("add
organizationIdas the blessed name",session.tenantIddeprecated). ADR-0087/0090/0095/0099/0104all resolve, and ADR-0090 D3 really is the "role becomes a reserved-forbidden word" decision.
v11was the only wrong provenance found.Nothing mechanical checks a version citation in a comment.
check-release-notes.mjsverifies theinverse — that every released major has a curated page — and reads nothing in source. That is why
this survived 20 times. Not carded here (a new gate is outside this card); flagged for PM judgement.
Verification —
d9e01627abComment-only diff, so the local set was deliberately narrowed and is declared as such; CI runs
the full farm. Gate set re-derived mechanically with
node scripts/pm/dispatch-gates.mjs(no pathspassed) on the committed head — 17 paths, 35 matched families.
typecheckgreen on all five touched packages (5 scripts echoed — not a zero-match silent pass).Touched test files, all green:
hook.test.ts+action-params.test.ts102 ·engine.test.ts135 ·http-dispatcher.test.ts+action-session-shape-contract.test.ts257 ·audit-writers.test.ts67— 561 tests.
No changeset: this publishes nothing. Takes the
skip-changesetlabel (route 2 inscripts/check-empty-changeset.mjs), never an empty-frontmatter changeset.⛔ Draft on purpose. Do not arm auto-merge; the maintainer arms after review.
Generated by Claude Code