Connect

Writing a role

Follow this page from top to bottom and you end with a working role in your graph that an assistant can be called as. Each step fills in one or two properties.

Before you start

As the example, this page builds a release notes writer: a role that drafts release notes from merged pull requests and leaves publishing to a person.

1. Write the job in one sentence

Start with mission. One role is one job that one owner could answer for. If you need "and" twice to describe it, it is probably two roles.

mission
GoodWrite the release notes for a tagged version from its merged pull requests, in the house style, and leave them as a draft for review.
Too broadHandle releases.
Two jobsWrite the release notes, deploy the build and announce it.

Write the role in English, as GRAPH.md asks. Say what the role produces and where the work stops ("leave them as a draft"). Copy the same sentence into one_liner; hosts show it in the role list.

2. Pick the seat

tier says what kind of seat the role takes. Pick the one that matches what the role leaves behind.

If the role…tier
hands out work and collects reportsorchestrate
changes files or makes somethingexecute
checks someone else's work and never edits itverify
merges, deploys or tags a releasedeliver
writes what others read, or tidies the graphknowledge

The release notes writer makes a file, so it is execute. A role that only reviews the notes would be a separate verify role: one seat should not both write and approve the same work.

3. Name it and file it

FieldWhat to writeExample
idconcept:agent- plus a short name in lowercase letters, digits and hyphens. agent-… becomes the prompt name.concept:agent-release-notes
typeAlways concept. Other types do not keep properties.concept
titleThe job name. Do not start it with "Agent role:".Release notes writer
domainagent, or one level below it such as agent/release. Deeper roles do not show up as prompts. Roles that older spaces keep under vinc/agent are read too.agent
tagsOptional. agent, the tier and role make roles easy to filter.["agent", "execute", "role"]

4. Draw the lines

never is what the role must not do at all. person_only is a step that has to happen, but a person takes it. Both are lists.

Example
neverpublish the notes, describe a change that is not in a merged pull request
person_onlypublishing the release

Write each item as something you could check afterwards. "Be careful" cannot be checked; "describe a change that is not in a merged pull request" can.

5. Choose the model level

rung is one of strongest, strong, fast and cheapest. Never write a model name here. Choose by how costly a wrong answer is, not by how big the job is.

Release notes are a draft a person reviews, so fast. Which model each level uses is on Roles and teams.

6. Give it what it needs

KeyWhat it is forExample
readsDocuments to read before the first edit, in order. Use document ids.["doc:release-notes-style"]
gatesChecks that must pass before the work is handed over.["every entry links its pull request"]
test_commandA command to run as the check, if there is one.npm test
repos, pathsWhere the role works. The assistant stays inside them.["my-app"], ["CHANGELOG.md"]
writes_graphWhat it records in Vinc when done: episode, record, decision.["episode"]

Put the house style in a document and list it in reads, rather than pasting the style into mission. Then several roles can share it, and changing the document changes every one of them.

7. Limit its tools

These are instructions to the host. Vinc does not block a tool by itself; the host has to apply the list.

8. Put it in a team (optional)

team, team_role (lead, coordinator or member) and job_title group roles in the app's Agent view. The order between roles is a link: prerequisite_of when one must finish before the other starts, relates_to for roles that work side by side. More on Roles and teams.

The whole role

Steps 1 to 7 together make this node. Lists stay JSON arrays: a single string is read one character at a time.

[
  {
    "id": "concept:agent-release-notes",
    "type": "concept",
    "title": "Release notes writer",
    "domain": "agent",
    "tags": [
      "agent",
      "execute",
      "role"
    ],
    "one_liner": "Write the release notes for a tagged version from its merged pull requests, in the house style, and leave them as a draft for review.",
    "props": {
      "mission": "Write the release notes for a tagged version from its merged pull requests, in the house style, and leave them as a draft for review.",
      "tier": "execute",
      "rung": "fast",
      "never": [
        "publish the notes",
        "describe a change that is not in a merged pull request"
      ],
      "person_only": [
        "publishing the release"
      ],
      "reads": [
        "doc:release-notes-style"
      ],
      "gates": [
        "every entry links its pull request",
        "no entry is longer than two sentences"
      ],
      "repos": [
        "my-app"
      ],
      "paths": [
        "CHANGELOG.md"
      ],
      "disallowed_tools": [
        "Bash"
      ],
      "writes_graph": [
        "episode"
      ]
    }
  }
]

9. Add it to Vinc

Choose one of four ways.

From 0.9.6 the desktop and web app have a form for this. Open Agent in the top row of the sidebar and press + above the list. The New Agent role sheet asks for the job name, the name (id), what it does, the seat, the model level, what it must never do, what a person does, and a team if you want one. Press Create, and the role is filed under the agent topic and shows in View and the tree straight away.

  1. Job name The title of the role.
  2. Name (id) Lowercase letters, digits and hyphens. The line below shows the id it becomes, concept:agent-… (step 3).
  3. What it does The role's job in one sentence (step 1).
  4. Seat Picked by what the role leaves behind (step 2). The line below changes with the choice.
  5. Model level Picked by how costly a wrong answer is (step 5).
  6. Create Checks that the name is free, then saves. If the role rules flag something, the role is still saved and the sheet lists what to fix.

The sheet does not take what the role reads or which tools it may use (steps 6 and 7). Add those afterwards by asking an assistant, or write the whole role another way. The demo above does not save.

10. Check it

Read the warnings in the write result. The write checks each of these and still stores the role, so the warnings are the only thing that tells you something is off.

Then call the role. In Claude Code, run /mcp__vinc__agent-release-notes; elsewhere ask the assistant to read concept:agent-release-notes. The assistant receives the role written out like this:

# Release notes writer

Tier execute, rung fast.

## Mission
Write the release notes for a tagged version from its merged pull requests, ...

## Surface
Repositories: my-app
- CHANGELOG.md

## Read before the first edit, in this order
1. doc:release-notes-style

## Gates that must pass before the pull request
- every entry links its pull request
- no entry is longer than two sentences

## Never
- publish the notes
- describe a change that is not in a merged pull request

## Only a person does this
- publishing the release

If something reads wrong here, fix the property it came from, not the text.

11. Change it later

{
  "nodes": [
    {
      "id": "decision:agent-release-notes-add-breaking-gate",
      "type": "decision",
      "title": "Release notes flag breaking changes first",
      "domain": "agent",
      "props": {
        "choice": "Add the gate 'breaking changes are listed first'.",
        "reason": "Two releases buried a breaking change in the middle of the list.",
        "replaced": "gates had two items"
      }
    }
  ],
  "edges": [
    {
      "from": "decision:agent-release-notes-add-breaking-gate",
      "to": "concept:agent-release-notes",
      "type": "about",
      "evidence": "Release 2.3 and 2.4 notes"
    }
  ]
}

That way the role keeps its own history: open the role in the app and the decisions about it are linked right there.

All properties

PropertyRequiredValue
missionyesOne sentence.
tieryesorchestrate · execute · verify · deliver · knowledge
rungyesstrongest · strong · fast · cheapest
neveryesList
person_onlyyesList
readsList of document ids, in order
gatesList
test_commandText
reposList
pathsList
toolsList
disallowed_toolsList
isolationText, such as worktree
delegate_rungThe rung for work it hands to a helper
teamText
team_rolelead · coordinator · member
job_titleText
writes_graphList: episode, record, decision