Skip to content

feat(mcp): retire legacy server surfaces - #2820

Merged
namastex888 merged 8 commits into
devfrom
namastex888/genie-orca-a7-mcp-retirement
Aug 29, 2026
Merged

namastex888 merged 8 commits into
devfrom
namastex888/genie-orca-a7-mcp-retirement

Conversation

@namastex888

Copy link
Copy Markdown
Contributor

Summary

  • Retire the public Genie MCP command, packaged launchers, and only marker-owned config registrations.
  • Preserve standalone task and board behavior while Hermes uses a read-only argv-only CLI adapter with no MCP fallback.
  • Replace stale live-MCP tests with standalone task coverage and document the supported UI bridge seam.

Evidence

  • Independent review: SHIP at 75b353a.
  • Focused review evidence: 97 Bun retirement/standalone/UI-bridge tests, 32 Hermes tests, and 6 Hermes convergence tests passed.
  • The full local check classified 16 unrelated timing/lifecycle fixture failures after the two stale MCP failures were removed; attached CI is the integration gate.

@coderabbitai

coderabbitai Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: dfc90eca-32a3-4024-afe4-fa554e00665f

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Aug 29, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-08-29T23:47:36.484352Z 75b353a PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 75b353a7e3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1169 to +1171
isError: board.exit !== 0,
payload: parseStandaloneJson(board),
commands: [task, board],

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Reject failed or incorrect task-list observations

When task list --json exits non-zero, emits malformed JSON, or returns the wrong tasks while board --json remains healthy, this evidence still sets isError solely from the board result and observedRepo validates only the board payload. The validator merely checks that both argv arrays are present and that some command has exit 0, so the release dogfood gate can approve a candidate with a broken standalone task surface; require the task observation to exit successfully, parse correctly, and contain the seeded sentinel too.

AGENTS.md reference: AGENTS.md:L55-L57

Useful? React with 👍 / 👎.

Comment on lines +711 to +713
const content = removeOwnedFallback(raw, owned);
assertNonGenieTomlSemantics(raw, content, configPath);
if (content === raw) {
return { path: configPath, action: 'skipped', ok: true, route: 'fallback', detail: 'project fallback current' };
}
return {
path: configPath,
action: exists ? 'updated' : 'created',
ok: true,
route: 'fallback',
detail: 'project fallback active',
content,
};
}

/** Merge only the marker-owned Codex fallback. Kept exported for migration callers/tests. */
export function mergeCodexMcpFallback(configPath: string, entry: McpServerEntry): ArtifactAction {
const prepared = prepareCodexFallback(configPath, entry, true);
if ('content' in prepared && prepared.content !== undefined) applyPreparedWrite(prepared);
return prepared.action;
}

