grithdocs

Reviewing the digest

Where a held call shows up, every key that decides it, and what happens when nobody answers.

A call that scores above proxy.auto_allow_threshold (3.0) and at or below proxy.auto_deny_threshold (8.0) is held for a decision. The calling thread stops at its kernel stop until you answer; the tool's other threads carry on.

There are two places to answer: inside the session, and in the queue.

In the session

Running under grith exec, the question appears in the terminal UI over your tool: what it is trying to do, what it scored, and which filters fired.

KeyWhat it does
aAllow this request. The exact target stays allowed for this session.
dBlock this request. Identical retries are blocked for a short window.
lAllow, and save a permanent rule for this exact target.
sAllow a directory, for operations you pick, this session only.
bBlock a directory for the rest of the session - no more prompts for it.
tDeny and stop the supervised tool.
iShow the raw arguments and the request id.
hHelp overlay. While it is up the dialog is modal, so no decision is made blind.
escDeny this request.

Nothing outlives the session unless you save it with l, and sensitive targets are never saved. s and b appear only when the score is at or below 8.0.

Above 8.0 there is nothing to decide: the call was already denied, and the dialog exists to tell you. It offers c to acknowledge and continue, i for the full record, esc to carry on.

Two things worth knowing before you meet them:

  • Pressing Ctrl+C twice within a second force-quits the session and denies everything still pending.
  • d is not just this call. An identical call denied within the last 60 seconds is denied again without asking, so a tool retrying in a loop cannot wear you down. Approvals replay the same way for 60 seconds - except while the session is contained, where they do not.

ℹ️You will get a desktop notification

If a prompt is still waiting after about 15 seconds, grith raises a desktop notification and the dashboard updates live.

In the queue

Every held call becomes a digest item. In an exec session you answer it at the prompt; anything not answered there - a dashboard-driven session, or one you walked away from - sits in the queue until it is decided or the timeout below denies it.

terminal
$ grith digest
Digest queue: 0 pending items
No pending digest items.
terminal
$ grith digest review

review is a single-keypress interface over the pending items, one at a time, with the filter breakdown for each.

KeyWhat it does
aApprove.
dDeny.
lApprove, and save a permanent rule for this exact target.
pApprove, and add the target to the user allowlist.
uApprove, and unlock egress containment for the session.
tDeny and terminate the supervised process.
eMark escalated. The item stays in the queue.
sSkip to the next item without deciding.
vToggle between the list and the detail view.
j / kNext / previous item.
qQuit. esc does the same. Undecided items stay in the queue.

There is no grith digest approve <id>. review is the whole interface; the REST API is the route for anything scripted. l and p both persist, to different files: l writes a profile-scoped rule to ~/.config/grith/learned_rules.toml, p an entry to ~/.config/grith/filters/allowlist.toml. l also feeds the learned table described in Adaptive reputation, which only ever turns a queue into an allow, never a deny.

The dashboard

The daemon serves a local dashboard on http://127.0.0.1:3141 with the same queue, the session list and the filter breakdowns.

terminal
$ grith daemon start

A fresh browser has to be paired once. grith daemon pair mints a single-use code, then either opens the browser already authorised or prints a #pair= link for you to open - useful over SSH. The fragment never reaches the server; the page exchanges it for a token and strips it from the URL.

Run it with nothing listening and it tells you so:

terminal
$ grith daemon pair
Dashboard is not running. Start it with: grith dashboard start

grith dashboard is a retained alias for grith daemon, which is why some output names one and some the other. Both work.

When nobody answers

  • Timeout. An unanswered prompt in a grith exec session is auto-denied after supervisor.freeze_timeout_seconds (300 by default), so a held thread cannot wait forever. The REPL's inline review uses proxy.review_timeout_seconds, also 300.
  • No terminal. A session with no TTY and no dashboard attached denies queued operations immediately rather than blocking. grith exec --allow-queued flips that to allow-and-log - except where containment or taint put the call in the queue band, which still fails closed. See Running in CI.

See also

Last updated: 2026-08-24Edit this page on GitHub →