dev-docs/langgraph-python-column-wave1-bugs.md
Wave 1 of the langgraph-python column completeness effort surfaced the following issues while authoring QA checklists, E2E specs, and ops probes. Each is tracked for follow-up separately from Wave 1's merge.
Entries are grouped by area (docs, backend-agent, probe plumbing, frontend
/ CSS, test infra). Cross-references use the W8-* tag as it appears in
docs/superpowers/plans/langgraph-python-column-wave1-bugs-scratch.md
and in inline // See W8-* comments inside Playwright specs under
showcase/packages/langgraph-python/tests/e2e/.
packages/*/docs-links.json overrides (W8-1)scripts/probe-docs.ts only validates URLs in
shared/feature-registry.json. Per-integration overrides in
packages/<slug>/docs-links.json are invisible to the probe, so
showcase/shell/src/data/docs-status.json can report notfound for a
URL that actually resolves 200 — and conversely a broken override would
not show red.ok=0 notfound=60 error=0 missing=16 even though every langgraph-python cell except
chat-customization-css renders ✓/✓ on the dashboard. The dashboard
flips to green via
showcase/shell-dashboard/src/components/cell-pieces.tsx:36-57 which
trusts the override. Example: og_docs_url
https://docs.copilotkit.ai/langgraph/prebuilt-components in
packages/langgraph-python/docs-links.json is 200-verified but shows
notfound in the probe output.probe-docs.ts scope predates the
docs-links.json override pattern; it reads only REGISTRY_PATH and
never walks packages/*/docs-links.json.probe-docs.ts to walk
packages/*/docs-links.json and emit per-integration docs-status rows,
or (b) teach cell-pieces.tsx to defer to probe state whenever a URL
exists./features/<id> URL in feature-registry soft-404s (W8-3)https://docs.copilotkit.ai/features/<id> entry in
shared/feature-registry.json returns the Next.js catch-all
[[...slug]] page. This affects integrations that don't ship a
docs-links.json override./features/<id> URL returns 200 with
x-matched-path: /[[...slug]] or /integrations/[[...slug]]. Probe
output's notfound=60 aggregate is almost entirely these fallback
URLs. See docs/superpowers/plans/langgraph-python-docs-audit.md
surprise #3./features/<id>) that no longer exists.docs-links.json override. Long-term, update feature-registry URLs to
point at integration-specific pages or drop the feature-level fallbacks.chat-customization-css has no dedicated docs page (W8-2)chat-customization-css demo but
no dedicated CSS-customization page exists under docs.copilotkit.ai or
shell-docs. The cell renders the "missing" state for og.packages/langgraph-python/docs-links.json entry for
chat-customization-css has og_docs_url: null and
shell_docs_path: "/custom-look-and-feel/css".https://docs.copilotkit.ai/langgraph/custom-look-and-feel/css
soft-404s (catch-all [[...slug]]).https://docs.copilotkit.ai/custom-look-and-feel/css also soft-404s.integrations/langgraph/custom-look-and-feel/css.mdx exists
under showcase/shell-docs/src/content/docs/ (a non-scoped
custom-look-and-feel/css.mdx does exist, which shell resolution
matches).langgraph/custom-look-and-feel/css (matching
the /slots sibling) and the corresponding shell-docs mdx under
integrations/langgraph/custom-look-and-feel/css.mdx. Then un-null
og_docs_url in packages/langgraph-python/docs-links.json.chat-customization-css docs-og.reasoning_agent non-responsive on Railway (W8-3 E2E)/demos/agentic-chat-reasoning on
showcase-langgraph-python-production.up.railway.app loads fine, but
any typed prompt produces no [data-testid="reasoning-block"] and no
[data-role="assistant"] bubble within 60s.showcase/packages/langgraph-python/test-results/agentic-chat-reasoning-*.frontend-tools (5/5) and
frontend-tools-async (2/3 LLM-dependent) — deployment is up; the
reasoning_agent graph specifically is non-responsive.showcase/packages/langgraph-python/tests/e2e/agentic-chat-reasoning.spec.ts
(three test.skips with TODO).deepagents.create_deep_agent /
init_chat_model path in src/agents/reasoning_agent.py may be
missing a Python dep or an OpenAI Responses-API permission on Railway,
or the agent name mapping in src/app/api/copilotkit/route.ts:76-77
(agentic-chat-reasoning → reasoning_agent) fails at the runtime
layer./api/copilotkit POST
with an agentic-chat-reasoning agent run; confirm whether
reasoning_agent.graph actually imports.agentic-chat-reasoning E2E (reasoning-stream
assertions skipped; page-load/submit-pipeline still live).request_user_approval does not fire on Railway within 60s (W8-5)/demos/hitl-in-app on Railway loads fine; suggestion
pills and the 3 ticket cards render. A typed prompt explicitly naming
the tool and a ticket (e.g. "Use request_user_approval to ask me to
approve a $50 refund on ticket #12345.") does not cause the agent to
invoke the useFrontendTool handler. No
[data-testid="approval-dialog-overlay"] portal appears; all three
flows time out at 60s with two Playwright retries each.showcase/packages/langgraph-python/test-results/hitl-in-app-*.
Mitigation in tests/e2e/hitl-in-app.spec.ts — three approval flows
marked test.skip with TODO; page-load / ticket-card / suggestion-pill
assertions remain live.hitl_in_app_agent graph may be missing
the request_user_approval tool binding; or the agent-name mapping in
src/app/api/copilotkit/route.ts does not route to a graph that
receives frontend-tool registration; or the system prompt does not
prime the model to call the tool for the typed prompt.useFrontendTool(request_user_approval) is registered on the session
by the time the user prompt is sent.hitl-in-app E2E (approval flows skipped).useInterrupt / schedule_meeting does not fire on Railway within 60s (W8-6)/demos/gen-ui-interrupt on Railway loads fine; suggestion
pills render. Typed prompts naming the backend tool (e.g. "Use
schedule_meeting to book an intro call …") do not trigger the
interrupt_agent graph's interrupt() within 60s; no inline
[data-testid="time-picker-card"] renders; both pick-a-slot and cancel
flows time out.showcase/packages/langgraph-python/test-results/gen-ui-interrupt-*.
Mitigation in tests/e2e/gen-ui-interrupt.spec.ts — two interrupt
flows marked test.skip with TODO.interrupt_agent graph (shared with interrupt-headless) is not
reaching its interrupt() on Railway, the useInterrupt({ renderInChat: true }) primitive is not subscribing, or the
schedule_meeting tool binding is stripped from the deployed graph./api/copilotkit with an interrupt_agent run
while tailing Railway logs; confirm whether schedule_meeting is
actually invoked and whether a LangGraph interrupt() is emitted on
the SSE stream.gen-ui-interrupt E2E (interrupt flows
skipped).readonly-state-agent-context LLM round-trip stalls past 60s on Railway (W8-READONLY-1)/demos/readonly-state-agent-context on Railway loads, but
LLM round-trip for the "Who am I?" suggestion and the equivalent typed
prompt stalls past 60s. There is no deterministic frontend tool
side-effect to race against (the page simply expects an assistant
bubble).showcase/packages/langgraph-python/tests/e2e/ readonly-state-agent-context.spec.ts marks both the suggestion flow
and the typed-prompt flow test.skip with an inline "See
W8-READONLY-1" pointer at readonly-state-agent-context.spec.ts:76,96.
Scratch file does not mention this entry — scratch not updated.data-testid="assistant-message" marker on the assistant bubble to
give the spec a deterministic structural signal.readonly-state-agent-context E2E (LLM
round-trip assertions skipped).open-gen-ui iframe mount regularly exceeds 120s (W8-OGUI-1)/demos/open-gen-ui iframe mount exceeds the 120s
per-test budget because the LLM has to author full HTML/CSS/JS before
the iframe can paint. No reliable post-mount signal.showcase/packages/langgraph-python/tests/e2e/ open-gen-ui.spec.ts marks both the Quicksort suggestion path and the
neural-network path test.skip with "See W8-OGUI-1" at
open-gen-ui.spec.ts:64,90. Scratch file does not mention this entry
— scratch not updated.data-testid="ogui-iframe" on mount (short-
circuits the LLM wait), or narrow the prompt to reduce authoring
latency on Railway.open-gen-ui E2E (iframe-mount assertions
skipped).open-gen-ui-advanced sandbox iframe round-trip unverifiable (W8-OGUI-2)/demos/open-gen-ui-advanced mounts an
sandbox="allow-scripts"-only iframe; the round-trip to the host
(e.g. the notifyHost console log) cannot be asserted via
Playwright's contentFrame() because allow-scripts-only iframes
restrict cross-frame interaction.showcase/packages/langgraph-python/tests/e2e/ open-gen-ui-advanced.spec.ts marks the Ping mount and the
notifyHost round-trip test.skip with "See W8-OGUI-2" at
open-gen-ui-advanced.spec.ts:63,92. Scratch file does not mention
this entry — scratch not updated.allow-scripts sandbox attribute by design prevents host-side
introspection.open-gen-ui-advanced E2E (sandbox-attribute and
round-trip assertions skipped).declarative-gen-ui generate_a2ui secondary LLM stalls for KPI/StatusReport prompts (W8-7)/demos/declarative-gen-ui KPI-dashboard and
StatusReport pill flows regularly exceed 60s on Railway when the
secondary LLM stage (which authors the a2ui JSON) stalls.showcase/packages/langgraph-python/tests/e2e/ declarative-gen-ui.spec.ts marks the KPI test and the StatusReport
test test.skip with "See W8-7" at declarative-gen-ui.spec.ts:118,140.
Scratch file does not mention this entry — scratch not updated.a2ui_dynamic agent
graph is slow/flaky on Railway. KPI is the slowest of the 4 pills.declarative-gen-ui E2E (KPI + StatusReport
flows skipped; ProductCard and VideoCard pills remain live).a2ui-fixed-schema display_flight secondary LLM occasionally stalls (W8-8)/demos/a2ui-fixed-schema display_flight flow
occasionally stalls the secondary LLM stage past its 60s render
budget.showcase/packages/langgraph-python/tests/e2e/ a2ui-fixed-schema.spec.ts:31 — inline comment "W8-8: on Railway,
display_flight occasionally stalls the secondary LLM stage; render
budget is 60s." Spec still runs against the 60s budget — not skipped,
but flaky. Scratch file does not mention this entry — scratch not
updated.mcp-apps Excalidraw MCP iframe fails to paint within 90s (W8-9)create_view →
server-side resource fetch → activity event → iframe render) on
/demos/mcp-apps regularly sits above 90s and intermittently fails
to paint an iframe at all when the Excalidraw MCP server is slow.showcase/packages/langgraph-python/tests/e2e/ mcp-apps.spec.ts marks the flowchart flow and the explicit
create_view-prompt flow test.skip with "See W8-9" at
mcp-apps.spec.ts:60,80. Scratch file does not mention this entry —
scratch not updated.mcp-apps E2E (round-trip flows skipped;
presence + sandbox-contract assertions live).query_notes occasionally does not fire without explicit keyword verb (W8-4)/demos/frontend-tools-async query_notes tool fires
reliably when the user prompt contains an explicit "search my notes"
verb phrase, but the "Find project-planning notes" suggestion pill and
the typed variant "Find my notes about project planning." occasionally
do not trigger the tool within 45s — the agent answers in-context
without firing.[data-testid="notes-card"] at 45s. The "Search my notes for
'auth'." typed variant and the zero-match "xyzzy-nonsense-keyword"
variant succeeded reliably. Mitigation already landed in
showcase/packages/langgraph-python/tests/e2e/ frontend-tools-async.spec.ts — pill test substitutes an explicit
typed "Search my notes for 'auth'." prompt; terminal assertion accepts
either notes-list or the empty-state copy.frontend_tools_async graph's system prompt does
not consistently bias the model towards query_notes for "find …
notes" phrasing.query_notes
when the prompt contains "notes", or update the suggestion pill copy
to begin with "Search my notes for …" verbatim.chat-customization-css theme.css loses cascade on Railwaychat-customization-css demo
intermittently loses the custom dashed-border and theme cascade — the
theme.css overrides for --copilot-kit-* variables don't win over
the default stylesheet load order.tests/e2e/chat-customization-css.spec.ts comments; the spec asserts
theme.css CSS variables on the .chat-css-demo-scope wrapper but
the reported Railway flake is about the dashed-border visual, not the
computed variables. Scratch file does not mention this entry —
scratch not updated.theme.css is imported but not
guaranteed to load after the default CopilotKit stylesheet under
certain chunk-splitting conditions.theme.css import or add a @layer wrapper to force cascade.chat-customization-css if the flake
repros during Wave 1's final dashboard walk. Track but not
pre-descoped.CopilotChatInput Enter-key submit is flaky on slow networksCopilotChatInput intermittently drops the keystroke; tests using
page.keyboard.press("Enter") after fill() flake. Workaround used
across Wave 1 specs: click [data-testid="copilot-send-button"]
instead.showcase/packages/langgraph-python/tests/e2e/*.spec.ts) uses the
[data-testid="copilot-send-button"] locator rather than Enter. No
dedicated comment in-spec explains why, but the workaround is
uniform. Memory-only from this session. Scratch file does not mention
this entry — scratch not updated.CopilotChatInput when Enter fires
during an in-flight network tick.agentic-chat suite fails against Railway: background-container testid absentagentic-chat.spec.ts suite asserts
[data-testid="background-container"], but on the deployed Railway
demo that testid is not emitted — the deployed demo has drifted from
source.showcase/packages/langgraph-python/tests/e2e/ agentic-chat.spec.ts:13,20,89 all use
page.locator('[data-testid="background-container"]'). The source
under src/app/demos/agentic-chat/page.tsx does render the testid,
but the Railway image appears to be from before a recent edit. Memory-
only from this session. Scratch file does not mention this entry —
scratch not updated.agentic-chat.spec.ts suite and confirm all assertions pass.agentic-chat E2E remains pending a redeploy —
track but not pre-descoped pending the Wave 1 post-merge dashboard
walk.chat-slots manifest highlight list omits two componentspackages/langgraph-python/manifest.yaml chat-slots
entry lists only custom-welcome-screen.tsx under highlight:. The
demo actually uses three custom slot components:
custom-assistant-message.tsx and custom-disclaimer.tsx are missing
from the highlight list.showcase/packages/langgraph-python/manifest.yaml:268-276
(chat-slots entry highlight list).showcase/packages/langgraph-python/src/app/demos/chat-slots/
contains custom-assistant-message.tsx, custom-disclaimer.tsx,
custom-welcome-screen.tsx, and page.tsx.highlight: array.chat-customization-css (docs-og, via B3),
agentic-chat-reasoning (E2E, via B4),
hitl-in-app (E2E, via B5),
gen-ui-interrupt (E2E, via B6),
readonly-state-agent-context (E2E, via B7),
open-gen-ui (E2E, via B8),
open-gen-ui-advanced (E2E, via B9),
plus partial descoping of declarative-gen-ui E2E (2 of 4 pills, via
B10) and mcp-apps E2E (round-trip flows only, via B12).Entries B7–B12 and B14–B17 were captured in-code (Playwright spec
comments, manifest, and session memory) but were not synced back to
docs/superpowers/plans/langgraph-python-column-wave1-bugs-scratch.md
during Wave 1. The scratch file currently covers only W8-1, W8-2, W8-3
(docs), W8-3 (E2E), W8-4, W8-5, and W8-6.