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.
| Key | What it does |
|---|---|
a | Allow this request. The exact target stays allowed for this session. |
d | Block this request. Identical retries are blocked for a short window. |
l | Allow, and save a permanent rule for this exact target. |
s | Allow a directory, for operations you pick, this session only. |
b | Block a directory for the rest of the session - no more prompts for it. |
t | Deny and stop the supervised tool. |
i | Show the raw arguments and the request id. |
h | Help overlay. While it is up the dialog is modal, so no decision is made blind. |
esc | Deny 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+Ctwice within a second force-quits the session and denies everything still pending. dis 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.
$ grith digest
Digest queue: 0 pending items
No pending digest items.$ grith digest reviewreview is a single-keypress interface over the pending items, one at a time, with the
filter breakdown for each.
| Key | What it does |
|---|---|
a | Approve. |
d | Deny. |
l | Approve, and save a permanent rule for this exact target. |
p | Approve, and add the target to the user allowlist. |
u | Approve, and unlock egress containment for the session. |
t | Deny and terminate the supervised process. |
e | Mark escalated. The item stays in the queue. |
s | Skip to the next item without deciding. |
v | Toggle between the list and the detail view. |
j / k | Next / previous item. |
q | Quit. 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.
$ grith daemon startA 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:
$ grith daemon pair
Dashboard is not running. Start it with: grith dashboard startgrith 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 execsession is auto-denied aftersupervisor.freeze_timeout_seconds(300 by default), so a held thread cannot wait forever. The REPL's inline review usesproxy.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-queuedflips 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
- The quarantine digest - why the middle band exists.
- Composite scoring - where 3.0 and 8.0 come from.
- Digest API - deciding items programmatically.