I would put the question to Relay directly: once the lock says no, does it hand the agent the reason from the graph, or does it just report the conflict and leave the agent to work out why? The difference matters for whether a blocked agent retries sensibly or just tries the same edit again.
Good question, and the answer is the first one: the reason comes back with the denial. When a lock is refused, Relay adds what the holder is working on to the message the agent sees, something like: "File is locked by Claude Code. They're working on: 'switch the login flow to JWT tokens' (2 min ago)." So the blocked agent doesn't have to guess.
One detail on where it comes from. The lock check never queries the graph live, because it runs before every edit and can't afford a database round trip. The holder's intent sits in a small in-memory cache that's kept up to date as agent conversations are ingested into FalkorDB, and refilled from the graph when Relay restarts. If we're not confident about the holder's current task, the wording softens to "was last working on" instead of claiming too much.
Whether the agent then retries sensibly is partly up to the agent. The message tells it to pick a different task, and before touching unfamiliar files it can also ask Relay for a briefing, which pulls past blocks and decisions from the graph. In our own testing, the old behaviour was a retry storm (25 attempts in 10 seconds). With the reason attached, a blocked agent has what it needs to move on instead.
Adam Lewis
Product Engineer/Architect navigating the AI revolution
I would put the question to Relay directly: once the lock says no, does it hand the agent the reason from the graph, or does it just report the conflict and leave the agent to work out why? The difference matters for whether a blocked agent retries sensibly or just tries the same edit again.