"My session started with no context" is three different failures wearing one sentence. Work out which one you have before trying to fix it.
| Failure | Question it answers | Evidence |
|---|---|---|
| Emission | Was a packet built and handed over at all? | The delivery receipt exists, or does not. |
| Ingestion | Did the model read it? | The attribution line: relevant, none, or absent. |
| Relevance | Was there anything worth carrying? | The packet was delivered and read, and reported nothing relevant. |
First: is this a failure at all?#
Two states look like a broken brief and are not.
Delivered, read, and judged not to bear on the work at hand. A working system reporting a real result, and more useful than one claiming every briefing was valuable.
There is nothing to brief with. A brief is made of other sessions, and the first one has none behind it. See What to expect in the first hour.
Emission: no packet was handed over#
The critical hook is missing#
SessionStart is the delivery mechanism. Without it, sessions start
with no briefing and adopt no task, while everything after it keeps publishing.
The session looks alive and arrives empty.
FAIL hooks SessionStart not registered — sessions start with no
team briefing and adopt no task
Reconnect the agent from Settings → Agents.
The repository is not tracked#
An untracked folder receives nothing and publishes nothing, by design. The
doctor's this repo line is the check. See
Repositories.
The agent has no push channel#
Three cases where nothing can push. The fix is to pull instead.
| Case | Why | Do |
|---|---|---|
| Codex Desktop or VS Code | Runi does not launch those sessions, so nothing can hand them a packet. | Use the relay-codex wrapper for the CLI; otherwise rely on the runi_brief guidance block. Details. |
| OpenClaw with prompt injection off | An operator can set allowPromptInjection: false, and Runi cannot detect it. |
Check openclaw.json. Details. |
| OpenCode without the experimental hook | Injection depends on a hook OpenCode marks experimental. | Call runi_brief through MCP instead. Details. |
Receipts are not being filed#
If receipts cannot be filed, briefings may well be landing while the app cannot show it. You lose the evidence, not the feature:
warn receipts delivery receipts not filed — not found (1 h ago);
sessions cannot show whose briefing they reached
A receipt failure is a health note, never a broken session. It is filed after the context is already on its way to your agent.
Ingestion: delivered, apparently unread#
A receipt marked absent means the first reply carried no attribution line, so nothing evidences the packet being read. Tool availability is not evidence either. An agent having Runi's tools does not establish that it fetched anything.
Ask the session directly. The briefing arrives as ordinary context in every adapter, so the session can tell you what it was given. That settles emission versus ingestion in one question.
Check the guidance block for Codex, then start a new session. Guidance is read at session start and is not applied retroactively.
Restart agent sessions after an update. MCP servers are long-lived and keep running the previous daemon. The doctor's generation line names them.
Relevance: delivered, read, and thin#
The packet ranks under a token budget. If the right thing existed but did not make the cut, these are the levers, most effective first.
-
Confirm your memory entries#
Unconfirmed entries ride nothing at all. This is nearly always the answer for a team a fortnight in: the material exists, sitting in proposed, unsigned.
-
Link the session to the right task#
A linked task's own records take up to half the packet ahead of ranking. A session on the wrong card is being briefed for the wrong job.
-
Answer “useful / not”#
Records that rode a briefing you called useful get a tiebreak next time. It will never lift a memory entry over an open blocker, so it cannot be used to bury what is on fire.
-
Use the pull channel for the tail#
Everything below the budget line is still reachable by asking:
runi_search,runi_task,runi_continue. See Asking Runi from inside your agent. -
Raise the budget, last#
contextBudgetin~/.relay/config.json, 1,000 to 12,000, default 4,000. Bigger is not automatically better: a packet that fills the window is a packet the agent skims.
Check exactly what a session would receive#
From the repository, on the machine in question. This is the same packet builder the hooks use, so it is not an approximation:
$ node ~/.relay/daemon/relay-cli.js brief
The app's packet inspector runs the same module, if you would rather read it there.
A briefing that arrived incomplete#
When a collection is unreachable at build time, the packet says so inside
itself. The agent is told its briefing is partial instead of being handed a
confident subset. The doctor repeats it for you under context. It
is usually transient; if it persists,
tell us.