Repository navigation
fix(scripts): the objectui changeset digest reads a (breaking …) parenthetical inside a bold lead label - #23131
Merged
objectstack-fleet[bot] merged 1 commit intoOct 13, 2026
Conversation
…tical inside a bold lead label A line that opens, after an optional bullet, with a bold span holding a parenthetical whose first word is "breaking" now reads as an author's breaking annotation (`BREAKING_LEAD_LABEL`, beside the unchanged block opener). The span must be the line's first token and close on that line; a `(breaking ...)` anywhere else stays prose. `markBreaking` keeps stamping such an entry: the label names a package or topic, not the class. Claude-Session: https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Oct 13, 2026
objectstack-fleet
Bot
deleted the
claude/issue-23118-digest-lead-label-breaking
branch
October 13, 2026 03:23
This was referenced Oct 13, 2026
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 free
to 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 #23118
Clause-②: no
What changed
One file,
scripts/objectui-changeset-digest.mjs:BREAKING_LEAD_LABEL, a new rule besideBREAKING_BLOCK_OPENER, which stays byte-identical. A line reads breaking when all three hold:**, after optional indentation and an optional bullet (-,*,+), so the label is the line's first token;(sits inside that first bold span: nothing before it closes the span, and the span closes on the same line;breakingis the parenthetical's first word, in any case.hasBreakingAnnotationtests the new rule on every line, not only at a block start. A bullet opens a line without opening a block:- **Strict authoring face.** …followed by- **Tolerant face (breaking for invalid documents).** …is a real objectui shape.markBreaking/OPENS_WITH_BREAKING_LABEL: unchanged, by measurement. See Assumption 3 below.#23118: a bold LEAD LABEL holding a (breaking …) parenthetical, with 16 cases and a floor of 16. The roster floor goes from 17 to 18.The rule follows triage's grade on the card: a bold span opening the line, holding a parenthetical whose first word is
breaking. A(breaking …)anywhere else is prose, and so is a bold span that is not the line's first token. The line-start opener rule from PR #23117 is unchanged.Corpus reading
Tree: a blobless bare clone of
objectstack-ai/objectui, with every head (1143 refs) and every pull-request head (7169 refs); objectuimainat45ae6b89e845. Every blob ever written under.changeset/*.md(README excluded) was read from each distinct.changesettree object and fetched in full: 6449 blobs over 4825 paths. The heads-only subset is 5683 blobs; the earlier reading on the decoration card had 5678 atmain5595aabca30b. Each body was parsed with the digest's ownparseChangesetand judged withhasBreakingAnnotation: the base atf931e765b(blobafaae0663b1a) against this branch.Assumption 1 (reproduced on current
main): atf931e765b,hasBreakingAnnotation(parseChangeset(text).body)returnsfalsefor objectui8a55f0ccd's.changeset/12059-sidebar-no-reorder.md(blob873e53f906). The positive control, objectui#12242's changeset at1fb1ced36243, returnstrue.Assumption 2, the split of the
(blobs by position. On the heads corpus, "breaking" right after(occurs in 39 blobs / 23 paths. That matches the earlier reading's 39 / 23 exactly, so it is the same set.The 6 prose blobs are four shapes, and the rule leaves each of them unflagged:
**Behaviour change on the console record page** (breaking in the objectui sense,(5896-feeditem-single-constructor.md, 2 blobs);Narrowed (breaking for an author who wrote them, …(11168-element-family-inputs.md,11168-action-family-published-inputs.md, 1 blob each);`@object-ui/i18n` (BREAKING; `minor` under this repository's release model …):(11674-shortcuts-dialog-wired-only.md, 1 blob);This narrows the accepted documents (breaking for a document of either shape).(11717-dashboard-widget-chart-measure-arity.md, 1 blob).Two blobs of
6152-unmirrored-round4.mdcarry both a lead label and a wrapped prose line that opens with(breaking for invalid documents).. They flip because of the label. The prose line on its own does not read breaking: self-test case 4 pins that line.Flips (blobs whose verdict moves from not-breaking to breaking):
main.**`@object-ui/layout` (breaking, declared `minor` per the version policy).**,**Narrowed (breaking).**,**Retired (breaking), `@object-ui/types`.**,**Accept-set change (breaking semantics, released as minor by the version-alignment rule):**.__, a heading mark, an ordered-list mark or a pictograph; a lead-label span that crosses a line; a bold span holding(breakingthat is not the line's first token. Each has 0 occurrences.Assumption 3 (
markBreaking), measured on the 39 flipped blobs: none of them opens its summary (the first paragraph) with the lead label. So the**BREAKING** —stamp lands on an ordinary summary in every real case. No rendered artifact below has a stamp followed by another bold label.OPENS_WITH_BREAKING_LABELtherefore stays as it is, and it is not widened for the hypothetical case either. A lead label names a package or a topic, not the class, so it is not one of the "breaking labels" the renderer keeps verbatim. The count note says "Each is marked BREAKING in the list above", and that is only true if such an entry is stamped. The self-test pins the decision (cases 10 and 14).Real hops: the count line before and after
The digest ran over the last 11 console pin hops,
0abd4f9f8769→ … →1fb1ced36243, plus the prospective next hop1fb1ced36243..45ae6b89e845, with the base and with this branch atb7b8bf6d7.7578323a544e..1fb1ced36243, is byte-identical:→ 10 releasing changeset(s), 2 breaking (0 declared major, 2 annotated), …before and after. No entry changes, because no lead-label changeset falls in this range. The prospective next hop is also byte-identical (1 breaking).47b1f0bb7174..20c6d351ad74, before:After:
The 4 entries now marked are objectui
8a55f0ccd(12059-sidebar-no-reorder.md, the card's example; its line now reads- **minor** — **BREAKING** — The console sidebar no longer lets a user drag …),c7b30bd66(12063-unified-view-config-chart-retired.md),025341692(6152-list-view-legacy-chart-retired.md) and3fd862510(6152-list-view-readers-retired.md).a58626c88dc8..f0268ad78485:173 releasing …, 4 breaking→173 releasing …, 10 breaking. The 6 entries now marked are5d77c099b(6152-list-view-options-bag.md),cf62edf68(6152-list-view-blocks-strict.md),b13ea3c67(6152-grid-default-filters-gantt-map-filter.md),1473757bf(6152-object-calendar-container-strict.md),d7e9e9ab6(6152-grid-kanban-calendar-17-7-members.md) andd73d98770(6152-resizable-columns-retired.md).scripts/bump-objectui.sh,.objectui-shaand every.changeset/file are untouched.Self-test cases (battery
#23118, 16)Direct, against the criterion and the renderer:
**`@object-ui/layout` (breaking, declared `minor` per the version policy).**, in 12059's own paragraphs, with a guard that the fixture really carries the label.- **Tolerant face (breaking for invalid documents).**).**Narrowed (breaking).**), a label with text after the parenthetical (**Narrowed (breaking), …**), and the word in upper case all read breaking.(breaking …)outside a lead label does not: the 11717 mid-sentence line, and the round-4 wrapped line that opens with the parenthetical.**`@object-ui/app-shell`.**,- **Strict authoring face.**).See **… (breaking).** below.,**Removed.** **… (breaking).**).breakingmust be the parenthetical's first word:(non-breaking)and(not breaking …)do not read breaking.markBreakingstamps a summary that opens with a lead label.**BREAKING (v17)**is still kept verbatim.Through
buildDigest, in a fixture repo of its own:⚠️ 3 of these carry a breaking change: 3 by the author's own breaking annotation.Every shape-1 pin of PR #23117 holds: the
#23112battery (16 cases) and the#6099battery (17) are unchanged and green.Ablation
Both legs ran from the committed
b7b8bf6d7throughscripts/ablation-replace.mjsin wrap mode. In each leg the anchor went 1 → 0 and the replacement 0 → 1. After each leg the tool confirmed that the blob equals HEAD (2e67cb6c2848) and thatgit diff HEADis empty. This is a root script run from source, so no build ordist/is involved.#23118cases go red, all of them positives (1, 2, 3, 11, 12, 13, 14, 16). The 7 negatives and the renderer pin stay green, and no other battery moves. Self-test exit 1. The corpus census over the mutated module shows 0 flips.(breakinganywhere: 7 cases go red: negatives 4, 6, 7 and 9, and digest cases 11, 12 and 15. The census shows 45 blobs / 23 paths flipping, and 6 blobs / 5 paths flip outside a lead label. So the corpus check can fail.Gates (at
b7b8bf6d7)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon the actual change set derives 30 commands, identical to the dispatch's 30. All 30 exit 0.pnpm check:pm-dispatch-gatesran detached:✓ dispatch-gates self-test (fast tier): 1833 cases pass, exit 0.--ranreports30 derived, 30 run, 0 NOT-MEASURED, 0 UNRUN.pnpm check:objectui-changeset: the digest self-test, 163 checks,all checks passed, followed byobjectui-range --self-test(which importsclassifyRange), also passed.pnpm check:objectui-bump:bump-objectui self-test PASSED — 20 assertions across 5 cases.pnpm check:changeset-gate-self-tests: check-empty-changeset 170 assertions, check-adr-0087-registration 548, check-changeset-no-major 401.eslint.config.mjs: the**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}object coversscripts/*.mjs.--format jsonreports 1 file, 0 errors, 0 warnings.parserOptionsin the config carries onlyecmaVersion/sourceType, so no type-aware linting is enabled and this diff cannot move the verdict on any file it does not touch.pnpm lintrun is CI's.scripts/ships in no package'sfiles[], so this PR takesskip-changeset.Acceptance notes
maincarry the old rule's under-count, and they will publish into@objectstack/console's CHANGELOG at the next release:.changeset/console-20c6d351ad74.mdline 43 reads⚠️ 6 of these carry a breaking change. The fixed digest reads 10, and 4 entries there are unmarked..changeset/console-f0268ad78485.mdline 111 reads⚠️ 4 of these carry a breaking change. The fixed digest reads 10, and 6 entries there are unmarked.Generated by Claude Code