Skip to content

feat(agent-chat): expose earlier prompt index for thread rail - #26033

Closed
teamleaderleo wants to merge 15 commits into
feat-cmux-nextfrom
rail-opus-earlier-prompts-index
Closed

teamleaderleo wants to merge 15 commits into
feat-cmux-nextfrom
rail-opus-earlier-prompts-index

Conversation

@teamleaderleo

@teamleaderleo teamleaderleo commented Oct 27, 2026 •

Copy link
Copy Markdown
Collaborator

HOLD: base red web / react-apps-check hides webview test signal on feat-cmux-next (owner nx-ci); this PR touches webviews/ and lands once that check is green again.

Summary

PR A for the split rebuild of #25160. This lands the prompt-level history index and paging contract only; it has no rail consumer yet, so it changes nothing visible until the stacked rail PR lands.

"if you haven't loaded in chats ... the session rails ... should be able to still, like, gradually load that stuff in"

This reads the selected chat's _acpmux/events records that can start prompts (user_message, with turn_started, queue and turn records used to match the transcript's turn-start semantics: a turn the agent carries on opens with turn_started alone, and a prompt sent now into it goes on with it), paging backward 400 records at a time and pacing each page from idle work. The index has its own cursor and store. Index-only pages never advance the loaded transcript's firstSeq/historyFrom, fold transcript rows, or remount them.

The public contract is:

client.earlier: EarlierPromptsStore = {
  subscribe(listener: () => void): () => void,
  get(): readonly AcpmuxRow[],
}
client.loadThrough(seq: number): Promise<void>

