[PR #7105] [MERGED] fix(macho): derive the runtime name of each Mach-O symbol #7644

Closed
opened 2026-11-03 13:39:20 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/7105
Author: @kaoru0822-kitauji
Created: 10/25/2026
Status: ✅ Merged
Merged: 10/25/2026
Merged by: @kaoru0822-kitauji

Base: main ← Head: fix/5298-macho-symbol-names


📝 Commits (1)

  • fd92e50 fix(macho): derive the runtime name of each Mach-O symbol

📊 Changes

12 files changed (+142 additions, -20 deletions)

View changed files

📝 .agents/skills/reverse-engineer-anything/references/native-and-artifacts.md (+3 -2)
📝 docs/native-investigation.md (+20 -9)
📝 src/contracts/managed/managedWorkflowExamples.ts (+1 -0)
📝 src/domain/analysisView/machoView.test.ts (+2 -0)
📝 src/domain/managed/managedNativeVerificationMatch.ts (+7 -5)
➕ src/domain/native/machoSymbolName.test.ts (+49 -0)
➕ src/domain/native/machoSymbolName.ts (+22 -0)
📝 src/domain/native/nativeCallObservation.ts (+1 -1)
📝 src/domain/native/nativeInspection.ts (+11 -0)
📝 src/native/NativeMachoInspection.ts (+14 -2)
📝 tests/boundary/mcp/nativeMachoSummaryMcp.test.ts (+2 -0)
📝 tests/boundary/providers/native/nativeInventory.golden.test.ts (+10 -1)

📄 Description

What broke: inspect_macho names a Mach-O function by its symbol-table spelling (_main), but LLDB and observe_native_calls use the runtime spelling (main). A name copied from static output silently selected a different function (_main resolved only to AppKit's -[_NSLegacyFilePromiseCoordinator _main]), so results from the two tools could not be joined by name.
Fix: name stays the exact symbol-table fact. Every export and import row gains a derived runtime_name, produced by one shared owner (src/domain/native/machoSymbolName.ts) that removes the single leading underscore Darwin adds. Managed P/Invoke verification now uses that owner instead of its own underscore stripping.
Risk: The change only adds a field. Evidence retained before this change parses with runtime_name: null. Rows get larger: one measured 64-row import page of a Swift app grew 11,835 → 16,565 bytes.

Summary

Fixes #5298

The issue's original coverage framing was withdrawn in #5299. The remaining defect is a naming mismatch between REA's static and runtime Mach-O outputs. observe_native_calls already documents that it does not translate breakpoint names (d397ac742), and that contract is unchanged here. What was missing is a static output that gives the runtime spelling, so callers had to apply the Darwin convention themselves.

Problem and expected behavior

  • Smallest trigger: a C executable with main. inspect_macho reports export _main at 0x1000004e0, and observe_native_calls reports location symbol main at file address 0x1000004e0. The breakpoint {"kind":"function","name":"_main"} resolves one location in AppKit and none in the executable.
  • Violated invariant: an identity that one REA tool emits should be usable as the lookup value in a related REA tool, with the source spelling kept separate from the derived lookup spelling.
  • Expected: static output keeps the source fact and gives a derived runtime name that callers can pass to observe_native_calls directly.

Change and scope

  • New shared owner machoRuntimeSymbolName (src/domain/native/machoSymbolName.ts). It removes exactly one leading _ and leaves names without one (-[Class sel], local labels) unchanged. It returns null for a null name, an empty name, or a bare _. This matches what LLDB reported on this machine for C, C++, Swift and ObjC symbols (see Evidence).
  • inspect_macho export and import rows gain runtime_name, derived once in the producer (NativeMachoInspection.normalizeMacho). An ambiguous chained import (name: null) gets runtime_name: null.
  • verify_managed_native_boundaries previously stripped the underscore itself (normalizedSymbolName). That copy is removed; it now calls the shared owner on the retained raw name, so Evidence that predates the field still matches exactly as before.
  • The observe_native_calls function-breakpoint name description, docs/native-investigation.md and the skill reference now point callers to runtime_name. The doc also explains that event/location symbol values are LLDB display names, demangled for C++ and Swift. Those values are joined through breakpoint_index plus the request name, or through file_address plus the export address.
  • Not included: no translation of breakpoint requests, no change to the observation result schema or the LLDB bridge, and no change to Hopper/Ghidra/IDA procedure names.

Contribution scope: an ordinary fix within existing boundaries; no maintainer scope decision is needed.

Contract and boundary impact

  • Semantic owner and earliest changed stage: src/domain/native/machoSymbolName.ts (domain), used by the Mach-O producer (src/native/NativeMachoInspection.ts) and the managed matcher (src/domain/managed/managedNativeVerificationMatch.ts). The duplicated underscore stripping in the managed matcher was removed.
  • Contribution scope fit and linked maintainer decision: not applicable (existing tool, additive field).
  • CLI and MCP/tool-catalog contract: inspect_macho output schema adds runtime_name (string | null) to exports.items[] and imports.items[], and the inspect_analysis_view Mach-O rows carry it as well. The meaning of existing fields is unchanged. The observe_native_calls breakpoint name description text changed.
  • Provider, bridge, target-format, or platform compatibility: Mach-O only. No bridge changes.
  • Evidence, artifact, provenance, or reconstruction contract: name remains the exact source value. runtime_name is derived and documented as such. For older Evidence it defaults to null, documented as "predates this field".
  • Target selection, authority, upstream behavior, and cleanup details: not applicable.
  • Generated metadata: product catalog and skill metadata regenerate in CI. docs:check and metadata:check passed locally. No committed build outputs.

Expected effects:

  • Read existing files or captured data.
  • Launch or attach to a process.
  • Inject instrumentation or run scripts/code.
  • Change process memory, registers, files, or configuration.
  • Contact network services.
  • Recover protected code or work around protections.
  • Documentation or usability only; no target interaction.
  • Not sure yet; investigation or maintainer guidance needed.

Evidence and regression coverage

  • Tests added or updated:

    • src/domain/native/machoSymbolName.test.ts: C, Itanium __Z…, Swift _$s… and legacy __T0…, _OBJC_CLASS_$_…, __OBJC_$_…, objc_msgSend$… stubs, ___stack_chk_fail; unchanged -[C sel], +[C sel], ltmp0, radr://…, leading space, case; null for null, "" and _.
    • tests/boundary/providers/native/nativeInventory.golden.test.ts: the producer derives runtime_name for nm/dyld_info exports and imports, and gives null for an ambiguous chained import. This fails on base because the field is absent.
    • tests/boundary/mcp/nativeMachoSummaryMcp.test.ts, src/domain/analysisView/machoView.test.ts: paged rows with runtime_name validate against the advertised MCP output schema and keep exact row shapes (export rows still precede import rows in the union).
    • Unchanged and passing: managed verification conformance tests, whose fixtures have no runtime_name (old Evidence shape). _open_native still verifies against import open_native, and the underscore-declared import case still stays unresolved.
  • Base reproduction (executed on origin/main 160d821ac, macOS arm64, LLDB lldb-2100.0.17.203, using the issue's objetivo.c): breakpoint main → 35 locations including objetivo:main; _main → 1 location, AppKit:-[_NSLegacyFilePromiseCoordinator _main]; main with module: objetivo → objetivo:main. inspect-macho export: _main at 0x1000004e0.

  • Real-app check with this branch (built CLI). Each binary was compiled locally. Every function export's runtime_name and raw name were passed as module-scoped breakpoints:

    binary name → runtime_name breakpoint on runtime_name breakpoint on name
    C _main → main, _rea_add → rea_add 1 location, event hit; event file_address equals the export address 0 locations (reported unresolved)
    C++ __ZN3rea3addEii → _ZN3rea3addEii, _c_add → c_add 1 location (rea::add(int, int)), event hit 0 locations
    Swift _$s5swbin6reaAddyS2i_SitF → $s5swbin6reaAddyS2i_SitF 1 location, event hit 0 locations
    ObjC _main → main; -[ReaThing addA:b:] is unchanged (LLDB names it the same way) 1 location; event hit on reruns 0 locations

    In the first ObjC run the main breakpoint was hit but recorded under other_stops rather than as an event. Two reruns recorded it normally. That looks like flakiness unrelated to naming, since this PR does not touch the tracer.

  • User-visible output (CLI inspect-macho --format json, C binary): {"name":"_main","runtime_name":"main","address":"0x1000004e0",…}, import {"name":"_printf","runtime_name":"printf",…}.

  • Cost: in the full Evidence for Calculator.app (1 export, 2059 Swift-heavy imports), normalized_result grew from 399,070 to 537,169 bytes (+34.6%). A 64-row imports page grew from 11,835 to 16,565 bytes. For the C binary the growth was 10,086 to 10,193 bytes. These are byte counts, not token counts. MCP delivers inspect_macho as a summary by default, so rows are paid for only when a caller pages them. inspect-macho on Calculator took 1.89 s wall time with a 421 MB peak RSS; no before/after timing comparison was made, and the derivation is one string slice per row.

  • Remaining proof gaps: x86_64 and other hosts were not run. Swift/C++ symbols were checked only with exports from locally built binaries, not third-party apps. Observation symbol remains the LLDB display name, so a C++/Swift event cannot be joined to runtime_name by string equality; it is joined via breakpoint_index or the address.

Boundary regressions: malformed/unknown names (null, empty, bare _) and source-value preservation are covered. Lifecycle regressions: not applicable.

  • Observed, derived, and inferred claims remain distinguishable.
  • Artifact identity, source provenance, and failed attempts remain preserved.
  • Unsupported, incomplete, unavailable, or uncertain outcomes remain visible.

Validation performed

  • npm run test:local -- src/domain/native/machoSymbolName.test.ts src/domain/analysisView/machoView.test.ts src/contracts/toolEffects.test.ts src/native/NativeMachoInspection.test.ts: 4 files, 41 tests passed
  • npm run test:focused -- the native inventory/provider/UUID-less/selected-architecture/re-export goldens, the native exports filesystem test, the Mach-O summary MCP test, the managed native verification conformance and adapter tests, the managed unknown-identity MCP test, the missing-UUID CLI test, and the output-schema semantic constraints test: 12 files, 178 tests passed. The first run failed in nativeMachoSummaryMcp because of the fixture shape; the fixture was updated and rerun (3/3 passed).
  • npm run test:local -- src/contracts/toolInputReferences.test.ts, then npm run test:focused -- the native call observation tests, tool schema validity, native call MCP, local tool contracts, direct analysis factories, the native inventory golden and the Mach-O summary MCP test: 34 tests passed, then 7 files and 86 tests passed
  • npm run check:fast: passed
  • npm run format:check: passed
  • npm run metadata:check: passed
  • npm run docs:check: passed
  • Real LLDB runs with the CLI: base repro and the branch table above

Compatibility, safety, and release

  • Breaking changes or migration steps: none. The field is additive. Retained Evidence from earlier versions parses with runtime_name: null.
  • Real Hopper/Ghidra, browser, or OS coverage: macOS 26 arm64 with Apple LLDB only.
  • Package or release metadata impact: none beyond regenerated catalogs.
  • Security, privacy, process, or containment review: no new process, file or network behavior.

Author readiness

Human owner: @kaoru0822-kitauji

  • I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work.
  • I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps.
  • I declare this PR ready for initial maintainer review.

Before merge

  • This PR addresses a concrete problem or an agreed enhancement.
  • Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff.
  • The PR has one focused outcome and the title follows type(scope): outcome.
  • Related issue is linked, or the reason for not linking one is stated above.
  • Tests cover changed observable behavior and meaningful failure paths.
  • Owning docs, contracts, and generated metadata are updated where needed.
  • User-visible CLI/MCP changes include representative output.
  • I checked the final diff for secrets, unrelated cleanup, and unsupported claims.

🤖 Generated with Claude Code


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/morluto/rea/pull/7105 **Author:** [@kaoru0822-kitauji](https://github.com/kaoru0822-kitauji) **Created:** 10/25/2026 **Status:** ✅ Merged **Merged:** 10/25/2026 **Merged by:** [@kaoru0822-kitauji](https://github.com/kaoru0822-kitauji) **Base:** `main` ← **Head:** `fix/5298-macho-symbol-names` --- ### 📝 Commits (1) - [`fd92e50`](https://github.com/morluto/rea/commit/fd92e507efbd45f0028d97ff0ba123c787989bec) fix(macho): derive the runtime name of each Mach-O symbol ### 📊 Changes **12 files changed** (+142 additions, -20 deletions) <details> <summary>View changed files</summary> 📝 `.agents/skills/reverse-engineer-anything/references/native-and-artifacts.md` (+3 -2) 📝 `docs/native-investigation.md` (+20 -9) 📝 `src/contracts/managed/managedWorkflowExamples.ts` (+1 -0) 📝 `src/domain/analysisView/machoView.test.ts` (+2 -0) 📝 `src/domain/managed/managedNativeVerificationMatch.ts` (+7 -5) ➕ `src/domain/native/machoSymbolName.test.ts` (+49 -0) ➕ `src/domain/native/machoSymbolName.ts` (+22 -0) 📝 `src/domain/native/nativeCallObservation.ts` (+1 -1) 📝 `src/domain/native/nativeInspection.ts` (+11 -0) 📝 `src/native/NativeMachoInspection.ts` (+14 -2) 📝 `tests/boundary/mcp/nativeMachoSummaryMcp.test.ts` (+2 -0) 📝 `tests/boundary/providers/native/nativeInventory.golden.test.ts` (+10 -1) </details> ### 📄 Description **What broke:** `inspect_macho` names a Mach-O function by its symbol-table spelling (`_main`), but LLDB and `observe_native_calls` use the runtime spelling (`main`). A name copied from static output silently selected a different function (`_main` resolved only to AppKit's `-[_NSLegacyFilePromiseCoordinator _main]`), so results from the two tools could not be joined by name. **Fix:** `name` stays the exact symbol-table fact. Every export and import row gains a derived `runtime_name`, produced by one shared owner (`src/domain/native/machoSymbolName.ts`) that removes the single leading underscore Darwin adds. Managed P/Invoke verification now uses that owner instead of its own underscore stripping. **Risk:** The change only adds a field. Evidence retained before this change parses with `runtime_name: null`. Rows get larger: one measured 64-row import page of a Swift app grew 11,835 → 16,565 bytes. ## Summary Fixes #5298 The issue's original coverage framing was withdrawn in #5299. The remaining defect is a naming mismatch between REA's static and runtime Mach-O outputs. `observe_native_calls` already documents that it does not translate breakpoint names (d397ac742), and that contract is unchanged here. What was missing is a static output that gives the runtime spelling, so callers had to apply the Darwin convention themselves. ## Problem and expected behavior - Smallest trigger: a C executable with `main`. `inspect_macho` reports export `_main` at `0x1000004e0`, and `observe_native_calls` reports location symbol `main` at file address `0x1000004e0`. The breakpoint `{"kind":"function","name":"_main"}` resolves one location in AppKit and none in the executable. - Violated invariant: an identity that one REA tool emits should be usable as the lookup value in a related REA tool, with the source spelling kept separate from the derived lookup spelling. - Expected: static output keeps the source fact and gives a derived runtime name that callers can pass to `observe_native_calls` directly. ## Change and scope - New shared owner `machoRuntimeSymbolName` (`src/domain/native/machoSymbolName.ts`). It removes exactly one leading `_` and leaves names without one (`-[Class sel]`, local labels) unchanged. It returns null for a null name, an empty name, or a bare `_`. This matches what LLDB reported on this machine for C, C++, Swift and ObjC symbols (see Evidence). - `inspect_macho` export and import rows gain `runtime_name`, derived once in the producer (`NativeMachoInspection.normalizeMacho`). An ambiguous chained import (`name: null`) gets `runtime_name: null`. - `verify_managed_native_boundaries` previously stripped the underscore itself (`normalizedSymbolName`). That copy is removed; it now calls the shared owner on the retained raw `name`, so Evidence that predates the field still matches exactly as before. - The `observe_native_calls` function-breakpoint `name` description, `docs/native-investigation.md` and the skill reference now point callers to `runtime_name`. The doc also explains that event/location `symbol` values are LLDB display names, demangled for C++ and Swift. Those values are joined through `breakpoint_index` plus the request `name`, or through `file_address` plus the export `address`. - Not included: no translation of breakpoint requests, no change to the observation result schema or the LLDB bridge, and no change to Hopper/Ghidra/IDA procedure names. Contribution scope: an ordinary fix within existing boundaries; no maintainer scope decision is needed. ## Contract and boundary impact - Semantic owner and earliest changed stage: `src/domain/native/machoSymbolName.ts` (domain), used by the Mach-O producer (`src/native/NativeMachoInspection.ts`) and the managed matcher (`src/domain/managed/managedNativeVerificationMatch.ts`). The duplicated underscore stripping in the managed matcher was removed. - Contribution scope fit and linked maintainer decision: not applicable (existing tool, additive field). - CLI and MCP/tool-catalog contract: `inspect_macho` output schema adds `runtime_name` (`string | null`) to `exports.items[]` and `imports.items[]`, and the `inspect_analysis_view` Mach-O rows carry it as well. The meaning of existing fields is unchanged. The `observe_native_calls` breakpoint `name` description text changed. - Provider, bridge, target-format, or platform compatibility: Mach-O only. No bridge changes. - Evidence, artifact, provenance, or reconstruction contract: `name` remains the exact source value. `runtime_name` is derived and documented as such. For older Evidence it defaults to null, documented as "predates this field". - Target selection, authority, upstream behavior, and cleanup details: not applicable. - Generated metadata: product catalog and skill metadata regenerate in CI. `docs:check` and `metadata:check` passed locally. No committed build outputs. Expected effects: - [x] Read existing files or captured data. - [ ] Launch or attach to a process. - [ ] Inject instrumentation or run scripts/code. - [ ] Change process memory, registers, files, or configuration. - [ ] Contact network services. - [ ] Recover protected code or work around protections. - [ ] Documentation or usability only; no target interaction. - [ ] Not sure yet; investigation or maintainer guidance needed. ## Evidence and regression coverage - Tests added or updated: - `src/domain/native/machoSymbolName.test.ts`: C, Itanium `__Z…`, Swift `_$s…` and legacy `__T0…`, `_OBJC_CLASS_$_…`, `__OBJC_$_…`, `objc_msgSend$…` stubs, `___stack_chk_fail`; unchanged `-[C sel]`, `+[C sel]`, `ltmp0`, `radr://…`, leading space, case; null for `null`, `""` and `_`. - `tests/boundary/providers/native/nativeInventory.golden.test.ts`: the producer derives `runtime_name` for nm/dyld_info exports and imports, and gives null for an ambiguous chained import. This fails on base because the field is absent. - `tests/boundary/mcp/nativeMachoSummaryMcp.test.ts`, `src/domain/analysisView/machoView.test.ts`: paged rows with `runtime_name` validate against the advertised MCP output schema and keep exact row shapes (export rows still precede import rows in the union). - Unchanged and passing: managed verification conformance tests, whose fixtures have no `runtime_name` (old Evidence shape). `_open_native` still verifies against import `open_native`, and the underscore-declared import case still stays unresolved. - Base reproduction (executed on `origin/main` 160d821ac, macOS arm64, LLDB `lldb-2100.0.17.203`, using the issue's `objetivo.c`): breakpoint `main` → 35 locations including `objetivo:main`; `_main` → 1 location, `AppKit:-[_NSLegacyFilePromiseCoordinator _main]`; `main` with `module: objetivo` → `objetivo:main`. `inspect-macho` export: `_main` at `0x1000004e0`. - Real-app check with this branch (built CLI). Each binary was compiled locally. Every function export's `runtime_name` and raw `name` were passed as module-scoped breakpoints: | binary | `name` → `runtime_name` | breakpoint on `runtime_name` | breakpoint on `name` | |---|---|---|---| | C | `_main` → `main`, `_rea_add` → `rea_add` | 1 location, event hit; event `file_address` equals the export `address` | 0 locations (reported unresolved) | | C++ | `__ZN3rea3addEii` → `_ZN3rea3addEii`, `_c_add` → `c_add` | 1 location (`rea::add(int, int)`), event hit | 0 locations | | Swift | `_$s5swbin6reaAddyS2i_SitF` → `$s5swbin6reaAddyS2i_SitF` | 1 location, event hit | 0 locations | | ObjC | `_main` → `main`; `-[ReaThing addA:b:]` is unchanged (LLDB names it the same way) | 1 location; event hit on reruns | 0 locations | In the first ObjC run the `main` breakpoint was hit but recorded under `other_stops` rather than as an event. Two reruns recorded it normally. That looks like flakiness unrelated to naming, since this PR does not touch the tracer. - User-visible output (CLI `inspect-macho --format json`, C binary): `{"name":"_main","runtime_name":"main","address":"0x1000004e0",…}`, import `{"name":"_printf","runtime_name":"printf",…}`. - Cost: in the full Evidence for Calculator.app (1 export, 2059 Swift-heavy imports), `normalized_result` grew from 399,070 to 537,169 bytes (+34.6%). A 64-row imports page grew from 11,835 to 16,565 bytes. For the C binary the growth was 10,086 to 10,193 bytes. These are byte counts, not token counts. MCP delivers `inspect_macho` as a summary by default, so rows are paid for only when a caller pages them. `inspect-macho` on Calculator took 1.89 s wall time with a 421 MB peak RSS; no before/after timing comparison was made, and the derivation is one string slice per row. - Remaining proof gaps: x86_64 and other hosts were not run. Swift/C++ symbols were checked only with exports from locally built binaries, not third-party apps. Observation `symbol` remains the LLDB display name, so a C++/Swift event cannot be joined to `runtime_name` by string equality; it is joined via `breakpoint_index` or the address. Boundary regressions: malformed/unknown names (null, empty, bare `_`) and source-value preservation are covered. Lifecycle regressions: not applicable. - [x] Observed, derived, and inferred claims remain distinguishable. - [x] Artifact identity, source provenance, and failed attempts remain preserved. - [x] Unsupported, incomplete, unavailable, or uncertain outcomes remain visible. ## Validation performed - `npm run test:local -- src/domain/native/machoSymbolName.test.ts src/domain/analysisView/machoView.test.ts src/contracts/toolEffects.test.ts src/native/NativeMachoInspection.test.ts`: 4 files, 41 tests passed - `npm run test:focused --` the native inventory/provider/UUID-less/selected-architecture/re-export goldens, the native exports filesystem test, the Mach-O summary MCP test, the managed native verification conformance and adapter tests, the managed unknown-identity MCP test, the missing-UUID CLI test, and the output-schema semantic constraints test: 12 files, 178 tests passed. The first run failed in `nativeMachoSummaryMcp` because of the fixture shape; the fixture was updated and rerun (3/3 passed). - `npm run test:local -- src/contracts/toolInputReferences.test.ts`, then `npm run test:focused --` the native call observation tests, tool schema validity, native call MCP, local tool contracts, direct analysis factories, the native inventory golden and the Mach-O summary MCP test: 34 tests passed, then 7 files and 86 tests passed - `npm run check:fast`: passed - `npm run format:check`: passed - `npm run metadata:check`: passed - `npm run docs:check`: passed - Real LLDB runs with the CLI: base repro and the branch table above ## Compatibility, safety, and release - Breaking changes or migration steps: none. The field is additive. Retained Evidence from earlier versions parses with `runtime_name: null`. - Real Hopper/Ghidra, browser, or OS coverage: macOS 26 arm64 with Apple LLDB only. - Package or release metadata impact: none beyond regenerated catalogs. - Security, privacy, process, or containment review: no new process, file or network behavior. ## Author readiness Human owner: @kaoru0822-kitauji - [x] I reviewed the final diff and relevant existing code, understand the change and its edge cases, and take responsibility for the complete PR, including AI-assisted work. - [x] I checked the evidence above, confirmed it supports the current change, and recorded meaningful validation gaps. - [x] I declare this PR ready for initial maintainer review. ## Before merge - [ ] This PR addresses a concrete problem or an agreed enhancement. - [ ] Material scope and authority questions are resolved, and any required maintainer scope decision covers the final diff. - [ ] The PR has one focused outcome and the title follows `type(scope): outcome`. - [ ] Related issue is linked, or the reason for not linking one is stated above. - [ ] Tests cover changed observable behavior and meaningful failure paths. - [ ] Owning docs, contracts, and generated metadata are updated where needed. - [ ] User-visible CLI/MCP changes include representative output. - [ ] I checked the final diff for secrets, unrelated cleanup, and unsupported claims. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
bsakaguchi 2026-11-03 13:39:20 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#7644
No description provided.