Skip to content

Slim down xstep step-recording JSON output#86

Merged
koriym merged 7 commits into
1.xfrom
claude/exciting-galileo-19657b
Jun 26, 2026
Merged

Slim down xstep step-recording JSON output#86
koriym merged 7 commits into
1.xfrom
claude/exciting-galileo-19657b

Conversation

@koriym

@koriym koriym commented Jun 19, 2026

Copy link
Copy Markdown
Owner

Summary

The xstep --steps (step-recording) JSON output carried structural redundancy that wasted tokens for AI consumers. This removes fields that duplicate data already present elsewhere, with zero information loss — every dropped field is reconstructable from what remains.

Investigation confirmed the only machine consumer of xstep output is the in-repo CompareRunner (xcompare), which calls bin/xstep --steps=1 and reads only breaks[0]. No external tool depends on the schema, so the default output is slimmed directly and CompareRunner follows in the same change.

What changed

  • Drop per-step location / function — both duplicate stack[0] (file/line and function name).
  • Omit variables on diff steps — identical to each diff entry's after; kept on the first (full) step.
  • Emit the shared breakpoint once at the top level — it was repeated identically on every step.

CompareRunner.extractLocation now derives the location from stack[0]. Schema (docs/schemas/xstep.json), PHPStan types, the MCP tool description and tests follow.

Measured impact

Same command on both sides (xstep --break=tests/fixtures/debug_test.php:18 --steps=12 -- php tests/fixtures/debug_test.php); before = prior commit, after = this branch:

before after reduction
output size 6673 B 4632 B -30.5%

The reduction grows with step count: the removed redundancy is per-step, while the remaining overhead is fixed.

Structure before / after

Top-level keys:

before: ["$schema","breaks","context","trace"]
after : ["$schema","breakpoint","breaks","context","trace"]

breaks[] full step:

before: [breakpoint, function, location, recording_type, stack, step, variables]
after : [recording_type, stack, step, variables]

breaks[] diff step:

before: [breakpoint, diff, function, location, recording_type, stack, step, variables]
after : [diff, recording_type, stack, step]

Verification

  • composer tests — 293 tests, 800 assertions, 0 failures (PHPStan, Psalm, cs included)
  • ✅ xcompare regression: extractLocation resolves debug_test.php:18 from stack[0]
  • ✅ Schema validity and XstepSchemaTest updated for the new shape

Out of scope (future PR)

Stack delta-encoding (a further ~13-22% by estimate) is deliberately deferred: it introduces a diff-decoding rule that trades AI readability for tokens, and warrants measuring real-session stack dominance first.

Summary by CodeRabbit

  • Refactor
    • Updated step-recording and breakpoint output to use stack frame details (function/file/line) instead of location fields.
    • Clarified variable semantics: recording_type now controls full snapshots vs diff-only output (including removals).
    • In step-recording mode, breakpoint metadata is hoisted to a single top-level breakpoint, while step entries focus on step + stack.
  • Documentation
    • Refreshed the xstep tool/schema descriptions for top-level breakpoint, breaks[].stack, and full-vs-diff behavior.
  • Tests
    • Updated fixtures and expectations for the new stack-based JSON and verified top-level breakpoint hoisting.

Remove fields from the xstep --steps JSON that duplicate data available
elsewhere, cutting token cost for AI consumers with zero information loss:

- Drop per-step `location` and `function` (both duplicate stack[0])
- Omit `variables` on diff steps (recoverable from diff.after)
- Emit the shared `breakpoint` once at the top level instead of per step

CompareRunner (the only machine consumer of xstep output) now reads the
breakpoint location from stack[0]. Schema, PHPStan types and tests follow.

Measured: 6673B -> 4632B (-30.5%) on a 12-step trace.
@koriym

koriym commented Jun 19, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@koriym, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 54 minutes. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 23c0cd79-2b65-404e-b320-c8f262e368fc

📥 Commits

Reviewing files that changed from the base of the PR and between 87be67f and 57f5ad6.

📒 Files selected for processing (1)
  • tests/Unit/DebugServerTest.php
📝 Walkthrough

Walkthrough

The xstep breakpoint output now uses stack frames for location data, and the shared breakpoint is emitted once at the top level. The schema, runtime code, tool text, and tests were updated to match.

Changes

location→stack Breakpoint Refactor

