# Changelog — @ai-matrx/associations

## 0.14.102

- **The metadata table leaves every path that only needs a token or the provider (2026-10-27).** The generator now writes the per-token rows to `src/entity-type-metadata.generated.ts`, apart from the token vocabulary in `src/entity-types.generated.ts`, so `isEntityTypeToken`, `ENTITY_TYPE_TOKENS` and the types no longer carry them. Two new entries: `./contracts` (the root without `ENTITY_TYPE_METADATA`, 71 KB up front) and `./react/provider` (`AssociationsProvider`, `useAssociationsStore`, `useAssociationsUiPorts`, `useNotifier`, `lazyWindowShell`, `lazyPickerOverride`; 2 KB up front, against 370 KB for `./react`). Both carry an entry budget that forbids the metadata module. The registry's two table indexes are built on the first lookup, not at import, so importing `/core` no longer decodes the table. Every existing import path and name keeps working: the root and `./core` still export `ENTITY_TYPE_METADATA`. Consumer action: a host that mounts the provider at load imports it from `@ai-matrx/associations/react/provider`; a module that needs only tokens, types, `isEntityTypeToken` or `isAssociationsRpcErr` imports `@ai-matrx/associations/contracts`.

## 0.14.101

- **`ENTITY_TYPE_METADATA` ships as compact rows (2026-10-27): 334 KB → 82 KB minified.** The generator emits one tuple per token (defaults dropped, schema by index, table elided when it equals the token), aligned with `ENTITY_TYPE_TOKENS`, decoded once on first read. Every reader keeps the same API: an object keyed by token whose values are the same `EntityTypeMeta` objects on every read (`in`, `Object.keys/entries`, spread all work); writes are refused. Its declared type is now `Readonly<Record<EntityTypeToken, EntityTypeMeta>>` instead of the literal `as const` shape. Root 405 → 126 KB and `./core` 406 → 127 KB up front; budgets tightened to 139/140. Consumer action: none, unless code relied on per-token literal field types.
- **Importing the vocabulary does no work (2026-10-27).** The generator marks the token set behind `isEntityTypeToken` and `ASSOCIATION_PAIRS` `/* @__PURE__ */`, so a host that imports a type or `ASSOCIATION_TARGET_TYPES` from the root without calling those guards no longer ships the 26 KB token list or the 42 KB pair set. Output regenerated; `check:entity-types` matches the live registry. Consumer action: none.

## 0.14.100

- **Entity vocabulary regenerated from the live registry (2026-10-26).** Additive only: one new entity token `workflow_step_result` (`workflow.step_result`; 1268 active tokens), and new allowed association pairs — `media_source_library>social_profile` (`catalogs_channel`), `social_post>transcript` (`post_transcript`), `transcript>transcript` (`corrects`), `web_brand_choice>web_brand_asset` (`grew_from`), `web_brand_choice>web_brand_offering` gains `grew_from`, and workflow pairs with agent, membership, position, team, workflow and `record>workflow_step_result`. Consumer action: none.

## 0.14.99
### lane app-frame

- **`CategoryTagPicker` rows wear the menu look (2026-10-25, Arman: "Pickers: do drop-down lists get the same menu look? yes"; wave 2).** Its `CommandItem`s drop `text-xs` / `pl-6`: a `Command` in a popover is a picker list and the design system draws its rows (30px, 13px, the check at the end) and its panel (280px or the wider trigger). Geometry only. Consumer action: none.

## 0.14.98

PACKAGE INPUTS CHANGED WITH NO RELEASE NOTE. This release includes package inputs that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 6b2dffcf8c e989767bd9 -- apps/shared/associations`

Changed package inputs (1):
- `apps/shared/associations/src/edges.ts`

## 0.14.97

PACKAGE INPUTS CHANGED WITH NO RELEASE NOTE. This release includes package inputs that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 467bc8f112 6b2dffcf8c -- apps/shared/associations`

Changed package inputs (1):
- `apps/shared/associations/src/edges.ts`

## 0.14.96

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff f1984cb2e2 467bc8f112 -- apps/shared/associations/src`

Changed shipped source files (3):
- `apps/shared/associations/src/association-types.generated.ts`
- `apps/shared/associations/src/edges.ts`
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.95

Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 0a2b8c9356 f1984cb2e2 -- apps/shared/associations/src`
has no shipped-source changes outside tests, fixtures and docs). No consumer action required.

## 0.14.94

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff ece1023750 0a2b8c9356 -- apps/shared/associations/src`

Changed shipped source files (3):
- `apps/shared/associations/src/ports.ts`
- `apps/shared/associations/src/react-lazy/index.tsx`
- `apps/shared/associations/src/react/index.ts`

## 0.14.93

Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 9824915dfd ece1023750 -- apps/shared/associations/src`
has no shipped-source changes outside tests, fixtures and docs). No consumer action required.

## 0.14.92

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 6426eb15ac 9824915dfd -- apps/shared/associations/src`

Changed shipped source files (2):
- `apps/shared/associations/src/core/candidates.ts`
- `apps/shared/associations/src/core/entityRows.ts`

## 0.14.91

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 3f2e8b4145 6426eb15ac -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/core/rpcResult.ts`

## 0.14.90

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 1eae2f04b4 3f2e8b4145 -- apps/shared/associations/src`

Changed shipped source files (2):
- `apps/shared/associations/src/association-types.generated.ts`
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.89

**A kind's plural is real English.** The default plural of a registry label now comes from the new `pluralizeLabel` (exported from core): "Social post analysis" becomes "Social post analyses", "Private contact research" stays as is, and "Code Repository" becomes "Code Repositories". Before this, `label + "s"` printed "analysiss" and "researchs" on the Resources grid. No consumer action required.

## 0.14.88

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 023ace36d2 cc5fee1a63 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.87

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 57d767ef7f 023ace36d2 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/association-types.generated.ts`

## 0.14.86

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 4d24e77604 57d767ef7f -- apps/shared/associations/src`

Changed shipped source files (2):
- `apps/shared/associations/src/association-types.generated.ts`
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.85

- **Glyph path data removed; the same exports now alias the one glyph home (one-canonical, glyph lane, 2026-10-21).** `react/icons.tsx` defines no SVG any more: each export is `@ai-matrx/design-system/icons`'s glyph with this package's historical size and stroke. Names, props and sizes are unchanged. Consumer action: none.

## 0.14.84

- **A comment the platform wrote is credited to the platform (2026-10-19).** An edit remark's thread opener is minted with `created_by_tier = 'system'` under the person whose remark it was; `CommentThread` named that person as its author. `toComment` now sets `authorSystem: true` (new optional field on `PlatformComment`) for a system row, and the thread credits it to `SYSTEM_AUTHOR_NAME` ("AI Matrx") with no profile door, no Agent badge and no Edit. Guard: `src/react/__tests__/comments.test.tsx` ("credits a system-written comment…"). Consumer action: none.
- **A signed-out tab is told it is signed out (2026-10-19).** `mapPgError` used to read a 42501 `permission denied for function` as "Permission denied"; an anonymous caller (an ended or expired session) meets exactly that on every demanded door, so the remedy it named was wrong. Now PGRST301 / PGRST303 / 28000, and 42501 "permission denied for function" while the session is not attached, map to `unauthorized` with `SIGNED_OUT_MESSAGE` ("You're signed out. Sign in again — your text is kept here."). With the session attached a 42501 stays `forbidden_org` (a real grant gap). New optional ports: `identity.sessionAttached()` and the React `signIn` port (CommentThread shows a Sign in button beside a signed-out post or load failure). Guard: `src/core/__tests__/rpcResult.test.ts`. Consumer action: bind `identity.sessionAttached` (matrx-frontend: `sessionStateNow() === "attached"`) and `signIn` on `AssociationsProvider` (open login in a new tab); without `sessionAttached` every such 42501 reads as signed out.
- **The attach pickers put the cursor in their search box on open.** `UniversalAssociationPicker` (the `+ Add` panel of `AssociationList`) and the per-type `AssociationPicker` search inputs now `autoFocus`. Guard: `src/react/__tests__/faces.test.tsx` ("puts the cursor in the search box when it opens"). Consumer action: none.
- **Shared code ships once per side (2026-10-18).** The root and `/core` were each built `splitting: false`, so each inlined the 420 KB entity-type vocabulary (`src/entity-types.generated.ts`) plus three more modules: a host importing both paid twice. ESM now builds root + `/core` in one split pass (`chunk-server-*.js`, no banner) and `/react` + `/react/lazy` in another (stamped). CJS unsplit; declarations unchanged. ESM JS 1,177,448 -> 756,462 bytes; root + `/core` closure 947 KB -> 520 KB; every entry's export names identical (ESM and CJS). Guard: `../scripts/check-ships-once.mjs`, run in `build`. Consumer action: none.
- **`DefaultWindowShell` carries no drag code of its own.** Header drag and grip resize run on design-system's `useDragMove` (painted per frame, one commit per gesture, cursor held, raised on press) and its clamp is `clampRectToViewport` (48px grab strip, header never above the top). The port contract is unchanged; hosts with a window manager still bind `windowShell`. Guard: `src/react/__tests__/default-window-shell-drag.test.tsx`. Consumer action: none.

- **`AssociationList` takes `title`.** Default stays "Resources"; pass a string to rename the heading, or `null` when the host card already titles the list (the attach controls stay, right-aligned). Guard: `src/react/__tests__/association-list-title.test.tsx`. Consumer action: replace any host CSS that hides the list's `h3` (matrx-frontend: `HIDE_LIST_HEADING` in `BrandResearchCard.tsx`, `ResearchTopicLinks.tsx`) with `title={null}`.
- **Linking records no longer freezes a name onto the edge.** `useContainerLinksAdapter().attach` (and `AssociationCard`'s picker) used to store the picked record's title as the association label, so a research topic linked to brand "AI Matrx" listed on that brand as "AI Matrx". The picked title is no longer stored; each side shows the linked record's own current name from the title resolver. A deliberate label is still stored via `useContainerLinks().attach(token, id, label)`. Guard: `src/react/__tests__/outgoing-links.test.tsx` ("attach never freezes a name"). Consumer action: remove any adapter wrapper that blanks `label` (matrx-frontend: `useNeutralLinksAdapter`) and use `useContainerLinksAdapter` directly; edges already written with a label keep it until cleared.

## 0.14.83

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff f37869f518 0095b2b34e -- apps/shared/associations/src`

Changed shipped source files (3):
- `apps/shared/associations/src/comments.ts`
- `apps/shared/associations/src/core/commentsService.ts`
- `apps/shared/associations/src/react/components/CommentThread.tsx`

## 0.14.82

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 3e26272e1e f37869f518 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/association-types.generated.ts`

## 0.14.81

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 8b76fbb33f 3e26272e1e -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.80

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 77f29a65b9 8b76fbb33f -- apps/shared/associations/src`

Changed shipped source files (5):
- `apps/shared/associations/src/core/rpcResult.ts`
- `apps/shared/associations/src/core/store.ts`
- `apps/shared/associations/src/ports.ts`
- `apps/shared/associations/src/react/components/CommentThread.tsx`
- `apps/shared/associations/src/react/context.tsx`

## 0.14.79

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff d116ad2ab5 77f29a65b9 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.78

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 24a7494486 d116ad2ab5 -- apps/shared/associations/src`

Changed shipped source files (2):
- `apps/shared/associations/src/react/components/AssociationPicker.tsx`
- `apps/shared/associations/src/react/components/UniversalAssociationPicker.tsx`

## 0.14.77

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 0eb2f8603b 24a7494486 -- apps/shared/associations/src`

Changed shipped source files (2):
- `apps/shared/associations/src/association-types.generated.ts`
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.76

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 1c52fd1b8c 0eb2f8603b -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/react/components/DefaultWindowShell.tsx`

## 0.14.75

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 0746898655 1c52fd1b8c -- apps/shared/associations/src`

Changed shipped source files (6):
- `apps/shared/associations/src/core/registry.ts`
- `apps/shared/associations/src/ports.ts`
- `apps/shared/associations/src/react/components/AssociationCaptureToolbar.tsx`
- `apps/shared/associations/src/react/components/DefaultWindowShell.tsx`
- `apps/shared/associations/src/react/components/entityDoors.tsx`
- `apps/shared/associations/src/react/context.tsx`

## 0.14.74

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 2328dcd19a 0746898655 -- apps/shared/associations/src`

Changed shipped source files (2):
- `apps/shared/associations/src/association-types.generated.ts`
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.73

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 62116d54f1 2328dcd19a -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.72

Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff a1c39970d0 62116d54f1 -- apps/shared/associations/src`
has no shipped-source changes outside tests, fixtures and docs). No consumer action required.

## 0.14.71

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 92167249a3 a1c39970d0 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.70

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 95a286343b 92167249a3 -- apps/shared/associations/src`

Changed shipped source files (11):
- `apps/shared/associations/src/react/components/AssociationCaptureToolbar.tsx`
- `apps/shared/associations/src/react/components/AssociationCard.tsx`
- `apps/shared/associations/src/react/components/AssociationEntitySelect.tsx`
- `apps/shared/associations/src/react/components/AssociationList.tsx`
- `apps/shared/associations/src/react/components/AssociationPicker.tsx`
- `apps/shared/associations/src/react/components/AttachedItemsSheet.tsx`
- `apps/shared/associations/src/react/components/CategoryTagPicker.tsx`
- `apps/shared/associations/src/react/components/DefaultWindowShell.tsx`
- `apps/shared/associations/src/react/components/UniversalAssociationPicker.tsx`
- `apps/shared/associations/src/react/components/entityDoors.tsx`
- `apps/shared/associations/src/react/icons.tsx`

## 0.14.69

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 7c1e6b8298 95a286343b -- apps/shared/associations/src`

Changed shipped source files (5):
- `apps/shared/associations/src/association-types.generated.ts`
- `apps/shared/associations/src/core/index.ts`
- `apps/shared/associations/src/core/rpcResult.ts`
- `apps/shared/associations/src/entity-types.generated.ts`
- `apps/shared/associations/src/react/components/DefaultWindowShell.tsx`

