Repository navigation
chore(spec): quote the props-read sites of three ComponentPropsMap rows, ASSERTED_ANCHOR_FLOOR 7 to 10 - #22038
Conversation
…ws and raise ASSERTED_ANCHOR_FLOOR to 10 action:button and action:icon quote the first line of their runner-forward literal, element:definition-list quotes its readProps call, each re-read at objectui a58626c88 and spelled with its path so the assertion does not inherit the nearest preceding anchor's file. The floor rises by exactly those three. action:group, action:menu and element:repeater get no quote: their cited lines do not hold at that pin. Claude-Session: https://claude.ai/code/session_01GV6oYwgc1kWiUCb1YaprQ7 Co-authored-by: Claude <noreply@anthropic.com>
…ords The edited docblocks ship verbatim in @objectstack/spec (files[] carries src/**/*.zod.ts), so the comment-only change publishes text. Claude-Session: https://claude.ai/code/session_01GV6oYwgc1kWiUCb1YaprQ7 Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift Check
What this run could not see
Coarse fallback — 139 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
Contract reviewServed-tier: Inputs: card #20471 (body and all eleven comments, the ① Derived judgments
② Semver level
③ Boundary flagsThe dev's report is
Implemented-by: VERDICT: PASS Generated by Claude Code |
…eater records at the objectui pin and quote their props-read sites, ASSERTED_ANCHOR_FLOOR 10 to 13 (objectstack-ai#22043) Fixes objectstack-ai#20471 Clause-②: no (docblock text and a gate constant: the accept set and the public type surface are unchanged) Stage 2 of objectstack-ai#20471, as the landing record of stage 1 (PR objectstack-ai#22038) scopes it. All six `ComponentPropsMap` rows the card names now quote their props-read site, so this PR closes the card. The `action:group`, `action:menu` and `element:repeater` records cited objectui lines that did not hold at the pin they assert (`.objectui-sha` = `a58626c88`). This PR re-measures them at the pin, re-points every cited line that moved, corrects the prose that was false at the pin, and then quotes one load-bearing anchor per row. `ASSERTED_ANCHOR_FLOOR` goes from 10 to 13. ## What changed - `packages/spec/src/ui/component.zod.ts` (docblocks and one code comment, no code): - **Section 4b hop note.** It said only the two `objectName` forwards moved at the `0abd4f9f8` → `a58626c88` hop. In fact every container anchor below the deleted `useConfigBagEvaluator()` call moved, and `static-params.ts` moved too. The note now says so. A new "correction" sentence records where earlier hop notes certified anchors that had already drifted (details below). The older dated notes are left as written. - **`action:group` and `action:menu` row records:** every moved anchor is re-pointed (table below). The "static values" parenthetical on each member forward now describes what is there at the pin: since objectui#11638, a member's own `properties.params` is no longer read. - **`element:repeater` row record:** every `data-list.tsx` anchor is re-pointed (+28), and so are the two `data-objectstack/src/index.ts` anchors. The `fields` sentence said the renderer's TS type and its registration description both advertise `label`. Since objectui#11168 slice 2 neither does, and the sentence now says so. - **`element:definition-list` registration prose:** it said the registration publishes the strings `'1'` / `'2'` and marks `items` required. Since objectui#11168 slice 2 it does neither. Both sentences now give the history and the current lines. The inline comment on the `columns` literal makes the same correction. `previews/block-config.ts:307` is re-pointed to `:320`. - **`action:button`:** `static-params.ts:91-101` is re-pointed to `:98-108`. - **The `[objectstack-ai#21855]` member paragraph** above `actionContainerMemberShape` (patch round `00c6b980`, at the seat's direction, claim revision `6027563825`): it called `0abd4f9f8` the current pin. Its three anchors now point at `a58626c88` (group `:325-327`, menu `:261-263`, `static-params.ts:164-174`), in the asserting spelling, so the gate re-checks it at the next pin bump. It is an in-place fix: the same defect class, a mechanical edit, no other claim, and the same gate family. - **Three quotes,** one per row, each spelling its path (see "The quotes" below). - `packages/spec/scripts/check-objectui-pin-citations.ts`: `ASSERTED_ANCHOR_FLOOR` goes from 10 to 13, exactly the three quotes. Its docblock names the three. It also updates the worklist count from 418 to 419, as `--verify-anchors` reads it at `a58626c88` (see Acceptance notes for why it went up by one). - `.changeset/20471-component-row-anchor-requote.md`: a `patch` changeset for `@objectstack/spec`, because `files[]` ships `src/**/*.zod.ts` and these docblocks are published text, as stage 1 measured. ## Re-pointed anchors Each row was checked in two ways, read-only, in the local objectui object store: - The new line's text was compared with the old line's text at the pin where the old number last held. They are identical for every row except the two `paramsPayload` tails that objectui#11638 rewrote. - The record's claim was re-read against the new line. | Row | Cited | Old | New (verified line at `a58626c88`) | |---|---|---|---| | `action:group` | `actions` read | `:303` | `:300` `const declaredActions: UIActionSchema[] = schema.actions \|\| [];` | | | `actionRendersAt` filter | `:304` | `:301` | | | member forward | `:329-382` | `action-group.tsx:325-374`, QUOTED (`params` `:325-327`, `objectName` `:381` → `:373`) | | | `display` | `:404` | `:396` | | | `label` / `icon` | `:424` / `:408` | `:416` / `:400` | | | `variant` | `:414`, `:456` | `:406`, `:448` | | | `size` | `:415`, `:457`, registration `:487-528` | `:407`, `:449`, `:479-520` (`:124` held) | | | `visible` | `:290` + `:401` | `:287` + `:393` | | | host `disabled` (dropdown trigger) | `:418` | `:410` (`:274`, `:159` held) | | | held | `:114-171`, `:205-243`, `:81-86`, `action-group.tsx:40-42` | unchanged | | `action:menu` | `actions` read | `:342` | `:335` `const actions: UIActionSchema[] = schema.actions \|\| [];` | | | members | `:80`, `:108-147`, `:408` | `:80`, `:108-147`, `:401` | | | `ActionAutoTrigger` | `:363-370` | `:356-363` | | | member forward | `:264-328` | `action-menu.tsx:261-321`, QUOTED (`params` `:261-263`, `objectName` `:327` → `:320`) | | | `label` | `:389`, `:398-399` | `:382`, `:391-392` | | | `icon` / `variant` / `size` | `:240` / `:241` / `:242` | `:237` / `:238` / `:239` | | | `visible` | `:235` + `:336` | `:232` + `:329` | | | registration `inputs` | `:435-463` | `:428-456` | | | host `disabled` | `:219`, `:388` | `:219`, `:381` | | `element:repeater` | `readProps` | `:97-107` | `data-list.tsx:125-135`, QUOTED | | | `object` | `:143`, `:155`; `:143-146`, `:181` | `:171`, `:183`; `:171-174`, `:209` | | | `filter` / `sort` / `limit` | `:120`, `:152` / `:153` / `:154` | `:148`, `:180` / `:181` / `:182` | | | `emptyText` / `divided` | `:181` / `:186` | `:209` / `:214` | | | `titleField` / `fields` | `:191-192` / `:128`, `:194-196`, `:196` | `:219-220` / `:156`, `:222-224`, `:224` | | | `useResolvedFilter` | `data-list.tsx:119-120` | `data-list.tsx:147-148` | | | filter arm / `serializeOrderBy` | `data-objectstack/src/index.ts:4782-4793`, `:760-786` | `:5000-5011` (`options.filters = translateFilterArray(params.$filter);`), `:868-894` | | `element:definition-list` | Studio `columns` control | `previews/block-config.ts:307` | `:320` | | | registration `columns` / `items` | `:82` (prose false at the pin) | `data-list.tsx:99-105` / `:91-97`, prose rewritten | | `action:button` | `readStaticParamValues` | `static-params.ts:91-101` | `static-params.ts:98-108` | ## When each anchor moved These readings use blob ids of each cited file at every pin from `dd3f7e1be` to `a58626c88`, read in the local objectui object store. `89cad75d5` and `ab1879721` were fetched read-only at depth 1 for this. - **`action-group.tsx` / `action-menu.tsx`:** objectui#11638 at the `0abd4f9f8` → `a58626c88` hop (+10/-18 and +11/-18). Anchors move -3 below the deleted `useConfigBagEvaluator()` call and -8 (group) / -7 (menu) from the member forward on. - **`static-params.ts`:** byte-identical from `dd3f7e1be` through `0abd4f9f8`. It gained 7 lines above `readStaticParamValues` at the same hop. - **`basic/data-list.tsx`:** changed once, at `e420df310` → `31971ff1e` (objectui#11168 slice 2 rewrote both list registrations). The repeater moved by +28. That hop's note does not list the file. Every later note recorded its anchors as held or re-read in place. - **`previews/block-config.ts`:** `:307` moved to `:320` at the same hop. - **`data-objectstack/src/index.ts`:** - The `translateFilterArray` arm moved at `db11afd49` (+42), at `e420df310` and at `ab1879721`. - `serializeOrderBy` moved at `e420df310` (+108). - Neither moved at the last hop: the file gained 7 lines at its end. The new correction sentence in section 4b records the three files whose drift went unrecorded. It does not rewrite the older dated notes. ## The quotes (H3 definition from stage 1: one load-bearing anchor per row, its props-read site) - `action:group`: `action-group.tsx:325-374` first line `const paramsPayload: ActionDef = Array.isArray(action.params)`. This is the member forward, where every key a member forwards to the runner is enumerated (`type`, `name`, `label`, `description`, `target`, `openIn`, `endpoint`, `method`, params, `bodyExtra`, `bodyShape`, `operation`, `patch`, `confirmText`, `successMessage`, `outcomeMessages`, `errorMessage`, `refreshAfter`, `locations`, `toast`, `resultDialog`, `onSuccess`, `objectName`). The range keeps the record's own extent: from the params payload to the end of the `execute` call. The line is unique in the file, so a drift is relocated. - `action:menu`: `action-menu.tsx:261-321`, same first line, same role, unique in that file. - `element:repeater`: `data-list.tsx:125-135`, quoting the opening line of the `readProps` call, the same text stage 1 quoted for the definition list at `:42` (in the source, `const props = readProps` followed by the generic's opening bracket and brace). The type literal is the row's key set. As H3 expected, the line is not unique (`:42`, `:125`), so a drift goes red without a relocation hint. - **One quote per row, as the claim says.** Stage 1 described the containers' props-read site as "the actions read plus the member forward". The claim and the dispatch both say one quote per row. I chose the member forward because it is where the member key set is read as a set, as the `forwarded: ActionDef` literal is for `action:button`. It also sits below the `actions` read (`:300` / `:335`), so a shift above either line reds the quote. A quote on the `actions` line would add a content check of one key read only. That is noted, not done. - Each quote spells its path. A path-less continuation inherits the nearest preceding FULL anchor (`inheritedAt` in the gate), which for these rows would be another file. ## Verification (at `afe6f9df`; the patch round `00c6b980` re-ran the card gate, the spec build and tests, and the derived gates green, report `6027887111`) - **The card's gate, three ways.** All exit codes were captured to a file before any pipe. - `OBJECTUI_ROOT=/home/user/objectui … check-objectui-pin-citations.ts --verify-anchors` = exit 0: `13 asserted, 419 objectui anchor(s) still carry no content assertion`. - `pnpm --filter @objectstack/spec check:objectui-pin-citations` beside the objectui checkout = exit 0: `13 anchor content assertion(s) verified against objectui at a58626c88; 500 file:line anchor(s) seen`. The self-test, including its live round-trip, is green. - The same with no objectui checkout (the CI shape) = exit 0: `13 … NOT VERIFIED — no git checkout`. - **Before the floor edit:** the gate was red, exit 1: `You ADDED coverage — set ASSERTED_ANCHOR_FLOOR to 13`. All 13 assertions verified, with no mismatch. - **Ablation, one leg per new quote.** Each leg ran through `node scripts/ablation-replace.mjs` in WRAP mode, with `--verify-anchors` as the wrapped command. Each anchor hit x1. The mutation was proven by a blob change, and the restore by blob == HEAD blob `83976000` with `git diff HEAD` empty. The final porcelain was clean. - Leg A, the group range `:325-374` changed to `:326-374`: exit 1, `That line IS in the file — at :325, not :326. Either the anchor drifted by -1 lines`. - Leg B, the menu quote `action.params` changed to `action.paramz`: exit 1, `That line is NOWHERE in packages/components/src/renderers/action/action-menu.tsx at this pin`. - Leg C, the repeater range `:125-135` changed to `:126-135`: exit 1, `That line appears 2 times in the file (:42, :125)`. - **Build, typecheck and tests**, all under the shared lock: - `pnpm --filter @objectstack/spec build`: VERDICT command-exit 0, and `git status` was clean afterwards. - `pnpm --filter @objectstack/spec typecheck`: VERDICT command-exit 0. `check:scripts-typecheck` compiles the edited script (`--listFilesOnly`: 1 hit). - `pnpm --filter @objectstack/spec exec vitest run --project local --maxWorkers=2`: VERDICT command-exit 0, `Test Files 619 passed (619)`, `Tests 18485 passed | 1 todo`. No test names the edited gate script (`git grep`: 0 hits). Its own `--self-test`, including the live round-trip, runs inside the gate. - **Derived gate families.** `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` was run with no paths at `afe6f9df` and derived 82 commands, the same list as at `10006d5d`. - All 82 were run, with exit codes captured before any pipe. 81 exited 0. `pnpm check:dual-build-cjs-loads` exited 3 (PREREQUISITE NOT MET: about 77 workspace packages unbuilt), so it is NOT MEASURED. - That narrowing is declared. This diff moves no emitted JS: the new docblock text has 0 hits in `packages/spec/dist` JS and 2 in `.d.ts`, against a positive control of 14 JS hits for a `.describe()` string. CI runs the gate. - `--ran` reconciliation: `82 derived, 81 run, 1 NOT-MEASURED, 0 UNRUN`, exit 0. - `check:doc-formula-expressions`, `check:lean-entry-closure`, `check:dts-closure` and `check:exported-any` first refused their prerequisites while a build was in flight. They exited 0 on the final pass, after `pnpm turbo run build` of formula, lint and objectql (14 tasks, VERDICT command-exit 0) and the spec rebuild. - The `check:pm-dispatch-gates` battery (exit 0, `1976 cases pass`) ran at `10006d5d`. The later commit changes six comment lines in the two spec files and nothing the battery reads. - **Lint, as a proven narrowing.** `pnpm lint` (`eslint . --no-inline-config`) is CI's run. Here: - Population: the two touched TypeScript files. - Count: `npx eslint --no-inline-config --format json` on them reads 2 files, 0 errors, 0 warnings, neither ignored. - Invariance: `eslint.config.mjs` never enables type-aware linting (no `parserOptions.project`, stated at its lines 326-328), so this diff cannot move the verdict on an untouched file. ## Acceptance notes (noted, not filed) - **The historical `[objectstack-ai#21464]` member docblock** (pin `2e818d0b51ec`) stays dated and unquoted. Its `[objectstack-ai#21855]` paragraph, which called `0abd4f9f8` the current pin, was corrected in place in `00c6b980` (see What changed). - **`data-list.tsx:99-105` is spelled as a full anchor.** It used to be the bare `:82`. A bare continuation there would read as `previews/block-config.ts`. The new full anchor carries no quote, so the worklist count rises from 418 to 419. - **The repeater quote is not unique in its file** (H3, as stage 1's review judged acceptable). - **Stage 1's changeset** (`.changeset/20471-component-row-anchor-quotes.md`, not yet released) says the other three rows "carry no quote yet". This PR adds its own changeset rather than editing that one. --- _Generated by [Claude Code](https://claude.ai/code/session_01GV6oYwgc1kWiUCb1YaprQ7)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Part of #20471
Clause-②: no (docblock text and a gate constant: the accept set and the public type surface are unchanged)
#20471 remains open. This PR quotes the load-bearing anchor of three of the six
ComponentPropsMaprows the card names. The other three rows (action:group,action:menu,element:repeater) cannot take a quote yet: their records cite lines that do not hold at the pin they assert. That has to be re-measured first, which is outside this card's claimed surface. Measurements below.What changed
packages/spec/src/ui/component.zod.ts: three docblock anchors gain a quoted first line, whichcheck:objectui-pin-citationschecks against objectui at the pin (.objectui-sha=a58626c88):action:button:action-button.tsx:215-318first linetype: schema.actionType,, the head of theforwarded: ActionDefliteral.action:icon:action-icon.tsx:160-211first linetype: schema.actionType,, the same literal in that renderer.element:definition-list:data-list.tsx:42-47, quoting its first line, the opening line of thereadPropscall (in the source,const props = readPropsfollowed by the generic's opening bracket and brace).:215-318continuation inherits the nearest preceding FULL anchor, which isstatic-params.ts:91-101for the two action rows andaction-group.tsx:40-42for the definition list, so it would be checked against the wrong file.packages/spec/scripts/check-objectui-pin-citations.ts:ASSERTED_ANCHOR_FLOORgoes from 7 to 10, exactly the three quotes. Its docblock names the three and why the other three rows carry none. It also replaces the stale "145" worklist count with 418, as--verify-anchorsreads it ata58626c88..changeset/20471-component-row-anchor-quotes.md: apatchchangeset for@objectstack/spec. See "Changeset" below.Which anchor is load-bearing, per row
The reading I used: a row's load-bearing anchor is its props-read site, the one place in objectui where the row's key set is read as a set. For the element rows that is the
readPropscall, whose type literal is the key set. For the leaf action rows it is the annotatedforwarded: ActionDefliteral, where the keys handed to the runner are enumerated: 23 ofaction:button's 28 declared keys and 21 ofaction:icon's 25, measured from the built schemas. The rest (icon,variant,size,visible,disabled) are first read above the literal, so a line shift there moves the quoted line too. Per-key lines inside or beside that site are not quoted. Quoting them all would be roughly 60 quotes across six rows, the bulk fill triage excluded. One quote also already goes red on any line shift above it in the same file.a58626c88?action:buttonaction-button.tsx:215-318(runner forward)action:iconaction-icon.tsx:160-211(runner forward)element:definition-listdata-list.tsx:42-47(readProps):125, the repeater'sreadProps): it verifies, and drift still goes red, but the relocation report cannot name the new line (ablation C)action:groupactions:303and member forward:329-382:300and:325-374action:menuactions:342and member forward:264-328:335and:261-321element:repeaterreadProps:97-107:125-135(:97-107is the definition list's registration)Every other anchor in the
action:buttonandaction:iconrecords was re-read too, and all hold except one (next table). The definition list's per-key reads:48,:49,:51-53,:63,:66and:68hold.Finding: the records of three rows (and two lines in two more) do not hold at the pin they assert
The section's asserting citation reads
.objectui-sha=a58626c88. Its history note for that hop says only theobjectNameforward moved inaction-group.tsx/action-menu.tsx, and that it "is cited below at this pin". Measured ata58626c88against the previous pin0abd4f9f8(git diff, per-line reads):a58626c88action:groupactions:303,actionRendersAt:304, ownvisible:290:300,:301,:287(-3)299a2c62action:group:329-382, its static values:329-335,objectName:381:325-374,objectName:373(-8). The static-values read was deleted by objectui#11638, so that parenthetical now describes nothing299a2c62action:groupdisplay:404;label/icon:424/:408;variant:414+:456;size:415+:457;visible:401; hostdisabled:418; registrationinputs:487-528:396;:416/:400;:406+:448;:407+:449;:393;:410;:479-520(all -8)299a2c62action:menuvisible:235+:336;icon:240;variant/size:241/:242:232+:329;:237;:238/:239299a2c62action:menuactions:342; member forward:264-328, its static values:264-270,objectName:327;ActionAutoTrigger:363-370;tags:408:335; forward:261-321,objectName:320, static-values read deleted (objectui#11638);:356-363;:401299a2c62action:menulabel:389+:398-399; hostdisabled:388; registrationinputs:435-463:382+:391-392;:381;:428-456(-7)299a2c62element:repeaterreadProps:97-107, every per-key read (:120,:128,:143-146,:152-:155,:181,:186,:191-192,:194-196) anddata-list.tsx:119-120readPropsat:125-135)0d421041(pin31971ff1e, objectui#11168 slice 2); the record went through 7 pin commits, each of which recordeddata-list.tsxas byte-identical and its anchors as unmovedelement:repeaterdata-objectstack/src/index.ts:4782-4793forserializeOrderBy:4782-4793israwFindWithPopulate's pagination.serializeOrderByis declared at:868and called fromfindat:5031action:buttonreadStaticParamValues,static-params.ts:91-101:98(+7; objectui#11638 rewrote that file)299a2c62element:definition-list:82)", "The registration marks it required":82is a comment. Thecolumnsinput publishes the NUMBERS 1 and 2, anditemsis no longerrequired: objectui#11168 slice 2 aligned the registration with the row. Prose, not a line shift0d421041element:definition-listcolumnscontrol,previews/block-config.ts:307:320Proof that
data-list.tsxmoved at0d421041: its blob is5237dc269(220 lines,RepeaterRendererat:96) atdd3f7e1be,db11afd49ande420df310. It ise54574ef4(262 lines,RepeaterRendererat:124) at31971ff1eanda58626c88. Ate420df310every repeater anchor and the:82claim read exactly as recorded.This is the failure #20471 was filed to prevent, already happened: under a pin label that was current, the read points moved and nothing went red. I left these records untouched. The claim's surface is quotes plus the floor, and the dispatch says a non-holding anchor is reported, not re-pointed. The re-point for
action:group/action:menuis also not purely mechanical: the two "static values" parentheticals describe a read that no longer exists. How to finish the remaining three rows is the open question in the report on #20471.Gates (run at
ba23f992)pnpm --filter @objectstack/spec check:objectui-pin-citationswith objectui readable at the pin: exit 0. The self-test is green including its live round-trip; "10 anchor content assertion(s) verified against objectui at a58626c88; 496 file:line anchor(s) seen".… exec tsx scripts/check-objectui-pin-citations.ts --verify-anchors: exit 0. "10 asserted, 418 objectui anchor(s) still carry no content assertion."--verify-anchors.node scripts/pm/dispatch-gates.mjs --commandsderived 82 commands atba23f992from the merge base.--ranreconciliation: "82 derived, 81 run, 1 NOT-MEASURED, 0 UNRUN", every exit code recorded before any pipe.pnpm check:dual-build-cjs-loads(exit 3, PREREQUISITE NOT MET). It loads every package's built entry, and 87 workspace packages are unbuilt in this worktree. This diff moves no emitted JS (below). CI runs it on a full build.check:doc-formula-expressionsandcheck:lean-entry-closurefirst exited 3 for missing builds. Afterturbo run buildof formula, lint and objectql (14 tasks, exit 0) both exited 0.pnpm --filter @objectstack/spec typecheck: exit 0. Itscheck:scripts-typecheckcompiles the edited script (tsc -p tsconfig.scripts.json --listFilesOnlylists it).pnpm --filter @objectstack/spec exec vitest run --project local: exit 0, 619 files, 18485 tests passed.pnpm --filter @objectstack/spec build: exit 0, tree clean afterwards.Ablation (gate goes red when a quoted line changes)
Each leg ran through
scripts/ablation-replace.mjsin WRAP mode. Each anchor hit exactly once, the mutation was proven on disk by blob change, and the restore was proven by blob == HEAD (5cc2ff27) withgit diff HEADempty. Nodistsits between the gate and the edited file: it readssrcwithreadFileSync.type: schema.actionType,to…actionTypeX,): exit 1. "the asserted first line does not match … That line is NOWHERE in…/action-button.tsxat this pin.":215-318to:216-318, a pin-bump shift): exit 1. "That line IS in the file — at :215, not :216. Either the anchor drifted by -1 lines, or it was wrong when written.":42-47to:43-47): exit 1. "That line appears 2 times in the file (:42, :125), so it cannot locate the read point on its own." Still red, but without the relocation hint.Changeset
patchfor@objectstack/spec, measured.files[]shipssrc/**/*.zod.tsverbatim, and after the build the new text is in 2distdeclaration files and 0 runtime JS files. Positive controls: the row docblock hits 2 declaration files, and a.describe()string hits 14 JS files. So the published bytes move, while the runtime surface does not. Local precedent agrees:15fe567c, a comment-only re-anchor ofsrc/**(0 non-comment lines), shipped apatchchangeset. Noskip-changeset. The script change alone would not publish (scripts/is not infiles[]).Acceptance notes
actionContainerMemberShapeis a HISTORICAL record (.objectui-shapin2e818d0b51ec), so it got no quote. A quote is checked against the CURRENT pin, which would turn a dated record into a current claim.Generated by Claude Code