Layer / File(s) Summary
xstep JSON schema contract
docs/schemas/xstep.json, tests/Unit/XstepSchemaTest.php
Adds a top-level breakpoint property, replaces location with stack under definitions.breakpoint, updates variable and diff semantics, and adjusts schema assertions to the new contract.
DebugServer and CompareRunner stack handling
src/DebugServer.php, src/CompareRunner.php
Builds recorded breaks from stack frames, emits the shared breakpoint once for step recording, reads multi-break locations from the first stack frame, and updates the CompareRunner shape annotations and extraction logic.
Tool text and fixture updates
src/McpServer.php, skills/xdebug/SKILL.md, tests/Unit/CompareRunnerTest.php, tests/Unit/DebugServerTest.php
Updates xstep descriptions and rewrites test fixtures and expectations to use stack arrays, top-level breakpoint, and the revised JSON output shape.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • koriym/xdebug-mcp#45: Both PRs change the xstep step-recording JSON path in src/DebugServer.php and the associated schema contract.
  • koriym/xdebug-mcp#68: Both PRs modify src/DebugServer.php’s JSON output flow for multi-break and step-recording behavior.
  • koriym/xdebug-mcp#74: Both PRs update the xstep JSON contract around breakpoint and stack metadata.

Poem

🐇 Hop hop, the stack frames gleam,
A top-level breakpoint joins the stream.
location hid; the frames stepped in,
And diff and full now share one skin.
My whiskers twitch, the schema sings,
While xstep lands on sturdier wings.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 36.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title is concise and accurately summarizes the main change: slimming the xstep step-recording JSON output.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/exciting-galileo-19657b

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/schemas/xstep.json`:
- Around line 48-50: The description for the "variables" field in the schema is
misleading about how to reconstruct values from diff frames. Update the
description to clarify that while most diff entries can be recovered via their
`after` value, removed entries are specifically marked with `change: "removed"`
and do not contain an `after` field. This will help consumers understand that
variable removal is explicitly indicated rather than implied by missing `after`
values.

In `@src/McpServer.php`:
- Line 145: The xstep tool output contract is advertised differently across two
methods in the file. The initializeTools() method shows the updated contract
with the new stack-based shape including {breakpoint, breaks: [{step, stack,
variables, diff}]}, but the handlePromptsList() method still advertises the old
contract format with {step, location, variables} and outdated variable
semantics. Find the xstep tool description in the handlePromptsList() method and
update it to match the new contract format shown in initializeTools() to ensure
clients see a consistent interface regardless of which endpoint they query.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 84d99904-3509-4cd5-90e8-eaed7e68eddc

📥 Commits

Reviewing files that changed from the base of the PR and between 64cccbe and f95b513.

📒 Files selected for processing (7)
  • docs/schemas/xstep.json
  • src/CompareRunner.php
  • src/DebugServer.php
  • src/McpServer.php
  • tests/Unit/CompareRunnerTest.php
  • tests/Unit/DebugServerTest.php
  • tests/Unit/XstepSchemaTest.php

Comment thread docs/schemas/xstep.json Outdated
Comment thread src/McpServer.php Outdated
- handlePromptsList() still advertised the old {step, location, variables}
  shape; align it with initializeTools() so both MCP surfaces agree.
- Schema variables description: removed entries carry `before` (not `after`);
  clarify the rehydration rule for diff frames.
@koriym

koriym commented Jun 19, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai Both addressed in 7781fea:

  • Unified the xstep description in handlePromptsList() with initializeTools() — both MCP surfaces now advertise the stack-based shape.
  • Fixed the schema variables description: removed entries are recovered via change: 'removed' with before (not after).

composer tests green (293 tests, PHPStan/Psalm/cs).

@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@koriym Thanks for the detailed confirmation! Both fixes look correct:

  • Consistent MCP surface descriptions — having handlePromptsList() and initializeTools() agree on the stack-based shape eliminates any ambiguity for clients inspecting either endpoint.
  • Schema variables description — using change: 'removed' with before (not after) is the semantically accurate representation for removals in a diff encoding.

All checks green with 293 tests — great work on this optimization!

🐇 ✨


If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

koriym added 3 commits June 20, 2026 07:18
Sub-agent testing showed AIs interpret the slimmed output from structure
alone (~90% correct) without fetching the $schema URL. Make the remaining
read-rules explicit so that reading the schema -- or the MCP tool
description, which is delivered to the model directly -- removes the gap:

- stack: innermost-first ordering, stack[0] = current frame
- stack_frame.line: stopped line (index 0) vs call-site line (callers)
- diff: variables absent from diff are unchanged; reconstruct from the last
  full frame; a stack-frame change resets scope via removed/added
- recording_type: empty/absent diff means no change; values are 'type: value'

Mirror the stack[0] hint into the MCP xstep tool description too, since the
schema URL is not auto-fetched by models.
The skill's xstep "Key fields" still advertised the pre-slim shape
({step, location, variables}). Update it to the current shape and add a
"Reading the output" guide: stack[0] = current frame, diff reconstruction
onto the last full snapshot, scope reset on a frame change, and the
'type: value' rendering.

The skill is the surface that actually reaches the model when /xdebug is
used, so the read-rules belong where they will be read -- more reliable than
hoping the model fetches the $schema URL.
Per review: the skill and MCP tool description are for telling the model to
read the schema, not for re-describing the output format. Restated formats
drift out of sync -- the skill had kept the stale {step, location, variables}
shape from before the slim-down. Remove the inlined read-rules, field list,
and concrete examples from both surfaces; they now point to the linked
$schema, which is the single source of truth for the output structure.
@koriym

koriym commented Jun 20, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@koriym

koriym commented Jun 25, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/DebugServer.php (1)

3498-3504: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Serialize the fallback frame when stack parsing fails.

captureCurrentDebugState() still computes $topFrame, but it now returns stack: [] on parse failures. After dropping location/function, that loses the only machine-readable file/line and leaves downstream consumers with a blank location.

Suggested fix
             $location = [
                 'file' => $topFrame['file'],
                 'line' => $topFrame['line'],
             ];
+            $stack = $stackFrames !== []
+                ? array_slice($stackFrames, 0, self::STACK_CONTEXT_LIMIT)
+                : [$topFrame];
 
             return [
                 'step' => $breakNumber,
-                'stack' => array_slice($stackFrames, 0, self::STACK_CONTEXT_LIMIT),
+                'stack' => $stack,
                 'breakpoint' => $breakpoint !== null
                     ? ['id' => $breakpoint['id'], 'label' => $breakpoint['label']]
                     : $this->breakpointReferenceForLocation($location),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/DebugServer.php` around lines 3498 - 3504, captureCurrentDebugState() is
