---
title: Stuck-task helper (get unstuck when you keep snoozing the same thing)
---
# Stuck-task helper (snooze-resistance coach)

## What it is

The **Stuck-task helper** notices when you keep putting off the _same_ thing and
offers a hand. When you snooze the same session, email, pull request, or message
**three times without ever working on it in between**, Omniscio quietly
drops one dismissible card
in your Inbox: **"Want a hand getting unstuck?"** Accept it and Omniscio starts a short
AI chat that's already been told what you've been avoiding — it interviews you to
figure out what's actually in the way (you're not sure where to start, it feels
too big, it's boring, you're blocked on someone, or you're worried about getting
it wrong) and helps you take one tiny first step.

It's **optional and off by default** — a Lab toggle. Nothing changes for anyone
who doesn't turn it on. The idea: repeatedly deferring something _you never touch_
is a reliable signal of _resistance_, and a two-minute conversation to name the
block and shrink the task is often all it takes to get moving. The moment you
actually work on it, the count resets — so snoozing things you're actively doing
(just to time-box your day) never trips it.

## Where to find it

The card appears in your Inbox on its own. Turn it on or off in **Settings → Lab**.

## How it behaves

### How to use it

1. **Turn it on.** Settings → **Lab** → enable **"Stuck-task helper"** (it's an
   in-development feature, hidden until you opt in; a developer can also launch
   with `AMC_SHOW_STUCK_TASK_HELPER=1`).
2. **Use Omniscio normally.** Snooze things as you always do. The feature only watches
   for the _same_ item being snoozed over and over.
3. **The offer appears.** On the third snooze of one item _that you haven't worked
   on in between_, a card shows up in
   your Inbox: _"Want a hand getting unstuck?"_ with a short note about how many
   times you've put it off. It never nags — you get the offer **once** per item,
   ever, and you can dismiss it like any inbox row. If you'd rather not get these at
   all, the card has a quiet **Turn off these nudges** link at the bottom that switches the
   whole feature off (after a quick confirm) and clears the card — the confirm reminds you
   it lives at **Settings → Lab** so you can turn it back on any time. Only **one** of these cards is
   ever shown at a time, so snoozing a big pile of things at once (a "snooze
   everything till tomorrow") can't bury your Inbox in identical cards — any other
   item that gets stuck waits its turn until you clear the one that's up.
4. **Accept with "Talk it through".** Open the card and click **Talk it through**.
   Omniscio opens a new chat session that greets you about that specific task and starts
   a brief, friendly interview. It will usually help you carve out a five-minute
   first step — and offer to start it with you right then (draft the opening line
   of that email reply, outline the first sub-task, etc.). If the honest answer is
   "this shouldn't be done," it helps you reschedule it concretely, hand it off, or
   drop it cleanly — that counts as unstuck too.

### How it works

**Counting (durable, survives the return).** Omniscio normally keeps no record of how
often you've snoozed something — a snooze just sets a wake time that's cleared when
the item comes back. So the feature adds a small private ledger
(`snooze_resistance`, [migration](../../src/main/db/migrations/20260610042000-create-snooze-resistance-ledger.ts) +
[queries-snooze-resistance.ts](../../src/main/db/queries-snooze-resistance.ts))
that counts **fresh** snooze episodes per item and **survives the
snooze→return→snooze-again cycle** — which is exactly the pattern it's looking for.
Editing the time of an already-active snooze doesn't count (that's not a new
push-away), and a "dismiss" action that some inbox rows implement as a snooze to
the year 9999 doesn't count either.

**Engaging resets the count.** "Resistance" means deferring something you _never
touch_ — so the count only climbs on _consecutive_ snoozes with **no engagement in
between**, and the moment you engage the item the streak resets to one. For a
session, "engaging" is sending it a real message (your messages only — the snooze
marker itself never counts as engagement). This is what keeps the offer from firing
on work you're actively doing and merely time-boxing. Today this reset applies to
**sessions** (where the signal — your last message to the session — is cheap and
already tracked); the other kinds still count cumulatively until they grow an
equivalent "did you engage" signal.

**Where it watches.** Three snooze paths feed one recorder
(`recordSnoozeForResistance` in
[stuck-task-helper-service.ts](../../src/main/services/stuck-task-helper-service.ts)):
sessions ([session-snooze-service.ts](../../src/main/services/session/session-snooze-service.ts)),
universal inbox items like PRs / messages / tickets
([inbox-snooze-service.ts](../../src/main/services/inbox/inbox-snooze-service.ts)), and
emails ([gmail-snooze-service.ts](../../src/main/services/email/gmail-snooze-service.ts)).
It tracks only kinds that read as "a task you're avoiding" (sessions, email, SMS,
Telegram, pull requests, Jira issues, support chats) — not feeds, drip messages, or
daily briefings, and never the offer card itself.

**The offer.** At the third snooze, Omniscio raises a normal **inbox alert**
(the same dismissible-row primitive agents use — see
[inbox-alerts.md](inbox-alerts.md)), once per item. No pop-up notification, so a
sensitive email subject never flashes on screen. **At most one offer is active at a
time** (`STUCK_TASK_MAX_ACTIVE_OFFERS = 1`): when many items cross the threshold
together (a bulk snooze), only the first raises a card; the rest are _deferred_ — not
stamped as offered — and surface on a later snooze once the visible card is dismissed
or accepted and the slot frees. And once an item has been offered it is **never**
offered again, even after you dismiss the card and keep snoozing it — the durable
`offered_at` stamp guarantees it (it is also protected from the ledger's age-purge). When the snoozed thing is a
**session**, the card names it as a clickable link (tap it to jump straight to that
session) and shows which project it's in; other kinds (email, PR, message) read as
plain text since there's no Omniscio session to open.

**The coach.** Accepting runs `startStuckTaskHelper`, which starts a session using
the **deferred Super-Prompt** mechanism (see [use-super-prompts.md](use-super-prompts.md)):
the coach's opening message shows instantly, and the AI model only spins up when you
reply — so it's cheap and immediate. The session opens **named after the task**
("Get unstuck: <task>") so it's easy to spot in your sidebar, pre-loaded with a warm,
non-clinical "get-unstuck" persona plus a brief about the stuck item. For a session
that brief **leads with what you originally set out to do** (the first message of that
session) and then a short recap of the most recent real activity — so the coach
understands the actual task even when the session's recent history is just background
chatter (test runs, "waiting on…" notes). It opens in the item's project when there is
one, otherwise in your `~/Claude` project, and answers a direct question instead of
only volleying back its own. It deliberately does **not** reuse Omniscio's wellness-framed
"AI Coaching" feature — this is a normal work session.

**Gating.** The whole feature is registered in the unreleased-feature system
(Omniscio’s unreleased-feature (“Lab”) gate) as
`stuck-task-helper` with the `stuckTaskHelperEnabled` setting (default off). When
it's off, the counter does nothing at all.

## Related

- [snooze-a-session.md](snooze-a-session.md) — how snoozing works (the behavior this feature watches).
- [inbox-alerts.md](inbox-alerts.md) — the dismissible inbox-row primitive the offer is built on.
- [use-super-prompts.md](use-super-prompts.md) — the deferred instant-greeting launch the coach reuses.
- [ai-coaching.md](ai-coaching.md) — the separate wellness coaching feature this one deliberately does NOT reuse.
- Omniscio’s unreleased-feature (“Lab”) gate — how the Lab toggle hides it until shipped.
- Contract (invariants + tests): `.claude/memory/contracts/snooze-resistance-coach-contract.md`.
