fix(changeset): date the pending client entry's closing register — all three 'not addressed here' clauses had been answered - #18765
Conversation
… not present-tense — all three "not addressed here" clauses had been answered
`.changeset/client-get-session-envelope-and-refresh-read.md` is release input:
`changeset version` copies it verbatim into `packages/client/CHANGELOG.md` and
it ships in the npm tarball. Its closing paragraph was an undated present-tense
register of what the change left undone, and every one of its three clauses had
since been falsified on `origin/main`:
- the anonymous `/get-session` `null` "would need the published return
annotation to widen" — `374d9d3afa` moved the PRODUCER instead:
`refuseAnonymousSession` converts `200` + literal `null` into the ADR-0112
`401 UNAUTHENTICATED` refusal, so an anonymous `auth.me()` rejects and the
annotation needs no widening at all;
- `SessionUser.image` "declared `z.string().optional()`" — `0e51278f3`
declares it `z.string().nullish()`;
- `auth.login` / `auth.register` "normalize into `data` but set no `success`"
— `01388fe81` put them on `normalizeSessionResponse`, which returns
`{ success: true, ...body, data }`.
Each clause is kept as what it recorded, anchored to when it was written, with
the landing that answered it beside it. The dated better-auth 1.7.2 transcript
above is history and is untouched.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3
|
Both red checks on this PR are BY DESIGN, and a maintainer ruling is owed. · Naming them so no reviewer has to re-derive why a red PR is sitting here, and so it is on the record that this seat is ⛔ not going to clear them by routing around them.
⛔ What this seat will not do⛔ Not applying ⛔ Not merging a red PR, and ⛔ not merging outside the queue. And ⛔ not supplying, on a gate's behalf, a confirmation the gate asks a person for. ⛔ Neither red is a re-run candidate: "flake" is not in question — both are deterministic verdicts about this diff's shape, and What is owed, and where it is recordedThe ruling request is on the card: #18652, comment Two questions are the maintainer's: ① confirm the DELIBERATE CORRECTION class and land it by the gate's own prescribed path, or reject the amendment; ② whether One question was this seat's and is answered on the card: all three clauses stay in this diff. The paragraph enumerates ("Two answers stay outside the declared type"), so a clause-1-only repair would have to rewrite that sentence and thereby newly author two measured-false clauses into release input. Both survivors were verified on
Generated by Claude Code |
|
Maintainer confirmation of record — director seat, decision batch #156 item 1 on #18652 · maintainer 「同意」 to A · 2026-09-18T05:37Z
The Generated by Claude Code |
Fixes #18652
.changeset/client-get-session-envelope-and-refresh-read.mdis pending releaseinput, not a note:
changeset versioncopies it verbatim intopackages/client/CHANGELOG.md, which is in@objectstack/client's publishedfiles[]and ships in the npm tarball. AGENTS.md's release-owned table states thedeadline in its own words — "Your PR's input is its changeset, on a hard,
unwatched deadline: the release that consumes it deletes that input and publishes
the sentence."
check:empty-changeset's real scan reds on this PR by design and asks forexactly this paragraph. Its own text names the two classes and their opposite
remedies; this is the DELIBERATE CORRECTION class, and the gate says "this
gate stays red either way, and staying red is what puts the decision in front of a
person instead of routing around it."
.changeset/client-get-session-envelope-and-refresh-read.md,introduced by
5de93728a(PR fix(client): auth.me / auth.refreshToken deliver the SessionResponse envelope they declare, and refreshToken reads session.token #17237, merged 2026-09-09T21:43:50Z — confirmedat the tree, so there is no open author to defer to).
register of what that change left undone, and all three of its clauses had since
been falsified on
origin/mainby other cards' landings (readings below).here; this PR adds none. ⛔ Do not restore the file from the merge base — that
republishes three false sentences.
skip-changeset. It would exempt thechangeset-checkjob wholesale (lint.yml's own note on the self-test splitsays so), which is the one label that would silence this refusal. Suppressing it
is the routing-around the gate forbids, so the label decision is left to a human.
Readings — measured on this checkout, ⛔ not relayed from the citing cards
Each clause, the commit that falsified it, and its ancestry on
origin/main(
git merge-base --is-ancestor SHA origin/main, where exit 0 isself-proving):
null"would need the published return annotation to widen"374d9d3afa(#17881), 2026-09-12SessionUser.image"declaredz.string().optional()"image: z.string().nullish().describe('Avatar URL')—packages/spec/src/api/auth.zod.ts0e51278f3(#18501, for #17235), 2026-09-16auth.login/auth.register"normalize intodatabut set nosuccess"normalizeSessionResponse, which returns{ success: true, ...body, data }01388fe81(#17791, for #17234), 2026-09-12Clause 1, at the definition rather than a call site.
packages/plugins/plugin-auth/src/anonymous-session-refusal.ts:124refuseAnonymousSessionkeys on the answer shape and on nothing else — threeearly returns:
isGetSessionPath(endpointPath),response.status !== 200, andbody.trim() !== ANONYMOUS_BODYwhereANONYMOUS_BODY = 'null'(compared astext, so
'0'/'""'/'false'are left alone). It never reads how thecaller became anonymous, so never signed in, unknown cookie and revoked
session all convert alike.
ANONYMOUS_SESSION_REFUSAL_STATUS = 401, and it iswired at
auth-manager.ts:5679, the one seam every vendor route passes through.⇒ the anonymous answer is not a
nulloutside the declared type; it is arejection, which a
PromiseofSessionResponseannotation already permits.What the diff does, and the one design choice in it
Each clause is kept as what it recorded, anchored to when it was written
("sat outside … when this change was written"), with the landing that answered it
beside it. Two reasons that shape rather than a straight fact-swap:
"prose does not re-measure itself". A dated clause cannot be falsified again.
better-auth 1.7.2 transcript is correct because it is dated and
attributed. ⛔ That transcript is untouched — verified by needle
(
better-auth 1.7.2and(anonymous) -> 200 nullboth still present at lines10 and 14).
Scope note — clauses 2 and 3 were outside the card's fence
Card #18652 fenced scope to clause 1 and marked clause 2 not re-measured, in
either direction; clause 3 it did not mention. I measured both and they are false
too, so fixing clause 1 alone was not available: the sentence enumerates
("Two answers stay outside the declared type"), so a clause-1-only repair
would have had to newly author the surviving false clauses into release input —
strictly worse than what was there. Same defect class, same sentence, same file, no
new verification surface. ⇒ folded in, declared here, and reported separately to
the dispatching seat. Strip the last two rows if the seat disagrees; the diff is
one paragraph.
Tests / gates — the pin question, answered with three readings
⛔ NOT MEASURED: nothing in this repo can pin changeset prose, and it is not an
untried idea — the repo has ruled against building it. Three measurements, none of
them my own instrument:
check:pm-changeset-deadline-census— its header: "REPORT-ONLY:it fails nothing and gates nothing." It measures path presence, never
prose; its own blind-spot list says "
window-openmeans the FILE exists, neverthat the card's sentence about it is still correct." Live run on this checkout:
#18652 → verdict "window-open", assertsPending "pending changeset", inListing true, tally{window-open: 11, consumed: 3},falsifiedAssertions: [].The row is identical before and after this diff (I amend, not delete).
⇒ reachable, but structurally unable to fail. Not a pin.
check:changeset-gate-self-tests—lint.yml's own note:"The SELF-TEST halves only — the real scans stay in pr-automation.yml's
changeset-check."dispatch-gatesscores self-test-only families"checker-health only … NOT a PR verdict." Green here and green without this
diff. Not a pin.
changeset-deadline-census.mjs:"⛔ This file is deliberately NOT the enforcement half … report-only first, the
census is the deliverable, expansion only when the census reads zero including
its blind spot." The census reads 3 exposed, not zero. Independently,
.changeset/**is a ruled scan exemption — "a changeset is that record beforeit is compiled into a CHANGELOG"
(
packages/objectql/src/action-owner-key-single-source.test.ts,NOT_A_STALE_MENTION). And the file is consumed and deleted at the nextrelease, so a pin reading that path becomes a phantom check by construction.
⭐ The one reachable instrument that does respond to this diff is a third the
roster reading did not name —
check-empty-changeset.mjs's real scan — and itspolarity is inverted: it is green without this change and red with it, on the
act, not the prose. That is the human-confirmation gate above, not a pin.
Derived sweep —
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackataefbf5927, all 18 derived commands pluscheck:changeset-fixed(flagged ⛔ roster under.changeset) run locally:check:rerun-safety-verdict.dispatch-gatesflagged a staletree; the roster delta across it is exactly this one new whole-tree family
(
95b21b33b, ci(rerun-safety): measure the rerun property even when pass 1 is red #18746). It does not exist in this checkout, sopnpmexited 254(script-not-found) — ⛔ that is not a red gate and not a pass. It is self-test-only
and reads only its own fixtures, so it cannot judge this diff either way.
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over thechanged file exits 1 (clean), beyond
check:nul-bytes.pnpm lintnarrowing claimed, and no build/test: this diff compilesnothing and is read by no test.
turbo's graph is not consulted because the pathis in no package.
Does this diff owe a changeset of its own? — measured, ⛔ not assumed
No, and adding one would be a defect.
@objectstack/client's publishedfiles[]is["dist","README.md","CHANGELOG.md"];.changeset/**is not in it, andthis diff moves no
distbyte. The published text that does move is this veryentry — so the amended changeset is the release input. A second changeset would
emit a second CHANGELOG bullet correcting the first, which is the shape AGENTS.md
forbids by name: "Factual error in a released entry → amend that entry in a
dedicated docs-only PR, ⛔ never an erratum in a later entry." Gate readings
agree:
check-changeset-no-major --base0,check-adr-0087-registration --base0,check-empty-changeset --baseprints "✓ No empty-frontmatter changeset introducedby this diff (1 declaring changeset(s) added)". ⛔
majordoes not exist in thislaunch window and nothing here is breaking.
Clause-②: no
No key moves, no accept set widens or narrows, no export changes, no error code or
ERROR_CODE_LEDGERentry moves, and nopackages/specpath is touched. The diff isprose inside one pending changeset; zero lines of shipped code change.
⛔ Reported, not touched: the open Version Packages PR
#17076
chore: version packagesis OPEN and already renders this entry — at itshead
1c0ce1713the changeset is absent (contents API404, against a200positive control on
.changeset/config.json) and the paragraph is compiled intopackages/client/CHANGELOG.md:506. ⛔ I did not touch that PR, ran no release, andmerged nothing.
⭐ But an open Version Packages PR does not mean the window has closed, and the
dispatch order's reading that it does is falsified by the repo's own workflow.
That branch is a derived artefact, regenerated from scratch:
release.yml'sversion-prjob isif: github.event_name == 'schedule' || (… workflow_dispatch && inputs.refresh_version_pr)— ⛔ notpush; the file'sown note: "this job regenerates the PR from scratch, so the newest run's result
is the one that was wanted anyway", and "renders changesets that are already
committed on main, so lateness costs nothing."
git reset --hard SHA→pnpm run version→git push … --force.commit,
1c0ce1713, authored bygithub-actions[bot]at 2026-09-17T18:14:46Z,whose parent
e77a23f02is an ancestor oforigin/main(exit 0) and only 7commits behind it. Created eight days before the commit it holds ⇒ force-rebuilt.
⇒ The window closes when a release consumes the changeset (AGENTS.md's wording),
i.e. when #17076 is merged and published — a human-only act (
release.yml:"TWO LANES, ONE INVARIANT: ONLY A HUMAN PUBLISHES."). Until then this entry is
still amendable at one paragraph, and the next 6-hourly tick re-renders #17076 from
the corrected text with no action on that PR. The deadline is real and this PR is
inside it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01DvvamiacK328idtBYJBxV3
Generated by Claude Code
Landing note added by the dispatching seat (#6024) — clearing a red that was the seat's, not this PR's
The earlier red on
The card this PR closes must claim this branchwas caused by the claim comment's shape, not by anything in this diff: the seat's claim on #18652 opened**CLAIM · …**, andscripts/check-closing-target-claim.mjsselects a comment by a line beginningClaim:plus a separateBranch:directive line. Fixed on the card (5720097499), measured before and after —check-clause2-carriers --pair 18765went fromEXIT=4 / claim.selected: nonetoEXIT=0 / 1 comment(s) in the pool, both carriers readingno.That guard is body- and comment-scoped and re-fires only on a
pull_requestormerge_groupevent, so this edit is the event that re-judges it — ⛔ not an empty commit, which the deliverer correctly refused, and ⛔ not a push, since the seat has ruled that all three clauses stay and no further code change is owed.check-empty-changesetasks in its own words for a human to confirm the DELIBERATE CORRECTION class, andpr-automation.yml'schangeset-checkcounts only added changesets (this PR amends one and adds zero). The ruling request is on #18652 (5720153848). ⛔skip-changesetis deliberately NOT applied — it exempts that job wholesale and would silence the refusal that exists to put this decision in front of a person.Generated by Claude Code