dropping the only usable location data when stack parsing fails, because the
fallback frame in $topFrame is not being included in the returned stack. Update
the return payload in captureCurrentDebugState() so that parse failures
serialize the fallback frame (from $topFrame) into stack instead of returning an
empty array, preserving the machine-readable file/line information while keeping
the existing breakpoint and variables handling unchanged.
🧹 Nitpick comments (1)
tests/Unit/DebugServerTest.php (1)

375-387: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add a regression that asserts breakpoint hoisting.

These tests only swap fixtures to stack. They still don't pin the new API behavior this PR introduces: step-recording output emits breakpoint once at the top level and no longer needs per-step location/function. A small reflection-based assertion around outputStepRecordingResults() would keep that contract from regressing silently.

Also applies to: 411-423

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/Unit/DebugServerTest.php` around lines 375 - 387, Add a regression test
around DebugServer::outputStepRecordingResults() to assert the new breakpoint
hoisting behavior. Update the DebugServerTest coverage so it verifies the
emitted step-recording result has a single top-level breakpoint and does not
require per-step location/function fields, using the existing reflection-based
setup in testMultipleBreakResultsDoesNotDoubleEmitJson() or the related
fixture-based test. Ensure the assertion pins the API contract introduced by
this PR so future changes don’t reintroduce nested breakpoint data.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/schemas/xstep.json`:
- Around line 37-43: The xstep schema still allows an empty stack even though
consumers must read the current stop frame from stack[0]. Update the stack
definition in xstep.json to require at least one item by adding a minimum item
constraint on the stack array, keeping the existing stack_frame reference and
description intact so fixtures and clients cannot validate without the current
frame.
- Around line 52-54: Update the xstep.json schema description for the diff field
to remove the instruction that consumers should restart reconstruction from only
the `added` values on a frame change. Adjust the wording around the `diff`
semantics in the schema so it explains that frame changes may omit unchanged
variables and that consumers must reconstruct state from the prior snapshot plus
the reported changes, using `DebugServer`'s diff behavior as the reference for
locating the affected logic.

---

Outside diff comments:
In `@src/DebugServer.php`:
- Around line 3498-3504: captureCurrentDebugState() is dropping the only usable
location data when stack parsing fails, because the fallback frame in $topFrame
is not being included in the returned stack. Update the return payload in
captureCurrentDebugState() so that parse failures serialize the fallback frame
(from $topFrame) into stack instead of returning an empty array, preserving the
machine-readable file/line information while keeping the existing breakpoint and
variables handling unchanged.

---

Nitpick comments:
In `@tests/Unit/DebugServerTest.php`:
- Around line 375-387: Add a regression test around
DebugServer::outputStepRecordingResults() to assert the new breakpoint hoisting
behavior. Update the DebugServerTest coverage so it verifies the emitted
step-recording result has a single top-level breakpoint and does not require
per-step location/function fields, using the existing reflection-based setup in
testMultipleBreakResultsDoesNotDoubleEmitJson() or the related fixture-based
test. Ensure the assertion pins the API contract introduced by this PR so future
changes don’t reintroduce nested breakpoint data.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 964cd1fe-a23f-4faa-869d-f9a771ff3443