/** Remove only the marker-owned Codex fallback. */
export function removeCodexMcpFallback(configPath: string): ArtifactAction {
const prepared = prepareCodexFallback(configPath, genieMcpEntry(), false);
if (prepared.route === 'conflict') return 'skipped';
if ('content' in prepared && prepared.content !== undefined) applyPreparedWrite(prepared);
return prepared.action;
applyPreparedWrite({ path: configPath, action: 'updated', content });

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Back up Codex config before retiring the marker block

On the first genie init or successful genie setup --codex after upgrading, an existing marker-owned route reaches this write and replaces .codex/config.toml without creating any backup. This is the new migration path for mixed user/Genie config, so users have no preserved pre-migration bytes for rollback or recovery; create the backup before applying the retirement write and cover it in the migration fixture.

AGENTS.md reference: AGENTS.md:L31-L32

Useful? React with 👍 / 👎.

Comment on lines +527 to +533
const retired = route.route !== 'none' && route.route !== 'plugin';
const status: CheckStatus = retired || hard.length > 0 || trust.length > 0 ? 'warn' : 'pass';
const findingText = findings.map((finding) => `${finding.kind}: ${finding.detail}`).join('; ');
return {
name: 'Codex Genie MCP registration',
status,
detail: `${route.route}: ${route.detail ?? 'no detail'}${findingText.length > 0 ? `; ${findingText}` : ''}`,
detail: `${retired ? 'retired route remains preserved' : 'retired routes absent'}${findingText.length > 0 ? `; ${findingText}` : ''}`,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Preserve invalid-route failures in doctor status

When .codex/config.toml is malformed, unsafe, or has incomplete/duplicate Genie markers, inspectCodexProjectMcp returns ok: false with route: 'none'; this condition now ignores route.ok and discards its diagnostic. In a trusted project with no other layer findings, genie doctor therefore reports pass and “retired routes absent” even though genie init cannot inspect or retire the config; keep the inspection failure as a failing or warning status and surface route.detail.

Useful? React with 👍 / 👎.

@namastex888
namastex888 merged commit c8280d4 into dev Aug 29, 2026
18 checks passed
@namastex888
namastex888 deleted the namastex888/genie-orca-a7-mcp-retirement branch August 29, 2026 23:51
namastex888 added a commit that referenced this pull request Aug 30, 2026
There is no separate Genie UI any more — the Orca integration is the only
UI surface — so the bridge built for it is retired on exactly the terms
`genie mcp` was (#2820): `genie ui-bridge` is a stub that writes a stable
diagnostic to stderr and exits 1, and everything that existed only behind
it is deleted.

Removed (4,088 LOC):
- src/lib/v5/mcp-server.ts + test (shared newline-JSON-RPC transport loop)
- src/lib/v5/mcp-tools.ts + test (tool registry + readonly/degraded/write opens)
- src/lib/v5/bridge-watcher.ts + test (change watcher + ppid backstop)
- src/lib/v5/UI-BRIDGE.md (the bridge protocol contract)
- task-state.ts `listWishSlugs` / `WishGroupRow` — consumed only by the
  retired board tool; the hook bundle keeps its own `listKnownSlugs`

Kept: sqlite-open.ts's `openWithWalIndexRecovery` and the hire-roster
accessors. Both now have no shipped caller, but the recovery helper is the
opt-in seam for any future single-owner writer (and is tested directly),
and hire rows remain part of exported/imported board state. Their comments
now say so instead of pointing at deleted modules.

`ui-bridge` stays in the interactivity workspace-gate bypass set for the
same reason `mcp` does: the legacy gate must not exit 2 and mask the
retirement diagnostic.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013gGxGgKskzyzr1HRUB6cV3
namastex888 added a commit that referenced this pull request Aug 30, 2026
* feat(ui-bridge): retire the UI-owned stdio bridge

There is no separate Genie UI any more — the Orca integration is the only
UI surface — so the bridge built for it is retired on exactly the terms
`genie mcp` was (#2820): `genie ui-bridge` is a stub that writes a stable
diagnostic to stderr and exits 1, and everything that existed only behind
it is deleted.

Removed (4,088 LOC):
- src/lib/v5/mcp-server.ts + test (shared newline-JSON-RPC transport loop)
- src/lib/v5/mcp-tools.ts + test (tool registry + readonly/degraded/write opens)
- src/lib/v5/bridge-watcher.ts + test (change watcher + ppid backstop)
- src/lib/v5/UI-BRIDGE.md (the bridge protocol contract)
- task-state.ts `listWishSlugs` / `WishGroupRow` — consumed only by the
  retired board tool; the hook bundle keeps its own `listKnownSlugs`

Kept: sqlite-open.ts's `openWithWalIndexRecovery` and the hire-roster
accessors. Both now have no shipped caller, but the recovery helper is the
opt-in seam for any future single-owner writer (and is tested directly),
and hire rows remain part of exported/imported board state. Their comments
now say so instead of pointing at deleted modules.

`ui-bridge` stays in the interactivity workspace-gate bypass set for the
same reason `mcp` does: the legacy gate must not exit 2 and mask the
retirement diagnostic.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013gGxGgKskzyzr1HRUB6cV3

* docs: keep the bounded .mcp.json retirement wording alongside the ui-bridge retirement

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013gGxGgKskzyzr1HRUB6cV3

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
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