# Tool-function correlation DAG

This artifact is a directed acyclic graph, not an undirected similarity map. Every arrow has one source, one target, an execution-order constraint, and a reproducible correlation score.

## Rendered DAG

```mermaid
flowchart LR
  start((task))
  subgraph discovery["Discovery"]
    direction TB
    n00["search_crm_accounts<br/>crm · read"]
    n01["search_support_tickets<br/>support · read"]
    n02["list_billing_invoices<br/>billing · read"]
    n03["search_engineering_repositories<br/>engineering · read"]
    n04["search_knowledge_documents<br/>knowledge · read"]
  end
  subgraph entity_reads["Entity reads"]
    direction TB
    n05["get_crm_account<br/>crm · read"]
    n06["get_support_ticket<br/>support · read"]
    n07["get_billing_invoice<br/>billing · read"]
    n08["search_engineering_pull_requests<br/>engineering · read"]
    n09["get_engineering_pull_request<br/>engineering · read"]
  end
  subgraph primary_mutations["Primary mutations"]
    direction TB
    n10["get_knowledge_document<br/>knowledge · read"]
    n11["search_crm_employees<br/>crm · read"]
    n12["update_crm_owner<br/>crm · write"]
    n13["create_crm_contact<br/>crm · write"]
    n14["create_support_ticket<br/>support · write"]
    n15["update_support_priority<br/>support · write"]
    n16["update_billing_hold<br/>billing · write"]
    n17["update_billing_release<br/>billing · write"]
  end
  subgraph cross-system_coordination["Cross-system coordination"]
    direction TB
    n18["update_billing_payment<br/>billing · write"]
    n19["create_billing_refund<br/>billing · write"]
    n20["create_engineering_issue<br/>engineering · write"]
    n21["update_engineering_ticket_link<br/>engineering · write"]
    n22["update_engineering_review<br/>engineering · write"]
    n23["update_knowledge_runbook<br/>knowledge · write"]
  end
  subgraph closeout_and_evidence["Closeout and evidence"]
    direction TB
    n24["create_knowledge_policy_ack<br/>knowledge · write"]
    n25["add_support_internal_note<br/>support · write"]
    n26["update_crm_account_health<br/>crm · write"]
    n27["update_engineering_merge<br/>engineering · write"]
    n28["update_knowledge_finding<br/>knowledge · write"]
    n29["update_support_resolution<br/>support · write"]
  end
  start --> n00
  start --> n03
  n00 -->|0.263| n01
  n00 -->|0.166| n04
  n00 -->|0.193| n05
  n01 -->|0.400| n02
  n01 -->|0.182| n04
  n01 -->|0.212| n05
  n01 -->|0.210| n06
  n02 -->|0.245| n04
  n02 -->|0.260| n05
  n02 -->|0.225| n07
  n03 -->|0.415| n04
  n03 -->|0.170| n06
  n03 -->|0.225| n20
  n04 -->|0.407| n05
  n04 -->|0.139| n06
  n04 -->|0.300| n10
  n05 -->|0.366| n06
  n05 -->|0.287| n10
  n05 -->|0.243| n11
  n05 -->|0.350| n12
  n05 -->|0.279| n28
  n06 -->|0.436| n07
  n06 -->|0.283| n08
  n06 -->|0.180| n10
  n06 -->|0.075| n11
  n06 -->|0.275| n15
  n06 -->|0.099| n23
  n06 -->|0.380| n29
  n07 -->|0.117| n08
  n07 -->|0.241| n10
  n07 -->|0.146| n12
  n07 -->|0.307| n16
  n07 -->|0.312| n19
  n08 -->|0.425| n09
  n09 -->|0.345| n10
  n09 -->|0.140| n15
  n09 -->|0.320| n21
  n09 -->|0.350| n22
  n10 -->|0.294| n11
  n10 -->|0.339| n12
  n10 -->|0.220| n15
  n10 -->|0.176| n16
  n10 -->|0.185| n17
  n10 -->|0.212| n19
  n10 -->|0.245| n21
  n10 -->|0.336| n23
  n10 -->|0.108| n25
  n11 -->|0.196| n12
  n11 -->|0.140| n13
  n11 -->|0.117| n15
  n11 -->|0.210| n23
  n12 -->|0.715| n13
  n12 -->|0.315| n17
  n13 -->|0.500| n14
  n14 -->|0.350| n23
  n14 -->|0.400| n25
  n15 -->|0.166| n16
  n15 -->|0.750| n20
  n15 -->|0.107| n22
  n15 -->|0.662| n25
  n16 -->|0.743| n19
  n16 -->|0.166| n22
  n16 -->|0.161| n25
  n17 -->|1.000| n18
  n18 -->|0.350| n25
  n19 -->|0.350| n25
  n20 -->|0.175| n22
  n20 -->|0.225| n23
  n20 -->|0.070| n24
  n20 -->|0.045| n31
  n21 -->|0.800| n22
  n22 -->|0.105| n23
  n22 -->|0.233| n25
  n22 -->|0.600| n27
  n22 -->|0.052| n31
  n23 -->|0.760| n24
  n23 -->|0.104| n25
  n23 -->|0.647| n28
  n23 -->|0.063| n30
  n24 -->|0.117| n25
  n24 -->|0.196| n28
  n24 -->|0.117| n30
  n24 -->|0.071| n31
  n25 -->|0.350| n26
  n25 -->|0.350| n27
  n25 -->|0.780| n29
  n25 -->|0.141| n31
  n26 -->|0.310| n29
  n26 -->|0.600| n30
  n26 -->|0.044| n31
  n27 -->|0.350| n29
  n28 -->|0.214| n31
  n29 -->|0.222| n30
  n29 -->|0.097| n31
  n30 -->|0.105| n31
  classDef crm fill:#D6ECFF,stroke:#29313D,stroke-width:1px,color:#111827
  class n00,n05,n11,n12,n13,n26,n30 crm
  classDef support fill:#E7DFFF,stroke:#29313D,stroke-width:1px,color:#111827
  class n01,n06,n14,n15,n25,n29 support
  classDef billing fill:#D9F7E8,stroke:#29313D,stroke-width:1px,color:#111827
  class n02,n07,n16,n17,n18,n19 billing
  classDef engineering fill:#FFE8CC,stroke:#29313D,stroke-width:1px,color:#111827
  class n03,n08,n09,n20,n21,n22,n27 engineering
  classDef knowledge fill:#FFE0EA,stroke:#29313D,stroke-width:1px,color:#111827
  class n04,n10,n23,n24,n28,n31 knowledge
  classDef terminal fill:#111827,stroke:#111827,color:#FFFFFF
  class start terminal
```

