lakehouse/auditor 13 blocking issues: cloud: claim not backed — "pretending to have streamed. Verified live: chat.completion.chunk frames from"
The gateway accepted `stream: true` and returned a single JSON body — the code
said 'Phase 39+ wires real streaming' and it never happened. A streaming client
waits for SSE frames that never arrive and reports 'no response': that is what
broke openclaw's gateway lane today and cost six orchestrator rounds before the
cause was found.
Now: openrouter/openrouter_free forward the upstream SSE byte-for-byte; every
other lane rejects stream=true with a 400 that names the lane, instead of
pretending to have streamed. Verified live: chat.completion.chunk frames from
:3100, and the non-streaming path unchanged. Streamed calls skip usage metering
and Langfuse (stated in the code and logged per call) — metering needs the final
usage chunk and belongs in its own change.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
lakehouse/auditor 11 blocking issues: cloud: claim not backed — "Verified live after deploy: tool_calls returned (finish_reason tool_calls); plain request"
/v1/chat/completions deserialized into a struct without tools/tool_choice and messages without
tool_calls/tool_call_id, so serde silently DROPPED them. Tool-using agents routed through :3100
(openclaw, 2026-09-18) never saw their tools and fabricated tool output as text.
- ChatRequest: tools + tool_choice (serde default). Message: tool_calls, tool_call_id, name
(skip_serializing_if none -> plain-text JSON is byte-identical; test pins it).
- openrouter lane forwards them and returns the model's tool_calls (content null on a
tool-call-only turn, finish_reason passed through).
- every other provider: HTTP 400 when a request uses tools, instead of silent stripping.
Verified live after deploy: tool_calls returned (finish_reason tool_calls); plain request
unchanged; ollama + tools -> 400; multi-turn tool result round-trip answered from the tool.
cargo test -p gateway --lib: 111 passed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Established empirically in a clean Debian 13 container (2026-07-28), not inferred
from the dev host:
1.85.0 (apt install rustc, Debian trixie) -> FAILS, aws-sdk-* need >= 1.91.1
1.97.1 (rustup default stable, today) -> FAILS, ethnum E0512 transmute
1.94.0 -> builds clean, workspace, 2m39s
Both obvious reviewer paths break: the distro compiler is too old and current
rustup stable is too new. Before this pin the build reproduced on our host only
because the toolchain had been restored from the previous machine — reproducible
by accident rather than by construction.
Verified the pin works: set the shell default to the BROKEN stable, and the repo
still resolved 1.94.0 and built.
Minimal native prerequisites, also tested in the clean container:
protobuf-compiler (lance-encoding/lance-file build scripts need protoc),
pkg-config, libssl-dev.
NOT required despite being installed on the dev host: cmake, clang, libclang-dev.
Flips [hnsw auto-tune] enabled true->false to keep the background propose/trial/promote
loop off live search traffic on shared Ollama. Revert to re-enable.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Reconciles month-old working-tree UX work (served per-request, live on the demo since
2026-05-30) into git. Implements UX_FIX_PLAN.md's 5 user complaints: reference pages
(Profiler/Architecture/Spec/Onboard/Alerts/Workspaces) open in new tabs; contract-card
collapsible shows a persistent chevron + expand/collapse label in both states; proof.html
gains a substrate-signals chapter. Not authored this session — captured as-is (working
state verified: pages serve 200).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- New 2026-06-30 wave: the ethereal_workers↔workers_500k_v1 misalignment fix (8 sites,
commits 423400e/35a80a7/1570306), verified live after mcp-server restart
- Flag that demo-plan P1 (search-box filter) is already done — the P1 section is stale
- Note the untouched 2026-05-30 uncommitted WIP + newer untracked planning docs
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Same index↔dataset misalignment swept across the intelligence handler — four more
/vectors/hybrid calls that paired workers_500k_v1 with filter_dataset ethereal_workers:
- similar-workers route (~2418)
- semantic role-discovery route (~2459)
- smart_search route (~2869)
- scenario worker-find (~3531)
Verified: no workers_500k_v1 index remains paired with the ethereal_workers dataset;
the 9 remaining refs are correctly aligned (workers_500k dataset) or pure RAG. Server
boots clean. Takes effect on next mcp-server restart.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Same index↔dataset misalignment as the /search fix (423400e), in three more paths that
pair the ethereal_workers SQL dataset with the workers_500k_v1 vector index:
- search_workers MCP tool
- match_contract MCP tool
- /match HTTP handler
All now default to ethereal_workers_v1 (same 10K id-space as the SQL table). Verified:
/match role=Forklift Operator state=IL returns only IL forklift operators (sql_matches 94).
rag_question / /ask left as-is — pure RAG, no SQL join, so no id-space to misalign.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The /search hybrid endpoint defaulted to index workers_500k_v1 (50K chunks, a
different worker set) while defaulting filter_dataset to ethereal_workers (10K SQL
rows). Same worker_id → different person in each, so the SQL state filter and the
vector rerank referred to different people: state='IL' surfaced a KY worker flagged
sql_verified:true. Aligned the default index to ethereal_workers_v1 (10K chunks, same
id-space as the SQL table). Verified: state='IL' now returns only IL workers.
Takes effect on next mcp-server restart. Sibling paths /match and the search_workers
tool have the same workers_500k_v1↔ethereal_workers misalignment (not touched here).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>