The four fixture routing regression tests still referenced the old
monolithic d5-all.json / smoke.json / feature-parity.json files that
were reorganized into per-integration d4/ d6/ shared/ directories.
Changes:
- Load fixtures via glob from d6/langgraph-python/ (reference
integration) instead of deleted monolithic files
- Add _context to test requests (aimock 1.26.1 checks req._context
against match.context for per-integration scoping)
- Adapt subagents test from toolCallId-based chaining to
turnIndex-based chaining (matches new D6 fixture structure)
- Adapt state-context test to D6 context-scoping model (no
systemMessage matching; routing happens via X-AIMock-Context)
- Remove _migrated-from-*.json shared files (all fixtures already
exist in per-integration D6 dirs; the migration files caused
620 shared-vs-scoped collisions)
- Add KNOWN_DUPLICATE_CEILING=11 ratchet for pre-existing D6
intra-feature duplicate match keys
Add fixture analysis/split/merge scripts for the D6 restructure,
update aimock fixture collision detection tests for the new directory
layout, update GOTCHAS.md and QA-COVERAGE.md with D6 notes, and
add --d6 flag support to the showcase test CLI.
Derive snippet component names from SNIPPET_MAP in docs-render.tsx at
runtime instead of maintaining a hardcoded 35-entry set that was already
13 entries behind. Replace name-level handledByInline gate with per-match
inline pattern check to fix a false-negative path. Align function
signature with sibling check functions. Add 3 unit tests.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6 prebuilt-components pages were missing their PrebuiltComponents import,
causing the inlineSnippets regex to skip them and drop the framework prop
(iframe URLs defaulted to langgraph). 8 HITL pages had copy-pasted code
examples using the deprecated v1 parameters array format instead of Zod
schemas. Added a component-imports validation check to verify-shell-docs.ts
to catch missing snippet imports going forward.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Picks up _extract_forwarded_headers_from_config from PR #4984, now
shipped as copilotkit 0.1.91 on PyPI. Three Python integrations move
forward together: langgraph-python, strands, langgraph-fastapi.
Updates validate-pins ratchet hash (count stays 106, FAIL set shifted
because showcase pins now diverge from Dojo on 0.1.91 vs 0.1.87).
Showcase auto-redeploys to Railway on merge via showcase_build.yml
(path filter showcase/**).
Re-bump on top of main's new 102 baseline (PR #4985 absorbed the
pre-existing 9-FAIL drift). Our PR adds 4 intentional version-pin
divergences from Dojo (copilotkit 0.1.87 -> 0.1.90 in three Python
integrations, ag-ui-langgraph from ==0.0.34 to >=0.0.35 in
langgraph-fastapi), bringing the total to 106.
The ag-ui-langgraph and copilotkit catch-up will reduce this back
down once both release pipelines complete and Dojo reference
examples pick up the new versions.
PR #4956 bumped @copilotkit/aimock in showcase/scripts/package.json
from "latest" to "1.26.1" but did not regenerate package-lock.json
(still pinned to 1.16.4). This broke the Showcase Docker builds for
showcase-harness and shell-dashboard, since both run `npm ci` inside
showcase/scripts/ and `npm ci` fails on out-of-sync lockfiles.
These scripts existed solely to sanity-check the v1-docs → shell-docs
cutover during this PR. The cutover is now landed, so the audit
pipeline has no further job:
Removed
- audit-docs-porting.ts (+ test) — produced per-framework JSON
summaries of what still needed porting. Referenced only by its
own package.json script entry and a comment in
verify-shell-docs.ts.
- split-baseline.mjs — orphan helper that read
audit-output/_summary.json + verify-baseline.txt and wrote
per-framework .baseline.txt files. Not in package.json, not in
any workflow.
- lib/component-mapping.ts — 80-row v1-component → v2-strategy
table. Zero consumers anywhere in the repo (verified via
`grep -rln "component-mapping\|COMPONENT_MAPPING"`).
- audit-output/.gitkeep + showcase/scripts/.gitignore — the
.gitkeep was a placeholder for the audit pipeline's output
directory; the .gitignore's three entries (audit-output/*.json,
audit-output/*.baseline.txt, verify-baseline.txt) all referenced
files only produced/consumed by the deleted scripts.
- audit-docs-porting script entry in showcase/scripts/package.json.
- The comment cross-reference to audit-docs-porting.ts in
verify-shell-docs.ts's fenced-code-strip rationale.
Kept (still actively useful)
- verify-shell-docs.ts (+ test) — ongoing docs validator wired into
`pnpm verify-shell-docs`; catches dead inline-demo refs, unknown
snippet regions, broken internal links, and unresolved alias
imports.
- lib/essential-content.ts (+ test) — page-shape rule engine
consumed by verify-shell-docs.
- probe-shell-docs.ts — URL-coverage crawler (not in package.json
but runnable via `tsx`; kept as a one-off utility).
Net diff: 905 lines removed, 1 line touched (verify-shell-docs.ts
comment update). Tests: 594/594 passing across 27 files in
showcase/scripts. Parity: exit 0.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Five component-mapping entries (A2UI, MigrateTo1100, MigrateTo182,
MigrateToV2, SelfHosting) carried `notes: '...needs shim stub'` while
all five are already registered as `stubWithPartial(...)` entries in
shell-docs/src/lib/mdx-registry.tsx (lines 472, 477-480). The
PydanticAIIcon entry also claimed it was an "emoji shim (🐍)" when
mdx-registry.tsx:527 resolves it to the real PydanticAiIcon SVG.
The stale notes would mislead anyone using component-mapping.ts as a
TODO list — they'd duplicate already-completed shim work or assume
PydanticAIIcon was a placeholder when the real icon is shipping.
This is a comments-only correction; the `kind` and `target` fields
remain unchanged so the mapping's behavior is identical.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Six fixes from CR Round 1 partition, all bucket (a):
- frontend_tools.py: docstring claimed the file was "Chat Customization
(CSS) demo" but langgraph.json wires it as the Frontend Tools demo
graph, and the new MDX setup snippets cite this exact file via the
freshly-added `# region: middleware` markers. Users following the
langgraph-python copilot-middleware setup would see CSS-demo wording
on a Frontend Tools page. Rewrote the docstring to match what the
cell actually demonstrates (mirroring the sibling
frontend_tools_async.py phrasing).
- page.tsx mergeFrameworkNav: when introNode was non-null AND the root
nav had no "Get Started" section, introNode was prepended to rootNav
shifting every existing index +1. The adjustment block only added +1
when getStartedIdx !== -1, so the splice-back position for the
framework section was off-by-one in the no-Get-Started branch — the
framework header rendered one slot too early in the sidebar.
- docs-page-view.tsx h2/h3 overrides: `{...rest}` was spread AFTER
`id={id}`, so an MDX-supplied `<h2 id="custom">` would override the
slugified id and silently break the TOC anchor + any inbound deep-
links keyed on the slug. Reordered the spread so rest comes first
and the slug-id always wins.
- probe-shell-docs.ts: terminated with bare `main();` while every
sibling script (audit-docs-porting, verify-shell-docs) wraps in
`.catch(e => { console.error(e); process.exit(1); })`. A rejected
main() would surface as an unhandled rejection on older Node
runtimes and exit 0 in CI, masking failure. Aligned with the
established pattern.
- verify-shell-docs.ts: all four regex checks (InlineDemo refs,
Snippet regions, internal links, alias imports) scanned page.body
raw without first stripping fenced code blocks. Any docs page that
showed example code containing `<InlineDemo demo="x" />`,
`[link](/path)`, or `import x from "@/..."` triggered a false-
positive validator failure. Mirrors audit-docs-porting.ts's
FENCED_CODE_RE approach. Adds a regression test that fails without
the strip.
- 3 new MDX content fixes:
* mcp-apps.mdx + open-generative-ui.mdx: removed duplicate `<Callout>`
"Free course" blocks (the same Callout appeared twice on each
page, separated only by the Key Benefits list).
* subagents.mdx: changed `[OnStateChanged, OnRunStatusChanged]` to
`[UseAgentUpdate.OnStateChanged, UseAgentUpdate.OnRunStatusChanged]`
— the bare identifiers aren't exported (the reference doc
`useAgent.mdx` confirms the qualified form), so a user copying
the snippet would hit an import error.
Call-site enumeration:
- frontend_tools.py: only langgraph.json + the new setup MDX files
reference this file by name; both consume the region markers, not
the docstring. Docstring rewrite has zero call-site impact.
- mergeFrameworkNav: single caller (FrameworkScopedDocsPage at this
file's bottom). The new branch covers a strictly broader case;
the original splice/replace paths are unchanged.
- h2/h3: only used by the MDXRemote `components` map below. Spread
order is a local prop-precedence change; no upstream callers.
- probe-shell-docs main(): no external callers.
- verify-shell-docs check functions: 4 exported functions called
from runChecks() below + the test file. Strip is internal to each
function so signature is unchanged.
- UseAgentUpdate: confirmed exported from `@copilotkit/react-core/v2`
per reference doc useAgent.mdx; no implementation change needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Pinning `@copilotkit/*` to `1.57.2` exactly in `ms-agent-python`
(commit 1d40071d8) reduced the FAIL count from 95 to 93. CI's
validate-pins step asked us to ratchet the baseline down.
baselineDemoCount unchanged.
Adds a verification script under showcase/scripts/ that enumerates
every URL each visible framework should serve, fetches each against
a running dev server, and flags 404s + soft render failures via
structural signals (`<main>` + `<h1>` present in the SSR HTML).
Coverage: 17 visible frameworks = 14 registered integrations
(filtering docs_mode: hidden) + 3 docs-only frameworks (a2a /
agent-spec / deepagents — root URL only, since their route handler
explicitly notFound()s scoped subpaths). 618 URLs in the current
tree. Used by the cutover to confirm every authored framework's
ported MDX, every generated framework's data-driven layout, and
every hidden framework's 404 + switcher absence all render as
intended.
Design notes:
- Text matches against runtime/MDX error strings false-positive
consistently in dev mode (Next.js bundles helper sources like
MDXRemote and the not-found component into every page's
serialized React tree, so "MDXRemote ... error" or
"page could not be found" appear in every successful page's
HTML). Structural signals are reliable; text patterns aren't.
- For docs-only frameworks, only the root URL is probed.
Enumerating their MDX tree would produce false-positive 404s
because the route handler intentionally restricts them to
`/<slug>`.
Usage: `cd showcase/scripts && PREVIEW_URL=http://localhost:3003 \
npx tsx probe-shell-docs.ts`. CONCURRENCY defaults to 8.
Maps all 77 JSX components from the Phase 0 audit to either
use-existing (74 entries) or shim (5 entries: A2UI, MigrateTo1100,
MigrateTo182, MigrateToV2, SelfHosting). Creates the legacy/index.ts
barrel scaffold that Task 13 will populate with shim implementations.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fumadocs/Next.js route groups like (other) are stripped from URL paths, so
a file at (other)/telemetry.mdx is served at /telemetry. loadKnownRoutes()
now filters those segments before registering routes, eliminating false-positive
dead-link failures for pages inside route-group directories.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Fenced code blocks are now stripped before extracting JSX component
references so samples inside ``` blocks don't get counted as real
component refs. snippetImports is deduplicated via a Set consistent
with how components are handled.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Main has been red on Validate Showcase since #4912 landed
("bump deps to v1.57.2") -- that PR bumped Dojo's @copilotkit/*
pins to 1.55.2 which exposed 10 new showcase=next vs Dojo=1.55.2
mismatches across ms-agent-python, pydantic-ai, and strands.
The count on origin/main is also 105 (verified against run
26082332924's logs); my branch produces an identical 105 FAIL set
with matching hash. So this ratchet absorbs unrelated drift from
#4912 -- needed to unblock CI for this PR (and every other PR
that touches showcase/).
Sign-off: this is a documented baseline ratchet per the fail
threshold instructions in fail-baseline.json's _comment field.
Rebuild the shell-docs chrome on top of Fumadocs UI primitives and ship the
visual polish pass that replaces the legacy custom chrome.
- Fumadocs adoption: route every docs page (home, framework-scoped, ag-ui)
through a shared ShellDocsLayout that wraps DocsLayout / DocsPage with
the project's nav slot, sidebar config, scroll preserver, and content
wrapper. Swap custom tabs/code-block components for Fumadocs's Tabs,
CodeBlock, Pre, CodeBlockTabs, DynamicCodeBlock — Snippet and DemoSource
now share the same chrome as authored fenced blocks.
- Syntax highlighting: replace rehype-highlight + hand-rolled hljs CSS
with Fumadocs's Shiki-based rehypeCode in all three MDX renderers and
in mdx-registry-loader. A tiny `transformerMeta` Shiki transformer
surfaces fence title= / language as data-attrs so MdxCodeBlock can
render the file-path figcaption + floating copy button.
- Sidebar: floats on all four viewport edges (rounded-2xl, 0.75rem inset,
light-gray border), framework picker pill is rounded-xl with symmetric
padding above/below, sticky picker bg matches the panel surface.
Section headers render in normal caps (no more uppercase shouting), with
scroll position preserved across navigations via SidebarScrollPreserver.
- Navbar: bg flips to `--bg`, full-width inset matches the sidebar,
search trigger drops its border and the entire right-wing pill is the
click target.
- Code chrome: figure surface forced to plain white in light and the
matching dark in dark, shadow stripped, figcaption divider uses
`--border` (was `currentColor` from `text-fd-muted-foreground`). Scoped
the `.reference-content code` chip-bg rule to `:not(pre)` so block
code bodies no longer pick up the gray inline-chip background.
- Content area: 49px (3.0625rem) of left/right padding so the article
column has visible breathing room from both the floating sidebar and
the viewport edge.
- IA: meta.json restructure for /docs (Build Generative UI section,
controlled/declarative/open-ended folders, A2UI lifted to its own
folder with an index page, Migrate moved under Other), Concepts content
rewrite, snippet/region cleanups.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary
Adds shell-docs deliberate-deletion / divergent paths to
`PATH_EXCLUSIONS` in `showcase/scripts/sync-docs-from-main.ts`, so the
docs-sync workflow doesn't keep re-proposing them as upstream-wins
conflicts.
PR #4771 surgical review surfaced two clusters worth excluding now.
## Paths added
### Cluster 1: deliberately-deleted landing pages (5 paths)
- **`(root)/index.mdx`** + **`(root)/quickstart.mdx`** — collapsed into
a single shell-docs `/` route in commit `8adbebd30` ("merge docs landing
+ /quickstart picker").
- **`(root)/prebuilt-components.mdx`** — top-level single-file version
is duplicative of the `prebuilt-components/` directory + index.
- **`integrations/langgraph/index.mdx`** +
**`integrations/microsoft-agent-framework/index.mdx`** — framework
landing files collapsed into the canonical `/<framework>/` route in
commit `d1cd9f06a` ("collapse framework landing into shell").
### Cluster 2: reference/v2/* duplicates (5 paths)
- **`reference/v2/index.mdx`** + 4 component/hook files
(`components/CopilotChat.mdx`, `components/CopilotKit.mdx`,
`hooks/useCopilotKit.mdx`, `hooks/useThreads.mdx`)
Shell-docs's canonical reference path is
`showcase/shell-docs/src/content/reference/**` (no `v2` segment, no
`docs/` prefix). The upstream `docs/content/docs/reference/v2/*` files
mirror that content under a parallel `docs/`-prefixed path that doesn't
exist in shell-docs's routing. Syncing them in creates duplicate
parallel files.
## Scope
10 paths total. Other contested DROPs from #4771 (`shared-state.mdx`,
`a2ui.mdx`, `threads.mdx`, `premium/self-hosting.mdx`) were re-evaluated
and the bot's versions were either taken into PR #4771 or held pending
follow-up work — none are permanent exclusions, so they're NOT in this
PR.
## Test plan
- [ ] Next docs-sync workflow run does not flag these 10 paths as
conflicts
- [ ] Existing exclusions still work (no regression in current behavior)
Follow-up to PR #4771 surgical sync. The upstream reference/v2/* files
mirror shell-docs's canonical reference/ tree under a parallel
docs/-prefixed path that doesn't exist in shell-docs's routing. Syncing
them in creates duplicate parallel files. Block them from future sync
runs.
Per-file follow-up captured separately: mirror any legitimate content
updates from upstream's reference/v2 into the canonical reference/ tree
as needed (notably useCopilotKit.mdx, where the upstream version had 66
more lines than the current canonical).
The docs-sync workflow propagates upstream docs/content/docs/** changes
into showcase/shell-docs/src/content/docs/**. When shell-docs has
deliberately deleted/restructured pages, the existing PATH_EXCLUSIONS
mechanism prevents re-introduction.
PR #4771 surgical review surfaced 5 deliberate-deletion paths missing
from the exclusion list:
- (root)/index.mdx + (root)/quickstart.mdx — collapsed into a single
shell-docs '/' route in commit 8adbebd30 ('merge docs landing +
/quickstart picker').
- (root)/prebuilt-components.mdx — top-level single-file version is
duplicative of the prebuilt-components/ directory + index.
- integrations/{langgraph,microsoft-agent-framework}/index.mdx —
framework landing files collapsed into the canonical /<fw>/ route in
commit d1cd9f06a ('collapse framework landing into shell').
Adding these to PATH_EXCLUSIONS so future docs-sync runs don't re-flag
them as upstream-wins conflicts.
The previous commit fixed the universal ADK loop + agent renames + A2UI
shape, which changed the pin-status of ~half of the google-adk demos in
the validate-pins matrix. Total FAIL count is unchanged at 95 (no
regression elsewhere), but the SET of failing tuples drifted, which the
ratchet correctly caught.
Updates validatePinsFailHash to the new sorted-failing-set SHA from the
CI run (62e06e1e...0b04d5e0). No baseline count change — `_comment`
explicitly forbids raising the count without sign-off.
CI surfaced two issues with PR #4792:
1. shell/shell-dojo/shell-docs build-check: the bundler walks the
manifest's `highlight:` list when bundling demo source for the
shell's Code tab. Three paths were stale after the parity blitz
restructured the demos:
- chat-slots: custom-welcome-screen.tsx → slot-wrappers.tsx (LP's
current highlight; the old file was replaced when chat-slots was
ported to LP's Slot Atlas pattern)
- headless-complete: message-list.tsx → chat/chat.tsx (file moved
into the chat/ subdir during the LP-verbatim port)
- declarative-hashbrown: copilotkit-byoc-hashbrown/route.ts →
copilotkit-declarative-hashbrown/route.ts (route dir was renamed
when the slug went byoc → declarative)
2. Validate Showcase: validate-pins is a drift ratchet — pin failure
count can only decrease. Pinning google-adk's frontend +
ag-ui-adk dropped the count from 98 → 95. Update baseline so the
improvement locks in.
Verified locally with a script that walks every demo's `highlight:`
list and checks each path resolves on disk.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds an optional `highlightOrder` field (0-based index into the
manifest's `highlight:` array) on each bundled DemoFile that is flagged
`highlighted: true`. Consumers like shell-docs's new <DemoSource>
component use this to render highlighted files in the manifest author's
preferred order rather than the bundler's alphabetical-with-page-first
fallback. Files not in `highlight:` carry no `highlightOrder` and keep
the existing sort behavior.
Additive field; no migration needed.