---
url: >-
  https://adk.nht.io/api/@nhtio/adk/batteries/orchestration/ops/functions/branchKey.md
---

# Function: branchKey()

```ts
function branchKey(b: BranchId): string;
```

Defined in: [src/batteries/orchestration/ops.ts:322](https://github.com/NHTIO/ADK/blob/v1.20260906.0/src/src/batteries/orchestration/ops.ts#L322)

The canonical, INJECTIVE string form of a `BranchId` route.

## Parameters

| Parameter | Type                                             | Description          |
| --------- | ------------------------------------------------ | -------------------- |
| `b`       | [`BranchId`](../../types/interfaces/BranchId.md) | The route to render. |

## Returns

`string`

The length-prefixed, separator-free canonical string.

## Remarks

`branchKey` keys `OutputTable`, identifies `NodeRef.branchId`, orders join contributors, and
makes duplicate arrivals idempotent — so a collision would overwrite one node's output with
another's or merge unrelated barriers. It MUST therefore be injective.

Naive delimiter-joining is NOT injective: an edge id containing the delimiter (`a>b`) collides
with two segments (`a`, `b`), and an id shaped like `join:x(y)` collides with a join segment. So
the rendering is LENGTH-PREFIXED, concatenated with no separator:

* an edge segment renders as `` `e${id.length}:${id}` ``;
* a join segment renders as `` `j${nodeId.length}:${nodeId}(${of.map(len-prefixed).join('')})` ``.

Length-prefixing is injective regardless of content: a parser reads the length, then exactly
that many characters for the id, so no delimiter can be forged and no two distinct routes render
to the same string. The `e`/`j` prefixes keep edge and join segments disjoint, and the join's
`of` ids are themselves length-prefixed so the closing `)` is unambiguous.
