fix(skills): classify golem feed events so just golems clears stale blocks#613
Merged
Conversation
…locks
The golem Notification feed logged an identical event:"blocked" line for
every notification — including transient between-turn idles ("Claude is
waiting for your input") that fire while a sub-agent runs mid-work — and had
no resolution event, so just golems' BLOCKED list showed phantom blocks and
never cleared them.
- golem-notify.sh (repo + template copies) now classifies each notification
into event:"gate" (a real permission decision) vs event:"idle" (a transient
idle). Match is case-insensitive and defaults to gate, so an unrecognized
notification surfaces rather than being silently dropped.
- just golems lists a golem as BLOCKED only when its most-recent feed line is
a fresh gate. The feed is append-only/chronological, so an idle emitted once
the golem resumes supersedes an earlier gate and clears the block — no
separate resolution hook needed. A freshness window (GOLEM_BLOCK_TTL, default
3600s) drops gates left by exited golems. Legacy "blocked" lines are honored
as gates for backward compatibility.
- Document the feed event vocabulary in orchestrate/mode-protocol.md.
- Add classification tests (gate, idle, case-insensitive, default-gate,
template parity) to tests/unit/claude/test_golem_notify.sh.
Closes #600
4 tasks
This was referenced Jun 27, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The orchestrate golem
Notificationfeed logged an identicalevent:"blocked"line for every notification — including transient between-turn idles
("Claude is waiting for your input") that fire while a sub-agent runs mid-work —
and had no resolution event. As a result
just golems' BLOCKED list showedgolems that were not actually waiting and never cleared entries for golems that
had since moved on. Benign with one golem; actively misleading with a parallel
batch, which is exactly when the feed is supposed to help.
Changes
golem-notify.sh, repo + template copies):map the message to an
eventkind —gatefor a real permission decisionvs
idlefor the transient "waiting for your input". Match iscase-insensitive and defaults to
gate, so an unrecognized notificationsurfaces (fail loud) rather than being silently dropped as idle.
just golems): a golem is BLOCKED onlywhen its most-recent feed line is a fresh
gate. The feed isappend-only/chronological, so an
idleemitted once the golem resumessupersedes an earlier
gateand clears the block. A freshness window(
GOLEM_BLOCK_TTL, default3600s) additionally drops a gate left behind byan exited golem. Legacy
blockedlines (pre-golem feed: 'blocked' fires on transient idle and never resolves, so just golems shows phantom/stale blocks #600 feeds) are honored as gatesfor backward compatibility.
gate/idle/legacyblocked,default-gate, implicit-clear, TTL) in
orchestrate/mode-protocol.md.Test plan
tests/unit/claude/test_golem_notify.sh: gate,idle, case-insensitive, default-to-gate, and template parity. Full suite
passes 14/14.
shellcheck -xclean on both hook copies;just --evaluateparses;just golemsverified against the live feed (legacyblockedlines correctlysurface, idle-after-gate clears, stale gates drop by TTL).
Acceptance criteria
just golemsBLOCKED list excludes golems that have since resumedorchestrate/mode-protocol.mdCloses #600