The same complete graph is available as `TOOL_GRAPH.mmd`, `tool_graph.dot`, and `tool_graph.json` for rendering or programmatic use.

## Machine-checked DAG proof

| proof field | value |
|---|---|
| algorithm | Kahn topological sort |
| nodes visited | 32 / 32 |
| unvisited/cyclic nodes | 0 |
| back edges | 0 |
| strict lower-rank → higher-rank orientation | true |

A Kahn topological sort is recomputed during build and validation. The build fails if fewer than all 32 nodes are visited, if any back edge is present, or if a task path contains a missing/reversed edge.

## Correlation formula

`0.30*entity_overlap + 0.30*state_dependency + 0.20*workflow_adjacency + 0.15*task_cooccurrence + 0.05*argument_binding`

- `entity_overlap`: Jaccard overlap of tables/resources touched.
- `state_dependency`: 1 when the source writes state read or written by the target.
- `workflow_adjacency`: adjacent occurrences divided by the lower tool task count.
- `task_cooccurrence`: ordered co-occurrences divided by the lower tool task count.
- `argument_binding`: 1 when both functions bind the same entity-id field.

Edges always point from lower dag_rank to higher dag_rank. This turns workflow correlation into an executable ordering constraint and makes cycles structurally impossible.

Nodes: **32**. Edges: **95**.

## Functions