## 0.14.68

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff ed23614193 7c1e6b8298 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/react/components/AssociationList.tsx`

## 0.14.66

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff c0ec11ef55 2ebf1f06a3 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.65

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff c7712eed7c c0ec11ef55 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.64

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 9cc0176a71 c7712eed7c -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.62

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 3702c2122e db608866be -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.61

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff c50fadabfc 3702c2122e -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.60

Automatic changed-only republish (docs/metadata drift since the last published version; verified: `git diff 4c4a847d55 c50fadabfc -- apps/shared/associations/src`
has no shipped-source changes outside tests, fixtures and docs). No consumer action required.

## 0.14.59

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff e5e79298a5 4c4a847d55 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.58

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff ea065825fa e5e79298a5 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.57

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff a5da075c1d ea065825fa -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.56

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 152b8592f0 a5da075c1d -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.55

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 5e03e3cba5 152b8592f0 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.54

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff e856334ee6 5e03e3cba5 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.53

SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
Diff: `git diff 8f899edd2c e856334ee6 -- apps/shared/associations/src`

Changed shipped source files (1):
- `apps/shared/associations/src/entity-types.generated.ts`

## 0.14.52

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.51..npm/associations/v0.14.52 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.51

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.50..npm/associations/v0.14.51 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.50

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.49..npm/associations/v0.14.50 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.49

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.48..npm/associations/v0.14.49 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.48
### Unreleased

- **A signed-out visitor is a state, not a fault.** `mapPgError` answers the identity port's `NotAuthenticatedError` with `unauthorized` and no longer sends it to the error sink, so a guest's first send no longer prints `[associations] internal: Not authenticated` four times. Consumer action: none.

- `web_brand` joins `ASSOCIATION_TARGET_TYPES` (`AssociationTargetType`): a brand's people are filed on it (`party -> web_brand`, role `owns` | `key_person`). `web_brand` was already a registry token. Consumer: matrx-frontend `features/marketing/smart-add/relations.ts`.

## 0.14.47

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.46..npm/associations/v0.14.47 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.46

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.45..npm/associations/v0.14.46 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.45

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.44..npm/associations/v0.14.45 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.44

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.43..npm/associations/v0.14.44 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.43

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.42..npm/associations/v0.14.43 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.42

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.41..npm/associations/v0.14.42 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.41

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.40..npm/associations/v0.14.41 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.40

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.39..npm/associations/v0.14.40 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.39

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.38..npm/associations/v0.14.39 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.38

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.37..npm/associations/v0.14.38 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.37

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.36..npm/associations/v0.14.37 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.36

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.35..npm/associations/v0.14.36 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.35

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.34..npm/associations/v0.14.35 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.34

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.33..npm/associations/v0.14.34 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.33

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.32..npm/associations/v0.14.33 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.32

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.31..npm/associations/v0.14.32 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.31

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.30..npm/associations/v0.14.31 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.30

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.29..npm/associations/v0.14.30 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.29

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.28..npm/associations/v0.14.29 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.28

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.27..npm/associations/v0.14.28 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.27

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.26..npm/associations/v0.14.27 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.26

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.25..npm/associations/v0.14.26 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.25

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.24..npm/associations/v0.14.25 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.24

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.23..npm/associations/v0.14.24 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.23

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.22..npm/associations/v0.14.23 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.22

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.21..npm/associations/v0.14.22 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.21

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.20..npm/associations/v0.14.21 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.20

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.19..npm/associations/v0.14.20 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.19

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.18..npm/associations/v0.14.19 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.18

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.17..npm/associations/v0.14.18 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.17

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.16..npm/associations/v0.14.17 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.16

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.15..npm/associations/v0.14.16 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.15

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.14..npm/associations/v0.14.15 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.14

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.13..npm/associations/v0.14.14 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.13

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.12..npm/associations/v0.14.13 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.12
### Unreleased

- `service.addMany(edges)` — the batch door (`platform.assoc_add_many`): many edges in ONE
  transaction, each applied exactly as `assoc_add`, ids in input order, all-or-nothing.
- `helpers.linkEdges` (and so `linkOneToMany` / `linkManyToOne` / `linkCreated`) now writes
  through it in sequential chunks of `ASSOC_ADD_MANY_CHUNK` (100) instead of an unbounded
  `Promise.all` of single adds, and returns `err` naming EVERY edge not written. Cause: a
  140-card deck save lost 69 of its 140 member edges (2026-09-26) to the concurrent fan-out.
  Needs a client that exposes the `platform` schema (the supabase-js client; an `{ rpc }`-only
  client answers `public` functions only and is refused loudly).

## 0.14.11

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.10..npm/associations/v0.14.11 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.10

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.9..npm/associations/v0.14.10 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.9

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.8..npm/associations/v0.14.9 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.8

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.7..npm/associations/v0.14.8 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.7

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.6..npm/associations/v0.14.7 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.6

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.5..npm/associations/v0.14.6 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.5
### Unreleased

- `createAssociationsStore` accepts an `{ rpc }`-only `dataSource` again. 0.14.0 refused it,
  so every agent-catalog host that passed a bridge (not the supabase-js client) crashed its agent
  pickers with "the REQUIRED dataSource port is missing". The store now adapts it:
  `schema("public").rpc` is its `rpc`; any other schema, or a table read, throws loudly. Exported
  type `AssociationsRpcOnlyDataSource`. No consumer action required.

## 0.14.4

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.3..npm/associations/v0.14.4 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.3

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.2..npm/associations/v0.14.3 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.2

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.14.1..npm/associations/v0.14.2 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.14.1 — the entity-types generator talks through @ai-matrx/data; registry refreshed

- `scripts/generate-entity-types.ts` no longer opens its own supabase client: `createScriptDb()` from
  `@ai-matrx/data/script` (same accepted env names, same secret-key-first order) and generated doors
  (`scripts/db/`, `callAll` for the three registry functions, `listAll` for `platform.association_types` —
  now complete instead of capped at 5,000). The package has no direct database call left; the guard blocks it.
- Registry refreshed from the live database: `applet_visitor_binding` (1,111 tokens) and the
  `board>category` (`labeled`) pair (481 pairs). **Consumer action:** none.

## 0.14.0 — every call through @ai-matrx/data's doors; edge lists read complete

- Every database call goes through `@ai-matrx/data`'s generated function doors (`src/db/public.ts`,
  `pnpm db:generate` — only the 29 functions this package calls). Same functions, same arguments, same
  error mapping (the database's own error and code reach `mapPgError` unchanged).
- The four edge lists (`assoc_for_entity`, `assoc_for_sources`, `assoc_for_targets`,
  `assoc_members_visible`) are read COMPLETE by the package — paged past the 1,000-row cap over
  position (nulls last), created_at, id — the order the website's host adapter used.
- `AssociationsDataSource` is now `@ai-matrx/data`'s `SupabaseLike` (the supabase-js client itself:
  `schema(name).rpc(...)`); `createAssociationsStore` refuses, by name, a data source without `schema()`.
- New dependency: `@ai-matrx/data` (>= 0.26.0).

Consumer action: pass the supabase-js client as `dataSource` instead of an `{ rpc }` wrapper, and delete
any host-side paging of the four edge lists (the package pages them now). matrx-frontend
`features/scopes/host/associationsStore.ts` and matrx-extend `src/lib/sources/associations-store.ts`.

## 0.13.209
### two installed copies share one React context

`AssociationsReactContext` and `PrimaryEntityCtx` are registered on `globalThis` under `Symbol.for` keys
(`src/react/sharedContext.ts`). When a host's `node_modules` held two versions (the app's own, and the one
`@ai-matrx/chat` resolved after a partial install) a chat tile on a board threw "no <AssociationsProvider> above
this component" although the host had mounted it: two contexts, one provider. Every copy now reads the same one.
Guard: `src/react/__tests__/two-copies-share-one-context.test.tsx` (a provider from one module instance reaches a
hook from another). **Consumer action:** none.

## 0.13.208

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.207..npm/associations/v0.13.208 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.207

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.206..npm/associations/v0.13.207 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.206

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.205..npm/associations/v0.13.206 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.205

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.204..npm/associations/v0.13.205 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.204

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.203..npm/associations/v0.13.204 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.203

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.202..npm/associations/v0.13.203 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.202

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.201..npm/associations/v0.13.202 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.201
### Unreleased

- `board` joins `ASSOCIATION_TARGET_TYPES` (`AssociationTargetType`): conversations are filed on a board (`conversation -> board`), the Board chat tile's own list. `board` was already a registry token (vocabulary check unchanged). Consumer: matrx-frontend `features/board/items/board-chats.tsx` drops its cast.

## 0.13.200

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.199..npm/associations/v0.13.200 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.199

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.198..npm/associations/v0.13.199 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.198

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.197..npm/associations/v0.13.198 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.197

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.196..npm/associations/v0.13.197 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.196

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.195..npm/associations/v0.13.196 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.195

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.194..npm/associations/v0.13.195 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.194

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.193..npm/associations/v0.13.194 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.193

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.192..npm/associations/v0.13.193 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.192

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.191..npm/associations/v0.13.192 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.191

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.190..npm/associations/v0.13.191 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.190

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.189..npm/associations/v0.13.190 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.189

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.188..npm/associations/v0.13.189 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.188

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.187..npm/associations/v0.13.188 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.187

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.186..npm/associations/v0.13.187 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.186

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.185..npm/associations/v0.13.186 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.185

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.184..npm/associations/v0.13.185 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.184

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.183..npm/associations/v0.13.184 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.183

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.182..npm/associations/v0.13.183 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.182

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.181..npm/associations/v0.13.182 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.181

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.180..npm/associations/v0.13.181 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.180

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.179..npm/associations/v0.13.180 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.179

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.178..npm/associations/v0.13.179 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.178

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.177..npm/associations/v0.13.178 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.177

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.176..npm/associations/v0.13.177 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.176

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.175..npm/associations/v0.13.176 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.173

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.171..npm/associations/v0.13.173 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.172

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.171..npm/associations/v0.13.172 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.170

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.169..npm/associations/v0.13.170 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.169

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.168..npm/associations/v0.13.169 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.168

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.167..npm/associations/v0.13.168 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.167

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.166..npm/associations/v0.13.167 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.166

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.165..npm/associations/v0.13.166 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.163

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.162..npm/associations/v0.13.163 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.162
### tap-target comes from design-system

- Imports `@ai-matrx/design-system/tap-target` (and `/tap-target/buttons`, `tap-target.css`) instead of the
  retired `@ai-matrx/tap-target` (Arman, 2026-10-08: tap-target merges into design-system); the
  `@ai-matrx/tap-target` dependency is dropped.

Consumer action: none.

## 0.13.161

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.160..npm/associations/v0.13.161 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.160

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.159..npm/associations/v0.13.160 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.159

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.158..npm/associations/v0.13.159 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.158

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.157..npm/associations/v0.13.158 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.157

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.156..npm/associations/v0.13.157 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.156
### Unreleased

A Table has ONE token, `table` (was `dataset`). `RECORD_STORE_NOUNS` names it; `canonicalRecordStoreToken("dataset")` returns `table` and `RETIRED_RECORD_STORE_TOKENS` lists the old spelling, which still reads as "Table" so old stored references, shared grants and older hosts keep working; nothing may write it. The `dataset>agent`, `dataset>web_page` and `record>dataset` association pairs and the `udt_dataset_template` / `udt_dataset_template_fields` entity types (tables moved to deprecated) leave the generated vocabulary.
**Consumer action:** send and store `table`; read old data through `canonicalRecordStoreToken`.

## 0.13.155
### Unreleased

The retired `flexible_data` entity type (table moved to deprecated; kinds live in `content_ir`) and its `record>flexible_data` association pair are gone from the generated vocabulary.
**Consumer action:** none; `flexible_data` was already inactive.

## 0.13.153
### Unreleased

Pick lists have ONE token, `pick_list` (was `structured_list`, alias `picklist`). `RECORD_STORE_NOUNS` names it; `canonicalRecordStoreToken()` maps the retired spellings to it and `RETIRED_RECORD_STORE_TOKENS` lists them. The retired spellings still read as "Pick list" so old stored references and older hosts keep working; nothing may write them.
**Consumer action:** send and store `pick_list`; read old data through `canonicalRecordStoreToken`.

## 0.13.152
### Unreleased

`CommentThread` renders a comment body as markdown: an edit thread's quoted "Was:" / "Now:" blocks are blockquotes with bullet lists, never raw `> - ` text. A host may bind a `commentBody` port on `AssociationsProvider` (its own compact renderer); absent, the package's built-in renderer is used. New export `CommentBody`.
**Consumer action:** none required; bind `commentBody` to reuse the host's markdown renderer.

## 0.13.151

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.150..npm/associations/v0.13.151 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.150
### Unreleased

The record store's two kinds are named in the vocabulary: `dataset` reads as "Table" and `structured_list` as "Pick list" through `getEntityInfo` / `tryGetEntityInfo` (no "(retired)" stand-in, no `retired_entity_token` report), with no schema, table or title column so no generic reader touches the deprecated tables their old rows named. New exports `RECORD_STORE_NOUNS`, `recordStoreNoun`, `isRecordStoreNounToken`, `RecordStoreNounToken`.
**Consumer action:** read these names from the package; drop any local Table / Pick list map.

## 0.13.149

Comments read and write what the database now carries. `PlatformComment` gains `authorAgent` (the agent that wrote the comment; `CommentThread` shows its name with an Agent badge and no Edit) and `anchor`. `useComments().add` / `store.addComment` accept an `anchor`; `CommentThread` takes `part={{key, label}}` — that part's comments only, new comments stored with a `part_anchor` — and on a whole-record thread each part comment says which part. Exports `partKeyOf`, `PartAnchor`, `CommentAnchor`, `CommentAgentAuthor`. Demanded RPC signatures regenerated.
**Consumer action:** none required; pass `part` for a board-only tile.

## 0.13.148

`party`'s registry label is "Contact" (was "Entity"), regenerated from live `platform.entity_types`. No API change.

## 0.13.147

Tags are a platform table (`platform.tag`, Arman 2026-10-02), not scopes: the entity token `tag` is registered, every kind that files under a scope can file under a tag (the association-pair registry is regenerated), and `tag` joins `ASSOCIATION_TARGET_TYPES`.
**Consumer action:** file, count and remove tags on `<kind> -> tag` edges (`targetType: "tag"`), never on `scope`.

## 0.13.146

The org chart's Person box is a `membership` (a person's place in one organization), not a
bare `user`: `iam.has_access` has no rule for `user`, so no edge could reach one. `membership`
replaces `user` in `ASSOCIATION_TARGET_TYPES`; the association-pair registry is regenerated.
**Consumer action:** write org chart edges to a person as `membership`.

## 0.13.145

The `position` token's table moved to `agent.position` (the org chart's own schema allows
direct, row-secured writes; `iam` is write-through-doors only). Registry regenerated.
**Consumer action:** none.

## 0.13.144

Org chart box types. Regenerated the entity-type registry (new token `position`, `agent.position`)
and the association-pair registry (every org chart pair among `agent`, `user`, `team`,
`position`). `user`, `team` and `position` join `ASSOCIATION_TARGET_TYPES`, so an org chart
link (role `org_chart`, type in `metadata.link_kind`) can point at a person, a team or a
position.

**Consumer action:** none required; hosts that draw the org chart may now write
`org_chart` edges whose target is `user`, `team` or `position`.

## 0.13.143

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.142..npm/associations/v0.13.143 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.142

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.141..npm/associations/v0.13.142 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.141

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.140..npm/associations/v0.13.141 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.140

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.139..npm/associations/v0.13.140 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.139

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.138..npm/associations/v0.13.139 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.138

**A conversation's file inventory is read once per tab.** `useContainerLinks` kept the
`conversation_files` answer in its own state, so a chat tile that slept and woke, a Remove +
Undo and every second view of the same conversation read it again. It now lives in one cache
entry per conversation per store: the first view reads, later views and remounts render the
kept list, a read in flight is joined, a store write to the conversation still re-reads it,
and an older answer never lands over a newer one. Guard: `react/__tests__/hooks.test.tsx`
"reads a conversation's files once for a remount and a second view" (red on 0.13.137).

Consumer action: none.

## Unreleased

**`CommentThread` tells its host what the person posted (`onPosted`).** A new comment or a reply,
once the door saved it, calls `onPosted({ id, body, parentId })` — never on a failure. Board
comments use it to stage the comment as a remark into the board's agent chat. New exported type
`PostedComment`. Guard: `react/__tests__/comments.test.tsx` "CommentThread onPosted".
Consumer action: none (optional prop).

**An untitled record of an unregistered type is named, never printed raw.** `titles.fallback(token)` for a token the registry does not know humanized it with nothing: a canvas HTML page showed "Untitled html_page". It now goes through the ONE humanizer (`humanizeIdentifier` — "Untitled HTML Page"). Guard: `core/__tests__/registryCandidatesTitlesRows.test.ts`. No consumer action required.

**Resource groups are a dot and a name.** `AssociationCardGrid` no longer renders the one-line group descriptions ("Incoming sources of truth (Knowledge In).", "Filed under"'s line). Everything else of the restored tiles look stays. Arman 2026-09-30: descriptions are banned on in-app pages (`common-docs/policies/interface-text-is-layout.md`). `CONTENT_ROLES[].tagline` stays in the data for now. No consumer action required.

## 0.13.137

**A scope can be part of a scope.** Regenerated pairs from `platform.association_types`:
`scope>scope` (role `part_of` — a class's units, lessons and sections; Data Doctrine R7, the tree
that replaces `context.scopes.parent_scope_id`) and its record-store twin `scope>record`.
`isRegisteredPair("scope", "scope")` is now true. No consumer action required.

## 0.13.136

**A retired entity token never crashes the host.** `getEntityInfo(token)` for a token the live
vocabulary no longer carries now returns a stand-in labelled `<token> (retired)` and reports
`retired_entity_token` through the errorSink once per token, instead of throwing
`Cannot read properties of undefined (reading 'titleColumn')`. 0.13.135's regenerated vocabulary
dropped `dataset`, `structured_list`, `udt_dataset_*` and `udt_structured_list_items` (deactivated
in `platform.entity_types` by the custom-data cutover) — its changelog line "no source changes"
was wrong — and a module-scope `getEntityInfo("structured_list")` in the frontend then crashed
every route of the dev app (found by real test PB-05, 2026-10-02 19:46Z).

**Consumer action:** search your code for the retired tokens above and move each reference to
the live token; each one now lands in your error sink as `retired_entity_token` until you do.

## 0.13.135

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.134..npm/associations/v0.13.135 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.134

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.133..npm/associations/v0.13.134 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.133

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.132..npm/associations/v0.13.133 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.132

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.131..npm/associations/v0.13.132 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.131

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.130..npm/associations/v0.13.131 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.130

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.129..npm/associations/v0.13.130 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.129

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.128..npm/associations/v0.13.129 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.128

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.127..npm/associations/v0.13.128 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.127

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.126..npm/associations/v0.13.127 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.126

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.125..npm/associations/v0.13.126 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.125

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.124..npm/associations/v0.13.125 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.124

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.123..npm/associations/v0.13.124 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.123

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.122..npm/associations/v0.13.123 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.122

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.121..npm/associations/v0.13.122 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.121

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.120..npm/associations/v0.13.121 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.120

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.119..npm/associations/v0.13.120 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.119

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.118..npm/associations/v0.13.119 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.118

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.117..npm/associations/v0.13.118 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.117

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.116..npm/associations/v0.13.117 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.116

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.115..npm/associations/v0.13.116 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.115

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.114..npm/associations/v0.13.115 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.114

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.113..npm/associations/v0.13.114 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.113

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.112..npm/associations/v0.13.113 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.112

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.111..npm/associations/v0.13.112 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.111

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.110..npm/associations/v0.13.111 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.110

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.109..npm/associations/v0.13.110 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.109

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.108..npm/associations/v0.13.109 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.108

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.107..npm/associations/v0.13.108 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.107

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.106..npm/associations/v0.13.107 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.106

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.105..npm/associations/v0.13.106 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.105

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.104..npm/associations/v0.13.105 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.104

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.103..npm/associations/v0.13.104 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.103

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.102..npm/associations/v0.13.103 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.102

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.101..npm/associations/v0.13.102 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.101

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.100..npm/associations/v0.13.101 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.100

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.99..npm/associations/v0.13.100 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.99

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.98..npm/associations/v0.13.99 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.98

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.97..npm/associations/v0.13.98 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.97

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.96..npm/associations/v0.13.97 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.96

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.95..npm/associations/v0.13.96 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.95

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.94..npm/associations/v0.13.95 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.94

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.93..npm/associations/v0.13.94 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.93

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.92..npm/associations/v0.13.93 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.92

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.91..npm/associations/v0.13.92 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.91

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.90..npm/associations/v0.13.91 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.90

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.89..npm/associations/v0.13.90 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.89

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.88..npm/associations/v0.13.89 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.88

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.87..npm/associations/v0.13.88 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.87

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.86..npm/associations/v0.13.87 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.86

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.85..npm/associations/v0.13.86 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.85

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.84..npm/associations/v0.13.85 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.84

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.83..npm/associations/v0.13.84 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.83

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.82..npm/associations/v0.13.83 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.82

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.81..npm/associations/v0.13.82 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.81

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.80..npm/associations/v0.13.81 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.80

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.79..npm/associations/v0.13.80 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.79

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.78..npm/associations/v0.13.79 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.78

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.77..npm/associations/v0.13.78 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.77

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.76..npm/associations/v0.13.77 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.76

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.75..npm/associations/v0.13.76 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.75

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.74..npm/associations/v0.13.75 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.74

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.73..npm/associations/v0.13.74 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.73

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.72..npm/associations/v0.13.73 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.72

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.71..npm/associations/v0.13.72 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.71

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.70..npm/associations/v0.13.71 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.70

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.69..npm/associations/v0.13.70 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.69

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.68..npm/associations/v0.13.69 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.68

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.67..npm/associations/v0.13.68 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.67

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.66..npm/associations/v0.13.67 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.66

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.65..npm/associations/v0.13.66 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.65

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.64..npm/associations/v0.13.65 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.64

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.63..npm/associations/v0.13.64 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.63

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.62..npm/associations/v0.13.63 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.62

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.61..npm/associations/v0.13.62 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.61

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.60..npm/associations/v0.13.61 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.60

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.59..npm/associations/v0.13.60 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.59

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.58..npm/associations/v0.13.59 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.58

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.57..npm/associations/v0.13.58 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.57

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.56..npm/associations/v0.13.57 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.56

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.55..npm/associations/v0.13.56 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.55

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.54..npm/associations/v0.13.55 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.54

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.53..npm/associations/v0.13.54 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.53

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.52..npm/associations/v0.13.53 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.52

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.51..npm/associations/v0.13.52 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.51

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.50..npm/associations/v0.13.51 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.50

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.49..npm/associations/v0.13.50 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.49

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.48..npm/associations/v0.13.49 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.48

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.47..npm/associations/v0.13.48 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.47

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.46..npm/associations/v0.13.47 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.46

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.45..npm/associations/v0.13.46 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.45

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.44..npm/associations/v0.13.45 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.44

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.43..npm/associations/v0.13.44 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.43

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.42..npm/associations/v0.13.43 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.42

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.41..npm/associations/v0.13.42 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.41

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.40..npm/associations/v0.13.41 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.40

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.39..npm/associations/v0.13.40 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.39

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.38..npm/associations/v0.13.39 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.38

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.37..npm/associations/v0.13.38 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.37

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.36..npm/associations/v0.13.37 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.36

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.35..npm/associations/v0.13.36 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.35

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.34..npm/associations/v0.13.35 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.34

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.33..npm/associations/v0.13.34 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.33

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.32..npm/associations/v0.13.33 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.32

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.31..npm/associations/v0.13.32 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.31

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.30..npm/associations/v0.13.31 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.30

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.29..npm/associations/v0.13.30 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.29

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.28..npm/associations/v0.13.29 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.28

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.27..npm/associations/v0.13.28 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.27

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.26..npm/associations/v0.13.27 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.26

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.25..npm/associations/v0.13.26 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.25

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.23..npm/associations/v0.13.25 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.24

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.23..npm/associations/v0.13.24 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.23

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.22..npm/associations/v0.13.23 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.22
### Unreleased

- **Resources grid restored to its own look (Arman, 2026-09-29).** `AssociationCardGrid` and
  `AssociationCard` again draw the colored group dot, the one-line group description, the colored
  top bar, the tinted icon chip, the "N attached" line and the square "+" — undoing the 2026-09-27
  page-pass restyle (0b7ed5ee91, ab22ca7f10, 8ab54b828c). The 12px count line (6fb9d79138) stays.
- New opt-in `look?: "tiles" | "simplified" | "compact"` on both (default `"tiles"`, used
  everywhere). `"simplified"`: one uppercase line with the classic square "+". `"compact"`: one
  line with the real `PlusTapButton variant="outline"` from `@ai-matrx/tap-target` (new
  dependency) — no glass, no padding around it. The CRM record uses `"compact"`.
  Consumer action: none (hosts already load `@ai-matrx/tap-target/styles.css`).
- Root now exports `isRegisteredPair(source, target)` and `registeredEdgeLabel(source, target)`
  from the generated association registry, so a host decides an edge's direction from the package
  instead of reading `platform.association_types` itself (A3-F, the Source input's file filing).
  Consumer action: replace any client read of `platform.association_types` with these.

## 0.13.21

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.20..npm/associations/v0.13.21 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.20

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.19..npm/associations/v0.13.20 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.19

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.18..npm/associations/v0.13.19 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.18

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.17..npm/associations/v0.13.18 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.17

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.16..npm/associations/v0.13.17 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.16

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.15..npm/associations/v0.13.16 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.15

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.13..npm/associations/v0.13.15 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.14
### Unreleased
### page-pass shared fix (2026-09-27): the tile speaks the section-card language

### also: `CategoryTagPicker`'s trigger draws design-system `SelectChevron` (it drew an up-down pair). Needs design-system with `SelectChevron`.


- **`AssociationCard` is one header line**: a small icon, the UPPERCASE name, its count, and the platform's round ghost "+" (`TapTargetButton`), in one thin-bordered card — the record page's `SectionCard` language. No boxed icon, no square outlined "+", no second line saying "0 attached" (the full phrase is the drill-in button's accessible name). The grid's group names are quiet uppercase eyebrows, not a second heading level. Proof: `react/__tests__/tile-speaks-the-section-card-language.test.tsx`, red on the previous tile.

## 0.13.13

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.12..npm/associations/v0.13.13 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.12

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.11..npm/associations/v0.13.12 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.11

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.10..npm/associations/v0.13.11 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.10

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.9..npm/associations/v0.13.10 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.9
### Unreleased
### page-pass shared fix (2026-09-27): each kind in its registered direction

- **`useContainerLinks` reads and writes each kind in the direction the registry holds.** "Party attached to a task" is registered `party → task` (and `task → party` is refused), so a person's Tasks tile counted only `task → party` edges — none — and its "+" wrote the refused direction. When only `container → token` is registered, the container's links of that kind are its outgoing edges and "+"/detach/pin use `container → token`. New export `linkDirection` (react) and, generated from the live registry, `ASSOCIATION_PAIRS` / `isRegisteredPair` (every active pair, labelled or not).
- **The card's count line is 12px** (`text-xs`), the floor — it was 11px.
- Regenerated `entity-types.generated.ts` (two live tokens: `meet_chat_message`, `reachability_pending`).
- Proof: `react/__tests__/registered-direction.test.tsx`.

#### Consumer action
- None required.

## 0.13.8
### (2026-09-27 — the standard section look)

- **`AssociationCardGrid` draws the standard section look**: a heading and its cards — the colored role dot, the tagline under each heading ("Incoming sources of truth (Knowledge In).", "How work is organized."), each card's colored top bar and its tinted icon chip are gone; the icon sits on the neutral muted chip. Rows wrap by the card's own minimum width, so a lone card fills its row instead of sitting at half width. Seen on `/crm/<id>` (page-pass).
- Proof: `src/react/__tests__/outgoing-links.test.tsx` — "the standard section look".

### Consumer action

None.

## 0.13.7

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.6..npm/associations/v0.13.7 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.6

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.4..npm/associations/v0.13.6 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.5

- **The default picker window stacks above a modal it was opened from.** `DefaultWindowShell` painted at z-50 under a blocking Sheet/Drawer's z-10000 scrim, so picking an option closed the modal. It now wraps its root in design-system's `FloatingLayer` and paints at `useFloatingLayerZIndex(50)`. Needs `@ai-matrx/design-system` 0.48.0. No consumer action (hosts that bind `windowShell` follow design-system 0.48.0's consumer action).

## 0.13.4

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.13.3..npm/associations/v0.13.4 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.3

**A named pair is written with its registered name.** `platform.association_types` names some pairs
(`processed_document → scope` = `about`, `→ research_topic` = `research_source`,
`→ media_source_library` = `catalogued_source`, `→ web_site` = `crawled_page`, 37 in all) and the
database accepts an edge of such a pair only with exactly that label. The service sent the picked
item's display name, so filing a Source under a scope failed with "Unknown association type:
processed_document -> scope". `assoc_add` now writes the registry's label for every named pair
(every caller, both directions); pairs registered without a label keep the caller's label.

* New generated `src/association-types.generated.ts` (`ASSOCIATION_TYPE_LABELS`,
  `registeredEdgeLabel`), written by `pnpm gen:entity-types` from the live registry;
  `pnpm check:entity-types` now also fails when it drifts.
* Regenerated vocabulary picks up `spatial_board`.
* `AssociationCardGrid` columns follow the grid's own width (container queries `@md` / `@3xl`),
  not the viewport — in a 360–420px side rail the viewport rule drew three columns and hid every
  card's name.

## 0.13.2

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.12.1..npm/associations/v0.13.2 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.1

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.12.1..npm/associations/v0.13.1 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.13.0

A search that could not look no longer says "no results".

* **Breaking:** `searchCandidatesAcrossTokens` returns `{ results, failures }` instead of a bare
  array. `failures: TokenSearchFailure[]` (`{ token, error }`, registry order) lists every token
  whose read failed — those tokens used to be screamed and silently dropped, so a search where
  some or all tokens failed looked like "nothing matched". Result order and the per-token cap are
  unchanged. New types `SearchAcrossTokensResult`, `TokenSearchFailure` (from `/core`).
* `useUniversalEntitySearch` also returns `failures: UniversalSearchFailure[]` (`token: null` =
  the recents read failed), `error` (non-null only when nothing could be read — every token
  failed, or the recents read failed and the fallback browse failed too) and
  `status: "loading" | "error" | "ready"`. A failed recents read still falls back to browsing,
  but is recorded in `failures` — never silently turned into a browse.
* New `SearchFailureNotice` + `describeSearchFailures` (`/react`): the one way a face shows the
  hook's failures — the ErrorBox failure block when `error` is set, and a one-line
  "Couldn't search Notes, Tasks" note above partial results. `UniversalAssociationPicker` and the
  `AssociationPicker` recents strip render it.
* **Breaking:** `ownerId` removed from `ListCandidatesArgs`, `SearchAcrossTokensArgs`,
  `UseUniversalEntitySearchArgs` and `UniversalAssociationPickerProps`. It was never applied —
  `public.reference_search_candidates(p_token, p_search, p_limit, p_ids)` has no owner
  parameter; visibility is the RPC's alone. An ignored filter is a lie.

**Consumer action:** read `.results` (and handle `.failures`) from
`searchCandidatesAcrossTokens`; stop passing `ownerId` to the candidate reads, the hook and
`UniversalAssociationPicker`; render `SearchFailureNotice` (or your own use of `error` /
`failures`) wherever you render `useUniversalEntitySearch` results.

## 0.12.1

Re-cut of 0.12.0 — same package source. The 0.12.0 tag was cut from a commit whose workspace
lockfile did not match `shared/messaging/package.json` (ERR_PNPM_OUTDATED_LOCKFILE), so its
publish could never install; an immutable tag cannot move, so the bytes ship as 0.12.1.
No consumer action beyond 0.12.0's.

## 0.12.0

* `UniversalAssociationPicker`: an empty search box with no recents (favorites / last-viewed) now
  **browses candidates across the offered tokens** instead of saying "No recent items" — it was a
  screen that lied for an account with hundreds of records it had never opened. Results carry a
  "Recent" or "Browse" label.
* `UniversalAssociationPicker` takes `emptyQueryMode?: "recents" | "candidates"` (default
  `"recents"`, which falls back as above).
* `useUniversalEntitySearch` returns `source: "search" | "recents" | "candidates"` (new
  `UniversalSearchSource` type); `isRecents` is unchanged in meaning.
* A chip whose token has a `pickerOverrides` component (Files → the host's window) no longer
  leaves the picker body blank: it says the window is open (or closed), offers "Bring window to
  front" / "Reopen window", and "Back to search". Closing the override window keeps the chip
  selected instead of silently dropping back to search.

**Consumer action:** none required. Hosts whose override window renders attached state should
read `AssociationPickerProps.attachedIds` (it has always been passed; matrx-frontend's file
override did not read it until this release's adoption).

## 0.11.5

Automatic changed-only republish, cut by the release train while the 0.12.0 source below was
already on `main` (a checkout sweep committed it before its own version bump) — so 0.11.5 DOES
carry the 0.12.0 picker changes despite its auto text. Adopt 0.12.0.

## 0.11.4

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.11.3..npm/associations/v0.11.4 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.11.3

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.11.2..npm/associations/v0.11.3 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.11.2

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.11.1..npm/associations/v0.11.2 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.11.1

Filed-under grid shows where things are actually filed:

* `research_topic` and `media_source_library` join `ASSOCIATION_TARGET_TYPES` — the containers
  Sources are filed under (the landing door writes `processed_document → research_topic` and
  `→ media_source_library`).
* In `direction: "outgoing"` the grid adds a card for every container the primary has an edge to
  (not only the curated set) and draws containers with no content role (Libraries, topics, sites)
  in a "Filed under" section — they were silently dropped, so every card read "0 filed under".
* `useContainerLinks` returns `presentTokens` (every token with at least one link).

## 0.11.0

**Filed-under mode** — `direction: "outgoing"` on the primary entity. A thing that is filed under
containers (a Source under a project, a research topic, a Library) is now a first-class primary:

* `PrimaryEntity` is `PrimaryContainerEntity` (the default, `direction?: "incoming"`, a container
  TARGET type — unchanged) or `PrimaryFiledEntity` (`direction: "outgoing"`, any registered token).
* `useContainerLinks({ …, direction: "outgoing" })` lists the primary's OUTGOING edges (the
  containers it is filed under); `attach` writes `primary → container` as the same role-less edge
  the landing door writes; `detach` / `setPinned` address that edge. A token that is not a
  container type is refused before any write ("… cannot be filed under").
* `containerLinksArgs(primary)` — the one mapping the faces use, so the direction is never dropped.
* `AssociationCardGrid` / `AssociationCard` / `AssociationList` / `AttachedItemsSheet` /
  `AssociationPicker` honour it: only container types are offered, counts read "N filed under",
  the picker header reads "File X under a …" (`AssociationPickerProps.filing`).
* New root export `isAssociationTargetType` and type `AssociationDirection`.

Consumer action: none for containers. To show what an entity is filed under, pass
`{ type, id, orgId, label, direction: "outgoing" }` to `PrimaryEntityProvider`.

## 0.10.7

Regenerated the entity vocabulary from the live registry (998 active tokens):

* `fc_card` (a single flashcard) is reference-pickable with `titleColumn: "front"` — pickers list
  cards by their front, so a card can be linked to a study-guide passage (RC-B11). Registry change:
  matrx-frontend `migrations/fc_card_is_pickable_by_its_front.sql`.
* Picks up the live labels `document` → "Markdown document" and `udt_document` → "Cloud document".

Consumer action: update to this version (the link picker offers single flashcards only from here).

## 0.10.6
### Unreleased

* `CommentThread` / `CommentComposer` errors are drawn with design-system's `ErrorBox`,
  so the host's error actions (`ErrorActionsProvider`) reach them — the composer's
  failure carries the unsent comment as `unsavedInput`. Requires the design-system
  release that ships `ErrorBox` (publish design-system first).

## 0.10.5

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.10.4..npm/associations/v0.10.5 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.10.4

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.10.3..npm/associations/v0.10.4 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.10.3

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.10.2..npm/associations/v0.10.3 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## Unreleased

Regenerated the entity vocabulary from the live registry (999 active tokens): adds
`document`, `document_version`, `message_template_detail`, `skill_detail` and
`univer_payload` (the rich-content store, RC-A1). Without `document` the strict
association guard refuses every edge onto a content.document — the RC-B11 annotation
sidecar's highlights and links. Consumer action: update to this version.

## 0.10.2

Publish the live-registry-generated `agent_term_list` entity token so term-list
attach and detach pass the strict association write guard. Add term lists to the
typed target contract for durable file attachments, with service and packed-artifact
regressions for both attachment directions. Consumers must update
to this version to receive the registry contract (994 active tokens).

## 0.10.1

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.10.0..npm/associations/v0.10.1 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.33

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.32..npm/associations/v0.9.33 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.32

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.31..npm/associations/v0.9.32 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.31

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.30..npm/associations/v0.9.31 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.30

Capture toolbar keeps every distinct upload-failure reason instead of
collapsing them, and now shows a per-reason count for grouped failures
(commit `b1053013ab`). No consumer action required.

## 0.9.29

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.28..npm/associations/v0.9.29 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.28

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.27..npm/associations/v0.9.28 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.26

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.25..npm/associations/v0.9.26 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.25

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.24..npm/associations/v0.9.25 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.23

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.22..npm/associations/v0.9.23 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.22

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.21..npm/associations/v0.9.22 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.21

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.20..npm/associations/v0.9.21 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.20

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.19..npm/associations/v0.9.20 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.19

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.18..npm/associations/v0.9.19 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.18

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.17..npm/associations/v0.9.18 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.17

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.16..npm/associations/v0.9.17 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.16

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.15..npm/associations/v0.9.16 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.15

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.14..npm/associations/v0.9.15 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.14

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.13..npm/associations/v0.9.14 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.13

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.12..npm/associations/v0.9.13 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.12

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.11..npm/associations/v0.9.12 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.11

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.10..npm/associations/v0.9.11 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.10

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.9..npm/associations/v0.9.10 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.9

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.8..npm/associations/v0.9.9 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.8

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.7..npm/associations/v0.9.8 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.7 — 2026-09-13

Regenerated `src/entity-types.generated.ts` from the live
`platform.entity_types` registry. The `file_rag_job`,
`scope_dataset_instance`, and `tool_binding` metadata now correctly ships
`isComponent: true`, restoring field-for-field parity for all 803 active
entity types and unblocking the frontend release gate.

## 0.9.6

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.5..npm/associations/v0.9.6 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.5

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.4..npm/associations/v0.9.5 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.4

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.9.3..npm/associations/v0.9.4 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.9.3 — 2026-09-12

Regenerated `src/entity-types.generated.ts` from the current live
`platform.entity_types` registry: **800 → 802 tokens**. This adds
`interview_decision_interview` and `interview_decision_question` so the
package's writes-strict vocabulary remains aligned with the live platform.

## 0.9.2

Regenerated `src/entity-types.generated.ts` from the current live
`platform.entity_types` registry: **797 → 800 tokens**. This adds
`billing_stripe_event`, `global_execution_control`, and `org_module_config` so
the package's writes-strict vocabulary again matches the live platform.

## 0.9.1

Regenerated `src/entity-types.generated.ts` from the current live
`platform.entity_types` registry: **676 → 797 tokens**.

This patch restores complete writes-strict vocabulary parity after the live
registry expansion. No API or caller code change is required.

## 0.9.0 — BREAKING: the boot probe is deleted

`AssociationsProvider` used to run `assertDemandedSchema` on mount. That probe
established whether each of the 26 demanded RPCs existed **by calling it** with
sentinel arguments — and **fourteen of them are writes** (`assoc_add`,
`assoc_set_targets`, `assoc_remove_for_entity`, `conversation_file_add`,
`agent_resource_add`, `cat_create`/`cat_update`/`cat_reparent`/`cat_delete`,
`ues_set`, `ues_touch`, `cmt_add`, `cmt_edit`, `cmt_delete`). Measured in the
AI Matrx frontend on `/admin/billing/spend`: **25 POSTs to
`/rest/v1/rpc/<name>` answered 400 on every page load**, ahead of the page's own
reads.

It was documented as dev-only. It was not. The gate was
`process.env.NODE_ENV === "development"`, and tsup builds this package with
`platform: "browser"`, where esbuild SUBSTITUTES that expression at build time —
the shipped `dist/react/index.js` read `typeof process !== "undefined" && true`.
Every consumer fired the storm in production.

**THE CLASS RULE: a write RPC is never invoked to ask whether it exists.**

Removed, not deprecated (a knob nobody can safely turn on is not a knob):

- `assertDemandedSchema`, `SELF_TEST_MISSING_RPC`, `AssertDemandedSchemaOptions`
  and `DemandedSchemaReport` are gone from `@ai-matrx/associations/core`.
- The `probeSchema` prop is gone from `AssociationsProvider`.
- Mounting the provider now issues **no network call at all**.

Nothing replaces it, because nothing needs to. A database that cannot answer a
demanded function still says so, loudly, at the first REAL call: PostgREST
returns PGRST202 and `mapPgError` raises `demanded_schema_violation` with the
same remedy — at the moment it matters, and at zero cost on the loads where the
database is right.

Guards (both proven failing-then-passing):
`src/react/__tests__/mount-is-inert.test.tsx` — a recorder sees an RPC when one
is made (the self-test), and mounting the provider records none.
`src/__tests__/no-node-env-gating.test.ts` — no source file reads `NODE_ENV` in
code, because our own build bakes it. `scripts/verify-tarball.mjs` asserts the
SHIPPED cjs core no longer exports `assertDemandedSchema`.

**Consumer action.** Delete any `probeSchema` prop you pass to
`AssociationsProvider` (it is now a type error) and any `assertDemandedSchema`
import. If you want a deliberate schema check in CI, assert against `pg_proc`
from a server-side script — never by invoking the functions.

This release also carries 0.8.10 and 0.8.11, whose artifacts never reached the
registry (the 0.8.10 workflow stopped on a stale workspace lockfile): the
regenerated `entity-types.generated.ts` vocabulary at **676 tokens**.

## 0.8.11

Republishes the 0.8.10 vocabulary artifact under a fresh immutable version.
The 0.8.10 workflow stopped before publication because the workspace lockfile
lagged newly committed sibling manifests; no 0.8.10 registry artifact exists.

No API or caller code change is required.

## 0.8.10

Regenerated `src/entity-types.generated.ts` from live
`platform.entity_types`: **674 → 676 tokens**, adding `credential_attachment`
and `credential_mutation_receipt`.

These canonical Vault records already exist in the registry. This patch
restores the writes-strict vocabulary required by consumers; no API or caller
code change is required.

## 0.8.9

Regenerated `src/entity-types.generated.ts` from live
`platform.entity_types`: **672 → 674 tokens**, adding `credential_item` and
`user_secret`.

These canonical records already exist in the registry. This patch restores the
writes-strict vocabulary required by consumers; no API or caller code change is
required.

## 0.8.7

`pnpm gen:entity-types` no longer requires a package-local `.env.local` that has
never existed in any checkout. The generator now walks `.env.local`/`.env` from
this package up to the repo root (stopping at `.git`) and accepts
`SUPABASE_MATRIX_URL` / `SUPABASE_MATRIX_SECRET_KEY` alongside the app-side
`NEXT_PUBLIC_SUPABASE_URL` / `SUPABASE_SECRET_KEY`. When no credentials are
found it names every accepted spelling and every directory it searched instead
of pointing at a file nobody has.

No API change; the generated vocabulary is unchanged (670 tokens). This is the
papercut half of the fix for the entity-vocabulary drift that froze
matrx-frontend releases on 2026-08-30 and 2026-08-31 — the structural half is
aidream's blocking release gate,
`scripts/check_entity_vocabulary_published.py`.

## 0.8.6

Regenerated `src/entity-types.generated.ts` from live
`platform.entity_types`: **669 → 670 tokens**, adding
`billing_spend_guardrail`.

The canonical `billing.spend_guardrail` record already exists in the registry.
This patch restores package/registry parity; no API or caller code change is
required.

## 0.8.5

Regenerated `src/entity-types.generated.ts` from live
`platform.entity_types`: **668 → 669 tokens**, adding
`context_item_value`.

The canonical `context.context_item_values` component record already exists in
the registry. This patch restores the writes-strict vocabulary required by
consumers; no API or caller code change is required.

## 0.8.4

Regenerated `src/entity-types.generated.ts` from live
`platform.entity_types`: **666 → 668 tokens**, adding
`runtime_operation_stream` and `runtime_operation_stream_batch`.

These canonical runtime records already exist in the registry. This patch
restores the writes-strict vocabulary required by consumers; no API or caller
code change is required.

## 0.8.3

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.8.2..npm/associations/v0.8.3 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.8.2 — 2026-09-09 (vocabulary catch-up: mandate review records)

Regenerated `src/entity-types.generated.ts` from live
`platform.entity_types`: **663 → 666 tokens**, adding
`mandate_observation`, `mandate_reference`, and `mandate_scan`.

These three records already exist in the canonical registry, while the
published package remained writes-strict against the older vocabulary. That
drift blocks every consumer's entity-type gate, including the scheduled
frontend fleet release. This patch restores package/registry parity; no API
change or consumer code change is required.

## 0.8.1

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.8.0..npm/associations/v0.8.1 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.8.0 — 2026-09-07

**Consumer action (C28).** Two exports MOVED OUT of this package.

| was | now |
|---|---|
| `import { formatRelativeTime } from "@ai-matrx/associations/react"` | `import { formatRelativeTime } from "@ai-matrx/kit/format"` |
| `import { isUuid } from "@ai-matrx/associations/core"` | `import { isUuidShape } from "@ai-matrx/kit/uuid"` |

**`formatRelativeTime` keeps its exact voice behind two options.** This
package's copy was the `Intl.RelativeTimeFormat` one that echoes an
unparseable input instead of an em-dash. Kit's default style is the dense
`"2m ago"` form, so pass the options to keep this behaviour byte-for-byte:

```ts
formatRelativeTime(iso, { style: "intl", fallbackToInput: true })
```

An explicit `now` moves from the second positional argument into the options
bag: `formatRelativeTime(iso, now)` becomes
`formatRelativeTime(iso, { now, style: "intl", fallbackToInput: true })`.

**`isUuid` -> `isUuidShape`.** The rename is the point. The fleet had TWO
predicates both called `isUuid` — this package's LAX 8-4-4-4-12 shape check,
and a STRICT RFC-4122 one on six matrx-frontend API doors — and the difference
was invisible at the call site. Both now live in `@ai-matrx/kit/uuid` under
names that say which is which, and `isUuidShape` is the drop-in for this one. A
bare `isUuid` is deliberately not exported anywhere: a caller must choose.
`isRfc4122Uuid` REJECTS things `isUuidShape` accepts (the nil UUID, every
v6/v7/v8 id) — never swap one for the other to make a test pass.

**Why.** Duplication census finding H1 (2026-09-07): this package and
`@ai-matrx/diff` each defined their own `formatRelativeTime`, so ~16 host twins
had no correct owner. The `assoc_*` guards still validate ids exactly as
before, proven end-to-end by the existing guard suite.

New dependency: `@ai-matrx/kit` (`latest`).

## 0.7.6

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/associations/v0.7.5..npm/associations/v0.7.6 -- apps/shared/associations`).
No source changes intended and no consumer action required.

