Skip to content

fix(skills): classify golem feed events so just golems clears stale blocks#613

Merged
joshjhall merged 1 commit into
mainfrom
feature/issue-600
Jun 27, 2026
Merged

fix(skills): classify golem feed events so just golems clears stale blocks#613
joshjhall merged 1 commit into
mainfrom
feature/issue-600

Conversation

@joshjhall

Copy link
Copy Markdown
Owner

Summary

The orchestrate 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. As a result just golems' BLOCKED list showed
golems 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

  • Classify the notification (golem-notify.sh, repo + template copies):
    map the message to an event kind — gate for a real permission decision
    vs idle for the transient "waiting for your input". Match is
    case-insensitive and defaults to gate, so an unrecognized notification
    surfaces (fail loud) rather than being silently dropped as idle.
  • Resolution without a new hook (just golems): a golem is 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. A freshness window
    (GOLEM_BLOCK_TTL, default 3600s) additionally drops a gate left behind by
    an exited golem. Legacy blocked lines (pre-golem feed: 'blocked' fires on transient idle and never resolves, so just golems shows phantom/stale blocks #600 feeds) are honored as gates
    for backward compatibility.
  • Document the feed event vocabulary (gate/idle/legacy blocked,
    default-gate, implicit-clear, TTL) in orchestrate/mode-protocol.md.

Test plan

  • Added classification tests to tests/unit/claude/test_golem_notify.sh: gate,
    idle, case-insensitive, default-to-gate, and template parity. Full suite
    passes 14/14.
  • shellcheck -x clean on both hook copies; just --evaluate parses; just golems verified against the live feed (legacy blocked lines correctly
    surface, idle-after-gate clears, stale gates drop by TTL).

Acceptance criteria

  • Feed distinguishes a real permission gate from a transient idle
  • just golems BLOCKED list excludes golems that have since resumed
  • Transient "waiting for your input" idles do not appear as actionable blocks
  • Feed event vocabulary documented in orchestrate/mode-protocol.md

Closes #600

…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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

golem feed: 'blocked' fires on transient idle and never resolves, so just golems shows phantom/stale blocks

2 participants