Skip to content

fix(reasonix): stop dropping the [[plugins]] concurrency and auto_start keys - #2978

Merged
dyoshikawa merged 3 commits into
mainfrom
resolve-issue-2599-reasonix-plugin-fields
Sep 9, 2026
Merged

fix(reasonix): stop dropping the [[plugins]] concurrency and auto_start keys#2978
dyoshikawa merged 3 commits into
mainfrom
resolve-issue-2599-reasonix-plugin-fields

Conversation

@dyoshikawa

@dyoshikawa dyoshikawa commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Problem

Reasonix's [[plugins]] entries accept two scheduling keys that rulesync's REASONIX_PLUGIN_FIELDS allowlist does not carry:

  • concurrency"parallel" or "serial". serial stops two calls to the same server from running at once across the whole session, which is what keeps sub-agents sharing one stdio process from interleaving on its state. With no explicit value Reasonix substring-matches the server name against a known-stateful list (browser, playwright, puppeteer, chrome, chromium, selenium) and serializes a match; an explicit value always wins.
  • auto_start (*bool) — false switches the server off: Config.EnabledPlugins drops it from the enabled set, so its tools never reach the model and Reasonix reports it as disabled rather than deferred. Only a durable override in mcp-activation.json outranks the file value.

Because fromRulesyncMcp rewrites the whole plugins key through applySharedConfigPatch, this is not merely "cannot be authored from .rulesync/mcp.json": a value written by hand into reasonix.toml is deleted on the next generate, silently. For these two keys that deletion changes behavior: dropping the key does not fall back to a neutral default, it hands the decision back to the server's name. A serial dropped from a stateful server the name list does not catch puts it on the parallel path; a parallel dropped from a server the list does catch forces it serial; and a dropped auto_start = false switches a deliberately disabled server back on.

Change

Both keys join REASONIX_PLUGIN_FIELDS as passthrough fields, exactly like the sibling timeout keys. The write path and the import path both iterate that list, so authoring, import and round-trip all follow from the one addition. Neither key has a canonical counterpart, so no deep mapping is introduced.

Tests cover export, import, and a round trip. Each pins a value that actually overrides what Reasonix would infer on its own — parallel on a server named browser, serial on one the stateful-name list does not catch, and auto_start: false, the value a truthiness filter would drop.

docs/reference/file-formats.md gains both keys in the Reasonix MCP note.

Verification

Confirmed against the upstream primary source rather than the docs prose: internal/config/plugin_entry.go at v1.38.3 declares Concurrency string \toml:"concurrency"`andAutoStart *bool `toml:"auto_start"`. docs/SPEC.md§3.16 documents the concurrency semantics and the stateful-name default;docs/PLUGIN_PACKAGES.mddocumentsauto_start=falsefor imported servers, andinternal/config/config.go (ShouldAutoStart/EnabledPlugins) plus internal/cli/mcp_manager.go(thedisabledvsdeferredstatus split) are what settle thatauto_start = false` disables rather than defers.

concurrency has no canonical counterpart. auto_start overlaps canonical disabled, but it is left as a passthrough here rather than deep-mapped: Reasonix's activation store can flip a server independently of the file, so the two are not interchangeable, and deciding which wins when a canonical disabled and a hand-written auto_start disagree — in both the write and the import direction — is a separate call left on #2599.

pnpm cicheck passes (411 test files, 11158 tests).

Scope

Refs #2599 — this closes the two MCP gaps recorded in that issue's re-check comments. The issue stays open for its gap 3 (the hook cwd/env fields), which needs a maintainer decision on whether cwd becomes a shared canonical hook key or a Reasonix-only passthrough.

🤖 Generated with Claude Code

https://claude.ai/code/session_019yLN6CVqeZ8HCrjRb9o7mK

dyoshikawa and others added 3 commits September 8, 2026 22:38
…tes and tests

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019yLN6CVqeZ8HCrjRb9o7mK
auto_start = false does not defer a server, it drops it from Reasonix's enabled set, so its tools never reach the model and only a durable mcp-activation.json override brings it back. Correct the field-list comment and the file-formats note, and record why auto_start stays a passthrough instead of being deep-mapped onto canonical disabled.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019yLN6CVqeZ8HCrjRb9o7mK
@dyoshikawa
dyoshikawa merged commit 2b435f5 into main Sep 9, 2026
9 checks passed
@dyoshikawa
dyoshikawa deleted the resolve-issue-2599-reasonix-plugin-fields branch September 9, 2026 06:31
@dyoshikawa

Copy link
Copy Markdown
Owner Author

Merged. Thanks — this ships the two [[plugins]] scheduling keys as passthrough fields, so a hand-written concurrency or auto_start survives the next generate.

Two follow-ups stay on #2599: the hook cwd gap, and whether canonical disabled should deep-map onto auto_start (which needs a precedence rule against a hand-written value, in both the write and the import direction).

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