## 0.7.5 — 2026-09-02 (recents in token-specific attach pickers)

- The per-token picker opened by an association card's `+` control now shows
  favorited and recently viewed rows under **Recent**, while retaining the
  deduplicated general candidate list under **All** and the existing search,
  attach/detach, and create-and-attach workflows.
- A failing-then-passing integration regression opens the exact
  **Attach conversations** path from `AssociationCard` and proves a favorite
  with no `last_viewed_at` surfaces before an ordinary conversation. Full
  package suite: 194 tests.

## 0.7.4 — 2026-09-02 (bounded universal-picker results)

- The universal picker now keeps type filters in one horizontally scrollable
  rail instead of wrapping the full token cloud through the results viewport.
- Search results retain a labelled, minimum-height vertical region inside
  bounded desktop and mobile hosts, so a visible candidate remains reachable
  and its attach button can enter the normal attach/detach lifecycle.
- A failing-then-passing constrained-layout regression searches and activates
  `Canary Usage Confirmation` at 1440×900 and 390×844, then proves the control
  flips from Attach to Detach. Full package suite: 193 tests.

## 0.7.3 — 2026-09-01 (favorites surface in universal recents)

- Empty-query universal pickers now include a newly favorited entity even when
  no detail route has stamped `last_viewed_at` yet. Previously the canonical
  favorite write succeeded but the picker silently filtered the row out.
