[PR #6139] [CLOSED] fix(native): inspect an explicit plist path over MCP without an open target #7155

Closed
opened 2026-11-01 21:45:48 +00:00 by bsakaguchi · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/morluto/rea/pull/6139
Author: @minjunkim-dev
Created: 10/21/2026
Status: ❌ Closed

Base: main ← Head: fix/inspect-plist-explicit-path-without-target


📝 Commits (4)

  • 5726918 fix(native): inspect an explicit plist path over MCP without an open target
  • e8fe333 fix(native): read standalone plists without opening them as targets
  • 0245bd8 test(native): cover standalone plist cleanup, cancellation, and routing
  • 5c69aa4 test(mcp): keep absolute plist selections on a fixed-target server

📊 Changes

14 files changed (+594 additions, -11 deletions)

View changed files

📝 src/application/CapabilityInventory.test.ts (+28 -0)
📝 src/application/CapabilityInventory.ts (+2 -0)
➕ src/application/StandalonePlistRead.test.ts (+148 -0)
➕ src/application/StandalonePlistRead.ts (+35 -0)
📝 src/application/binary/BinarySessionPort.ts (+1 -0)
📝 src/composition/directAnalysis.ts (+28 -0)
📝 src/native/NativeMacOSProvider.ts (+23 -7)
📝 src/native/NativePlistResourceRoot.test.ts (+70 -0)
📝 src/native/NativePlistSource.ts (+18 -0)
📝 src/server/BundleResourcesMcp.test.ts (+12 -1)
📝 src/server/createServer.ts (+20 -2)
📝 src/server/registerNativeTools.ts (+25 -1)
📝 tests/boundary/mcp/nativePlistDiagnosticsMcp.test.ts (+59 -0)
📝 tests/boundary/mcp/serverIdentity.test.ts (+125 -0)

📄 Description

Summary

MCP inspect_plist documents "or pass any local plist path", and its only input example passes just path. With no target open, that call failed with target_unavailable, and binary_session reported target_required. #1176 recorded this under "Remaining gaps". With no target open, an absolute path is now read directly, and discovery reports the tool available.

Fixes #6135

Problem and expected behavior

Trigger: a fresh MCP connection, then inspect_plist {"path": "/System/Applications/Calculator.app/Contents/Info.plist"}.

  • Before: target_unavailable ("No app is open… call open_binary"). After open_binary on any app, the same call succeeds, even for an unrelated bundle's plist or for suffixless OpenStep text. An absolute selection never uses the target (resolveNativePlistSelection returns it unchanged), so the session was only a gate.
  • After: with no target, the call returns the parsed plist for any plist format plutil reads, including OpenStep text without a .plist suffix (for example Localizable.strings). binary_session still reports open: false. A relative selection such as Contents/Info.plist still returns target_unavailable, because it has no root without a target.

Change and scope

  • NativeMacOSProvider.createStandalonePlistClient() returns a native client with no target and no app root. It shares construction with createBundleResourceClient. NativeMacOSClient#inspectPlist resolves its selection with the new resolveStandalonePlistSelection: an absolute path is selected as is, and a relative or missing path is refused with invalid_request. The macOS host gate now covers both target-less clients.
  • registerNativeTools routes inspect_plist to that client when the path is absolute and no target or bundle-resource session is selected. inspectStandalonePlist (composition) only builds the client; readStandalonePlist (src/application/StandalonePlistRead.ts) reads and always closes it, mirroring withSessionCleanup. A close failure is reported through the existing managedAnalysisCleanupFailure, and a throw plus a close failure keeps both in an AggregateError. The call runs inside the existing analysis admission.
  • The file is not opened as a target, so target admission and format detection no longer decide which plists can be read. Review found that the first revision of this PR did open it as a target, so a suffixless OpenStep file failed before plutil ran; that runner is removed.
  • In all other cases the call goes to the session as before: a target or bundle-resource session is open, the path is relative, or the server has no session and is bound to a fixed target.
  • CapabilityInventory.targetAvailability no longer reports inspect_plist as target_required in a closed session. Host availability is still checked first, so a host whose native descriptor is unsupported_host still reports it (unit-tested; not run on Linux).
  • BinarySessionPort gains an optional activeBundleResourceRoot(), which BinarySession already implements. The server uses it so it never bypasses a resource-only session.
  • CreateServerOptions.standalonePlistInspection allows injecting the reader, like the other services, so routing can be tested without macOS.
  • Not included: other session-routed tools that also take explicit paths, and any change to the tool description or input schema.
  • Contribution scope: ordinary fix within existing boundaries; maintainer scope decision not applicable.

Contract and boundary impact

  • Semantic owner and earliest changed stage: native plist selection (src/native/NativePlistSource.ts, NativeMacOSProvider), MCP native tool admission (src/server/registerNativeTools.ts), and session availability (src/application/CapabilityInventory.ts).
  • Contribution scope fit and linked maintainer decision: bug fix for #6135; not applicable.
  • CLI and MCP/tool-catalog contract: tools/list is unchanged. binary_session changes inspect_plist from target_required to available in a closed session. CLI is unchanged.
  • Provider, bridge, target-format, or platform compatibility: macOS native provider only; other hosts keep unsupported_host.
  • Evidence, artifact, provenance, or reconstruction contract: a standalone read has no target, so its Evidence subject is null, as for bundle-resource reads. normalized_result.source_path and the location carry the selected path, and the file/plutil provenance is unchanged.
  • Target selection, authority, upstream behavior, and cleanup details: no target is selected or opened. The target-less client is closed after each read, and a close failure is returned rather than dropped.
  • Generated metadata, package, or installation impact: none (docs:check passes).

Expected effects:

  • Read existing files or captured data.
  • Launch or attach to a process. (/usr/bin/file and plutil, as before.)
  • 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/native/NativePlistResourceRoot.test.ts (simulated native commands, every host): the target-less client reads an absolute suffixless selection, refuses relative and missing selections with invalid_request, refuses on a non-macOS host with capability_unavailable, and returns cancelled for an already aborted signal without running any plist command.
    • src/application/StandalonePlistRead.test.ts (fake clients, every host): the client is closed exactly once after success, cancellation, and an unexpected throw. The success result has a null subject, and the abort signal is forwarded. A close failure is reported as cleanup_incomplete, keeping the partial observation or the primary cancelled error. A throw plus a close failure keeps both.
    • src/server/BundleResourcesMcp.test.ts: inside a resource-only session, an absolute selection stays on the session's resource client and never reaches the standalone reader. Removing the bundle-resource condition from targetSelected makes this test fail (executed as a temporary mutation).
    • src/application/CapabilityInventory.test.ts: in a closed session inspect_plist is available, inspect_macho is still target_required, and unsupported_host still wins.
    • tests/boundary/mcp/serverIdentity.test.ts (in-memory MCP, injected reader, every host): with no target, an absolute path goes to the standalone reader and the session stays unopened. A relative path returns target_unavailable. After open_binary, the call stays on the session. On a server bound to a fixed analysis target (no session), an absolute selection reaches that analysis and never the standalone reader. Dropping the session === undefined condition from targetSelected makes this test fail (executed as a temporary mutation).
    • tests/boundary/mcp/nativePlistDiagnosticsMcp.test.ts (built production server over stdio, darwin only): with no target, the real provider reads an XML plist, a suffixless binary plist, a suffixless OpenStep file, and a .strings OpenStep file, and binary_session reports open: false.
  • Base reproduction: in a clean worktree at 01788ba with only these six test files copied in, 5 of the 6 files fail (executed). Every new case fails, and StandalonePlistRead does not exist there. BundleResourcesMcp.test.ts passes on the base by design, because without this change nothing is routed away from the session; the mutation above shows it guards the new branch. The suffixless OpenStep cases also fail on this PR's first revision (5726918).

  • User-visible MCP output (executed against this branch's build over stdio, macOS 27.0.1 arm64):

    before: open=False inspect_plist=available
    /System/Applications/Calculator.app/Contents/Info.plist: ok format=xml subject=None value=com.apple.calculator
    <fixtures>/BinarySettings: ok format=binary subject=None value=com.apple.Chess
    <fixtures>/Sample.strings: ok format=unknown subject=None value={'Name': 'Example'}
    <fixtures>/Settings: ok format=unknown subject=None value={'Name': 'Example'}
    Contents/Info.plist: ERROR target_unavailable
    after: open=False inspect_plist=available
    

    BinarySettings is plutil -convert binary1 of Chess.app's Info.plist; Sample.strings and Settings contain { Name = Example; }.

    On rea-agents@6.7.0, the same absolute call returns target_unavailable, and binary_session reports target_required (see #6135).

  • Remaining proof gaps: the darwin-only real-provider test was run only on macOS 27.0.1. Linux and Windows run the simulated-provider, fake-client, and injected-reader tests only. Cancellation during a running plutil command and during client close use the shared NativeMacOSClient lifecycle and its existing tests; they are not separately exercised for the target-less client. Token and time costs were not measured; a standalone read creates and closes one target-less native client and removes the extra open_binary round trip.

For evidence-bearing changes:

  • 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

All results below are for head commit 5c69aa4 on macOS 27.0.1 arm64 unless noted.

  • npm run check — passed (typecheck, built lint with 0 errors, format, knip, metadata, architecture guards).
  • npm run check:fast — passed (also run by the pre-push hook).
  • npm run jscpd — passed (3.48% duplicated lines).
  • npm run docs:check — passed (run on 0245bd8; the last commit changes only a test file).
  • npm run verify:test-discovery — passed.
  • npm run test:focused -- on the six files with new tests (CapabilityInventory, StandalonePlistRead, NativePlistResourceRoot, BundleResourcesMcp, serverIdentity, nativePlistDiagnosticsMcp) — 55 passed.
  • npm run test:focused -- on all 42 test files that mention inspect_plist, createBundleResourceClient, NativePlistSource, StandalonePlist, inspect_managed_artifact or runManagedProviderExecution (evaluation suites excluded) — 368 passed, 1 skipped, 1 failed. The failure is tests/acceptance/applications/appBundleEncodingCli.test.ts > "resolves real compiled bundles without changing executable names during decoding". It fails identically on 01788ba without this change: this host's plutil (macOS 27.0.1) accepts the "unsupported declaration" fixture, and the CLI inspect-plist path is not touched here.
  • Merged onto current main (13a8640, 92 commits newer than the base) in a throwaway worktree: the merge is clean, npm run check:fast passed, and the six new-test files passed (55 tests).

Compatibility, safety, and release

  • Breaking changes or migration steps: none. A call that used to fail now succeeds; existing session-bound calls are unchanged.
  • Real Hopper/Ghidra, browser, or OS coverage: macOS 27.0.1 arm64 native utilities only. No Hopper/Ghidra involvement.
  • Package or release metadata impact: none.
  • Security, privacy, process, or containment review: it reads only the caller-selected absolute path, with the same native utilities, file checks, and size allowances as other plist reads. It adds no new process or authority, and nothing is opened as a target.

Author readiness

Human owner: @minjunkim-dev

  • 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/6139 **Author:** [@minjunkim-dev](https://github.com/minjunkim-dev) **Created:** 10/21/2026 **Status:** ❌ Closed **Base:** `main` ← **Head:** `fix/inspect-plist-explicit-path-without-target` --- ### 📝 Commits (4) - [`5726918`](https://github.com/morluto/rea/commit/57269183576b3770ce643d0b1e0b9ac88c663e23) fix(native): inspect an explicit plist path over MCP without an open target - [`e8fe333`](https://github.com/morluto/rea/commit/e8fe3335d32d6abb553f3fbea003e4928c53cdcf) fix(native): read standalone plists without opening them as targets - [`0245bd8`](https://github.com/morluto/rea/commit/0245bd8a99fb9edbaa008a4ea7c924e17372a67d) test(native): cover standalone plist cleanup, cancellation, and routing - [`5c69aa4`](https://github.com/morluto/rea/commit/5c69aa4a28a2f9e54376b2d6e8649a215e0a8475) test(mcp): keep absolute plist selections on a fixed-target server ### 📊 Changes **14 files changed** (+594 additions, -11 deletions) <details> <summary>View changed files</summary> 📝 `src/application/CapabilityInventory.test.ts` (+28 -0) 📝 `src/application/CapabilityInventory.ts` (+2 -0) ➕ `src/application/StandalonePlistRead.test.ts` (+148 -0) ➕ `src/application/StandalonePlistRead.ts` (+35 -0) 📝 `src/application/binary/BinarySessionPort.ts` (+1 -0) 📝 `src/composition/directAnalysis.ts` (+28 -0) 📝 `src/native/NativeMacOSProvider.ts` (+23 -7) 📝 `src/native/NativePlistResourceRoot.test.ts` (+70 -0) 📝 `src/native/NativePlistSource.ts` (+18 -0) 📝 `src/server/BundleResourcesMcp.test.ts` (+12 -1) 📝 `src/server/createServer.ts` (+20 -2) 📝 `src/server/registerNativeTools.ts` (+25 -1) 📝 `tests/boundary/mcp/nativePlistDiagnosticsMcp.test.ts` (+59 -0) 📝 `tests/boundary/mcp/serverIdentity.test.ts` (+125 -0) </details> ### 📄 Description ## Summary MCP `inspect_plist` documents "or pass any local plist path", and its only input example passes just `path`. With no target open, that call failed with `target_unavailable`, and `binary_session` reported `target_required`. #1176 recorded this under "Remaining gaps". With no target open, an absolute `path` is now read directly, and discovery reports the tool available. Fixes #6135 ## Problem and expected behavior Trigger: a fresh MCP connection, then `inspect_plist {"path": "/System/Applications/Calculator.app/Contents/Info.plist"}`. - Before: `target_unavailable` ("No app is open… call open_binary"). After `open_binary` on any app, the same call succeeds, even for an unrelated bundle's plist or for suffixless OpenStep text. An absolute selection never uses the target (`resolveNativePlistSelection` returns it unchanged), so the session was only a gate. - After: with no target, the call returns the parsed plist for any plist format `plutil` reads, including OpenStep text without a `.plist` suffix (for example `Localizable.strings`). `binary_session` still reports `open: false`. A relative selection such as `Contents/Info.plist` still returns `target_unavailable`, because it has no root without a target. ## Change and scope - `NativeMacOSProvider.createStandalonePlistClient()` returns a native client with no target and no app root. It shares construction with `createBundleResourceClient`. `NativeMacOSClient#inspectPlist` resolves its selection with the new `resolveStandalonePlistSelection`: an absolute path is selected as is, and a relative or missing path is refused with `invalid_request`. The macOS host gate now covers both target-less clients. - `registerNativeTools` routes `inspect_plist` to that client when the `path` is absolute and no target or bundle-resource session is selected. `inspectStandalonePlist` (composition) only builds the client; `readStandalonePlist` (`src/application/StandalonePlistRead.ts`) reads and always closes it, mirroring `withSessionCleanup`. A close failure is reported through the existing `managedAnalysisCleanupFailure`, and a throw plus a close failure keeps both in an `AggregateError`. The call runs inside the existing analysis admission. - The file is not opened as a target, so target admission and format detection no longer decide which plists can be read. Review found that the first revision of this PR did open it as a target, so a suffixless OpenStep file failed before `plutil` ran; that runner is removed. - In all other cases the call goes to the session as before: a target or bundle-resource session is open, the path is relative, or the server has no session and is bound to a fixed target. - `CapabilityInventory.targetAvailability` no longer reports `inspect_plist` as `target_required` in a closed session. Host availability is still checked first, so a host whose native descriptor is `unsupported_host` still reports it (unit-tested; not run on Linux). - `BinarySessionPort` gains an optional `activeBundleResourceRoot()`, which `BinarySession` already implements. The server uses it so it never bypasses a resource-only session. - `CreateServerOptions.standalonePlistInspection` allows injecting the reader, like the other services, so routing can be tested without macOS. - Not included: other session-routed tools that also take explicit paths, and any change to the tool description or input schema. - Contribution scope: ordinary fix within existing boundaries; maintainer scope decision not applicable. ## Contract and boundary impact - Semantic owner and earliest changed stage: native plist selection (`src/native/NativePlistSource.ts`, `NativeMacOSProvider`), MCP native tool admission (`src/server/registerNativeTools.ts`), and session availability (`src/application/CapabilityInventory.ts`). - Contribution scope fit and linked maintainer decision: bug fix for #6135; not applicable. - CLI and MCP/tool-catalog contract: `tools/list` is unchanged. `binary_session` changes `inspect_plist` from `target_required` to `available` in a closed session. CLI is unchanged. - Provider, bridge, target-format, or platform compatibility: macOS native provider only; other hosts keep `unsupported_host`. - Evidence, artifact, provenance, or reconstruction contract: a standalone read has no target, so its Evidence `subject` is `null`, as for bundle-resource reads. `normalized_result.source_path` and the location carry the selected path, and the `file`/`plutil` provenance is unchanged. - Target selection, authority, upstream behavior, and cleanup details: no target is selected or opened. The target-less client is closed after each read, and a close failure is returned rather than dropped. - Generated metadata, package, or installation impact: none (`docs:check` passes). Expected effects: - [x] Read existing files or captured data. - [x] Launch or attach to a process. (`/usr/bin/file` and `plutil`, as before.) - [ ] 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/native/NativePlistResourceRoot.test.ts` (simulated native commands, every host): the target-less client reads an absolute suffixless selection, refuses relative and missing selections with `invalid_request`, refuses on a non-macOS host with `capability_unavailable`, and returns `cancelled` for an already aborted signal without running any plist command. - `src/application/StandalonePlistRead.test.ts` (fake clients, every host): the client is closed exactly once after success, cancellation, and an unexpected throw. The success result has a `null` subject, and the abort signal is forwarded. A close failure is reported as `cleanup_incomplete`, keeping the partial observation or the primary `cancelled` error. A throw plus a close failure keeps both. - `src/server/BundleResourcesMcp.test.ts`: inside a resource-only session, an absolute selection stays on the session's resource client and never reaches the standalone reader. Removing the bundle-resource condition from `targetSelected` makes this test fail (executed as a temporary mutation). - `src/application/CapabilityInventory.test.ts`: in a closed session `inspect_plist` is available, `inspect_macho` is still `target_required`, and `unsupported_host` still wins. - `tests/boundary/mcp/serverIdentity.test.ts` (in-memory MCP, injected reader, every host): with no target, an absolute path goes to the standalone reader and the session stays unopened. A relative path returns `target_unavailable`. After `open_binary`, the call stays on the session. On a server bound to a fixed analysis target (no session), an absolute selection reaches that analysis and never the standalone reader. Dropping the `session === undefined` condition from `targetSelected` makes this test fail (executed as a temporary mutation). - `tests/boundary/mcp/nativePlistDiagnosticsMcp.test.ts` (built production server over stdio, darwin only): with no target, the real provider reads an XML plist, a suffixless binary plist, a suffixless OpenStep file, and a `.strings` OpenStep file, and `binary_session` reports `open: false`. - Base reproduction: in a clean worktree at `01788ba` with only these six test files copied in, 5 of the 6 files fail (executed). Every new case fails, and `StandalonePlistRead` does not exist there. `BundleResourcesMcp.test.ts` passes on the base by design, because without this change nothing is routed away from the session; the mutation above shows it guards the new branch. The suffixless OpenStep cases also fail on this PR's first revision (`5726918`). - User-visible MCP output (executed against this branch's build over stdio, macOS 27.0.1 arm64): ``` before: open=False inspect_plist=available /System/Applications/Calculator.app/Contents/Info.plist: ok format=xml subject=None value=com.apple.calculator <fixtures>/BinarySettings: ok format=binary subject=None value=com.apple.Chess <fixtures>/Sample.strings: ok format=unknown subject=None value={'Name': 'Example'} <fixtures>/Settings: ok format=unknown subject=None value={'Name': 'Example'} Contents/Info.plist: ERROR target_unavailable after: open=False inspect_plist=available ``` `BinarySettings` is `plutil -convert binary1` of Chess.app's Info.plist; `Sample.strings` and `Settings` contain `{ Name = Example; }`. On `rea-agents@6.7.0`, the same absolute call returns `target_unavailable`, and `binary_session` reports `target_required` (see #6135). - Remaining proof gaps: the darwin-only real-provider test was run only on macOS 27.0.1. Linux and Windows run the simulated-provider, fake-client, and injected-reader tests only. Cancellation during a running `plutil` command and during client close use the shared `NativeMacOSClient` lifecycle and its existing tests; they are not separately exercised for the target-less client. Token and time costs were not measured; a standalone read creates and closes one target-less native client and removes the extra `open_binary` round trip. For evidence-bearing changes: - [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 All results below are for head commit `5c69aa4` on macOS 27.0.1 arm64 unless noted. - `npm run check` — passed (typecheck, built lint with 0 errors, format, knip, metadata, architecture guards). - `npm run check:fast` — passed (also run by the pre-push hook). - `npm run jscpd` — passed (3.48% duplicated lines). - `npm run docs:check` — passed (run on `0245bd8`; the last commit changes only a test file). - `npm run verify:test-discovery` — passed. - `npm run test:focused --` on the six files with new tests (`CapabilityInventory`, `StandalonePlistRead`, `NativePlistResourceRoot`, `BundleResourcesMcp`, `serverIdentity`, `nativePlistDiagnosticsMcp`) — 55 passed. - `npm run test:focused --` on all 42 test files that mention `inspect_plist`, `createBundleResourceClient`, `NativePlistSource`, `StandalonePlist`, `inspect_managed_artifact` or `runManagedProviderExecution` (evaluation suites excluded) — 368 passed, 1 skipped, 1 failed. The failure is `tests/acceptance/applications/appBundleEncodingCli.test.ts` > "resolves real compiled bundles without changing executable names during decoding". It fails identically on `01788ba` without this change: this host's `plutil` (macOS 27.0.1) accepts the "unsupported declaration" fixture, and the CLI `inspect-plist` path is not touched here. - Merged onto current `main` (`13a8640`, 92 commits newer than the base) in a throwaway worktree: the merge is clean, `npm run check:fast` passed, and the six new-test files passed (55 tests). ## Compatibility, safety, and release - Breaking changes or migration steps: none. A call that used to fail now succeeds; existing session-bound calls are unchanged. - Real Hopper/Ghidra, browser, or OS coverage: macOS 27.0.1 arm64 native utilities only. No Hopper/Ghidra involvement. - Package or release metadata impact: none. - Security, privacy, process, or containment review: it reads only the caller-selected absolute path, with the same native utilities, file checks, and size allowances as other plist reads. It adds no new process or authority, and nothing is opened as a target. ## Author readiness Human owner: @minjunkim-dev - [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-01 21:45:48 +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#7155
No description provided.