Repository navigation
fix(scripts): the objectui changeset digest reads a BREAKING annotation behind a warning sign - #23117
Merged
objectstack-fleet[bot] merged 2 commits intoOct 13, 2026
Conversation
… a pictograph objectui's changeset authors decorate the annotation with a warning sign (`##⚠️ BREAKING, priced as minor ...`), and the block-opener rule admitted nothing between the heading or bullet mark and the word, so the digest counted such an entry as not breaking. A decoration is now admitted: a run of pictographic symbols, each with its optional variation selector, on either side of the emphasis mark. The rule stays anchored at the line start and admits no letter, digit or ASCII punctuation. The summary-label test that keeps an author's own label from being restated admits the same decoration, so a summary opening with `⚠️ **BREAKING (...)**` renders verbatim rather than behind a second marker. Claude-Session: https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx Co-authored-by: Claude <noreply@anthropic.com>
… shapes The before-the-emphasis case now uses objectui's own wrapped label, whose run crosses a line, so the emphasis-label scan cannot answer it and only the block opener can. The verbatim-label case asserts the entry is flagged before it reads the rendered line, and the variation-selector cases spell the code points as escapes. 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-23112-digest-breaking-decoration
branch
October 13, 2026 00:59
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 #23112
Clause-②: no
What changed
One file,
scripts/objectui-changeset-digest.mjs:BREAKING_BLOCK_OPENERnow admits a decoration between the heading or bullet mark and the word. A decoration is a run of pictographic symbols (UnicodeExtended_Pictographic), each with an optional variation selector (U+FE0E / U+FE0F). It can sit on either side of the emphasis mark:## ⚠️ BREAKING,⚠️ **BREAKING,**⚠️ Breaking. The rule is still anchored at the line start. It admits no letter, no digit and no ASCII punctuation, so it is not a "contains BREAKING anywhere" match. On a line with no pictograph, the new fragment can only match the empty string, so the rule behaves exactly as it did before.OPENS_WITH_BREAKING_LABELadmits the same decoration. This is the testmarkBreakinguses so that an author's own label is not stamped a second time. Without this change, the opener fix would make the digest print a doubled marker; details under Bounded in-place fix below.#23112: a DECORATED annotation — a pictograph before the word, with 16 cases and a floor of 16. The roster floor goes from 16 to 17.Corpus reading: which decorations occur, and does the rule raise a false positive
Tree: a blobless clone of
objectstack-ai/objectuicovering every head (4121 refs,mainat5595aabca30b). Every blob ever written under.changeset/*.md(README excluded) was then fetched in full: 5678 blobs over 4810 paths. Each body was parsed with the digest's ownparseChangesetand walked withhasBreakingAnnotation's own block-start logic. 704 block-head lines carry the word.Distinct decorations in front of the word (after the heading or bullet mark): exactly one, U+26A0 WARNING SIGN + U+FE0F (
⚠️), in four placements:## ⚠️ BREAKING …(heading)⚠️ **BREAKING …(before the emphasis mark)⚠️ Breaking …(plain paragraph)**⚠️ Breaking …(inside the emphasis mark)21c86444e): 47 of those 51 blobs (30 paths) read as not breaking. The other 4 were caught by an unrelated signal.False positives, over the same corpus:
## ⚠️ BREAKING for a host that hands reference_to to the widgets directly,⚠️ **BREAKING if your code hands a numeric primary key to any of these three:**,⚠️ Breaking change (marked minor under this repo's version policy): the ….**BREAKING** — ⚠️ **BREAKING …): 0 with this change. If only the opener were fixed, there would be 4 blobs / 2 paths (10719-retire-phase35-validation-types.md,7659-retire-validation-engine.md).Why a pictograph class rather than either option the card names:
(39 blobs ((breaking, declared minor per the version policy)),—5,"2 (described under "Breaking for TypeScript readers" below),("1,(**1. A code span such as a backticked identifier named breaking would also count. Admitting any of these trades the miss for false positives.⚠️: that fixes the corpus, but the next author's🚨 BREAKINGwould be the same miss again.The hop range
7578323a544e..1fb1ced36243Before (base
21c86444e):After (
ea30d08d6):The two breaking entries:
e8fc452c3,.changeset/12254-envelope-draw-retire.md: counted before and after.10aba37d1,.changeset/12242-types-field-metadata-family.md: now counted, and its line now reads- **minor** — **BREAKING** — The exported field metadata types stop declaring ….The artifact has no other diff. PR #23110's hand-corrected console changeset,
scripts/bump-objectui.sh,.objectui-shaand every.changeset/file are untouched.Self-test cases (battery
#23112, 16)Direct, against the criterion and the renderer:
## ⚠️ BREAKING, priced as minor under the fixed group's version policy, with a guard that the fixture really carries U+26A0 U+FE0F.## BREAKING, …) still reads breaking.⚠️ Upgrade note: nothing in this change is breaking …,## ⚠️ Read before upgrading — this is not breaking,⚠️ Non-breaking cleanup; a groundbreaking refactor.⚠️ **BREAKING (scored minor per this repository's version-alignmentlabel. Its emphasis run crosses a line, so only the opener can answer.**⚠️ Breaking for consumers that read result.data.**.⚠️ Breaking in places, ….## ⚠ BREAKING(U+26A0 alone).- 🚨 BREAKING:behind a bullet."Breaking for TypeScript readers", below, …), both stay prose.markBreakingkeeps an author's decorated label verbatim, and still marks a decorated ordinary summary.Through
buildDigest, in a fixture repo of its own (so the #6099 counts stay pinned):⚠️ 2 of these carry a breaking change: 2 by the author's own breaking annotation.Ablation
Both legs ran from the committed
ea30d08d6, throughscripts/ablation-replace.mjsin wrap mode. In each leg the anchor hit 1 → 0 and the replacement 0 → 1. After each leg the tool confirmed that the blob equals HEAD and thatgit diff HEADis empty.DECORATIONemptied, which puts both regexes back to the base shape. 12 of the 16#23112cases go red. The 4 that stay green are the plain-heading control and the three negatives. No other battery moves. Self-test exit 1.OPENS_WITH_BREAKING_LABELreverted. Exactly the 2 renderer cases go red: 10 (markBreakingverbatim) and 14 (summary verbatim, never restated).Bounded in-place fix:
OPENS_WITH_BREAKING_LABELIt sits in the same file and has the same defect class (a decoration not recognised as a breaking label). The change is mechanical: the same fragment, in the same position.
It is required by this change. Once decorated annotations are flagged,
markBreakingwould prefix**BREAKING** —to an author label that opens with⚠️ **BREAKING. That breaks the self-test's existing "never restated" contract, and the corpus measurement above shows it would happen on 2 real changesets. No other symbol in the file changed.Gates (at
ea30d08d6)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, run on 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-bump:bump-objectui self-test PASSED — 20 assertions across 5 cases.pnpm check:changeset-gate-self-tests: check-empty-changeset 170 assertions, including the four-carrier entry-regex agreement; check-adr-0087-registration 548; check-changeset-no-major 401.pnpm check:objectui-changeset, the digest self-test: 147 checks,all checks passed.eslint.config.mjs: the**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}object coversscripts/*.mjs.--format jsonreports 1 file, 0 errors, 0 warnings.parserOptionscarries onlyecmaVersion/sourceType), so 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
(breaking …)inside a bold lead label is not read as an annotation: 39 blobs / 23 paths are unflagged. Example: objectui8a55f0ccd,.changeset/12059-sidebar-no-reorder.md, whose lead label reads@object-ui/layout (breaking, declared minor per the version policy)., bolded. It is a different shape: the word is not at the line start, so it falls outside triage's binding line-start rule and needs its own ruling.BREAKING_EMPHASIS_LABEL, which is scanned anywhere in the body, does not admit a decoration inside the run when the run sits mid-paragraph (**⚠️ BREAKING**). The corpus has zero occurrences of that shape.Generated by Claude Code