- Favorites sort ahead of ordinary recents, with view recency preserving the
  order inside each group.
- A failing-then-passing hook regression covers a favorite with no viewed
  timestamp alongside an ordinary recent item. Full package suite: 191 tests.

## 0.7.2 — 2026-09-01 (verified republish of universal-search repair)

- Republishes the 0.7.1 reference-pickable universal-search repair under a
  fresh immutable version because npm accepted 0.7.1 metadata but never served
  its tarball. Consumers must adopt this hash-verified release, not 0.7.1.

## 0.7.1 — 2026-09-01 (reference-pickable universal search)

- Universal search and attach defaults now use `registry.listableTokens()`.
  Display-only content types remain visible when already attached, but no
  longer generate candidate RPC calls or picker chips.
- Explicit token lists remain supported for specialized host adapters.
- A regression proves the default RPC sweep exactly matches the registry's
  reference-pickable, listable set. Full package suite: 190 tests.

## 0.7.0 — 2026-08-31 (role-safe pin and detach)

- `useContainerLinks` now exposes `setPinned`, which updates the exact
  role-qualified edge, preserves every sibling metadata field, and refreshes
  both endpoint caches through the canonical `assoc_add` chokepoint.
- `AssociationCard` attached-item windows now expose pin/unpin and pass the
  edge role through both pin and detach. Previously, a role-bearing row was
  visible but its detach control targeted only the role-less edge and could
  silently leave the displayed row attached.