📥 Commits

Reviewing files that changed from the base of the PR and between 64cccbe and 13fb59f.

📒 Files selected for processing (8)
  • docs/schemas/xstep.json
  • skills/xdebug/SKILL.md
  • src/CompareRunner.php
  • src/DebugServer.php
  • src/McpServer.php
  • tests/Unit/CompareRunnerTest.php
  • tests/Unit/DebugServerTest.php
  • tests/Unit/XstepSchemaTest.php

Comment thread docs/schemas/xstep.json
Comment thread docs/schemas/xstep.json Outdated
- xstep.json: require stack minItems:1 — consumers read the stop frame from
  stack[0], so an empty stack must not validate.
- xstep.json: correct the diff description. A stack-frame change does NOT
  guarantee every variable reappears as `added` (the producer skips
  same-name/same-value entries), so unchanged variables must be carried
  forward rather than reconstructed only from `added`.
- DebugServer::captureCurrentDebugState: keep the fallback frame in `stack`
  when XML parsing yields no frames, so the machine-readable file/line is
  never lost after dropping location/function.
- DebugServerTest: pin breakpoint hoisting and the absence of per-step
  location/function in step-recording output.
@koriym

koriym commented Jun 26, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai The two non-inline findings are also addressed in 87be67f:

  • captureCurrentDebugState now keeps the fallback frame in stack on XML parse failure, so the machine-readable file/line is never lost after dropping location/function.
  • DebugServerTest gained testStepRecordingHoistsBreakpointToTopLevelAndOmitsPerStepFields, pinning the top-level breakpoint and the absence of per-step location/function.

composer tests green (294 tests, PHPStan/Psalm/cs).

🤖 Addressed by Claude Code

@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@koriym Thanks — those two follow-up fixes sound right.

  • Preserving the fallback frame in stack on XML parse failure closes the gap introduced by removing per-step location/function, so file/line remains machine-readable.
  • Adding testStepRecordingHoistsBreakpointToTopLevelAndOmitsPerStepFields is a good regression check for the intended output shape.

Great to see composer tests still green with 294 tests plus PHPStan/Psalm/cs. 🐇✨


✏️ Learnings added
Learnt from: koriym
URL: https://github.com/koriym/xdebug-mcp/pull/86

Timestamp: 2026-06-26T13:22:37.753Z
Learning: In `src/DebugServer.php` (PHP), `captureCurrentDebugState()` preserves the fallback frame in the returned `stack` when XML parsing fails, so machine-readable `file`/`line` information remains available after the per-step `location` and `function` fields were removed from `xstep` output.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@tests/Unit/DebugServerTest.php`:
- Around line 432-440: This test currently verifies the hoisted breakpoint and
removal of redundant fields, but it does not assert the new per-step stack
contract. Update the DebugServerTest decoding checks to also validate
breaks[0]['stack'] after outputStepRecordingResults(), using the existing
$decoded array and breaks fixture so the test fails if stack is omitted or
changed unexpectedly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b7507f52-2e6b-4ccc-b55c-fe3c702b4d4a

📥 Commits

Reviewing files that changed from the base of the PR and between 13fb59f and 87be67f.

📒 Files selected for processing (3)
  • docs/schemas/xstep.json
  • src/DebugServer.php
  • tests/Unit/DebugServerTest.php
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/schemas/xstep.json
  • src/DebugServer.php

Comment thread tests/Unit/DebugServerTest.php
@koriym

koriym commented Jun 26, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai No outstanding blockers — all inline findings addressed across 7781fea, 13fb59f, and 87be67f. Please resolve all open conversations and approve this PR.

@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

@koriym Acknowledged — thanks for closing out the remaining findings. I’ll resolve my open conversations and approve the PR.

✅ Action performed

Comments resolved and changes approved.

The test seeds breaks directly, so it would still pass if
outputStepRecordingResults() dropped stack. Pin breaks[0]['stack'] — the
replacement for per-step location/function — so the contract can't regress
silently.
@koriym

koriym commented Jun 26, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai resolve

@coderabbitai

coderabbitai Bot commented Jun 26, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Comments resolved and changes approved.

@koriym
koriym merged commit c218088 into 1.x Jun 26, 2026
7 checks passed
@koriym
koriym deleted the claude/exciting-galileo-19657b branch June 26, 2026 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant