# Changelog

## 0.59.298

- ContextRulesChip accepts an optional `faceText`: a word drawn on the face beside the eye when the group has no name (the beginner's chat page shows "Context"). It never becomes the group's name. Consumer action: none; absent, the face is unchanged.

## 0.59.296

- Generated provision offers now include `AgentFactoryAgentBriefOffer` for `agent_factory.agent_brief`, with its goal, available inputs, output structure, limitations, and additional-instruction fields. `ProvisionOffers` and `PROVISION_OFFER_KINDS` include the new offer, and the mandate snapshot adds `agent_factory.agent_builder_2`. Consumer action: none for existing consumers; custom hosts can use the new offer type.

## 0.59.295

- Sources envelopes (`SourceRef`, `SourceSet`, `ResolvedSourceSet`) now carry `envelope: "resource_ref" | "source_set" | "resolved_source_set"` instead of `__kind` (unified-source-input amendment A6; Content IR rule 28: `__kind` names registered kinds only). New `ENVELOPE_KEY` and `envelopeOf(value)`; `isSourceRef`, `isSourceSet`, `totalChars` and the context helpers read either spelling. Consumer action: build envelopes with `createSourceRef` / `createSourceSet` (or write `envelope`); read the discriminator with `envelopeOf`, never `.__kind`. The server still accepts the old `__kind` spelling.

- Agent catalog adds `patchAgent(agentId, patch)` and `restoreAgent(row)`: a host write elsewhere (a rename, an archive) shows in every catalog list at once, with rollback. Consumer action: none; a host that edits agent rows may call them to keep lists current.

## 0.59.294

- `AgentRunControlsRow` adds optional `mcp_server_slugs` and `excluded_tools` fields and documents `mcp_servers` as catalog IDs. Consumer action: no required migration; use `mcp_server_slugs` when naming or resolving connectors and `excluded_tools` when showing forbidden tools. Existing fields remain compatible.

## 0.59.293

- ContextRulesChip accepts an optional faceIcon for its included state; blind state keeps the crossed-out eye. Consumer action: optionally supply a custom glyph. Existing defaults are unchanged.

## 0.59.292

- ContextRulesChip shows its resolved count in the shared button corner badge and keeps the name as the label. Pending counts do not add a badge. Consumer action: none; existing chip props are unchanged.

## 0.59.291

- Generated stream contracts now include `VaultPasswordHealthProgressData` and `VaultPasswordHealthScanReferenceData` in `TypedDataPayload`. Progress carries checked/skipped counts; the scan reference carries opaque request/execution handles and recovery paths. Findings remain in the separate result read. The mandate key snapshot records the corresponding server revision.

Consumer action: handle the two added variants in exhaustive typed-data dispatchers, or retain the existing fallback for unhandled variants. Persist only the count progress and opaque scan reference in replay; do not add findings to the replay journal. Existing payload variants retain their contract.

## 0.59.290

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/matrx-agents`

Changed package inputs (1):
- `apps/shared/matrx-agents/generated/provision-offers.ts`

## 0.59.289

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 ef92845a81 6b2dffcf8c -- apps/shared/matrx-agents`

Changed package inputs (4):
- `apps/shared/matrx-agents/generated/provision-offers.ts`
- `apps/shared/matrx-agents/generated/stream-events.schema.json`
- `apps/shared/matrx-agents/generated/stream-events.ts`
- `apps/shared/matrx-agents/mandates/snapshots/keys.0.59.0.json`

## 0.59.288

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 b9d1523fb2 ef92845a81 -- apps/shared/matrx-agents`

Changed package inputs (4):
- `apps/shared/matrx-agents/generated/provision-offers.ts`
- `apps/shared/matrx-agents/mandates/display-seeds.generated.ts`
- `apps/shared/matrx-agents/settings/logic.ts`
- `apps/shared/matrx-agents/settings/settings-catalogue.ts`

## 0.59.287

New entry `@ai-matrx/agents/prompt-blocks`: the prompt-block library's shared logic moved here from matrx-frontend (lanes, variant conditions, `{{<name>}}` tokens) plus `createPromptBlockDoor(() => client)` (the data door through the host's supabase client) and `parseLocalPrompts` / `localPromptToBlock` / `freeBlockName` / `localOriginOf` (a computer's saved prompts become personal blocks).

Consumer action: none for existing entries. Matrx 2 binds the door to its own client.

## 0.59.286

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 5918e2cc6e 4fd7c44685 -- apps/shared/matrx-agents`

Changed package inputs (1):
- `apps/shared/matrx-agents/models/react/ModelListDropdown.tsx`

## 0.59.285

Model catalog reads recognize typed quiet answers. A previously ready catalog stays available. Without a ready result, the catalog keeps its existing rows with `loadedAt: null` and reads again when quiet ends. Real read failures still use the existing error path.

Consumer action: no API changes. Hosts enabling quiet mode must install the Kit quiet source with its change subscription so an empty catalog refreshes when quiet ends. Hosts without a quiet source retain their previous behavior.

Correction: this release changed runtime code in `models/catalog/store.ts`, outside `src/`; the original source-only diff incorrectly described it as metadata-only.

## 0.59.284

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

## 0.59.283

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

## 0.59.282

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

## 0.59.281

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

## 0.59.280

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

## 0.59.279

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

## 0.59.278

- `./models`: `followModelCatalogVisibility` never swallows a return. Every show / focus after the tab was
  hidden or blurred reads the stamp; only repeated shows with no time away share a read for `minIntervalMs`.
  The baseline is read at bind (one row) and on hide / blur after a change made it unknown; a tab's own
  catch-up keeps the stamp it read. Live 2026-10-24: the admin audit page took focus for a search, the admin
  renamed in another tab and came back inside 20 s, and the throttle read nothing. Test:
  `models/react/hidden-tab-catches-up-on-visible.test.tsx`. Consumer action: none.

## 0.59.277

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

## 0.59.276

- `./models`: one catalog edit costs a page at most two requests, however many model labels are mounted.
  `records.refresh(listed?)` re-reads full records in ONE `in (...)` read, identities in ONE `in (...)`
  read of only the ids no list row covers, and model class slices in ONE read; `createModelCatalog().refresh()`
  passes its picker list's fresh `model_public` + `model_offering` rows (`ModelCatalogListRows`), which answer
  the records' options list, identities and class index, so an edit is that one list read. `loadIdentity`
  calls for ids in the same tick (N labels mounting) coalesce into one `in (...)` read, shared with
  `loadIdentities`; a name-shaped key still reads alone. Live 2026-10-24 (web f8dc2956): one rename cost the
  chat page a list read plus one single-id `model_definition` read per label. Guard:
  `models/react/catalog-changed-request-count.test.tsx`. Consumer action: none (the argument is optional).

## 0.59.275

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

## 0.59.274

- `./models`: a burst of `catalog_changed` is ONE re-read. New `coalesceModelCatalogChanges(deliver, options?)`:
  a `requestId` already delivered (60 s) is dropped; the first envelope of a burst is delivered at once; copies
  with the same payload inside 1.5 s are dropped; a different payload inside the window is delivered once when
  it closes. `followModelCatalogChanges(subscribe, options?)` uses it, and the subscribe handler may pass a
  second `meta` argument (`{ requestId }`). Live 2026-10-24: one edit reached every open app as 8 + 8
  envelopes. Consumer action: none for the web; Matrx 2's main-process follower adopts the coalescer.

## 0.59.273

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

## 0.59.272

- New export `./context/rules-corpus.json` (shipped in `files`): the context-rules parity corpus, so a consumer test (chat) reads it through the dependency instead of a path into this package. Additive; no consumer action required.

- `./settings`: `reasoning_effort` leaves `AUTO_MEANS_UNSET_KEYS` — a person's "auto" is saved and
  sent (owner ruling 2026-10-24: unset effort runs at the platform default "low"; "auto" only when a
  person picks it). New `NEVER_IMPLICIT_AUTO_KEYS` + `isNeverImplicitChoice`; `startingValueFor`
  never starts a row at "auto". Consumer action: none beyond adopting latest — every writer reads
  `isUnsetChoice` already.

## 0.59.271

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

## 0.59.270

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

## 0.59.269

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

## 0.59.268

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

## 0.59.267
### a kept value with no schema stays editable; a value's source reaches a phone

- `ModelSettingsPanel`: a set value the model declares no control for ("Translated", "Not on this model") is edited again, through `SettingControlInput` with a control from the value's own shape (new export `controlForValue`); the target receives `change(key, value, null)`. A row's `source` ("Agent", "Binding") — the status glyph's hover text — is also a `[data-touch-hint]` line under the control where nothing can hover. Test: `settings/react/a-kept-value-with-no-schema-stays-editable.test.tsx`. Consumer action: none (a target's `change` already accepts a null control).

## 0.59.266
### model labels by id (FW-014 round 3)

- `ModelRecords.loadIdentities(modelIds)`: the durable labels of several models in ONE
  `ai.model_definition … in(id)` read, deduped with `loadIdentity` — what an open menu names without the
  options list (`ai.model_offering` + `ai.model_public`). Consumer action: a custom `ModelRecords` fake
  adds `loadIdentities`.


## 0.59.265
### tagged rows without the catalog (FW-014, composer)

- `ensureTaggedRows(tags)` + `readAgentTaggedRows` (`agent.agx_picker_tagged`, live 2026-10-23, reach verified
  against `agx_get_list_full`): the caller's live agents carrying any tag, never the whole catalog.
  Consumer action: none.

### the agent menu opens on one thin page, never the catalog (FW-014)

- Every picker (`AgentListDropdown`, `AgentListPanel`, `AgentListInlinePicker`, native `AgentPickerBody`)
  now opens on ONE page of `agent.agx_picker_page` — favorites, then the agents the person used most
  recently, then name; 50 rows; only the columns a row renders; the tab counts on page 1 — and reads the
  next page on scroll. Typing still searches `agx_search`. Measured in SQL: page 1 3.4 KB (ordinary account)
  / 32 KB (admin) in ~0.2–0.4 s, where opening the menu used to read 673 / 1,476 full rows (~340 KB, 2.6 s).
  The whole catalog is read only when the person opens the category/tag facets, picks another sort, a
  favorites/access filter, or the host passes `agentFilter` — or when another surface already holds it fresh.
- New on the catalog: `ensurePickerPage(query)`, `loadMorePickerPage(query)`, `ensureAgentRows(ids)` (full
  rows by id through `agent.agx_get_by_ids`), `state.pickerPages`, `agentPickerPageKey`, `pickerReads`.
  New data doors: `readAgentPickerPage`, `readAgentRowsByIds`, `PICKER_PAGE_SIZE`. `AgentSummary` gains
  `isThin` (a page row: no description/model/offering/task/source/sharer) and `lastUsedAt`.
- A thin row never replaces a full one; hovering a thin row reads that one row (web and native detail
  cards render the full row when it lands); the pinned current agent is read by id when it is not on page 1.
- `useAgentSummary` reads the one row by id (`ensureAgentRows`) instead of loading the whole catalog;
  server search remains the fallback for an id that read does not return.
- `useAgentListCore` returns `paged`, `hasMore`, `loadingMore`, `loadMore`, `totalCount`,
  `ensureFullCatalog`; `AgentListContent` (web) takes `hasMore` / `onReachEnd` / `loadingMore` /
  `totalCount`, native takes `onReachEnd` / `totalCount`.
- Knob: `createAgentCatalog({ pickerReads: "catalog" })` restores the read-everything-on-open behavior (a
  host whose client cannot reach the `agent` schema; tests of the full-list rules). Default `"page"`.
- Consumer action: none for hosts using supabase-js (needs `agent.agx_picker_page`, live since
  2026-10-23). A host that reads `catalog.getState().rows` expecting the whole catalog after a picker
  opened must call `ensureLoaded()` itself — the picker no longer loads it. A host component that
  renders a hovered agent's description from the picker's object should read the store row
  (`getAgent(id)`), which `ensureAgentRows` fills.

### no second star read after a catalog or search read (FW-014)
## 0.59.264

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

## 0.59.263

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

## 0.59.262
### no second star read after a catalog or search read (FW-014)

- `ensureLoaded()` and `searchServer()` no longer follow each read with `ues_get_bulk('agent', every id)`.
  Every catalog read (`agx_get_list_full`, `agx_search`, `agent.agx_get_by_ids`) already returns
  `is_favorite` computed server-side from `platform.user_entity_state` (`platform.my_favorite`), so
  `toAgentSummary` now reads it. Saves one sequential request uploading every agent id (673 ids for an
  ordinary account, 1,478 for admin) on every picker load and search.
- Removed: `overlayAgentFavorites` (internal) and the `favorite_read_failed` error code. The favorites
  port's `getBulk` is no longer called by the catalog. Consumer action: none.

## 0.59.261

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

## 0.59.260
### the pinned read asks the server for those agents only (FW-015)

- `ensureFavoriteRows()` / `readFavoriteAgentRows` now read the starred agents through
  `agent.agx_get_by_ids(p_ids)` (same columns and access words as `agx_get_list_full`) instead of
  `agx_get_list_full` filtered by id, which made the server build the caller's whole catalog first.
  Measured on live: ordinary account 161 → 41 ms, admin 390 → 53 ms, identical rows.
- The narrow read needs a client with `schema()` (supabase-js has it); without one the store falls back to the
  whole catalog and reports `pinned_read_unsupported`, as before. Consumer action: none.

## 0.59.259

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

## 0.59.258

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

## 0.59.257

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

## 0.59.256

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

## 0.59.255

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

## 0.59.254

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

## 0.59.253

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

## 0.59.252

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

## 0.59.251

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

## 0.59.250

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

## 0.59.249

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

## 0.59.248

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

## 0.59.247

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

## 0.59.246

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

## 0.59.245

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

## 0.59.244

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

## 0.59.243

- **`toolPriceText` is removed (Arman, 2026-10-22: no price printed on a picker row).** The Tool catalog picker no longer prints a points hint; `CatalogToolHit.price_hint_points` stays on the hit. Consumer action: none.
- **`SearchInput` is now `CatalogSearchField` (`@ai-matrx/agents/catalog/react` and `/native`).** It was never `@ai-matrx/design-system`'s `SearchInput`: it is the compact field that drives the agent list's listbox (a `ref`, `onKeyDown`, ARIA combobox wiring, `onChange(value)` with no debounce), which the design-system one does not offer. The old name collided with design-system's in the export census. **Consumer action:** rename the import (`SearchInput` -> `CatalogSearchField`).

## 0.59.242

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

## 0.59.241

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

## 0.59.240

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

## 0.59.239

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

## 0.59.238

- **The context views never warn the person (Arman, 2026-10-22).** `ContextRulesChip` loses `mismatchCount` / `mismatches` (no amber face, no warning glyph, no "N · M" count); `ContextRulesTable` and `ContextRulesPanelBody` lose `mismatches` (no row marker, no "expected X, got Y" banner); `describeMismatches` is deleted. `compareReceipt` is unchanged — the host still files the silent `context_truth_mismatch`. A self-check row keeps its tooltip from `row.blockedBy`. Guard: `context/react/a-context-view-never-warns-the-person.test.tsx`. Consumer action: stop passing `mismatchCount` / `mismatches`.

## 0.59.237

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

## 0.59.236

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

## 0.59.235

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

## 0.59.234

- **The Voice row is the panel's own (owner, 2026-10-21: one settings experience).** `ModelSettingsPanel` draws `tts_voice` with `VoiceSettingControl` — one voice, or named speakers (name · voice · remove, "Add speaker", the model's `multi_speaker.max`) when the model declares `multi_speaker` — in every host, so the chat's "Model and overrides" edits voices exactly as the builder does. `SettingsWriteTarget.changeMany` (optional) writes `tts_voice` + `multi_speaker` as one change; without it the panel calls `change` per key. New `settingControl(controls, key)` in `./settings`. Removed: the panel's `renderRow` prop and the `SettingRowFrame` / `SettingRowLabel` / `formatSettingValue` exports of `./settings/react` (their one consumer, the builder's hand-drawn voice row, is gone). Guard: `settings/react/model-settings-panel.test.tsx`. Consumer action: drop `renderRow` and any `SettingRowFrame` / `SettingRowLabel` import; give a target that writes a record `changeMany`.

## 0.59.233

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

## 0.59.232

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

## 0.59.231

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

## 0.59.230

The agent picker windows its list. `AgentListContent` (the body of
`AgentListInlinePicker`, `AgentListDropdown` and `AgentListPanel`) mounted every
agent as a row — measured live on a 605-agent tab: ~5,000 extra DOM nodes and a
0.8–2.8 s main-thread block on every open. Past 50 rows it now renders only the
rows the viewport shows plus overscan (`computeWindow` from
`@ai-matrx/design-system/data-table/virtual-window`), with spacers keeping the
scroll height exact; rows are a fixed `AGENT_ROW_HEIGHT` (36 px, exported).
The list is a `listbox` of `option`s (`aria-setsize`/`aria-posinset`), and the
search field is its `combobox`: ArrowUp/ArrowDown/PageUp/PageDown move the
highlight (`aria-activedescendant`), scrolling unmounted rows into view, and
Enter picks. Opening with a selected agent that is not pinned scrolls it into
view. `SearchInput` takes optional `onKeyDown` and `inputProps`. Proof:
`catalog/react/picker-virtualized.test.tsx` (600 agents; red on the old list).
No consumer action required.

## 0.59.229

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

## 0.59.228

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

## 0.59.227

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

## 0.59.226

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

## 0.59.225

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

## 0.59.224

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

## 0.59.223

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

## 0.59.222

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

## 0.59.221

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

## 0.59.220

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

## 0.59.219

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

## 0.59.218

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

## 0.59.217

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

## 0.59.216

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

## 0.59.215

- **Glyph path data removed; the same exports now alias the one glyph home (one-canonical, glyph lane, 2026-10-21).** `context, models, settings and versions icon files` 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; catalog `FolderIcon`, `TagIcon` and `RotateCcwIcon` are re-exports of the glyph home, and the settings rows join classes with `cn` from `@ai-matrx/design-system/cn`. Consumer action: none.

## 0.59.214

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

## 0.59.213

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

## 0.59.212

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

## 0.59.211

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

## 0.59.210

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

## 0.59.209

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

## 0.59.208

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

## 0.59.207

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

## 0.59.206

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

## 0.59.205

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

## 0.59.204

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

## 0.59.203

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

## 0.59.202

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

## 0.59.201

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

## 0.59.200

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

## 0.59.199

### THE model-settings panel, round 2 (2026-10-21)

- `ModelSettingsPanel` draws THE model row itself: `model` is now a `ModelRowTarget` (`./settings`) — value, change, class pin, `changedHere` + `resetToInherited`, an optional `emptyChoice`, `localModels`, `disabled` + `disabledTitle`, and `oneMessage` ("This message only") — rendered with `ModelListDropdown`. A host can no longer pass a picker of its own.
- The panel draws the set values the model does not declare, for every host: `extraSettingKeys(controls, values, alsoKeys)` (new, `./settings`) splits them into `translated` (a real model parameter — "Translated for this model", the server converts it) and `unsupported` ("Not on this model"); `settingLabel(key)` (new) names them with the catalog's own label. `SettingsWriteTarget.changedKeys` (new, optional) keeps a key the target removed on screen with its reset.
- The panel imports THE model picker by its published subpath (`@ai-matrx/agents/models/react`, external in the build): 0.59.195 bundled a second copy of `ModelListDropdown` and its catalog context into `settings/react`, which a host's `ModelCatalogProvider` never reaches.
- The input capabilities use THE control `Switch` (`./controls`), which carries the tap-target half-gap beside a reset (the dev guard outlined the root `Switch` there).
- `./settings/react` no longer exports `SettingControlInput`, `InputCapabilitiesEditor`, `ExtraSettingRow` or `SettingsGroupSection`: the panel is the only way in. `SettingRowFrame` / `SettingRowLabel` stay for a host's `renderRow`.
- **Consumer action:** pass `model={{ value, change, pinnedOfferingId, changePin }}` instead of a `<ModelListDropdown/>` node; drop any hand-drawn "Translated" / unsupported rows (the panel draws them); import nothing else from `./settings/react` but the panel, `SettingRowFrame` and `SettingRowLabel`.

## 0.59.198

### THE model-settings panel, round 2 (2026-10-21)

- `ModelSettingsPanel` draws THE model row itself: `model` is now a `ModelRowTarget` (`./settings`) — value, change, class pin, `changedHere` + `resetToInherited`, an optional `emptyChoice`, `localModels`, `disabled` + `disabledTitle`, and `oneMessage` ("This message only") — rendered with `ModelListDropdown`. A host can no longer pass a picker of its own.
- The panel draws the set values the model does not declare, for every host: `extraSettingKeys(controls, values, alsoKeys)` (new, `./settings`) splits them into `translated` (a real model parameter — "Translated for this model", the server converts it) and `unsupported` ("Not on this model"); `settingLabel(key)` (new) names them with the catalog's own label. `SettingsWriteTarget.changedKeys` (new, optional) keeps a key the target removed on screen with its reset.
- The input capabilities use THE control `Switch` (`./controls`), which carries the tap-target half-gap beside a reset (the dev guard outlined the root `Switch` there).
- `./settings/react` no longer exports `SettingControlInput`, `InputCapabilitiesEditor`, `ExtraSettingRow` or `SettingsGroupSection`: the panel is the only way in. `SettingRowFrame` / `SettingRowLabel` stay for a host's `renderRow`.
- **Consumer action:** pass `model={{ value, change, pinnedOfferingId, changePin }}` instead of a `<ModelListDropdown/>` node; drop any hand-drawn "Translated" / unsupported rows (the panel draws them); import nothing else from `./settings/react` but the panel, `SettingRowFrame` and `SettingRowLabel`.

## 0.59.197

### THE model-settings panel, round 2 (2026-10-21)

- `ModelSettingsPanel` draws THE model row itself: `model` is now a `ModelRowTarget` (`./settings`) — value, change, class pin, `changedHere` + `resetToInherited`, an optional `emptyChoice`, `localModels`, `disabled` + `disabledTitle`, and `oneMessage` ("This message only") — rendered with `ModelListDropdown`. A host can no longer pass a picker of its own.
- The panel draws the set values the model does not declare, for every host: `extraSettingKeys(controls, values, alsoKeys)` (new, `./settings`) splits them into `translated` (a real model parameter — "Translated for this model", the server converts it) and `unsupported` ("Not on this model"); `settingLabel(key)` (new) names them with the catalog's own label. `SettingsWriteTarget.changedKeys` (new, optional) keeps a key the target removed on screen with its reset.
- The input capabilities use THE control `Switch` (`./controls`), which carries the tap-target half-gap beside a reset (the dev guard outlined the root `Switch` there).
- `./settings/react` no longer exports `SettingControlInput`, `InputCapabilitiesEditor`, `ExtraSettingRow` or `SettingsGroupSection`: the panel is the only way in. `SettingRowFrame` / `SettingRowLabel` stay for a host's `renderRow`.
- **Consumer action:** pass `model={{ value, change, pinnedOfferingId, changePin }}` instead of a `<ModelListDropdown/>` node; drop any hand-drawn "Translated" / unsupported rows (the panel draws them); import nothing else from `./settings/react` but the panel, `SettingRowFrame` and `SettingRowLabel`.

## 0.59.196

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

## 0.59.195

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

## 0.59.194

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

## 0.59.193

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

## 0.59.192

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

## 0.59.191
### THE model-settings panel (2026-10-21)

- Added `./settings/react` `ModelSettingsPanel`, `ExtraSettingRow`, `SettingRowFrame`, `SettingsGroupSection`, `SettingRowLabel`, `formatSettingValue`; `./settings` `SettingsWriteTarget` / `CapabilitiesWriteTarget` / `SettingRowRead`, `isOffValue` / `offValueFor` / `settingStateOf` / `withSettingState` / `ENUM_OFF_VALUE`, `isUnsetChoice` / `AUTO_VALUE` / `AUTO_MEANS_UNSET_KEYS`, `startingValueFor`.
- Removed `SettingControlInput` props `size` and `explicitState`; `InputCapabilitiesEditor` prop `variant` (and `overriddenKeys` is now `changedKeys`); `ENUM_OFF_VALUE` is exported from `./settings` only.
- **Consumer action:** render settings through `ModelSettingsPanel` with a `SettingsWriteTarget` (never `SettingControlInput` in a hand-built row); import the auto rule from `@ai-matrx/agents/settings` (the `@ai-matrx/chat/.../instance-model-overrides/auto-means-unset` module is gone); matrx-frontend deletes its `settings-management/setting-state.ts` and imports it from `@ai-matrx/agents/settings`.

## 0.59.190

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

## 0.59.189

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

## 0.59.188

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

## 0.59.187

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

## 0.59.186

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

## 0.59.185

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

## 0.59.184

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

## 0.59.183

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

## 0.59.182

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

## 0.59.181

- **US spelling: the British spelling of "color" no longer exists in this package (Arman, 2026-10-21).** Every label, template string, comment, identifier, CSS class/variable and test name that spelled it the British way now says color. Guard: `design-system/src/us-spelling.test.ts` scans all of `apps/` for the word. Consumer action: none for imports; if you matched on a British-spelled identifier, class or CSS variable from this package, use the `color` spelling; update the package.
- **New `./versions` and `./versions/react` entries: an agent's saved versions — list, compare, restore — moved from the web app (2026-10-21).** `./versions` (pure): `listAgentVersions`, `readAgentVersionSnapshot`, `resolveAgentVersionId`, `promoteAgentVersion` (restore, `agx_promote_version`), `declareContractBreak` over the host's supabase client (`VersionsClient`); `compareAgentDefinitions`, `AGENT_DIFF_OPTIONS`, `promoteFailureMessage`, `computeVersionFetchTargets`, `enrichVersions`, `snapshotToComparable`. `./versions/react`: `AgentDiffViewer` (ports: `enrichment`, `refs` for model/tool identity refs), `buildAgentAdapterRegistry`, `VersionHistoryTimeline` (presentational: the host passes load state, the contract-break write, row actions). New dependency `@ai-matrx/diff`. Consumer action: the web imports these instead of its own copies; Matrx 2 shows them.

- **`ContextRulesChip` closes its compact popover on the first Escape even when a focused control has an open tooltip.** The tooltip dismissal layer previously took that key and left the popover visible. Consumer action: none.

- **`useAgentSummary` looks an agent up by server search once per id per catalog (2026-10-19, Board remount law).** An agent tile that woke or remounted searched (`agx_search`) three times each time when the search found nothing; a found, missing or in-flight id is now asked once per tab, and a lookup that failed is forgotten so the next mount asks again. Consumer action: none.

- **`toolPriceText` returns null for a zero-cost tool instead of "Free" (2026-10-18, law 14: no "Free").** Positive hints still read "N pts". Consumer action: none (callers already handle null).

## 0.59.180

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

## 0.59.179

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

## 0.59.178

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

## 0.59.177

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

## 0.59.176

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

## 0.59.175

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

## 0.59.173

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

## 0.59.172

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

## 0.59.171

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

## 0.59.170

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

## 0.59.169

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

## 0.59.168

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

## 0.59.167

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

## 0.59.166

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

## 0.59.165

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

## 0.59.164

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

## 0.59.163

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

## 0.59.162

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

## 0.59.161

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

## 0.59.160

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

## 0.59.159

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

## 0.59.158

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

## 0.59.157

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

## 0.59.156

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

## 0.59.155

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

## 0.59.154

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

## 0.59.153

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

## 0.59.152

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

## 0.59.151

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

## 0.59.150

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

## 0.59.149

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

## 0.59.148

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

## 0.59.147

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

## 0.59.146

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

## 0.59.145

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

## 0.59.144

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

## 0.59.143

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

## 0.59.142

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

## 0.59.141

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

## 0.59.138

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

## 0.59.137

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

## 0.59.136

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

## 0.59.135

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

## 0.59.134

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

## 0.59.133

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

## 0.59.132

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

## 0.59.131

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

## 0.59.130

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

## 0.59.129

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

## 0.59.128

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

## 0.59.127

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

## 0.59.126

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

## 0.59.125

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

## 0.59.124

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

## 0.59.123

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

## 0.59.122

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

## 0.59.121

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

## 0.59.120

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

## 0.59.119

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

## 0.59.118

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

## 0.59.117

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

## 0.59.116

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

## 0.59.115

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

## 0.59.114

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

## 0.59.113

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

## 0.59.112

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

## 0.59.111

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

## 0.59.110

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

## 0.59.109

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

## 0.59.108

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

## 0.59.107

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

## 0.59.106

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

## 0.59.105

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

## 0.59.104

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

## 0.59.103

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

## 0.59.102

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

## 0.59.101

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

## 0.59.100

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

## 0.59.99

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

## 0.59.98

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

## 0.59.97
### Unreleased

- **"Get More Models..." shows wherever the local group is offered:** every tab, during a search too (it was the All tab with no search only).
- **`toolPriceText` is removed (Arman, 2026-10-22: no price printed on a picker row).** The Tool catalog picker no longer prints a points hint; `CatalogToolHit.price_hint_points` stays on the hit. Consumer action: none.
- RENAMED `SettingsRow` interface (model-setting catalogue row) to `ModelSettingRow`, so `SettingsRow` names only the design-system row component. Both were exported from different packages under one name.

- **`./models`: downloadable (local) models — one selection for every client.** `selectVariant()`
  (want × device × catalog → the variant, its runtime build and hardware class, `decided_by`, a reason line,
  and exactly the files to fetch), `requiredArtifacts()`, `hardwareClassesOf()`, the one memory-fit function
  (`fitsMemory`, `fitsThisComputer`; the fit fraction is the caller's knob, no default), `catalogForApp()`
  (min_app_version filter with the hidden count) and the `matrx.model-catalog.snapshot/v1` types
  (`LocalModelCatalog`, `isLocalModelCatalog`). Additive; no consumer action.

## 0.59.96

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

## 0.59.95

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

## 0.59.94

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

## 0.59.93
### Unreleased

- `AgentListPanel`: a pointer-leave that arrived while a Copy/More menu held the card closes the panel once the menu closes. Consumer action: none.
- `AgentDetailCard` is now drawn by `Peek` from @ai-matrx/design-system (one `PeekRecord`, `agentPeekRecord(agent, …)` exported beside it): same content, plus Copy (the agent through Alchemy), a measured footer and a phone drawer. `actions` is gone; a host's Duplicate is `duplicate={{ onDuplicate, busy }}` (drawn behind More, never beside Copy). `onHoldChange` lets a hover preview stay open while a Copy/More menu is open; `AgentListPanel` uses it. Consumer action: replace `actions={<YourDuplicate …/>}` with `duplicate={…}` (the chat composer is updated).

## 0.59.92

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

## 0.59.91

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

## 0.59.90

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

## 0.59.89

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

## 0.59.88

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

## 0.59.87
### Unreleased

- **Model succession, in ONE function** — `@ai-matrx/agents/models` `resolveSuccessor(modelId, index)` (+ `buildSuccessionIndex`, `models/succession.ts`) follows `successor_id` from a deprecated or retired model to the first live one; cycle-safe, capped at 8 hops, a broken chain keeps the original id and logs once. `ModelListDropdown` uses it for its value (a saved superseded model shows as its successor and `onValueChange(successor)` fires once, the old class pin dropped first, so a host's saved setting heals) and its list (a person is never offered a superseded model; admins still see both, badged). Guards: `models/__tests__/succession.test.ts`, `models/react/succession-picker.test.tsx` (red with the resolver bypassed). Consumer action: none.
- **Local models scoped to the picker that asks** — `ModelListDropdown` takes a `localModels` prop (beats the provider's port), and `LocalModelsPort.open?(id)`: present, a local pick calls only `open` (the host opens its own private conversation; the cloud value, class pin and draft are untouched). Consumer action: pass `localModels` from chat composers only; never on a global provider.
- `@ai-matrx/agents/models/react` — optional `localModels` port (`LocalModelsPort`, `LocalModelEntry`, `useLocalModels`) on `ModelCatalogProvider`: a host with models on the person's own computer lists them in the picker as one "On this computer" group, each row marked `local`, a model that needs more memory dimmed. Picking one reports its id through the same `onValueChange` (class pin cleared first). No port: the picker is unchanged. Not shown in relationship (`modelOnly`), admin, or id-constrained pickers.
- `@ai-matrx/agents/quick` — Quick agents: the minimal agent definition (name, system prompt, model,
  temperature, top-p, max output tokens) marked `kind: quick` (`metadata.kind` + the `kind:quick` tag),
  its row builders, `listMyQuickAgents` / `withoutQuickAgents` selectors over the one catalogue, and
  create/update/soft-delete/read over the existing `agent.definition` table. No new table or column.

## 0.59.86

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

## 0.59.85

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

## 0.59.84

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

## 0.59.83

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

## 0.59.82

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

## 0.59.81

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

## 0.59.80

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

## 0.59.79

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

## 0.59.78

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

## 0.59.77

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

## 0.59.76

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

## 0.59.75

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

## 0.59.74

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

## 0.59.73

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

## 0.59.72

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

## 0.59.71

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

## 0.59.70

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

## 0.59.69

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

## 0.59.68

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

## 0.59.67

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

## 0.59.66

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

## 0.59.65

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

## 0.59.64

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

## 0.59.63

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

## 0.59.62

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

## 0.59.61

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

## 0.59.60

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

## 0.59.59

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

## 0.59.58

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

## 0.59.57

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

## 0.59.56

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

## 0.59.55

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

## 0.59.54

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

## 0.59.53

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

## 0.59.52

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

## 0.59.51

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

## 0.59.50

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

## 0.59.49

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

## 0.59.48

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

## 0.59.47

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

## 0.59.46

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

## 0.59.45

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

## 0.59.44

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

## 0.59.43

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

## 0.59.42

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

## 0.59.41

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

## 0.59.40

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

## 0.59.39

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

## 0.59.38

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

## 0.59.37

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

## 0.59.36

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

## 0.59.35

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

## 0.59.34

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

## 0.59.33

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

## 0.59.32
### Unreleased

- **The pinned read.** `AgentCatalog.ensureFavoriteRows()` loads ONLY the caller's starred agents:
  `ues_list('favorite')` through the favorites port, then `agx_get_list_full` filtered
  `id=in.(…)` — never a page of the whole catalogue, never a `ues_get_bulk` overlay. Deduped,
  answered at once by a fresh complete load; `AgentCatalogState.favoriteRowsStatus` reports it
  (a complete load sets it too). Ports: optional `AgentCatalogFavorites.list` and
  `AgentCatalogRpcCall.in` (supabase-js and the associations favorites service have both); a
  port without them falls back to the full load and reports `pinned_read_unsupported`.
  Consumer action: a surface that shows stars without being a picker calls
  `ensureFavoriteRows()` instead of `ensureLoaded()`.

## 0.59.31

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

## 0.59.30

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

## 0.59.29

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

## 0.59.28
### Unreleased

- `AgentCatalogClient.schema` is optional: an `{ rpc }`-only host bridge is a valid catalog
  client again (the default favorites port hands it to `@ai-matrx/associations`, which adapts it
  to the public schema since 0.14.5). No consumer action required.

## 0.59.27

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

## 0.59.26

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

## 0.59.25

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

## 0.59.24

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

## 0.59.23

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

## 0.59.22

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

## 0.59.21

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

## 0.59.20

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

## 0.59.19

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

## 0.59.18

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

## 0.59.17

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

## 0.59.16

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

## 0.59.15
### tarball diet (2026-10-08)

- The published tarball no longer carries source maps (`*.map`), the duplicate `generated/*.ts` source
  (the same code is already compiled into `dist/generated/*`), or `mandates/snapshots/` (read only from
  this repository by `scripts/mandates_generate.py`, never from a consumer's `node_modules`).
  Unpacked size 50.7 MB -> 20.6 MB. The export map and every `.d.ts` / `.d.cts` file are unchanged.

**Consumer action:** none for imports. Debuggers no longer step into original `@ai-matrx/agents`
source through source maps; nothing else changes.

## 0.59.14

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

## 0.59.13

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

## 0.59.12

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

## 0.59.11

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

## 0.59.10

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

## 0.59.9

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

## 0.59.8

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

## 0.59.7

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

## 0.59.6

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

## 0.59.5

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

## 0.59.4

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

## 0.59.3

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

## 0.59.2

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

## 0.59.1

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

## 0.59.0

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

## 0.58.13

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

## 0.58.12

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

## 0.58.11

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

## 0.58.10

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

## 0.58.9

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

## 0.58.7

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

## 0.58.6

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

## 0.58.5
### lane L4 rendered-output
### html artifact publish door in the API contract

`generated/api-types` gains `POST /cms/html-artifacts/{canvas_item_id}/publish` (`HtmlArtifactPublishResponse`):
the ONE writer that publishes a canvas_items version as its own html page. **Consumer action:** matrx-frontend
publishes chat pages through it instead of its `/api/html-pages` create route.

### html_pages CRUD in the API contract

`generated/api-types` gains `GET|POST /cms/html-pages` and `GET|PATCH|DELETE /cms/html-pages/{page_id}`
(`HtmlPageSummary`, `HtmlPageRead`, `HtmlPageCreateRequest`, `HtmlPageUpdateRequest`, `HtmlPageArchiveResponse`):
a person's quick-publish pages, owner-scoped, delete archives. **Consumer action:** matrx-frontend's
`HTMLPageService` calls these and its `/api/html-pages` Next.js proxy is deleted.

## 0.58.4
### the model picker can fill a panel

`./models/react` — `ModelListDropdown` takes `presentation="inline"`: no trigger and no popover/drawer;
the picker body fills its parent (a menu's side panel on desktop, a pushed page on a phone). The host
closes its own container from `onValueChange`. Consumer action: none.

## 0.58.3

**One by-link read per open.** `followServerJob` / `useServerJob` take `identifyLink`: the host answers
the first by-link identify from a read it already made (or shares), so a probe + follow no longer
issue two identical `GET /runtime/operations/by-link/...` calls. Refreshes still read fresh.
**Consumer action:** none (opt-in); matrx-frontend's PDF extractor passes it.

## 0.58.2

**followServerJob never swaps the followed execution on refresh.** The status read returns ROOT runs
only, so a linked child (e.g. a batch clean under a stream root) was never found after a rejoin and
the follow fell back to the root, which had already settled `completed` — consumers reported Done
while the child was still working. Refresh now re-reads by request id (sending `execution_id` for
servers that filter by it), and when the child is not among the roots re-reads by link and matches
`execution_id`; if it still cannot be found the last known view is kept. `getRuntimeOperationStatus`
takes an optional `executionId`. Chat's by-link (collapsed to root) is unchanged.
**Consumer action:** none.

## 0.58.1

**Endpoint map names only paths the server answers.** Removed `ENDPOINTS.ai.appExecute`
(`/ai/apps/{id}`), `ENDPOINTS.ai.appWarm` (`/ai/apps/{id}/warm`) and the whole
`ENDPOINTS.builtinAgents` group (`/ai/builtin-agents/categorize(/sync)`): no aidream source defines
them (prompt apps were replaced by Applets; categorize was retired) and no consumer called them.
matrx-frontend's `check-server-paths-live --strict` named all four as half-deployed.
**Consumer action:** none (no consumer referenced them).

## 0.58.0

**Warm-up fixes (independent review).** Warms requested before the person/org are ready are queued
and flushed on `notifyScopeChanged()`; `useWarmOnMount` re-issues on org change (`org_change`).
Dedupe is marked only on a 2xx; queued items go out only under their own scope, with
`X-Organization-Id` set from the new `organizationId` option. `keepalive` removed (also from
`MatrxTransportRequest`). `Warmup` gains `currentScope`, `notifyScopeChanged`, `subscribe`.
**Consumer action:** call `warmup.notifyScopeChanged()` when the person or org changes (matrx-frontend
`WarmupHost` does).

## 0.57.0

**Server-job follow: one dedupe, host-owned rejoin.** `createStreamReplayCursor` now keeps a
high-water mark PER `stream_id` (was: reset on every segment change, so a page that live-followed
segment A then B rendered A twice when a rejoin replayed A then B); gains `seed` (resume from
host-persisted marks), `marks`, and fires `onSegmentChange` only for ADMITTED frames.
`followServerJob` gains `rejoinConsumer` (the host renders the rejoin wire itself, e.g. chat's
Redux pipeline), `afterRejoin` ("follow" | "handoff"), and `retry` (wraps the identify read).
`pickServerJobOperation` / `followServerJob` accept both by-link shapes: new `serverJobRejoinHandle`
prefers `root_request_id` (optional on `MatrxRuntimeOperationView`) over `request_id`.

**Consumer action:** none.

## 0.56.0

**Warm-up primitive.** New in `./matrx`: `createWarmup({ transport, isSignedIn, scope })` →
`warm(items, reason)` (coalesces within ~50ms into one authenticated `POST /ai/warm`, dedupes per
scope per 60s, keepalive, never throws, no-op signed out), `preconnectServer(baseUrl)`,
`WarmItem` / `WarmReason`. New in `./react`: `WarmupProvider`, `useWarmup`, `useWarmOnMount`.
`MatrxTransportRequest` gains optional `keepalive` (forwarded by `createMatrxTransport`).
**Removed:** `warmAgent` (no legacy twin). **Consumer action:** replace `warmAgent(id, …)` with
`useWarmOnMount([{ key: "agent", id }], "route")` under a `WarmupProvider`.

## 0.55.0

**Follow or reconnect to any server job.** New in `./matrx`: `followServerJob` (identify by
`X-Request-ID` or feature link → rejoin with replay dedup → lifecycle fallback → settle on the
server's status → `reloadSavedResult`), `createStreamReplayCursor` / `readStreamCursor`
(`(stream_id, stream_seq)` dedup), `pickServerJobOperation`, `isServerJobSettled`, and the
`ServerJobStatus` / `ServerJobOutcome` types. New in `./react`: `useServerJob`.

**Consumer action:** none for existing callers. Surfaces that guessed whether a server run was
still going (recent-update windows, post-stream polls) adopt `useServerJob`.

## 0.54.5

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

## 0.54.4

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

## 0.54.3
### Unreleased

e-sign parity v2 (CONTRACT.md §6–§7), additive: `POST /esign/drafts/{envelope_id}/send` (`EsignDraftSendAnswer` with `warnings`), `POST /esign/envelopes/{id}/download` (`EsignDownloadAnswer`), `POST /esign/envelopes/{id}/finalize`, the phone page's `POST /esign/signing/handoff/open` + `/submit`, and `POST /esign/detect-fields` (`EsignDetectFieldsAnswer`). `SigningAction` gains `handoff_start`, `handoff_text`, `handoff_status`, `handoff_cancel`, `download`; `EsignActArgs` gains `handoff_id`, `saved_signature_id`, `save_to_profile`, `make_default`, `secret`, `phone`, `parts`, `combine`, `document_ids`. Outsider `open` answers `landing`; `verify` answers `reason: code_wrong | code_locked` with `attempts_left` / `locked_until`; `code` may answer `code_required: "access_code"`.

Also reflects main: `/auth/organizations/default` is gone (removed by the organizations change of 2026-10-07).

**Consumer action:** none for existing callers; the e-sign UI lanes call the new routes and actions.

## 0.54.2

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

## 0.54.1

`context` `formatChars` is `formatCount(n, { style: "compact", decimalsBelow: 100 })` from `@ai-matrx/kit/format` 0.34.0. Same text for every pinned case; at a million and above, a value of 100M+ reads whole (`185M`, was `184.5M`), and 999,950 reads `1M` (was `1000k`).

**Consumer action:** none.

## 0.54.0

Generated API types: the directive catalog is split. `NounDirectives.schemas` is gone from `GET /directives/catalog` (the summary, now ~32 KB gzip instead of 2.4 MB); new `DirectiveCatalog.catalog_version`, new `GET /directives/catalog/{noun}` → `DirectiveNounSchemas { noun, catalog_version, schemas }`.

Consumer action: read a noun's write schemas from `GET /directives/catalog/{noun}` (`DirectiveNounSchemas.schemas[class]`) when a form opens, never from the summary row.

## 0.53.0

Sources intake: while the organization picker is open for a landing (paste, web page, YouTube, recording), the card says it is waiting for the person instead of "Reading the page…". New optional `SourceIntakeDeps.hasOrganization()`, the `ASKING_FOR_ORGANIZATION` card note, and `sourceCardState` returns `waiting_for_organization` for a card carrying it (a reload drops the note).

Consumer action: pass `hasOrganization` to `createSourceIntake`; show the waiting words when a card's notes include `ASKING_FOR_ORGANIZATION`.

## 0.52.2

The run-tier timeout message formats its budget with kit `formatDurationMs` (compact: "15s", "1m 30s"). The model list's token counts and compact points go through kit `formatCount` (compact points now read "150k", kit's one compact voice, instead of Intl's "150K"). Package-twins collapse.

Consumer action: none.

## 0.52.1

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

## 0.52.0

Agent core B3 — the model catalog holds model RECORDS too (chat's `modelRegistry` slice retires onto it):

- `./models`: `createModelCatalog(...).records` (also `createModelRecords({ client })`) — the routable options
  list (`ai.model_offering` + `ai.model_public`), one model's full record with resolved controls
  (`ai.model_config`, or `ai.model_public` for a guest via the new optional `isSignedIn`), a pinned class's
  config (`ai.resolve_model_config`), the class index and durable identities. Same never-downgrade and
  failed-read rules the slice had; reads only; failures reach the `errorSink`.
- Pure selectors over `ModelRecordsState`: `selectModelById`, `selectModelLabelById`, `selectModelLabelWithClass`,
  `selectModelOptions`, `selectAllModelOptions`, `selectActiveModels`, `selectModelFullyLoaded`,
  `selectModelClassConfig`, … plus `classConfigKey` and the `ModelRecord` / `ModelJson` types.
- `./models/react`: `useModelRecordsSelector(records, select)`.
- **Consumer action:** none (additive).

## 0.51.3

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

## 0.51.2

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

## 0.51.1

- `./intelligence`: a `RunRef` minted by `run` / `continue` carries `organizationId` (the run's organization; `null` on
  the guest lane). `result`, `continue`, `answer` and `rejoin` ride it directly, so a page with no organization
  selected reads and continues its own run — they used to read the run's result first to learn its organization, and
  a host that refuses an org-less read answered "Select an organization before sending this request." on every
  follow-up. A ref without the field (rebuilt from a listing) still reads it from the durable result.
- **Consumer action:** none (additive optional field).

## 0.51.0

Agent core B2 — the run tier and agent identity are read from the core, not a host mirror:

- New `./runtime` + `./runtime/react`: `createRunTierStore({ client })` — the headless run tier store
  (`agx_get_run_tier`, `agx_get_run_controls`, `agx_get_access_level`, `agx_get_shared_with_me`,
  `agx_get_shared_for_chat`), cached per agent, deduped in flight, timeout + one retry on the run tier,
  an empty answer is `RunTierNotReadableError`; row types `AgentRunTierRow`, `AgentRunControlsRow`,
  `AgentAccessLevelRow`, `SharedAgentItem`, `SharedAgentForChat`, `AgentRunCounts`, `runCountsOf`;
  `useAgentRunTier` / `useRunTierSelector`.
- `./catalog/react`: `useAgentSummary(catalog, agentId)` — one agent's catalog row (name, description,
  star, access), loading the catalog (then a server search) when the row is missing.

Additive; no consumer action required.

## 0.50.2

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

## 0.50.0

`./matrx` — a call's own organization wins (Applet jobs, 2026-10-07):

- `createMatrxTransport({ resolveTarget })`: the resolver now receives the call's request and may return a
  Promise (hold the call, e.g. while the person picks an organization).
- A per-call `X-Organization-Id` (`withRunOrganization`) is never replaced by a policy header or the
  `organizationId` lane, and is never refused for want of a session org. Before, the lane threw
  `organization_context_required` with no session org, and `organization_context_mismatch` (or a silent
  policy-header swap) with a different one.

**Consumer action:** a host `resolveTarget` that binds the session org should read the call's own
`X-Organization-Id` from its `request` argument first; ai-matrx `lib/api/matrx-transport.ts` does.

## 0.49.0

`./catalog/react` — `AgentDetailCard` (the agent menu's hover peek) can describe the agent already chosen:

- `onSelect` is optional: absent, the card has no Select button.
- `actions` (ReactNode): the host's own buttons, first in the footer (the chat composer puts Duplicate there).

Consumer action: none.

## 0.48.1

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

## 0.48.0

`./intelligence` — the next turn of a run's conversation (Applets contracts amendment 2.6):

- `IntelligencePort.continue(ref, { userInput, context? })` → the new turn's `RunRef`, over the existing
  `continueAgentConversation` (`POST /ai/conversations/{id}`) in the run's own organization; its events stream on
  `run:<requestId>` like any run.
- `IntelligencePort.stop(ref)` → `cancelAgentRun` (`POST /ai/cancel/{requestId}`).

**Consumer action:** an object typed as `IntelligencePort` (a fake or a wrapper) adds `continue` and `stop`.

## 0.47.4

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

## 0.47.3

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

## 0.47.2

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

## 0.47.1 — 2026-10-06

- `content-transfer` / `content-transfer/react` import the menu from `@ai-matrx/alchemy/react/workspace`
  and transfer types from `@ai-matrx/alchemy/operate` (ALC-16); adds the `@ai-matrx/alchemy` dependency.
- Consumer action: none.
## 0.47.0

Agent core A2 — THE SKILL CATALOG moves in (from matrx-frontend `features/skills` + chat `ui/skills-types`). Guard G1 stays green: no Redux, no chat, no writes.

- `./skills` (pure): the skill types (`SkillRow`, `CategoryRow`, wire shapes, `AsyncStatus` ...), the inbound converters (`supabaseRowToSkillRow`, `platformCategoryToSklRow`, `supabaseRowToCategoryRow`, `wireTo*`), and `createSkillCatalog` — the headless store with ONLY `fetchSkills`, `fetchSkillById`, `fetchSkillCategories` and `applyStreamEvent` (`getState`/`subscribe`). Failures reject with `SkillCatalogReadError` and also land in `error` and the `errorSink`. The skill WRITES stay with the host's editors, which report what landed through the local-only `apply*` mirror methods.
- `./skills/react`: `useSkills(catalog, args)` and `useSkillCatalogSelector` (no Redux).
- Ports: `client` (a Supabase client) and `associations` (`skillIdsForProject`, `projectIdsBySkill`) are required; `errorSink` is optional (default: tagged `console.error`).

Consumer action: none for existing imports (additive). Chat's `ui/skills-types` is now a duplicate of `./skills` types and should become a re-export of them.

## 0.46.0

Agent core A1 — THE MODEL PICKER and its headless catalog move in (from matrx-frontend `features/ai-models`; guard G1 `check-agents-below-chat.mjs` now enforces: no chat, no Redux, writes only the favorite allowlist).

- `./models` (pure): `createModelCatalog` (headless store over `ai.model_public` + `ai.model_offering`, or the super-admin RPC pair; `getState`/`subscribe`/`load`/`reload`), `createModelFavorites` (canonical `ues_set`/`ues_list` ledger + an injectable presentation cache), the capability `parse` (`parseCapabilities`, `requireCanonicalCapabilities`, audit-record bridge) and `model-classes` (moved from chat's model registry), `feature-map`, rating `format`, `service-label`, `preferred-choice` (`resolvePreferredModelChoice(ports, knob, tag)`), and the new diagnostics port (`setModelDiagnosticsSink`).
- `./models/react`: `ModelCatalogProvider`, `ModelListDropdown`, `useModelCatalog`, `useModelFavorites`. Ports (all optional, each with a documented default): `isSuperAdmin`, `hiddenModelIds`, `LinkComponent`, `settingsHref`, `renderErrorAction`.
- New dependency: `@ai-matrx/icons` (brand glyphs, `./brand-glyphs` since icons 0.3.0).

Consumer action: none for existing imports (additive). To render the picker, mount `ModelCatalogProvider` with `createModelCatalog({ client })` and `createModelFavorites({ client })`; optionally bind `setModelDiagnosticsSink` to your error store.

## 0.45.18

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

## 0.45.17

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

## 0.45.16

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

## 0.45.15

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

## 0.45.14

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

## 0.45.13

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

## 0.45.12
### Unreleased

- **`envelope` / `generated/stream-events`**: directive receipts gain the `pending` status (`DirectiveApplyStatus`,
  `DirectiveReceiptRenderData.outcome`) — the directive started long work (e.g. an Agent Factory build) that has not
  finished. Consumer action: none; exhaustive switches over receipt status should add a `pending` case.

- **`generated/api-types`**: `POST /crm/pre-send-check` (`PreSendCheckDoorRequest` → `PreSendCheckReport`): the combined
  pre-send review (advisories, draft critique, fact check, per-recipient fit, outlet groups). Consumer action:
  matrx-frontend's `features/crm/pre-send-check/service.ts` drops its local stand-in types and calls `apiPost`.

- **`./intelligence`** (core) and **`./intelligence/react`**: the `IntelligencePort` (CONTRACTS section 3) —
  `createIntelligencePort({ transport })` with `describe`, `run`, `events.on("run:<requestId>")`, `result`,
  `answer`, `rejoin`, `listRuns`, `createSoft`, plus `useMandateRun(port, key)`. Extends the existing run
  client (`startMandateRun`, rejoin, `normalizeMatrxError`); needs the AP-1 server doors D1-D5.
  Consumer action: none until adopted.

## 0.45.11

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

## 0.45.10

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

## 0.45.9
### Unreleased

- **`ENDPOINTS.cms.publishCheck`** (`POST /cms/publish-check`): the publish writing check for one CMS
  page's final text. Consumer action: matrx-frontend's `app/api/cms/_lib/publishWritingCheck.ts`
  replaces its local `CMS_PUBLISH_CHECK_PATH` stand-in with this path when it adopts the release.

## 0.45.8

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

## 0.45.7

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

## 0.45.6

- **Regenerated `generated/api-types.ts` + `openapi.json` from the server source.** `RemarkItem` now carries
  `block_state_ref` (the block state a remark was made from), which the server declares and the chat package sends.
  Consumer action: none.

## 0.45.5

- **ContextRulesChip's face is the controls Button** (28px, `pressed` for the full view, `warning`
  tone and glyph for a mismatch). New `variant` prop: `outline` (default) or `quiet` for a composer
  row; `className` is placement only. Consumer action: drop any visual `className` on
  `ContextRulesChip`; pass `variant="quiet"` for the old borderless look. Needs
  `@ai-matrx/design-system` 0.68.9.

## 0.45.4

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

## 0.45.3

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

## 0.45.2

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

## 0.45.0

Every picker row now names its organization. Agents in different organizations
can share one name (three "My Company Strengths Analyst" copies), and the row
was the only place to tell them apart. `AgentSummary.organizationName` is read
from the new `organization_name` column on `agx_get_list_full` / `agx_get_list` /
`agx_search` (joined in the DB after the page cut, no extra client query) and
rendered as a small muted label after the name on the web and native rows.
Absent column (older database) or no organization renders nothing.

Consumer action: none required — additive. Hosts that construct `AgentSummary`
objects by hand may set `organizationName`; it is optional.

## 0.44.5

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

## 0.44.4

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

## 0.44.3

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

## 0.44.2

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

## 0.44.1

Mandate key `org_chart.seat_job_suggester` (`MANDATE_KEYS.org_chart__seat_job_suggester`)
and its provision offer `org_chart.seat_job_suggestion` (`OrgChartSeatJobSuggestionOffer`:
`seat_name`, optional `seat_description`, `reports_to`, `team`, `organization_context`).
Output kind `seat_job_suggestion` (`goal`, `inputs[{name, description, required}]`,
`output`, optional `questions[]`). Also carries 0.44.0, whose publish was refused
because its key module and snapshot were never regenerated for that version.

Consumer action: none required — additive. The org chart's "Define the job"
dialog can call the key through `useHeadlessAgentJson`.

## 0.44.0

The agent picker takes a host-supplied filter: `agentFilter?: { label; test;
onClear? }` on `AgentListDropdown`, `AgentListPanel`, `AgentListInlinePicker`
and `useAgentListCore` (new exported type `AgentListFilter`). Only agents
passing `test` are listed; a chip at the top of the list shows `label` with a
"Show all" control (calls `onClear` when given, otherwise sets the filter
aside until the dropdown next opens). The pinned current agent stays visible
even when it does not match. `AgentListContent` gains `agentFilterLabel` /
`onClearAgentFilter` for hosts that render it directly.

Consumer action: none required — additive. Pass `agentFilter` where a host
knows what the person wants (e.g. the chat composer's Output types).

## 0.43.35

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

## 0.43.34

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

## 0.43.33

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

## 0.43.32

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

## 0.43.31

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

## 0.43.30

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

## 0.43.29

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

## 0.43.28

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

## 0.43.27

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

## 0.43.26

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

## 0.43.25

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

## 0.43.24

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

## 0.43.23

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

## 0.43.22
### Unreleased

- E-signature: the signing act's args take `time_zone` (the browser's IANA zone, sent with
  `sign`) so the signed copy's "Date signed" is the signer's own day. Consumer action: send it.

- E-signature: the signing act's answer carries `signup_hint` for an outside signer who has
  signed (on `sign`, and on `load` once signed) — a one-time hint the sign-up page resolves to
  their address through `public.esign_peek_signer_email`. Consumer action: none required.

- E-signature: `POST /esign/envelopes` takes `fields[]` (document_index, signer_index, kind
  `signature|initials|date_signed|full_name`, page, x/y/w/h as page fractions) and
  `signers[].user_id` for a picked organization member. New `POST /esign/envelopes/{id}/signed-copy`
  returns `signed_copies[]` (document_id, name, file_id). The signing act gains `signed_copy`, whose
  answer carries `signed_copies[]` (document_id, name, content_base64). Consumer action: none
  required; adopt to place fields and offer the signed copy.
### E-signature: verify an envelope (`/esign/envelopes/{envelope_id}/verify`)

- `generated/api-types`: `POST /esign/envelopes/{envelope_id}/verify` → `EsignEnvelopeActAnswer` (per-document `match`, certificate verification). The server re-hashes the stored documents.
- Consumer action: the envelope page shows verification from this route, not from `esign_verify_envelope` with no observed hashes.

## 0.43.21

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

## 0.43.20
### Unreleased
### E-signature: send for signature (`/esign/envelopes`)

- `generated/api-types`: `POST /esign/envelopes` (`EsignSendBody` → `EsignSendAnswer`), `/esign/envelopes/{envelope_id}/remind`, `/esign/envelopes/{envelope_id}/signers/{signer_id}/resend` (`EsignResendBody`), `/esign/envelopes/{envelope_id}/void` (`EsignVoidBody`) → `EsignEnvelopeActAnswer`.
- Consumer action: the `/esign` pages send, remind, resend and void through these; the list and one envelope are read from the database (`esign_envelope_list`, `esign_envelope_state`).

## 0.43.19

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

## 0.43.18
### Unreleased
### E-signature: a drawn signature (`EsignActArgs.image_data_url`)

- `generated/api-types`: `EsignActArgs` gains `image_data_url` — the signature pad's `data:image/png;base64` value for `adopt` with `kind: "drawn"`; the server files it on the envelope.
- Consumer action: send the pad's value on a drawn adopt (matrx-frontend `features/esign/signing`).

## 0.43.17

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

## 0.43.16

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

## 0.43.15
### Unreleased
### The e-signature signing surface (`/esign/signing/*`)

- `generated/api-types`: five routes — `/esign/signing/outsider/{open,code,verify,act}` (no sign-in; the link secret, the emailed code and the session they buy are the credential) and `/esign/signing/envelope/{envelope_id}/act` (the signed-in signer). Answers `EsignOutsiderOpenAnswer`, `EsignOutsiderCodeAnswer`, `EsignOutsiderVerifyAnswer`, `EsignSigningAnswer`; act bodies `EsignOutsiderActBody` / `EsignInternalActBody` with `EsignActArgs`.
- Consumer action: the signing pages (`/x/sign`, `/sign/e/[envelopeId]`) call these through `callApi` with `organizationFreeRead: true`; the `document` act returns the frozen bytes (`content_base64`), never a URL.
### The person's per-chat auto-tools switch (`UserOverrides.auto_tools`)

- `generated/api-types`: `UserOverrides` gains `auto_tools?: boolean | null` — the person's per-chat switch; `true`/`false` overrides the agent's `auto_tools_disabled` both ways, omitted defers to the agent (common-docs agent-tools/TOOL-SOURCES.md rule A).
- Consumer action: send the per-chat switch as `user.auto_tools`, picks as `user.add`, removals as `user.remove` (matrx-frontend `buildRequestUserOverrides`).
- `generated/api-types`: `RealtimeToolsRequest` and `ToolExecuteRequest` gain `user?: UserOverrides | null` — a voice session's removals and auto-tools switch, sent identically on resolve and execute.

## 0.43.14

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

## 0.43.13

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

## 0.43.12
### A value sits under the page that produced it (`context_surfaces`)

- `generated/api-types`: `AgentStartRequest`, `ChatRequest`, `ConversationContinueRequest` (both continue bodies) and `ContextPreviewRequest` carry `context_surfaces: {key: surface} | null` — the surface whose runtime published each value the primary surface does not own (a transcript open on the Knowledge page). The server files each named value, sent or withheld, under that surface: its page layer, the person's rule saved under it, and its receipt row's `surface_key`.
- `rules-corpus.json`: `effective_lookup_cases` gains the mounted-screen cases (`origin: "client"`, a non-primary `surface_key` reads that surface's row, never the primary's) and `page_context_cases` gains "a switched-off page withholds what a screen mounted inside it published". `lookupSavedRuleFor` already answers them.
- Consumer action: send the door's `context_surfaces` on every agent request, continuation and preview (matrx-frontend `buildRequestContext` → `contextSurfacesFor`), and classify `context_surfaces` in any `ConversationContinueRequest` field routing.

## 0.43.11
### The context panel's list takes the whole width until something is open

- `ContextRulesPanelBody` no longer pins a fixed 22rem list beside an empty "Select an item" half. Nothing open: the list fills the panel. Something open: list and detail sit side by side only when the panel itself is at least 40rem wide (a CSS container query, so it is right on the first paint and on the server); narrower, the detail shows alone with Back to the list. The list's side-by-side width is `clamp(18rem, 38%, 28rem)`.
- `isMobile` keeps stacking with comfortable touch sizes, as before.
- Consumer action: the host's Tailwind must scan this package's `dist` (it already does in matrx-frontend) so the `@container` / `@min-[40rem]:` classes are generated.

## 0.43.10

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

## 0.43.9
### A sent message's context receipt is frozen, not a row of dead switches

- `ContextRulesTable` (and the detail panel's Include row) in `readOnly` mode no longer renders a disabled `Switch`; it renders a static on/off mark with a lock (`FrozenInclude`, `role="img"`, tooltip "Sent as shown"). Nothing on a receipt looks clickable.
- Consumer action: none. A host or test that looked for a disabled `role="switch"` on a read-only table should look for `data-frozen-include` / the `img` role instead.

## 0.43.8

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

## 0.43.6

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

## 0.43.5

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

## 0.43.4
### The context chip has a real pressed state

- `ContextRulesChip` takes `pressed?: boolean`: when set, the face is a toggle button (`aria-pressed`) and wears the pressed face (primary border, tint, inset ring) — the state is no longer color passed in through `className` alone. Omitted: a plain popover trigger, no `aria-pressed`.
- Consumer action: a host that toggles a view from the chip (matrx-frontend's canvas tab) passes `pressed={isVisible}` instead of a pressed `className`.

## 0.43.3
### The agent detail card shows the whole name; no empty icon box

- `AgentDetailCard` (web + native) no longer truncates or clamps the agent's name — the list row truncates, so the card is where the full name is read; it wraps instead.
- `AgentDetailCard` drops the empty placeholder icon box beside the name (agents have no icon).
- `AgentRow`'s truncated name carries the full name in its `title`.
- Consumer action: none.

## 0.43.2

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

## 0.43.1

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

## 0.43.0
### Every switch lines up; the chip shows its whole name

- `ContextRulesTable` wide layout keeps Item | Include | Chars | Inline max for heading rows too: a heading's switch sits in the Include column and its size in Chars, so every switch lines up; its name (with its count) wraps to a second line rather than truncating. Narrow layout: every switch — heading and value — is its row's last cell, at the far right.
- `ContextRulesChip` face has no width cap: it shows the group's whole name and shrinks (truncating, whole name in its title) only when the composer row needs the room.
- Consumer action: none.

## 0.42.1
### A heading's name owns its row

- Heading rows (section, page, group) leave the value columns: the name fills the row and the count, size and switch sit in one compact cluster on the right, so "Marketing Brand Cockpit" is never cut to make room for Include/Chars.
- `ContextRulesChip`'s desktop popover is 30rem wide (still capped at the viewport).
- Consumer action: none.

## 0.42.0
### Nested headings; narrow widths keep names readable

- `ContextRulesTable` renders the hierarchy as nested heading rows: a section row ("Marketing"), the page row under it ("Marketing Brand Cockpit", with the page switch), the page's groups, then values — never one "A › B" string. A section row has a switch only when it groups more than one page (it then turns each page's master or values). Small indents (8px a level).
- Narrow (the table under 400px wide — a window sidebar, a phone): no fixed columns and no header row; the name takes the row, Chars and Include size to content, and Inline max becomes a compact button that opens the same field. Measured on every resize.
- Exports `CONTEXT_RULES_NARROW_BELOW`. Consumer action: none.

## 0.41.1
### A heading never truncates twice

- `ContextRulesTable` level headings measure their cell: when "Marketing › Marketing Brand Cockpit" does not fit, the section drops and the page's own name shows alone (truncating only if it alone does not fit) — never "Mark… › Mar…". The full path stays the title and the switch's name.
- Consumer action: none.

## 0.41.0
### The transitional humanizer names are gone

- `./context` no longer exports `humanizeContextKey` or `CONTEXT_KEY_ACRONYMS`; THE humanizer is `@ai-matrx/kit/text-case` `humanizeIdentifier` / `IDENTIFIER_ACRONYMS` (the corpus `humanize_cases` still runs against it here).
- Consumer action: import `humanizeIdentifier` from `@ai-matrx/kit/text-case` (matrx-frontend already does).
- `ContextRulesTable`: a level heading's section yields width first, so a narrow popover keeps the page's own name readable ("Marketing › Marketing Brand Co…", never "Ma… › Marketing…").
- `ContextRulesTable` gains `renderRowLead` / `renderRowTrail`: host slots inside a row's Item cell (a status mark, an admin's machine name), so an inspector renders through the same table instead of its own list.

## 0.40.0
### Catalog rows carry the agent's class pin

- `AgentSummary.offeringId` — the agent's class pin (`settings.offering_id`) when the list/search read carries an `offering_id` column: a uuid, or `null` for no pin. ABSENT when the read does not carry the column (class unknown — never guessed).
- `renderModelRef` receives `offeringId` (same three states) so a host can name the class beside the model ("Qwen3.8 27B · Matrx Lightning"). Web and native detail cards pass it.
- Consumer action: optional — read `offeringId` in your `renderModelRef` and name the class when it is not `undefined`. Nothing changes until `agx_get_list_full` / `agx_search` return `offering_id`.

### Variables carry the person's label; one humanizer

- `RunInputVariable.label` — what the person called the variable ("Normal Text"); `name` stays the `{{normal_text}}` key. `variableRunLabel` returns the label first, then a reference role's ask, then the key through THE humanizer; its `formatName` argument (and `deriveRunInputs`'s) is now optional and defaults to `@ai-matrx/kit/text-case` `humanizeIdentifier`.
- `./context` `humanizeContextKey` / `CONTEXT_KEY_ACRONYMS` are now kit's `humanizeIdentifier` / `IDENTIFIER_ACRONYMS` (transitional names, deleted once matrx-frontend imports kit). The corpus case `myValue_ID` now reads "My Value ID" (camelCase splits — the Python twin changed with it).
- Consumer action: pass `label` through every variable definition you build; drop the `formatText` argument to `variableRunLabel`.

## 0.39.0
### Context rules: one hierarchy, a switch per level

- `./context/react` adds the hierarchy (`buildContextLevels`, `placeByOrigin`, `includeChanges`, `ContextHierarchy`): rows sit under levels (a page by its section and name, "Attached", "AI Matrx") and the host's declared groups, each heading with an Include switch, its included count and chars.
- `ContextRulesTable`, `ContextRulesChip` and `ContextRulesPanelBody` take `hierarchy` and `onSetInclude`. A level or group switch is the person's per-value include rules for every value in it, in one call (no new rule kind — the server gate and receipt are unchanged). A host master switch (`hierarchy.masters`, the page on/off) sits on its level and replaces the chip header's page switch.
- The platform's own values read "AI Matrx", never "System".
- Consumer action: none required; pass `hierarchy` + `onSetInclude` to get the levels and their switches.

## 0.38.4

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

## 0.38.3
### HTTP error body read

- `parseHttpError` reads each failed response body once, so a non-JSON plain-text refusal retains its text and HTTP status; structured JSON errors keep their existing classification.
- Consumer action: no call-site change. Refresh `@ai-matrx/agents` to latest to receive the corrected plain-text fallback. Hosts that handle sensitive file transfers must still avoid reflecting arbitrary server bodies in logs or user-visible errors.

## 0.38.2

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

## 0.38.1

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

## 0.38.0

- **The raw-`Response` lane joins the one request pipeline** (P9c). `./matrx` `call` gains `sendMatrxRequest(url, init, { signal, timeoutMs })` — any method, any body (a `FormData` upload, bytes), resolves with the raw `Response` whatever its status; its own deadline rejects as `BackendApiError` `request_timeout` (504), a caller abort stays the caller's `AbortError` — and `readMatrxJsonResponse(response)` (JSON, `null` on 204, or the ONE `parseHttpError` classification). An imperative host client (matrx-frontend `lib/python-client`, the chat package's bare-host `apiGet`) now rides these instead of its own `fetch` + deadline + error read.
- `buildMatrxRequestUrl` query values: an array repeats the key, `null` / `undefined` are omitted, and a path that already carries `?` is appended with `&`. Scalar behaviour is unchanged.
- Consumer action: route imperative server calls through `sendMatrxRequest` + `readMatrxJsonResponse` / `parseMatrxNdjsonResponse`; delete host copies of the fetch, deadline, query builder and NDJSON line parser.

## 0.37.2

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

## 0.37.1

- `./generated/api-types` regenerated from the aidream checkout through the guarded pipeline (5 additive lines). New `scripts/typegen/check-api-types-fresh.mjs` — the hand-edit guard for the generated API pair (DD-128), run by `scripts/generate_types.py --check`.
- (Shipped in 0.37.0, recorded here: `./message-parts` is built in the generated DTS group — 0.36.0's first publish runs ran out of heap; the 0.36.1 that carried the fix was superseded by 0.37.0 before it published.)

## 0.37.0

- **The request pipeline moves in** (chat package independence P9b — one `callApi`, not two). New `./matrx` module `call`: `buildMatrxRequestUrl`, `buildMatrxRequestBody` (scope injection, UI-only strip, fail-closed body-vs-context organization check), `executeMatrxCall` (JSON or NDJSON over the v2 → v1 fallback; stream callbacks, `consumeStream`, 204 = no data), `parseMatrxNdjsonResponse` (broken body → resumable `StreamTransportError`, with `onEvent` / `onTransportError` hooks), `bareStatusSentence`, `isBareTransportCode`, `honestTransportMessage`, `buildSafeRequestLog`, `redactUrlForRequestLog`, `shouldReportMatrxCallError`, and the types `MatrxCallScope`, `MatrxCallResult`, `MatrxHttpMethod`, `MatrxStreamParse`, `ExecuteMatrxCallRequest`, `ExecuteMatrxCallHooks`.
- `normalizeMatrxError` is now THE classifier matrx-frontend's `callApi` used: typed `BackendApiError` / `StreamTransportError` keep their `code` and `details` (as `serverDetail`), and no message is ever a bare status line ("HTTP 503" becomes the status sentence; the status rides `status`). `MatrxCallError` gains `raw?`.
- Consumer action: build host request clients on `executeMatrxCall` + `normalizeMatrxError`; supply only base URL, credential/org headers, and diagnostics hooks.

## 0.36.0

- **`./message-parts`** (chat package independence P15 batch 2): `UserInputPart` — the exact generated user-input union every agent route accepts — and its derived part types (`TextBlock`, `ImageBlock`, `AudioBlock`, `VideoBlock`, `DocumentBlock`, `YouTubeVideoBlock`, the structured input blocks, table/list bookmarks, data refs, `ContentBlock`, `UserInput`). Moved from matrx-frontend chat `agents/types/message-types.ts` + `request.types.ts` so chat and the files feature depend on agents, not on each other. Pure; derived from `./generated/api-types` only.
- Consumer action: import these from `@ai-matrx/agents/message-parts`; delete host copies.

## 0.35.0

- **The server's client contract lives here** (chat package independence P15, chair ruling 2026-10-02). New pure subpaths `./generated/{api-types,stream-events,llm-enums,llm-params-enums,source-attribution,workflow-events,canvas-chat,provision-offers,hr-contracts}` — emitted by aidream `scripts/generate_types.py` / `scripts/mandates_generate.py` straight into `generated/`, so a server change and its types land in one commit and ship on the publish train. `api-types` and `hr-contracts` are type-only (empty runtime modules).
- The DD-128 guards moved in from matrx-frontend: `scripts/typegen/write-api-types.mjs` is the one write path for `openapi.json` + `api-types.ts` — contract pin, then the drop guard over every client checkout beside aidream, then operation-id normalization and openapi-typescript; a refusal writes nothing. `pnpm typegen:self-test` replays the real 2026-09-12 drop.
- Consumer action: import generated types from `@ai-matrx/agents/generated/<name>` and delete any local copy (matrx-frontend's `types/python-generated/` and `pnpm sync-types` are retired).

## 0.34.0

- **Chat package independence P9 — the server keepers move in** so the chat package (and every client) reaches the AI Matrx server through `@ai-matrx/agents/matrx`, not matrx-frontend `lib/api`. All pure (no host, window or env read), all on `./matrx`:
  - `backend-errors` — `BackendApiError`, `StreamTransportError`, `isStreamTransportLost`, the HTTP/stream/persisted error parsers, `describeBackendFailure`, `getUserMessage` (+ `BackendApiErrorData`, `BackendErrorCode`), from `lib/api/errors.ts`.
  - `endpoints` — `ENDPOINTS` (every server path), from `lib/api/endpoints.ts`. The production origin and per-environment base URLs stay with the host.
  - `endpoint-path` — `resolveEndpointPath` + `EndpointOverrideConfig`; `api-target-log` — `logApiTarget`; `desktop-target` — `applyDesktopTargetToRequestBody`; `warm` — `warmAgent`.
  - `run-wait` — output kinds, `runJobLabel`, `runWaitTimeoutMessage`, and `resolveRunWaitWith(readKnob, org, user, kind)`: the knob read is injected (matrx-frontend passes `ensureEffectiveKnob`).
  - `protocol` gains `aiVersionPathOverrides` (from `lib/api/ai-api-version.ts`).
- Behaviour ports verbatim; strict-mode fixes only (`BackendApiError` options accept an explicit `undefined`; `warmAgent` omits `headers`/`body` instead of passing `undefined`).
- Consumer action: import these from `@ai-matrx/agents/matrx` and make the host copies re-export them (matrx-frontend does).

## 0.33.0

- **Chat package independence P15, batch 1 — pure leaves move in** so chat and the files feature depend on agents, not on matrx-frontend. New subpaths (all pure, no `"use client"`):
  - `./field-flags` — `FieldFlags<K>` + helpers (serializable `Set<keyof T>` replacement), from matrx-frontend `packages/chat/src/agents/redux/shared/field-flags.ts`.
  - `./envelope` — the matrx reference envelope (`ReferenceItem`, `REFERENCE_TYPES`, directive receipt shapes) and the ```matrx reference fence (`buildReferenceFence`, `buildPicklistItemFence`, `parseReferenceFence`, `readPicklistSelection`), from `features/matrx-envelope/envelope.ts` + `referenceFence.ts`. New dependency `@ai-matrx/content-ir`.
  - `./models` — model capability types and the model-row normalizer, from `features/ai-models/capabilities/types.ts` + `utils/model-normalizer.ts`.
- `./mandates` gains `dbAuthoredMandateKey`, `splitMandateKey`/`MandateKeyParts` (from matrx-frontend `features/mandates/mandate-key.ts`) and the mandate contract reader (`parseMandateContract`, `missingRequiredVariables`, `missingVariablesMessage`, `EMPTY_MANDATE_CONTRACT`, `MandateContract`; from `features/mandates/contract.ts`). `parseMandateContract` takes `unknown` (was the host's `Json`).
- Behaviour ports verbatim; two strict-mode type fixes only (`PicklistRefRead.list_id` is `string | undefined`; a fence capture group defaults to `""`, which parses to `null` exactly as `undefined` did).
- Consumer action: import these from `@ai-matrx/agents/{field-flags,envelope,models,mandates}` and delete the host copies.

## 0.32.0

- **A lazy on-request value is read when opened, never by the turn** (verifier 2026-10-02; RULES.md §5b). A document, file family or scope delivered on request now has no `on_request` ref on the receipt. `ContextDeliveredValue` still shows **Returned on request** for it (`delivery: "on_request"` with a `delivered` ref), fetched and sized when opened.
- `ContextViewedText.fetched` (a sent turn's lazy value only): `true` — the agent called `context` for it and the text is exactly what the tool returned (`source: "tool_result"`, new); `false` — it never read it and the text is what the tool returns now (`source: "fetched_now"`); `DeliveredSection` then shows a muted **Not read by the agent** badge.
- Consumer action: pass the server's `fetched` through your `ContextViewLoader` (aidream serves it on `GET /ai/context/delivered`). Pass the row's `delivery` to `ContextDeliveredValue` (a full `ResolvedContextRow` already carries it).

## 0.31.0

- **"Agent can fetch" is honest** (Arman, 2026-10-02). `ContextViewedText.available` (fetchable only): `false` when the turn's agent cannot call the tool (tools off, excluded, no function calling, a structured-output turn). `DeliveredSection` then shows a muted **Not available to this agent** badge in place of the size and renders no content.
- In-app text never calls what is inside "context": the empty table reads **None**; the search box and table are labelled **Search values** / **Values**.
- Consumer action: pass the server's `available` through your `ContextViewLoader` (aidream serves it on `GET /ai/context/delivered` and `POST /ai/context/preview` `viewed`).

## 0.30.0

- **The Organization shows what the agent can fetch** (owner law 2026-10-01, RULES.md §5b). With an organization the selected scopes' VALUES are tool-returnable by design (`scope_system`, never inline). New view kind `fetchable` (`ContextViewKind`) and source `fetched_now` (`ContextViewedText.source`); `CONTEXT_FETCHABLE_ROWS` (`organization` → `scope_system`). `ContextDeliveredValue` shows **Agent can fetch** under a delivered Organization — loaded when opened, sized once loaded, **None** when nothing is selected. `DeliveredSection`'s `ref_` is optional (a `fetchable` text has no receipt ref).
- Consumer action: the host's `ContextViewLoader` must pass `kind: "fetchable"` through (sent turn: `GET /ai/context/delivered?kind=fetchable`; next turn: `POST /ai/context/preview` with `view`) — aidream serves both. Retire any host copy of the delivered-value detail.

## 0.29.1

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

## 0.29.0

- **Context is fetched on demand — the receipt carries size and hash only** (owner law 2026-10-01, RULES.md §5b: *"99 out of 100 times the user will never want to see the value"*). `ContextReceiptRow.delivered` / `on_request` and the new `ContextReceiptBlock.delivered` are `ContextDeliveredRef {chars, sha256}` — `ContextDeliveredText` is gone. New viewer types `ContextViewTarget`, `ContextViewedText`, `ContextViewLoader`; `ContextDeliveredValue` / `DeliveredSection` fetch the exact text through the host's `load` when the detail opens (Skeleton while loading, an honest one-line error with Retry), and never before.
- **Every block of server text the model read is on the receipt** (`ContextReceipt.blocks`): `ContextRulesPanelBody` takes `blocks` and lists them read-only under **Also sent** (label + chars, aligned to Chars), each opening to its text; `ContextReceiptBlocks` / `ContextReceiptBlockDetail` are exported for other views.
- **The Organization is everything the model read for it**: `CONTEXT_ROW_BLOCKS` attaches the `organization_catalog` block to the `organization` row (`deliveredBlocks`, `blocksForRow`, `unclaimedBlocks`) — shown in its detail, counted in its chars, not listed again under Also sent. A server-authoritative row's chars are the server's (its statement + attached blocks), never the page's copy.
- Consumer action: pass `loadView` (sent turn: `GET /ai/context/delivered`; next turn: `POST /ai/context/preview` with `view`) and `blocks` to `ContextRulesPanelBody`; `receiptRowToResolved(row, receipt.blocks)`; drop every read of `delivered.text` / `truncated`.

- **The composer's value-group chip is compact and never says "Context"** (Arman, 2026-10-01: *"never use the word context to describe what's inside"*). `ContextRulesChipProps.label` is optional: empty or omitted renders NO text — the face is icon + count, its accessible name and tooltip are "N included", and the popover header shows the count only. The face is `h-6`, `rounded-md`, the height of the composer's other row pills (was a `h-7` full pill); on mobile an invisible ring keeps a 44px hit area. The popover aligns `end` (the chip sits at the far right of the composer row). The master switch's accessible name is "Include this page"; the blind tooltip is "This model can't read these values".
- Consumer action: pass the group's real name (a page or surface display name) or nothing — never a generic "Context" fallback; re-anchor tests on `"<name> · N included"` / `"N included"` and the switch `"Include this page"`.

## 0.28.1

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

## 0.28.0

- **Identity is the server's truth, never the page's claim** (RULES.md §5a, owner ruling 2026-10-01). New `SERVER_AUTHORITATIVE_KEYS` (`user`, `client` → a server-built value; `organization`, `active_scopes` → the server's `<active_context>`) and `isServerAuthoritativeKey`, equal to the parity corpus's `server_authoritative_keys`. The server drops the client's copy of these keys and states its own every turn; the receipt row is `origin: "server"` and its `delivered` IS the server's text. `ContextDeliveredValue` says "Filled in by the server" for one with no receipt yet — never the page's guess.
- **Identity is never ambient context** (ruling 2026-10-01): `ContextRuleInput.identity` — a server-authoritative value is closed only by the person's own rule, never by the page's `auto_context` off or the agent's / mandate's `kill_switch` (`decided_by.include` stays `"default"`). `resolveContextRow` sets it for every `SERVER_AUTHORITATIVE_KEYS` key; corpus `rules_cases` carry it.
- **Removed `server_rendered` / `serverRendered`** (added in unpublished 0.27.0): the server's statement is now the row's `delivered` — one place, not a second copy.
- Consumer action: in a host `renderDetail`, do not show the page's value as "will send" for a server-authoritative key; drop any `serverRendered` reads.

## 0.27.0

- **The screen shows what the model READ, never the page's copy** (RULES.md §5, Arman 2026-10-01: the context full view showed the page's Organization while the model was told another). Receipt rows carry `delivered` (the value's own element, verbatim from the rendered context block), `on_request` (what the `context` tool returns for an on-request value) and `server_rendered` (the server's own statement of the value outside the manifest — `organization`'s `<organization>` element), each `{ text, chars, truncated, sha256 }` (`ContextDeliveredText`). `applyReceiptToRows` and `receiptRowToResolved` carry them as `delivered` / `onRequest` / `serverRendered` (new `deliveredFields`). `ContextRulesPanelBody`'s detail renders them (new `ContextDeliveredValue`) above the host's `renderDetail`.
- Consumer action: in `renderDetail`, do not render the client's value when the row carries `delivered`, `onRequest` or `serverRendered`; label a value shown before any receipt as the one the page will send. Includes 0.26.0 (its version bump was lost to a merge).

## 0.26.0

- **One conversation-organization reader and one prefix-code reader for every client** (`./matrx`). New `readConversationOrganizationId(conversationId, read, onUnreadable?)` — the run's own organization for a resume/rejoin; the host injects `read` (supabase select, REST call) so the package stays transport-agnostic; null + `onUnreadable(reason)` when unreadable. New `readMatrxErrorCodeFromMessage(message)` — the `"resume_conflict: …"` message-prefix form (resume_conflict, not_resumable, outstanding_delegated_calls, user_request_not_found, run_in_flight). Replaces the copies in matrx-extend, matrx-local and matrx-frontend.
- Consumer action: delete local copies; call the package functions.

## 0.25.4

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

## 0.25.3

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

## 0.25.2

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

## 0.25.1

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

## 0.25.0

- **Chat's `resume_conflict` is retried, never rejoined** — even when its body names `live_request_id` + `rejoin_path`. The claim holder is usually the turn still SUSPENDING; rejoining it replayed that turn from frame one (duplicate text) and the person's continuation never ran, on all three clients. `readLiveRunRejoin` now answers only `code: run_in_progress`; `isResumeConflict` is every `409 resume_conflict`; `resumeOrRejoin` returns `{ kind: "resume_conflict" }` for it. Guard: `matrx/rejoin.test.ts` › "chat's resume_conflict is retried, never rejoined" (red on 0.24.x).
- **A rejoin with no journal ends the same way in every client** (`./matrx`). New `settleRunPickup(pickup, { reloadSavedTurn, onStillRunning? })` — THE mapping from a pick-up result to what the screen does: `resumed`/`rejoined` → `streamed`; bare `resume_conflict` → `retry`; `followed`/`followed_workflow` that ended (or found no live operation left) → reload the saved turn, `{state: "settled", status, reloaded}` (the run's REAL status — a reload that throws is reported as `reloaded: false` + `error`); a follow that gave up → `still_running` (host recovery, default reload what is saved) — never a failure. Live 2026-10-01: the extension ended such a turn with an EMPTY bubble and the desktop called it a failed request.
- New for hosts whose rejoin stream rides their own wire (extension offscreen fetch, desktop request loop): `readLiveStreamUnavailable(error)` → `{ runId }` | null, and `followUnavailableRejoin(transport, rejoin, unavailable, { organizationId, … })` — the exact no-journal branch `resumeOrRejoin` takes (now its implementation). Types `MatrxRunPickup`, `MatrxRunPickupSettlement`, `MatrxFollowedOutcome`, `MatrxLiveStreamUnavailable`.
- Guard: `matrx/rejoin.test.ts` › "followUnavailableRejoin + settleRunPickup" — 11 scratch-copy mutants (status dropped, no reload, streamed reloads, conflict as streamed, onStillRunning ignored, reload error swallowed, run_id dropped, org unbound, cursor reset, terminal op followed, nothing-live not reloaded) each red.
- Consumer action: keep (or restore) your bounded retry for `resume_conflict`; on a rejoin's `409 live_stream_unavailable`, call `followUnavailableRejoin` then `settleRunPickup` with your saved-turn reload; settle every `resumeOrRejoin` outcome through `settleRunPickup`.

## 0.24.2

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

## 0.24.1

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

## 0.24.0

- **`resumeOrRejoin` follows the FINAL live-run contract** (aidream 0bd8c5cdc0, `services/runtime/FEATURE.md`): the 409 body's `rejoin_path` is followed verbatim (SEO collections answer `live_request_id: null` with `/seo/collections/{run_id}/rejoin`); chat's `resume_conflict` that names a live run (`live_request_id` / `rejoin_path`) REJOINS instead of retrying — only a bare `resume_conflict` is the `resume_conflict` outcome; a rejoin answering `409 live_stream_unavailable` follows `GET /runs/{run_id}/events/stream` when the body names a workflow `run_id` (new outcome `followed_workflow`, events to `onWorkflowEvent`, node_stream media frames included), else the durable lifecycle. New: `readLiveRunRejoin(error)` → `{ liveRequestId, rejoinPath, runId, code, body }`, `followWorkflowRunEvents`. Changed: outcomes carry `rejoin` (was `liveRequestId`); `onRejoin(rejoin)` receives the target. Guards: `matrx/rejoin.test.ts` (SEO path, chat live conflict, workflow SSE fallback — each proven red on a scratch mutant).
- Consumer action: read `outcome.rejoin.liveRequestId` instead of `outcome.liveRequestId`; `onRejoin` now receives the target object.

## 0.23.0

- **Resume never runs a live run twice — every client rejoins it** (`./matrx`). New `resumeOrRejoin(transport, resumeCall, { organizationId, onEnvelope, … })`: runs the feature's resume door and pipes its NDJSON into `onEnvelope`; on `409 run_in_progress` it follows `POST /runtime/operations/{live_request_id}/rejoin` into the SAME handler under the run's own organization; on `409 live_stream_unavailable` it follows the durable lifecycle (`followRuntimeOperationToEnd`) and says so (`kind: "followed"`); `409 resume_conflict` comes back as `kind: "resume_conflict"` (retry is host policy). Building blocks exported: `readLiveRunRequestId` (reads `live_request_id`, NEVER the envelope's own `request_id`), `readMatrxErrorCode`, `isResumeConflict`, `isLiveStreamUnavailable`, `runtimeOperationRejoinPath`, `openMatrxStream` (any NDJSON door by path), `withRunOrganization`. Guard: `matrx/rejoin.test.ts` (real envelopes with the `request_id` decoy; proven red on a mutant reading `request_id` and on one dropping the run org).
- **`streamErrorText(event)`** — the text for a stream `error` event: `user_message` first (e.g. "OpenAI refused this request: the platform's OpenAI account is out of credit."), then `message`, else null. A host fallback must never replace a server message. `runAgentToCompletion` now uses it.
- **`reportProviderSessionFailure(transport, failure)`** — browser-held provider sessions (OpenAI/xAI realtime voice, Cartesia TTS) report their failures to `POST /broker/provider-failures` and get `{ error_type, retryable, user_message }` back; the body is bounded exactly as the server model bounds it; never throws (null + warn when the report itself fails). Guard: `matrx/provider-failures.test.ts`.
- Consumer action: replace hand-written `409 run_in_progress` → rejoin code with `resumeOrRejoin`; render stream `error` events with `streamErrorText`; call `reportProviderSessionFailure` from every realtime/Cartesia session error handler and show its `user_message`.

## 0.22.0

- **A signed-out visitor never reads the agent catalogue** (live 2026-10-01: every guest page that mounted a picker — `/education/progress`, `/demos/spatial` — fired `agx_get_list_full`, which `anon` cannot execute, and captured `permission denied for function agx_get_list_full` plus `identity.requireUserId() threw`). `ensureLoaded` now answers the empty catalogue with no read when there is no user, and does not stamp freshness, so the first load after sign-in reads for real. The pickers (web + native) show `labels.emptySignedOut` ("Sign in to see your agents") instead of "No agents found". Guard: `catalog/__tests__/store.test.ts` › "signed out never reads the catalogue".
- **New optional identity port `getUserId(): string | null`.** When bound, a signed-out visitor is a state, not a failure: `getUserIdOrNull()` answers from it and nothing is reported to the errorSink. Hosts that bind only `requireUserId` keep the old once-per-session `identity_unavailable` report.
- **New label `emptySignedOut`** on `AgentCatalogLabels` (defaulted; hosts merging partial labels need no change).
- Consumer action: bind `identity.getUserId` beside `requireUserId` (matrx-frontend: `lib/agents/catalog.ts`, `getUserId` from `@/utils/auth/getUserId`). A host passing a COMPLETE `AgentCatalogLabels` object adds `emptySignedOut`.

## 0.21.46

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

## 0.21.45

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

## 0.21.44

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

## 0.21.43

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

## 0.21.42

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

## 0.21.41
### Unreleased

- **A side-opening `AgentListDropdown` never leaves the screen** (blind run PB-03, /chat/new in an 800px pane, 2026-10-01): with `contentSide="left"|"right"` the 680px panel is placed at open time by `sideThatFits` — the asked side when it fits, else the opposite side, else below (where Radix shifts it into view). Before, it ran off the left edge and the search, tabs and names were cut off. Guard: `catalog/react/side-that-fits.test.tsx`. Consumer action: none.

## 0.21.40

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

## 0.21.39

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

## 0.21.38

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

## 0.21.37

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

## 0.21.36

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

## 0.21.35

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

## 0.21.34

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

## 0.21.33

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

## 0.21.32

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

## Unreleased

- **`@ai-matrx/agents/mandates` re-exports the mandate keys from `@ai-matrx/api/intelligence`** (their one home; the identical `mandates/keys.generated.ts` copy is gone and the generator writes only the api file). The snapshots stay here. Consumer action: none.


- **`ArrowUpDownIcon`, `MessageCircleIcon` and `RocketIcon` (catalog/react/icons) are re-exports of `@ai-matrx/design-system/icons`**, like `FolderIcon`/`TagIcon`/`RotateCcwIcon` before them, so the web picker draws the lucide 1.48 glyphs. The shared `icon-paths` table is untouched, the native entry still draws from it. Consumer action: none.
- **The mandate key module has one home (packages-copies lane, 2026-10-21).** `mandates/keys.generated.ts` is deleted; the generator writes only `@ai-matrx/api`'s `intelligence/keys.generated.ts` and `@ai-matrx/agents/mandates` re-exports from it. Consumer action: none.

- Context receipt: `ContextReceiptRow.consumed_as` / `consumed_into` (RULES.md §5) — a key
  the server expanded (`surface_chain`, `window_forms`), acted on as a directive
  (`__table_access`, `__google_files`), renamed (an earlier file-key spelling) or dropped
  with no reason (`"unaccounted"`) keeps its own row. `compareReceipt` compares a consumed
  row on `include` and `user_rule` only, and an `"unaccounted"` row is a `missing`
  mismatch. New exports `RESERVED_CONSUMED_KEYS`, `ContextConsumedAs`; parity corpus
  `consumed_key_cases`. No consumer action required.
- `compareReceipt`: an included envelope the server reports `consumed_as:
  "expanded"` with no `consumed_into` parts delivered nothing — now a `missing`
  mismatch (`actual: "expanded_into_nothing"`), never a silent pass.

## 0.21.31

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

## 0.21.30

- `ContextRulesChip`: the header total no longer counts a size it does not know
  as 0 — some sizes unknown reads `1.2k+ chars`, none known reads `— chars`
  (was `0 chars` beside rows showing `—`). New export `summarizeContextRows`.
  No consumer action required.

## 0.21.29

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

## 0.21.28

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

## 0.21.27

### Added (in `./context`)

- `attachmentContextKey(provider, resourceRef): string` — the context key the server files a
  conversation attachment under: `attached_resource_` + encode(`provider:resourceRef`), keeping
  ASCII letters, digits and `-`, every other UTF-8 byte as `_` + two lowercase hex digits (`_` is
  `_5f`). Corpus `attachment_key_cases` (aidream's twin runs the same cases).

### Consumer action

- matrx-frontend: derive an attachment's context key with `attachmentContextKey(provider,
  resource_ref)` from `GET /conversations/{id}/attachments` (for rule lookups, saving and receipt
  matching) instead of any resource-id-based key.

## 0.21.26

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

## 0.21.25

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

## 0.21.24

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

## 0.21.23

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

## 0.21.22

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

## 0.21.21

### Added (in `./context`)

- `humanizeContextKey(key)` + `CONTEXT_KEY_ACRONYMS` — the one key-to-words rule for a value no
  page or agent labelled: split on `_` / `-` / whitespace, upper-case whole-part acronyms (ID, URL,
  PDF, HTML, JSON, API, AI, UI, CSV, SMS, SEO, LLM, MCP, UUID, ISO), otherwise first letter up and
  the rest down, join with spaces (`note_id` → `Note ID`). Corpus `humanize_cases`; aidream's
  `humanize_context_key` switches to the same rule against the same cases.

### Consumer action

- matrx-frontend: replace the local `humanizeContextKey` in
  `context-rules/request-context.ts` with the package export (labels then match the server's
  receipt once aidream switches).

## 0.21.20

### Added (in `./context`)

- `ContextReceiptRow.blocked_by` accepts `"self_check"` (RULES.md §5): the server's post-render
  safety check stripped the value before the model call (`delivery: "off"`). New type
  `ContextBlockedBy = "model" | "self_check"`.
- `compareReceipt`: a value the person included that the check stripped is a `delivery` mismatch
  tagged `reason: "self_check"` — also for server-resolved rows, whose delivery is otherwise
  never compared. `ContextReceiptMismatch.reason?: "self_check"`.
- Receipt-built rows (`receiptRowToResolved`, `systemRowsToResolved`, `applyReceiptToRows`) carry
  `blockedBy`.
- `./context/react`: such a row's tooltip and mismatch marker read "Removed by the server's safety
  check".

### Consumer action

- matrx-frontend: stop coercing `blocked_by` to null; word a mismatch with
  `reason === "self_check"` as removed by the server's safety check, not as a screen error.

## 0.21.19

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

## 0.21.18

### Added (in `./context`)

- `withheldKeys(rows): string[]` — keys the client holds a value for but is not sending (excluded
  by the page, the agent or the person's rule), deduplicated. Send it as the request's
  `context_withheld` so the receipt's `origin: "rule"` rows cover only keys withheld on this page.
- `systemRowsToResolved(systemRows): ResolvedContextRow[]` — `compareReceipt(...).systemRows`
  (server-seeded attachments, scope seeds…) as governable table rows: `attached_document_*` /
  `attached_file_*` / `resource_file_*` group as "attached", the rest as "system";
  `serverResolved`, `fromReceipt`, values from the receipt, `surfaceKey` = the row's own
  `surface_key` (a rule saved for one goes to `_default` unless the server filed it under a page).
  The table, chip and panel render them with the normal Include switch and Inline max.

### Fixed

- `buildContextWire` skips rows with no value, so receipt-built rows (`receiptRowToResolved`,
  `systemRowsToResolved`) can never reach the wire as `{ content: undefined }`.

### Consumer action

- matrx-frontend: for display pass
  `[...rows, ...systemRowsToResolved(compareReceipt(expected, latestReceipt).systemRows)]`; send
  `context_withheld: withheldKeys(rows)` with each request.

## 0.21.17

### Fixed (in `./context`) — a saved rule lands the same whichever side "declares" the key

Live drift: `current_note_published_to_web` is declared on `matrx-user/notes` by the client's
code manifest but not by the server's DB manifest, so the client filed it under the page and the
server under `_default`; a rule the person saved never reached the server.

### Added

- `lookupSavedRuleFor(rows, primarySurface, surfaceKey, key)`: while a primary surface P is in
  play, a key filed under `_default` or P resolves to the per-field merge `_default[K]` then
  `rows[P][K]` (P wins); a surroundings key keeps its own surface; no P = `lookupSavedRule`.
- `resolveContextRow(source, savedRows, cap?, primarySurface?)` uses it.
- Corpus `effective_lookup_cases` (the server's `lookup_user_rule_for` runs the same cases).

### Consumer action

- matrx-frontend: pass the page's primary surface key as `resolveContextRow`'s 4th argument.
  Saving is unchanged (page values to P, everything else to `_default`).

## 0.21.16

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

## 0.21.15

### Fixed (in `./context`) — the client no longer predicts a server-side resolution

A live clone turn showed two mismatches of one class: `note_id` (a UUID under a `*_id` key, which
the server promotes to a resource reference) and `current_note` (a top-level `resource_ref`, which
the server resolves to a descriptor). The client predicted sizes, defaults and deliveries only the
server can know.

### Added

- `isServerResolved(key, value)`: a top-level resource reference, or a UUID (any form the server's
  `UUID()` accepts) under a `*_id` key — bare or as a rich envelope's `content`. A deliberate
  superset of the server's registry-backed rule: on a value the server keeps raw, the client only
  stops predicting.
- `ResolvedContextRow.serverResolved` / `fromReceipt`, and `ContextRowDelivery`
  (`ContextDelivery | "server"`). `resolveContextRow` gives such rows `chars: null` and, when
  included, `delivery: "server"` (no claim); include and the person's rule resolve as before.
- `compareReceipt`: for server-resolved rows compares include and user_rule, and the limit only
  when the person set one — never delivery or a default-derived limit.
- `applyReceiptToRows(rows, receipt)`: display-only fill of chars / limit / delivery for
  server-resolved rows from the latest receipt (never for comparison).
- `./context/react`: such rows show Chars "—", Inline max placeholder "auto" (the applied limit
  once a receipt fills it), and the row tooltip "Resolved by the server".
- Corpus `server_resolved_cases`, run here and by aidream pytest against `normalize_resource_context`.

### Consumer action

- matrx-frontend: handle `delivery: "server"` wherever a row's delivery is switched on; render
  rows through `applyReceiptToRows(rows, latestReceipt)` for display while still passing the
  original rows to `compareReceipt`.

## 0.21.14

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

## 0.21.13

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

## 0.21.12

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

## 0.21.11

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

## 0.21.10

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

## 0.21.9

### Fixed

- `receiptRowToResolved` now rebuilds `layers` from what the server applied, so a read-only
  table shows the applied limit (e.g. 12000, 2500) as the inherited Inline max instead of 200,
  and the layer breakdown marks the layer that decided it (default → `default_max`, page →
  `surface.max_inline_chars`, agent → declared `agent.max_inline_chars`; "you" stays on
  `userRule`; page auto_context off and the agent kill switch / re-admit are rebuilt too).
- `ContextRulesTable` comfortable density (the chip's bottom sheet) at 375px: Item no longer
  starves to one letter. Fixed columns are `2.75rem / 3.5rem / 6.75rem`, the per-row layer badge
  is gone (the layer is in the row tooltip and the detail view), labels truncate with an ellipsis.

### Consumer action

- matrx-frontend: delete the `layers.default_max` patch over `receiptRowToResolved`
  (message-context-receipt) and the STOPGAP resource-ref pass-through in
  `context-rules/request-context.ts` (fixed in 0.21.8).

## 0.21.8

### Fixed (in `./context`)

- `buildContextWire` wrapped a top-level resource reference (`{ __kind: "resource_ref", … }`, e.g.
  an `attached_file_<id>` from `createResourceReference`) as `{ content: <ref>, label }`. The server
  promotes only TOP-LEVEL references, so the attached document silently stopped resolving. A value
  the server acts on by shape now ships exactly as-is (no label/type/description/limit added):
  any `__kind: "resource_ref"` object, and a bare UUID under a `*_id` key (`file_id`,
  `attached_file_id`, `current_note_id`, …).

### Added

- `isWireDirective(key, value)`. Corpus `wire_passthrough_cases`, run here and by aidream pytest
  against `normalize_resource_context` (promoted as-is, never promoted wrapped).

### Consumer action

- matrx-frontend: none beyond upgrading — references built with `createResourceReference` resolve
  again when sent through `buildContextWire`.

## 0.21.7

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

## 0.21.6

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

## 0.21.5

### Fixed (in `./context`)

- A record that merely has a `content` key (a note `{ id, title, content }`) was treated as a rich
  envelope: its size was measured on `.content` only, and it was sent as
  `{ id, title, content, label, max_inline_chars }`, which the server reads as raw content — the
  page limit was silently lost. Envelope detection now matches the server exactly: own `content`
  and every key in `RICH_ENVELOPE_KEYS` (aidream `_RICH_FORM_KEYS`); anything else is wrapped as
  `{ content: record, … }`. Applies to `resolveContextRow` sizing, `buildContextWire` and
  `serverDefaultMax`.

### Added

- `RICH_ENVELOPE_KEYS`, `isRichEnvelope(value)`, `splitContextValue(value)` (the twin of aidream
  `_split_rich_context_value`). Corpus `envelope_cases`, run here and by aidream pytest.

### Consumer action

- matrx-frontend: no API change; drop any local "is this an envelope" check in favor of
  `isRichEnvelope` / `splitContextValue` from `@ai-matrx/agents/context`.

## 0.21.4

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

## 0.21.3

### Added (in `./context`)

- `serverDefaultMax(value)` + `LAZY_SOURCE_DEFAULT_MAX` (6000): the server's per-key default
  for a wire value (envelope `default_max_inline_chars`; resource reference → 0; lazy source
  → 6000). `resolveContextRow` uses it for `layers.default_max` when the source sets none.
  Parity: new `server_default_cases` in the corpus, run here and by aidream pytest through
  `normalize_resource_context` → `ContextManifest.build` → `_server_default_max`.
- `receiptRowToResolved(row)` — a receipt row as a read-only table row (sent messages).
- `compareReceipt` now returns `modelReadsContext`; when the receipt says the model reads no
  context, `delivery` is not compared (include / limit / your rule still are).

### Fixed

- A source-only lazy pointer (`{ source, type, label }`, no `content`) now ships as the pointer
  itself (it was wrapped as `{ content: <pointer> }`), and its size is unknown (`null`) instead
  of the pointer's own JSON length.

### Changed (in `./context/react`)

- `ContextRulesChip`: `on` / `onToggleAll` are optional — no page, no master switch. New
  `modelReadsContext` prop: false shows a muted eye-off face, the tooltip "This model can't read
  context", and no amber.

### Consumer action

- matrx-frontend: pass `modelReadsContext={result.modelReadsContext}` from `compareReceipt` to
  `ContextRulesChip`; omit `on` where the composer has no page; render sent messages' context
  with `receipt.rows.map(receiptRowToResolved)` in a `readOnly` `ContextRulesTable`.

## 0.21.2

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

## 0.21.1

First published build of 0.21.0's content: the `npm/matrx-agents/v0.21.0` tag was cut without
its mandate-key snapshot and never reached npm. Contents: see 0.21.0 below.

### Consumer action

- matrx-frontend: adopt `@ai-matrx/agents/context` — build the request `context` only through
  `buildContextWire(rows)`, resolve rows with `resolveContextRow` against the person's
  `users.user_surface_state` rows (`feature = "context_rules"`), run `compareReceipt` on the
  `context_receipt` event, and render the composer chip / panel with `./context/react`.

## 0.21.0 (not published)

### Added — `./context` and `./context/react` (context value rules)

Contract: common-docs `systems/scopes-context/context-delivery/RULES.md`; parity corpus
`context/rules-corpus.json` (also run by aidream pytest against the Python twin).

- `./context` (pure): `resolveContextRule`, `contextValueChars` (code points),
  `lookupSavedRule`, `resolveContextRow`, `buildContextWire` (the only producer of a request's
  `context`: excluded rows never ship; the envelope carries the page limit only),
  `compareReceipt`, `formatChars`, constants `CONTEXT_RULES_FEATURE`, `DEFAULT_SURFACE_KEY`,
  `DEFAULT_INLINE_MAX_CHARS`, `DEFAULT_INLINE_CAP`, and the `ContextReceipt` wire types.
- `./context/react` (client): `ContextRulesTable`, `ContextRulesChip`, `ContextRulesPanelBody`,
  `InlineMaxInput` — presentational; the host persists every `onChange`.

## 0.20.6

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

## 0.20.5

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

## 0.20.4

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

## 0.20.3

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

## 0.20.2

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

## 0.20.1

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

## 0.20.0

### Added (in `./mandates`)

- `AnyMandateKey` (`MandateKey | DynamicMandateKey`) — the one carrier type for a
  key that may be declared OR DB-authored (`app.*` / `shortcut.*`, an
  origin='user' mandate).
- `storedMandateKey(value)` — the data door for a key the code did not choose (a
  `mandate_key` column, a stored `mandate:` ref, a saved config). It types and
  never rejects: the server, not this build's key set, decides whether a key
  exists. For a value that must be proven declared, keep using
  `isMandateKey` / `assertMandateKey`.

Both were defined separately, identically, in matrx-frontend, matrx-extend and
matrx-local (Mandate Declaration & Usage Reporting, register D17). The mandate
reference scanner already reads both by name, so moving them changes no scan.

### Consumer action

- matrx-frontend: `features/mandates/mandate-key.ts` re-exports `AnyMandateKey`
  and `storedMandateKey` from `@ai-matrx/agents/mandates` and deletes its own
  definitions (its importers keep their import path).
- matrx-extend `src/lib/mandates.ts` and matrx-local `desktop/src/lib/mandates.ts`:
  the same — import both from the package, delete the local copies.
## 0.19.6

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

## 0.19.5

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

## 0.19.4

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

## 0.19.3

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

## 0.19.2

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

## 0.19.1

(0.19.0 was tagged but never reached npm: its release lacked the
version-addressed mandate-key snapshot. 0.19.1 is the same change.)

### Fixed (verify-4 V4-F #3, in `./sources/runtime`)

- A Source removed in "Review what goes in" now leaves the list. Applying the
  review's answer only rewrote the pointers it named, so a removed Source
  stayed. The rule now lives in the runtime for every client:
  `removedInReview(reviewed, answer)` (the Sources that went INTO the review
  and did not come back, by `sourceKey`), and
  `applyReviewedSourceSet(state, set, reviewed?)` /
  `controller.applySourceSet(set, { reviewed })` remove exactly those cards by
  their own id. A Source that landed while the review was open stays.
  Additive: without `reviewed` the call behaves as before.

### Consumer action

- matrx-frontend: in `SourceInput`, call
  `set.controller.applySourceSet(outcome.sourceSet, { reviewed: sourceSet })`
  and delete the host copy `features/resource-manager/source-input/review/removedInReview.ts`
  (and its tests — ported to `sources/runtime/reviewRemove.test.ts`).
- Any other client applying a review answer: pass `{ reviewed }` with the set
  it sent into the review.

## 0.18.5

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

## 0.18.4

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

## 0.18.3

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

## 0.18.2

### Fixed (independent verify #3 of the Source input, in `./sources/runtime`)

- Parts picked while a Source was still being cleaned survive the clean
  version landing: a fresh manifest with new part ids carries the pick over by
  page (`carryPickedParts`; the pick's pages are remembered on the draft as
  `pickedParts`, so it also survives a reload), or clears it with a note when
  the pages are unknown — never "0 characters · 4 of 21 parts".
- A web page being read has a card (link kept) from the moment the read
  starts: `intake.beginWebPage(url)`; `addScrapedPage(page, pendingId)` settles
  that card. A reload mid-read lands it through the web door.
- One state per card: `failCard` drops the stale measurement;
  `sourceCardState` / `sourceCardMeasuredState` derive it once.
- One size everywhere: `sourceEntryChars` / `sourceCardChars`, and
  `SourcePlanEntry.chars` / `SourcePlan.chars` (the budget keeps `sentChars`).
- A recording made in place (Voice Pad) lands as text but stays a Recording:
  `intake.addRecordedText(text, name)` (kind "audio", its name kept; a reload
  re-lands it from the kept text).
- Wording carried over from the web app's copy pass (R9): delivery hints, the
  unreadable-file sentence, the too-large-to-restore note.

### Consumer action

- matrx-frontend: show `sourceCardChars(card)` on the card, `plan.chars` /
  `entry.chars` in the review, the state word from `sourceCardMeasuredState`;
  wire the web picker's read start to `intake.beginWebPage` and pass the id to
  `addScrapedPage`; send Voice Pad text through `intake.addRecordedText`.

## 0.18.1

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

## 0.18.0

### Added

- `./sources/runtime` — the Source input's UI-free core (common-docs
  `projects/unified-source-input/DESIGN.md` § "One core, many screens", item
  USI-7), moved out of the web app: source-list reducers + selectors
  (drafts, per-Source status, delivery / forms / parts / caps, host config:
  allowed deliveries and max), `createSourceSetController` over an injected
  store, draft storage, client and config; `createSourceIntake` (paste, web
  page, YouTube, recording, upload, existing) with every door, the
  organization gate and the wording injected; recovery (`resumeInterrupted`,
  `continueAfterOrganization`, `lookAtFileCards`); THE review planner
  `planSourceReview` (estimator injectable, default the measured 2.9
  chars/token); `createSourcesClient` for `/sources/manifest`, `/sources/resolve`
  and `/sources/parts/search` (always sent as organization-free reads) plus
  `createFetchSourcesTransport` for clients without an API layer; the pure
  rules `delivery`, `partsSearch`, `interrupted`, `fileSource`.
- `./sources/react` — `useSourceSet(adapter)`, `useSourceIntake`,
  `useSourceRecovery`, `useSourcePartsSearch`.

### Consumer action

- matrx-frontend: bind the adapter to Redux `instanceResources` + `wizardDraft`
  in `features/resource-manager/source-input/useSourceSet.ts`, bind the intake
  doors (sourcesApi, scraper, YouTube reader, transcription, associations
  service, organization gate) in `useSourceIntake.ts`, the file-state read in
  `useSourceRecovery.ts`, and the typed `apiPost` transport in
  `sourceSetApi.ts`; delete the local `delivery.ts`, `partsSearch.ts`,
  `interrupted.ts`, `fileSource.ts`, `useSourcePartsText.ts` and
  `review/plan.ts`, importing them from `@ai-matrx/agents/sources/runtime`.
  Other consumers: none — additive.

## 0.17.5
### Unreleased

### Added

- `./sources` contract amendment A5 (common-docs
  `projects/unified-source-input/DESIGN.md` § Contract amendments):
  `SourceManifestSegment` gains optional `preview` (a part's opening words,
  never its body); a part spanning several pages is labelled "Pages 22–24".

### Consumer action

- None — additive. Show `preview` under a part and match searches against it.

## 0.17.4
### Unreleased

### Added

- `./content-transfer`: `preparedContentOfferedValues(snapshot, draft)` and the
  Alchemy preparation launch now sends the `alchemy.prepared_content` offered
  values by name (`coverage_status`, `included_count`, `total_count`,
  `coverage_unit`, `coverage_reason`, `payload_kind`, `row_count`,
  `column_labels`, `omission_reasons`, `omission_count`, `section_labels`,
  `has_unsaved_changes`, `captured_at`, `manually_edited`) beside the four
  existing variables. Absent facts are omitted. These are mapped-only on the
  server, so no current Holder's payload changes.

### Consumer action

- None.

## 0.17.3

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

## 0.17.2

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

## 0.17.1

### Changed

- `./sources` contract amendments A1–A2 (common-docs
  `projects/unified-source-input/DESIGN.md` § Contract amendments):
  `DroppedSourceReason` gains `"not_ready"` (a file not yet read) and
  `DroppedSource` gains optional `detail` (what happened, what to do); the
  stored-file token is documented as `"file"` (`"cld_file"` is a server alias).

### Consumer action

- None — additive types. Code that switches on `DroppedSourceReason` should
  handle `"not_ready"`.

## 0.17.0

### Added

- **`./sources` — the one Source payload, contract v1** (common-docs
  `projects/unified-source-input/DESIGN.md` § "Contract v1 — FROZEN"). Types
  `SourceRef` (the existing `resource_ref` pointer, extended with optional
  `include_segments`, `delivery`, `max_chars`), `SourceSet`, `SourceManifest`,
  `ResolvedSourceSet` and their parts; constants `SOURCE_SET_VERSION`,
  `RESOURCE_REF_KIND`, `SOURCE_SET_KIND`, `SOURCE_MANIFEST_KIND`,
  `RESOLVED_SOURCE_SET_KIND`; pure helpers `createSourceRef`, `isSourceRef`,
  `createSourceSet`, `isSourceSet`, `totalChars`. Every shape carries its
  `__kind`. Pure entry (no React, no "use client"), proven so by the tarball
  canary.

### Consumer action

- matrx-frontend: `features/agents/agent-context/resource-reference.ts` derives
  `AgentResourceReference` / `ResourcePromotion` from `SourceRef` /
  `ResourcePromotion` here (type-only import) — no second pointer type. New
  source-input code imports these types from `@ai-matrx/agents/sources`. No
  other consumer action.

## 0.16.20

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

## 0.16.19

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

## 0.16.18

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

## 0.16.17

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

## 0.16.16

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

## 0.16.15

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

## 0.16.14

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

## 0.16.13

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

## 0.16.12

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

## 0.16.11

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

## 0.16.10

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

## 0.16.9

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

## 0.16.8

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

## 0.16.7

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

## 0.16.6

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

## 0.16.5

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

## 0.16.4

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

## 0.16.3

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

## 0.16.2

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

## 0.16.1

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

## 0.16.0

### Changed (breaking)

- **Agent stars live in `platform.user_entity_state`.** A star is per-person
  state; the catalog no longer reads or writes the retired
  `agent.definition.is_favorite` column (a flag on the OWNER's row, which made a
  shared agent unstarrable and let the classic grid, the picker, Pinned Agents,
  the /agents list and the Knowledge hub disagree). Every list load and every
  server-search hit overlays the caller's stars from ONE `ues_get_bulk('agent',
  ids)`; `setFavorite` writes `ues_set`. Both go through the platform's one
  `ues_*` chokepoint, `@ai-matrx/associations/core` (new dependency). A failed
  star read never blocks the catalogue: it reports `favorite_read_failed` and
  renders every star unset.
- `AgentCatalogClient` is `rpc()` only — `schema().from().update()` and the
  `AgentCatalogTableQuery` port are gone (the column write was their only use).
- `FavoriteAgentButton` (web and native) no longer refuses non-owned rows:
  "Shared — cannot favorite" existed only because of the owner-row column.
- `assertAgentCatalogSchema` demands `ues_get_bulk` and no longer probes a
  column write; `favoriteWritable` and `probeWrite` are removed.
- A mandate default row whose Holder is being fetched by an in-flight list read
  waits for that read instead of issuing a second single-row read.

### Added

- `AgentCatalogConfig.favorites` (`AgentCatalogFavorites`) — optional; pass the
  host's existing favorites service so there is exactly one instance. Default:
  `createAssociationsStore({ dataSource: client, identity, errorSink }).favorites`.

### Consumer action

- None required: a host passing a supabase-js client keeps working. A host that
  already holds `@ai-matrx/associations`' favorites service (matrx-frontend's
  `favoritesService`) should pass it as `favorites`. Remove any host code that
  reads `favoriteWritable` or passes `probeWrite`.

## 0.15.1

### Added

- `AgentListPanel` `fill` — fill the parent instead of the fixed 680 × 528
  footprint, for a resizable host (a window).

### Changed

- The picker's list column flexes (`min-w-[340px] flex-1`); the peek column
  stays 340px. In the dropdown's fixed 680px popover this is the same layout.

### Consumer action

- None.

## 0.15.0

### Added

- `./catalog/react` — `AgentListPanel` and `AgentListPanelBody`, THE picker body:
  the list on the left and the hover peek / sort / category / tag panel on the
  right at the fixed `PANEL_WIDTH` × `PANEL_HEIGHT` (680 × 528) footprint; one
  column with the same sub-views on a phone. `AgentListPanel` owns its list core
  (for a window or any surface of its own); `AgentListPanelBody` renders over a
  core the host already holds. `onAfterSelect(agent)` runs after the core's
  `onSelect`. New export `PANEL_WIDTH`.

### Changed

- `AgentListDropdown` renders `AgentListPanelBody` inside its popover / drawer —
  the same picker, now defined once. No prop or behavior change for hosts.

### Fixed

- The pinned agent is previewed in the peek column as soon as it resolves, not
  only when the roster was already loaded at open (a cold picker showed the
  hover hint instead of the current agent).

### Consumer action

- None. A host that shows a picker in a surface of its own renders
  `AgentListPanel` instead of rebuilding the two-column layout.

## 0.14.3

### Fixed

- Release unit repaired: 0.14.1 and 0.14.2 were tagged without their
  version-addressed mandate-key snapshot, so neither could publish. 0.14.3
  ships both changes (the "Archived" row badge and the picker opening below its
  control) with `mandates/keys.generated.ts` and `mandates/snapshots/keys.0.14.3.json`.

### Consumer action

- None.

## 0.14.2

### Fixed

- `./catalog/react` — `AgentListDropdown` opens BELOW its trigger whenever a
  usable list (300px) fits there, sized to the room it has. Radix flipped the
  full 528px panel above a trigger in the middle of a dialog, covering the
  dialog's title and controls. New export `panelHeightBelow(trigger)` is the
  measurement, for hosts with a sibling picker (matrx-frontend's workflow picker).

## 0.14.1

### Added

- `./catalog/react` and `./catalog/native` — an archived agent row shown by the
  archive filter carries an "Archived" badge (`labels.archivedBadge`, default
  `"Archived"`). Archived agents stay offered, one or two clicks away (THE
  ARCHIVED-ITEMS LAW), and now say so on the row itself.

### Consumer action

- None. A host that overrides `labels` may set `archivedBadge`.

## 0.14.0

### Added

- `@ai-matrx/agents/presentation/decision-answers` — THE ONE reader for a
  `decision_answers` payload (`readDecisionAnswers`, `answerProbability`,
  `formatDecisionAnswer`, `formatAnswerHeadline`, `probabilityOfTrue`,
  `decisionAnswersText`, `METHOD_LABELS`, `METHOD_EXPLANATIONS`,
  `DECISION_ANSWERS_KIND`). Pure, defensive: an unreadable answer stays
  `null`, a Yes/No distribution is synthesised from P(true), a score's
  headline names its PEAK level with the peak's own probability. Moved out of
  matrx-frontend (`features/agents/decision-answers/read.ts`) and Workflow
  Studio (`src/lib/content-ir/decision-answers-read.ts`), which had drifted.

### Consumer action

- matrx-frontend: import from `@ai-matrx/agents/presentation/decision-answers`
  and delete `features/agents/decision-answers/read.ts`.
- Workflow Studio: same import; delete `src/lib/content-ir/decision-answers-read.ts`.

## 0.13.16

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/matrx-agents/v0.13.15..npm/matrx-agents/v0.13.16 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.13.14..npm/matrx-agents/v0.13.15 -- apps/shared/matrx-agents`).
No source changes intended and no consumer action required.

## 0.13.14

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

## 0.13.13

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/matrx-agents/v0.13.12..npm/matrx-agents/v0.13.13 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.13.11..npm/matrx-agents/v0.13.12 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.13.10..npm/matrx-agents/v0.13.11 -- apps/shared/matrx-agents`).
No source changes intended and no consumer action required.

## 0.13.10

`catalog/react`: the selected-agent trigger now names a resolved mandate default
when its active id is that default row's `mandate:<key>` reference. It still
states that an unrelated synthetic mandate id cannot be named, rather than
borrowing another default row's holder.

### Consumer action

None required. Every `AgentListDropdown` consumer receives the repaired label
after adopting `latest`.

## 0.13.9

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

## 0.13.8

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

## 0.13.7

`mandates`: two new keys for the data tables surface —
`MANDATE_KEYS.data__formula_writing` (the formula box's "Help with this…": writes or fixes a
table formula from the table's real columns and the formula language) and
`MANDATE_KEYS.data__row_action` (runs a table's saved agent row action on one row, with the row,
table and person as offered values). Key set regenerated by the ONE generator.

### Consumer action

None required.

## 0.13.6

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

## 0.13.5

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

## 0.13.4

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

## 0.13.3

`mandates`: `MANDATE_KEYS.mandates__holder_draft` — the Mandate workspace's "+ Agent" / Create Agent job (drafts the agent that fulfils one Mandate from its goal, offered values and output contract). Key set regenerated by the ONE generator.

### Consumer action

None required.

## 0.13.2

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/matrx-agents/v0.13.1..npm/matrx-agents/v0.13.2 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.13.0..npm/matrx-agents/v0.13.1 -- apps/shared/matrx-agents`).
No source changes intended and no consumer action required.

## 0.13.0

`catalog`: an errored mandate default row is no longer cached like a resolved one. `ensureDefaultRow` re-asks the mandate door when the existing row is a refusal, and the new `retryDefaultRow(mandateKey)` drops the refusal and asks again; the picker's error banner now carries a "Try again" button wired to it. Closes the matrx-extend defect of 2026-09-19 where one 401 during session hydration pinned "the server refused to resolve it" on the default agent for the whole session.

### Consumer action

None required. A host that renders its own picker may call `catalog.retryDefaultRow(key)` from its error surface.

## 0.12.8

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

## 0.12.7

Reissues the unchanged 0.12.6 package after the shared release lane gained the
missing records-package packed-artifact guard. The earlier tag stopped at the
fleet gate before this package could publish.

No consumer action is required.

## 0.12.6

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

## 0.12.5

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

## 0.12.4

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

## 0.12.3

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

## 0.12.2

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

## 0.12.1

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

## 0.12.0

Ships createMatrxTransferActions and createMatrxTransferPorts for the standard Matrx destination catalog. Current-draft serialization, eligibility, identity checks, attachment deduplication and partial-save receipts live in the package.

### Consumer action

Bind createMatrxTransferPorts to existing Matrx service/opening ports once at the authenticated application provider, then register createMatrxTransferActions with the shared capabilities. Pages supply only their source or mounted surface. Pass the capture identity when opening an assistant with initial text resources; never put captured source into the human composer or auto-run it.

## 0.11.4

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/matrx-agents/v0.11.3..npm/matrx-agents/v0.11.4 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.11.2..npm/matrx-agents/v0.11.3 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.11.1..npm/matrx-agents/v0.11.2 -- apps/shared/matrx-agents`).
No source changes intended and no consumer action required.

## 0.11.1

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

## 0.11.0 — 2026-09-12

Adds the portable Matrx Alchemy content-transfer adapter and React bindings for
running immutable captured content through AI Matrx. It also adds sealed
organization-operation helpers so a prepared request cannot silently execute
under a different organization after context changes.

### Consumer action

Update to 0.11.0 before using `@ai-matrx/agents/content-transfer`,
`@ai-matrx/agents/content-transfer/react`, `createOrganizationOperation`, or
`assertOrganizationMatchesOperation`. Existing stream, catalog, and mandate
imports remain compatible.

## 0.10.7

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

## 0.10.6

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

## 0.10.5

Automatic changed-only republish (docs/metadata drift since the last tag — see
`git diff npm/matrx-agents/v0.10.4..npm/matrx-agents/v0.10.5 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.10.3..npm/matrx-agents/v0.10.4 -- apps/shared/matrx-agents`).
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/matrx-agents/v0.10.2..npm/matrx-agents/v0.10.3 -- apps/shared/matrx-agents`).
No source changes intended and no consumer action required.

## 0.10.2

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

## 0.10.1 — 2026-09-10

**The key set was incomplete by 17. It is complete now: 368 → 384 keys.**

0.10.0 published the vocabulary so a client could stop mirroring mandate keys by
hand. But `MANDATE_KEYS` is emitted from aidream's in-process
`declared_mandates()`, and 17 live `mandate.definition` rows with `origin='code'`
were declared by nothing — so they could not enter the union, and every client
legitimately calling one was pushed straight back to the hand-typed literal
0.10.0 exists to delete. **The vocabulary is the authority only to the extent the
declarations are complete.**

Sixteen of the 17 are declared and now ship in the union; the seventeenth
(`workflow.plan_shape_designer`) was retired at the source as superseded — it
never had a Holder and never ran, and its job shipped in August as
`workflow.plan_input_kind_authoring` + `workflow.plan_output_kind_authoring`.

Newly in `MANDATE_KEYS`:

- `ambient.spoken_summary`
- `product_capture.instant_analysis`
- `seo.session_rule_writer`, `seo.session_stamp_proposer`
- the twelve `content_plan.p6_build.*` specialist page builders (`about`, `blog`,
  `comparison`, `contact`, `faq`, `guide`, `home`, `index`, `location`, `pillar`,
  `pricing`, `service`)

Nothing was renamed, nothing was removed, and no key is retiring — every 0.10.0
key is still active. Upgrading is additive.

A guard on the aidream side (`scripts/check_mandate_declarations.py`, wired into
CI as `mandate-declarations`) now compares the declared set against the live
`origin='code'` rows and goes red on either difference, so this gap cannot
silently reopen.

### Consumer action

**matrx-frontend may drop four entries from
`scripts/mandate-keys-allowlist.json`** — these keys are in the generated union
now, so import them from `@ai-matrx/agents/mandates` instead of naming them as
string literals:

| Drop this allowlist entry | Import instead |
| --- | --- |
| `ambient.spoken_summary` | `MANDATE_KEYS.ambient__spoken_summary` |
| `product_capture.instant_analysis` | `MANDATE_KEYS.product_capture__instant_analysis` |
| `seo.session_rule_writer` | `MANDATE_KEYS.seo__session_rule_writer` |
| `seo.session_stamp_proposer` | `MANDATE_KEYS.seo__session_stamp_proposer` |

The other allowlist entries STAY and are not affected: `mandate.goal_writer` is
`origin='user'` (a person created it in the console, so it can never appear in a
union built from code declarations), and `mandates.kind_converter` has no live
row at all by design — its affordance renders disabled naming the missing key.

## 0.10.0 — 2026-09-09

**`@ai-matrx/agents/mandates` — clients stop typing mandate keys by hand.**

A TypeScript client never declares a mandate: aidream's `declare_mandate` is the
only declaration path in the system. Until now clients still *named* mandates
with hand-typed string literals and local `mandates.ts` mirror files, so a typo,
a rename, or a retired key failed at run time as a 404 nobody saw — and the
release report had no way to resolve a client's references against the key set
the client actually shipped.

This release publishes that key set. `mandates/keys.generated.ts` is emitted by
THE ONE GENERATOR (`aidream/scripts/mandates_generate.py`, stage (h)) from the
in-process declarations — the same `declared_mandates()` the boot sync writes the
database from — and cross-checked against the live `origin='code'` rows on every
credentialed pass. The key set of every published version is committed beside it
under `mandates/snapshots/keys.<version>.json` and ships in the tarball, so a
scan can resolve a client's references against the key set of the exact version
it depends on (Mandate Declaration & Usage Reporting, DESIGN § 4.5 step 2).

### Consumer action

Import keys from `@ai-matrx/agents/mandates`; hand-typed key literals and local
`mandates.ts` mirrors are retired — lane L6.

- `MANDATE_KEYS` — every declared key, keyed by THE IDENTIFIER RULE (`.` → `__`,
  anything outside `[A-Za-z0-9_]` → `_`, a leading digit gets an `_`): so
  `seo.keyword_classifier` is `MANDATE_KEYS.seo__keyword_classifier`.
- `type MandateKey` — the union. Type every carrier parameter with it: a
  made-up key then fails type-check instead of failing in production.
  `as MandateKey` casts are the same defect the literals were.
- `isMandateKey(x)` / `assertMandateKey(x, context?)` for anything that crossed
  a wire (a URL segment, a stored preference, a row's `mandate_key`).
- `MANDATE_FAMILIES` — prefix → members, for a family aidream declares from the
  feature's own roster; `MandateFamilyMember<P>` types one member.
- `mandateKeyOfApp(appSlug, surfaceSlug?)` / `mandateKeyOfShortcut(slug,
  surfaceSlug?)` for the DB-authored `app.*` / `shortcut.*` families. They return
  a branded `DynamicMandateKey`, deliberately **not** assignable to `MandateKey`
  — no generated union can contain a row a user created five minutes ago. A
  carrier that genuinely accepts either says `MandateKey | DynamicMandateKey`.
- `RETIRING_MANDATE_KEYS` / `MANDATE_KEYS_META` — the deprecation list and the
  aidream revision + generator version the key set came from.

**Two-phase retire.** A key that stops being declared does not disappear: it is
emitted `@deprecated retiring since <version>`, stays in the `MandateKey` union,
and leaves only after three already-published versions have shipped it that way.
A client that lags one release gets a deprecation warning with a remedy, never a
hard type error it cannot act on until it upgrades.

### Additive only

No export was removed, renamed or re-signed. `./mandates` is a new subpath; every
existing entry is untouched.

## 0.9.2 — 2026-09-09

**THE ARCHIVED-ITEMS LAW, APPLIED TO THE PICKER — the first instance of a
platform-wide class.**

Arman, 2026-09-09, asked whether the Public tab should hide archived agents
like its other tabs (`common-docs/policies/archived-items.md`):

> "Archived agents should be treated like all other archived items everywhere
> within our codebase. … why does agents have to be any different than
> workflows or employees or HR documents or anything else that we have?
> They're not any different. They are the same, and they should be treated the
> same. … everything should have an archive filter, and the default should
> always hide archived, but seeing archived items should be one or two clicks
> away. But don't go and do this for agents and forget that this is a system
> wide decision for every single item everywhere in our system."

### Consumer action: none

No export was removed, renamed or re-signed. Additive only:
`ARCHIVE_FILTER_OPTIONS`, `ARCHIVE_FILTER_ORDER`, `nextArchFilter`,
`isAgentArchFilter`, `AgentArchFilterOption`, `AgentCatalogDefaults`,
`agentArchiveFilterChipLabel` / `…StateLabel` / `…ControlLabel`,
`agentListFooterLabel`, `AgentCatalog.consumerDefaults`,
`useAgentListCore({ initialArchFilter })` and its `archivedHiddenCount` /
`footerLabel` returns, plus `data-testid="agent-archive-filter"` /
`"agent-list-footer"` (and their native `testID` twins). Every host adopts this
by taking `latest`.

### Behavioural deltas (all deliberate, the first was the defect)

**THE BUILTIN ARCHIVE EXEMPTION IS DELETED.** `filterBuiltinTypeAgents` applied
no archive filter, on the theory that "a builtin belongs to the platform and is
never the user's to archive". The database disagreed: `Foundry Planner`
(`001b22f6-fa4d-40c6-a1a4-8575d4d04379`) is an archived builtin, and it
rendered at Public index 216, sat inside the "413 agents" badge and footer, and
was pickable — while Mine / Shared / All hid their archived rows. One picker,
two rules. `selectAgentTabCounts(...).system` and
`selectTotalBuiltinAgentsCount` now count under the same rule the tab renders
under, so badge == footer == rows holds on Public too.

**THE ARCHIVE FILTER IS NOW A VISIBLE CONTROL, on web and native.** One chip on
the filter bar with the platform's three states — *hide archived* (default) →
*show all* → *archived only* → back — one click from opening the picker, on
every tab, and present even for a consumer whose `visibleTabs` removes the tab
strip. Its accessible name always says the state it is in and the state one
click moves it to. It counts toward `activeFilterCount`, so a list showing
archived rows offers the reset control that puts them away.

**THE FOOTER IS HONEST ABOUT WHAT IT IS HIDING.** `agentListFooterLabel` prints
`"412 agents · 4 archived hidden"`, `"416 agents · archived shown"` or
`"3 archived shown"` — never a bare count that implies the list is everything.

**THE DEFAULT IS A KNOB** (root law 6; law clause 6):
`createAgentCatalog({ defaults: { archiveFilter } })` catalog-wide, platform
default `"active"`, with a per-consumer override
(`useAgentListCore({ initialArchFilter })`). An illegal value throws
`AgentCatalogConfigError` rather than being silently ignored. `resetFilters`
returns to the KNOB's value, not to the hardcoded platform one.

### Proof, and how it can fail

`catalog/__tests__/archive-law.test.ts` asserts, per archive state × per tab,
that the rendered rows are exactly what the law says, that the badge and the
footer are that same number, that the default hides archived rows on EVERY tab
(Public included), that one action reveals them, and that the knob works and
screams. The expectation is restated from the policy text and imports nothing
from `catalog/selectors.ts`. Both shells (`catalog/react/archive-law.test.tsx`,
`catalog/native/__tests__/archive-law.test.tsx`) measure the RENDERED screen.

Falsifiability: reinstating the deleted exemption in `filterBuiltinTypeAgents`
was verified to turn 6 of the 11 kernel tests red before shipping, and the old
rule is written out in the suite so its answers are asserted to differ.
`total-order-fixture.json` now carries an archived builtin, generated from the
rule by `scripts/generate-total-order-fixture.mjs`.
`parity-expected.json` is left byte-identical — it is a RECORDING of
matrx-frontend, whose exemption is the defect — and the law is applied to that
recording in exactly one place, with a test proving the transform changes 30
cases and drops only builtin ids.

## 0.9.1 — 2026-09-08

**TWO SCREENS TOLD THE SAME USER TWO DIFFERENT TRUTHS. BOTH ARE FIXED HERE, IN
THE PACKAGE, AT THE CLASS.**

Independent final verification of the picker unification (2026-09-08, same
account signed in on both surfaces) found the tab strip, the counts, the
Mine/Shared/All order, the five sort options, the tri-state favourites control,
the 42 categories, the 871 tags and four tag-only searches identical between
`aimatrx.com/chat/new` and `workflows.aimatrx.com`. Two things were not.

### Consumer action: none

No export was removed, renamed or re-signed. Three symbols were ADDED —
`compareAgentIds`, `agentMatchesArchiveFilter`, `selectAgentTabCounts` — and the
web `AgentRow` gained a `data-testid` matching the native row's `testID`.
Every host adopts this by taking `latest`; there is nothing to change.

### Behavioural deltas (both deliberate, both were defects)

**F1 — every sort is now a TOTAL order, ending on `id` ASC.**

The Public tab diverged at index 10. 17 rows tied on
`updated_at = 2026-09-08T06:52:46.430326+00:00`, and the two hosts fetch the
same RPC through different transports:

| host | request | order of tied rows |
|---|---|---|
| matrx-frontend | `POST /rpc/agx_get_list_full` (one shot) | the RPC's own |
| workflow-studio | `…?order=id.asc&offset=0&limit=1000` (`readAllRows`) | id ASC |

Neither client was wrong about the ROWS. The sort was not total: each
comparator branch returned `0` for tied rows, so `Array.prototype.sort` left
them wherever the transport had put them. `sortFilteredAgents` and
`applyAgentSortComparator` now end on the same final key the database itself
ends on — `public.agx_get_list` is
`ORDER BY is_favorite DESC, updated_at DESC, id` — giving:

    searching:     score DESC -> server rank ASC -> sort key -> id ASC
    not searching: favourites first (when asked) -> sort key -> id ASC

Comparison is a codepoint `<`/`>`, never `localeCompare`: Postgres orders
`uuid` by its raw bytes and a collator is free to fold case or ignore the
dashes, which would diverge from the server on exactly these ties. A sort key
that yields `NaN` (an unparseable timestamp) now collapses to the id key
instead of defeating it.

*What the frontend used to do on ties: whatever order the RPC page came back
in.* That was never a decision — it was the absence of one, and it happened to
look stable only until a second host fetched the same rows a different way. The
order is now DEFINED, is the server's own, and is a function of the rows alone.

**F5 — a tab badge counts exactly what the tab renders.**

The Mine badge said 416 while the list rendered 412 rows and the footer said
"412 agents": 4 owned and 2 shared ARCHIVED agents were counted by the badge
and (correctly) hidden by the list. One screen, three numbers, one of them
untrue about agents the user cannot see or reach from there. This is "a screen
never lies", so it is a fix and not a knob.

`selectAgentTabCounts(rows, archFilter)` is the new consumer-aware badge
source used by `useAgentListCore`, and the four plain aggregate counts
(`selectTotalUserAgentsCount`, `…Owned…`, `…Shared…`, `…Favorite…`) now honour
the same archive rule the list uses. Flip the archive filter and the badges
follow the list into the archive. `selectTotalBuiltinAgentsCount` is
deliberately unchanged: `filterBuiltinTypeAgents` applies no archive filter
(a builtin belongs to the platform and is never the user's to archive), so it
already counted exactly what it rendered.

### The proof

`catalog/__tests__/parity.test.ts`'s 66-row fixture had NO ties, which is why
293 green cases never saw F1. The new fixture does:
`catalog/__tests__/total-order-fixture.json` — 42 rows, every one on that exact
live `updated_at`, 26 of them also tied on `created_at`, with name and category
tie groups on top, ids deliberately uncorrelated with emission order.

`total-order-expected.json` is generated **from the RULE** by
`scripts/generate-total-order-fixture.mjs` — favourites -> key -> id ASC,
written out independently and importing nothing from `catalog/selectors.ts`.
Regenerating it by running the shipped comparator would have made the test a
mirror of the code; it measures the specification instead.

720 cases (tab x sort x favouritesFirst x archive x favourite x access) are
asserted three times over — kernel (`catalog/__tests__/total-order.test.ts`),
web shell (`catalog/react/total-order.test.tsx`) and native shell
(`catalog/native/__tests__/total-order.test.tsx`) — each reading the RENDERED
row ids, not the selector's return value.

Falsifiability, on every leg:

- the same rows are fed in four different input orders (identity, two seeded
  shuffles, reversed) and the answer must be byte-identical — this is the live
  defect, reproduced as a test;
- both shells mount the picker twice with the row array reversed and compare
  screen to screen;
- deleting the id tiebreaker turns 4 of the 10 kernel tests red (verified
  before shipping), and a key-only sort of the same fixture is asserted to
  disagree with itself under reversal;
- the F5 legs assert the OLD counting rule produces a DIFFERENT number on this
  fixture, so "badge == rows" cannot pass vacuously.

`parity.test.ts`'s count assertion now states the F5 delta explicitly — the
recorded matrx-frontend number minus the archived rows the list hides — rather
than reproducing a screen that lies. Its 293-case ordering matrix and the
native shell's 293-case matrix are UNCHANGED and still green: the old fixture
had no ties, so F1 moved nothing that was already defined.

## 0.9.0 — 2026-09-08

**THE ONE PICKER NOW RENDERS ON REACT NATIVE — `@ai-matrx/agents/catalog/native`.**

> 🚨 **Correction, 2026-09-09 (Arman): this entry has NO CONSUMER.** The `matrx-mobile` repo
> this release was built against is retired junk and is not a consumer of anything; there is no
> current mobile package, and the new one has not been started. `./catalog/native` remains
> published and gate-verified, but nothing ships on it. See common-docs
> `projects/npm-package-extraction/DECISIONS.md` C32 / `systems/mandates/DECISIONS.md` D24. The
> release notes below are preserved as written; the repo work they describe is void.

The retired `matrx-mobile` app (Expo 54 / RN 0.81) was the last thing still hand-rolling its
agent list. Its sheet showed four HARDCODED agents plus a Supabase read of a
`prompts` table that **does not exist in the platform database** — a read whose
PostgREST error was swallowed into an empty array, so the list silently never
had anything but the four constants. Three of those four constants named the
WRONG agent: the ids behind "General Chat", "Deep Research" and "Code Helper"
resolve in `agent.definition` to *Agent Ledger*, *Knowledge Search Test* and
*Balanced News Analysis*. A label lying on screen, with nothing anywhere that
could notice — the same class the mandate default row was built to end.

React Native could not adopt the picker before this release for two concrete
reasons, and both are fixed here rather than worked around in the app.

### Consumer action (C28)

**Web hosts: none.** `@ai-matrx/agents/catalog` and `/catalog/react` keep every
export, every name and every behaviour. The provider, the store subscription
and the two list hooks moved to `catalog/shared/*` so both platforms run one
implementation; `catalog/react` re-exports all of them unchanged, and the
`"use client"` banner is still stamped on the react build and still absent from
the pure ones (the tarball canary now judges eight artefacts instead of four).

**React Native hosts:**

```tsx
import AsyncStorage from "@react-native-async-storage/async-storage";
import { createAgentCatalog } from "@ai-matrx/agents/catalog";
import { AgentCatalogProvider, AgentListSheet } from "@ai-matrx/agents/catalog/native";

const catalog = createAgentCatalog({
  client: supabase,
  identity: { requireUserId: () => requireUserId() },
  storage: AsyncStorage,          // NEW — the async storage seam
  transport,                      // only when a picker passes defaultMandateKey
  errorSink: reportToDiagnostics,
});

<AgentCatalogProvider catalog={catalog} navigate={(href) => router.push(href)}>
  <AgentListSheet consumerId="chat" onSelect={setAgentId} activeAgentId={agentId} />
</AgentCatalogProvider>
```

- `react-native` and `react-native-svg` are OPTIONAL peers. Install
  `react-native-svg` (`npx expo install react-native-svg`) for the real glyphs;
  without it the icons fall back to text glyphs and **say so once** through the
  `errorSink`, with the remedy. Nothing goes blank and nothing goes quiet.
- Bind `navigate` if your rows should be able to open an agent. Unbound, the
  default is a no-op that REPORTS through the `errorSink` — never a control
  that silently does nothing.
- `@ai-matrx/agents/catalog/styles.css` is a WEB artefact; the native entry
  needs no stylesheet.

### What is new

- **`@ai-matrx/agents/catalog/native`** — the picker in React Native
  primitives over the SAME headless kernel and the SAME hooks:
  `AgentCatalogProvider`, `AgentListSheet` (the body of a bottom sheet — the
  host keeps its own sheet chrome, so no gesture library is forced on anyone),
  `AgentListInlinePicker`, and every part beneath them (`AgentListContent`,
  `AgentListTabs`, `AgentFilterBar`, `AgentRow`, `AgentDetailCard`,
  `AgentSubView`, `FavoriteAgentButton`, the five primitives, `AgentIcon`).
  The shells take the web shells' prop surface name for name: `onSelect`,
  `activeAgentId`, `consumerId`, `initialTab`, `includeSystemInAll`,
  `visibleTabs`, `systemTabLabel`, `showPinnedAgent`, `excludeAgentIds`,
  `defaultMandateKey`, `compact`.
- **The async storage seam** — `AgentCatalogAsyncStorage` /
  `AgentCatalogStorageLike`, plus `readCachedDefaultRowAsync` and
  `writeCachedDefaultRowAsync`. `createAgentCatalog({ storage })` now accepts an
  `AsyncStorage`-shaped store verbatim. React Native has no `localStorage`, so
  before this a native host could only hand the catalog a store that answered
  `null` synchronously (a lie) or lose the default row's first paint entirely.
  **The web path is unchanged**: `AgentCatalogStorage` is still synchronous,
  `readCachedDefaultRow`/`writeCachedDefaultRow` still have their synchronous
  signatures, `defaultStorage()` still prefers `localStorage`, and the async
  helpers over a synchronous store produce byte-identical cache payloads
  (proven in `catalog/__tests__/storage-seam.test.ts`).
- **`AgentCatalogNativeTheme`** (C26 on a platform with no CSS) — the native
  twin of the `--matrx-agent-*` sheet: every token ships a DEFAULT VALUE so the
  picker renders correctly unthemed, and a host re-brands by passing `theme` to
  the provider. `DEFAULT_AGENT_CATALOG_NATIVE_THEME` (dark) and
  `LIGHT_AGENT_CATALOG_NATIVE_THEME` ship; `resolveAgentCatalogNativeTheme`
  merges an override and keeps every value it omits. No native component
  contains a color literal.
- **`catalog/shared/icon-paths.ts`** — the glyph geometry, once. The web icons
  now read it too, so a shape can never differ between the two platforms; the
  native entry draws the same paths through `react-native-svg` (C19: still no
  icon-library dependency, on either platform).
- **`AgentListTabCounts` moved** to `catalog/shared/useAgentListCore` beside the
  code that computes it. `catalog/react/AgentListTabs` re-exports it unchanged.

### Behavioural deltas on native, recorded rather than hidden

1. **No hover preview.** The web picker's side panel opens on hover; a touch
   screen has no hover, so the detail card is reached by the row's chevron —
   the same three-view stack (`list → detail → sort/categories/tags`) the web
   `AgentListInlinePicker` already used on mobile widths.
2. **No cmd-click link.** `AgentRow`'s anchor exists on the web so a person can
   open an agent in a new tab. React Native has neither, so the row is an
   ordinary `Pressable`; the `LinkComponent` port still exists and still ships
   a working native default.
3. **`autoFocusSearch` defaults to `false`** (the web inline picker defaults to
   `true`): a keyboard that opens with the sheet covers the list it was meant
   to filter.

### Proof

- **The 293-case ordering matrix, re-measured through the RENDERED native
  list** (`catalog/native/__tests__/parity.test.tsx`): every case's ids, in
  order, read back out of the mounted native tree — not out of the selectors a
  second time. Sharing a kernel is an architecture claim; this is the
  measurement. It carries a falsifiability leg.
- **The tarball canary imports AND requires `./catalog/native`**, checks every
  documented export, proves the theme override merges over the PACKED build,
  proves the icon degradation announces exactly once with its remedy, and
  compiles a native usage (including an `AsyncStorage`-shaped `storage`) against
  the packed types under `exactOptionalPropertyTypes` + `noUncheckedIndexedAccess`.
- **The banner canary now judges eight artefacts**: the `"use client"` prologue
  must be present on both `catalog/react` builds and ABSENT from all four
  `catalog/index.*` and all four `catalog/native/index.*` files.

### Known limits, stated plainly

There is still **no React Native canary harness** in this workspace (campaign
decision C7 schedules it for Phase 2), and the real `react-native` package
cannot be loaded by vitest — it ships Flow-typed source only Metro parses. The
native tests therefore render against a minimal RN stand-in
(`catalog/native/__tests__/react-native.stub.tsx`) that maps RN primitives onto
DOM nodes. That proves rows, order, labels, counts, handlers and every
announced degradation. It does **not** prove pixel layout, gestures or Hermes —
those are proven by the consuming Expo app's own build and device smoke.

## 0.8.0 — 2026-09-08

**THE ORCHESTRA BADGE IS BACK, in every client at once.**

An **Orchestra** is a conductor agent that delegates to member agents at run
time: choosing one for a step, a chat or a workflow node runs the whole
ensemble. The Workflow Studio's old hand-rolled picker showed that — a
conductor marker, the member count, the run mode, the tagline and the member
titles — because the Python route `GET /agents` stamped it from
`platform.associations`.

Every picker on the platform now reads the RPC `agx_get_list_full`, and that
RPC had no such column. So the day the pickers unified, EVERY client lost the
badge at once, and an Orchestra became indistinguishable from an ordinary
agent in the one place where the difference decides what happens next.

The fix is in the read every client shares, not in any client.

### Consumer action (C28)

**None for the badge — it appears by itself.** The column is served by the
platform RPC, this package parses it, and the picker renders it. Update to
`0.8.0` (hosts on `"latest"` get it on their next install) and any Orchestra in
the list wears its marker.

**One import path changed, compatibly:** `SORT_OPTIONS` now lives in the pure
`@ai-matrx/agents/catalog` entry. `@ai-matrx/agents/catalog/react` re-exports
it unchanged, so nothing breaks — but a server-reachable module that only wants
the five sort labels should import it from `./catalog` and stop dragging the
`"use client"` bundle into a server graph.

**Rendering your own summary of a chosen agent?** Use the exported `Music4Icon`
and `orchestraLabel` / `orchestraDelegatesLine` / `orchestraDepthLine` rather
than writing a second vocabulary for the same badge.

### What is new

- **`AgentSummary.orchestra: OrchestraBadge | null`** — strict, on every row.
  `{ mode, tagline, depthBudget, memberCount, memberTitles }`, camelCased from
  the new nullable `orchestra jsonb` column.
- **`AgentRow`** carries the conductor marker: the Orchestra glyph plus the
  member count, titled with the delegates line. Absent on an ordinary agent —
  never a dead or empty chip.
- **`AgentDetailCard`** leads with the Orchestra block — "Orchestra · supervisor
  · 4 members", the tagline, "Delegates to: …" (collapsing past three into
  "+N more") and the declared delegation depth. It sits ABOVE the description
  because it changes what selecting this agent MEANS.
- **`orchestraLabel` / `orchestraModeLabel` / `orchestraDelegatesLine` /
  `orchestraDepthLine`** — the Creator words, ported verbatim from the studio
  picker, exported from both entries.
- **`Music4Icon`** — inlined SVG (C19), the same glyph the studio used.
- **`assertAgentCatalogSchema`** reports `orchestraColumn: boolean | null`: a
  database that predates the column is VISIBLE, not silently badge-less.

### The platform side

Migration `matrx-frontend/migrations/agx_list_orchestra_badge_column.sql` adds
a trailing nullable `orchestra jsonb` to `agx_get_list`, `agx_get_list_full`
and `agx_search`, built by ONE new helper `public.agx_orchestra_badges()` —
the conductor self-edge (`source_type='agent'`, `source_id=target_id`,
`role='orchestra'`) for mode/tagline/depth_budget, its `role='member'` edges
for the count and the non-empty labels. Membership, `ORDER BY`, `SECURITY
DEFINER`, `search_path` and every grant are unchanged; the page is cut BEFORE
the badge join so `LIMIT`/`OFFSET` still bite on exactly the rows they did.

### Deliberate deltas, said out loud

- **`depthBudget` is what the composition DECLARED, and `null` when it declared
  nothing.** The old studio badge printed the EFFECTIVE ceiling, defaulting to
  the platform constant `PROJECTED_AGENT_MAX_RECURSION_DEPTH`. That constant
  lives in the Python that enforces it; copying it into SQL and again into
  TypeScript would be three places to drift. So a composition with no declared
  budget shows no depth line at all, rather than a number nobody wrote.
- **The literal token "orchestra" is not searchable.** The studio's picker let
  an author type the word and see only ensembles. The canonical scorer this
  package ports (from matrx-frontend) never had that, and adding it would
  change the 295-case parity matrix. Not ported; recorded here rather than lost.

### Proof

`catalog/__tests__/orchestra.test.ts` layers conductor rows onto the SAME
66-row parity fixture and asserts the badge survives the parser, every sort,
the user/builtin split and a real filtered-search selector, pinned to literal
expectations (comparing output to input passes trivially when both are null —
which is the regression it exists to catch). `catalog/react/picker.test.tsx`
renders a conductor beside an ordinary agent and asserts the marker, its count,
its hover text and its ABSENCE on the ordinary row. Both proven RED on a
deliberate perturbation and GREEN restored.

## 0.7.1 — 2026-09-08

**0.7.0's two catalog entries did not typecheck together.** `./catalog` and
`./catalog/react` are emitted by two separate tsup passes (only the react group
carries the `"use client"` banner), so each `.d.ts` holds its own copy of the
shared declarations. `AgentId` was branded with a `unique symbol`, which is
NOMINAL — the two copies were unrelated types, and the wiring the 0.7.0
`Consumer action` prescribes:

```tsx
<AgentCatalogProvider catalog={createAgentCatalog({ client, identity })}>
```

failed with *"Two different types with this name exist, but they are
unrelated"* in every consumer. Every runtime canary was green; only a `tsc` in
a real host caught it (matrx-extend, on its first compile of the adoption).

### Consumer action (C28)

Update to 0.7.1 and the documented wiring compiles. No source change is needed
in a host — if you worked around this with a cast, DELETE the cast.

### The fix, and the guard

- `AgentId` is now branded with a string literal
  (`string & { readonly __agentId: "ai-matrx.agent-id" }`). A literal brand is
  structural, so the two emitted copies unify; a bare `string` still cannot be
  passed where an `AgentId` is required, so the branding is not weakened. Any
  future brand in this package follows the same rule — the reason is recorded
  at the declaration.
- `scripts/verify-tarball.mjs` grew THE TWO-ENTRY TYPE-IDENTITY CANARY: it
  installs the packed tarball into a scratch consumer with `strict`,
  `exactOptionalPropertyTypes`, `noUncheckedIndexedAccess` and
  `skipLibCheck: false`, then compiles the real provider wiring plus reads that
  cross the seam in both directions. Proven RED against the 0.7.0 brand
  (the same "two different types" error, from the packed types) and GREEN
  after the fix. It runs inside `pnpm check:package`, which the publish
  workflow gates on.

## 0.7.0 — 2026-09-08

**THE ONE AGENT PICKER moves into the package.** Two new entries — `./catalog`
(pure) and `./catalog/react` (client-stamped) — carry the whole of
matrx-frontend's canonical agent picker: the complete-list read, filter / sort /
search / tabs / counts, the favourite write, the mandate-resolved default row
with its drift screamer, and both picker shells. Owner ruling (Arman,
2026-09-08): the picker and ALL its logic live in the package; an app provides
identity and a Supabase client and nothing else, and the host's only contract
is `onSelect(agentId)`.

Every existing entry is untouched. This release is purely additive.

### Consumer action (C28)

1. **Install nothing new.** `@ai-matrx/design-system` is now an ordinary
   dependency of this package (`"latest"`, per THE LATEST LAW).

2. **Create the catalog ONCE and mount the provider ONCE:**

   ```ts
   // lib/agents/catalog.ts
   import { createAgentCatalog } from "@ai-matrx/agents/catalog";

   export const agentCatalog = createAgentCatalog({
     client: supabase,                                   // REQUIRED
     identity: { requireUserId: () => requireUserId() }, // REQUIRED (throws when signed out)
     transport,        // REQUIRED only if a picker passes `defaultMandateKey`
     errorSink,        // optional — default: a tagged console.error naming the remedy
     notifier,         // optional — the drift banner is the primary scream either way
     storage,          // optional — default: localStorage when it answers, else memory
     labels,           // optional — every user-visible string
   });
   ```

   ```tsx
   // app providers
   import "@ai-matrx/agents/catalog/styles.css";
   import { AgentCatalogProvider } from "@ai-matrx/agents/catalog/react";

   <AgentCatalogProvider
     catalog={agentCatalog}
     LinkComponent={Link}            // optional — default: a plain <a> (cmd-click works)
     navigate={router.push}          // optional — default: window.location.assign
     renderModelRef={renderModelRef} // optional — default: the model id as text
     openPeek={openSneakPeek}        // ABSENT → the peek affordance is hidden, never dead
     popoverContainer={dialogContainer}
   >
     {children}
   </AgentCatalogProvider>
   ```

3. **Register this package's build with your Tailwind source scan**, exactly as
   you already do for `@ai-matrx/design-system` — the picker's layout uses
   ordinary utilities and your Tailwind only generates what it can see:

   ```css
   @import "tailwindcss";
   @source "../node_modules/@ai-matrx/agents/dist";
   ```

4. **Swap the imports; the prop surface is unchanged.** `AgentListDropdown`
   and `AgentListInlinePicker` keep every prop they had (`onSelect`,
   `navigateTo`, `activeAgentId`, `contentSide`, `consumerId`, `initialTab`,
   `includeSystemInAll`, `visibleTabs`, `systemTabLabel`, `resolveAgentHref`,
   `showPinnedAgent`, `excludeAgentIds`, `triggerSlot`, `noBorder`, `compact`)
   and gain `defaultMandateKey`.

5. **Files a host can DELETE once it adopts** (matrx-frontend paths; the same
   shapes exist in matrx-extend and matrx-local):
   - `features/agents/redux/agent-consumers/slice.ts`
   - `features/agents/redux/agent-consumers/selectors.ts`
   - `features/agents/search/score.ts`
   - `features/agents/constants/agent-list-labels.ts`
   - `features/agents/hooks/useAgentConsumer.ts`
   - `features/agents/hooks/useServerAgentSearch.ts`
   - `features/agents/components/agent-listings/AgentListDropdown.tsx`
   - `features/agents/components/agent-listings/AgentListInlinePicker.tsx`
   - `features/agents/components/agent-listings/useAgentListCore.ts`
   - `features/agents/components/agent-listings/core/*` (AgentListContent,
     AgentListTabs, AgentFilterBar, AgentRow, AgentDetailCard, AgentSortPanel,
     AgentCategoriesPanel, AgentTagsPanel, AgentMobileSubView, primitives, types)
   - `features/agents/components/agent-listings/FavoriteAgentButton.tsx`
   - the `agentConsumers` reducer registration in the store
   - matrx-extend `PilotAgentPicker`, `AgentPicker`, `scope.ts`, the Settings
     default-agent `PillSelect`; matrx-local `AgentPicker.tsx` and its
     `fetchCloudAgents` sort — plus every hardcoded default-agent NAME.

### `@ai-matrx/agents/catalog` — the headless kernel (pure, no banner)

- `createAgentCatalog(config)` — required ports `client` (a structural subset
  of `SupabaseClient`: `rpc`, `schema().from()`) and `identity.requireUserId()`;
  a missing one throws `AgentCatalogConfigError` with a remedy. Optional
  `errorSink`, `notifier`, `storage`, `transport`, `labels`, `catalogId`, each
  with a working default and a documented degradation.
- The complete-list read (`agx_get_list_full`), the tier-2 server search
  (`agx_search`), the single-agent name read (`agx_resolve_agent_address`), and
  the ONE write (`agent.definition.is_favorite`, optimistic with rollback).
- Per-consumer view state keyed by `consumerId` (tabs, sort, search, favourite
  / archive / access filters, category and tag inclusion, paging, server-search
  results) plus every selector: `filterUserTypeAgents`,
  `filterBuiltinTypeAgents`, `sortFilteredAgents`, `applyAgentSortComparator`,
  `makeSelectFilteredAgents`, the five count selectors, the four split
  category/tag option selectors, `AGENT_NONE_SENTINEL`, and the scorer.
- `assertAgentCatalogSchema(client)` — the demanded-schema probe, with a
  `selfTest` leg that refuses a probe which cannot fail.
- Branded `AgentId`; strict types throughout (`exactOptionalPropertyTypes`,
  `noUncheckedIndexedAccess`, zero `any`).
- No module-level mutable state: the catalog registry, the in-flight list
  promise, the freshness stamp and the default-row cache live on `globalThis`
  under `Symbol.for("ai-matrx.agents.catalog")`.

### `@ai-matrx/agents/catalog/react` — the picker (client-stamped)

`AgentCatalogProvider`, `useAgentCatalog`, `useAgentConsumer`,
`useAgentListCore`, `AgentListDropdown`, `AgentListInlinePicker`,
`AgentListContent`, `AgentListTabs`, `AgentFilterBar`, `AgentRow`,
`AgentDetailCard`, `AgentSortPanel`, `AgentCategoriesPanel`, `AgentTagsPanel`,
`AgentMobileSubView`, `FavoriteAgentButton`, the primitives, and
`./catalog/styles.css` (structural CSS + a default token sheet; no hardcoded
color in any component). React stays an optional peer; the ~20 Lucide glyphs
are inlined SVGs (C19 — no icon dependency).

### The default row, and THE DRIFT SCREAM (design D3)

A picker instance may pass `defaultMandateKey`. The catalog resolves the
Holder through the aidream door `GET /mandates/{mandate_key}/resolution`
(verified against `aidream/api/routers/mandate_bindings.py`
`get_mandate_resolution`, mounted at prefix `/mandates`) using the injected
`transport` — 🚨 clients NEVER walk the mandate ladder themselves (D-R1), so a
`defaultMandateKey` with no transport throws a typed config error. The row
renders the Holder's REAL name and description; its id stays
`mandate:<key>`, byte-identical to the ref shape matrx-extend and matrx-local
already hand their hosts. The last resolution is cached for first paint, and
whenever cached and live disagree on holder id or holder name the picker shows
a PERSISTENT in-picker banner and calls the `notifier` — never console-only.
This kills the class that made matrx-local's row say "Matrx Desktop Agent"
while `local.cloud_chat` resolved to General Chat.

### Behavioural deltas from the matrx-frontend original (recorded, never silent)

1. **The list read is now COMPLETE OR LOUD.** `fetchAgentsListFull` issued a
   bare `.rpc("agx_get_list_full")`, which PostgREST silently caps at
   `db-max-rows` (1000). The package reads through `@ai-matrx/data`'s
   `readAllRows` with `{ count: "exact" }` and a stable `.order("id")`, so a
   truncated catalogue is an `IncompleteReadError`, not a short picker. Row
   ORDER from the DB was already irrelevant — every row is re-sorted client
   side.
2. **"Clear (n)" now clears n.** `AgentCategoriesPanel`, `AgentTagsPanel` and
   `AgentMobileSubView` ran `includedCats.forEach(toggleCategory)`; each toggle
   computes its next array from the same render's snapshot, so three toggles in
   one tick removed exactly ONE category. matrx-frontend's own
   `useAgentConsumer` documents the hazard and names `setIncludedCats` as the
   fix; the call sites never adopted it. They do here.
3. **`AGENT_PUBLIC_BADGE_LABEL` was dead.** The frontend declared it as the
   builtin row's badge label ("Public") and `AgentRow` rendered the literal
   `system`; nothing ever read the constant. The badge is now the
   `labels.systemBadge` port, defaulting to `"system"` — the string that
   actually shipped.
4. **No app-wide "active agent" store.** By ruling D1 that is host state, so
   the pinned row comes from the `activeAgentId` prop alone; the frontend's
   fallback to a Redux `activeAgentId` has no package twin.
5. **A click never goes nowhere.** A call site passing neither `onSelect` nor
   `navigateTo` used to `dispatch(setActiveAgentId(...))`; here it reports to
   the `errorSink` instead of silently doing nothing.
6. **`isVersion` filtering is structural, not conditional.** The frontend's
   `selectLiveAgents` strips version snapshots out of a store that also holds
   them; this catalog only ever holds list rows, so the filter is a no-op and
   is not ported. Every ordering, tie-break and count is unchanged.
7. **Three class names are package-owned.** `scrollbar-none`,
   `animate-in fade-in-0` and `animate-spin` came from the host's own globals
   or a Tailwind plugin; a package never invents a class name and expects the
   consumer to generate it, so they ship here as `matrx-agent-scrollbar-none`,
   `matrx-agent-fade-in` and `matrx-agent-spin`. The amber favourite star and
   the drift banner are `--matrx-agent-*` tokens with default values.
8. **Server search is folded into `useAgentConsumer`.** The frontend's separate
   `useServerAgentSearch` hook was wired in exactly one place — here — so it
   is one hook, with the same debounce (250ms), the same 2-character floor and
   the same stale-response guard.

### Parity proof

`matrx-frontend/scripts/agent-picker-parity-fixture.ts` runs THE ORIGINAL
matrx-frontend selectors over 66 realistic `agx_get_list_full` rows (owned,
directly-shared, org-shared, builtin, favourites, archived, null names, null
categories, untagged rows, unicode, duplicate names, colliding timestamps)
across a 295-case matrix — every tab × every sort × favoritesFirst × favourite
filter × archive filter × access filter × category and tag inclusion including
the none-sentinel × ten search queries × server-matched ids × the admin blended
"All" — and writes the expected ordered id lists, counts and option lists to
`catalog/__tests__/parity-expected.json`. `catalog/__tests__/parity.test.ts`
asserts the ported selectors reproduce all of it exactly, and carries a
falsifiability leg that requires a perturbed row to turn the matrix red.

## 0.6.2

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

## 0.6.1

Automatic changed-only republish (docs/metadata drift since v0.6.0; dist verified
byte-identical to v0.6.0). No source changes and no consumer action required.

## 0.6.0 — 2026-08-30

### Consumer action (C28)

- Rebuild your transport wiring as identity injection over `createMatrxTransport`
  (base URL/resolver, `CredentialsPort`, org id, diagnostics sinks) — the retry/timeout,
  v2→v1 protocol fallback, error classification, and org-header logic now live HERE and
  must be deleted from host code (matrx-frontend exemplar: `lib/api/matrx-transport.ts`).
- Replace hand-rolled runtime-reconnect loops with `getRuntimeOperationsByLink` +
  `followRuntimeOperationToEnd` (defaults = the former production values: 45s stall,
  60×2s budget).
- `lib/api/organization-context.ts`- and `ai-api-version.ts`-style host modules become
  re-exports of the package kernels (`/matrx` org-context + protocol exports).

- **The production transport moved IN** (C22 — the hard parts live in the
  package; hosts inject only identity). `@ai-matrx/agents/matrx` now ships
  `createMatrxTransport({ baseUrl | resolveTarget, credentials, organizationId? })`
  with everything else defaulted to the proven production values:
  - connect timeout 15s / total UNCAPPED (stream-safe) over
    `@ai-matrx/data/net`'s `resilientFetch` — `@ai-matrx/data` is now an
    ordinary dependency (sanctioned sibling dep, C23/X3);
  - the AI API protocol-version policy (`applyAiApiVersion`, default v2, the
    scoped covered-surface allowlist) + the loud v2 → v1 transport fallback
    (`fetchWithMatrxProtocolFallback`) — a caller abort is never logged as a
    downgrade;
  - credentials read FRESH per call through `@ai-matrx/data`'s
    `CredentialsPort` / `credentialToHeaders` (token refresh mid-run picked
    up); resolver policy headers supported for dynamic channels;
  - the fail-closed `X-Organization-Id` kernel
    (`requireOrganizationContext` / `applyOrganizationContextHeader` /
    `assertQueryOrganizationMatchesContext`, moved verbatim from
    matrx-frontend `lib/api/organization-context.ts`) — configured lanes
    refuse before the wire, conversation lanes send org in the body only;
  - the ONE error classification: `normalizeMatrxError` → `MatrxCallError`
    (structurally compatible with matrx-frontend's `ApiCallError`);
  - a typed diagnostics seam (`onRequest` / `onError` /
    `onProtocolDowngrade`) with `expectedErrorStatuses` suppression;
  - policy/credential `Content-Type` is stripped defensively — the wire owns
    it (a policy Content-Type merged over a GET SSE call corrupts the wire).
- **The reconnect policy moved IN**: `followRuntimeOperationToEnd` — the full
  production replay-then-follow loop (45s stall watchdog, 60 × 2s reconnect
  budget reset by ANY parsed frame, durable `Last-Event-ID` cursor across
  attempts), previously hand-rolled in matrx-frontend
  `features/agents/runtime-reconnect/api.ts`. Fix over the ported original
  (recorded per C22): the stall watchdog now also covers the connect phase,
  so a hanging connect can no longer wedge an attempt forever.
- **New `/react` entry** (client-stamped): `useAgentRun`
  (start / continue / cancel + streamed state as the parity-proven
  `AgentRequestProjection`) and `useFollowRuntimeOperation` (the reconnect
  follower as a hook, production knobs typed). `react >= 18` is an optional
  peer needed only by this entry.

## 0.5.1 — 2026-08-29

- Clarified the package boundary in the published README: `@ai-matrx/agents`
  talks to the fully assembled AI Dream brain, while
  `@ai-matrx/agent-engine` runs a brain the embedder assembles locally.

## 0.5.0 — 2026-08-29

- Added `@ai-matrx/agents/matrx` — the Matrx API client: run an agent
  end-to-end against the AI Matrx server over ONE injected, fetch-shaped
  `MatrxTransport` port (base URL, credentials, org header, retry, and
  diagnostics stay the host's job — this package never implements auth).
  - The conversation-start contract as a discriminated union (client-minted
    `conversation_id`, `is_new`, `store`; ephemeral `prior_messages` is only
    representable with `store: false`) plus builders for all four cells.
  - Run lifecycle: `startAgentRun` (`POST /ai/agents/{id}`),
    `continueAgentConversation`, `resumeAgentConversation`, `cancelAgentRun`
    (`X-Request-ID` only), and `runAgentToCompletion` — every stream parsed
    through the package's own NDJSON kernel; `stream: true` is forced so a
    caller flag can never flip the response off NDJSON. `X-Request-ID` /
    `X-Conversation-ID` surface on the handle before any event.
  - Reconnect surface: identify by request id or feature link, durable
    seq-cursored event pages, `followRuntimeOperationEvents` (SSE
    replay-then-follow with `Last-Event-ID`, riding `stream/sse`; comment
    heartbeats and malformed frames surface as liveness, terminal `end`
    carries the root status), and `rejoinRuntimeOperation` (replay the
    original NDJSON response; 409 = fall back to the lifecycle stream).
  - Delegated tools: `submitAgentToolResults` (idempotent; the
    `continuation_needed` signal for `/resume`), per-conversation and
    per-user pending-call discovery with optional instance claim.
  - `MatrxApiError` preserves the server's structured error body and extracts
    its richest message/code (`user_message` → `message` → joined details →
    FastAPI `detail` shapes).
  - Every route, header, and response shape verified against the aidream
    server source (routers `agents`/`conversations`/`cancel`/
    `runtime_operations`, matrx-connect's streaming response headers).

## 0.4.0 — 2026-08-28

- Added `@ai-matrx/agents/stream/sse` — the pure incremental `text/event-stream`
  frame kernel (`createMatrxSseFramer`, `parseMatrxSseFrame`,
  `readMatrxSseStream`). Extracted from the two identical hand-rolled parsers in
  the Matrix rejoin paths; covers all three SSE line/frame terminators by
  construction (the production CRLF incident), byte-split UTF-8, comment
  heartbeats as liveness-bearing frames, integer `id:` surfaced as the
  `Last-Event-ID` cursor, and unterminated tails reported as diagnostics rather
  than delivered as events. Host policy (fetch, stall timers, retry budgets,
  cursor advancement) deliberately stays host-side.

## 0.3.0 — 2026-08-24

- Added a transport-independent incremental NDJSON framer for fragmented text
  and bytes, including split UTF-8 and unterminated trailing input.
- Added exact valid-envelope observation, physical-line malformed diagnostics,
  cancellation proof, bounded configurable read-ahead, and ordered partial
  transport failure behavior.
- Preserved top-level `stream_seq` through wire normalization so projector
  replay suppression receives the server's transport sequence.
- Aligned tool status semantics with execution: server `tool_started` remains
  streaming; only `tool_delegated` suspends for client work.
- Bounded workflow render-block assembly by open sets, frames, and UTF-8 bytes;
  malformed or invalid completions now produce typed diagnostics instead of
  disappearing silently.
- Expanded TypeScript checking to include every projection source and test.

## 0.2.1 — 2026-08-24

- Published the documented workflow projection entry point that workspace
  consumers already used but the immutable 0.2.0 registry artifact omitted.
- Added the portable workflow `node_stream` projection inlet with strict
  answer/reasoning separation, bounded render-block assembly, replay
  suppression, and shadowed-text state.
- Added every request and workflow projection test to the normal package test
  gate; the previous Vitest include list silently ran only stream and
  presentation tests.

## 0.2.0 — 2026-08-22

- Added a framework-free request event projector for identity, status, answer/reasoning, phases, operations, tools, render blocks, Content IR metadata, completion, and errors.
- Added golden lifecycle fixtures, replay suppression, and copy-on-write guarantees.
- Added conditional ESM/CommonJS artifacts and loader canaries for mixed Vite, Next.js, and Jest consumers.

## 0.1.0 — 2026-08-22

- Published the canonical NDJSON stream reader and envelope normalizer.
- Published the copy-on-write result projection that removes provider-private
  reasoning and signature material from Creator-facing output.
- Added strict tests, ESM declarations, packed-artifact validation, and an
  isolated consumer import canary.