- The default `AssociationList` adapter now derives pin state from edge
  metadata and supplies the same role-safe pin operation. Failed pin writes
  announce themselves through the notifier instead of disappearing.
- Hook and face regressions prove metadata preservation and exact-role routing
  for both pin and detach. Full package suite: 189 tests.

## 0.6.2 — 2026-08-31 (vocabulary catch-up: commerce_certified_printer)

Regenerated `src/entity-types.generated.ts` from live `platform.entity_types`:
**656 → 657 tokens**, adding `commerce_certified_printer`
(`commerce.certified_printer`, base tier 1, listed, scopeable) — the certified-
printer entity the print/fulfillment work landed in the database.

Same cause and same blast radius as 0.6.1, one day later: the vocabulary ships
IN this package and consumers have no local regeneration path, so a token that
is live but unpublished fails `check:entity-types` in every consumer — and
matrx-frontend's `release.sh` runs that gate on every release. This one missing
token was refusing EVERY frontend release (reproduced 2026-08-31: "Installed
@ai-matrx/associations vocabulary (656 tokens) is OUT OF SYNC with
platform.entity_types (657 live tokens)"). The fix is always publish ordering —
publish the vocabulary with the migration that adds a token; never pin a
consumer off `latest`.

No API change. 187 tests and typecheck pass unchanged.

## 0.6.1 — 2026-08-30 (vocabulary catch-up: commerce_print_order)

Regenerated `src/entity-types.generated.ts` from live `platform.entity_types`:
**655 → 656 tokens**, adding `commerce_print_order` (`commerce.print_order`,
base tier 1, listed, scopeable) — the print-order entity the @ai-matrx/print
work landed in the database.

WHY THIS IS A RELEASE AND NOT A LOCAL REGENERATION: the vocabulary ships IN
this package; consumers have no local regeneration path. So a token that
exists live but not in the published package is not a cosmetic lag — it fails
`gen:entity-types` in every consumer, and matrx-frontend's release script runs
that generator as a gate. This one missing token blocked EVERY frontend
release (reproduced 2026-08-30: `release.sh` refused at "Installed
@ai-matrx/associations vocabulary (655 tokens) is OUT OF SYNC with
platform.entity_types (656 live tokens)"). The vocabulary has to be published
as promptly as the migration that adds a token.

No API change. 187 tests and typecheck pass unchanged.

## 0.6.0 — 2026-08-30 (C23 — every port ships a working default; the split entry)

THE ALL-INCLUSIVE LAW retrofit (register row: associations). The audit found
seven ports a host had to fill, four UI ports with NO shipped default, and the
bundle-split concern pushed onto the host as hand-written `next/dynamic` glue.
All of it now lives in the package.

### Ports: defaults, not degradations

- **`windowShell` → `DefaultWindowShell` (new).** The absent-port path was a
  fixed, non-draggable card. It is now a REAL window: drag by the header,
  resize from a labelled grip, maximize/restore, viewport-clamped on drag and
  on viewport resize (a window can never be dragged somewhere it cannot be
  dragged back from), Escape-to-close, portalled to `<body>` (a transformed
  ancestor can no longer clip it), non-modal, and a full-width bottom card
  under 640px. Exported as `DefaultWindowShell` for direct use.
- **`errorSink` is no longer REQUIRED.** `createAssociationsStore` ships
  `createDefaultErrorSink()` (new, `/core`): a tagged `console.error` per
  event that ANNOUNCES ONCE that no sink is bound and names the remedy — the
  default is louder about itself than the old hard failure was. Only
  `dataSource` and `identity` still throw; they ARE app identity.
- **`entityDoors.DoorControls` → `DoorControlsSlot` (new).** Every face now
  renders doors through one slot: the host port when bound, otherwise a real,
  keyboard-reachable, `aria-label`led `target="_blank"` anchor built from the
  registry overlay's `hrefFor`. A token with no registered route renders
  nothing — honest absence, never a control that goes nowhere.
- **`capture` → the whole upload flow over one injected primitive.** Bind
  `capture.uploadFile(file, { folderPath, visibility })` and the package ships
  everything else: the file input, whole-body drag-and-drop, sequential
  uploads, the stall watchdog, per-file outcomes, and the loud
  created-but-unattached report. `requestUpload` remains for a host that owns
  a richer pipeline and still wins when both are bound.
- **`pickerOverrides` needs no default** — the in-package `AssociationPicker`
  IS the default for every token, and it is complete (candidate list, search,
  attach/detach, the create-then-associate "+ New" footer).
- **`notifier` degradation unchanged** (warn-once, failures always reach the
  errorSink). The package deliberately does NOT ship a toast stack: a toast
  surface needs a host-mounted root, so a "default" would be the silent
  no-op this package exists to prevent.

### The bundle split is package-owned

- **`@ai-matrx/associations/react/lazy` (new subpath, 3.4 KB)** — every heavy
  face behind a real lazy edge: `AssociationWindow`, `AssociationPicker`,
  `UniversalAssociationPicker`, `AttachedItemsSheet`, `AssociationCard`,
  `AssociationCardGrid`, `AssociationList`, `AssociationCaptureToolbar`,
  `AssociationEntitySelect`, `CategorySelect`, `CategoryTagPicker`,
  `CommentThread`. The loader dynamic-imports this package's own `./react`
  subpath by name (external in our build), so the CONSUMER's bundler emits the
  chunk. Framework-agnostic — `React.lazy` + `Suspense`, no `next/dynamic`,
  no `next` dependency.
- **`lazyWindowShell(loader)` / `lazyPickerOverride(loader)`** (`/react`) —
  the same seam for a HOST component bound to a port, so a host stops
  hand-writing `next/dynamic({ ssr: false })` glue per binding.
  `lazyPickerOverride` additionally gates on `open`, so an override never
  fetches its chunk until its picker is opened.

### Hard parts moved in (C22)

- **The demanded-schema boot probe runs in `AssociationsProvider`** — ON in a
  development build, off elsewhere, overridable with `probeSchema`. Every host
  was writing this effect itself (dynamic import, try/catch, hand-rolled
  `demanded_schema_violation` scream). The store now also exposes the bound
  `dataSource` so nothing has to be re-exported to run it.
- **`useAssociationPickerBridge(props, opts)` (new, `/react`)** — the
  attach-batch / toggle engine a per-token picker override needs: loud partial
  outcomes, created-but-unattached copy naming where the item lives, refusal
  screams on both attach and detach (the inert-click bug class, feedback
  35d311a9), and errorSink routing. Overrides now write two calls instead of
  re-implementing failure semantics.

### Consumer action

- **Nothing breaks.** `errorSink` moving from required to optional is
  source-compatible; every existing binding keeps working unchanged.
- **Delete host `next/dynamic` glue** around associations port bindings and
  use `lazyWindowShell` / `lazyPickerOverride` from `@ai-matrx/associations/react`.
- **Delete the host demanded-schema probe effect** (the `assertDemandedSchema`
  boot check) — the provider owns it. Pass `probeSchema={false}` to opt out.
- **Delete hand-written attach/detach failure handling** inside picker
  overrides and bind `useAssociationPickerBridge` instead.
- **A host that binds `windowShell` should re-decide whether it needs to**:
  bind it only for a real window MANAGER (tray docking, workspace
  persistence, cross-window z-order). Otherwise drop the binding and take
  `DefaultWindowShell`.
- **A host with no upload pipeline** can now get the whole capture flow by
  binding only `capture.uploadFile`.
- New optional peer `react-dom` (`>=18.0.0`) — the default window portals.
  Any React DOM host already has it.

## 0.5.2 — 2026-08-30 (X3 peer retrofit)

- `@ai-matrx/design-system` is now a REAL dependency (`^0.3.1`) instead of an
  optional peer (register row X3 / law C23: sibling `@ai-matrx/*` packages are
  never peers — only react/react-dom/react-native stay peers). Installing this
  package brings the faces' chrome automatically; nothing to resolve by hand.
  The tarball canary no longer installs design-system manually — the graph
  resolves itself from the registry. `react` remains the only (optional) peer.
  No code changes.

## 0.5.1 — 2026-08-30 (vocabulary patch)

- Entity-token vocabulary regenerated from the live registry: **655 tokens**
  (+`workflow_comparison`). The C18 patch-release lane — matrx-frontend's
  `check:entity-types` parity gate demanded it during the W6 host adoption.
  No code changes.

## 0.5.0 — 2026-08-29 (W6 — the comments canonical UI)

W6 per rulings C4/C18: the comments canonical UI is built IN this package —
a GREENFIELD build (matrx-frontend had only a 165-line service, zero
components), designed against the platform comments satellite
(`platform.comments` behind the four `cmt_*` SECURITY-DEFINER RPCs, all
four verified live: SECURITY DEFINER + authenticated EXECUTE on the
platform DB).

- **Demanded schema grows to 27 functions**: the `cmt_list` / `cmt_add` /
  `cmt_edit` / `cmt_delete` family added to `DEMANDED_RPC_FAMILIES`,
  regenerated from the live-generated DB contract; `assertDemandedSchema`
  probes all four with the unparseable-uuid sentinel (every cmt_* fn takes
  a uuid arg, so 22P02 fires before any body runs — zero side effects).
- **`/core` — `createCommentsService`
  (`src/core/commentsService.ts`)** — the `cmt_*` chokepoint, behavior
  ported from matrx-frontend `features/comments/service/commentsService.ts`
  with the package's guard wall added in front (entity token writes-strict
  per C18 + legacy-alias normalization, uuid wall on entityId/parentId/
  commentId, non-empty body). Access decisions stay in the RPCs (edit is
  author-only, delete author-or-org-member, list org-filtered) — link ≠
  grant, zero access decisions here.
- **`/core` — the comment-thread cache slice on the store**
  (`getComments` / `loadComments` / `subscribeComments` / `addComment` /
  `editComment` / `deleteComment` / `invalidateComments`, +
  `services.comments`; `invalidateAll` clears comment threads too): same
  lifecycle contract as the association cache — per-key in-flight dedup,
  ready short-circuit unless forced, pending retains previous comments AND
  the visible error, stable frozen idle default, writes force-reload the
  thread on success only.
- **Root types (`src/comments.ts`)** — `PlatformComment` / `CommentAuthor`
  / `CommentsEntry`, ported from `features/comments/types.ts` and renamed
  to the package vocabulary.
- **NEW `authorDisplay` port (`src/ports.ts` + provider)** — the package
  cannot resolve user profiles itself; `cmt_list` denormalizes
  email/displayName/avatarUrl and a host with a richer profile store
  overrides them through this optional function port. DEGRADATION: absent →
  the denormalized fields render as-is; a row with neither displayName nor
  email shows "Unknown user" + the initial avatar. Never blank, never a
  crash.
- **`/react` — `useComments`** — the thread of comments on any entity
  (token + id) via `useSyncExternalStore`; `currentUserId` is the LENIENT
  identity read gating the own-comment affordances (writes stay loud
  through the services).
- **`/react` — `CommentThread` (+ `CommentComposer`, `buildCommentTree`,
  `formatRelativeTime`)** — the canonical face: threaded list
  (oldest→newest, replies nested by `parentId`, orphaned replies promoted
  to roots — never dropped), composer (Cmd/Ctrl+Enter submits; a failed
  post keeps the text beside the inline error — input is never lost),
  per-item reply, edit-own inline, delete-own as a TWO-STEP that names the
  consequence ("Deletes this comment for everyone.") before the
  destructive click exists, relative timestamps via
  `Intl.RelativeTimeFormat` (+ absolute on hover, "(edited)" marker),
  author names through the `entityDoors.EntityRef` door when bound (token
  `user`), avatars/names through `authorDisplay`. Chrome from
  design-system (`Button`/`Skeleton`/`cn`, peer >=0.3.0 unchanged); glyphs
  inlined (C19 — `RefreshIcon`/`SpinnerIcon`/`CornerDownRightIcon`
  reused, zero new icon deps).
- 30 new behavioral tests (11 /core service+slice, 12 jsdom face tests +
  tree/relative-time units) → **177 total**; full gate green (`typecheck`,
  `test`, `check:package` incl. the packed-tarball canary).

## 0.4.0 — 2026-08-29 (unreleased; W4 completion)

The three faces STOPPED at the W3+W4 build for missing design-system
primitives, now built against `@ai-matrx/design-system` 0.3.0 (Command
family incl. CommandDialog, the Select family, the CreatablePicker
composite) — the optional peer floor moves to **`>=0.3.0`**. Behavior ported
VERBATIM from the matrx-frontend originals (each re-read in full
2026-08-29); only the measured seams inverted, chrome never vendored.

- **`AssociationEntitySelect` (`src/react/components/AssociationEntitySelect.tsx`)**
  — the canonical "name dropdown" (display / inline rename / switch / add new
  / unlink), adapter-driven via the already-shipping
  `AssociationEntitySelectAdapter` contract + default adapter hook. Seams:
  `getEntityInfo` → the store's registry merge engine (`Icon: null` →
  `DefaultEntityIcon`); `@/lib/toast` → the notifier port;
  `EntityDoorControls` → the entityDoors port's `DoorControls` (absent → the
  name and rows render without doors, matching the picker precedent); lucide
  → inlined glyphs (C19).
- **`CategorySelect` (`src/react/components/CategorySelect.tsx`)** — THE
  single-value picker over one `platform.categories` dimension, the
  CreatablePicker composite with the hierarchy parent-select in
  `createExtra`. Seams: the Redux active-organization read
  (`selectOrganizationId`) → the identity port's optional `ensureOrgId()`
  (`orgId` prop wins; with neither, create refuses LOUDLY — notifier + no
  RPC); toasts → notifier. NOTE: the origin's two-part success toast
  (message + description) is joined into the notifier's single success
  message (the port's `success(msg)` carries no description); content
  preserved.
- **`CategoryTagPicker` (`src/react/components/CategoryTagPicker.tsx`)** —
  THE multi-select tagger over the canonical `entity → category` edge
  (full-role `setTargets` semantics verbatim, one write at a time). Seams:
  the host-shaped `ensureOrgId` (`@/lib/organizations/personalOrg`) →
  `identity.ensureOrgId` per the design's seam table, with the loud
  `ensure_org_missing` refusal when neither the `orgId` prop nor the port
  can answer; `console.error` → errorSink
  (`category_tag_set_targets_failed` / `category_tag_create_failed`);
  toasts → notifier; the `icon` prop's `LucideIcon` type → the structural
  `TagPickerIcon`.
- **`buildCategoryHierarchy` → `/core`
  (`src/core/categoryHierarchy.ts`)** — the two-level display-order util
  both category faces consume, ported verbatim from
  `features/scopes/utils/categoryHierarchy.ts` (pure, React-free), exported
  from `/core`.
- **Four new inlined glyphs (C19)**: `ChevronDownIcon`,
  `ChevronsUpDownIcon`, `CornerDownRightIcon`, `TagIcon`.
- **Token vocabulary regenerated from the live registry: 651 → 654 tokens**
  (`platform_continued_access`, `route_manifest_entry`, `short_link` landed
  after the 0.3.0 generation; caught by the W5 swap agent's token-parity
  gate). `check:entity-types` green against live.
- 16 new jsdom behavioral tests (render + interaction + degradations against
  fake ports) → 147 total; full gate green (`typecheck`, `test`,
  `check:package` incl. the packed-tarball canary).


## 0.3.0 — 2026-08-29 (unreleased; W3 + W4 of the extraction)

Waves 3 and 4: the `/react` subpath — the seven hooks riding the /core store
via `useSyncExternalStore`, and the faces/pickers/capture toolbar. Behavior
ported VERBATIM from the matrx-frontend originals (re-read in full
2026-08-29); only the measured seams inverted onto the W1 ports. `/react` is
the package's ONE banner group: its dist chunks carry `"use client"` (tsup
banner + `scripts/stamp-client-boundary.mjs` belt); the root and `/core`
stay pure, and `verify-tarball` now proves both directions.

- **`AssociationsProvider` (`src/react/context.tsx`)** — the one React
  binding point: the host constructs the /core store in its binding module
  and mounts the provider with the five UI ports (notifier / windowShell /
  capture / pickerOverrides / entityDoors). Every hook/face reaches the
  store via `useAssociationsStore()`, which THROWS with a precise message
  when no provider is mounted. `useNotifier()` implements the notifier
  degradation: absent → warn ONCE via errorSink, every user-facing failure
  still screams to the sink.
- **W3 hooks, signatures byte-compatible with the originals** (the W5 swap
  is a re-export flip + Redux-fragment deletion, call sites unchanged):
  `useAssociations` (+ `useEntityRelationships` alias + re-exported
  `AssociationWriteResult`), `useContainerLinks` (incl. the viewer-aware
  `conversation_files` branch, generation/stale guards verbatim),
  `useEntityTitles` (labels never exempt the liveness read; one settled
  round proves absence), `useCategories`, `useUniversalEntitySearch`
  (debounce + recents via `ues_list`), `useAssociationCandidates`,
  `useAssociationEntitySelectAdapter` (+ the
  `AssociationEntitySelectAdapter` contract, which now lives with the
  hook). Redux selectors/thunks → `useSyncExternalStore` over the store;
  `@/lib/toast` → notifier; `console.error` → errorSink; the host `Json`
  type → `unknown` (`ContainerLink.metadata`, `attach` metadata).
  `useAssociationCandidates`' Redux `selectUserId` read became a LENIENT
  identity-port read (null when unauthenticated): `ownerId` is a
  candidate-read filter, not an auth gate — write paths keep the loud
  `requireUserId` contract.
- **W4 faces**: `AssociationCard`, `AssociationCardGrid`, `AssociationList`
  (+ `ContainerResourcesAdapter` + `useContainerLinksAdapter`),
  `AssociationPicker` (+ `AssociationCandidateBody` + the
  create-then-associate footer), `UniversalAssociationPicker`,
  `AttachedItemsSheet`, `AssociationCaptureToolbar`, `AssociationWindow`,
  `PrimaryEntityProvider`/`usePrimaryEntity`, plus the content-role chrome
  (`CONTENT_ROLES`/`getContentRoleMeta` — display metadata is /react's;
  the classification stays /core's) and the door-seam helpers
  (`DoorRef`/`UnresolvedRef`).
- **Seam inversions (deliberate, per the design's Decision 2 table)**:
  - the hardcoded `token === "file"` → FilePickerWindow branch became the
    `pickerOverrides` port: `AssociationPicker` routes a registered token to
    its override component (same `AssociationPickerProps` contract);
    `UniversalAssociationPicker`'s browse mode opens the override too, so
    "file enumeration only happens through the canonical picker" survives
    the inversion; with no override the generic candidate list serves every
    token (the documented degradation);
  - `WindowPanel` → the `windowShell` port; absent → a package-internal
    fixed centered overlay (non-draggable, same anatomy, page behind stays
    interactive);
  - `EntityRef`/`EntityDoorControls`/access-gate `UnresolvedEntityRef` →
    the `entityDoors` port; absent → title text with the overlay `hrefFor`
    anchor when present, plain text otherwise, and the package's plain
    "Unavailable" chip for unreadable targets;
  - the capture toolbar's `features/files` + `features/data-tables` imports
    → the `capture` port, PER-HANDLER optional: chips render only when
    their handler exists, zero handlers → no toolbar and no drop zone
    (never dead buttons, never a drop that swallows files). The original's
    "Add document" picker (a host command palette over
    `listAccessibleDocuments`) has no capture handler by design — hosts
    append it via `extraActions`. "New document" collects its name with an
    inline input row (the original's `TextInputDialog` is host chrome) and
    opens the created document through the registry's `hrefFor` overlay
    instead of a hardcoded `/documents/…` route;
  - lucide icons → the package's own inlined SVGs (C19); host shadcn
    `Input`/`Skeleton`/`Button`/`cn` → `@ai-matrx/design-system` (new
    OPTIONAL peer at the `>=0.2.0` floor, per C18 — never vendored twins).
- **Store additions (additive, /core)**: `AssociationsStore` now exposes
  the bound `errorSink` and `identity` so /react surfaces scream and read
  identity without a second binding.
- **W4 gaps (deliberately NOT built — design-system 0.2.0 lacks the
  primitives; vendoring twins is banned)**: `AssociationEntitySelect`,
  `CategorySelect`, `CategoryTagPicker`. They need a Command/combobox
  family (cmdk-style CommandInput/List/Item/Group/Empty + CommandDialog),
  a Select, and the CreatablePicker composite. The
  `AssociationEntitySelectAdapter` contract + default adapter hook (the
  Redux-free seam) shipped anyway, so those faces are a pure-chrome build
  once design-system grows.
- Tests: 131 (from 97) — jsdom behavioral suites per hook (subscription
  updates, in-flight dedup across two consumers, error surfaces,
  create-then-attach retry + loud outcome) and per face (render +
  interaction against fake ports, every degradation branch: no windowShell,
  no entityDoors, picker override routing, zero capture handlers,
  created-but-unlinked screams).
- Gate: `pnpm typecheck && pnpm test && pnpm check:package` green; the
  tarball canary installs react + react-dom + `@ai-matrx/design-system`
  (npm, 0.2.0) into the empty project and imports AND requires `/react`,
  proves the `"use client"` banner on both /react chunks and its absence
  on all four pure chunks.

## 0.2.0 — 2026-08-29 (unreleased; W2 of the extraction)

Wave 2: the headless owns-persistence `/core` subpath — the service
chokepoint, guards, the loud result funnel, the registry merge engine, the
subscribable cache store, titles/favorites/categories/candidates/entity-rows,
and the falsifiable `assertDemandedSchema` probe. Behavior ported VERBATIM
from the matrx-frontend originals (census appendix, re-read in full
2026-08-29); only the measured seams inverted onto the W1 ports.

- **`createAssociationsStore(cfg)`** (`src/core/store.ts`) — the one runtime
  object a host constructs. Required ports (dataSource/identity/errorSink)
  throw at construction, each with a named message. Replaces matrx-frontend's
  ~530 lines of Redux fragments with verbatim cache behavior: per-key
  in-flight dedup, ready short-circuit unless `force`, pending retains prior
  edges AND the visible error, add/remove reload BOTH endpoints, setTargets
  reloads the source only, category echo-insert then authoritative reload,
  stable idle defaults (`useSyncExternalStore` contract), `subscribe`/
  `subscribeCategories`/`invalidate`/`invalidateAll`. The "never dispatch
  appContextSlice" law is now STRUCTURAL (no host-store import path exists)
  and proven by test: a write notifies only the two endpoint keys.
- **Services** as sink-bound factories over the `dataSource` port, each
  method returning the never-throw envelope: `associationsService` (incl. the
  stricter file→conversation `conversation_file_*` routing and the
  `agent_resource_*` pair), `categoriesService`, `favoritesService`,
  `candidates` (generic `reference_search_candidates` read + overlay
  override + universal cross-token search), `titles` (chunked batch resolve,
  prime, fallback), `entityRows` (registry-convention create/rename),
  `helpers` (linkEdges/linkOneToMany/linkManyToOne/replaceTargets/
  linkCreated/unlinkEdges), and the pure edge classifier
  (`isContentSourceEdge` exclusion-list law).
- **`rpcResult`**: `createRpcResultHelpers(errorSink)` — the original mapper
  verbatim PLUS the new PGRST202 → `demanded_schema_violation` branch that
  ALWAYS reaches the errorSink and names the demanded-schema contract.
- **`assertDemandedSchema(dataSource, { selfTest })`**: probes all 23
  demanded RPCs with ZERO side effects (every uuid arg is an unparseable
  sentinel, so PostgREST resolves the function but Postgres fails the cast
  before any body executes — verified against the live SECURITY DEFINER
  sources 2026-08-29). `selfTest: true` probes a fabricated name that MUST
  come back PGRST202, so a dataSource that cannot fail is refused
  (falsifiability rule).
- **Registry merge engine** (`src/core/registry.ts`): generated metadata +
  host `entityOverlay` port, convention owner/org columns, reads-tolerant
  alias resolution (`cld_file` → `file`), curated/listable token sets with
  the pickable-but-unlistable scream.
- **Seam inversions (deliberate, per the packaging standard)**: supabase
  singleton → `dataSource`; `requireUserId` store read → `identity`; every
  `console.warn`/`console.error` scream → `errorSink` events (plain
  PostgREST result errors still do NOT double-report — hosts capture those
  at the dataSource layer — except PGRST202, which always screams);
  `isTransportFailure` re-implemented in-package (the `@ai-matrx/data/net`
  original's NetError-class branches cannot occur here; the plain-object/
  TypeError/navigator branches ported verbatim) to keep `/core` at zero
  runtime dependencies; lucide `DEFAULT_ICON` → `Icon: null` (C19 — the
  consumer renders its default); the module-level entity-title Map →
  store-instance state (no module-level mutable state exists anywhere in
  `/core`, so there is nothing for dual-loaded graphs to split and no
  globalThis slot is needed); `favoritesService` + `favoritesCore` (two host
  files split only by the singleton coupling) collapse back into ONE
  implementation.
- **Port addition (additive)**: `AssociationsDataSource` gains OPTIONAL
  structural `from`/`schema` members — entity-row create/rename write TABLES
  (verbatim original behavior), not RPCs. An rpc-only dataSource still
  satisfies everything else; entity-row calls against it return a screamed
  error naming the missing capability.
- **Defects found in the originals**: none requiring a behavior change; two
  latent strictness holes hardened in the port (unchecked `failures[0]` in
  the helper combiner and unchecked `list[cursor]` in the search worker —
  both unreachable in practice, both now guarded under
  `noUncheckedIndexedAccess`).
- Tests: 97 (from 26) — every rpcResult mapping branch incl. PGRST202,
  guards + alias recovery, every service branch (file→conversation boundary,
  id-echo checks, dedupe/empty short-circuits), registry merge/degrade,
  candidates/titles/entity-rows incl. chunking and capability screams, the
  full store behavior suite incl. the never-touches-context invariant, and
  the probe proven falsifiable both ways.
- Gate: `pnpm typecheck && pnpm test && pnpm check:package` green; the
  tarball canary now imports AND requires `/core`, constructs a store
  against fake ports, proves required-port throw, and bans "use client" in
  all four dist files.

## 0.1.0 — 2026-08-29 (unreleased; W1 of the extraction)

Wave 1 of the associations extraction
(`common-docs/projects/npm-package-extraction/ASSOCIATIONS-PACKAGE-DESIGN.md`,
ratified C18): the types root.

- **Entity-type vocabulary in-package**: `src/entity-types.generated.ts`
  (651 tokens, generated live from `platform.entity_types` on 2026-08-29) plus
  the generator (`scripts/generate-entity-types.ts`, ported from matrx-frontend
  `scripts/generate-entity-types.ts`). The app-side ENTITY_OVERLAY duplication
  guard stays in matrx-frontend's `check:entity-types` until the W5 elimination
  pass (the overlay is host code). Skew policy per C18: writes strict, reads
  tolerant; registry changes ship as patch releases.
- **Demanded RPC contract**: `src/demanded-rpcs.generated.ts` — the 23-function
  surface (`DemandedRpcSignatures` / `DemandedRpcName` / `DEMANDED_RPC_NAMES`),
  sliced from the live-generated platform DB contract by
  `scripts/extract-demanded-rpcs.ts`. The legacy `assoc_link`/`assoc_list`/
  `assoc_unlink` trio is deliberately not demanded (zero client callers;
  flagged for server-side retirement).
- **Edge/result types** ported verbatim from matrx-frontend
  `features/scopes/types.ts` (`AssociationEdge`, `AssociationTargetEdge`,
  `AssociationSourceEdge`, `AssociationsEntry`, `UserEntityState`,
  `PlatformCategory`, `CategoriesEntry`, `ASSOCIATION_TARGET_TYPES`) with two
  deliberate seam inversions, per the packaging standard:
  - the host contract's `Json` type became `unknown` (JSON-boundary rule);
  - `ScopesRpcError`/`ScopesRpcResult` became `AssociationsRpcError`/
    `AssociationsRpcResult`, and the error-code union gained
    `demanded_schema_violation` (the PGRST202 → demanded-schema scream that
    `/core`'s `rpcResult` will map in W2; `template_missing`, a scopes-only
    code, was not carried over).
- **The seven ports** (`src/ports.ts`): `AssociationsDataSource`,
  `AssociationsIdentity`, `ErrorSink` (required) + `EntityOverlayEntry`,
  `AssociationsNotifier`, `WindowShellPort`, `CapturePort`,
  `PickerOverrideMap`, `EntityDoorsPort` (optional, defined degradations),
  combined in `AssociationsConfig`. Shapes distilled from the measured
  matrx-frontend call sites (census 2026-08-29), nothing speculative.
- Gate: `pnpm typecheck && pnpm test && pnpm check:package` (build, publint,
  attw on the packed tarball, empty-project ESM import + CJS require canary,
  pure-root "use client" ban) — all green; `check:entity-types` drift gate
  proven falsifiable against the live registry.


