Agents
Claude Code and Codex
A role reaches a host two ways: as an MCP prompt served straight from the graph, or as a thin file the host reads at start. Both render the same contract from the same node.
Connect the host first (Setup). Then the roles filed under vinc/agent are visible to it. A graph without that domain lists no prompts, which is a valid state and not an error.
Roles as MCP prompts
Vinc's MCP server answers prompts/list and prompts/get. The list is the roles under vinc/agent, one prompt per role, named by the role's slug. Getting one returns the role's contract hydrated from the live graph: mission, reads in order, gates, prohibitions, the output contract, and the traps attached to the role. Nobody retypes a reading list.
One optional argument, focus: a node id or a phrase. An id is read one hop; a phrase is searched; either way the material is appended below the contract.
Claude Code
Claude Code turns MCP prompts into slash commands named /mcp__<server>__<prompt>. With the server added as vinc, a role is one command, and the focus argument follows it:
/mcp__vinc__agent-dev-core
/mcp__vinc__agent-dev-core concept:agent-orchestration
Claude Code also reads subagent definitions from .claude/agents/<name>.md, and it finds them by walking up from the working directory. Such a file is a pointer, not a definition: the frontmatter the harness enforces (model, tool denylist) and an instruction to read the node first:
---
name: agent-dev-core
description: Takes one package in the Python core, works it on one branch,
and leaves one green pull request and one episode.
model: opus
---
# Agent role: core development
This file is a pointer. The role is defined in the graph, and two calls read it:
vinc_graph seed_id=concept:agent-dev-core depth=1
vinc_neighbors node=concept:agent-dev-core
What follows is a snapshot, and the graph wins where they differ.
Those files can be generated by the repository rather than written by hand. scripts/agents_sync.py --pull reads the role nodes into a committed snapshot, --gen renders the files from it, and --check runs in CI offline and fails when a file drifts from the snapshot or a reads entry names a document nobody can find. The prompt surface and the generator share one renderer, so a role reads the same in a file and in a prompt.
Codex
Codex connects to the same server (Setup, way B) and gets the tools, but it does not expose MCP prompts to the user: that is an open request on the Codex tracker, not a shipped feature. So in Codex a role is read, not invoked:
vinc_graph seed_id=concept:agent-dev-core depth=1
vinc_neighbors node=concept:agent-dev-core
vinc_brief question="concept:agent-dev-core" relations with their evidence
Standing instructions for Codex live in AGENTS.md. One line there does what the Claude Code file does: name the role node and say to read it before the first edit. Codex also reads the instructions a server sends at connection time; Vinc uses that field to say which space the session is in, not to carry a role.
bearer_token_env_var; Claude Code takes it as a header. Both are on Setup.