| rank | function | server | mode | tasks | in | out |
|---:|---|---|---|---:|---:|---:|
| 0 | `search_crm_accounts` | crm | read | 40 | 0 | 3 |
| 1 | `search_support_tickets` | support | read | 50 | 1 | 4 |
| 2 | `list_billing_invoices` | billing | read | 30 | 1 | 3 |
| 3 | `search_engineering_repositories` | engineering | read | 30 | 0 | 3 |
| 4 | `search_knowledge_documents` | knowledge | read | 85 | 4 | 3 |
| 5 | `get_crm_account` | crm | read | 90 | 4 | 5 |
| 6 | `get_support_ticket` | support | read | 80 | 4 | 7 |
| 7 | `get_billing_invoice` | billing | read | 30 | 2 | 5 |
| 8 | `search_engineering_pull_requests` | engineering | read | 30 | 2 | 1 |
| 9 | `get_engineering_pull_request` | engineering | read | 30 | 1 | 4 |
| 10 | `get_knowledge_document` | knowledge | read | 70 | 5 | 9 |
| 11 | `search_crm_employees` | crm | read | 24 | 3 | 4 |
| 12 | `update_crm_owner` | crm | write | 18 | 4 | 2 |
| 13 | `create_crm_contact` | crm | write | 10 | 2 | 1 |
| 14 | `create_support_ticket` | support | write | 10 | 1 | 2 |
| 15 | `update_support_priority` | support | write | 40 | 4 | 4 |
| 16 | `update_billing_hold` | billing | write | 19 | 3 | 3 |
| 17 | `update_billing_release` | billing | write | 10 | 2 | 1 |
| 18 | `update_billing_payment` | billing | write | 10 | 1 | 1 |
| 19 | `create_billing_refund` | billing | write | 9 | 3 | 1 |
| 20 | `create_engineering_issue` | engineering | write | 20 | 2 | 4 |
| 21 | `update_engineering_ticket_link` | engineering | write | 10 | 2 | 1 |
| 22 | `update_engineering_review` | engineering | write | 30 | 5 | 4 |
| 23 | `update_knowledge_runbook` | knowledge | write | 47 | 6 | 4 |
| 24 | `create_knowledge_policy_ack` | knowledge | write | 24 | 2 | 4 |
| 25 | `add_support_internal_note` | support | write | 70 | 9 | 4 |
| 26 | `update_crm_account_health` | crm | write | 26 | 1 | 3 |
| 27 | `update_engineering_merge` | engineering | write | 7 | 2 | 1 |
| 28 | `update_knowledge_finding` | knowledge | write | 18 | 3 | 1 |
| 29 | `update_support_resolution` | support | write | 50 | 4 | 2 |
| 30 | `add_crm_interaction` | crm | write | 30 | 4 | 1 |
| 31 | `create_knowledge_audit_event` | knowledge | write | 44 | 8 | 0 |

## Every directed correlation

