---
title: Weekday Reflection Nudge (a timely once-a-weekday "could an agent do this?" inbox card)
---

# Weekday Reflection Nudge

## What it is

A gentle, once-per-weekday **inbox card** that nudges you to step back and reflect on what you've
been doing — and whether an Omniscio AI agent or automation could take some of it off your plate.
It's built to feel **timely**: it never lands while you're away, and it only shows up on Monday–Friday.

The card's wording rotates in tone day to day — some days curious ("What would you most love to
automate?"), some days gentle ("What have you been heads-down on today? There may be an agent for part
of it."), some days straightforward — but never accusatory. Showing the card costs nothing (no AI call
— the copy comes from a fixed rotating pool).

**In-development, off by default.** It's hidden until you reveal it via **Settings → Lab** (the
`reflection-nudge` toggle) or launch with `AMC_SHOW_REFLECTION_NUDGE=1`. When it later ships, it becomes
on-by-default with a one-click off switch.

## Where to find it

### Turning it off

One switch. While in development it's the **Settings → Lab** `reflection-nudge` toggle (off by default).
When off, the scanner raises nothing.

## How it behaves

### When it fires

A lightweight background scanner ticks every ~5 minutes and drops **exactly one** card per weekday when
ALL of these are true:

- The feature is enabled (the Lab toggle or the env var).
- It's a weekday, in your computer's local time zone.
- It's at or after the day's **target time** — a random-but-deterministic time in an early-biased window
  (~9am–3pm), so it's unpredictable yet stable within the day (every tick agrees on the same time).
- You're **genuinely active right now** — you've sent at least one real message (to any session) in the
  last ~15 minutes. This is what makes it timely, and it also proves you can actually start the chat, so
  the card never dead-ends.
- It hasn't already fired today.

Because it keys on your own messages (never your agents' activity), it can't land while only your agents
are busy and you're away.

### The card

It's a normal Omniscio inbox card (the same card chrome every agent alert uses — themed, works on the
phone). Its actions:

- **"Let's talk about it"** (the primary button) — opens a foreground Claude chat, pre-seeded to
  interview you about what you just did, brainstorm where an agent or automation could help, and — when a
  concrete idea emerges — hand you off to the **automation builder** or **Foundry** to actually build it.
  The chat opens in your neutral Claude home project.
- **Start session** — the universal button every inbox card carries (unchanged).
- **Snooze** — the standard inbox snooze picker; it comes back later.
- **Dismiss (archive)** — clears it. A dismissed card does not come back the same day; a fresh one is
  eligible the next weekday.

## For agents

### For agents — how it's built

- **Pure scheduling logic** — [src/shared/reflection-nudge.ts](../../src/shared/reflection-nudge.ts):
  the stable dedup key (`REFLECTION_NUDGE_DEDUP_KEY`) + `isReflectionNudgeDedupKey`, the rotating-copy
  index selector, the deterministic-per-date target time, and `shouldFireReflectionNudge` (weekday +
  target + once-per-day). React-free, side-effect-free, imported by both main and renderer.
- **The scanner** —
  [src/main/services/reflection-nudge/reflection-nudge-service.ts](../../src/main/services/reflection-nudge/reflection-nudge-service.ts):
  a `createRegisteredService` 5-min tick (modeled on the AI-coaching check-in scanner), gated through
  `isUnreleasedFeatureVisible('reflection-nudge', …)`, raising the card via `raiseAgentAlert`. Registered
  in [registry.ts](../../src/main/startup/registry.ts) and torn down in
  [shutdown.ts](../../src/main/app/shutdown.ts).
- **The activity signal** — `countSessionsWithUserMessageSince` in
  [queries-sessions/reads.ts](../../src/main/db/queries-sessions/reads.ts) counts sessions whose
  `last_user_message_at` (bumped only by real human messages, never auto-responses) is inside the trailing
  window.
- **The card action** — the `isReflectionNudgeDedupKey` carve-out in
  [use-alert-actions.ts](../../src/renderer/src/features/alerts/use-alert-actions.ts) +
  [AlertInboxViewer.tsx](../../src/renderer/src/features/alerts/AlertInboxViewer.tsx); its seeded prompt
  is the fixed constant `REFLECTION_CHAT_PROMPT` (never user input), launched via `launchSession` with the
  `reflection-nudge` source.
- **The off switch** — `reflectionNudgeEnabled` (default false) in
  [ai-features-settings.ts](../../src/shared/types/settings/ai-features-settings.ts), registered in
  [unreleased-features.ts](../../src/shared/unreleased-features.ts).
- Behavior is locked by [reflection-nudge-contract.md](../../.claude/memory/contracts/reflection-nudge-contract.md).

## Related

No sibling library page is referenced from this one, so a reader who wants more should open [INDEX.md](INDEX.md), the library index, and browse the areas from there.
