Skip to content

fix(pm): the four blocker readers say merged for a PR target, closed unmerged for an abandoned one, closed for an issue - #28074

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-gnwty4
Oct 30, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-gnwty4

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

Fixes #28033

What changes

Wording only, in the four readers the card names. No verdict moves and no gate is added.

  1. .claude/skills/pm-dispatch/references/dispatch-runbook.md :85, flag two. 「目标已关闭」 → 「目标已关单(PR 则已合并;关而未合并不算)」. The line now says what H19 fires on: an issue closed, a PR merged, never a PR closed unmerged. In-line, line count 245 → 245, 100 bytes (ceiling 120).
  2. scripts/pm/check-half-states.mjs h28StaleBodyBlockerLine. The spent body targets are no longer all called CLOSED: the row says target(s) no longer OPEN and names each the way namedTargets renders it (closed, or closed UNMERGED for an abandoned PR, which it says released nothing while the body line is spent either way). The spent filter is unchanged, so the row fires exactly where it did.
  3. scripts/pm/check-half-states.mjs proseBlockerClause, the mixed branch. Each count is named only when non-zero, so an abandoned PR beside an unresolved target reads None of them has released — 1 closed UNMERGED (which withholds), 1 could not be resolved from this install instead of opening with 0 still read OPEN.
  4. scripts/ci/scheduled-full-run.mjs. judgeCardBlock carries merged: true on a closed PR row whose pull_request.merged_at is set; renderBlockNote renders that row (merged <date>) and its headline says closed (a PR: merged); targetReading logs it as merged. staleBlockVerdict is untouched.

Pins: six added to the existing H4 prose PR and H28 lines of check-half-states --self-test (5105 → 5111 cases), and the merged-PR case of scheduled-full-run --self-test now checks the note and the log name the merge. The optional platform-readings.md measured-leg line was not added: the file sits at its 458-line ceiling with no headroom, so it would have cost a line elsewhere.

Why

After PR #28031 a Blocked-by: PR target releases on merged and a PR closed unmerged releases nothing, but these four places still said closed for every target. A seat reading them could take an abandoned PR for a released blocker. Follow-up card #28033 took review should-fixes 1, 2, 4 and 5 from that PR's contract review.

