Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 16 additions & 11 deletions examples/06-whisper-prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,11 @@ options.
}
```

The Coordinator routes this with the **`whisper` channel**: typically
an interrupt-style notification in the human's client, distinct from
normal review queues. The deadline starts ticking.
The Coordinator records the whisper, and its 60-second deadline runs
from this ask. Getting the question in front of Alice, for example as a
notification in her client, is up to the deployment: a Coordinator has
no delivery layer of its own (see
[SPECIFICATION.md §15.1](../SPECIFICATION.md#151-mandatory-protections)).

---

Expand Down Expand Up @@ -102,8 +104,8 @@ whisper and the answer are recorded in the chain.

## 6.4 What if no one answers?

Whispers are deadline-bound. If Alice had been away from her desk, at
T+60s the Coordinator would emit:
Whispers are deadline-bound. If no answer is recorded within 60
seconds, the first lapse check after the deadline records:

```json
{
Expand All @@ -125,9 +127,12 @@ T+60s the Coordinator would emit:
}
```

The agent proceeds with the default. The lapse is recorded as a
first-class evidence entry, so the auditor can see exactly when a
human declined to be reachable for a given decision.
The agent proceeds with the default. The lapse is an entry on the
chain, so an auditor can see that no answer came in time and which
default was applied. It does not say why: a person
who saw the question and let it lapse and a person who was never
notified leave the same record, because delivery is left to the
deployment (see [`profiles/whisper.md`](../profiles/whisper.md) §4).

---

Expand Down Expand Up @@ -157,9 +162,9 @@ task's `complete`.
responsiveness.
- **Whisper analytics.** "What fraction of cancellations involve a
whisper?" is a single audit query.
- **Visible accountability for non-response.** A lapsed whisper is
recorded with the timestamp and the default applied; nothing
silently disappears.
- **Visible lapses.** A lapsed whisper is recorded with its time and
the default applied, so an unanswered question stays on the record.
The record shows only that no answer arrived in time.

Move on to [`07-handoff-shift-change.md`](./07-handoff-shift-change.md)
for transferring an in-progress task between humans.
2 changes: 1 addition & 1 deletion packages/chap-analytics/chap_analytics/briefs.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ def whispers(f: Frames) -> Brief:
if not r["sufficient"]:
decision = "Too few resolved questions to judge; the lapse rate will settle as more are asked."
elif r["lapse_rate"] > 0.25:
decision = "More than a quarter lapse: the default answer is deciding those questions. Put the answer in the task input, or route whispers to whoever is at the desk."
decision = "More than a quarter lapse: the default answer is deciding those questions. Put the answer in the task input, check that the questions reach the people asked, or address them to someone who can answer in time."
else:
decision = "Questions are being answered in time."
return Brief("whispers", "Whether agents get answers", head, text, decision, bool(r["sufficient"]), w)
Expand Down
3 changes: 2 additions & 1 deletion packages/chap-analytics/chap_analytics/charts.py
Original file line number Diff line number Diff line change
Expand Up @@ -629,7 +629,8 @@ def whispers(w: pd.DataFrame, by: str = "asker") -> Chart:
"""Lapse rate per asker with intervals. Takes :func:`stats.whispers` output."""
name = "whispers"
q = "How often do agents have to ask, and does anyone answer in time?"
d = "A high lapse rate is a question the task input should have answered, or a reviewer who is never at the desk."
d = ("A high lapse rate points at questions the task input should have answered, or at questions that "
"reach no one in time. The chain records only that no answer arrived before the deadline.")
if w.empty:
return _empty(name, "Whispers that lapsed", q, d, "No whispers in this chain.")
key = by if by in w.columns else None
Expand Down
2 changes: 1 addition & 1 deletion packages/chap-analytics/docs/example_report.html

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -4149,7 +4149,7 @@
" -> Reviewers agree on nearly every shared pass. Kappa is low only because almost all of those passes are acceptances, which leaves little disagreement to measure.\n",
"\n",
"64 questions asked, 20 lapsed (31%, 21% to 43%); answers took a median of 5 minutes.\n",
" -> More than a quarter lapse: the default answer is deciding those questions. Put the answer in the task input, or route whispers to whoever is at the desk.\n",
" -> More than a quarter lapse: the default answer is deciding those questions. Put the answer in the task input, check that the questions reach the people asked, or address them to someone who can answer in time.\n",
"\n",
"10 handoffs proposed, 9 accepted (90%, 60% to 98%), 1 declined, 0 open; resolved in a median of 26 minutes.\n",
" -> Work moves between people when it needs to.\n",
Expand Down
17 changes: 14 additions & 3 deletions profiles/whisper.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,9 +124,20 @@ no human input) is visible on an `audit.read` filtered by task:
}
```

The asker proceeds with the default. A lapsed whisper is itself
audit data, "this human was unreachable for this decision" is now
queryable.
The asker proceeds with the default. The lapse is recorded against the
whisper's task, so an `audit.read` filtered by task returns the question
and its lapse together.

**What a lapse does and does not show.** The `whisper.ask` entry records
who asked whom, when, and the deadline. The lapse notification records
that no `whisper.answer` arrived before the lapse check ran, and the
default applied. Neither records whether the participants asked were
notified, saw the question or chose not to answer. Delivery is left to
the deployment, and neither reference implementation provides it
([SPECIFICATION.md §15.1](../SPECIFICATION.md#151-mandatory-protections),
item 10). A person who was never told and a person who saw the question
and let it pass therefore leave the same record. A deployment that needs
to tell them apart has to record delivery itself.

---

Expand Down
Loading