Pre-launch 4 Chromium instances at service boot and check out/return
BrowserContext handles instead of spawning fresh processes per probe.
Eliminates the pthread_create EAGAIN failures when multiple e2e probes
fire simultaneously by capping concurrent Chromium processes at 4.
Pool recycles browsers after 100 contexts (configurable via
BROWSER_POOL_RECYCLE_AFTER) to prevent native memory drift.
Also staggers e2e-demos cron from minute 0 to minute 5 to reduce
probe alignment overlap.
Remove the "Tokyo" city label check from d5-tool-rendering's
validateProbe — some integrations render the weather card with
only temperature and condition, omitting the city name from the
card element's textContent. The card structure (selector matched,
numeric temperature, childCount >= 1) is the real D5 signal.
Reduce d5-mcp-subagents EXPECTED_REPLY_FRAGMENTS from 5 exact
phrases to 2 ("remote work", "talent pool") — some integration
runtimes truncate or rephrase the streamed text so the original
verbose fragments caused false negatives. The D5 signal is chain
completion, not exact phrase fidelity.
Tests updated to match the relaxed assertions.
The "no demo" X marks are text-center while depth chips and overlay
content were text-left, causing visual misalignment across all overlay
views. Center both the td and the ComposedCell flex column.
The framework picker (sidebar + dropdown) and docs landing integration
grid previously rendered initials-as-image fallbacks (e.g. 'LG', 'Ma',
'Py') from /logos/<slug>.svg placeholder files. Replace with inline
SVG icons that use currentColor so they tint with the surrounding
text and adapt to light/dark mode.
Covers langgraph (python/typescript/fastapi), mastra, pydantic-ai,
crewai, agno, ag2, llamaindex, strands, google-adk, microsoft (ms-
agent-python/dotnet), claude-sdk (anthropic mark), and spring-ai.
Slugs without a branded mark fall through to the existing placeholder
SVG (currently only langroid).
Mirrors the upstream docs nav by adding a Free Developer Access link
to cloud.copilotkit.ai in the BrandNav, persistent across both the
CopilotKit and AG-UI tabs. Renders with cloud icon + external-link
arrow on desktop (icon-only below 1100px) and as a row in the mobile
slide-out menu.
## Summary
- Retire the `/unselected/*` content tree — 47 files
promoted/deleted/redirected to canonical homes; catch-all redirect
funnels any remaining inbound URLs through soft-default routing.
- Consolidate `/learn/*` — explanation-tier pages absorbed into
Concepts, the multi-conversation tutorial moved to `/tutorials/`, the
open-json-ui spec to `/generative-ui/`, and What's New promoted to its
own top-level section.
- New Agentic Protocols subgroup under Get Started — Overview / AG-UI /
MCP / A2A. Intelligence Platform + Threads explanation pages moved to
the Enterprise section. `generative-ui-overview` and
`three-types-of-gen-ui` merged into a single Generative UI Overview
page.
- Tutorials polish — Prev/Next on every step, Card link styling fixed
(no prose underline), info strip rewritten as `<div>` to fix
nested-`<p>` hydration error.
- 11 LFS-pointer-stub images replaced with real binaries pulled from the
production CDN at docs.copilotkit.ai.
- MDX hydration fixes: nested `<p>` in `/agentic-protocols/mcp`
Accordion, Card link underline escape via `not-prose`.
## Test plan
- [ ] `/agentic-protocols`, `/agentic-protocols/{ag-ui,mcp,a2a}` render
with no console errors and no broken images
- [ ] `/concepts/generative-ui-overview` renders with all four diagrams
(gen-ui-specs + 3 surfaces)
- [ ] `/premium/intelligence-platform` and `/premium/threads-explained`
render under the Enterprise section
- [ ] `/whats-new` and child pages render under the new top-level
section
- [ ] `/tutorials/multi-conversation-chat` and `/tutorials/ai-todo-app`
step through with Prev/Next on every step
- [ ] `/unselected`, `/unselected/quickstart`,
`/unselected/tutorials/ai-todo-app/overview`, etc. all 308 to canonical
homes
- [ ] `/learn`, `/learn/threads`, `/learn/agentic-protocols`,
`/learn/whats-new/v1-50`, etc. all 308 to canonical homes
- [ ] `/concepts/ag-ui-protocol`, `/concepts/intelligence-platform`,
`/concepts/three-types-of-gen-ui` 308 to their new homes
- [ ] Sidebar shows clean section labels with no duplicate group/page
names
## Summary
- **probe:smoke discovery failure**: `timeout_ms` was 10s — too tight
for Railway enumeration of 35+ services. Increased to 30s (matching
image-drift/qa probes), fixing `discoveryFailed: true`.
- **e2e_smoke:built-in-agent timeout**: Transport auto-detect race in
`CopilotKitProvider` when using `mode: "single-route"`. Without
`useSingleEndpoint`, auto-detect creates a provisional agent that
constructs REST-pattern URLs (`/agent/:id/run`) which don't exist in
single-route mode. Added `useSingleEndpoint` to all 8 built-in-agent
demo pages.
## Test plan
- [ ] Merge and deploy; trigger probe:smoke — should discover 35/35
- [ ] Trigger e2e-smoke — built-in-agent should complete instead of
timing out
- [ ] Verify other probes unaffected (image-drift, e2e-deep already
green)
The built-in-agent runtime uses mode: "single-route" which means all
requests go to a single POST endpoint (/api/copilotkit). Without
useSingleEndpoint, the CopilotKitProvider defaults to transport: "auto"
which auto-detects by trying GET /info first (404 from Next.js), then
falls back to single-endpoint POST. During this auto-detect window,
the provisional agent created by useAgent() has transport: "auto",
which constructs REST-style URLs (/api/copilotkit/agent/default/run)
that don't exist in single-route mode. If the user sends a message
before auto-detect completes, the request hits a Next.js 404 and the
run silently fails, causing the e2e-smoke probe to time out waiting
for an assistant response.
Adding useSingleEndpoint to all 8 demo pages forces transport:
"single" from initialization, so both the provisional agent and the
final agent use the correct single-endpoint POST format from the
start.
Split inline type imports into separate import-type statements per
oxlint consistent-type-specifier-style rule. Prefix unused connection
parameter. Apply oxfmt formatting.
Stats bar shows health/parity/docs summary counts that appear/hide
based on active overlays. Legend renders color-coded keys for each
active overlay layer.
OverlayColumnHeader shows health strip, parity badge, and tally based
on active overlays. RefDepthColumn is a frozen column pinned after the
feature name that appears when the parity overlay is active.
Stacks 4 overlay content layers (Links, Depth, Health, Docs) into a
single matrix cell. Each layer renders only when its overlay is active,
driven by the shared overlays Set from useOverlays.
Pill-style toggle bar for 5 overlay layers with 3 presets (Default,
Developer, Ops). Each pill shows active state; presets apply curated
overlay combinations with one click.
The smoke probe's timeout_ms (10s) was configured when the probe used a
static target list. After migrating to discovery-driven enumeration via
railway-services, the same timeout_ms governs the Railway enumerate
call — a project-level GraphQL query plus per-service variable lookups
(bounded at concurrency 8). With 35+ services, enumerate alone can take
5-12s on a slow tick, causing persistent discoveryFailed:true.
Increasing to 30s matches image-drift and qa (both Railway-discovery
probes that work reliably at this fleet size).
Root cause: timeout_ms is shared between discovery enumerate and
per-target driver invocation. 10s was appropriate for the driver
(3 sequential HTTP GETs) but too tight for the discovery phase
that queries Railway's API for every showcase service.
Remove the decommissioned "starter" shape type from 4 probe drivers
(e2e-deep, e2e-parity, e2e-readiness, qa) and their test files.
Starters no longer exist in the showcase fleet so the short-circuit
guards, type unions, and test cases are dead code.
- Narrow shape type unions from "package" | "starter" to "package"
- Remove starter short-circuit early-return blocks in all 4 drivers
- Remove starter-specific test cases from all 4 test files
- Clean up starter-referencing comments throughout
Showcase starters have been decommissioned. Remove all starter-specific
logic from the liveness and e2e-chat-tools probe drivers:
- Remove starter branch from deriveUrls() in liveness driver
- Remove E2eSmokeStarterSignal type and starter short-circuit from
e2e-chat-tools driver
- Remove all starter-shape test cases from both test files
- Clean up doc comments referencing showcase-starter-* patterns
All package-shape logic and tests remain intact (60 tests passing).
Showcase starters have been decommissioned. Remove the "starter" shape
from ShowcaseServiceShape (now a z.literal("package") instead of
z.enum), remove the showcase-starter-* regex and classification logic
in classifyShape(), remove the isOneEditDistance typo-nudge helper,
and clean up all starter-related comments and jsdoc. Update tests to
remove all starter fixtures, assertions, and test cases while keeping
all package-shape tests passing.
Remove residual showcase-starter-* references now that starters are
decommissioned:
- Delete showcase/ops/config/alerts/smoke-red-tick.yml (starter-only
alert rule with kind: starter filter)
- Delete showcase/ops/test/fixtures/rules/valid/smoke-red-tick.yml
(test fixture mirroring the deleted alert rule)
- Update showcase/ops/config/probes/smoke.yml comments to remove
showcase-starter-ag2 example and 34-service count
- Update showcase/ops/scripts/test-notify-ops-jq.sh to remove starter
build job fixtures and starter service names from jq partition test
- Update showcase/scripts/verify-railway-image-refs.ts to remove
showcase-starter-<slug> from canonical shape comment
The monitoring/alerting service is a test harness (probes, assertions,
alerting), not an operations service. Rename the directory, package
name (@copilotkit/showcase-ops → @copilotkit/showcase-harness), all
internal references (Dockerfile, Prometheus metric prefix
showcase_ops_ → showcase_harness_, orchestrator log messages, probe
YAML nameExcludes, test fixtures), and regenerate pnpm-lock.yaml.
Wire protocol names (X-Ops-* headers) and shell-dashboard internal
API naming (OPS_BASE_URL, ops-api.ts) are intentionally unchanged —
they are stable contracts between sender and receiver.
## Summary
- Switch the built-in-agent copilotkit route from multi-route (default)
to single-route mode
- Remove the `withProbeCompat` 404-to-400 wrapper (no longer needed)
## Why
The smoke probe POSTs a v1-style JSON envelope `{method, params, body}`
to `/api/copilotkit`. In multi-route mode, the v2 runtime tries to match
URL patterns (e.g. `/agent/:agentId/run`) and returns 404 for bare
`/api/copilotkit` POSTs. The `withProbeCompat` wrapper converted 404 to
400, but the smoke probe needs the runtime to actually parse the request
and return a real response, not just a non-404 status.
Single-route mode accepts the JSON envelope format directly, so the
smoke probe's `{method: "agent/run", params: {agentId: "default"}, body:
{...}}` payload is properly parsed and dispatched to the agent handler.
## Test plan
- [ ] Verify smoke:built-in-agent turns green after deploy
- [ ] Verify the copilotkit endpoint still handles normal agent/run
requests