3838 * the ablation meaningful: with the new predicate removed, the eligibility
3939 * cases must flip red and these five must stay green.
4040 *
41- * ## [#13608 ] The second seam: the same policy, held again at REDEMPTION
41+ * ## [commit fc9ba76a5 ] The second seam: the same policy, held again at REDEMPTION
4242 *
4343 * Enforcing at mint alone left the adjacent half open, and the state the
4444 * predicate reads is exactly the state an editor changes: publish an article
@@ -69,7 +69,7 @@ import type { DriverQuery } from '@objectstack/spec/contracts';
6969import { assertEngineUpdateDispatch , assertEngineFindOnePredicate } from '@objectstack/objectql' ;
7070import type { IHttpServer , IHttpRequest , IHttpResponse , RouteHandler } from '@objectstack/spec/contracts' ;
7171import { ShareLinkService } from './share-link-service.js' ;
72- // [#13608 ] The PUBLIC seam an anonymous holder actually reaches. The refusal's
72+ // [commit fc9ba76a5 ] The PUBLIC seam an anonymous holder actually reaches. The refusal's
7373// shape is a claim about what that caller can observe, so it is measured there
7474// and not only on the service's return value.
7575import { registerShareLinkRoutes } from './share-link-routes.js' ;
@@ -139,7 +139,7 @@ interface BootOptions {
139139 */
140140 shapeRow ?: ( row : any ) => any ;
141141 /**
142- * [#13608 ] Collect the service's server-side log. The redemption refusal is
142+ * [commit fc9ba76a5 ] Collect the service's server-side log. The redemption refusal is
143143 * deliberately silent on the wire, so this is where the REASON it refused
144144 * becomes assertable — and where the ruling says the reason belongs.
145145 */
@@ -165,7 +165,7 @@ async function boot(article: any = ARTICLE, options: BootOptions = {}) {
165165
166166 const schemas : Record < string , any > = { article, sys_share_link : SysShareLink } ;
167167 /**
168- * [#13608 ] Every read the service issues, in order. Two claims are measured
168+ * [commit fc9ba76a5 ] Every read the service issues, in order. Two claims are measured
169169 * off it: the `id`-only probe is UNCHANGED for an object with no predicate,
170170 * and the eligibility path widens that same read rather than adding a second.
171171 */
@@ -595,7 +595,7 @@ describe('[#7861] publicSharing.eligibility is enforced at createLink', () => {
595595
596596
597597/**
598- * [#13608 ] The redemption seam.
598+ * [commit fc9ba76a5 ] The redemption seam.
599599 *
600600 * `resolveToken` checked `revoked_at`, `expires_at`, the audience gates, the
601601 * password and record EXISTENCE — and served whatever survived, under
@@ -923,7 +923,7 @@ describe('[#13608] publicSharing.eligibility is enforced again at REDEMPTION', (
923923 * `publicSharing.enabled` governed MINTING only: `getPolicy()` collapsed to an
924924 * empty policy when the block was off, and `resolveToken` read nothing off
925925 * `policy.enabled`. So the platform held this shape — the predicate INSIDE
926- * the block was re-evaluated at every redemption (#13608 , above) while turning
926+ * the block was re-evaluated at every redemption (commit fc9ba76a5 , above) while turning
927927 * the ENTIRE block off did not stop a single existing link. Maintainer ruling
928928 * of 2026-09-01 (quoted verbatim in `share-link-service.test.ts`'s reversal
929929 * register): the switch is a standing policy held at every redemption,
@@ -983,7 +983,7 @@ describe('[#14033] publicSharing.enabled is a standing policy — the switch is
983983 /**
984984 * The HTTP seam, driven end-to-end on the real service through the real
985985 * route, with the route's SECURE default context — every request below is
986- * anonymous. Same reading as the #13608 pin above, for the same reason: the
986+ * anonymous. Same reading as the commit fc9ba76a5 pin above, for the same reason: the
987987 * switched-off link lands in the generic "invalid / expired / revoked"
988988 * answer, byte-for-byte what a token that NEVER EXISTED gets — not the 410
989989 * bucket, which would confirm the token was real, and not a 422 naming the
@@ -1268,7 +1268,7 @@ describe('[#14637] the route probe reads the standing policy before it answers f
12681268 // Back-dated on the stored row, not minted: `createLink` refuses a past
12691269 // `expiresAt` outright (`422 EXPIRY_IN_PAST`), so this is the only way to
12701270 // reach an ALREADY-EXPIRED link — and it is exactly what the passage of
1271- // time does to a live one. Same stamp the #13608 pins above use.
1271+ // time does to a live one. Same stamp the commit fc9ba76a5 pins above use.
12721272 await driver . update ( 'sys_share_link' , link . id , {
12731273 expires_at : new Date ( Date . now ( ) - 60_000 ) . toISOString ( ) ,
12741274 } ) ;
@@ -1306,7 +1306,7 @@ describe('[#14637] the route probe reads the standing policy before it answers f
13061306} ) ;
13071307
13081308/**
1309- * [#13608 ] Mount the real PUBLIC resolve route on the real service.
1309+ * [commit fc9ba76a5 ] Mount the real PUBLIC resolve route on the real service.
13101310 *
13111311 * Only the verbs `registerShareLinkRoutes` calls are implemented, and the
13121312 * SECURE default `contextFromRequest` is deliberately left in place: it reads
@@ -1318,7 +1318,7 @@ describe('[#14637] the route probe reads the standing policy before it answers f
13181318 * the `audience: 'signed_in'` arm from the serving side), and the returned
13191319 * driver takes the request query (the only way to reach the `WRONG_PASSWORD`
13201320 * arm). Omit both and this is byte-for-byte the anonymous, query-less harness
1321- * the #13608 and #14033 pins above drive.
1321+ * the commit fc9ba76a5 and #14033 pins above drive.
13221322 */
13231323function mountResolveRoute ( service : ShareLinkService , engine : unknown , signedInUserId ?: string ) {
13241324 const routes = new Map < string , RouteHandler > ( ) ;
0 commit comments