Skip to content

Partition the tool surface into subject domains with a drift-guard - #501

Merged
mocha06 merged 1 commit into
devfrom
rc-dev/feat/tool-surface-taxonomy
Jul 28, 2026
Merged

Partition the tool surface into subject domains with a drift-guard#501
mocha06 merged 1 commit into
devfrom
rc-dev/feat/tool-surface-taxonomy

Conversation

@mocha06

@mocha06 mocha06 commented Jul 23, 2026

Copy link
Copy Markdown
Collaborator

Motivation

The MCP server exposes 187 tools with no machine-checked grouping and no completeness gate — nothing catches a newly registered tool that never gets classified, and there is no vocabulary for selecting a coherent slice of the surface. The hosted profile also lacked full raw-GraphQL reach: execute_graphql was withheld from the remote allowlist, so a remote caller could introspect the schema but not run what they found.

Outcome

A disjoint subject-domain partition of all 187 tools (workflow, database, interfaces, automation, intelligence, analytics, governance, integration) now lives in tools/toolsets.py, enforced by a drift-guard that fails the build if any registered tool has no domain — the repo's first tool-surface completeness gate, keyed to PIPEFY_TOOL_NAMES with no hardcoded count. execute_graphql is now remote-safe, giving the remote profile full raw-GraphQL reach under the request-scoped bearer's own API permissions — the same trust boundary as its introspection siblings, and its write reach bounded entirely by that caller's API authorization.

Domains are the disjoint subject axis; overlapping persona profiles are a separate axis, and named --toolsets selection plus the meta-tool power profile follow in stacked PRs. See the "Subject-domain taxonomy" section in packages/mcp/AGENTS.md.

Part of #308.

Live validation

Real in-process MCP client sessions confirm the default profile exposes all 187 tools — the partition covers the full surface — and execute_graphql is present in the exposed set. The partition itself (complete, disjoint, keyed to PIPEFY_TOOL_NAMES) is enforced at build time by the drift-guard. The full end-to-end matrix across the stack is on #308.

@mocha06
mocha06 force-pushed the rc-dev/feat/tool-surface-taxonomy branch from b3cbbd7 to dbe8bc1 Compare July 23, 2026 21:05
@mocha06
mocha06 marked this pull request as draft July 24, 2026 14:52
@mocha06
mocha06 force-pushed the rc-dev/feat/tool-surface-taxonomy branch from dbe8bc1 to 1bcae69 Compare July 27, 2026 20:22
@mocha06 mocha06 self-assigned this Jul 27, 2026
@mocha06
mocha06 marked this pull request as ready for review July 27, 2026 20:24
@mocha06
mocha06 requested a review from adriannoes July 27, 2026 20:45
adriannoes
adriannoes previously approved these changes Jul 27, 2026

@adriannoes adriannoes left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

The subject-domain partition and drift-guard look solid: eight locked domains, completeness keyed to PIPEFY_TOOL_NAMES (187/187, no magic count), and tests that actually fail when inverted. Marking execute_graphql remote-safe is a minimal, lockstep change (decorator, seed, server assertion) and matches the documented remote-write criteria (API permission is the auth boundary; hosted logging stays key-only).

A few soft notes before or after you merge:

  • Update the PR description counts to 187 tools and REMOTE_SEED 183 to 184 (the code already matches that).
  • Retarget the CONTEXT.md / ADR pointers to packages/mcp/AGENTS.md, where the taxonomy actually landed.
  • Optional: tighten the new remote GraphQL paragraph so it says public GraphQL only, and that filesystem / $env / iPaaS paths stay unreachable (public GraphQL equivalents of some withheld tools remain callable).

Stack order stays #501 then #502 then #504 then #505. Live MCP smoke for the remote exposure was blocked here because the connected server was not proven to be this worktree at the frozen head; composition-root tests cover the exposure contract.

What worked well: the registry-keyed completeness gate, the Domain vs Profile split before selection code, and the coordinated REMOTE marker/seed/tests.

Add tools/toolsets.py — a disjoint partition of all 187 registered tools across
8 subject domains — and a drift-guard asserting it is complete against
PIPEFY_TOOL_NAMES (no hardcoded count), disjoint, and keyed to the locked 8
domains. First tool-surface completeness gate: a tool with no domain fails the
build.

Mark execute_graphql remote-safe (REMOTE_SEED 183 to 184) so the raw-GraphQL
escape hatch has full reach (public GraphQL) on the remote profile, governed by
the request-scoped bearer's API permissions like its introspection siblings.

Part of #308.
@mocha06
mocha06 force-pushed the rc-dev/feat/tool-surface-taxonomy branch from 1bcae69 to 820d6c9 Compare July 28, 2026 02:37

@adriannoes adriannoes left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Re-approve after the force-push to 820d6c95.

The prior review on 1bcae695 was dismissed by the new head. The delta since then is the AGENTS remote-GraphQL wording (public executor only, with the public-equivalent nuance) plus PR description fixes for the 187-tool count and the packages/mcp/AGENTS.md pointer. CI is green on this commit.

Same call as before: the subject-domain partition, drift-guard, and execute_graphql remote lockstep are good to land.

@mocha06
mocha06 merged commit 5e78cfd into dev Jul 28, 2026
2 checks passed
@mocha06
mocha06 deleted the rc-dev/feat/tool-surface-taxonomy branch July 28, 2026 12:42
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.

2 participants