Repository navigation
docs(changeset): date the two rotted present-tense declaration claims in the kanban pending entries - #9723
Conversation
… in the kanban pending entries Two pending `.changeset/*.md` bodies stated in the present tense what `ObjectKanbanSchema` declares. A pending entry publishes verbatim into the CHANGELOG at the next release, so a later card's merge falsifies a sentence nobody re-reads. `8802-8257-8008-kanban-gantt-family-retirement.md` — «The surviving `ObjectKanbanSchema` face declares none of them» is replaced by a dated per-key reading. It is BOTH defects at once: ROTTED for `columns` (objectui#8913, six hours later) and `cardTitle` (objectui#9606), and BORN FALSE for `titleField` and `allowCollapse`, which that face already declared at `adf581278` when the sentence was written. `7322-object-kanban-component-props.md` — five readings, all ROTTED, are scoped by a dated-reading block naming each falsifying card, and the two census bullets plus the requiredness clause are dated in place. Prose only. Both frontmatters are byte-identical to `origin/main` (sha256 9f8dbee7… and bf9e59f9…), which is check-changeset-overwrite's documented case 2. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
Gates — every exit code captured to a file BEFORE any pipeRun twice, from the worktree, each as
Beyond the nine gates, a second control-byte scan was run directly over the two edited
🤖 Generated with Claude Code https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L Generated by Claude Code |
…present-tense Re-anchors this branch's readings on the current main after objectui#9719 and objectui#9720 merged. Every measurement in the PR body was re-taken against 95f7e4c and is unchanged. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
|
ACCEPT — card objectui#9713, reviewed by the ⛔ Nothing below is taken from the PR body. Two files, both pending changesets, prose only. ① Frontmatter byte-identical — the precondition for 「prose only」
(md5 of the frontmatter block on each side.) ⇒ no package's release moves; ② The BORN FALSE half — verified AT THE WRITE-TIME REF, which is the only place it can beThis is the claim that matters, because ⭐ born-false can only be established at the ref where the sentence was written — measuring today proves nothing about it. Read at ⇒ on the day that entry was written, the surviving ⭐ And the PR gets the subtlety right, which is easy to miss: those two keys are named in the sentence's refused-by-name clause, and that clause is true of the surviving face — it does not refuse them. What was false is 「declares none of them」. One sentence, one clause true and one false, and the repair says so instead of averaging them. ③ The ROTTED half, and every row of both tables checked against an enumerated list⛔ Not spot-checked per key. The declared property list of
Against it, every row of both tables holds:
④ ⭐ The deepest thing in this PR, and it is not in the cardThe
⇒ the implementer declined to re-measure into the present tense at all. ⭐ That is the general lesson the card was groping for and did not have: for a file that publishes verbatim at an unknown future date, a fresh measurement written in the present tense is not a fix — it is the same defect with a newer number. The only durable repair is a dated reading, or no figure. It also found five rotted readings in ⑤ Scope, collisions, gates
Implemented-by: VERDICT: ACCEPT. Turning ready and enqueueing; card objectui#9713 closes on merge. Generated by Claude Code |
… date the pending defaultSort claims this retirement falsifies Review rework for objectui#5861. - The three doc tombstones stop naming a spec version (doc-version-claims ratchet): they state that the installed protocol refuses the key by name. - Five pending changesets that will publish in the same release describe the legacy key as honoured (objectui#4869, #6235, #8973, the #4082 grid filter-lowering entry, #5293). Each falsified sentence is put in the past tense for its own change and gains a dated note naming objectui#5861, the form PRs #9139 / #9723 / #9734 used. The retirement changeset names all five. - ObjectView's objectui#5270 comment no longer quotes the retired defaultSort readers in the present tense. Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN Co-authored-by: Claude <noreply@anthropic.com>
…bject-grid defaultSort (ADR-0049) (objectstack-ai#10533) Fixes objectstack-ai#5861 Clause-②: yes — this removes the last runtime reads and the declared docs of a key the installed `@objectstack/spec` 17.4.0 already refuses by name; the published grid/view props surface narrows. ## What this does ADR-0049 enforce-or-remove, remove arm, for `object-grid`'s `defaultSort` and `object-view`'s `table.defaultSort` — the "C half" of the maintainer's 2026-08-22 ruling on objectui#4869 (「接受所有」), restart condition measured by triage comment 5808485875. Every reader is removed in one change, so no path honours the key while another ignores it: | Reader | Before | After | | --- | --- | --- | | `ObjectGrid` fetch path | third arm `else if (schema.defaultSort)` lowered it to `$orderby` | chain reads `sort` only | | `ObjectGrid` header arrows | `parseSchemaSort(schemaSort ?? [schema.defaultSort])` | `parseSchemaSort(schemaSort)` | | `ObjectView` non-grid fetch | fourth branch lowered `table.defaultSort` into the sink | chain ends at `table.sort` | | `ObjectView` grid forwarding | `defaultSort: schema.table?.defaultSort` | not forwarded | | `ObjectView` delegated `renderListView` | `mergedSort` wrapped `table.defaultSort` into an array | chain ends at `table.sort` | | `plugin-grid` registration | `sort` input described `defaultSort` as its fallback | description says it is retired | ## H1 — the TypeScript declaration goes too, as a tombstone (decided and measured) `ObjectGridSchema.defaultSort` becomes `defaultSort?: never` and the zod mirror member becomes `retirementTombstone(...)`, in lockstep. Not a deletion: `ObjectGridSchema` extends `BaseSchema`, whose `[key: string]: any` absorbs an undeclared key as `any`, and the mirror's `.passthrough()` keeps it unexamined, so deleting would let the retired spelling type-check and parse green and do nothing. This is the package's existing convention (`ObjectViewSchema.viewTabBar`, objectui#7779). Measured on the rebuilt `dist`: a downstream `ObjectGridSchema` literal carrying `defaultSort` fails `tsc` in `plugin-view` with TS2322 (reverse check below). Only the `defaultSort` regions of `objectql.ts` / `objectql.zod.ts` were touched; `ObjectGridSlotKey` keeps listing the key because the member is still declared. ## H2 — no live producer (measured, with lit controls) - Installed spec 17.4.0: `ObjectGridPropsSchema.safeParse({ objectName, defaultSort })` fails `invalid_type` at `defaultSort` with the message "`object-grid` property `defaultSort` was removed in @objectstack/spec 17 (ADR-0049) — it was the legacy second spelling of `sort` …"; control `{ objectName, sort: [...] }` parses green. - No non-test source outside the edited files reads the key (`git grep defaultSort -- packages/` — the remaining hits are `plugin-detail`'s own `RelatedList` `defaultSort` prop, a different carrier fed from `schema.sort`, plus CHANGELOGs). `normalize-list-view` never mentions it. - Authored occurrences — objectui: `examples/` 0 files, `e2e/` 0, `apps/` 1 (the registry parity test's comments, not authoring), `content/` 2 (the two pages tombstoned here). objectstack `origin/main`: `examples/` 0, `apps/` 0, `packages/qa/` 0. Lit control, identical method, `searchableFields`: objectui `examples/` 4 files, `content/` 5; objectstack `examples/` 2, `packages/qa/` 1. -⚠️ One authored occurrence the earlier reads did not flag: the `ObjectGridSchema` JSON example in `content/docs/api/schema-reference.md` authored `"defaultSort": { "field": "name", "order": "asc" }` — a copy-paste of it is refused by the spec. It now authors `"sort": [{ "field": "name", "order": "asc" }]`. ## H3 — pins, red on the base and green on the head The flipped cells were rewritten, not deleted: each now asserts the key is inert on its path, beside a canonical `sort` control on the same path in the same run. Red leg: the five source files were put back to the base `59636b3a6` under the committed tests, with a trap restore (blob hashes re-checked against HEAD afterwards, `git diff HEAD` empty): **19 failed | 97 passed (116)**, 8 of 9 files red. The only all-green file is `gridRetiredStringSort-8767.test.tsx`, whose cell was only re-commented. Green leg on the head: **116 passed (116)**, 9 files. Flipped or new, each red on base: - `plugin-view` `ObjectView.canonicalTableKeys.test.tsx` — grid path: `no longer forwards a retired table.defaultSort — and does not rescue it into sort`; `puts the canonical value in the canonical slot…` (legacy slot now undefined); `keeps the named view sort in force, and a retired table.defaultSort beside it is not forwarded`. Non-grid: `a retired table.defaultSort alone orders NOTHING`. Delegated: `hands over NO sort for a retired table.defaultSort alone`. - `plugin-view` `ObjectView.sortSink.test.tsx` — `sends no $orderby at all…`, `a descending legacy default is inert too…`, and the tail of `keeps the sink STRICT…` (the sink-strictness half is unchanged). - `plugin-view` `ObjectView.filterSources.test.tsx` — the three objectui#6235 wrap cells, flipped. - `plugin-view` `ObjectView.namedViewSortArity.test.tsx` — through the REAL `ObjectGrid`: `a retired table.defaultSort sorts NOTHING on the real grid path — no $orderby, no arrow`, plus a new canonical `table.sort` control cell. - `plugin-grid` `gridArrayArmOrderby-8973.test.tsx` — the legacy-arm section, flipped (fully-specified, and `order` omitted, now send no `$orderby`). - `plugin-grid` `gridDefaultFiltersLowering.test.tsx` — `a retired defaultSort reaches neither $orderby nor $filter`. - `plugin-grid` `serverSorting.test.tsx` — new: `a retired defaultSort lights NO arrow and sends NO $orderby`, with a sortable-chrome non-vacuity check. - `types` `object-grid-default-sort-tombstone-5861.test.ts` — new: refused by name (`invalid_type` at `defaultSort`), lit control (unknown key green), remedy text, describe equals message, canonical `sort` green, upstream re-derivation from the installed pin, and the `@ts-expect-error` on the `?: never` twin (compiled by `tsconfig.test.json`; `--listFiles` includes the file). Canonical `sort` is asserted on all three `ObjectView` paths and on bare `ObjectGrid` in the same runs. ## Review rework (head `28b1a4d32`) The contract review at `f40819d61` (comment 5828759786) returned FAIL on two items and one nit. All three are addressed in `28b1a4d32`: 1. **Required `Test` was red** on `scripts/__tests__/doc-version-claims.test.ts` ("records every version literal on the scanned surfaces"). The doc tombstones had added unregistered `@objectstack/spec` version literals in `plugin-view.mdx` and `plugin-view/README.md`, plus a third in `schema-reference.md` split across a line break, which the gate cannot see. The gate's preferred remedy is applied to all three: the literal is deleted, and each page now says the installed protocol refuses the key by name. No `KNOWN_CLAIMS` entry is added. Reproduced red locally first (`Tests 1 failed | 28 passed (29)`, naming both visible sites), then green (`29 passed (29)`). No line this PR adds under `content/` or `packages/plugin-view/README.md` carries a version-shaped token. 2. **Pending changesets that would publish "keeps working" beside "no longer read".** Following the precedent of PRs objectstack-ai#9139, objectstack-ai#9723 and objectstack-ai#9734, the falsified sentence in each is put in the past tense for its own change ("at this change …"), and each now names objectui#5861: four carry a dated note, and `5293` carries an inline citation in objectstack-ai#9139's form: - `objectview-sort-sink-4869.md`: "both spellings of the pair keep working", and the `table.defaultSort` sink chain; - `6235-mergedsort-wrap.md`: the delegated-slot wrap; - `8973-grid-orderby-normalize.md`: the legacy arm "is fixed with it"; - `grid-default-filters-lowering-4082.md`: the legacy leg "needs no change"; - `5293-view-sort-order-spelling.md`: `ObjectGridSchema.defaultSort` cited as a live `order` spelling. A re-grep of the pending set finds three more `defaultSort` mentions, all still true and left alone. `7122` says the spec made the key a D2 tombstone. `8767` quotes the spec's retirement text. `6697` concerns `RelatedList`'s own `defaultSortKey`, a different carrier. The retirement changeset's "supersedes" paragraph now names all five entries. 3. **Nit.** The objectui#5270 comment block in `ObjectView.tsx` no longer quotes the retired `defaultSort` header and fetch readers in the present tense. The branch was not merged with `main`. There was no conflict and CI did not need it; the review reads `behind`, not `dirty`. ## Gates (code commit `43ab1fd43`; rework head `28b1a4d32`; full-suite runs at `f40819d61`, and `plugin-view` re-run at `28b1a4d32`) - Build closure: `turbo run build --filter='@object-ui/plugin-view^...' --concurrency=2`: 15 successful, 15 total; rebuilt `packages/types/dist/objectql.d.ts` carries `defaultSort?: never`. - `pnpm --filter @object-ui/types type-check` exit 0 (script echoed `@object-ui/types@17.6.0 type-check`); `@object-ui/plugin-grid` exit 0; `@object-ui/plugin-view` exit 0. - Reverse type check through the rebuilt `.d.ts`: injecting `defaultSort: { field: "name", order: "asc" }` into `ObjectView`'s `gridSchema` literal makes `plugin-view` `tsc --noEmit` fail with `TS2322 … Types of property 'defaultSort' are incompatible … not assignable to type 'undefined'`; restored, blob equals HEAD. (A first attempt was a no-op: `ablation-replace` refused because the replacement contained its own anchor. It changed nothing and ran nothing.) - Root-form vitest: `packages/types/` 233 files, 5166 tests passed; `packages/plugin-grid/` 156 files, 1487 tests passed; `packages/plugin-view/` 48 files, 444 tests passed (re-run at `28b1a4d32` together with `doc-version-claims`: 49 files, 473 tests passed; `plugin-view` type-check exit 0 again, closure build 15/15 cached); `apps/console/src/__tests__/registry-inputs-spec-parity.test.ts` (it reads the `plugin-grid` registration inputs) 199 tests passed. - `node scripts/check-changeset-presence.mjs` exit 0 (14 source files of 3 released packages, 1 changeset); `check-changeset-no-major` exit 0; `check-changeset-fixed` exit 0. - `check:new-line-citations`: `VERDICT new-cross-file-line-citations: 0 new citation(s)`; `check:control-bytes` OK. - Doc gates: `check-doc-links` exit 0; `check:doc-types` exit 0; `check:doc-fences` exit 0; `check:doc-example-ids` exit 0; `check-prompt-component-keys` exit 0; `check-doc-expression-carriage` exit 0 (report-only; its one `schema-reference.md` site, `action.condition`, predates this branch); `check-changeset-claims` exit 0 (report-only); `check:pending-changeset-literals` exit 0. - eslint, narrowed to the 14 changed `.ts`/`.tsx` files: 14 files in the JSON report, 0 errors. Per-file warnings are equal to the base except three test files (+1, +1, +2 `no-explicit-any` from `as any` fixtures, matching those files' existing style). `eslint.config.js` has no type-aware linting (`parserOptions.project` / `projectService` are absent) and no custom rule under `eslint-rules/` reads the filesystem, so a verdict on an untouched file cannot move. - Governed surface: `check-governed-queue-guard --test` over all 18 paths says NOT GOVERNED. ## Registries and docs - Touched: `@object-ui/types` (`ObjectGridSchema` member and its zod mirror), the `plugin-grid` registration (`sort` description and docblock), `content/docs/plugins/plugin-view.mdx`, `content/docs/api/schema-reference.md`, `packages/plugin-view/README.md`, and a changeset (`minor` on types / plugin-grid / plugin-view, never `major`). - Not touched, on purpose: the console registry parity ledger `apps/console/src/__tests__/registry-inputs-spec-parity.test.ts`. Its `object-grid.defaultSort` carve-out entry was already harvested when spec 17.3.0 tombstoned the key; it keeps only a comment. `docs/adr/**` is not needed, because no ADR lists the key. - `schema-reference.md`: the `CRUDSchema` `defaultSort` / `defaultSortOrder` sentence is untouched. Only the adjoining `ObjectGridSchema` sentence ("that key is unaffected"), which this change makes false, was rewritten. ## Acceptance notes - File surface beyond the claim, with reasons. `packages/plugin-view/README.md` described the key as a working alias, and it ships in the package's `files[]`; this change makes it false, so it is repaired here. Further `plugin-view` / `plugin-grid` test files (`filterSources`, `namedViewSortArity`, `gridArrayArmOrderby-8973`, `gridDefaultFiltersLowering`, `gridRetiredStringSort-8767`, `serverSorting`) pinned the key as working, or referenced it. They sit next to the landing points. - `ObjectGrid.tsx`'s page-size region (draft objectui#10278) is untouched. The two edits sit in the sort `if` chain and the `declaredSort` expression; the fetch effect's dependency list is unchanged. - Five pending changesets described how the retired key used to be honoured. They ship in the same release: objectui#4869, objectstack-ai#6235, objectstack-ai#8973, the objectstack-ai#4082 grid filter-lowering entry, and objectstack-ai#5293. Four now carry a dated note naming objectui#5861, and `5293` an inline citation (see Review rework above). - Line-address citations in `plugin-view.mdx` paragraphs this change touched were rewritten to cite by content (AGENTS.md objectstack-ai#11). The `data.ts:63` citation in the rewritten `gridDefaultFiltersLowering` cell was dropped. - A document that still carries `defaultSort` renders unsorted. It is not re-routed into `sort`: that would be the tolerant alias this retirement removes. --- _Generated by [Claude Code](https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
Fixes #9713
Clause-②: no — no declaration, accept set or requiredness moves. Prose only, in two
pending
.changeset/*.mdbodies; both frontmatters are byte-identical.What was false, and which defect each site is
⭐ The card's own distinction, applied to every site before it was touched.
.changeset/8802-8257-8008-kanban-gantt-family-retirement.md— BOTH defects in one sentenceThe sentence «The surviving
ObjectKanbanSchemaface declares none of them» was writtenat
adf581278(2026-09-10T09:59:59Z, PR objectui#8865). The keys "them" refers to are thetwelve named in the two clauses just above it, plus a lane's
cards.ObjectKanbanSchemaatadf581278origin/mainbbba09840columns8693b8569, 2026-09-10T16:32Z), six and a half hours latercardTitle78a9c6744, 2026-09-17T18:36Z)titleFieldz.string().optional())allowCollapsez.boolean().optional(), live)retirementTombstone()swimlaneField,grouping,navigation,cardTemplates,columnWidths,draggable,onColumnAdd,onCardAdd,cards⇒ ⭐ The card recorded this site as rot. It is rot AND birth defect at once, and the
two halves need opposite repairs, so the repair states both rather than picking one.
titleFieldandallowCollapseappear in the sentence's refused-by-name clause — thatclause is true, the surviving face does not refuse them — but it declares both, which is
what «declares none of them» denied, on the day it was written.
Ordering is proved, not inferred:
git merge-base --is-ancestor adf581278 8693b8569and… adf581278 78a9c674both exit 0. An exit 0 is self-certifying on a shallow checkout(it names a real ancestry path); the repository was deepened to 2072 commits first and the
two write commits were re-read from that history.
.changeset/7322-object-kanban-component-props.md— five readings, all ROTTEDWritten at
6ca6e12a7(2026-09-06T21:13Z, PR objectui#8153).git merge-base --is-ancestor 6ca6e12a7 Xexits 0 for every one of the five falsifying commits.6ca6e12a7bbba09840KanbanSchemais a declared node typeKanbanSchemais gone; the prop is one arm againadf581278)objectNameREQUIREDz.string()z.string().optional()786bc91ea)groupByREQUIREDz.string()z.string().optional()a4b723fab)filterdeclared by NEITHER faceObjectKanbanSchemaee4d19f6c)columns,cardTitle—KanbanSchemaonlyObjectKanbanSchema⛔ Not touched, and the reason is measured rather than assumed: line 47's «
cardTitle(already declared; the casts were redundant)» is a past-tense statement about the
retired arm and is still correct — the card warned that the two look alike and only one
moves.
titleField—ObjectKanbanSchemaonly, andnavigationdeclared on neither face,both still read true and are left alone.
The repair shape, and why it is not an overwrite
Per the card's fix order: the construction that permits the error is the undated
present-tense sentence about another file's current state. Both repairs delete that
construction rather than re-running it — every restated reading carries the date it was
taken and the card that moved it, so it can be re-derived from its own words and cannot
rot a second time. No gate was added; none is proposed here.
⚙ Anchors, re-taken — the readings above are ref-stable across three heads of
mainorigin/mainmoved three times while this was being measured:4cf57b6da→95f7e4c3d(objectui#9719, objectui#9720) →bbba09840(objectui#9712). The third movelanded between this seat's
git fetchand itsgit merge origin/main—refs/remotes/*is shared across worktrees, so a sibling's fetch advances it under you. The merge was
taken, is clean and additive, and left both edited entries untouched
(
git diff eae77bd91 HEAD --the two paths is empty).Every reading in the tables above was then re-taken on
95f7e4c3d, onbbba09840and onthis branch's own head, with the same script each time. All four readings are identical:
columns/cardTitle/titleField/filterdeclared,allowCollapsearetirementTombstone(),objectNameandgroupByoptional, andKanbanSchemaat 0export definitions against a lit control of 3 for
ObjectKanbanSchemaon the sameinstrument, same corpus, same rev. ⭐ A ref that is two merges stale would be exactly the
defect this card exists to repair, so the anchor is named rather than assumed.
8802-…namespackages/types/src/complex.tsandcontent/docs/plugins/plugin-kanban.mdx,which the in-flight draft PR objectui#9721 edits; that PR's own claim-re-read gate comment
reports the overlap. Measured against objectui#9721's live diff: it changes
describetext, the
allowCollapsetombstone message and theKanbanColumn.collapseddoc comment,and it adds and removes no member on either
ObjectKanbanSchemaface. So no sentencethis PR repairs depends on it. ⭐ A sentence that is true today and would be falsified only
once objectui#9721 lands is a third state — not yet false — and belongs to that PR, not
to this one. None was found in the two entries here, and the search was specific: the
only lane-collapse claim anywhere in either entry is
allowCollapse, which objectui#9721keeps as a
retirementTombstone()and only re-words the refusal message of — so theBORN FALSE row above stays true after that PR lands, in the window between the two merges
as well as after. The check is recorded because the absence is the result, not a skipped
step.
⛔ objectui#9721 is in the merge queue as this is written. File-level disjointness was
re-taken against its live file list, not against any table handed to this seat: it touches
.changeset/9628-kanban-column-collapsed-honoured.mdand.changeset/8801-object-kanban-allow-collapse-retired.md, neither of which is edited here.All thirteen other open pull requests were enumerated and their
.changeset/files read offtheir own file lists; none names either entry this PR edits.
Measurement — instruments, corpus, controls
stripped and every whitespace run collapsed to a single space before matching, because
changeset prose wraps near eighty columns and a line-anchored matcher is blind to a
sentence that wraps. POSIX ERE has no
\s, so nogrep -Ewas used for prose at all.Instrument P — the derived list. DOMAIN: 15628 sentences across all 1639 pending
entries. PREDICATE: the sentence names a schema symbol AND carries a present-tense
declaration verb (
declares/declare/is|are declared). ⛔ Bare pastdeclaredisexcluded — a past-tense sentence is historical and cannot rot, which is the
7322:47distinction above. Reading: 199 sentences across 169 entries. Controls, same instrument
and same corpus: lit — 502 entries match the present-tense verb at all; dark — 0 entries
contain a nonsense token.
Instrument V — mechanical polarity check. DOMAIN: instrument P's sentences. PREDICATE:
for each (schema S with a member set built from
packages/types/src, backticked key K) inone sentence, is K a member of S? Controls: lit —
ObjectKanbanSchemahascolumns(true);dark — it has
zzqq(false). Reading: 154 candidate contradictions across 53 entries.⛔ V's 53 are candidates, not verdicts, and saying so is part of the reading. Spot⚠️ V also misses the
review shows a high false-positive rate: the sentence window pairs a schema and a key that
are not predicated of each other, and keys declared by
@objectstack/specrather than bythis repo read as absent.
8802-…site entirely — that sentence'sobject is the pronoun «them», resolved across a sentence boundary, and no regex reaches it.
⇒ two zeros are never read as an absence here; both entries repaired in this PR were
reached by reading the files.
Declared narrowing. What is repaired here is the sub-class the card names and this seat
verified by hand — present-tense claims about what the kanban family declares. The 53-entry
candidate list is reported to the dispatching seat rather than swept in this PR: each one
needs the ROTTED / BORN-FALSE adjudication that must precede any touch, and that is per-site
work, not a batch edit.
Frontmatter, proved on both refs
origin/main8802-8257-8008-kanban-gantt-family-retirement.md9f8dbee7965ce7e2554d3485936677648d200e0ba569000bbbd19594a0951f537322-object-kanban-component-props.mdbf9e59f968146504cb73c7508541747c555a82ca18f046bd3aa3f5138bc59380check-changeset-overwrite's documented case 2: a pre-existing entry modified for proseonly, every declared package name kept.
Gates
All nine green, re-run on the merged head
ed2ab5078; each exit code captured to a filebefore any pipe, each printed verdict line quoted in the gate comment on this thread.
🤖 Generated with Claude Code
https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
Generated by Claude Code