Skip to content

test(scripts): batch 7 pilot — floor check-sdui-manifest on its own table row labels - #15271

Merged
baozhoutao merged 2 commits into
mainfrom
claude/issue-13799-batch7-pilot-row-batteries
Sep 4, 2026
Merged

baozhoutao merged 2 commits into
mainfrom
claude/issue-13799-batch7-pilot-row-batteries

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Part of #13799

Batch 7 PILOT — one file, scripts/check-sdui-manifest.mjs, the smallest of the ten table-driven scripts/** self-tests, under recipe A decided in 5537261715 / 5537301204. The pilot exists to settle the shape the other nine copy, so the shape decisions are stated here as a spec rather than left to be read off the diff.

failures === 0 was this self-test's only success condition, so "every case held" and "the cases never ran" printed the same line.

Why the sink cannot carry the floor here

The file is table-driven: one literal cases table, one loop over it, and a sink (failures++) that writes only when a case fails. Routing that sink through registerCase() would register a case only on failure — a fully green run would register 0 and every battery would read DID NOT RUN. That is the floor inverted, not installed. Batch 4's thunk route is no escape for this class either (four of the sibling files carry continue in the loop body, which cannot cross a function boundary).

The shape, for the next batch to copy verbatim

1. Battery name = the row label, verbatim. The labels already exist in the source as the table's first column, so no authoring judgement is needed, and a refusal line quotes exactly the string a reader greps for. No prefix is added: a prefix would have to be re-derived by every future reader to match a refusal against a row.

Two rows sharing a label are refused at declaration time, by two halves that each hold on their own and were each measured:

  • a duplicate written into the roster literal collapses to ONE key, so the roster falls below its pinned size — SELF_TEST_BATTERIES declares 5 batteries, below the pinned 6;
  • a duplicate written into the table leaves the roster whole, so a cross-check reads the row labels directly and names WHICH label collided — the cases table uses "missing record is RED" as a row label more than once.

A shared label would otherwise be one battery for two rows, so the second row could stop running while the first keeps the floor met.

2. registerCase(name) is the first statement of the driving loop body, attributing the case to the row actually being run, whatever that row asserts afterwards. There is no battery() opener: for a table-driven self-test the ROW is the battery, so attribution is the loop variable rather than a most-recently-opened section. A per-iteration helper call is already a landed shape (check-doc-frontmatter, check-test-source-alias).

3. The roster is a LITERAL the table is checked against — never derived from the table. A derived roster pins nothing: a deleted row would delete its own floor in the same edit. Each row label maps to floor 1, the honest number for a table row (the loop reaches it exactly once per run), and the floors stay floors rather than equalities so a row that grows into several registrations does not red. The roster's own size is pinned at the row count, because deleting an entry silences a floor exactly as effectively as zeroing it.

⛔ No assertion condition touched. ⛔ No control flow rewritten — no continue to return, no thunk around the loop body, no comment promoted to a section head. The verdict handshake (SELF_TEST_VERDICT) is kept exactly as landed. The two continue statements added live in the new floor block's own loops; the driving loop still has none.

One deliberate text change, reachable only on a red run: the failure line reads N failure(s) (cases and floor) rather than N case(s) failed, because floor breaches are counted in the same sink as case failures and the old wording would have mis-named them. The green line is byte-identical to the base (below).

Verification record

Base worktree at the dispatch pin 460134af8, installed, for the byte comparisons. Branch head fbb42081e.

what reading
surface exactly 1 file (three-dot vs origin/main), +107/−1; skip-changeset (a scripts/** gate publishes from no package)
--self-test exit 0 — 6 cases behave (green passes; absence, tamper, moved pin, emptiness are RED).
normal mode exit 0 — sdui.manifest.json is present, intact (sha256 49211fee7792…, 57 components) and fresh at objectui pin 00d3f09c500c…
stdout + stderr vs base all four streams byte-identical (cmp silent; --self-test stdout sha256 6c949991bc56… on both trees, normal-mode stdout 449c7ea7428d… on both)
case count, measured on runs 6 before, 6 after. Roster size pinned to an unreachable 7 reads declares 6 batteries, below the pinned 7; a single row's floor raised to 2 reads registered 1 case(s), below its pinned floor of 2, so each row registers exactly once and six rows are declared — 6 registrations, matching the ${cases.length} the verdict prints
extractWatchHints identical on both trees, and empty on both — this gate declares no path population. Structural, not incidental: admission is /^[\w.@][\w.@/*-]*$/ over the raw literal, and every row label contains spaces, so no roster key or row label can ever be admitted as a path hint (checked directly against all six labels: all six rejected)
census node scripts/measure-self-test-floor.mjs --json: NONE 45 to 44, ROSTER 122 to 123, COUNT 2 unchanged — a drop of exactly 1, and the symmetric difference of the two classifications is scripts/check-sdui-manifest.mjs alone

Ablations. The implementation was committed before any leg, so the restore had a real reference point. Every mutation is proven on disk by an anchored count plus the blob hash moving off the HEAD blob; every restore by git checkout HEAD -- path then hash equality against the HEAD blob and an empty git diff HEAD; every leg carries a trap restore on EXIT/INT/TERM with absolute paths. Two legs were refused by their own landing check when my anchor assertion miscounted — those are non-measurements, re-run rather than reported as passes.

leg reading
(a) delete one row from the table exit 1, naming THAT row: self-test battery "moved pin is RED" DID NOT RUN — 0 cases registered, 1 pinned
(b) rename a row's label exit 1, naming BOTH halves: "moved pin is AMBER" registered 1 case(s) but is not declared in SELF_TEST_BATTERIES, and "moved pin is RED" DID NOT RUN
(c) remove the registerCase() call exit 1, all 6 rows DID NOT RUN, and not one ✗ self-test: case line printed — every original case still passes while the self-test now refuses
(d) roster size pin unreachable exit 1, declares 6 batteries, below the pinned 7
(e) one row's floor raised to 2 exit 1, registered 1 case(s), below its pinned floor of 2
(f) duplicate label in the table exit 1, naming the collided label, plus the displaced row as DID NOT RUN
(g) duplicate key in the roster exit 1, declares 5 batteries, below the pinned 6, plus the now-undeclared row

Gates

Derived family from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, all run in the foreground, plus the always-runs tail and a control-byte scan. Exit codes captured by redirect before any pipe; verdicts quoted from each gate's own line. The full record is in the os-dev-report comment on #13799.


🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

…its own row labels

Batch 7 pilot for the assertion-floor card: the first of the ten
table-driven `scripts/**` self-tests, whose natural roster is the
table's own named rows rather than sections.

`failures === 0` was this self-test's only success condition, so "every
case held" and "the cases never ran" printed the same line. The sink
here (`failures++`) writes only on failure, so routing it through
`registerCase()` would invert the floor rather than install it: a fully
green run would register nothing.

So each row label in the literal `cases` table becomes a declared
battery with a floor of 1, and `registerCase(name)` is the first
statement of the driving loop body — attributing the case to the row
actually being run. The roster is a LITERAL the table is checked
against, never derived from it: a derived roster lets a deleted row
delete its own floor. The roster's own size is pinned, which is also
what refuses a duplicate row label at declaration time; a table
cross-check names which label collided.

No assertion condition touched, no control flow rewritten, the verdict
handshake kept as landed.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
…dentical

The floor's evidence is the refusal, not the success line, so the
green-tree stdout stays exactly as landed. The failure line keeps its
corrected wording — floor breaches are counted in the same sink as case
failures, so "N case(s) failed" would have been inaccurate — but that
line is only reachable on a red run.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 4, 2026
@github-actions github-actions Bot added the size/m label Sep 4, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 4, 2026 08:28
@baozhoutao
baozhoutao enabled auto-merge September 4, 2026 08:28
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 4, 2026
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
`failed === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (#13489).

Recipe A, as the batch 7 pilot (PR #15271) settled it for the table-driven
class: each of the 14 rows of the literal `cases` table is a declared battery
under its own label verbatim, floor 1, and `registerCase(name)` is the first
statement of the driving loop body. The roster is a LITERAL the table is
checked against — never derived from it — and its own size is pinned at 14,
which is also half of the duplicate-label refusal.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. The red-run line becomes
`N failure(s) (cases and floor)` because floor breaches report into the same
sink; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
…-test

`failed === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (#13489).

Recipe A, as the batch 7 pilot (PR #15271) settled it: each of the 18 rows of
the literal `cases` table is a declared battery under its own `label` verbatim,
floor 1, roster size pinned at 18. `registerCase(c.label)` is the FIRST
statement of the driving loop body — ahead of the `try` whose `catch` ends in
`continue` and ahead of the two guards that do the same, because the floor
asserts REACH and a registration behind a guard reintroduces the inversion.

Scope stated in place: the four discovery-block assertions below the loop are
not rows of the table (the verdict has always printed 18 rows, not the 22
assertions that run), so they are left exactly as they are.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. Red-run line becomes
`N failure(s) (cases and floor)`; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
…self-test

`failures === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (#13489).

Recipe A, as the batch 7 pilot (PR #15271) settled it: each of the 18 rows of
the literal `cases` table is a declared battery under its own `name` verbatim,
floor 1, roster size pinned at 18, and `registerCase(c.name)` is the first
statement of the driving loop body.

Scope stated in place: the eight `expectRoot(...)` assertions of the dead-root
reverse proof below the loop are not rows of the table — the verdict line has
always counted the 18 analysis rows and named that proof separately — so they
are left exactly as they are.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. Red-run line becomes
`N failure(s) (cases and floor)`; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
`failed === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (#13489).

Recipe A, as the batch 7 pilot (PR #15271) settled it: each of the 23 rows of
the literal mask/strip `cases` table is a declared battery under its own label
verbatim, floor 1, roster size pinned at 23, and `registerCase(name)` is the
first statement of the driving loop body.

Scope stated in place: the twelve `interpolation`-view assertions below the
corpus loop are NOT a second literal table — their rows exist only because an
`x(...)` call pushed them onto `extra` at runtime, so a roster taken from that
loop would be DERIVED and a deleted call would delete its own floor. They are
left exactly as they are and the verdict keeps counting them separately.

This module is a LIBRARY the gates import, so the change is proved from the
consumer side too: six importers' `--self-test` runs (comment-mask-corpus,
comment-mask-adoption, error-code-casing, entry-guard, declaration-mirrors,
watch-hint-literal) are byte-identical to the base tree's on both streams and
green in normal mode on the edited tree.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. Red-run line becomes
`N failure(s) (cases and floor)`; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
Merged via the queue into main with commit fbecffe Sep 4, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-13799-batch7-pilot-row-batteries branch September 4, 2026 09:06
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
…ble rows

Recipe A as the pilot PR #15271 settled it: each of the 17 row labels of the
literal `cases` table is a declared battery with a floor of 1, `registerCase(name)`
is the first statement of the driving loop body, and the roster is a LITERAL the
table is cross-checked against so a deleted or renamed row names ITSELF rather
than deleting its own floor. Roster size pinned at 17; duplicate labels are
refused from both sides. The three `// --- ... ---` comments inside the array are
grouping rules, not section heads.

The boolean `passed` becomes a `failures` counter so the red line can carry the
recipe's wording, `N failure(s) (cases and floor)`; no assertion condition is
touched and the green line is byte-identical to the base tree's.

Part of #13799

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
baozhoutao pushed a commit that referenced this pull request Sep 4, 2026
…table rows

Recipe A per the pilot PR #15271: every row label is a declared battery with a
floor of 1, `registerCase(name)` is the first statement of the driving loop,
the roster is a LITERAL cross-checked against the table, size pinned at 155.
The only deleted line is the red-run verdict, reworded to the recipe's
`N failure(s) (cases and floor)`; the green line stays byte-identical.

The batch-8 census flagged this table's four `...(() => { ... })()` spreads as an
IIFE-produced block whose rows could not take a literal roster key. Measured, that
premise does not hold here: each IIFE is a SCOPING device that declares local
fixture consts and then returns an array of LITERAL [label, actual, expected]
rows. No label is a template string or computed, and no row comes from a
map/push/loop. Three independent readings agree on 155 -- labels extracted from
source, literal row starts, and the `cases.length` the green line prints on a run
-- so ALL 155 rows are floored with no residue, rather than the partition the row
anticipated.

Part of #13799

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 9, 2026
…ectstack-ai#13799 batch 7b) (objectstack-ai#15286)

* tooling(scripts): row batteries for check-skill-id-lint's self-test

`failed === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (objectstack-ai#13489).

Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it for the table-driven
class: each of the 14 rows of the literal `cases` table is a declared battery
under its own label verbatim, floor 1, and `registerCase(name)` is the first
statement of the driving loop body. The roster is a LITERAL the table is
checked against — never derived from it — and its own size is pinned at 14,
which is also half of the duplicate-label refusal.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. The red-run line becomes
`N failure(s) (cases and floor)` because floor breaches report into the same
sink; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

* tooling(scripts): row batteries for check-agent-model-declared's self-test

`failed === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (objectstack-ai#13489).

Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it: each of the 18 rows of
the literal `cases` table is a declared battery under its own `label` verbatim,
floor 1, roster size pinned at 18. `registerCase(c.label)` is the FIRST
statement of the driving loop body — ahead of the `try` whose `catch` ends in
`continue` and ahead of the two guards that do the same, because the floor
asserts REACH and a registration behind a guard reintroduces the inversion.

Scope stated in place: the four discovery-block assertions below the loop are
not rows of the table (the verdict has always printed 18 rows, not the 22
assertions that run), so they are left exactly as they are.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. Red-run line becomes
`N failure(s) (cases and floor)`; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

* tooling(scripts): row batteries for check-startup-registry-verdict's self-test

`failures === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (objectstack-ai#13489).

Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it: each of the 18 rows of
the literal `cases` table is a declared battery under its own `name` verbatim,
floor 1, roster size pinned at 18, and `registerCase(c.name)` is the first
statement of the driving loop body.

Scope stated in place: the eight `expectRoot(...)` assertions of the dead-root
reverse proof below the loop are not rows of the table — the verdict line has
always counted the 18 analysis rows and named that proof separately — so they
are left exactly as they are.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. Red-run line becomes
`N failure(s) (cases and floor)`; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

* tooling(scripts): row batteries for js-comment-mask's self-test

`failed === 0` was this self-test's only success condition, so "every case
held" and "the cases never ran" printed the same line (objectstack-ai#13489).

Recipe A, as the batch 7 pilot (PR objectstack-ai#15271) settled it: each of the 23 rows of
the literal mask/strip `cases` table is a declared battery under its own label
verbatim, floor 1, roster size pinned at 23, and `registerCase(name)` is the
first statement of the driving loop body.

Scope stated in place: the twelve `interpolation`-view assertions below the
corpus loop are NOT a second literal table — their rows exist only because an
`x(...)` call pushed them onto `extra` at runtime, so a roster taken from that
loop would be DERIVED and a deleted call would delete its own floor. They are
left exactly as they are and the verdict keeps counting them separately.

This module is a LIBRARY the gates import, so the change is proved from the
consumer side too: six importers' `--self-test` runs (comment-mask-corpus,
comment-mask-adoption, error-code-casing, entry-guard, declaration-mirrors,
watch-hint-literal) are byte-identical to the base tree's on both streams and
green in normal mode on the edited tree.

No assertion condition touched, no control flow rewritten, no comment promoted
to a section head, verdict handshake unchanged. Red-run line becomes
`N failure(s) (cases and floor)`; the green line is byte-identical to main's.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

---------

Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 9, 2026
…ecipe-A self-tests (objectstack-ai#15307)

* test(scripts): floor measure-test-shard-timings' self-test on a registered battery

The 22 bare `if (...) throw ...` assertions in `selfTest()` are each wrapped
verbatim in the `check(() => { ... })` thunk PR objectstack-ai#15198 landed: the condition is
carried in untouched, so no `!` can be dropped while the case still registers
and still passes. Zero named section banners, so one hoisted battery (the
PR objectstack-ai#14896 / objectstack-ai#15003 / objectstack-ai#15217 shape), floored at the measured 22 with the roster's
own size pinned at 1. The floor throws, matching this file's own sink, and is
evaluated before the verdict so the success line can only be printed by a run
that actually ran its cases.

Part of objectstack-ai#13799

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

* test(scripts): floor measure-position-name-fold-census' self-test on a registered battery

The 13 `if (...) problems.push(...)` assertion sites in `selfTest()` are each
wrapped verbatim in the `check(() => { ... })` thunk PR objectstack-ai#15198 landed. The sink
here is FAILURE-ONLY, so routing `problems.push` itself through `registerCase()`
would have inverted the floor rather than installing it: a green run would
register nothing and the battery would read DID NOT RUN. Zero named banners, so
one hoisted battery, floored at the 24 registrations measured on a run (four of
the thirteen sites sit inside loops: 9 + 4 + 4 + 2 + 5).

The floor lives inside the `!quiet` branch. `main()` gates the PRODUCTION census
on `selfTest({ quiet: true })`, which prints no verdict and so makes no claim for
a floor to guard; evaluating it there would let a roster edit change what a
census run outputs. Both production modes are byte-identical to the base tree.

One site stays outside the roster and says so in place: the `catch` arm of the
AUDIT_CONTROLS loop ends in `continue`, illegal inside the thunk's arrow
function, and rewriting that control flow is exactly what the verbatim rule
forbids. Its sibling in the same loop body is floored, so a loop that stops
running still reds.

Part of objectstack-ai#13799

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

* test(scripts): floor check-override-consistency's self-test on its table rows

Recipe A as the pilot PR objectstack-ai#15271 settled it: each of the 17 row labels of the
literal `cases` table is a declared battery with a floor of 1, `registerCase(name)`
is the first statement of the driving loop body, and the roster is a LITERAL the
table is cross-checked against so a deleted or renamed row names ITSELF rather
than deleting its own floor. Roster size pinned at 17; duplicate labels are
refused from both sides. The three `// --- ... ---` comments inside the array are
grouping rules, not section heads.

The boolean `passed` becomes a `failures` counter so the red line can carry the
recipe's wording, `N failure(s) (cases and floor)`; no assertion condition is
touched and the green line is byte-identical to the base tree's.

Part of objectstack-ai#13799

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

* test(scripts): floor check-skill-line-ratchet's self-test on all 155 table rows

Recipe A per the pilot PR objectstack-ai#15271: every row label is a declared battery with a
floor of 1, `registerCase(name)` is the first statement of the driving loop,
the roster is a LITERAL cross-checked against the table, size pinned at 155.
The only deleted line is the red-run verdict, reworded to the recipe's
`N failure(s) (cases and floor)`; the green line stays byte-identical.

The batch-8 census flagged this table's four `...(() => { ... })()` spreads as an
IIFE-produced block whose rows could not take a literal roster key. Measured, that
premise does not hold here: each IIFE is a SCOPING device that declares local
fixture consts and then returns an array of LITERAL [label, actual, expected]
rows. No label is a template string or computed, and no row comes from a
map/push/loop. Three independent readings agree on 155 -- labels extracted from
source, literal row starts, and the `cases.length` the green line prints on a run
-- so ALL 155 rows are floored with no residue, rather than the partition the row
anticipated.

Part of objectstack-ai#13799

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants