> ## Documentation Index
> Fetch the complete documentation index at: https://docs.xynthis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Workspace readouts

> See which concepts the model weighed while generating a reply.

With `XYNTHIS_JSPACE=1`, the model server reports the concepts the model weighed while generating each reply. Every chat completion then carries an additive `xynthis_jspace` block: the reply's dominant concepts, with weights and how many generated positions were captured. The block is an extension field (standard OpenAI clients ignore it), so turning it on never breaks an existing integration.

```sh theme={null}
XYNTHIS_JSPACE=1 xynthis-llm-serve
```

`GET /status` reports `"jspace": true` when capture is on.

## What it looks like

Ask the model to name one color:

```sh theme={null}
curl http://127.0.0.1:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"model": "xynthis-local", "messages": [{"role": "user", "content": "Name one color, one word only."}]}'
```

```json theme={null}
{
  "id": "chatcmpl-6f4c9a2e-...",
  "object": "chat.completion",
  "created": 1783980000,
  "model": "xynthis-local",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "Blue." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 7, "completion_tokens": 1, "total_tokens": 8 },
  "xynthis_jspace": {
    "concepts": [
      { "label": "blue", "weight": 0.41, "rank": 1 },
      { "label": "color", "weight": 0.19, "rank": 2 },
      { "label": "green", "weight": 0.14, "rank": 3 },
      { "label": "red", "weight": 0.11, "rank": 4 },
      { "label": ".", "weight": 0.08, "rank": 5 }
    ],
    "generated_positions": 3
  }
}
```

The reply is "Blue." The workspace shows the model was also weighing "green" and "red" while it generated. `weight` is each concept's share of the captured activation mass across the whole reply, so the weights sum to 1. Up to 10 concepts are reported, rank 1 first. `generated_positions` is the number of generated tokens the readout aggregates over.

On streaming requests (`"stream": true`), the block arrives on the final SSE chunk (the one with `"finish_reason": "stop"`), after all the token deltas.

Capture reads the token distributions the generation loop already computes, so the cost is one top-k softmax per generated token. `XYNTHIS_JSPACE_TOPK` sets how many candidate tokens are read per position (default 5). When `XYNTHIS_JSPACE` is unset, none of this code runs.

## What a readout is, and is not

The readout is a logit lens: at each generated token, it records the top few tokens the model's output distribution assigned probability to, and aggregates those across the reply into concepts. It answers "what was the model disposed to say at each step": the alternatives it weighed, not just the one it picked.

It is not a proof of reasoning. A logit lens reads dispositions in the output vocabulary; it does not trace the causal path that produced the answer, and a concept appearing with low weight does not mean the model "considered and rejected" it in any deliberate sense. Treat it as a transparency signal, useful for spotting what a reply was competing against, not as an explanation you can cite as ground truth.

## Feeding readouts to the brain

Set `XYNTHIS_JSPACE_TO_BRAIN=1` (on top of `XYNTHIS_JSPACE=1`; it does nothing alone) and the server additionally submits each reply's dominant concepts to the brain as a perception line:

```text theme={null}
model workspace while replying: blue, color, green, red
```

These land in the brain's session-only working memory. They give in-session context (the brain can see what its model was weighing), but they never become durable facts: the brain excludes them from every process that produces stored memories or training data, and they expire with the session. Submission runs on a background thread, so it never delays the HTTP response, and a brain that is down is silently skipped.
