Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Added "compass_role_story" and "compass_roles_overview"; changed the definition of "compass_gaps_resolve", "compass_interviews_create", "compass_map_view" and 4 more (60 tools before, 62 now)
⟨38 unchanged words⟩ ) so it always reflects what's still unknown. The resolution alone isn't the map: when the answer says something about a page (who does a step, a tool they use, how a decision gets made), write it there too in the same turn, on the page it's about or as the step, person or system it names. Gaps you raised close without a card; a ⟨7 unchanged words⟩
⟨93 unchanged words⟩ relevant workflow as interviewee when the map knowsoneone. When you have their email,andsendhandthe link with compass_interview_invite next rather than asking the userthetoinviteforwardlinkit;tootherwiseforward.hand the user the link. May return `needs_confirmation` — tell the user who ⟨8 unchanged words⟩
⟨13 unchanged words⟩ can SEE it the way the user does:an isometric drawing wherewheneverytheypageopenisMap: astructure whosetransit-styleshapemapisseenitsfromtypeabove.—Eachpeopleworkflowareis
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"applyToMap":{"description":"Also move the map from the landing date: who does the change's steps, and how long they take, change as the change's effects say (automate, reassign, assist, relax a check, remove). Confirm with the user first; it can't be undone.","type":"boolean"},"approvalId":{"description":"Approval id from a ⟨84 unchanged words⟩
⟨167 unchanged words⟩ to accept in Compass; they don't count untilthen.then, except in a conversation about the map's questions, where what the person tells you (sourceKind 'user') is kept straight away. Always say who said it: sourceKind 'interview' ⟨79 unchanged words⟩
⟨27 unchanged words⟩ Workbench, Caliper, Prism, Ledger, Napkin,zv1the assistant), an API behavior, or a policy. ⟨9 unchanged words⟩
⟨65 unchanged words⟩ sheet","diagram","interface","change","field","study","metric","folder"],"type":"string"},"minItems" ⟨60 unchanged words⟩
Read how a role's job is changing — One ROLE page's story: hands-on hours a month by kind of work (rote, judgment, relationship, sign-off) before its first change or Task landed and now; what landed and when; new work it took on (checks inside Tasks, Tasks it looks after, work a change added), with whether each has settled; the role's size (people × hours each, `hoursAssumed` when the hours are a full-time default) and how much of its month is documented; and the latest analysis, when someone ran one: options for where saved hours could go, each with the stage of its change (proposed = looking into, agreed, done = in place, con…
Read how work is moving across every role — Every role in the workspace in one row each, changed or not: hours documented against its working month, hours a month saved, saved hours by stage (looking into, agreed, in place, confirmed, not placed yet), judgment work before and now, new work, and why a role wants attention (unproven savings, saved hours nobody is placing, no documented steps, no headcount). Plus totals. Use compass_role_story for one role's detail. Talk about roles, never about people.
Changed the definition of "compass_links_create", "compass_step_claims_propose", "compass_step_measures_propose" and 1 more
⟨89 unchanged words⟩ sourceId":{"description":"Id of the interview, email thread, Prism report or page named by sourceKind.","type":" ⟨3 unchanged words⟩ Who says this is true: an interview, an email thread, a Prism desk-research report (prism_report), a page (a DOCUMENT, or the PERSON who ⟨5 unchanged words⟩ ,"enum":["interview","page","user","email_thread","prism_report"],"type":"string"},"toPageId": ⟨372 unchanged words⟩
Changed the definition of "comments_create", "comments_list", "comments_resolve" and 57 more
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Comment on an entity"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Read an entity's comment threads"}
Added "compass_transformations_respond"; changed the definition of "compass_interviews_create", "compass_priority_steps_find", "compass_step_claims_propose" and 1 more (59 tools before, 60 now)
⟨91 unchanged words⟩ :"array"},"focusPrompt":{"description":"WhatThe interviewer's aim (≤2000 chars), never shown to theinterviewerguest:shouldwhydigtheintoteam—isspecificasking,groundedinthe
Added "compass_priority_steps_find", "compass_transformations_get", "compass_transformations_make_change" and 1 more; changed the definition of "compass_step_claims_propose" and "compass_workflow_steps" (55 tools before, 59 now)
Propose who does a workflow's steps and what inPropose claims about who does what in a WORKFLOW, and what each step is done in, from what someone said. Each claim names a step (nodeId from compass_workflow_steps), a page (subjectPageId: a ROLE orPERSONPERSON;pagefor(subjectPageIduses a SYSTEM or DOCUMENT; for impacts a PRIORITY; for holds_to a VALUE), and a relation: owns (accountable for
Added "compass_change_effects_set", "compass_process_diagram_ensure", "compass_scenario_changes" and 8 more; changed the definition of "compass_interviews_create", "compass_links_create", "compass_links_delete" and 5 more (44 tools before, 55 now)
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"anonymous":{"description":"The guest is told it's anonymous and never asked who they are; no name or email is kept, so leave intervieweeName and intervieweeEmail out, and the link isn't emailed from here. Use when the user asks for anonymous interviews.","type":"boolean"},"approvalId":{"description":"Approval id from a ⟨128 unchanged words⟩
⟨10 unchanged words⟩ knowledge graph's connective tissue. Canonical directions: PERSON or ROLE owns WORKFLOW/SYSTEM, PERSON
Certificate recorded, valid to 2026-12-19
Authorization not required
Unknown → Live
First tool surface recorded: 44 tools (server version 0.0.0)
https://api.zerowidth.ai/mcp/x/compass (mcp_streamable_http) — from mcp_registry, with the record
Showing the latest 11 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨180 unchanged words⟩ it: sourceKind 'interview' + the interview id, 'email_thread' + the thread id, 'prism_report' + the desk-research report id, or 'page' + the DOCUMENT or PERSON page ⟨56 unchanged words⟩
⟨453 unchanged words⟩ "},"sourceId":{"description":"The interview, email thread, Prism report or page id, for those kinds.","type ⟨2 unchanged words⟩ {"description":"Who says so: 'interview', 'email_thread', 'prism_report', 'page', or 'user' (the person you're talking with).","enum":["interview","page","user","email_thread","prism_report"],"type":"string"},"workspace": ⟨32 unchanged words⟩
⟨551 unchanged words⟩ "},"sourceId":{"description":"The interview, email thread, Prism report or page id, for those kinds.","type ⟨2 unchanged words⟩ {"enum":["interview","page","user","email_thread","prism_report"],"type":"string"},"workspace": ⟨32 unchanged words⟩
Findsentities across everyanythingtoolinbythenameworkspace in one call — uploaded files (searching the text inside them), folders, Workbench flows, shims, knowledge bases and tasks, Compass pages and changes, Caliper datasets, evals, rubrics, reviews, specs and sources(apps sending agent traces), Ledger entries, Napkin sketches, decks, docs, sheets, diagrams anddecks.interfaces. The same search the person uses in Home. Use it FIRSTwhenwhenever the usernamesmentions something without saying where it lives ('theonboardingSOW',flow''the dispatch interviews', 'thatinvoice page'invoice');.reachTheforqueryaistool'swordsowninlistanyonlyorder:wheneachyouwordalreadymustknowappear in thetool.thing's name, its tags, the names of the folders it's filed under, or the text inside it — so 'northwind sow' finds the SOW filed in the Northwind folder, and 'dispatch interview' finds 'Dispatcher interview 1.md'. Results are ranked best first. Each hit carries its id, kind,andpathworkspace-relative(forpatha link),sofolderPath (where it's filed, top-down), tags, and a snippet when the words were found inside it rather than in its name — say where a thing lives using folderPath. A file's id feeds workspace_files_read; other ids feed thematchingkind's *_gettooltool. Pass folderId to search only inside one folder and everything under it. If nothing comes back, try fewer or different words before telling thepathusermakesitadoesn'tlink.exist. Results only include what the user can see ⟨7 unchanged words⟩
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"folderId":{"description":"Only search inside this folder and the folders under it (ids from workspace_folders_browse or a folder hit).","maxLength":100,"minLength":1,"type":"string"},"kinds":{"description":"Restrict to these kinds (flowfile,pagefolder,datasetflow,evalpage,entrydoc,boarddataset, …). Omit to search everything.","items": ⟨11 unchanged words⟩ ,"rubric","review","spec","source","doc","sheet","diagram","interface","change","folder"],"type":"string"},"minItems":1 ⟨10 unchanged words⟩ :"integer"},"q":{"description":"Case-insensitiveWords,substringanymatchedorder,againstcase-insensitive.names/titles.
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Resolve or reopen a thread"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Say what a change does to steps"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Bring changes in from another tracker"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Raise a Compass open question (gap)"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List Compass open questions (gaps)"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Resolve a Compass open question (gap)"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Reword a Compass open question (gap)"}
⟨34 unchanged words⟩ to answer 'what needs me?' for the map. Also `fillIn`: what the map is missing to say who's responsible for what (priorities with no owner, business units with no lead, people and roles in no unit, priorities with no workflow behind them); not counted in `total`. Next moves: compass_interviews_get to read a transcript, ⟨5 unchanged words⟩ with compass_pages_create; compass_opportunities_accept or compass_opportunities_delete for a proposal. For fillIn, ask the user who owns or leads it, or which unit someone sits in, then compass_links_create with kind owns (person or role → priority or unit) or part_of (person, role or unit → unit); never guess an owner.
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"What's waiting for a decision in Compass"}
{"destructiveHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Email an interview invite"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Who should be interviewed about a page"}
{"destructiveHint":false,"openWorldHint":true,"readOnlyHint":false,"title":"Invite someone to a Compass interview"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Read one Compass interview, transcript included"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List Compass interviews"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Revoke an interview invite link"}
⟨13 unchanged words⟩ tissue. Canonical directions: PERSON or ROLE ownsWORKFLOW/SYSTEMWORKFLOW/SYSTEM/PRIORITY, PERSON or ROLE involved_in WORKFLOW, PERSON holds ⟨6 unchanged words⟩ SYSTEM, PAIN_POINT affects WORKFLOW/SYSTEM/PERSON/ROLE, DOCUMENT documents anything, PRIORITY contributes_to PRIORITY (a priority that ladders up to a bigger one; each ladders up to at most one, and choosing a new one moves it; a priority has one owner the same way), UNIT part_of UNIT and ROLE or PERSON part_of UNIT (the org chart: one parent each; a UNIT's lead owns it, one owner), relates_to as fallback. Prefer attaching responsibilities to ⟨83 unchanged words⟩
⟨46 unchanged words⟩ ,"delivers","affects","documents","relates_to","contributes_to","part_of"],"type":"string"},"note":{ ⟨448 unchanged words⟩
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Connect two Compass pages"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Remove a connection between two pages"}
⟨39 unchanged words⟩ ,"delivers","affects","documents","relates_to","contributes_to","part_of"],"type":"string"},"linkId":{ ⟨389 unchanged words⟩
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Change a connection's reading, note, or dates"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"View the Compass map (rendered image)"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Accept an AI-proposed opportunity"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Capture an opportunity"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Delete an opportunity"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List Compass opportunities"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Record that the change landed"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Propose an AI opportunity"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Pre-register an experiment's expectation"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Move a change to another status"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Edit an opportunity"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List a page's connections"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Create a Compass page"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Delete a Compass page"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Get a Compass page"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List Compass pages"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Restore a deleted Compass page"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Search Compass pages"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Update a Compass page"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Find the steps behind a priority or value"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Give a workflow its steps diagram"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List the changes that reach a workflow"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List the workspace's change statuses"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List what's been said about a workflow's steps"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Propose who does a workflow's steps and what in"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Propose what a workflow's steps take"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Build what a step suggestion names"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List which of a workflow's steps something could do"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Read a priority's transformations"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Make a change from a transformation level"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Read a priority's transformations again"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":false,"title":"Record what's true about a transformation level"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"What we've learned about a workflow"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Roll up what a workflow takes"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List a workflow's steps and who does them"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Browse the workspace's tags"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Read the tags on entities"}
{"destructiveHint":true,"openWorldHint":false,"readOnlyHint":false,"title":"Set an entity's tags"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Fetch ZeroWidth doc by slug"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"List ZeroWidth docs pages"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Search ZeroWidth docs"}
{"destructiveHint":false,"openWorldHint":false,"readOnlyHint":true,"title":"Search the whole workspace"}
⟨38 unchanged words⟩ them on the priority's page or in theInbox.Inbox, except in workflows someone tied to it (a serves link), where they're kept at once. Steps already tied or proposed aren't proposed again ⟨28 unchanged words⟩
⟨28 unchanged words⟩ , a page (subjectPageId: a ROLE orPERSON;PERSON, or an AUDIENCE when a customer or partner does the step; for uses a SYSTEM or DOCUMENT; for impacts ⟨197 unchanged words⟩
⟨69 unchanged words⟩ ]},"subjectPageId":{"description":"The ROLE, PERSON orPERSONAUDIENCE page id; for uses, the SYSTEM or ⟨436 unchanged words⟩
⟨10 unchanged words⟩ with its step effects and the priority itserves.serves, and starts drafting in Workbench up to three flows for what the level says to build (`builds`, each `drafting` until ready). Only a level that fits, once per level. May return `needs_confirmation`.
Record what's true about a transformation level — Records what someone told you about one level of a PRIORITY's current transformations, in their words or a faithful summary: that they already do it, what rules it out, a system that isn't ready, work still done on paper, and so on. Compass works out what it means in the background: a label for the level, facts kept on the steps they're about (every later reading of those workflows sees them), and open questions to confirm. Then it reads the priority again. Use it whenever a conversation settles something about a level, so it lands on the priority's page, not only in this chat.
⟨4 unchanged words⟩ "claims":{"items":{"properties":{"limits":{"description":"For impacts: this step holds the priority back most right now.","type":"boolean"},"nodeId":{"anyOf":[{"type":"string ⟨25 unchanged words⟩ ,"type":"string"},"relation":{"anyOf":[{"enum":["owns","does","approves","consulted","does_not_do"],"type":"string"},{"enum":["uses","impacts","holds_to"],"type":"string"}]},"subjectPageId":{"description":"The ROLE or PERSON page id; for uses, the SYSTEM or DOCUMENT page id; for impacts, the PRIORITY page id; for holds_to, the VALUE page id.","type":"string"}," ⟨419 unchanged words⟩
⟨28 unchanged words⟩ approves, is consulted on, or doesn't doit.it, and `uses`: the systems or documents it's done in. `unknown: true` means nothing that countshas beensayssaidwhoaboutdoes the step or what it's done in — those are the questions worth asking in an interview. A step with `uses` and nobody on it is one a system runs; don't ask who does it. `disputed` lists roles or people with conflicting claims; ⟨48 unchanged words⟩
Find the steps behind a priority or value — Reads every mapped workflow against one PRIORITY (or VALUE) and proposes the steps that move it (or where the business lives the value), one marked as what holds a priority back. Proposals wait for a person to keep them on the priority's page or in the Inbox. Steps already tied or proposed aren't proposed again, so it's safe to run as the map grows. Use it after a priority is named and workflows are mapped, or when someone asks what moves a priority.
Read a priority's transformations — What the workflows behind a PRIORITY could become, at five levels (Assist, Automate, Re-form, Invert, Dissolve): for each, whether it fits, is already reached, or what it needs; what changes; what it does to the priority; time freed; and the change made from it, if any. Also the recommended level, or `settled` when the work is good as it is. state 'running' means a read is under way; null means none has been read (compass_transformations_read starts one).
Make a change from a transformation level — Creates a Change from one level of a priority's transformations, with its step effects and the priority it serves. Only a level that fits, once per level. May return `needs_confirmation`.
Read a priority's transformations again — Starts reading the five levels for a PRIORITY in the background (a minute or two). Needs at least one kept step that impacts the priority. A read under way is left to finish. Check back with compass_transformations_get.
⟨40 unchanged words⟩ ","enum":["owns","involved_in","holds","uses","serves","delivers","affects"," ⟨36 unchanged words⟩ ,"AI_ACCEPTED"],"type":"string"},"sourceId":{"description":"Id of the interview or page named by sourceKind.","type":"string"},"sourceKind":{"description":"Who says this is true: an interview, a page (a DOCUMENT, or the PERSON who told you), or the user.","enum":["interview","page","user"],"type":"string"},"toPageId":{"description":"Edge target page id.","type":"string"},"validFrom":{"anyOf":[{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","type":"string"},{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","type":"string"}],"description":"When the relationship started being true (YYYY-MM-DD). Omit when unknown."},"validTo":{"anyOf":[{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","type":"string"},{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","type":"string"}],"description":"When it stopped being true (YYYY-MM-DD). Only for a relationship that has already ended — recording history."},"workspace":{"description":"Workspace slug. ⟨30 unchanged words⟩
Deletes one edge from the graph (the pages stay). Use only when a connectioniswassimplyneverwrongtrue — the system isn't used by that workflow, it was recorded by mistake. When a relationship WAS true and has stopped (the person left theteam.team, moved roles), end it with compass_links_update `validTo` instead, so the history stays. Link ids come from compass_page_links_list. Re-creating the same ⟨7 unchanged words⟩
Change a connection's reading, note, ornotedates
⟨6 unchanged words⟩ pages: its `kind` (how the two relate), its `note`, and/oritswhen`note`.it was true (`validFrom` / `validTo`). Use kind to CORRECT a connection typed wrongly — 'Dana doesn't own billing, she's involved in it'. Use validTo to END one that used to be true — 'Dana handed approvals to Sam in March' ends Dana's edge in March (then create Sam's from March); the old edge stays as history. Don't delete a relationship that ended; end it. Link ids come from compass_page_links_list. Fails with conflict ⟨19 unchanged words⟩
⟨33 unchanged words⟩ ","enum":["owns","involved_in","holds","uses","serves","delivers","affects"," ⟨26 unchanged words⟩ it.","maxLength":500,"type":"string"},"validFrom":{"anyOf":[{"anyOf":[{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","type":"string"},{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","type":"string"}]},{"type":"null"}],"description":"When it started being true (YYYY-MM-DD); null clears it."},"validTo":{"anyOf":[{"anyOf":[{"format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$","type":"string"},{"format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","type":"string"}]},{"type":"null"}],"description":"When it stopped being true (YYYY-MM-DD) — ends the relationship; null reopens it."},"workspace":{"description":"Workspace slug. ⟨28 unchanged words⟩
⟨54 unchanged words⟩ to change.","type":"string"},"fromRollup":{"description":"Instead of metricId: measure it off the change's workflow roll-up — a step's (nodeId) or the whole workflow's hands-on time, waiting, labor, or hard cost, per run or per month. Creates a daily-fed metric with the last 30 days rebuilt from the map's history, so the before is on record. Needs a target; comparator defaults to <=.","properties":{"bound":{"default":"mid","enum":["low","high","mid"],"type":"string"},"currency":{"pattern":"^[A-Z]{3}$","type":"string"},"field":{"enum":["working","waiting","labor","hardCost"],"type":"string"},"nodeId":{"maxLength":200,"minLength":1,"type":"string"},"scope":{"default":"perRun","enum":["perRun","perMonth"],"type":"string"},"variantId":{"maxLength":64,"minLength":1,"type":"string"}},"required":["field"],"type":"object"},"metricId":{"description":"Ledger metric to bind (requires target ⟨19 unchanged words⟩ "description":"Target value, in the metric'sunit.unit (hours for time).","type":"number"},"workspace":{ ⟨32 unchanged words⟩
⟨19 unchanged words⟩ understand a subject's neighborhood before adding to it. Current connections only, unless includeEnded — then also relationships that have ended (validTo in the past), for questions like who handled this before.
{"$schema":"http://json-schema.org/draft-07/schema#","properties":{"includeEnded":{"description":"Also return connections that have ended.","type":"boolean"},"pageId":{"description":"The page id.", ⟨34 unchanged words⟩
⟨65 unchanged words⟩ {"description":"Page type for this subject. PERSON = a specific individual; ROLE = a job, separate from whoever holds it (people hold roles); VALUE = something the business won't sacrifice; PRIORITY ⟨92 unchanged words⟩
⟨12 unchanged words⟩ to one node type (WORKFLOW, PERSON, ROLE, SYSTEM, PAIN_POINT, DOCUMENT, VALUE, PRIORITY, AUDIENCE ⟨39 unchanged words⟩
⟨44 unchanged words⟩ a specific page type (WORKFLOW, PERSON, ROLE, SYSTEM, PAIN_POINT, DOCUMENT, VALUE, PRIORITY, AUDIENCE ⟨34 unchanged words⟩
Say what a change does to steps — Replace a change's effects: for each step it reaches (workflowPageId + nodeId from compass_workflow_steps — a sub-workflow's steps included), one of eliminate, automate (reviewMinutes: what a person still spends checking), parallelize (its wait comes off the critical path), relax_gate (keepShare: share of the wait left, default 0.25), assist (keepShare: share of hands-on time left, default 0.5), reassign (toSubjectPageId). Eliminating or automating every step of a sub-workflow collapses the step that is that sub-workflow. Then project with compass_workflow_rollup changeIds. May return `needs_…
Give a workflow its steps diagram — Returns the Napkin diagram that holds a WORKFLOW page's steps, creating it when the page has none. If the page body has a ```mermaid block, it moves into the diagram verbatim (node ids kept, so changes anchored to a step still point at it) and leaves the body. Then edit the steps with napkin_diagrams_update using the returned diagramId. One diagram per workflow holds every step anyone has described — when two people describe the same process differently, add the steps to this one diagram rather than making a second. A step that is itself a workflow is a node whose meta ref is { type: 'page', …
List the changes that reach a workflow — Changes whose effects reach a WORKFLOW's steps — or any nested workflow's — plus changes anchored to it with no effects yet, each with what it does per step. Pass their ids to compass_workflow_rollup's changeIds to project the workflow after them.
List what's been said about a workflow's steps — Every claim about a WORKFLOW's steps, oldest first: the step (nodeId; null = the workflow as a whole), the role or person (subject), the relation, who says so (sourceKind + sourceLabel), when it was true (validFrom/validTo), and origin — AI_PROPOSED claims are waiting for a person to review. Claims that disagree coexist; each keeps its source.
Propose who does a workflow's steps — Propose claims about who does what in a WORKFLOW, from what someone said. Each claim names a step (nodeId from compass_workflow_steps), a ROLE or PERSON page (subjectPageId), and a relation: owns (accountable for it), does (does the work), approves (signs off), consulted (asked for input), does_not_do (says they don't do it — an answer, not a gap). Claims land as proposals for a person to accept in Compass; they don't count until then. Always say who said it: sourceKind 'interview' + the interview id, or 'page' + the DOCUMENT or PERSON page id. Prefer the ROLE when the person speaks for their…
Propose what a workflow's steps take — Propose estimates from what someone said, as ranges — people know "20 minutes to an hour", not "37 minutes"; when they give one number, use it for both ends. Each item is either a `measure` or a `gate` on a step (nodeId from compass_workflow_steps): - measure.metric `working`: hands-on minutes per run (low/high). - measure.metric `waiting`: minutes the work sits idle before or inside the step — ask about this separately; it's usually most of the waste. - measure.metric `hardCost`: money that isn't anyone's time (amount, currency, per run or month). - measure.metric `frequency` with nodeId nul…
Build what a step suggestion names — Builds a step suggestion the way Compass's Build button does: makes its change if it isn't one yet, then the thing in Workbench — a flow drafted from the step itself (who does it, its times, systems, write-up, attachments, interview notes) and its checklist; a shim named for the decision; or a task whose sentence is the steps. Use this, not workbench_flows_scaffold, whenever the work came from a step suggestion. Returns what was built and, for a flow, what the draft still needs. Fails if something's already built for it.
List which of a workflow's steps something could do — Your earlier read of a WORKFLOW's steps: for each suggestion, the steps it covers (nodeIds, labels), what could do them (proposal.doer: a flow and its mode, a shim, or a task), whether it does the step or helps (reach), why, and what it would take (checklist, each item met or not). state OPEN is waiting for a person; APPLIED made a change (opportunityId), and `built` is what was built for it in Workbench, if anything. Pass changeId instead of pageId to get the one suggestion a change came from. To build one, use compass_step_suggestions_build — not workbench_flows_scaffold.
What we've learned about a workflow — Newest first: steps added to or dropped from the diagram (and by whom), and claims about who does what or what a step takes — said, corrected (with what they replaced), withdrawn, or accepted from a proposal — each with its source. This is when we LEARNED things; when they were true is each claim's validFrom/validTo. Use it to brief someone on what changed in the picture, or to see what an interview added.
Roll up what a workflow takes — Per run and per month: hands-on minutes, waiting minutes, labor cost (hands-on time priced through each role's hourly rate), and hard costs, each as a low–high range, with every step's share and its gates (approvals, handoffs, re-keying, rework). A step that is itself a workflow uses that workflow's roll-up unless it has its own estimate. `coverage` says how many steps are timed — always say how much of the total rests on estimates before quoting it, and never present a range as one number. `unpricedRoles` are roles doing timed work with no hourly rate; their time counts and its cost doesn't.…
List a workflow's steps and who does them — Every step in a WORKFLOW page's steps diagram, in diagram order, with its phase, whether it is itself a workflow (subWorkflowPageId), and who the map says owns, does, approves, is consulted on, or doesn't do it. `unknown: true` means nothing that counts has been said about the step — those are the questions worth asking in an interview. `disputed` lists roles or people with conflicting claims; ask about those rather than picking a side. `proposals` counts claims waiting for review. `variants` are named subsets of the steps ("rush job", "enterprise client"); each step lists the variants it bel…