Verification

  • node scripts/pm/check-half-states.mjs --self-test: 5111 cases, exit 0.
  • node scripts/ci/scheduled-full-run.mjs --self-test: OK, exit 0.
  • Two ablation legs, each restored to a byte-identical file: (A) the mixed branch always prints the open count → the two new H4 prose PR pins red; (B) merged never set in judgeCardBlock → the merged-PR case throws the note does not name the merge.
  • pnpm check:pm-skill-ratchet, pnpm check:pm-skill-id-lint (105 files clean), node scripts/check-skills-token-ratchet.mjs: exit 0.
  • node scripts/pm/dispatch-gates.mjs --commands derives 54 families on the committed change; every one run locally after pnpm install --frozen-lockfile --ignore-scripts and reconciled with --ran (see the os-dev report on the card).
  • check-governed-merges.mjs --test on the three paths: one .claude/** hit, Tier S; the two scripts are not on the register. The landing tier is read off the register at PR time.

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:四处把 Blocked-by: 的 PR 目标说成「关闭」的读器改成「合并」:runbook 旗二、H28 的「已关」措辞、H4 混合行的 0 still read OPEN、定时全量运行备注里的 (closed …)。三个文件,规则文本行数不变(245)。
  • 为什么改:PR fix(pm): H4 prose and the pm:blocked readings release a PR target on merge, never on close #28031 之后规则是 PR 合并才放行、关而未合并不放,但这四处仍写「关闭」,席位可能把废弃 PR 当成已放行的阻塞。
  • 风险与回滚:只改 report-only 行文,不动判定、不加门禁、不写标签;issue 目标仍是关闭即放行。回滚即 revert。
  • 先看:scheduled-full-run.mjs 的 judgeCardBlock(新增 merged: true 标记)和 renderBlockNote。
  • 两分钟验证:node scripts/pm/check-half-states.mjs --self-test(5111 例)与 node scripts/ci/scheduled-full-run.mjs --self-test,都 exit 0。
  • 需要你做的:无。契约复审待席位完成(contract review owed),落地层级以登记册读数为准。

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind.
  • 3. No formatter ran; pnpm lint passes.
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset, and both declaration lines are filled in here and in the changeset. (no published package touched; skip-changeset)
  • 6. packages/spec touched: its generated artifacts are regenerated and committed. (not touched)
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English.
  • The Before Submitting list in CONTRIBUTING.md is done.

🤖 Generated with Claude Code

https://claude.ai/code/session_016WV4cycQZLtWnoRe2XWgyz

…unmerged for an abandoned one, closed for an issue

dispatch-runbook flag two names the event the patrol fires on: an issue
closed, a PR merged, never a PR closed unmerged. H28 names a spent body
target the way namedTargets renders it instead of calling every one
CLOSED. The H4 prose mixed line names only the counts it has, so an
abandoned PR beside an unresolved target no longer opens with
`0 still read OPEN`. The scheduled full-run block row carries `merged`
on a PR closed with a merged_at, and the body note and log render it as
merged. Wording only: no verdict moves, no new gate. Six pins added to
the existing H4 prose PR and H28 lines and the merged-PR self-test case.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cycQZLtWnoRe2XWgyz
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 30, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 708c0ce · 2026-10-30T11:41Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract review

Head-sha: 708c0ce4475ce10924a6b00b1d794224625abb39
Served-tier: CONTRACT_REVIEW_TIER
Local-runs: probe — the two touched scripts' own --self-test batteries on the head, one ablation leg of my own in a detached worktree (restored with git checkout, git status --porcelain empty), and a cross-tree probe (scratchpad probe.mjs: 1327 rows driving proseBlockerClause, h28StaleBodyBlockerLine, judgeCardBlock, renderBlockNote and fileOrRefreshCard over the same target mixes in worktrees at this head and at origin/main) were executed locally, because the card's one acceptance claim is behavioural (wording only, no verdict moves) and no check-run prints a head-versus-base verdict comparison; the skill line ratchet, the skill-id lint, the token ratchet and check-governed-merges.mjs --pr 28074 were run read-only beside them
Scope: .claude/skills/pm-dispatch/references/dispatch-runbook.md (:85, flag two) + scripts/pm/check-half-states.mjs (proseBlockerClause :2395, its mixed branch :2436-2447; h28StaleBodyBlockerLine :7645, its text :7663-7680; H4 prose PR pins :25107-25109; H28 pins :30778-30787), scripts/ci/scheduled-full-run.mjs (judgeCardBlock :608, the merged row :625-631; targetReading :646-652; renderBlockNote :668-697; merged-PR self-test case :1980-1994); read but not reviewed: scheduled-full-run.mjs staleBlockVerdict :571-589 and the self-test's blockBoard double :1750-1800, check-half-states.mjs blockerResolutionFromRow :5157, namedTargets :5189, h19BlockOutlivedBlocker :5412 (the closed and unmerged filters :5439-5440), .github/workflows/lint.yml :3407-3412 and the lane verdict step of the same job (:4178), scripts/ci/lane-verdict.mjs, .claude/skills/pm-dispatch/SKILL.md :110, .claude/skills/pm-dispatch/references/state-machine.md :24.

① Derived judgments

Base is origin/main; the merge base is 18318361f and origin/main has since moved to 2e955dde6 with no touch of the three changed files, platform-readings.md or contract-review.md (git diff --stat 18318361f 2e955dde6 on the five paths is empty). The branch is the single commit 708c0ce4 (+46 / -12, 3 files). check-governed-merges.mjs --pr 28074 at the head: 1 of 3 paths hits the register (.claude/**), Tier S, 58 changed lines under the human-merge threshold; the two scripts are not on the register. The register, the PR body and the dev report agree. Each claim, judged by reading the code and by running it:

  1. Wording only (card ruling 6519940953: no verdict changes, no new gate). The cross-tree probe drives the same inputs through this head and origin/main and compares every non-string outcome. (a) proseBlockerClause, all 55 multisets of size 1 to 3 over merged PR, abandoned PR, closed issue, open and unresolved rows, built through blockerResolutionFromRow from API-row shapes: the branch taken (all-closed, partly-closed, all-unresolved, all-abandoned, all-open, mixed), the N of M counts, the due back and releases nothing readings, the candidate list line and the closing fix sentence are identical on every row; the only strings that differ are the 3 mixed rows with no open row (abandoned beside unresolved, in each multiplicity), where the head drops the 0 still read OPEN clause and keeps the other counts, each count still equal to the rows of its kind. (b) h28StaleBodyBlockerLine, 432 rows (6 body-target states by 6 comment-target states by an optional second body target in 6 states, labelled pm:blocked or not): the row fires on exactly the same 36 inputs on both trees, the BODY names N and COMMENT names N counts and every namedTargets reference and mark are identical, and the 36 strings differ only in the new legend and the closed or merged words. The spent and live filters are untouched in the diff. (c) scheduled-full-run.mjs, 768 refresh rows (48 target sets over a merged local PR, an abandoned PR, an open PR, a closed and an open issue, a closed and a merged cross-repo PR, an unreadable cross-repo target and a merged PR with no closed_at; body or comment channel; assigned or not; with or without an Unlock-action: line; pm:blocked or not), driven through judgeCardBlock, renderBlockNote and fileOrRefreshCard with the self-test's double: the verdict, the resolution rows with the merged key stripped, the note's presence and line count, the refresh action, the label calls in order, the final label set and whether the body was refreshed with or without a note are identical on every row; 14 rows expire and 14 are assigned on both trees. (d) staleBlockVerdict is byte-identical between the trees (toString() equal), so the held/expired/assigned decision and the label write that follows it cannot differ. The H28 and H4 rows are report-only strings appended to findings, so the sweep's exit code, which counts findings, is unchanged by construction and the 5111-case self-test exits 0. No verdict difference found; nothing to report as a must-fix.
  2. Each new string is true. H28 at the head: an abandoned body target is named #9255 (closed UNMERGED DATE) by namedTargets and the row says it released nothing while the body line is spent either way (true: spent includes it, the wait it states is over, and H19 founds nothing on it); a merged PR and a closed issue are both rendered closed, and the legend an issue reads closed, a PR reads closed by its MERGE is the correct reading of that bare word, since blockerResolutionFromRow marks only the unmerged case (should-fix 1 on the rendering). The head never prints names N CLOSED. H4 mixed branch: the probe confirms 0 still read appears on no head row, every mixed sentence still opens with a count, and the abandoned and unresolved counts equal the rows of their kinds; the dev's example string (1 closed UNMERGED (which withholds), 1 could not be resolved from this install) reproduces. scheduled-full-run: on every expired or assigned row the note renders a merged PR (merged DATE) and never (closed, a closed issue (closed DATE) as before, and a merged PR with no closed_at (merged); the summary line reads #N merged for a merged local PR, closed unmerged (a PR that never landed) for an abandoned one, closed upstream (not an unlock criterion for this consumer) for a closed or merged cross-repo PR (the holding reason wins, unchanged from base) and #N closed for an issue. No note line starts with a directive key.
  3. The merged flag. judgeCardBlock :625-631 sets merged: true only when state === 'closed' and got.pull_request.merged_at is truthy, the same field unmerged reads; the probe finds the flag on exactly the closed PR rows with a merged_at, never beside unmerged, and never on base rows. A row without it renders through renderBlockNote as (closed DATE) or (closed) exactly as on base (compared on the issue rows). The file's self-test runs in CI: lint.yml :3407-3412, step Scheduled full run self-test and concurrency gate of the lint-ci-engine job (Lint · CI, release & engine gates), a continue-on-error step whose outcome the job's Lane verdict step reds through scripts/ci/lane-verdict.mjs; that job is a needs: member of the aggregating Lint & Repo Gates context (lint.yml :354), which is in the required set. The check-run is success on this head.
  4. dispatch-runbook.md :85. 「旗二:pm:blocked 卡的 Blocked-by: 目标已关单(PR 则已合并;关而未合并不算)。」 True against the reader that raises the flag: h19BlockOutlivedBlocker :5439-5440 founds the expiry row on state === 'closed' && r.unmerged !== true within the judged set, so a closed issue and a merged PR flag and a PR closed unmerged founds nothing (it is named in the row's unmergedNote and withholds a full discharge). Same rule as SKILL.md :110 「#N 关单(PR 则合并,关而未合并不放)」 and state-machine.md :24 「合并才放,关而未合并 ⛔ 不放」, in the file's own 旗 register. Line count 245 → 245 on both trees (wc -l), the line is 100 bytes (ceiling 120), the diff on the file is one line, and the file carries no # followed by three or more digits. check-skill-line-ratchet.mjs --self-test (164 cases) then the ratchet: dispatch-runbook.md 245 lines (ceiling 245, headroom 0), platform-readings.md 458 (ceiling 458), exit 0. check-skill-id-lint.mjs --self-test (23 cases) then the lint: 105 files clean, exit 0. check-skills-token-ratchet.mjs: 56 authored bundle files within ceilings, exit 0. Both package scripts (check:pm-skill-ratchet, check:pm-skill-id-lint, package.json :75-76) map to those commands.
  5. Self-tests on the committed head, exit captured: check-half-states.mjs --self-test exit 0, 5111 cases (dev: 5111; base 5105, six new pins); scheduled-full-run.mjs --self-test exit 0, self-test OK. Ablation leg C, mine, in the head worktree: the H28 row's target(s) no longer OPEN reverted to target(s) CLOSED by one sed, git diff --stat 1 file, +1 / -1; the self-test exits 1 with 1 of 5111 red, H28: two stale body targets are counted; restored with git checkout, porcelain empty, HEAD still 708c0ce4. The dev's legs A (mixed branch always prints the open count: 2 red) and B (merged never set: the merged-PR case throws) are read from the report and are consistent with the pins at :25108-25109 and :1988-1990; not re-run.
  6. Scope and metadata. The diff touches the three files the claim's file surface names and nothing else; platform-readings.md is untouched because the ratchet reads it at 458 of 458, so the optional measured-leg line (previous record's should-fix 3) stays open. PR body: Fixes #28033 on the first content line (the card closes on merge: all four wanted items landed, the optional fifth was conditional on headroom), Clause-②: no, Metadata-protocol: none; labels documentation, size/s, skip-changeset, right for PM tooling and skill text with no published package. Pins were added only on the H4 prose PR and H28 lines and in the merged-PR case, as the card asked.
  7. Not measured here: ESLint on the two scripts (no node_modules in the worktrees); the Lint · ESLint check-run on this head is success. The dev's 54 gate families are read from the report, not re-run; the PM dispatch-gates check-run on this head is success.

② Semver level

No published package is touched (.claude/**, scripts/pm/**, scripts/ci/** only); skip-changeset carried. Clause-②: no is right; no narrowing declared or present.

③ Boundary flags

  • Served tier versus face: the register answers Tier S on the one .claude/** path, so the governed rules-text face applies and this record is served at CONTRACT_REVIEW_TIER, the tier the queue guard reads. Triage 6519940953 wrote Tier H for the .claude/** lines; AGENTS.md Prime Directive 14 and the register row say .claude/** is Tier S, and the register is the authority at PR time (the claim 6521203048 says so too). Not a conflict in the diff.
  • Author: PR user.login is objectstack-fleet[bot] (attribution comment names os-elon-musk); no non-bot login to record.
  • Contract-review-claim: comment 6521791233 names this seat session and this head; no competing claim, no hold, no hand-off; no reviews on the PR.
  • CI at review time (third poll, 51 check runs on 708c0ce4, none in progress): success on Lint & Repo Gates, Lint · ESLint, Lint · repo & tooling gates, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · CI release & engine gates, the three Lint · scoped jobs, TypeScript Type Check and its four sub-jobs, Governed Surface Queue Guard, Dogfood Regression Gate, Test UI, Test Core and both shards, Check Changeset, Check PR Size, PR-body guards, Live required-set sweep, Platform checklist gate sweep, Release section-coverage sweep, board snapshot, Auto Label, filter, Plan Test Core shards, Live half-state sweep (31); 20 skipped by path filter; nothing in progress, no failure. The landing gate reads it again at landing time.
  • Draft PR, mergeable_state: blocked (draft); Tier S landing by the owning seat after this record and all-green.
  • Dev report deviations: platform-readings.md line skipped for zero headroom (accepted, ①.6); two ablation legs instead of one (accepted); merged: true carried beside unmerged: true on the block row (accepted, ①.3: a row shape addition, staleBlockVerdict byte-identical); assignee and review request not set at pr_create (accepted per SKILL.md 「pr_create 不请不派」); a push refused once by the auto-mode classifier then retried plain (reporting only).
  • Premise: premise_still_valid: true; the merge base 18318361f carries 「目标已关闭」 at :85, CLOSED at H28 and the always-printed open count at the mixed branch, and (closed for every note row (read off the base worktree and reproduced by the probe's base column).
  • Open edge, not blocking: #28057 also edits check-half-states.mjs and waits on this card (claim text); it will rebase over the six new pins.

④ Design judgment

Rules face, per hits file:

  • dispatch-runbook.md :85. The 旗 register is where a patrol seat reads what the two mechanical flags are, and the old line said closed for a target the reader has fired on merged since H19 learned merged_at. The edit states the PR leg and its exclusion in one parenthesis, in the same 关单 word SKILL.md :110 uses and the same 不 form state-machine.md :24 uses, inside the 120-byte line and the 245-line ceiling, paying nothing elsewhere. Against the code it describes the flag is now exactly what H19 founds a row on. Holds.
  • The code half, read as the gate the rule names: all three script edits change strings and one row key, and the probe shows the same branch, counts, verdict, label calls and body outcome on 1327 rows across the two trees. The merged key on the full-run row is the smaller of the two ways to let the note say merged (the other being to re-read merged_at at render time) and mirrors the unmerged key beside it; staleBlockVerdict ignores it. The H28 legend is honest about the one thing the shared renderer cannot show, that a bare closed on a PR means merged; the renderer itself is the right place to say merged, and that is a later card because it touches H19's rendering pins (should-fix 1). No new gate, no label write, consistent with triage.

Implemented-by: claude/project-thread-gnwty4
Reviewed-by: session_016WV4d1QkPVVzNz3FJqb2iS

VERDICT: PASS

Must-fix: none.

Should-fix (file on a follow-up card; 3 is carried from record 6519545846):

  1. blockerResolutionFromRow (check-half-states.mjs :5157) carries unmerged but no merged, so namedTargets (:5189) and namedProseCandidates render a merged PR as a bare closed, the same word as a closed issue; H28 compensates with a legend. Carry merged: true from pull_request.merged_at the way judgeCardBlock now does and render merged DATE in the two renderers, so H19, H26, H28 and the H4 prose list lines name the merge themselves; this moves H19's rendering pins, so it is its own card.
  2. The new H28 firing pin (:30784) tests the body line is , a fragment the pre-existing so the body line is STALE also matches, so it pins only that the row fired, which is what its name says; a pin on spent either way would discriminate the new sentence. Cosmetic.
  3. platform-readings.md: the measured-leg line for issue_read on a PR number (previous record's should-fix 3) is still owed and the file still has no headroom (458 of 458); it needs a line paid elsewhere in the same file.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

维护者速读

  • 改了什么:只改措辞,不改任何判定。Blocked-by: 指向的目标,按类型写成不同的词:

    • 已合并的 PR 写「已合并」;
    • 关了没合并的 PR 写「关而未合并」;
    • issue 仍写「已关」。

    改了三处:

    • dispatch-runbook.md:85 旗二;
    • check-half-states.mjs 的 H28 行文,以及 H4 混合行(不再打印「0 still read OPEN」);
    • scheduled-full-run.mjs:阻塞行带 merged: true,备注显示「(merged 日期)」。

    共 3 个文件。规则文本行数不变(245/245)。

  • 为什么改:PR fix(pm): H4 prose and the pm:blocked readings release a PR target on merge, never on close #28031 之后,PR 目标要合并才放行,但这四处读者仍把它叫作「关闭」,读的人会把废弃 PR 当成已放行。

  • 风险与回滚:复核跨新旧两棵树做了穷举探测,共 1327 行,判定、计数、标签动作、正文结果全部逐字一致,变的只有字符串。回滚就是 revert。

  • 先看:scheduled-full-run.mjs 的 judgeCardBlock / renderBlockNote,再看 check-half-states.mjs 的 H28。

  • 两分钟验证:node scripts/pm/check-half-states.mjs --self-test(5111 例)和 node scripts/ci/scheduled-full-run.mjs --self-test,均 exit 0。

  • 需要你做的:无。登记册判定为 Tier S(.claude/** ×1)。契约复核 PASS,记录在本评论之前,Head-sha: 708c0ce4475ce10924a6b00b1d794224625abb39。本席转 ready 并开自动合并。

席位意见:ACCEPT。契约复核 PASS,没有 must-fix。探测覆盖了以下组合:

  • proseBlockerClause:全部 55 种目标组合;
  • H28:432 种状态组合,新旧两边触发的都是同样的 36 行;
  • 刷新路径:768 种组合。

所有判定都没有差异,每条新字符串都与实际状态相符。should-fix 1–3 转到跟进卡 #28083:

  1. H19 和 H4 散文列表仍把已合并的 PR 印成「closed」;
  2. H28 新钉子能区分的内容不够;
  3. 给 issue_read 补一条实测行。

席位核对

  • 形态: one PR, Fixes #28033, three files: .claude/skills/pm-dispatch/references/dispatch-runbook.md (line 85, 100 bytes, line-neutral), scripts/pm/check-half-states.mjs, scripts/ci/scheduled-full-run.mjs; skip-changeset. check-governed-merges.mjs --pr 28074: Tier S (.claude/** ×1). Triage said Tier H for the .claude/** lines; the register governs, and it reads Tier S.
  • 前提实测: dispatch-runbook.md:85 is true against h19BlockOutlivedBlocker, which fires on closed && !unmerged, and agrees with SKILL.md:110 and state-machine.md:24. The merged flag is set only for a closed PR with merged_at, and never beside unmerged. Rows on base don't carry it and render as before. The scheduled-full-run.mjs --self-test runs in CI (lint.yml, job 「Lint · CI, release & engine gates」).
  • 门禁 check-runs: head 708c0ce4475ce10924a6b00b1d794224625abb39: 51 check-runs, 31 success, 20 skipped, 0 failed, 0 pending. Locally, the skill line ratchet, skill-id lint and token ratchet all exit 0. The dev report has 54 derived gate families exit 0, reconciled with --ran.
  • 接受的偏差: platform-readings.md is untouched because the file has no headroom (458/458). The optional issue_read line moves to pm(half-states): H19 and the H4 prose list still print a merged Blocked-by PR as closed; carry merged from blockerResolutionFromRow #28083.
  • 范围外去向: pm(half-states): H19 and the H4 prose list still print a merged Blocked-by PR as closed; carry merged from blockerResolutionFromRow #28083 (pm:blocked on this PR) takes review should-fixes 1–3.
  • 落地条款: Tier S: on the contract review PASS on the current head, the seat posts the record and this ACCEPT, flips the PR ready and arms auto-merge, under the maintainer's landing grant for this term (seat thread, 2026-10-29 22:04Z).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant