Skip to content

docs: add matrix legends and abbreviate Not documented to ND - #535

Merged
jpr5 merged 1 commit into
mainfrom
docs/matrix-legend-nd
Oct 12, 2026
Merged

jpr5 merged 1 commit into
mainfrom
docs/matrix-legend-nd

Conversation

@jpr5

@jpr5 jpr5 commented Oct 12, 2026

Copy link
Copy Markdown
Contributor

What

  • Every competitive comparison table now has a one-line legend directly beneath it. The legend
    lists only the marks that table uses, and reuses the cell glyph markup so the colours match.
  • The homepage matrices replace all 45 Not documented cells with
    <abbr title="Not documented">ND</abbr>. Links and the <!-- C-X.. --> claim comments on
    those cells are unchanged. No ✓/✗/partial judgment changed.
  • One shared class, .matrix-legend (small, muted, margin: 0.35rem 0 0), is defined in the
    homepage <style> block and in docs/style.css. No cell padding, borders or spacing changed.

Why

Not documented wrapped to two lines in narrow competitor columns, which made rows taller and
pushed the VidaiMock column wider. ND with a tooltip keeps the tables tight, and the legend
explains the marks.

Pages and legends

Page / table Legend
docs/index.html, LLM and protocol mocking ✓ supported · partial · manual · ✗ not supported · ND not documented
docs/index.html, Agent tool mocking ✓ supported · partial · ✗ not supported · ND not documented
migrate-from-mock-llm, -mokksy, -msw, -piyook, -python-mocks ✓ supported · ✗ not supported
migrate-from-openai-responses ✗ not supported (the only mark in that table)

migrate-from-vidaimock uses Yes/No text and no marks, so it gets no legend. The
python-mocks "The libraries" table has no marks either, so it gets none.

RED (before the docs change)

src/__tests__/docs-matrix-legend.test.ts
 × index.html #0 is followed by a legend listing exactly its marks
 × index.html #1 is followed by a legend listing exactly its marks
 × migrate-from-mock-llm/index.html #2 ... (all 8 tables) ...
 × index.html has no 'Not documented' cell text
 × renders the homepage's former 'Not documented' cells as ND abbreviations
 × styles the legend with one shared class on each stylesheet
src/__tests__/competitive-matrix-homepage.test.ts
 × places model misbehavior after chaos with eight aligned sourced cells

GREEN (after)

 Test Files  2 passed (2)
      Tests  62 passed (62)

Gates

  • pnpm format:check, pnpm lint, pnpm typecheck, pnpm build: pass
  • pnpm test: 378 files, 14141 passed, 3 skipped
  • scripts/update-competitive-matrix.ts --dry-run: the summary file is byte-identical on
    origin/main and on this branch ("No homepage matrix changes detected"). The scan reads ND
    cells as free text, never as ✗. No script change was needed: neither scan script contains the
    literal Not documented.

Visual check

I took screenshots and looked at them at 375x667, 430x932 and 1440x900 (the site has one dark
theme), before and after, for both homepage tables and the mock-llm, msw, openai-responses and
python-mocks tables:

  • At desktop width each legend is one line (18–20px tall), aligned to the table's left edge.
    At 375px it wraps to two compact lines. No page-level horizontal overflow is added.
  • ND cells take one line. The main homepage matrix is 195px shorter at desktop (3207 → 3012) and
    140px shorter at 375px. The VidaiMock column is 12px narrower at desktop and 6px narrower at
    375px. Other columns are held by their nowrap headers. At desktop the table stays 100% wide, so
    the freed pixels move to the Capability column (+8px), which lets some row labels fit on one
    line.
  • The migration tables have identical dimensions before and after. Only the legend is added.

Each competitive comparison table now has a one-line legend directly
beneath it, listing only the marks that table uses and reusing the cell
glyph markup so the colours match. The homepage matrices replace their 45
"Not documented" cells with <abbr title="Not documented">ND</abbr>, so
those cells no longer wrap to two lines.

The VidaiMock migration table uses Yes/No text and no marks, so it gets
no legend. The competitive scan parses ND cells as free text, and its
dry run output is unchanged.
@pkg-pr-new

pkg-pr-new Bot commented Oct 12, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@copilotkit/aimock@535

commit: c77e040

@jpr5
jpr5 merged commit f028c00 into main Oct 12, 2026
30 checks passed
@jpr5
jpr5 deleted the docs/matrix-legend-nd branch October 12, 2026 21:16
@jpr5 jpr5 mentioned this pull request Oct 20, 2026
jpr5 added a commit that referenced this pull request Oct 21, 2026
> **DO NOT MERGE until Jordan says ship — merging publishes to npm.**
>
> `publish-release.yml` runs on every push to `main`. Merging this PR
publishes npm
> `@copilotkit/aimock@1.46.0`, the `v1.46.0` tag, the `v1` major-tag
move, the GitHub Release,
> the Docker images and the Slack announcement.

Minor release npm/plugin **1.46.0** from `main` at 02c72c8 (#568
merged). Rebuilt on top of
#563–#568. aimock-pytest keeps its own version (`pyproject.toml`
unchanged); only its default
aimock pin moves to 1.46.0, because this release adds server routes the
pytest client can call.

Every new behavior is additive or opt-in. The CHANGELOG has no `Changed`
section. Defaults match
v1.45.1: inbound-auth 401 bodies stay legacy (#566), non-streaming
replies stay instant (#567), and
shared `GET /v1/models` returns the OpenAI-format list for every header
set (#568). The only
default output changes are the bug fixes under Fixed.

## CHANGELOG

## [1.46.0] - 2026-10-20

### Added

- Gemini model list/detail, Anthropic model detail, and token-count
routes (#542, #551)
- Opt-in policies: `requiredHeaders`, native `authErrors`, native
`modelCatalog` (#542, #566, #568)
- Opt-in fixture `nonStreamingTiming: true` delays non-streaming OpenAI
chat replies (#545, #567)
- Anthropic/Bedrock cache usage kept in replay and record; Responses
`phase` override (#531, #542)

### Fixed

- Ollama embed batches, AG-UI thread/run IDs, empty MCP reads, Anthropic
aborts (#533, #553, #557)

## What the bullets cover

The `[Unreleased]` section had 16 entries, grouped into the 5
Slack-bound bullets above:

- **Model routes (#542, #551):** Gemini `GET /v1beta/models` list/detail
and the new
`GET /v1/models/{id}` detail route, with provider paging and synthetic
metadata;
`count_tokens` / `:countTokens` estimates that never proxy or record.
Anthropic
`after_id`/`before_id` cursor validation applies only to the opt-in
Anthropic list.
- **Opt-in policies (#542, #566, #568):** all are off by default. Set
them with the `policy`
  option, `llm.policy`, `--policy`, or the `X-AIMock-Policy` header.
- `requiredHeaders: "enforce"` rejects Anthropic requests without
`anthropic-version`.
- `authErrors: "native"` returns provider-native 401 bodies on Anthropic
Messages/count and
Gemini/Vertex HTTP paths. The default `"legacy"` keeps `error.code:
"invalid_api_key"`.
- `modelCatalog: "native"` returns the Anthropic-format paged list on
shared `GET /v1/models`
for `anthropic-version` or `x-api-key`-only requests. The default
`"legacy"` returns the
1.45 OpenAI-format list for every request. Anthropic SDK `models.list()`
users must opt in.
- **Opt-in non-streaming timing (#545, #561, #567):** OpenAI chat
completions with `stream: false`
only. A fixture with `nonStreamingTiming: true` plus a
`streamingProfile` or `recordedTimings`
delays the JSON reply by about its streamed duration (text, tool-call,
combined content+tool-call
and `blocks`). Without the field, `stream: false` replies return
immediately, as in 1.45.1.
- **Cache usage, phase (#531, #542):** Anthropic Messages and Bedrock
Claude preserve fixture cache
usage (with the TTL breakdown) in replay and record; Responses `phase`
override
  (`commentary` | `final_answer`) on HTTP, SSE and WebSocket.
- **Fixes (#533, #553, #557):** these are the only default output
changes. Each one corrects
  output that real clients mishandled before.
- Ollama `/api/embed` returns `embeddings: [[...]]` with one vector per
input, and its errors are
plain strings. Recorded embedding fixtures get optional
`match.embeddingRequest` criteria.
    `/api/embeddings` keeps its legacy single-vector response.
- AG-UI convenience builders echo the request's thread/run IDs and mint
fresh message/tool-call
    IDs. Explicit event fixtures keep their authored IDs.
- MCP `resources/read` for a resource with no content returns `"text":
""` and falls back to the
    definition's `mimeType`, so the response passes the MCP schema.
- Anthropic Messages streaming stops on client disconnect. The journal
records
    `interrupted: true` / `interruptReason: "client aborted"`.

Left out of the bullets: the Bedrock SDK `NodeHttpHandler` example fix
(#553, docs only).

Not in the CHANGELOG: drift-sync, drift diagnostics, competitor-scan,
adoption-wall, dependency and
docs PRs (#532, #534, #535, #536, #541, #543, #546, #554, #555, #556,
#558, #559, #560, #563, #564,
#565). They do not change the published package.

## Versions

| Surface | Before | After |
|---|---|---|
| `package.json` `version` | 1.45.1 | 1.46.0 |
| `.claude-plugin/plugin.json` `version` | 1.45.1 | 1.46.0 |
| `.claude-plugin/marketplace.json` `plugins[0].source.version` |
^1.45.1 | ^1.46.0 |
| `charts/aimock/Chart.yaml` `appVersion` (chart `version` unchanged) |
1.45.1 | 1.46.0 |
| `docs/index.html` CLI banner | aimock v1.45.1 | aimock v1.46.0 |
| `packages/aimock-pytest/src/aimock_pytest/_version.py`
`AIMOCK_VERSION` | 1.45.1 | 1.46.0 |
| `packages/aimock-pytest/README.md` `--aimock-version` default | 1.45.1
| 1.46.0 |

Left at 1.45.1 on purpose: CHANGELOG history;
`src/__tests__/package-types-compat.test.ts`, which
compiles a consumer against the published 1.45.1 types; and the
`server.test.ts` comment that names
the 1.45.1 default timing. `packages/aimock-pytest/pyproject.toml` keeps
its own version.

`CHANGELOG.md`: `[Unreleased]` became `[1.46.0] - 2026-10-20` with an
empty `[Unreleased]` kept
above it, as in prior releases.

`package.json` `description` matches the README subtitle exactly
(`publish-release.yml` re-syncs it
on merge anyway).

## Local gates

Run on the release commit tree (origin/main 02c72c8 + this commit):

- `pnpm install --frozen-lockfile`: pass
- `pnpm format:check`: pass
- `pnpm lint`: pass
- `pnpm typecheck`: pass
- `pnpm build`: pass
- `pnpm test`: pass (432 files; 17605 passed, 11 skipped), including
`npm-publish-verify-workflow`,
`unreleased-check-workflow`, `release-workflows`,
`publish-pin-workflow`, `version` and
  `package-types-compat`
- `pnpm test:exports` (publint + attw): pass
- `pnpm api:report`: pass, 14 entries, `etc/` unchanged
- `commitlint` on the release commit: pass
- `unreleased-check.yml`: no `v1.46.0` tag exists, so the release push
skips the check (by design)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant