@aitne-sh/aitne 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +12 -8
  2. package/agent-assets/agent-profiles/background-task.md +53 -0
  3. package/agent-assets/agent-profiles/conversational.md +1 -0
  4. package/agent-assets/agent-profiles/routine-fetch-window.md +14 -75
  5. package/agent-assets/agent-profiles/routine.md +1 -1
  6. package/agent-assets/agents/{hourly-check → activity-scan}/agent.md +22 -17
  7. package/agent-assets/agents/monthly-review/agent.md +6 -5
  8. package/agent-assets/agents/morning-routine/agent.md +3 -4
  9. package/agent-assets/docs/concepts/agent-day.md +4 -5
  10. package/agent-assets/docs/concepts/auth-health.md +23 -20
  11. package/agent-assets/docs/concepts/backends-and-tiers.md +25 -18
  12. package/agent-assets/docs/concepts/costs-and-quotas.md +11 -10
  13. package/agent-assets/docs/concepts/delegated-mode.md +13 -12
  14. package/agent-assets/docs/concepts/memory-model.md +13 -9
  15. package/agent-assets/docs/concepts/observations.md +24 -20
  16. package/agent-assets/docs/concepts/process-keys.md +10 -9
  17. package/agent-assets/docs/concepts/routines.md +34 -31
  18. package/agent-assets/docs/concepts/safety-and-execution.md +11 -7
  19. package/agent-assets/docs/concepts/safety-model.md +19 -8
  20. package/agent-assets/docs/concepts/skills.md +10 -8
  21. package/agent-assets/docs/features/integrations/browser-history.md +14 -10
  22. package/agent-assets/docs/features/integrations/calendar.md +24 -13
  23. package/agent-assets/docs/features/integrations/git.md +13 -11
  24. package/agent-assets/docs/features/integrations/github.md +22 -14
  25. package/agent-assets/docs/features/integrations/mail.md +22 -20
  26. package/agent-assets/docs/features/integrations/notion.md +35 -11
  27. package/agent-assets/docs/features/integrations/obsidian.md +8 -8
  28. package/agent-assets/docs/features/lifestyle/git.md +24 -20
  29. package/agent-assets/docs/features/lifestyle/reading.md +5 -3
  30. package/agent-assets/docs/features/lifestyle/receipts.md +11 -10
  31. package/agent-assets/docs/features/memory-files/agent-journal.md +25 -16
  32. package/agent-assets/docs/features/memory-files/agent-lessons.md +7 -6
  33. package/agent-assets/docs/features/memory-files/projects.md +5 -4
  34. package/agent-assets/docs/features/memory-files/schedule.md +6 -3
  35. package/agent-assets/docs/features/memory-files/today.md +10 -7
  36. package/agent-assets/docs/features/memory-files/user-profile.md +14 -9
  37. package/agent-assets/docs/features/messaging/bang-commands.md +21 -6
  38. package/agent-assets/docs/features/messaging/dashboard-chat.md +1 -1
  39. package/agent-assets/docs/features/messaging/overview.md +12 -9
  40. package/agent-assets/docs/features/operations/activity-and-conversations.md +1 -1
  41. package/agent-assets/docs/features/operations/browser-tasks.md +184 -0
  42. package/agent-assets/docs/features/operations/cost-tracking.md +11 -1
  43. package/agent-assets/docs/features/operations/managed-chromium.md +1 -0
  44. package/agent-assets/docs/features/operations/notifications.md +11 -1
  45. package/agent-assets/docs/features/operations/quiet-hours.md +41 -12
  46. package/agent-assets/docs/features/operations/schedule-approaching.md +2 -2
  47. package/agent-assets/docs/features/routines/activity-scan.md +220 -0
  48. package/agent-assets/docs/features/routines/custom-routines.md +82 -138
  49. package/agent-assets/docs/features/routines/evening-review.md +14 -12
  50. package/agent-assets/docs/features/routines/morning-routine.md +5 -4
  51. package/agent-assets/docs/features/routines/weekly-review.md +18 -3
  52. package/agent-assets/docs/features/wiki/commands.md +1 -1
  53. package/agent-assets/docs/features/wiki/dashboard.md +1 -1
  54. package/agent-assets/docs/getting-started/01-what-is-this.md +4 -4
  55. package/agent-assets/docs/getting-started/04-first-day.md +27 -30
  56. package/agent-assets/docs/glossary.md +8 -7
  57. package/agent-assets/docs/guides/add-a-custom-routine.md +122 -68
  58. package/agent-assets/docs/guides/budget-and-cost-for-wiki.md +5 -3
  59. package/agent-assets/docs/guides/change-which-model-handles-x.md +1 -1
  60. package/agent-assets/docs/guides/multiple-wikis-for-multiple-domains.md +1 -1
  61. package/agent-assets/docs/guides/pause-the-agent.md +22 -20
  62. package/agent-assets/docs/guides/reinstall-cleanly.md +2 -0
  63. package/agent-assets/docs/guides/setup-wizard.md +13 -10
  64. package/agent-assets/docs/reference/api.md +11 -0
  65. package/agent-assets/docs/reference/config.md +30 -20
  66. package/agent-assets/docs/reference/keyboard-shortcuts.md +2 -2
  67. package/agent-assets/docs/reference/knowledge-layout.md +14 -10
  68. package/agent-assets/docs/reference/process-keys.md +7 -7
  69. package/agent-assets/docs/reference/skills.md +5 -2
  70. package/agent-assets/docs/troubleshooting/morning-routine-didnt-run.md +32 -16
  71. package/agent-assets/docs/troubleshooting/observation-not-detected.md +26 -24
  72. package/agent-assets/docs/troubleshooting/wiki-ingest-full-blocked.md +1 -1
  73. package/agent-assets/docs/troubleshooting/wiki-write-failed.md +3 -3
  74. package/agent-assets/playbooks/markdown-note.md +43 -0
  75. package/agent-assets/playbooks/monitoring.md +29 -0
  76. package/agent-assets/playbooks/research.md +47 -0
  77. package/agent-assets/skills/agent-create/SKILL.md +45 -29
  78. package/agent-assets/skills/agent-create/references/prompt-frame-extended.md +132 -0
  79. package/agent-assets/skills/agent-create/references/prompt-frame.md +125 -0
  80. package/agent-assets/skills/background-task/SKILL.md +184 -0
  81. package/agent-assets/skills/background-task-reply/SKILL.md +100 -0
  82. package/agent-assets/skills/board/SKILL.md +93 -0
  83. package/agent-assets/skills/browser-history/SKILL.md +34 -16
  84. package/agent-assets/skills/browser-history-respond/SKILL.md +3 -3
  85. package/agent-assets/skills/browser-task/SKILL.md +14 -7
  86. package/agent-assets/skills/context/SKILL.md +4 -3
  87. package/agent-assets/skills/context/references/api.md +5 -3
  88. package/agent-assets/skills/context/references/snapshot-files.md +4 -4
  89. package/agent-assets/skills/external-services/SKILL.native.claude.md +13 -7
  90. package/agent-assets/skills/external-services/SKILL.native.codex.md +11 -5
  91. package/agent-assets/skills/external-services/SKILL.native.gemini.md +11 -5
  92. package/agent-assets/skills/mail/SKILL.md +2 -2
  93. package/agent-assets/skills/mail/SKILL.native.claude.md +16 -9
  94. package/agent-assets/skills/mail/SKILL.native.codex.md +15 -8
  95. package/agent-assets/skills/mail/SKILL.native.gemini.md +11 -5
  96. package/agent-assets/skills/managed-tasks/references/recurrence-rule.md +20 -12
  97. package/agent-assets/skills/management-policy/SKILL.md +26 -17
  98. package/agent-assets/skills/management-policy/curation.json +1 -1
  99. package/agent-assets/skills/management-policy/references/policy-workflow.md +26 -13
  100. package/agent-assets/skills/notify/SKILL.md +10 -5
  101. package/agent-assets/skills/notify/references/priority.md +30 -17
  102. package/agent-assets/skills/notion/SKILL.md +1 -1
  103. package/agent-assets/skills/notion/SKILL.native.claude.md +3 -3
  104. package/agent-assets/skills/notion/SKILL.native.codex.md +2 -2
  105. package/agent-assets/skills/notion/SKILL.native.gemini.md +2 -2
  106. package/agent-assets/skills/observations/SKILL.md +5 -5
  107. package/agent-assets/skills/roadmap/references/api.md +7 -2
  108. package/agent-assets/skills/schedule/SKILL.md +26 -15
  109. package/agent-assets/skills/schedule/references/batch.md +1 -1
  110. package/agent-assets/skills/schedule/references/model-selection.md +1 -1
  111. package/agent-assets/skills/schedule/references/prompt-frame.md +125 -0
  112. package/agent-assets/skills/schedule/references/recurrence-rule.md +20 -12
  113. package/agent-assets/skills/scheduled-managed-task/SKILL.md +12 -9
  114. package/agent-assets/skills/task/SKILL.md +79 -0
  115. package/agent-assets/skills/today/SKILL.md +19 -3
  116. package/agent-assets/skills/today/references/agent-plan-lifecycle.md +9 -4
  117. package/agent-assets/skills/today/references/agent-plan-revision.md +28 -0
  118. package/agent-assets/skills/today/references/today-skeleton.md +5 -5
  119. package/agent-assets/skills/user-interview/references/op-morning.md +1 -1
  120. package/agent-assets/system-prompts/routine-research-cluster-update.md +71 -0
  121. package/agent-assets/task-flows/_partials/notion-acquire.notion.md +47 -21
  122. package/agent-assets/task-flows/background_task.md +81 -0
  123. package/agent-assets/task-flows/git.local_ahead.stale.md +1 -1
  124. package/agent-assets/task-flows/git.push.detected.md +1 -1
  125. package/agent-assets/task-flows/git.tag.created.md +1 -1
  126. package/agent-assets/task-flows/github.assigned.md +1 -1
  127. package/agent-assets/task-flows/github.pull_request.review_requested.md +2 -2
  128. package/agent-assets/task-flows/github.security_alert.md +1 -1
  129. package/agent-assets/task-flows/message.received.dm.md +7 -3
  130. package/agent-assets/task-flows/message.received.dm_first.md +4 -2
  131. package/agent-assets/task-flows/{routine.hourly_check.md → routine.activity_scan.md} +31 -23
  132. package/agent-assets/task-flows/{routine.hourly_check.triage.md → routine.activity_scan.triage.md} +3 -3
  133. package/agent-assets/task-flows/routine.monthly_review.md +9 -8
  134. package/agent-assets/task-flows/routine.research_cluster_update.md +33 -19
  135. package/agent-assets/task-flows/routine.roadmap_refresh.md +2 -2
  136. package/agent-assets/task-flows/routine.today_refresh.md +1 -1
  137. package/agent-assets/task-flows/routine.weekly_review.md +103 -4
  138. package/agent-assets/task-flows/schedule.approaching.md +2 -2
  139. package/agent-assets/task-flows/scheduled.dm.md +96 -12
  140. package/agent-assets/task-flows/scheduled.task.md +7 -1
  141. package/agent-assets/templates/_manifest.json +2 -2
  142. package/agent-assets/templates/knowledge/dossiers/_index.md +1 -1
  143. package/agent-assets/templates/knowledge/dossiers/{hourly.md → activity-scan.md} +1 -1
  144. package/agent-assets/templates/policies/journal-format.md +1 -1
  145. package/agent-assets/templates/policies/mcp.md +1 -1
  146. package/agent-assets/templates/policies/routines/_index.md +1 -1
  147. package/agent-assets/templates/policies/routines/{hourly.md → activity-scan.md} +5 -5
  148. package/package.json +6 -5
  149. package/agent-assets/docs/features/routines/hourly-check.md +0 -205
@@ -100,7 +100,8 @@ visible to the model.
100
100
  ## Concrete Examples
101
101
 
102
102
  - `today` — read and rewrite `state/today.md`.
103
- - `schedule` — produce per-date schedule files from the calendar.
103
+ - `schedule` — register future wake-ups, reminders, and recurring
104
+ tasks via `/api/schedule`.
104
105
  - `mail` — search and label messages via the daemon's mail proxy.
105
106
  - `docs-search` — read-only fetch over the docs corpus, used only by
106
107
  `dashboard.docs_qa`.
@@ -124,11 +125,12 @@ seed payload immediately.
124
125
  The optimizer agent runs in an isolated workdir with a tightly
125
126
  scoped toolset (`Bash(curl http://localhost:8321/api/skill-curation/*)`,
126
127
  `Read`) and an auto-revert safety net: each cadence cycle the daemon
127
- re-checks recently-applied overlays, and any section that has
128
- accumulated *more* drift signal weight after the overlay was applied
129
- than before is rolled back automatically and frozen for two cycles to
130
- stop thrashing. This is the only roll-back path — there is no
131
- per-proposal approve/reject API, just the on/off toggle.
128
+ re-checks recently-applied overlays, and any section that keeps
129
+ accumulating drift signal weight after the overlay was applied
130
+ (crossing a fixed regression threshold) is rolled back automatically
131
+ and frozen for two cycles to stop thrashing. This is the only
132
+ roll-back path — there is no per-proposal approve/reject API, just
133
+ the on/off toggle.
132
134
 
133
135
  Skill curation is **off by default**. The master toggle, curation
134
136
  cadence, manual-run trigger, and the per-skill exclusion list are all
@@ -136,8 +138,8 @@ surfaced at **Settings → Self-learning** (`/settings/self-learning`).
136
138
 
137
139
  ## Where You See It in the Dashboard
138
140
 
139
- - **Knowledge → Skills** lists every skill, its description, and the
140
- events it loads for.
141
+ - **Knowledge → Skills** lists every skill, its description, and its
142
+ `allowed-tools`.
141
143
  - **Connections → MCP** is where MCP servers (which surface as tools
142
144
  inside skills) attach.
143
145
  - **Settings → Self-learning (`/settings/self-learning`)** is where
@@ -106,7 +106,7 @@ clicks leave the daemon.
106
106
  containing ≥3 distinct ASINs surface as comparison sessions the
107
107
  agent can summarise.
108
108
  - **Powers the pre-morning digest** — yesterday's reading and reload
109
- patterns feed the morning routine's pre-pass digest.
109
+ patterns feed the digest the morning routine reads.
110
110
 
111
111
  ## Privacy and Consent
112
112
 
@@ -120,8 +120,8 @@ clicks leave the daemon.
120
120
  history file is opened read-only; the daemon never reaches into
121
121
  cookies, login sessions, or profile dirs other than the history DB.
122
122
  - **Per-browser opt-in.** `browserHistoryBrowserOverrides` lets you
123
- enable / disable each detected browser independently and override
124
- the DB path for atypical installs.
123
+ force each detected browser on or off independently
124
+ (`auto` / `forced-on` / `forced-off`).
125
125
  - **Per-category gate.** `browserHistoryCategories` controls which
126
126
  visit categories (research / shopping / news / dev / entertainment / …) get
127
127
  ingested. Categories you exclude are dropped at ingest time, not
@@ -136,11 +136,13 @@ clicks leave the daemon.
136
136
 
137
137
  A research cluster qualifies when the combination of meaningful visits,
138
138
  foreground time, and distinct domains crosses the thresholds in
139
- `DEFAULT_OFFER_THRESHOLDS` (tunable via `browserHistoryLifecycle`).
139
+ `DEFAULT_OFFER_THRESHOLDS` (fixed defaults `browserHistoryLifecycle`
140
+ tunes the poller's check cadence, not these thresholds).
140
141
  On each tick the poller evaluates the offer triggers per active cluster
141
- (`evaluateOfferTriggers`); once the **per-cluster offer rate-limit gate**
142
- (`gateOfferRateLimit`) approvesthis is the 14-day, per-slug offer
143
- backoff, not the daemon-wide session gate that Phase 9 removed — a
142
+ (`evaluateOfferTriggers`) this is where the 14-day, per-slug offer
143
+ re-fire window lives and the **offer rate-limit gate**
144
+ (`gateOfferRateLimit`: daily offer cap, minimum gap between offers,
145
+ quiet hours, and a 30-day decline backoff) must also approve before a
144
146
  Two-Option Offer DM is composed by the `routine.research_offer_dm`
145
147
  process key.
146
148
 
@@ -171,7 +173,7 @@ later tick cannot re-offer the same cluster.
171
173
  | Shopping-comparison window scan | Same tick, 7-day lookback | `SHOPPING_COMPARISON_WINDOW_MS` constants |
172
174
  | Nightly journal append | Agent-day boundary | `routine.research_cluster_update` (lite tier, one row per active cluster per day) |
173
175
  | Weekly reload-memory block | Friday weekly review | `routine.weekly_review` reads `/api/browser-history/reloads/weekly` |
174
- | Pre-morning digest | Morning routine pre-pass | Yesterday's reading + reloads feed the digest block |
176
+ | Pre-morning digest | Daily, one hour before the agent-day boundary | Yesterday's reading + reloads feed the digest block |
175
177
 
176
178
  ## When Something Goes Wrong
177
179
 
@@ -180,8 +182,10 @@ later tick cannot re-offer the same cluster.
180
182
  platform detector might be failing to resolve the user's profile dir.
181
183
  The daemon log line will name the candidate paths it tried.
182
184
  - **A cluster keeps re-offering.** Check the `lastResearchOfferAt` /
183
- `lastWikiOfferAt` columns; the rate-limit gate uses those for the
184
- 14-day backoff. `!research decline <slug>` stamps both fields.
185
+ `lastWikiOfferAt` columns; the trigger evaluator uses those for the
186
+ 14-day re-fire window (the rate-limit gate also reads them for its
187
+ 30-day decline backoff). `!research decline <slug>` stamps both
188
+ fields.
185
189
  - **`!checks` is empty.** That's the common case for a quiet day —
186
190
  the reload signals are gated to the agent-day, not UTC.
187
191
 
@@ -74,9 +74,10 @@ around them and DM you ahead of meetings that matter.
74
74
 
75
75
  ## What It Does
76
76
 
77
- - **Polls** the connected calendar(s) on `calendarPollIntervalSeconds`.
77
+ - **Polls** Google Calendar on `calendarPollIntervalSeconds`; Outlook
78
+ and Apple calendars are read on demand rather than polled.
78
79
  - **Records observations** when events change (add / move / remove),
79
- consumed by the hourly check.
80
+ consumed by the activity scan.
80
81
  - **Surfaces today's events** to the morning routine so they land in
81
82
  `state/today.md` and the day's schedule file.
82
83
  - **Reads** events on demand for reactive turns ("am I free at 3?").
@@ -99,18 +100,20 @@ an explicit request.
99
100
 
100
101
  ## Where in the Dashboard
101
102
 
102
- - **Connections → Calendar** holds OAuth, scope, and polling.
103
+ - **Connections → Calendar** holds OAuth, scope, and the integration
104
+ mode; the poll interval itself is edited on Settings → Infrastructure.
103
105
  - The same page hosts the **Calendar Event Model** card (see below)
104
- when Google Calendar is in direct mode.
106
+ unless Google Calendar runs in delegated mode.
105
107
 
106
108
  ## Calendar Event Model
107
109
 
108
110
  The Calendar Event Model picker chooses the backend and model that
109
111
  runs when the **daemon-side poller detects a calendar change**. It binds
110
- the `calendar.change` ProcessKey, which fires in two situations:
112
+ the `calendar.change` ProcessKey. The poller's change detection reacts
113
+ in two situations:
111
114
 
112
115
  - An event was added, moved, or deleted between polls (recorded as a
113
- change observation; the hourly check picks it up).
116
+ change observation; the activity scan picks it up).
114
117
  - An event was created far in advance (long-horizon events more than 14
115
118
  days out nudge the roadmap-refresh routine so `plans/roadmap.md` can
116
119
  build a preparation timeline).
@@ -127,22 +130,28 @@ different mix.
127
130
 
128
131
  The picker is **only meaningful when Google Calendar runs in direct
129
132
  mode.** In delegated mode the daemon hands off all Google Calendar
130
- work to the connector inside your agent's backend, so:
133
+ work to the connector inside your agent's backend, so, by default:
131
134
 
132
135
  - No approaching-event reminders fire from the daemon.
133
136
  - No change observations are recorded between polls.
134
- - The hourly check has no calendar-side observations to react to.
137
+ - The activity scan has no calendar-side observations to react to.
135
138
  - Long-horizon roadmap-refresh nudges from calendar do not fire.
136
139
 
137
140
  The agent only learns about calendar state in delegated mode when it
138
141
  asks the connector itself inside a session (for example, while
139
142
  running the morning routine). It is a pull-only model — the daemon
140
- does not push.
143
+ does not push. The exception is **Background Sync** (Settings → Hours
144
+ & Notifications): two opt-in cadences, off by default, poll the
145
+ calendar through the backend's connector while delegated — the
146
+ imminent cadence (next 1 h) restores the 15-minute reminders, and the
147
+ day-ahead cadence (next 24 h) restores change observations and
148
+ far-future roadmap-refresh detection.
141
149
 
142
150
  To avoid presenting a setting that does nothing, the dashboard hides
143
151
  the Calendar Event Model card whenever Google Calendar is delegated.
144
152
  If you want approaching-event reminders and change observations back,
145
- switch the integration mode to direct on the same page.
153
+ switch the integration mode to direct on the same page, or enable the
154
+ calendar Background Sync cadences.
146
155
 
147
156
  ## Configuration
148
157
 
@@ -158,10 +167,12 @@ rather than an env-style setting; the underlying state lives in the
158
167
 
159
168
  - A **stale calendar** in `/schedule` after a real-world add usually
160
169
  means the poll has not yet run. Check the next-fire timestamp.
161
- - An **OAuth-expired** state reports on the auth-health card.
170
+ - An **OAuth-expired** state reports on the Google card's connection
171
+ status on Connections → Calendar.
162
172
  - **No reminders or change observations** while in delegated mode is
163
- expected behavior, not a bug — switch to direct mode to restore the
164
- daemon-side flows. See "Calendar Event Model" above.
173
+ expected behavior, not a bug — switch to direct mode or enable the
174
+ Background Sync cadences to restore the daemon-side flows. See
175
+ "Calendar Event Model" above.
165
176
 
166
177
  ## Related
167
178
 
@@ -10,7 +10,7 @@ aliases:
10
10
  category: features
11
11
  summary: |
12
12
  Watch one or more git repositories for new commits. Changes record
13
- observations the hourly check coalesces — there is no per-commit
13
+ observations the activity scan coalesces — there is no per-commit
14
14
  notification spam.
15
15
  section: integrations
16
16
  tags:
@@ -26,7 +26,7 @@ ask_examples:
26
26
  - How often does the daemon poll my repos?
27
27
  locale: en-US
28
28
  created: 2026-04-25
29
- updated: 2026-05-28
29
+ updated: 2026-06-07
30
30
  keywords:
31
31
  - git
32
32
  - commit
@@ -35,10 +35,11 @@ keywords:
35
35
  - polling
36
36
  related:
37
37
  - features/integrations/github
38
- - features/routines/hourly-check
38
+ - features/routines/activity-scan
39
39
  - concepts/observations
40
40
  ui_anchors:
41
41
  - /connections/repositories
42
+ - /git
42
43
  config_keys:
43
44
  - gitPollIntervalSeconds
44
45
  process_keys:
@@ -53,7 +54,7 @@ api_endpoints:
53
54
  # Git
54
55
 
55
56
  Add local git repositories to a watched set; the daemon polls them
56
- and the hourly check decides whether the recent activity is worth
57
+ and the activity scan decides whether the recent activity is worth
57
58
  flagging.
58
59
 
59
60
  ## What It Does
@@ -71,19 +72,20 @@ by design.
71
72
  ## When It Runs / How It Is Triggered
72
73
 
73
74
  - The poller is continuous.
74
- - The hourly check consumes the accumulated observations.
75
+ - The activity scan consumes the accumulated observations.
75
76
 
76
77
  ## What It Outputs
77
78
 
78
79
  - An `observation` row per detected change set.
79
- - A summary in the hourly check's output when observations qualified.
80
+ - A summary in the activity scan's output when observations qualified.
80
81
 
81
82
  ## Where in the Dashboard
82
83
 
83
- - **Connections → Repositories** lists the watched paths and last-poll
84
- times. Git repos are managed as part of the unified Repositories
85
- surface (the same place that links a local checkout to its GitHub
86
- remote).
84
+ - **Connections → Repositories** lists the watched paths. Git repos are
85
+ managed as part of the unified Repositories surface (the same place
86
+ that links a local checkout to its GitHub remote).
87
+ - **My Life → Git** (`/git`) configures per-repo polling cadence,
88
+ automation triggers, and daily git management.
87
89
 
88
90
  ## Configuration
89
91
 
@@ -103,4 +105,4 @@ by design.
103
105
  ## Related
104
106
 
105
107
  - [GitHub](github.md) — separate integration for remote-side data.
106
- - [Hourly Check](../routines/hourly-check.md) — the consumer.
108
+ - [Activity Scan](../routines/activity-scan.md) — the consumer.
@@ -29,7 +29,7 @@ ask_examples:
29
29
  - Where do I add a GitHub repo to watch?
30
30
  locale: en-US
31
31
  created: 2026-04-25
32
- updated: 2026-05-28
32
+ updated: 2026-06-07
33
33
  keywords:
34
34
  - github
35
35
  - issue
@@ -63,7 +63,7 @@ context_files:
63
63
 
64
64
  The daemon polls GitHub via the local `gh` CLI: review requests, CI
65
65
  failures on the default branch, security alerts, and assignments
66
- become DMs; everything else is recorded for the hourly check.
66
+ become DMs; everything else is recorded for the activity scan.
67
67
 
68
68
  ## What It Does
69
69
 
@@ -77,16 +77,21 @@ become DMs; everything else is recorded for the hourly check.
77
77
  to the workflow-runs side; the notifications poll always runs at the
78
78
  global cadence.
79
79
  - **DMs the user** on the four high-priority triggers below; quieter
80
- signals are coalesced into the hourly check summary.
80
+ signals are coalesced into the activity scan summary.
81
81
 
82
82
  The agent never auto-comments, auto-merges, or pushes.
83
83
 
84
84
  ## High-priority events
85
85
 
86
- The agent will DM the user (priority `high`, can break quiet hours
87
- depending on your notify-skill settings) on:
86
+ The agent will DM the user (priority `high`; during quiet hours the DM
87
+ is deferred until they end rather than dropped — only `critical`
88
+ safety messages break through) on:
88
89
 
89
- - A teammate or bot **requested your review** on a PR.
90
+ - A teammate or bot **requested your review** on a PR — only when it
91
+ looks time-sensitive (release-blocker keywords in the title, or the
92
+ repo is already on your `state/today.md` plan or an active roadmap
93
+ milestone); otherwise it's noted in `state/today.md` and coalesced
94
+ into the activity scan.
90
95
  - You were **assigned** to an issue or PR.
91
96
  - A **Dependabot or code-scanning security alert** fired on a watched
92
97
  repository.
@@ -144,7 +149,9 @@ Watched repos are no longer config keys. The old `gitRepos` /
144
149
  cutover — repos now live in the `repositories` table and are managed on
145
150
  **Connections → Repositories**. Per-repo polling cadence is set on
146
151
  **My Life → Git** and overrides the global interval for that repo's
147
- workflow-runs poll.
152
+ workflow-runs poll. The global interval is the floor — a per-repo
153
+ cadence longer than it slows that repo down, while a shorter one
154
+ still polls at the global tick.
148
155
 
149
156
  ## When Something Goes Wrong
150
157
 
@@ -173,24 +180,25 @@ need a daemon-spawned poller's bookkeeping.
173
180
  - **direct** — the daemon's `GitHubPoller` runs as described above.
174
181
  Use this when you want the daemon to own the poll schedule and to
175
182
  emit DMs without the main backend having to wake up.
176
- - **delegated** — the delegated-sync worker invokes the chosen
177
- backend's read-only `gh` CLI surface on opt-in cadences (see
178
- [Delegated Mode](../../concepts/delegated-mode.md) and
179
- `docs/design/appendices/delegated-sync-opt-in.md`). The daemon
183
+ - **delegated** — a dedicated Git/GitHub cron queues a lite-tier
184
+ `git.lifecycle.poll` task on the `gitPollIntervalSeconds` cadence
185
+ (default hourly); that session uses the chosen backend's read-only
186
+ `gh` CLI surface (see
187
+ [Delegated Mode](../../concepts/delegated-mode.md)). The daemon
180
188
  poller stays off; the lite-tier delegated session takes the polling
181
189
  cost.
182
- - **disabled** — neither the poller nor the delegated worker runs;
190
+ - **disabled** — neither the poller nor the delegated cron runs;
183
191
  the integration is silent.
184
192
 
185
193
  Pick the mode from the GitHub card on **Connections → Repositories**.
186
194
  Mode changes go through the standard `PATCH /api/integrations/github`
187
- flip-lock so the poller and the delegated worker never run
195
+ flip-lock so the poller and the delegated cron never run
188
196
  simultaneously.
189
197
 
190
198
  ## Related
191
199
 
192
200
  - [Git](git.md) — local repo file watcher (separate observer).
193
- - [Hourly Check](../routines/hourly-check.md) — the consumer of
201
+ - [Activity Scan](../routines/activity-scan.md) — the consumer of
194
202
  non-DM-priority observations.
195
203
  - [Delegated Mode](../../concepts/delegated-mode.md) — how the
196
204
  `delegated` mode polls without a daemon poller.
@@ -60,8 +60,8 @@ context_files:
60
60
 
61
61
  # Mail
62
62
 
63
- Connect one or more mailboxes (Gmail, Outlook, Yahoo, iCloud, or any
64
- IMAP server) and Aitne polls them, classifies incoming threads, and
63
+ Connect one or more mailboxes (Gmail, Outlook, Yahoo, or iCloud) and
64
+ Aitne polls them, classifies incoming threads, and
65
65
  lets the agent search / label / read via the `mail` skill. Search is
66
66
  local — backed by SQLite FTS5 — so the agent doesn't need to round-trip
67
67
  the provider for every query.
@@ -69,8 +69,8 @@ the provider for every query.
69
69
  ## What It Does
70
70
 
71
71
  - **Read & search** existing threads (FTS5-backed local index).
72
- - **Classify** incoming messages — does this need owner attention,
73
- is it a marketing list, is it a receipt.
72
+ - **Classify** incoming messages — is it a travel booking, a receipt
73
+ attachment, a Kindle notebook export.
74
74
  - **Label** threads so the operator and the agent agree on triage state.
75
75
  - **Surface** the small set of mail items in the morning routine that
76
76
  actually need owner action.
@@ -81,15 +81,15 @@ yourself. Direct send (`POST /mail/:account/messages/send`) is *not*
81
81
  blocked — it is classified as an autonomous action, so the daemon does
82
82
  not DM you for approval first. The agent only sends directly when it
83
83
  judges you'd clearly want it to, and it tells you afterward; during the
84
- hourly check the `mail` skill is hard read-only (no sending, drafting,
84
+ activity scan the `mail` skill is hard read-only (no sending, drafting,
85
85
  labeling, or filing).
86
86
 
87
87
  ## When It Runs / How It Is Triggered
88
88
 
89
89
  - In `direct` mode a poller pulls new messages on a cadence. Gmail uses
90
- `gmailPollIntervalSeconds` (default 600); IMAP-backed accounts (Yahoo,
91
- iCloud, generic IMAP) use `mailPollIntervalSeconds` (default 180).
92
- Adjust both under **Settings → Advanced**.
90
+ `gmailPollIntervalSeconds` (default 600); all other accounts (Outlook,
91
+ Yahoo, iCloud) use `mailPollIntervalSeconds` (default 180).
92
+ The Gmail cadence is adjustable under **Settings → Infrastructure**.
93
93
  - The morning routine reads the labeled queue and decides which need
94
94
  surfacing.
95
95
  - Reactive turns (you DM "what's in my mail?") use the `mail` skill on
@@ -97,17 +97,17 @@ labeling, or filing).
97
97
 
98
98
  ## Integration Modes
99
99
 
100
- Mail supports all four integration modes
101
- (`direct | delegated | native | disabled`); each provider may sit in a
102
- different mode.
100
+ Gmail and Outlook support all four integration modes
101
+ (`direct | delegated | native | disabled`); each may sit in a
102
+ different mode. Yahoo and iCloud have no integration-registry entry —
103
+ they are direct-only by design.
103
104
 
104
105
  | Provider | Direct | Delegated | Native | Notes |
105
106
  |---|---|---|---|---|
106
- | Gmail | ✓ | ✓ | ✓ (descriptor-driven) | Native mode uses Google's official Gmail MCP connector on the main backend; the connector POSTs observations back via `/api/observations`. |
107
+ | Gmail | ✓ | ✓ | ✓ (descriptor-driven) | Native mode uses the main backend's own Gmail MCP connector (Claude's hosted connector, the Codex apps connector, or Gemini's google-workspace extension); the backend POSTs observations back via `/api/observations`. |
107
108
  | Outlook | ✓ | ✓ | ✓ (user-managed) | Native mode requires you to install your own MCP / skill harness on the main backend (`userManagedConnector: true`); the probe synthesises a user-managed result and skips the missing-variant gate. |
108
- | Yahoo | ✓ | | — | IMAP transport. No native MCP variant. |
109
- | iCloud | ✓ | | — | IMAP transport. No native MCP variant. |
110
- | Generic IMAP | ✓ | ✓ | — | IMAP transport. No native MCP variant. |
109
+ | Yahoo | ✓ | | — | IMAP transport. Direct-only; never enters the delegated surface. |
110
+ | iCloud | ✓ | | — | IMAP transport. Direct-only; never enters the delegated surface. |
111
111
 
112
112
  Mode flips run through the §14.7 live probe + the per-key
113
113
  `runtime_state.integration_flip_lock:<key>`. Changing the main
@@ -120,18 +120,20 @@ mode lifecycle.
120
120
 
121
121
  - New threads land in the local `mail_messages_index` table
122
122
  (FTS-indexed via `fts_mail_messages`).
123
- - Classification labels are written via the provider API.
123
+ - Labels/tags are written via the provider API when the agent applies
124
+ them (`POST /mail/:account/messages/:id/tags`).
124
125
  - A short "mail" section in `state/today.md` when items qualified.
125
126
 
126
127
  ## Where in the Dashboard
127
128
 
128
129
  - **Connections → Mail** is the per-account configuration: providers,
129
- credentials, polling, label setup.
130
+ credentials, per-account active toggles, and the Gmail classification
131
+ model.
130
132
 
131
133
  ## Configuration
132
134
 
133
135
  Per account you choose a provider kind (`gmail` / `outlook` / `yahoo` /
134
- `icloud`) plus credentials, label conventions, and polling interval. You
136
+ `icloud`) plus credentials and an optional display label. You
135
137
  pick the kind, not the transport — Yahoo and iCloud connect over IMAP
136
138
  under the hood, but that is an implementation detail. The set of enabled
137
139
  providers is `enabledMailProviders` (default `["gmail"]`).
@@ -140,8 +142,8 @@ providers is `enabledMailProviders` (default `["gmail"]`).
140
142
 
141
143
  - An **auth failure** points at expired credentials. The dashboard's
142
144
  auth-health card flips to a warning. See [Auth Failed](../../troubleshooting/auth-failed.md).
143
- - A **classifier that misses** a sender consistently — add a manual
144
- label rule on `/connections/mail`.
145
+ - A **classifier that misses** consistently — switch the model behind
146
+ it via the Gmail Classification Model card on `/connections/mail`.
145
147
 
146
148
  ## Related
147
149
 
@@ -8,8 +8,8 @@ aliases:
8
8
  - notion integration
9
9
  category: features
10
10
  summary: |
11
- Watch a Notion database (or a curated set of pages) for changes.
12
- Changes record observations consumed by the hourly check.
11
+ Watch one or more configured Notion databases for changes.
12
+ Changes record observations consumed by the activity scan.
13
13
  section: integrations
14
14
  tags:
15
15
  - integrations
@@ -21,9 +21,10 @@ ask_examples:
21
21
  - How do I connect Notion?
22
22
  - Will Notion notify me on every page change?
23
23
  - What does Notion native mode do?
24
+ - Why are my Notion routine fetches skipped?
24
25
  locale: en-US
25
26
  created: 2026-04-25
26
- updated: 2026-05-28
27
+ updated: 2026-06-11
27
28
  keywords:
28
29
  - notion
29
30
  - page
@@ -33,11 +34,11 @@ keywords:
33
34
  - integration modes
34
35
  related:
35
36
  - features/integrations/obsidian
36
- - features/routines/hourly-check
37
+ - features/routines/activity-scan
37
38
  - concepts/delegated-mode
38
39
  - concepts/observations
39
40
  ui_anchors:
40
- - /connections/knowledge
41
+ - /connections/notes
41
42
  config_keys:
42
43
  - notionPollIntervalSeconds
43
44
  api_endpoints:
@@ -47,8 +48,8 @@ api_endpoints:
47
48
 
48
49
  # Notion
49
50
 
50
- Aitne polls a configured Notion database or page set, records an
51
- observation on change, and the hourly check decides whether anything
51
+ Aitne polls the configured Notion databases, records an
52
+ observation on change, and the activity scan decides whether anything
52
53
  warrants surfacing. The agent can also read pages on demand through
53
54
  the `notion` skill.
54
55
 
@@ -66,10 +67,10 @@ modes the poller does not run — see Integration Modes below.
66
67
  ## Integration Modes
67
68
 
68
69
  Notion supports all four integration modes (`direct` / `delegated` /
69
- `native` / `disabled`), selected from **Connections → Knowledge**.
70
+ `native` / `disabled`), selected from **Connections → Notes**.
70
71
 
71
72
  - **`direct`** — the daemon polls Notion itself, records change
72
- observations, and the hourly check consumes them.
73
+ observations, and the activity scan consumes them.
73
74
  - **`delegated`** — a delegated-sync worker runs on opt-in cadences;
74
75
  observations are recorded the same way but on a different
75
76
  schedule (see [Delegated Mode](../../concepts/delegated-mode.md)).
@@ -86,10 +87,30 @@ Notion supports all four integration modes (`direct` / `delegated` /
86
87
  Switching modes requires the integration flip-lock probe to pass
87
88
  (connector reachable, capabilities reported). See `POST /api/integrations/notion/probe`.
88
89
 
90
+ ## Routine Fetch Targets
91
+
92
+ Autonomous routine fetches (the `routine.fetch_window` pre-pass that
93
+ feeds the morning routine and activity scan) are limited to an explicit
94
+ allowlist of pages you configure under **Connections → Notes →
95
+ Routine fetch targets**. This prevents the agent from searching the
96
+ whole workspace on every pass — workspace-wide scans were the dominant
97
+ cost driver before the allowlist existed.
98
+
99
+ - Each target is a Notion page URL, page ID, or page title. Prefer a
100
+ URL or ID; titles are matched best-effort and can be ambiguous.
101
+ - **Until at least one target is listed, routine Notion fetches are
102
+ skipped entirely** (recorded as a `plan_drop:no_fetch_targets` skip in
103
+ the activity log). On-demand reads in DMs are unaffected.
104
+ - Routine passes fetch at most 10 targets per window; extra entries are
105
+ skipped each pass.
106
+ - The allowlist applies in every mode (`direct` / `delegated` /
107
+ `native`) and survives mode switches and main-backend changes.
108
+
89
109
  ## Where in the Dashboard
90
110
 
91
- - **Connections → Knowledge** holds the integration token, target
92
- databases, and the mode picker.
111
+ - **Connections → Notes** holds the integration token, target
112
+ databases, the routine fetch target allowlist, and the mode picker.
113
+ The same Notion settings body appears in the setup wizard's Notes step.
93
114
 
94
115
  ## Configuration
95
116
 
@@ -103,6 +124,9 @@ Switching modes requires the integration flip-lock probe to pass
103
124
  ≥ 300 seconds.
104
125
  - "No observations" in `native` mode is expected — observations flow
105
126
  only when the main backend POSTs them during a session.
127
+ - Routine fetches silently absent? Check that **Routine fetch targets**
128
+ is non-empty — an empty allowlist skips Notion in every routine pass
129
+ (the activity log shows `plan_drop:no_fetch_targets`).
106
130
 
107
131
  ## Related
108
132
 
@@ -9,7 +9,7 @@ aliases:
9
9
  category: features
10
10
  summary: |
11
11
  Watch an Obsidian vault for new and changed notes. Changes record
12
- observations the hourly check consumes; the agent can also read
12
+ observations the activity scan consumes; the agent can also read
13
13
  notes on demand.
14
14
  section: integrations
15
15
  tags:
@@ -24,7 +24,7 @@ ask_examples:
24
24
  - Why didn't the agent see my new note?
25
25
  locale: en-US
26
26
  created: 2026-04-25
27
- updated: 2026-05-28
27
+ updated: 2026-06-11
28
28
  keywords:
29
29
  - obsidian
30
30
  - vault
@@ -32,10 +32,10 @@ keywords:
32
32
  - obsidian observer
33
33
  related:
34
34
  - features/integrations/notion
35
- - features/routines/hourly-check
35
+ - features/routines/activity-scan
36
36
  - concepts/observations
37
37
  ui_anchors:
38
- - /connections/knowledge
38
+ - /connections/notes
39
39
  config_keys:
40
40
  - externalObsidianVaultPath
41
41
  - externalObsidianVaultName
@@ -46,7 +46,7 @@ config_keys:
46
46
  # Obsidian
47
47
 
48
48
  Point Aitne at your Obsidian vault directory; new and changed notes
49
- record observations the hourly check consumes. The agent can read and
49
+ record observations the activity scan consumes. The agent can read and
50
50
  write vault notes through the `external-services` skill.
51
51
 
52
52
  Reads and writes go through the Obsidian app's CLI — the Obsidian app
@@ -72,18 +72,18 @@ its own output.
72
72
  Continuously — the watcher runs as long as the daemon is up and a vault
73
73
  path is configured (`externalObsidianWatch=true`). Saves are debounced
74
74
  by `obsidianDebounceSeconds` before an observation is recorded; the
75
- [hourly check](../routines/hourly-check.md) later consumes those
75
+ [activity scan](../routines/activity-scan.md) later consumes those
76
76
  observations.
77
77
 
78
78
  ## Where in the Dashboard
79
79
 
80
- - **Connections → Knowledge** to point at the vault directory.
80
+ - **Connections → Notes** to point at the vault directory.
81
81
 
82
82
  ## Configuration
83
83
 
84
84
  | Setting | Default | Notes |
85
85
  |---|---|---|
86
- | `externalObsidianVaultPath` | unset | Vault directory; set in Connections → Knowledge. |
86
+ | `externalObsidianVaultPath` | unset | Vault directory; set in Connections → Notes. |
87
87
  | `externalObsidianWatch` | true | Set false to keep the path but stop recording changes (large-vault churn control). |
88
88
  | `obsidianDebounceSeconds` | 5 | How long to wait after a save before recording. |
89
89