Uh oh!
There was an error while loading. Please reload this page.
docs(changeset): the share-link refusal warn is per-hit and unlatched, not a one-time burst - #14764
Merged
os-sales merged 1 commit intoSep 3, 2026
Conversation
…14668) The changeset for the #14033 redemption-time `publicSharing.enabled` hold said the refusal "will burst the log once". Its own first half contradicts that: per-hit and unlatched is precisely the property that means the volume does NOT occur once. Measured at the emitting site — `packages/plugins/plugin-sharing/src/ share-link-service.ts:697-708`, the `if (!policy.enabled)` arm of `resolveToken()`: an unconditional `this.logger?.warn?.(…)` followed by `return null`, with no latch, no `Set`, no memo and no sampling anywhere in the path. The only latch in the file is `usageStampRefusalReported`, which guards the unrelated #12981 usage-stamp degradation. `resolveToken` is called once per HTTP redemption (`share-link-routes.ts:233` and `:317`) with no cache or rate limit in front of it, so the line count tracks the refused-hit rate and does not decay. Prose only. The frontmatter, the level, the BREAKING banner and every surrounding paragraph are byte-identical; the per-hit behaviour is ruled and is NOT changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AUF1NoViznQK32gqpK8wS8
os-sales
marked this pull request as ready for review
September 3, 2026 00:10
os-sales
enabled auto-merge
September 3, 2026 00:10
Uh oh!
There was an error while loading. Please reload this page.
os-sales
deleted the
claude/issue-14668-share-link-changeset-burst-wording
branch
September 3, 2026 02:01
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#14668
The changeset
.changeset/share-link-enabled-at-redemption.mdtold an operatorthat the redemption refusal "will burst the log once". Its own first half
contradicts that: per-hit and unlatched is precisely the property that means the
volume does not occur once. Prose only — one sentence is the whole diff, and
no source file is touched.
Measured at the emitting site, before one word was edited
packages/plugins/plugin-sharing/src/share-link-service.ts, lines 697-708 —the
if (!policy.enabled)arm ofresolveToken(), the[#14033]gate:Verdict: once per HIT, unlatched. The
warncall is unconditional. Nothingin the arm records that it has fired, and there is no
Set,WeakSet,Map,memo, dedupe or sampling anywhere on the path. The only mutable state on the
class is
usageStampRefusalReported(declared line 423) and it latches adifferent site —
reportUsageStampRefusal()(line 842), the #12981usage-stamp degradation, whose docblock argues at length why that one is
once-per-service-instance. Nothing analogous guards this one.
Scope of the firing is therefore the request:
resolveToken()is called once perHTTP redemption (
share-link-routes.ts:233and:317), with no cache and norate limit in front of it, so the line count tracks the refused-hit rate and does
not decay. The sibling
eligibilityrefusal instillEligible()(line 946) isthe same unlatched per-hit shape, as the changeset already says.
Per-hit is intended and ruled (#14033) — the comment immediately above the arm
states the design deliberately. The code is not changed here; only the
sentence that described it. If the site is ever judged to deserve a latch, that
is a behaviour change on a published log sink and belongs to its own card.
The diff — one sentence
Old:
New:
The correct first half is kept byte-identical, and the replacement states the
two facts an operator budgeting log retention needs and the old sentence denied:
the volume follows traffic, not the deploy, and it has an exit condition
(re-enable the block, or revoke the links) rather than an end of its own.
Everything else in the file is untouched: the frontmatter and its
minorlevel,the BREAKING banner, every surrounding paragraph, and the ADR-0087 marker.
content/docs/releases/**is not touched either — release notes are compiledcentrally from this changeset, which is exactly why the changeset's own wording
is the thing worth correcting.
Verification — at
cbc0402b3, the final commitGates derived, not recalled:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands(no paths — the script takes the change set from the merge base itself). It named
9 families for this path. All 9 run green, plus 2 more run deliberately:
node scripts/check-adr-0087-registration.mjs✓ this PR adds no declared-breaking changeset (1 non-breaking changeset(s) seen).node scripts/check-changeset-no-major.mjs✓ This diff introduces no 'major' bump.node scripts/check-empty-changeset.mjs✓ No empty-frontmatter changeset introduced by this diff (1 declaring changeset(s) added).node scripts/check-keyed-text-bounds.mjs✓ 148 keyed text-family columns judged, 148 bounded.node scripts/pm/check-half-states.mjsnode scripts/pm/release-rehearsal-clone.mjs --self-testpnpm check:changeset-gate-self-testspnpm check:objectui-changesetpnpm check:pm-half-statesnode scripts/check-changeset-fixed.mjs(added)✓ .changeset/config.json "fixed" group is in sync with 69 public workspace packages.pnpm check:nul-bytes(added)check-nul-bytes: OK (scanned 8052 text file(s) ... no raw ASCII control bytes).Every exit code was captured into a variable before any pipe, and each row
quotes the gate's own verdict line rather than a bare
$?.The two additions are not padding.
check-changeset-fixed.mjsis the one familythe derivation itself flags as an artifact roster whose roster sits in a
directory one of these paths is in — its silence "is not evidence in EITHER
direction" there, so it was run rather than read as a clearance.
check:nul-bytesis owed by any edit; a directgrep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over the file is clean too.Clause ②:
no, re-derived from the actual diff rather than recalled —git diff -U0 origin/main...HEAD | grep -E '^\+\s*export 'matches nothing(exit 1). No export is added, removed or re-shaped; nothing about the published
surface moves.
No ablation is owed, stated rather than silently skipped: this diff changes
prose in a changeset. There is no behaviour to mutate and no test whose failure
could be demonstrated by removing it — an ablation here would have nothing to
delete but the sentence itself. The claim the sentence makes was verified against
the source, above, which is the check that actually applies.
origin/mainwas re-fetched at the end and is unmoved at7a17f3bf1, so thegate union above ran on this branch's final tree.
🤖 Generated with Claude Code
https://claude.ai/code/session_01AUF1NoViznQK32gqpK8wS8
Generated by Claude Code