| source → target | score | adjacent / co-occurring tasks | cross-server | why |
|---|---:|---:|---|---|
| `search_crm_accounts` → `search_support_tickets` | 0.2625 | 30 / 30 | yes | adjacent in 30 tasks |
| `search_crm_accounts` → `search_knowledge_documents` | 0.1663 | 10 / 31 | yes | adjacent in 10 tasks |
| `search_crm_accounts` → `get_crm_account` | 0.1929 | 0 / 40 | no | shared resources accounts; search result selects account_id |
| `search_support_tickets` → `list_billing_invoices` | 0.4000 | 30 / 30 | yes | shared identifiers account_id; adjacent in 30 tasks |
| `search_support_tickets` → `search_knowledge_documents` | 0.1820 | 17 / 38 | yes | adjacent in 17 tasks |
| `search_support_tickets` → `get_crm_account` | 0.2120 | 3 / 50 | yes | shared identifiers account_id; adjacent in 3 tasks |
| `search_support_tickets` → `get_support_ticket` | 0.2100 | 0 / 50 | no | shared resources tickets; search result selects ticket_id |
| `list_billing_invoices` → `search_knowledge_documents` | 0.2450 | 21 / 21 | yes | adjacent in 21 tasks |
| `list_billing_invoices` → `get_crm_account` | 0.2600 | 9 / 30 | yes | shared identifiers account_id; adjacent in 9 tasks |
| `list_billing_invoices` → `get_billing_invoice` | 0.2250 | 0 / 30 | no | shared resources invoices; invoice list selects invoice_id |
| `search_engineering_repositories` → `search_knowledge_documents` | 0.4150 | 27 / 27 | yes | shared resources legal_holds; adjacent in 27 tasks |
| `search_engineering_repositories` → `get_support_ticket` | 0.1700 | 3 / 30 | yes | adjacent in 3 tasks |
| `search_engineering_repositories` → `create_engineering_issue` | 0.2250 | 0 / 20 | no | shared resources repositories; repository search selects repository_id for issue creation |
| `search_knowledge_documents` → `get_crm_account` | 0.4069 | 78 / 78 | yes | shared resources documents, legal_holds; adjacent in 78 tasks |
| `search_knowledge_documents` → `get_support_ticket` | 0.1394 | 7 / 65 | yes | adjacent in 7 tasks |
| `search_knowledge_documents` → `get_knowledge_document` | 0.3000 | 0 / 70 | no | shared resources documents, legal_holds; document search selects document_id; search returns document metadata only, so the in-force edition must be opened before its clauses can be applied |
| `get_crm_account` → `get_support_ticket` | 0.3663 | 70 / 70 | yes | shared resources accounts, disputes; adjacent in 70 tasks |
| `get_crm_account` → `get_knowledge_document` | 0.2875 | 14 / 63 | yes | shared resources documents, employees, legal_holds; adjacent in 14 tasks |
| `get_crm_account` → `search_crm_employees` | 0.2429 | 6 / 24 | no | shared resources employees; adjacent in 6 tasks |
| `get_crm_account` → `update_crm_owner` | 0.3500 | 0 / 18 | no | shared resources accounts, conflicts, documents, employees; shared identifiers account_id; an unresolved conflict-of-interest record on the account blocks assignment |
| `get_crm_account` → `update_knowledge_finding` | 0.2786 | 0 / 18 | yes | shared resources audit_findings, disputes, documents; the finding's required evidence kind and domain are read from its account |
| `get_support_ticket` → `get_billing_invoice` | 0.4357 | 30 / 30 | yes | shared resources accounts, disputes; adjacent in 30 tasks |
| `get_support_ticket` → `search_engineering_pull_requests` | 0.2833 | 20 / 30 | yes | adjacent in 20 tasks |
| `get_support_ticket` → `get_knowledge_document` | 0.1800 | 21 / 56 | yes | adjacent in 21 tasks |
| `get_support_ticket` → `search_crm_employees` | 0.0750 | 3 / 8 | yes | adjacent in 3 tasks |
| `get_support_ticket` → `update_support_priority` | 0.2750 | 3 / 40 | no | shared resources tickets; shared identifiers ticket_id; adjacent in 3 tasks |
| `get_support_ticket` → `update_knowledge_runbook` | 0.0989 | 3 / 27 | yes | adjacent in 3 tasks |
| `get_support_ticket` → `update_support_resolution` | 0.3800 | 0 / 50 | no | shared resources issues, ticket_notes, tickets; shared identifiers ticket_id; an open critical linked issue on the case blocks resolution |
| `get_billing_invoice` → `search_engineering_pull_requests` | 0.1167 | 10 / 10 | yes | adjacent in 10 tasks |
| `get_billing_invoice` → `get_knowledge_document` | 0.2412 | 14 / 21 | yes | shared resources legal_holds; adjacent in 14 tasks |
| `get_billing_invoice` → `update_crm_owner` | 0.1458 | 3 / 9 | yes | shared resources accounts; adjacent in 3 tasks |
| `get_billing_invoice` → `update_billing_hold` | 0.3066 | 3 / 19 | no | shared resources invoices; shared identifiers invoice_id; adjacent in 3 tasks |
| `get_billing_invoice` → `create_billing_refund` | 0.3125 | 0 / 9 | no | shared resources accounts, disputes, invoices; shared identifiers invoice_id; the invoice's dispute state and amount band decide whether and how much credit may be issued |
| `search_engineering_pull_requests` → `get_engineering_pull_request` | 0.4250 | 30 / 30 | no | shared resources pull_requests; adjacent in 30 tasks |
| `get_engineering_pull_request` → `get_knowledge_document` | 0.3450 | 21 / 21 | yes | shared resources employees, legal_holds; adjacent in 21 tasks |
| `get_engineering_pull_request` → `update_support_priority` | 0.1400 | 6 / 20 | yes | adjacent in 6 tasks |
| `get_engineering_pull_request` → `update_engineering_ticket_link` | 0.3200 | 3 / 10 | no | shared resources pull_requests; shared identifiers pull_request_id; adjacent in 3 tasks |
| `get_engineering_pull_request` → `update_engineering_review` | 0.3500 | 0 / 30 | no | shared resources employees, pull_requests; shared identifiers pull_request_id; the change's author must be known before a reviewer can be chosen |
| `get_knowledge_document` → `search_crm_employees` | 0.2938 | 15 / 15 | yes | shared resources employees; adjacent in 15 tasks |
| `get_knowledge_document` → `update_crm_owner` | 0.3389 | 8 / 12 | yes | shared resources documents, employees, policy_rules; adjacent in 8 tasks |
| `get_knowledge_document` → `update_support_priority` | 0.2200 | 23 / 28 | yes | adjacent in 23 tasks |
| `get_knowledge_document` → `update_billing_hold` | 0.1763 | 7 / 13 | yes | adjacent in 7 tasks |
| `get_knowledge_document` → `update_billing_release` | 0.1850 | 1 / 7 | yes | shared resources legal_holds; adjacent in 1 tasks |
| `get_knowledge_document` → `create_billing_refund` | 0.2125 | 0 / 6 | yes | shared resources documents, employees, policy_rules; create_billing_refund requires the cited policy clause and the approver the delegation clause names, both read from the in-force policy document |
| `get_knowledge_document` → `update_engineering_ticket_link` | 0.2450 | 7 / 7 | yes | adjacent in 7 tasks |
| `get_knowledge_document` → `update_knowledge_runbook` | 0.3362 | 8 / 32 | no | shared resources documents, legal_holds; shared identifiers document_id; adjacent in 8 tasks |
| `get_knowledge_document` → `add_support_internal_note` | 0.1079 | 1 / 49 | yes | adjacent in 1 tasks |
| `search_crm_employees` → `update_crm_owner` | 0.1961 | 7 / 7 | no | shared resources employees; adjacent in 7 tasks |
| `search_crm_employees` → `create_crm_contact` | 0.1400 | 1 / 8 | no | adjacent in 1 tasks |
| `search_crm_employees` → `update_support_priority` | 0.1167 | 8 / 8 | yes | adjacent in 8 tasks |
| `search_crm_employees` → `update_knowledge_runbook` | 0.2104 | 8 / 23 | yes | adjacent in 8 tasks |
| `update_crm_owner` → `create_crm_contact` | 0.7150 | 9 / 9 | no | source mutation changes state consumed by the target; shared resources accounts; shared identifiers account_id; adjacent in 9 tasks |
| `update_crm_owner` → `update_billing_release` | 0.3150 | 9 / 9 | yes | adjacent in 9 tasks |
| `create_crm_contact` → `create_support_ticket` | 0.5000 | 10 / 10 | yes | shared resources accounts; shared identifiers account_id; adjacent in 10 tasks |
| `create_support_ticket` → `update_knowledge_runbook` | 0.3500 | 10 / 10 | yes | adjacent in 10 tasks |
| `create_support_ticket` → `add_support_internal_note` | 0.4000 | 0 / 0 | no | source mutation changes state consumed by the target; shared resources tickets; created ticket_id can receive an internal note |
| `update_support_priority` → `update_billing_hold` | 0.1658 | 9 / 9 | yes | adjacent in 9 tasks |
| `update_support_priority` → `create_engineering_issue` | 0.7500 | 20 / 20 | yes | source mutation changes state consumed by the target; shared resources tickets; adjacent in 20 tasks |
| `update_support_priority` → `update_engineering_review` | 0.1067 | 1 / 20 | yes | adjacent in 1 tasks |
| `update_support_priority` → `add_support_internal_note` | 0.6625 | 10 / 30 | no | source mutation changes state consumed by the target; shared resources tickets; shared identifiers ticket_id; adjacent in 10 tasks |
| `update_billing_hold` → `create_billing_refund` | 0.7429 | 9 / 9 | no | source mutation changes state consumed by the target; shared resources invoices; shared identifiers invoice_id; adjacent in 9 tasks |
| `update_billing_hold` → `update_engineering_review` | 0.1658 | 9 / 9 | yes | adjacent in 9 tasks |
| `update_billing_hold` → `add_support_internal_note` | 0.1605 | 1 / 19 | yes | adjacent in 1 tasks |
| `update_billing_release` → `update_billing_payment` | 1.0000 | 10 / 10 | no | source mutation changes state consumed by the target; shared resources invoices, legal_holds; shared identifiers invoice_id; adjacent in 10 tasks |
| `update_billing_payment` → `add_support_internal_note` | 0.3500 | 10 / 10 | yes | adjacent in 10 tasks |
| `create_billing_refund` → `add_support_internal_note` | 0.3500 | 9 / 9 | yes | adjacent in 9 tasks |
| `create_engineering_issue` → `update_engineering_review` | 0.1750 | 10 / 10 | no | adjacent in 10 tasks |
| `create_engineering_issue` → `update_knowledge_runbook` | 0.2250 | 9 / 18 | yes | adjacent in 9 tasks |
| `create_engineering_issue` → `create_knowledge_policy_ack` | 0.0700 | 1 / 8 | yes | adjacent in 1 tasks |
| `create_engineering_issue` → `create_knowledge_audit_event` | 0.0450 | 0 / 6 | yes | created issue can be recorded in the audit stream |
| `update_engineering_ticket_link` → `update_engineering_review` | 0.8000 | 10 / 10 | no | source mutation changes state consumed by the target; shared resources pull_requests; shared identifiers pull_request_id; adjacent in 10 tasks |
| `update_engineering_review` → `update_knowledge_runbook` | 0.1050 | 9 / 9 | yes | adjacent in 9 tasks |
| `update_engineering_review` → `add_support_internal_note` | 0.2333 | 20 / 20 | yes | adjacent in 20 tasks |
| `update_engineering_review` → `update_engineering_merge` | 0.6000 | 0 / 7 | no | source mutation changes state consumed by the target; shared resources pull_requests; shared identifiers pull_request_id; update_engineering_merge refuses a pull request with no recorded reviewer |
| `update_engineering_review` → `create_knowledge_audit_event` | 0.0517 | 1 / 9 | yes | adjacent in 1 tasks |
| `update_knowledge_runbook` → `create_knowledge_policy_ack` | 0.7604 | 23 / 23 | no | source mutation changes state consumed by the target; shared resources documents; shared identifiers document_id; adjacent in 23 tasks; create_knowledge_policy_ack refuses an unpublished document |
| `update_knowledge_runbook` → `add_support_internal_note` | 0.1043 | 11 / 18 | yes | adjacent in 11 tasks |
| `update_knowledge_runbook` → `update_knowledge_finding` | 0.6472 | 11 / 18 | no | source mutation changes state consumed by the target; shared resources documents; adjacent in 11 tasks; a published document satisfies the finding evidence precondition |
| `update_knowledge_runbook` → `add_crm_interaction` | 0.0633 | 2 / 10 | yes | adjacent in 2 tasks |
| `create_knowledge_policy_ack` → `add_support_internal_note` | 0.1167 | 8 / 8 | yes | adjacent in 8 tasks |
| `create_knowledge_policy_ack` → `update_knowledge_finding` | 0.1961 | 7 / 7 | no | shared resources documents; adjacent in 7 tasks |
| `create_knowledge_policy_ack` → `add_crm_interaction` | 0.1167 | 8 / 8 | yes | adjacent in 8 tasks |
| `create_knowledge_policy_ack` → `create_knowledge_audit_event` | 0.0708 | 1 / 10 | no | adjacent in 1 tasks |
| `add_support_internal_note` → `update_crm_account_health` | 0.3500 | 26 / 26 | yes | adjacent in 26 tasks |
| `add_support_internal_note` → `update_engineering_merge` | 0.3500 | 7 / 7 | yes | adjacent in 7 tasks |
| `add_support_internal_note` → `update_support_resolution` | 0.7800 | 20 / 50 | no | source mutation changes state consumed by the target; shared resources ticket_notes, tickets; shared identifiers ticket_id; adjacent in 20 tasks; update_support_resolution refuses a case with no internal diagnosis note |
| `add_support_internal_note` → `create_knowledge_audit_event` | 0.1409 | 10 / 28 | yes | adjacent in 10 tasks |
| `update_crm_account_health` → `update_support_resolution` | 0.3096 | 23 / 23 | yes | adjacent in 23 tasks |
| `update_crm_account_health` → `add_crm_interaction` | 0.6000 | 1 / 16 | no | source mutation changes state consumed by the target; shared resources accounts; shared identifiers account_id; adjacent in 1 tasks |
| `update_crm_account_health` → `create_knowledge_audit_event` | 0.0442 | 2 / 5 | yes | adjacent in 2 tasks |
| `update_engineering_merge` → `update_support_resolution` | 0.3500 | 7 / 7 | yes | adjacent in 7 tasks |
| `update_knowledge_finding` → `create_knowledge_audit_event` | 0.2139 | 11 / 11 | no | adjacent in 11 tasks |
| `update_support_resolution` → `add_crm_interaction` | 0.2217 | 19 / 19 | yes | adjacent in 19 tasks |
| `update_support_resolution` → `create_knowledge_audit_event` | 0.0966 | 10 / 15 | yes | adjacent in 10 tasks |
| `add_crm_interaction` → `create_knowledge_audit_event` | 0.1050 | 9 / 9 | yes | adjacent in 9 tasks |

## Per-task use

Each record in `tasks.jsonl` includes `graph_path`. The validator checks that ranks strictly increase along all 100 paths and that every adjacent pair is present in this graph.