Reading starts only once something subscribes to client.earlier (the rail, in #25160). Attach records where the index would start (below the attach page's oldest record); a pane with no rail listening pays no paging and holds no index (the last unsubscribe stops reading and drops it), so landing this PR alone changes neither the loaded transcript's behavior nor its cost. Test: a pane with no rail listening reads no earlier prompts.

loadThrough delegates to the existing loadOlder path, retaining its in-flight, selection-generation, history-epoch, and exhaustion guards. It does not write scrollTop; preserveScrollAnchorTop remains the only scroll correction. Stale index responses become inert after chat selection changes or disposal.

Coordination

nx-chat acknowledged ACK-nx-history-contract-1027: this PR owns the prompt index, while nx-chat owns logical/physical history coordinates and the existing row-id prepend anchor. Their historyCoordinates work consumes event sequence and page geometry separately.

Tests

  • thread-rail-earlier-prompts.test.ts: 4,000-prompt paging, stable rows, prompt extraction, failed-read stop, stale in-flight disposal/chat switch, index-only cursor/row identity invariants, loadThrough materialization/no-scroll invariant, continuation across maxBytes page boundaries, and final pending-batch publication after a failed read.
  • agent-pane-history-paging.test.ts existing browser-lane history paging coverage is retained.
  • bun test test/thread-rail-earlier-prompts.test.ts test/agent-pane-history-paging.test.ts — 19 pass, 1 browser-lane skip outside CI/Freestyle.
  • Targeted vp fmt and git diff --check pass.

Failed-result delta

A failed turn_result now clears continued, including UNKNOWN boundary state. The next prompt is therefore a definite new turn even if older paging fails or reaches the 200-page cap. Both stop-path regressions fail on 1c1fd5d4 and pass after the fix; each asserts the prompt is visible and published exactly once. All 19 index tests, including the 235 generated splits and cap-cost tests, pass.

Boundary state, publication, and cost

The retained window starts with unknown open, interrupting, and continued fields until the server reports exhaustion (or seq 1 is reached). Reaching the 200-page cap, a no-progress page, or a failed read does not invent a closed boundary. A prompt whose classification still depends on older records stays out of the visible index until resolved.

"This prompt or nothing" ({ maybe }) only lives while the boundary is unknown: when an older page resolves it (say, to idle), the newer page is evaluated again from the resolved input, and the maybe is replaced by what that input says. a prompt sent now while idle stays on the rail once older pages say no turn ran checks this at every page split around queue_order / user_message (acpmux promotes a queued prompt with no turn running, queue_edit.rs).

Each record caches its incoming state. Older context can only refine one of the three fields from unknown to known; replay starts at the changed boundary and stops on matching input/output state. Once outgoing state is fixed, transition records behind it are dropped. Unresolved records retain only seq/kind/direction and the four transition fields; queue payloads and unrelated metadata are discarded. Prompt records still needed for display or late-sender refresh are retained separately.

Publication tracks the last published version, independently of the row count. Equal-count dirtiness flushes at the end of a page; ordinary growth remains batched. Failure and other terminal stops flush any unpublished version, while chat switch/disposal invalidates responses and clears state without publishing stale rows. There is at most one publication per page, and terminal flushes do not duplicate an already published version.

Both new regressions fail on 8885fc97: the cap no longer shows an unresolved continuation, and the equal-count replacement becomes observable before the next page/read failure. The original boundary regressions and all 235 generated page-size/byte-budget comparisons still pass.

Cost at the 200 × 400-record cap

The worst-case transition bound is 6N = 480,000, down from about 8 million: one initial evaluation and at most five incoming-field refinements per record (open once; each prompt field from unknown to "this prompt or nothing" to known). A prompt sent now at the unread boundary is that prompt or nothing (no turn running interrupts nothing), so its later removal or refusal, or a prompt with another id, settles the next prompt without older history. No transition work runs on streamed tokens.

cap cost stays linear and releases payloads after state becomes known measures 80,000 rowless records carrying 19,350,000 serialized input bytes:

cap fixture transitions retained transition payload bytes retained transition records
Older history still unknown at cap 80,000 5,749,799 80,000
Exhaustion resolves the boundary on page 200 159,600 0 0

5,749,799 bytes is the worst measured retained transition payload in this harness, a 70.3% reduction from its raw input. It is serialized payload, not a heap measurement: JS objects/state snapshots and displayed/refreshable prompt content are additional. There is no universal 5.75 MB total-memory guarantee: arbitrary prompt text and prompt-ID lengths remain payload dependent. The prior ~19 MB raw paging payload is no longer retained wholesale merely to replay transitions.

Timers and stop conditions

  • Nothing is read until earlier.subscribe has a listener.
  • One idle callback schedules at most one 400-record page.
  • A chat switch or dispose cancels the idle callback and invalidates the response generation.
  • A failed read flushes the final pending batch before stopping; empty page, repeated cursor, exhausted page, or the 200-page safety bound also stops and flushes.
  • A chat switch or dispose clears the index without publishing stale rows.
  • loadThrough stops when the requested row is materialized, history is exhausted, the cursor cannot advance, or the session becomes stale.

Screenshots

None apply: this PR draws nothing, and there is no after image to view. No component reads client.earlier or calls loadThrough, and the index reads nothing until one subscribes, so the pane renders byte-for-byte as on base. The rail's before/after belongs to #25160, its consumer.

Changelog

No visible change in this PR; the consumer is in stacked PR #25160.

Agent session: agent session

teamleaderleo and others added 2 commits October 27, 2026 07:18
Leo 2026-10-25: "if you haven't loaded in chats ... the session rails ...
should be able to still, like, gradually load that stuff in". A long chat
opens on its tail; the pane now reads the chat's older turn-start records
(user_message, queue_order, turn_result, queue_removed, prompt_refused)
from acpmux, one page of 400 per idle callback, and keeps the prompts that
open a turn by the transcript's rule (TurnStarts: steers and prompts sent
now that continue the turn they stopped open none). Pages append their own
rows; the rail reads them from their own store (client.earlier), told once
they grow by half. Rows are built as the transcript builds them, again when
a sender is listed late, and keyed by promptId (turnKey, #25161).

Stops when acpmux has nothing older, after 200 pages, on a failed read, on
a chat switch or close. The rail draws them in the PR stacked on this one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a16f7b-11f6-73e0-8276-7c0e3bb3ead4&host=huge-blue
@github-actions

github-actions Bot commented Oct 27, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review 76b7865: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr26033 -f ref=rail-opus-earlier-prompts-index -f platform=macos -f backend_mode=local

Passes: CI passes on 76b78659a5.

CI passes on 76b78659a5 (run 41135802506 attempt 1).

Written by scripts/ci/classify_failures.py (ci-failure-attribution.yml); signatures are its SIGNATURES table. A machine verdict is the runner's fault, not this PR's; yours means the failing file is one this PR changes, also red on main that main's latest full suite fails the same way, seen on other PRs that it failed on another pull request's run lately.

web and size checks: green

Gallery before/after for 76b7865: 16 states rendered, 1 images differ, 2521 more touched states not rendered. Images are in the run's artifact, not on this public PR.

gh run download 41135244908 -R manaflow-ai/cmux -n gallery-advisory-26033-76b78659a5a7cc3d7a308bc9702e78316dabb35c (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.live-chat-watch/choice-alone Apple System Colors Light unchanged 0% own direct.ts
agent-pane.live-chat-watch/choice-alone Apple System Colors unchanged 0% own direct.ts
agent-pane.live-chat-watch/view-only Apple System Colors Light unchanged 0% own direct.ts
agent-pane.live-chat-watch/view-only Apple System Colors unchanged 0% own direct.ts
agent-pane.auth-health/signed-in Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.auth-health/signed-in Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.auth-health/signed-out Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.auth-health/signed-out Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.auth-health/expired Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.auth-health/expired Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.auth-health/unknown Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.auth-health/unknown Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/standard Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/standard Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/wide Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/wide Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/wide-blocks Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.chat-width/wide-blocks Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-edge/short-edge Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-edge/short-edge Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-edge/wide-edge Apple System Colors changed 0.0059% imports direct.ts (1 hops)
agent-pane.composer-edge/wide-edge Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-edge/no-edge Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-edge/no-edge Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/scrolled-to-end Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/scrolled-to-end Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/composer-grown Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.composer-floats/composer-grown Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.continuation-spacing/shipped Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.continuation-spacing/shipped Apple System Colors unchanged 0% imports direct.ts (1 hops)
agent-pane.continuation-spacing/two-thirds Apple System Colors Light unchanged 0% imports direct.ts (1 hops)
agent-pane.continuation-spacing/two-thirds Apple System Colors unchanged 0% imports direct.ts (1 hops)

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 27, 2026
@blacksmith-sh

blacksmith-sh Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

Found 1 test failure on Blacksmith runners:

Failure

Test View Logs
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)/
test_every_listed_hook_is_one_glaeda_released_with_the_check (main.SigningHooksInSt
epWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Bead cx-rshpsr created for this PR by the cmux coordinator.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

cmux-next guards / nightly-guards / workflow-guard-tests / release-notary is red on 12 of 18 fresh feat-cmux-next PR heads in the last 2:00:00, so it is most likely a base red, not this PR's. The base-reds lane has it; a base merge picks up the fix once it lands.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra xhigh, next-review): SHIP at 181d979

No blocking findings.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Orphaned: no activity for 14 h, and no lane holds a lease on it. Adopted by the orphan sweep: merged feat-cmux-next in at 8e78987. A later pass queues it for the merge hub if it is reviewed, small and red only on base reds.

teamleaderleo and others added 2 commits October 30, 2026 13:57
…arlier-prompts-index

# Conflicts:
#	webviews/src/agent-session/acpmux/direct.ts
…scribes

The index had no consumer yet but paged up to 200 pages of turn-start
records on every attach with older history. It now records where to start
and reads only when `earlier.subscribe` has a listener, so a pane with no
rail mounted pays no paging and holds no index. Restores the retry-
continuation comment lost when the prompt reading moved to shownPrompt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 2f0cb9a

BLOCK

Visual verdict: BLOCK — this webviews/ change has no after screenshots; README.txt confirms none were supplied.

  1. direct.ts — Unsubscribing the last earlier listener only removes it from the set. Any in-flight read continues scheduling up to 200 pages and retains the index despite having no consumer, contradicting the stated “no rail listening pays no paging and holds no index” behavior. The last unsubscribe should cancel and clear the index.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
… index

Review (gpt-6-astra): an in-flight read kept paging after the rail went
away. The last unsubscribe now stops reading and drops the index; a later
subscriber reads again from where the transcript starts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 4bb0f05

BLOCK

Visual verdict: No visual change; no after screenshot applies.

  1. webviews/src/agent-session/acpmux/threadMinimap/earlierPrompts.ts:113-131 — A page-boundary queue_order stores only UNKNOWN for interrupting, losing the prompt ID. If the matching prompt is then queue_removed or prompt_refused, it cannot clear that unknown state. The following successful turn_result sets continued back to UNKNOWN, so the next real prompt remains hidden when paging stops on a read failure or the 200-page cap, despite its continuation being definitively cancelled. Retain the pending prompt ID separately so removal/refusal resolves this state.

Focused tests could not run because bun is unavailable in the environment.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
…mpt or nothing

Review (gpt-6-astra): a queue_order at the page boundary stored only
UNKNOWN, so its later removal or refusal, or a prompt with another id,
could not settle the next prompt's turn when paging stopped. With no turn
running nothing is interrupted, so the field is that prompt or nothing;
track it as such. Worst-case transitions are 6N (still linear).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 42a5a1e

BLOCK

Visual verdict: Incomplete—no after screenshots were supplied, and the PR body contains no confirmation that the landing lane viewed one.

  1. [P2] Carried turns produce incorrect prompt entries — earlierPrompts.ts:15. TURN_KINDS omits turn_started, which can open a carried turn without another user_message. Sending a queued prompt “now” during that turn produces a continuation in the transcript, but a new opening prompt in this index. A standalone reproduction indexed both root and now; the transcript’s transitions classify now as a continuation. Include these turn starts in the filter and state machine.

  2. [P2] Unsubscribing retains the indexed prompt payloads — earlierPrompts.ts:238. stop() clears chunks but leaves memo.all and memo.shown referencing their rows. After the last unsubscribe, those references persist until another shown() call, contradicting the promised release. Reproduced with a million-character prompt still retained after stopping. Clear memo during cleanup.

  3. Required visual evidence is missing — pr.body:74. The supplied exemption does not satisfy your explicit screenshot requirement for webviews/ diffs. Supply an after capture and the landing lane’s viewing confirmation.

Validation: standalone index reproductions ran through Babel/Node. The requested Bun suites could not run because Bun and project dependencies are absent.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
…last answer

Review (gpt-6-astra): a turn the agent carries on opens with turn_started
and no prompt, and a prompt sent now into it goes on with it in the
transcript; the index did not read turn_started and showed it as a new
turn. It now does, as the transcript's turnOpen does. stop() also drops
the memoized answer, so a stopped index keeps no prompt text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at bb733c6

BLOCK

Visual verdict: No after screenshots were supplied; the PR has no UI consumer yet.

  1. Idle queue_order(next) prompts can disappear from the index — earlierPrompts.ts:146

    When a page starts with unknown boundary state, queue_order(next) stores { maybe: promptId }. If an older page later establishes that no turn was running (open === false), this branch leaves that Maybe value unchanged. The subsequent dequeued is ignored, and the prompt’s user_message therefore returns undefined from names(...), so it is never added as a new turn.

    This sequence is valid: the daemon’s interrupt path explicitly supports promoting a queued prompt when no turn is running (queue_edit.rs:412). Add a regression covering a page split around queue_order/dequeued/user_message with older state resolving to idle; the prompt should remain visible.

Focused tests could not be run because bun is unavailable in the review environment.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
…very page split

Review (gpt-6-astra) asked for this regression: a queue_order(next) seen
with an unknown boundary, then resolved to idle by an older page. Each
page split re-evaluates the newer page from the resolved input, so the
prompt opens its own turn; the test covers every split.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-d750cf10922c785efa64
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Review (codex gpt-6-astra high, router-review): BLOCK at 76b7865

BLOCK

Visual verdict: BLOCK — no after screenshots or landing-lane confirmation were supplied, so the required visual comparison cannot be completed.

  1. [P2] Late results misclassify continuation prompts. earlierPrompts.ts:158 processes every turn_result, unlike the transcript’s turn-identity guard. Reproduced: A starts, B starts, A’s delayed result arrives, then C interrupts B. The transcript marks C continues: true, but client.earlier includes C as a new turn. Preserve turn identity in boundary records and ignore stale results consistently with the transcript.

  2. Required visual evidence is missing. pr.body:76 explicitly omits screenshots and contains no confirmation that the landing lane viewed an after image. This fails the supplied review rule for webviews/ changes despite the absence of a consumer.

Verification: reproduced finding 1 using the actual client and index through a Babel/Node harness with UI dependencies stubbed. The requested Bun tests could not run because Bun is unavailable.

@teamleaderleo teamleaderleo removed the risk:normal Risk tier (docs/ci/risk-tiers.md) label Oct 30, 2026
@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Blocker (not landing yet): the index re-implements the transcript's turn-start reducer and keeps diverging from it.

What changed at 76b78659: merged base (1,866 commits; one import conflict in direct.ts), and fixed three gpt-6-astra review findings with regressions:

  • The index reads nothing until something subscribes to client.earlier, and the last unsubscribe stops reading and drops it. With no consumer, this PR now changes neither the loaded transcript's behavior nor its cost.
  • A prompt sent now at an unread boundary is "that prompt or nothing", so its removal or refusal settles the next prompt.
  • turn_started is read (agent-carried turns), and stop() drops the memoized rows.

Fleet: thread-rail-earlier-prompts 27/27, browser-lane agent-pane-history-paging 3/3, no new tsc errors.

The 4th review still BLOCKs at 76b78659 with another real divergence: a late turn_result (A starts, B starts, A's result arrives, then C interrupts B). The transcript ignores it through its turn-identity guard (reduceEvent: runningTurnId, endedTurns, supersededTurns, the compaction fence), but TurnStarts closes the turn, so the rail shows C as a new turn. turn_end also closes turnOpen in the transcript and is not in TURN_KINDS. Each round has found a new case of this kind, so patching them one at a time won't converge.

What landing needs, here or in PR B (#25160):

  1. One turn-start reducer, extracted from direct.ts reduceEvent (turn open/close, the late-end guard, send-now interrupting/continuations, removal/refusal), used by both the transcript and EarlierPrompts. A "maybe" state at an unread boundary is fine; a second copy of the rules is the problem.
  2. TURN_KINDS covering every kind that reducer reads (add turn_end, turn_error and the compaction records), within acpmux's 8-kind filter, or a daemon-side filter for "records that move turn state".
  3. The existing generated-split test, extended with late and duplicate results, turn_end and compaction fences, compared against the transcript, as it already does for send-now.

The HOLD line stays.

@teamleaderleo

Copy link
Copy Markdown
Collaborator Author

Superseded by #29632 (merged): the prompt rail now gets every earlier prompt from the acpmux prompt index on first frame, so this client-side index (whose open blocker was its divergence from the transcript reducer) is no longer needed. Closing.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — 76b78659 Deployed Oct 30, 2026 by teamleaderleo via cmux-tui tree preflight #85286
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant