Repository navigation
A mind's learned tool head is sent when her lane runs the engine that takes tail_tools (engine pin 1c6681593) - #5491
Conversation
… takes tail_tools (engine pin 1c6681593, fork #75) Bumps core/vendor/llama.cpp e7e1077b3 -> 1c6681593 (one commit: tail_tools, the squash of ca53e26b3) and records it in LLAMA_CPP_PIN. The fork names tail_tools in no /props key and no --help flag, so the capability is read from the build the RUNNING lane reports (/props build_info), matched against the compiled-in pin: - llama_server/engine_features.rs: the one owner; the gateway reconcile records the lane's build from the same /props read that converges the engine (a probe error keeps the last reading, so her tool surface never flips for a tick). - engine_install::build_commit: the one build_info parse, shared with the stale-engine check. - OpenAI adapter accepts_tail_tools: the provider's family flag (llama-server row, now true) AND not a dedicated lane AND the local serving lane AND its build is the pin. Cloud, remote, stock, operator, stale or unreadable builds answer false. - source-hygiene vendor_pin: the pinned source must parse tail_tools, so moving the pin to an engine without it fails CI. Follow-up (card ae4137f1, Fable): the fork reports tail_tools in /props and the revision tie is deleted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
|
Source review at 9c10113: changes requested before enabling live tail tools. [P1] Bind cached build evidence to the actual lane generation. Also verify the per-model vision route: The pure SHA tests and owner-reported 1347 engine tests do not cover these route/lifecycle transitions. No local build or deployment performed during this review. |
…he request reaches (Codex on #5491) P1, lane generation: the recorded build is keyed to the serving lane's EngineIncarnation (pid + OS start time + port), read from the live pidfile and its registry record (lane_registry::live_incarnation, two file reads, no process probe). An answered /props replaces the evidence; a probe error keeps it only while the same known incarnation serves; every live launch (launch_prepared, the one live spawn) forgets it, so a replacement engine answers false until its own /props is read. LlamaServerControl::served_incarnation defaults to None, so fakes and remote controls never carry a reading across an error. P1, vision route: accepts_tail_tools(model) and finish_body read one decision, takes_tail_tools_for(model), which resolves the request's real route through endpoints_for_model_in (the same function the request uses). Only the main serving base, whose build the reconcile verified, answers true; the vision sidecar, a dedicated lane, another base or a provider outside the fork family answer false. Tests: evidence_survives_a_props_error_only_on_the_same_incarnation (A supported; A + error keeps; replaced by B + error false; unknown identity false; old build false; after a launch false) and tail_tools_are_decided_for_the_engine_the_request_reaches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
|
Both findings are addressed at 5076b5c. [P1] Cached build evidence is bound to the lane's generation
[P1] Vision-sidecar route: the decision is made for the actual destination
Verified locally (M5, serving down, build window, 2026-10-26, head 5076b5c):
All touched files stay under 1,000 lines. The live receipts in the PR body are unchanged, owner Fable, after deploy. |
…nation cannot take is refused and rebuilt, never dropped (Codex on #5491) Route: OpenAICompatibleAdapter::route_now(model, base) loads the serving snapshot and the engine evidence once and returns RequestRoute { base, tail_tools } (pure core: route_for). The send takes the wire URL and the tail gate from that one pair; accepts_tail_tools reads the same function. takes_tail_tools_for/tail_tools_reach are gone. Refusal: finish_body returns Result; a request that carries a tail the body cannot send is InferenceError::TailToolsUnreachable (not retryable unchanged), never a silent drop. The deliberation faculty handles it by rebuilding ONCE on the activity's own surface (select_activity_surface, split out of select_tool_surface) with no tail and resending; a second refusal after the rebuild is a named fault. Transition tests: a_route_that_moves_between_selection_and_send_refuses_the_tail_never_drops_it (main lane at selection, sidecar at send: consistent pair, refusal) and a_refused_tail_rebuilds_her_request_without_it_once (one refusal: rebuilt send answers; two: named fault, exactly two requests); request_body test now asserts the refusal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
|
Both remaining items are addressed at 93101d2. (1) One snapshot gives both the route and the tail gate
(2) A tail the destination cannot take is refused and rebuilt, never dropped
Transition tests
Verified locally (M5, build window, serving down, 2026-10-26, head 93101d2):
No crate outside continuum-engine matches |
|
Scoped source PASS at 93101d2 for my requested lifecycle and routing corrections. Launch invalidation and incarnation-aware probe handling address the stale-cache case; stream_checked now uses one RequestRoute for both URL and tail gate. A non-empty tail that cannot reach the wire produces a typed refusal, and the faculty rebuilds once then faults on a second refusal. Reviewed transition tests cover changed sidecar route and bounded rebuild. Owner reports engine1350/cognition1181/hygiene67 on serving-down M5; I did not independently execute those suites. Exact-head CI and the planned installed/running/consumer-specific 15-minute live read still govern integration and rollout. No live speed or learning claim. |
…r_model wrapper had no caller left (CI warning ratchet 14 vs 13) route_now loads the serving snapshot once; the pure route function takes the name endpoints_for_model(model, base, snap). No allow: the dead wrapper is deleted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
|
CI at 93101d2: the only real failure was continuum-core's warning ratchet, 14 against a baseline of 13. The new warning was Fixed at 304d00f. I deleted the wrapper rather than allowing the warning. The pure route function takes over the name Verified locally (M5, build window, 2026-10-26):
CI's exact 13-warning count runs on ubuntu with default features; this CI run is the confirmation. |
… learned tool head (#5502) Every resident is bound through PlacementSwitch, which forwards each capability to current() but not accepts_tail_tools, so it answered the trait default (false) and no resident's learned tool head was ever sent, even on the engine that takes tail_tools (M5 2026-10-27: delib.tool_head.epoch sent=false, Aiko head 5,047 tokens of which 4,514 never called, engine 1c6681593 serving). #5491's tests checked the engine adapter directly, never through the switch. Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
A resident's learned tool head (goal 10) now reaches the wire on a lane that can call a verb outside her cached head, so loading a long-tail tool stops re-prefilling her prompt (goal 11; order of work line 2, prefix reuse). Until now it ran only in shadow (
delib.tool_head.epoch sent=false).What changes
Engine pin
core/vendor/llama.cppmoves from e7e1077b3 to 1c6681593, andLLAMA_CPP_PINis updated to match.git log e7e1077b3..1c6681593is one commit: server: tail_tools are callable without entering the rendered head (restacked on the engine pin) llama.cpp#75 (tail_tools, +208/−3 in 4 files).The capability comes from the running engine, not from a constant. The fork parses
tail_toolsbut names it in no/propskey and no--helpflag. So the evidence is the build the running lane reports (/propsbuild_info), matched against the compiled-in pin by the one SHA rule (deploy_provenance::sha_matches):llama_server/engine_features.rsis the one owner of the decision./propsread that already converges the engine. A probe error keeps the last reading, so her tool surface (and with it her prefix) never flips for one tick.engine_install::build_commitis now the onebuild_infoparse, shared with the stale-engine check.OpenAICompatibleAdapter::accepts_tail_toolsrequires all of the following:tail_tools: true;ProviderCapabilitiesdoc updated);Cloud, airc-remote, stock, operator, stale or unreadable builds answer
false.Guard on the pin: a source-hygiene
vendor_pintest asserts the pinned fork source parsestail_tools. Moving the pin to an engine without it fails CI.Follow-up, card ae4137f1 (owner Fable): the fork reports
tail_toolsin/props, the core reads that report, and the revision tie is deleted.Lines: +110/−10 across 8 Rust files (
git diff --shortstat origin/canary -- '*.rs'), plus the pin and the submodule. No file over 1,000 lines; no new unwrap, env var or constanttrue.Tested (local, M5, serving down, build window, 2026-10-26, head 9c10113)
cargo check --tests -p continuum-engine --features metal -p source-hygiene: clean, with no warnings in the touched files. The Metal check also compiles the bumped submodule through thellamacrate.cargo test -p continuum-engine --features metal --lib: 1347 passed, 0 failed, 5 ignored. That includes the newonly_a_lane_reporting_the_pinned_build_takes_tail_tools(pinned short and full commit give true; e7e1077b3,unknown, an empty commit and an empty string give false).cargo test -p source-hygiene: 67 passed, includingthe_pinned_engine_source_parses_tail_toolsandthe_vendored_llama_cpp_pointer_equals_the_recorded_pin.ratchets origin/canary(base 6dd7f8c): every ratchet is flat, exit 0.git rev-parse 1c6681593^{tree} ca53e26b3^{tree}gives 7e44b5fc both times). The complete Metal gate ran on that head on this M5 earlier today:ctest -L main56/56 and-L python1/1, with fatal warnings on and 0 warnings. Receipt: server: tail_tools are callable without entering the rendered head (restacked on the engine pin) llama.cpp#75 (comment)Measured (after deploy)
Owner: Fable. Deadline: the first deploy window after merge, followed by a 15-minute live read. The card stays open until these receipts are posted.
.llama-server.stampreads1c6681593…, and the lane's/propsbuild_infoends in1c6681593.engine_staleis clear.delib.tool_head.epoch sent=truefor every resident on the lane.ai.request.tool_surfacerecord withtail_tools_n > 0, followed by that verb's executed tool result, which is a real call and not text.🤖 Generated with Claude Code
https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo