@aitne-sh/aitne 0.1.9 → 0.1.11

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 (218) hide show
  1. package/README.md +41 -11
  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/docs/concepts/agent-day.md +6 -7
  9. package/agent-assets/docs/concepts/auth-health.md +23 -20
  10. package/agent-assets/docs/concepts/backends-and-tiers.md +13 -9
  11. package/agent-assets/docs/concepts/costs-and-quotas.md +14 -12
  12. package/agent-assets/docs/concepts/delegated-mode.md +18 -17
  13. package/agent-assets/docs/concepts/memory-model.md +16 -9
  14. package/agent-assets/docs/concepts/observations.md +24 -20
  15. package/agent-assets/docs/concepts/process-keys.md +10 -9
  16. package/agent-assets/docs/concepts/routines.md +34 -31
  17. package/agent-assets/docs/concepts/safety-and-execution.md +11 -7
  18. package/agent-assets/docs/concepts/safety-model.md +39 -25
  19. package/agent-assets/docs/concepts/skills.md +12 -10
  20. package/agent-assets/docs/features/integrations/browser-history.md +23 -18
  21. package/agent-assets/docs/features/integrations/calendar.md +28 -17
  22. package/agent-assets/docs/features/integrations/git.md +13 -11
  23. package/agent-assets/docs/features/integrations/github.md +22 -14
  24. package/agent-assets/docs/features/integrations/mail.md +25 -22
  25. package/agent-assets/docs/features/integrations/notion.md +35 -11
  26. package/agent-assets/docs/features/integrations/obsidian.md +8 -8
  27. package/agent-assets/docs/features/lifestyle/git.md +27 -23
  28. package/agent-assets/docs/features/lifestyle/reading.md +20 -11
  29. package/agent-assets/docs/features/lifestyle/receipts.md +11 -10
  30. package/agent-assets/docs/features/lifestyle/travel-bookings.md +4 -3
  31. package/agent-assets/docs/features/memory-files/agent-journal.md +53 -26
  32. package/agent-assets/docs/features/memory-files/agent-lessons.md +178 -0
  33. package/agent-assets/docs/features/memory-files/projects.md +11 -8
  34. package/agent-assets/docs/features/memory-files/roadmap.md +17 -14
  35. package/agent-assets/docs/features/memory-files/schedule.md +6 -3
  36. package/agent-assets/docs/features/memory-files/today.md +10 -7
  37. package/agent-assets/docs/features/memory-files/user-profile.md +14 -9
  38. package/agent-assets/docs/features/messaging/bang-commands.md +21 -6
  39. package/agent-assets/docs/features/messaging/overview.md +17 -14
  40. package/agent-assets/docs/features/messaging/telegram.md +10 -9
  41. package/agent-assets/docs/features/operations/activity-and-conversations.md +6 -5
  42. package/agent-assets/docs/features/operations/approvals.md +6 -5
  43. package/agent-assets/docs/features/operations/browser-tasks.md +184 -0
  44. package/agent-assets/docs/features/operations/cost-tracking.md +11 -1
  45. package/agent-assets/docs/features/operations/managed-chromium.md +4 -2
  46. package/agent-assets/docs/features/operations/notifications.md +11 -1
  47. package/agent-assets/docs/features/operations/quiet-hours.md +41 -11
  48. package/agent-assets/docs/features/operations/schedule-approaching.md +2 -2
  49. package/agent-assets/docs/features/routines/activity-scan.md +220 -0
  50. package/agent-assets/docs/features/routines/custom-routines.md +82 -134
  51. package/agent-assets/docs/features/routines/evening-review.md +23 -13
  52. package/agent-assets/docs/features/routines/morning-routine.md +7 -5
  53. package/agent-assets/docs/features/routines/weekly-review.md +24 -3
  54. package/agent-assets/docs/features/wiki/commands.md +4 -4
  55. package/agent-assets/docs/features/wiki/cost-and-approval.md +4 -3
  56. package/agent-assets/docs/features/wiki/dashboard.md +7 -6
  57. package/agent-assets/docs/features/wiki/overview.md +3 -3
  58. package/agent-assets/docs/features/wiki/search.md +5 -5
  59. package/agent-assets/docs/features/wiki/workspaces.md +2 -2
  60. package/agent-assets/docs/getting-started/01-what-is-this.md +3 -3
  61. package/agent-assets/docs/getting-started/02-first-steps.md +5 -3
  62. package/agent-assets/docs/getting-started/04-first-day.md +27 -30
  63. package/agent-assets/docs/glossary.md +8 -8
  64. package/agent-assets/docs/guides/add-a-custom-routine.md +122 -68
  65. package/agent-assets/docs/guides/budget-and-cost-for-wiki.md +2 -2
  66. package/agent-assets/docs/guides/connect-a-new-mail-account.md +4 -2
  67. package/agent-assets/docs/guides/explore-with-trace-and-connect.md +5 -4
  68. package/agent-assets/docs/guides/install-and-run.md +2 -2
  69. package/agent-assets/docs/guides/maintain-wiki-health.md +2 -2
  70. package/agent-assets/docs/guides/pause-the-agent.md +27 -21
  71. package/agent-assets/docs/guides/reinstall-cleanly.md +2 -0
  72. package/agent-assets/docs/guides/setup-wizard.md +12 -6
  73. package/agent-assets/docs/guides/use-an-existing-obsidian-vault.md +6 -6
  74. package/agent-assets/docs/reference/api.md +26 -5
  75. package/agent-assets/docs/reference/cli-commands.md +3 -3
  76. package/agent-assets/docs/reference/config.md +51 -24
  77. package/agent-assets/docs/reference/disallowed-tools.md +6 -4
  78. package/agent-assets/docs/reference/keyboard-shortcuts.md +2 -2
  79. package/agent-assets/docs/reference/knowledge-layout.md +25 -12
  80. package/agent-assets/docs/reference/process-keys.md +9 -9
  81. package/agent-assets/docs/reference/skills.md +10 -6
  82. package/agent-assets/docs/troubleshooting/auth-failed.md +9 -8
  83. package/agent-assets/docs/troubleshooting/dashboard-shows-degraded.md +16 -9
  84. package/agent-assets/docs/troubleshooting/messaging-not-pairing.md +2 -2
  85. package/agent-assets/docs/troubleshooting/morning-routine-didnt-run.md +32 -16
  86. package/agent-assets/docs/troubleshooting/observation-not-detected.md +26 -24
  87. package/agent-assets/docs/troubleshooting/quota-exhausted.md +7 -6
  88. package/agent-assets/docs/troubleshooting/wiki-write-failed.md +3 -3
  89. package/agent-assets/skills/agent-actions/SKILL.md +23 -39
  90. package/agent-assets/skills/agent-create/SKILL.md +26 -6
  91. package/agent-assets/skills/attach/SKILL.md +8 -27
  92. package/agent-assets/skills/background-task/SKILL.md +184 -0
  93. package/agent-assets/skills/background-task-reply/SKILL.md +100 -0
  94. package/agent-assets/skills/browser-history/SKILL.md +60 -29
  95. package/agent-assets/skills/browser-history-respond/SKILL.md +6 -1
  96. package/agent-assets/skills/browser-task/SKILL.md +33 -31
  97. package/agent-assets/skills/context/SKILL.md +26 -34
  98. package/agent-assets/skills/context/curation.json +12 -12
  99. package/agent-assets/skills/context/references/api.md +22 -20
  100. package/agent-assets/skills/context/references/required-frontmatter.md +10 -9
  101. package/agent-assets/skills/context/references/snapshot-files.md +16 -15
  102. package/agent-assets/skills/context/seeds/file-responsibilities.seed.json +5 -5
  103. package/agent-assets/skills/context/seeds/frontmatter-requirements.seed.json +3 -3
  104. package/agent-assets/skills/docs-search/SKILL.md +19 -31
  105. package/agent-assets/skills/external-services/SKILL.delegated.claude.md +8 -95
  106. package/agent-assets/skills/external-services/SKILL.delegated.codex.md +8 -94
  107. package/agent-assets/skills/external-services/SKILL.delegated.gemini.md +8 -94
  108. package/agent-assets/skills/external-services/SKILL.native.claude.md +15 -9
  109. package/agent-assets/skills/external-services/SKILL.native.codex.md +11 -5
  110. package/agent-assets/skills/external-services/SKILL.native.gemini.md +11 -5
  111. package/agent-assets/skills/external-services/references/exec-errors.md +32 -0
  112. package/agent-assets/skills/external-services/references/skills-crud.md +5 -5
  113. package/agent-assets/skills/gmail-lifestyle/SKILL.md +3 -2
  114. package/agent-assets/skills/gmail-lifestyle/references/receipts-api.md +4 -0
  115. package/agent-assets/skills/gmail-lifestyle/references/travel-bookings-api.md +9 -0
  116. package/agent-assets/skills/mail/SKILL.delegated.claude.md +13 -25
  117. package/agent-assets/skills/mail/SKILL.delegated.codex.md +3 -2
  118. package/agent-assets/skills/mail/SKILL.delegated.gemini.md +3 -2
  119. package/agent-assets/skills/mail/SKILL.md +12 -20
  120. package/agent-assets/skills/mail/SKILL.native.claude.md +24 -16
  121. package/agent-assets/skills/mail/SKILL.native.codex.md +16 -9
  122. package/agent-assets/skills/mail/SKILL.native.gemini.md +12 -6
  123. package/agent-assets/skills/mail/references/api.md +6 -1
  124. package/agent-assets/skills/mail/references/examples.md +2 -1
  125. package/agent-assets/skills/managed-tasks/SKILL.md +44 -77
  126. package/agent-assets/skills/managed-tasks/references/errors.md +25 -14
  127. package/agent-assets/skills/managed-tasks/references/output-path.md +33 -17
  128. package/agent-assets/skills/managed-tasks/references/recurrence-rule.md +26 -16
  129. package/agent-assets/skills/management-policy/SKILL.md +36 -28
  130. package/agent-assets/skills/management-policy/curation.json +1 -1
  131. package/agent-assets/skills/management-policy/references/policy-workflow.md +30 -18
  132. package/agent-assets/skills/notify/SKILL.md +16 -13
  133. package/agent-assets/skills/notify/references/priority.md +42 -26
  134. package/agent-assets/skills/notion/SKILL.delegated.claude.md +1 -1
  135. package/agent-assets/skills/notion/SKILL.delegated.codex.md +1 -1
  136. package/agent-assets/skills/notion/SKILL.delegated.gemini.md +1 -1
  137. package/agent-assets/skills/notion/SKILL.md +18 -18
  138. package/agent-assets/skills/notion/SKILL.native.claude.md +4 -4
  139. package/agent-assets/skills/notion/SKILL.native.codex.md +3 -3
  140. package/agent-assets/skills/notion/SKILL.native.gemini.md +3 -3
  141. package/agent-assets/skills/observations/SKILL.md +9 -24
  142. package/agent-assets/skills/observations/references/fetch-fallback.md +22 -0
  143. package/agent-assets/skills/project-doc/SKILL.md +9 -6
  144. package/agent-assets/skills/project-doc/curation.json +3 -3
  145. package/agent-assets/skills/project-doc/seeds/project-shape.seed.json +2 -2
  146. package/agent-assets/skills/project-doc/seeds/slug-grammar.seed.json +3 -3
  147. package/agent-assets/skills/reading/SKILL.md +8 -42
  148. package/agent-assets/skills/reading/references/reading-taste.md +5 -5
  149. package/agent-assets/skills/roadmap/SKILL.md +3 -19
  150. package/agent-assets/skills/roadmap/references/api.md +23 -8
  151. package/agent-assets/skills/roadmap/references/horizon-tags.md +11 -0
  152. package/agent-assets/skills/roadmap/references/migration.md +8 -6
  153. package/agent-assets/skills/roadmap/references/retention.md +18 -0
  154. package/agent-assets/skills/schedule/SKILL.md +20 -28
  155. package/agent-assets/skills/schedule/references/importance.md +23 -0
  156. package/agent-assets/skills/schedule/references/recurrence-rule.md +26 -16
  157. package/agent-assets/skills/scheduled-managed-task/SKILL.md +46 -46
  158. package/agent-assets/skills/today/SKILL.md +38 -81
  159. package/agent-assets/skills/today/references/agent-plan-lifecycle.md +9 -4
  160. package/agent-assets/skills/today/references/agent-plan-revision.md +28 -0
  161. package/agent-assets/skills/today/references/today-skeleton.md +66 -0
  162. package/agent-assets/skills/today/seeds/agent-notes-flavors.seed.json +1 -1
  163. package/agent-assets/skills/today/seeds/section-shape.seed.json +6 -6
  164. package/agent-assets/skills/user-interview/SKILL.md +15 -90
  165. package/agent-assets/skills/user-interview/references/op-briefing.md +1 -1
  166. package/agent-assets/skills/user-interview/references/op-dm-handler.md +88 -0
  167. package/agent-assets/skills/user-interview/references/op-morning.md +2 -2
  168. package/agent-assets/skills/user-interview/references/sweep-and-fallback.md +1 -1
  169. package/agent-assets/skills/user-profile/SKILL.md +16 -26
  170. package/agent-assets/skills/user-profile/curation.json +3 -3
  171. package/agent-assets/skills/user-profile/references/character-preferences.md +3 -3
  172. package/agent-assets/skills/wiki/wiki-ask/SKILL.md +1 -1
  173. package/agent-assets/skills/wiki/wiki-compile/SKILL.md +5 -4
  174. package/agent-assets/skills/wiki/wiki-connect/SKILL.md +32 -5
  175. package/agent-assets/skills/wiki/wiki-ingest/SKILL.md +6 -50
  176. package/agent-assets/skills/wiki/wiki-ingest/references/curl-errors.md +58 -0
  177. package/agent-assets/skills/wiki/wiki-lint/SKILL.md +20 -14
  178. package/agent-assets/skills/wiki/wiki-trace/SKILL.md +10 -5
  179. package/agent-assets/skills/wiki/wiki-vault-rules/SKILL.md +2 -0
  180. package/agent-assets/system-prompts/routine-research-cluster-update.md +71 -0
  181. package/agent-assets/task-flows/_partials/feedback-capture.md +30 -0
  182. package/agent-assets/task-flows/_partials/notion-acquire.notion.md +47 -21
  183. package/agent-assets/task-flows/background_task.md +81 -0
  184. package/agent-assets/task-flows/git.local_ahead.stale.md +1 -1
  185. package/agent-assets/task-flows/git.push.detected.md +1 -1
  186. package/agent-assets/task-flows/git.tag.created.md +1 -1
  187. package/agent-assets/task-flows/github.assigned.md +1 -1
  188. package/agent-assets/task-flows/github.pull_request.review_requested.md +2 -2
  189. package/agent-assets/task-flows/github.security_alert.md +1 -1
  190. package/agent-assets/task-flows/message.received.dm.md +11 -3
  191. package/agent-assets/task-flows/message.received.dm_first.md +8 -2
  192. package/agent-assets/task-flows/{routine.hourly_check.md → routine.activity_scan.md} +31 -23
  193. package/agent-assets/task-flows/{routine.hourly_check.triage.md → routine.activity_scan.triage.md} +3 -3
  194. package/agent-assets/task-flows/routine.evening_review.md +80 -0
  195. package/agent-assets/task-flows/routine.monthly_review.md +81 -8
  196. package/agent-assets/task-flows/routine.research_cluster_update.md +33 -19
  197. package/agent-assets/task-flows/routine.roadmap_refresh.md +2 -2
  198. package/agent-assets/task-flows/routine.today_refresh.md +1 -1
  199. package/agent-assets/task-flows/routine.weekly_review.md +124 -4
  200. package/agent-assets/task-flows/schedule.approaching.md +2 -2
  201. package/agent-assets/task-flows/scheduled.dm.md +77 -1
  202. package/agent-assets/task-flows/scheduled.task.md +7 -1
  203. package/agent-assets/task-flows/wiki.trace.md +1 -1
  204. package/agent-assets/templates/_manifest.json +2 -2
  205. package/agent-assets/templates/knowledge/dossiers/_index.md +1 -1
  206. package/agent-assets/templates/knowledge/dossiers/{hourly.md → activity-scan.md} +1 -1
  207. package/agent-assets/templates/policies/journal-format.md +1 -1
  208. package/agent-assets/templates/policies/mcp.md +1 -1
  209. package/agent-assets/templates/policies/routines/_index.md +1 -1
  210. package/agent-assets/templates/policies/routines/{hourly.md → activity-scan.md} +5 -5
  211. package/bin/aitne.mjs +45 -11
  212. package/package.json +6 -5
  213. package/scripts/commands/doctor.mjs +11 -2
  214. package/scripts/lib/process-identity.d.mts +46 -0
  215. package/scripts/lib/process-identity.mjs +193 -0
  216. package/scripts/lib/read-api-token.mjs +1 -1
  217. package/scripts/start.mjs +14 -4
  218. package/agent-assets/docs/features/routines/hourly-check.md +0 -205
@@ -12,6 +12,10 @@ Apply the canonical capture-user-info routing below to `<user_input>`.
12
12
 
13
13
  {include:_partials/capture-user-info.md}
14
14
 
15
+ Apply the canonical feedback-capture routing below to `<user_input>`.
16
+
17
+ {include:_partials/feedback-capture.md}
18
+
15
19
  ### Step 2 — Profile-question reconcile / latent opportunity
16
20
 
17
21
  Two operations from the user-interview skill — run in order, before composing the reply.
@@ -67,7 +71,7 @@ If the preview clears all three gates, surface 1–2 tasks:
67
71
 
68
72
  #### Resolved User Tasks
69
73
 
70
- When the user reports completing one of their tasks, mark it `[x]` per the today / context skill. Do NOT modify Agent Plan rows from this handler — those flip in `scheduled.task` handlers and Evening Review only.
74
+ When the user reports completing one of their tasks, mark it `[x]` per the today / context skill. Do NOT flip Agent Plan rows for execution outcomes — those flip at fire time in `scheduled.task` / `scheduled.dm` handlers. If the user's message invalidates a pending planned action, apply the today skill's "Agent Plan revision — cancel / amend" recipe. Unambiguous match only.
71
75
 
72
76
  #### Agent Plan is private — never surface as task status
73
77
 
@@ -76,7 +80,7 @@ Agent Plan rows in <today> are the agent's own pending actions, not user tasks.
76
80
  - Never frame an Agent Plan row as a user task ("your 9am task", "pending task", "still incomplete", "did-not-fire") — in any language.
77
81
  - Never quote the row's HH:MM, its action text, a task ID, or internal labels.
78
82
  - If a past-due `[ ]` row's content is a reminder relevant to the current DM, deliver the question as natural prose — no preamble.
79
- - Delivering a row's content does NOT execute it; the DM handler never flips Agent Plan rows.
83
+ - Delivering a row's content does NOT execute it; execution-outcome flips happen only at fire time.
80
84
 
81
85
  Bad — exposes the row as a task with internal identifiers:
82
86
 
@@ -136,6 +140,8 @@ affirmative.
136
140
 
137
141
  Schedules go through this daemon — never through any cloud-hosted scheduled-agent feature your CLI may expose. Cloud routines cannot reach `localhost:8321`, so they cannot deliver via the user's chat platforms or use any integration registered here.
138
142
 
143
+ **Background task** (a single long-running / open-ended job the user wants done while they keep chatting — deep research, a multi-repo / multi-file audit, "monitor X over time", a bulk compile) → hand it to the detached runner via the `background-task` skill. Resolve scope *this turn*, compose a self-contained brief (objective, inputs, output language, notification policy + concrete `if_significant` criteria), POST, ack in one line, and **end the turn** — never poll; the daemon delivers the result in your voice when it's done. Keep a plausibly-quick lookup inline, but if one you started inline balloons, promote it — fold the work already done into the brief so the worker continues rather than restarting, then POST + ack + end the turn. A recurring cadence is the Scheduling arm above (`agent-create`); an open-ended *browser* job is the `browser-task` skill.
144
+
139
145
  **Long-horizon intent** (commitment, trip, deliverable, learning target beyond today) → apply the decision tree below; the `roadmap` skill is the writer. Ambiguous or speculative items belong in `journal/agent.md` as a candidate line for the next morning routine to confirm — do **not** write directly to `plans/roadmap.md` without a clear positive signal.
140
146
 
141
147
  {include:_partials/dm-intent.long-horizon.md}
@@ -1,18 +1,18 @@
1
1
  {context}
2
2
 
3
- ## Hourly Observation Review
3
+ ## Activity Scan — Observation Review
4
4
 
5
- This task-flow is the **daemon-internal** hourly cron — a built-in
6
- observation review the dispatcher fires every hour. It is NOT the
7
- user-facing recurring path. An operator who wants a custom recurring
8
- task creates a recurring **Agent** (`POST /api/agents`, e.g. an hourly
9
- cron `0 * * * *`); those fire `scheduled.task` / `scheduled.dm` events
10
- instead.
5
+ This task-flow is the **daemon-internal** activity-scan cron — a built-in
6
+ observation review the dispatcher fires every interval (default: every
7
+ 2 hours) within active hours. It is NOT the user-facing recurring path.
8
+ An operator who wants a custom recurring task creates a recurring
9
+ **Agent** (`POST /api/agents`, e.g. an hourly cron `0 * * * *`); those
10
+ fire `scheduled.task` / `scheduled.dm` events instead.
11
11
 
12
12
  The "Vault policy files" block appended to this prompt includes
13
- `policies/routines/hourly.md` — your canonical check list for this cadence.
13
+ `policies/routines/activity-scan.md` — your canonical check list for this cadence.
14
14
  The "Vault review context" block includes `context-index.md` and
15
- `knowledge/dossiers/hourly.md`; consult it before Step 1 and update the dossier's
15
+ `knowledge/dossiers/activity-scan.md`; consult it before Step 1 and update the dossier's
16
16
  Open items / Last run before finishing. Writes to `knowledge/dossiers/<flow>.md`
17
17
  MUST preserve the existing YAML frontmatter block (`---\ntype: dossier\nowner: agent\nupdated: <date>\n---`); prefer `PATCH` with a
18
18
  section target to mutate a single block, and when doing a `PUT` full
@@ -45,7 +45,7 @@ only want the user-actor surface (e.g. early triage). Follow the
45
45
  context skill for today.md section formats and the day-type filter
46
46
  mapping — this prompt owns the decision workflow only. Most runs should
47
47
  do bookkeeping silently; only fire POST /api/notify on the urgency gate
48
- in Step 8 below.
48
+ in Step 9 below.
49
49
 
50
50
  ### Step 0 — Read pre-pass `<fetch_report>`
51
51
 
@@ -108,33 +108,34 @@ observedAt) fall back to the legacy fetch-on-doubt rules in the
108
108
  observations skill.
109
109
 
110
110
  ### Default stance — silence + idempotence
111
- Most hourly runs are silent bookkeeping: consume observations, update
111
+ Most scan runs are silent bookkeeping: consume observations, update
112
112
  today.md, log, done. The baseline assumption for every step below is
113
113
  that the user does NOT want another notification and does NOT want a
114
114
  new Agent Plan row unless this run has something genuinely new to add.
115
115
  The morning routine is authoritative for the day's plan; your job is
116
- to fold in new signals, not to re-plan. Two hard rules:
116
+ to fold in new signals adding rows and retiring invalidated ones
117
+ (Step 5) — not to re-plan the day. Two hard rules:
117
118
 
118
119
  - **No duplicate Agent Plan rows / schedules.** Before appending to
119
120
  `## Agent Plan` or calling `POST /api/schedule`, run the dedup
120
121
  pre-check in Step 4. If a matching row/schedule already exists,
121
122
  skip and log — never add a second one.
122
123
  - **No duplicate notifications.** Before `POST /api/notify`, run the
123
- dedup pre-check in Step 8. If the same item was already notified
124
+ dedup pre-check in Step 9. If the same item was already notified
124
125
  earlier today, stay silent and log.
125
126
 
126
127
  When in doubt, stay silent and log to `## Agent Log`.
127
128
 
128
- ### External services are read-only this hour
129
+ ### External services are read-only during this run
129
130
 
130
- This routine reads external state for context — it does not push back. While running this hourly check, do **not**:
131
+ This routine reads external state for context — it does not push back. While running this activity scan, do **not**:
131
132
 
132
133
  - Create / update / archive Notion pages or change Notion schema.
133
134
  - Send / draft / move / tag mail.
134
135
  - Create / update / delete calendar events.
135
136
  - Open / merge / comment on GitHub PRs or issues.
136
137
 
137
- External-source signals (`mail:*`, `notion:*`, `calendar:*`, `git:*`) reach you through `<observations>`. Consume them, route to `state/today.md` / `projects/*.md` / the `roadmap_candidate` queue per the Decision Framework below, but do **not** act back on the source system. Outbound writes against external services belong in the morning routine, evening review, or DM-reply paths — `routine.hourly_check` is a silent bookkeeping pass.
138
+ External-source signals (`mail:*`, `notion:*`, `calendar:*`, `git:*`) reach you through `<observations>`. Consume them, route to `state/today.md` / `projects/*.md` / the `roadmap_candidate` queue per the Decision Framework below, but do **not** act back on the source system. Outbound writes against external services belong in the morning routine, evening review, or DM-reply paths — `routine.activity_scan` is a silent bookkeeping pass.
138
139
 
139
140
  This rule applies regardless of integration mode (direct, same-backend delegated, cross-backend delegated). It is owned by the routine, so a session whose `notion` / `mail` / `external-services` skill body was dropped under same-backend delegation (because the connector covers the surface) still inherits the constraint.
140
141
 
@@ -170,15 +171,22 @@ This rule applies regardless of integration mode (direct, same-backend delegated
170
171
  and schedule entries are always in lock-step (see skill "User Tasks vs
171
172
  Agent Plan → The Agent Plan contract").
172
173
  - Day-time observation (git push, Notion status change) → append to ## Agent Notes.
173
- 5. Update projects/*.md when the observation materially changes project
174
- state. Do NOT write to roadmap.md from hourly for long-horizon
174
+ 5. Retire invalidated rows the reverse of dedup. When an observation
175
+ kills the premise behind a pending `## Agent Plan` row or schedule
176
+ (calendar event cancelled or moved, user already completed the item,
177
+ source artifact gone), apply the today skill's "Agent Plan revision —
178
+ cancel / amend" recipe: cancel or re-time the schedule, update the
179
+ row, log. Subject AND time must match unambiguously; uncertain →
180
+ leave the row, fire-time guards catch it.
181
+ 6. Update projects/*.md when the observation materially changes project
182
+ state. Do NOT write to roadmap.md from the activity scan — for long-horizon
175
183
  signals that don't belong in today.md but aren't yet strong enough
176
184
  for direct roadmap edits (e.g. a user edited a vault note mentioning
177
185
  a trip "sometime this summer", a far-future calendar event with an
178
186
  unclear prep window), **queue them as `roadmap_candidate`
179
187
  observations** via POST /api/observations (observations skill). The
180
188
  next roadmap_refresh run consumes them and decides routing; this
181
- hourly flow intentionally does not load the long-term-plan taxonomy
189
+ activity-scan flow intentionally does not load the long-term-plan taxonomy
182
190
  at all.
183
191
  ```
184
192
  curl -s -X POST http://localhost:8321/api/observations \
@@ -186,15 +194,15 @@ This rule applies regardless of integration mode (direct, same-backend delegated
186
194
  -d '{"source":"roadmap_candidate:<subkind>","ref":"<stable-ref>","changeType":"created","actor":"agent","payload":{...}}'
187
195
  ```
188
196
  `<subkind>` examples: `travel`, `calendar`, `vault`, `dm`.
189
- 6. Skip noise: journal-only edits, trivial formatting, auto-generated churn,
197
+ 7. Skip noise: journal-only edits, trivial formatting, auto-generated churn,
190
198
  already-processed agent writes, deletion of auto-generated artifacts.
191
- 7. Mark processed observations consumed via POST /api/observations/consume.
199
+ 8. Mark processed observations consumed via POST /api/observations/consume.
192
200
  Shape: `{"ids":[<int>...],"correlationId":"<verbatim from <event_correlation_id>>"}`.
193
201
  Both fields are required and camelCase — `correlation_id` snake_case is
194
202
  rejected. `ids` must be integers (not strings). Copy `correlationId`
195
203
  verbatim from the `<event_correlation_id>…</event_correlation_id>` tag
196
204
  in this prompt; do not paste the angle-bracket placeholder.
197
- 8. Urgency gate for POST /api/notify — the default is SILENCE. At most
205
+ 9. Urgency gate for POST /api/notify — the default is SILENCE. At most
198
206
  ONE call per run, and only after the dedup pre-check passes AND one
199
207
  of (a)(b)(c) holds with its concrete threshold:
200
208
 
@@ -230,6 +238,6 @@ This rule applies regardless of integration mode (direct, same-backend delegated
230
238
  queued, observations consumed.
231
239
 
232
240
  When in doubt, stay silent and log.
233
- 9. Append one line to ## Agent Log even on no-op runs (Agent Log only — do
241
+ 10. Append one line to ## Agent Log even on no-op runs (Agent Log only — do
234
242
  not echo as final text, do not send via notify):
235
243
  `- HH:MM [observations] reviewed N items, added X tasks / Y plan rows, skipped Z`.
@@ -1,9 +1,9 @@
1
1
  {context}
2
2
 
3
- ## Hourly Check — Stage 2 Triage
3
+ ## Activity Scan — Stage 2 Triage
4
4
 
5
5
  You are the Stage-2 lite-tier triage gate of the three-stage
6
- `routine.hourly_check` funnel (cost-reduction-structural §B). The
6
+ `routine.activity_scan` funnel (cost-reduction-structural §B). The
7
7
  deterministic Stage-1 gate already screened out the obviously-quiet
8
8
  cron ticks and the obviously-urgent ones. Your job is the narrow
9
9
  middle band: low-signal observations that *might* deserve a full
@@ -29,7 +29,7 @@ appends a one-line silent log via the daemon-direct writer.
29
29
  observations and append one bullet to today.md `## Agent Log`. No
30
30
  user-visible side effect.
31
31
  4. `action="escalate"` means: the daemon spawns the full Stage-3
32
- hourly_check session with a `<gate_decision>` block that carries
32
+ activity_scan session with a `<gate_decision>` block that carries
33
33
  your `reason` so the routine knows what to prioritize.
34
34
  5. `reason` is short, mechanical, telemetry-friendly. Examples:
35
35
  `"calendar event needs review"`, `"only journal noise"`,
@@ -224,3 +224,83 @@ PATCH:
224
224
  Learned Context entries out to the matching user/*.md file and
225
225
  remove them from user/profile.md so the primary profile stays compact.
226
226
 
227
+ ### Step 4 — Consolidate feedback signals into lessons
228
+
229
+ If a `<feedback_worksheet>` block is present in your context, fold the
230
+ unconsumed feedback signals it lists into the scoped lesson stores. The daemon
231
+ already did the mechanical work: every candidate carries a deterministic
232
+ `decision`, `conf`, `weighted_ev`, and `reason`; every existing lesson carries a
233
+ `rank` (rank 1 = lowest score = evict first); and the block ends with the exact
234
+ `<consume ids="…">` set. Your job is only the **semantic** part — judge whether a
235
+ candidate matches an existing lesson's intent, phrase the generalization, and
236
+ detect contradictions. Do **not** recompute promotion or caps; honour the
237
+ worksheet's `decision` and `rank` verbatim. If the block is absent, skip this
238
+ step entirely. Like Steps 1–3 it is internal bookkeeping and emits no
239
+ user-facing output.
240
+
241
+ 4a. **Lesson-store scopes** — process **every** `<scope … mode="lessons">` in the
242
+ worksheet, writing each to the `store=` path it declares: the global `agent`
243
+ scope (`store="policies/agent-lessons.md"`) and any per-agent
244
+ `agent:<slug>` scope (`store="policies/agents/<slug>/lessons.md"` — feedback
245
+ on one named agent's own output, injected only into that agent's runs). The
246
+ per-candidate rules below are identical for each; only the target file and
247
+ its H1 change. GET the scope's `store=` file first. If it 404s, PUT a fresh
248
+ file: frontmatter `type: rule` / `owner: agent` / `updated: <agent_day_date>`,
249
+ an H1 (`# Agent Lessons` for the global `agent` scope; `# Agent Lessons —
250
+ <label>` for an `agent:<slug>` scope, e.g. `# Agent Lessons — agent:report-writer`),
251
+ then a `## Lessons` section. Then, per candidate in that scope:
252
+ - `decision="promote"` → find an existing `## Lessons` bullet with the same
253
+ intent. If found, bump its `ev=` by `weighted_ev` (rounded to a whole
254
+ number), refresh `last=` to today, raise `conf`, and tighten the wording.
255
+ If not, add a new **active** bullet:
256
+ `- [<today>] <directive> <!-- ev=<round(weighted_ev), min 1> kind=<kind> src=<src> conf=<conf> last=<today> -->`
257
+ (`src`/`conf` come from the candidate; use the candidate's `kind=` when
258
+ present, otherwise infer it from the directive; `kind` ∈
259
+ preference|correction|do-more|do-less|constraint).
260
+ - `decision="hold-provisional"` with `reason="below-threshold"` → if it
261
+ matches an existing lesson's intent, bump that lesson's `ev`; otherwise add
262
+ the bullet with a trailing `<!-- provisional -->` marker (stored, not yet
263
+ injected — it promotes once corroboration reaches the threshold).
264
+ - `decision="hold-provisional"` with `reason="ignored-non-initiating"` →
265
+ silence never *starts* a lesson. Only use it to bump the `ev` of an
266
+ existing matching lesson; if none matches, write nothing for it.
267
+ - A newer `correction` that contradicts an active lesson **supersedes** it:
268
+ drop the stale bullet in the same rebuild so a changed mind leaves no
269
+ stale guidance.
270
+ - **Staleness prune** (§4 step 7): drop any existing lesson the worksheet
271
+ marks `stale="true"` (its `last=` is past the staleness horizon and it is
272
+ not a `constraint`) unless a fresh candidate re-reinforces it this pass —
273
+ a `constraint` is durable and is never stale-pruned.
274
+ Write the scope's section back with `PATCH <store= path> section=lessons
275
+ mode=replace`, applying the Step-2 section-body-rebuild discipline (GET fresh,
276
+ write the keep-list down first, byte-for-byte for unchanged bullets). Repeat
277
+ for each `mode="lessons"` scope; a write failure on one scope must not block
278
+ the others (omit only the failed scope's ids from the consume call, 4d).
279
+
280
+ 4b. **Cap enforcement.** After your edits to each scope, if its `## Lessons`
281
+ section exceeds that scope's `cap_bytes` or `max_entries`, remove existing
282
+ lessons starting from `rank="1"` (the worksheet's lowest-scored) upward until
283
+ it fits, then append exactly one marker line:
284
+ `- [...N lower-signal lessons omitted — full history in feedback_signals]`.
285
+ Never evict a `kind=constraint` lesson — drop the next-lowest instead.
286
+
287
+ 4c. **User-scope signals** (`<scope label="user" … mode="raw">`). These are
288
+ explicit owner directives captured via `POST /api/feedback`, *not* Raw
289
+ Signals. Route each into `## Learned Context` (or the matching
290
+ `identity/*.md` file) using the same bucket rules as Step 3 (a₂ / b),
291
+ respecting the ~600-token profile budget. Do not double-write a signal you
292
+ already folded from Raw Signals.
293
+
294
+ 4d. **Consume.** Once every scope above is written, mark the processed signals
295
+ consumed so they don't resurface tomorrow — send the worksheet's full
296
+ `<consume>` id list:
297
+ ```bash
298
+ curl -s -X POST http://localhost:8321/api/feedback/consume \
299
+ -H 'Content-Type: application/json' \
300
+ -d '{"ids": [<the ids from <consume ids="…"/>>]}'
301
+ ```
302
+ Consume is by id and race-safe: any signal the detector appended after the
303
+ worksheet was built has a higher id absent from the list and survives
304
+ untouched for tomorrow's pass. If a lesson write failed, omit that scope's
305
+ ids from the consume call so its signals are retried next Evening Review.
306
+
@@ -3,10 +3,11 @@
3
3
 
4
4
  The scheduler cron and boot-time catchup in
5
5
  `packages/daemon/src/{core/scheduler.ts,bootstrap/schedule-helpers.ts}`
6
- consult `config.monthlyReviewEnabled` (default `false`) before
7
- firing this routine. The task flow below is preserved verbatim as
8
- the design-of-record but is not exercised at runtime until the kill
9
- switch flips on.
6
+ consult the monthly-review AGENT row's `enabled` (ships `false`;
7
+ enable from /agents/monthly-review AGENTS_HUB_REDESIGN_PLAN.md §2)
8
+ before firing this routine. The task flow below is preserved verbatim
9
+ as the design-of-record but is not exercised at runtime until the
10
+ agent is enabled.
10
11
 
11
12
  Why disabled: the current routine reads ~30 daily files + 4-5 weekly
12
13
  files + the agent journal to synthesise a user-facing snapshot whose
@@ -35,8 +36,8 @@
35
36
  5. Drop the agent-internal `## Monthly YYYY-MM` block — weekly's
36
37
  12-week journal already covers self-critique signal.
37
38
 
38
- When the redesign ships, flip the default to `true` in
39
- `packages/daemon/src/settings/runtime-settings.ts:monthlyReviewEnabled`
39
+ When the redesign ships, flip `defaultEnabled`/`enabled` to `true` in
40
+ `builtin-registry.ts` + `agent-assets/agents/monthly-review/agent.md`
40
41
  and re-introduce the docs under `agent-assets/docs/features/routines/`.
41
42
  -->
42
43
 
@@ -73,7 +74,7 @@ workflow; the skill owns the file contract.
73
74
  1. Determine the target file name from <current_time>:
74
75
  `journal/monthly/YYYY-MM.md`.
75
76
 
76
- **Pre-pass acquisition (none).** Unlike morning / hourly / today_refresh /
77
+ **Pre-pass acquisition (none).** Unlike morning / activity-scan / today_refresh /
77
78
  evening / weekly, monthly_review does NOT trigger an `<acquisition-plan>`
78
79
  block — the 30-day calendar window already arrives via the
79
80
  `<calendar_events_30d>` ContextBuilder block (multi-provider after the
@@ -219,7 +220,7 @@ continue.
219
220
  ### Proposed adjustments
220
221
  - (max 3 bullets; concrete and testable — prompt tweak, schedule
221
222
  adjustment, filter rule, silence gate tuning. "Improve filter quality"
222
- is not testable; "Lower hourly_check observation threshold from 2 to 1
223
+ is not testable; "Lower activity_scan observation threshold from 2 to 1
223
224
  on weekends" is)
224
225
  ### Metrics (agent side, monthly roll-up)
225
226
  - Agent plan rows completed: N
@@ -236,6 +237,27 @@ continue.
236
237
  cross-week frequency and drop the rest. Single-week anomalies are already
237
238
  in that week's journal entry and do not need re-listing.
238
239
 
240
+ For each concrete, actionable bullet in `### Proposed adjustments`, also
241
+ record a structured self-critique signal:
242
+
243
+ ```
244
+ POST /api/feedback
245
+ {
246
+ "source": "self_critique",
247
+ "summary": "<the specific testable adjustment, max 280 chars>",
248
+ "valence": "neutral",
249
+ "kind": "do-more",
250
+ "scope_type": "agent",
251
+ "action_kind": "agent_execution",
252
+ "evidence": { "excerpt": "monthly_review YYYY-MM proposed adjustment" }
253
+ }
254
+ ```
255
+
256
+ Post only concrete proposed adjustments. Do not post every retrospective
257
+ sentence, metrics row, or vague wish. If an adjustment is clearly about one
258
+ named Agent Definition's output, use `scope_type: "agent_slug"` and
259
+ `scope_ref` with that slug; otherwise keep `scope_type: "agent"`.
260
+
239
261
  If `journal/agent.md` does not yet exist, PUT a minimal file with
240
262
  `# Agent Journal\n\n` header plus this section, in a single call.
241
263
 
@@ -244,6 +266,57 @@ continue.
244
266
  rollup collapses duplicate keys last-write-wins, so your newer append
245
267
  automatically supersedes the earlier one within 24 hours.
246
268
 
269
+ ### Phase 3c: Re-generalize feedback lessons (internal)
270
+
271
+ If a `<feedback_regeneralization>` block is present in your context, collapse
272
+ accumulated specific lessons into a smaller set of higher-level principles. This
273
+ is the monthly counterpart to the Evening Review's signal-folding: it processes
274
+ **no new signals and consumes nothing** — it only re-reads the already-consolidated
275
+ lesson stores the block lists and rewrites them. The daemon already did the
276
+ mechanical work: every `<scope>` carries its `store=` path and caps, and every
277
+ `<lesson>` carries a `rank` (rank 1 = lowest eviction score = drop-first), its
278
+ `ev`/`kind`/`last`, and a `stale="true"` flag when it is past the staleness
279
+ horizon. Your job is the **semantic** part — cluster lessons that share a theme
280
+ and phrase the generalization. If the block is absent, skip this phase entirely.
281
+ Like Phase 3b it is internal bookkeeping and emits no user-facing output.
282
+
283
+ For **each** `<scope … >` in the block, writing back to the `store=` path it
284
+ declares (`policies/agent-lessons.md` for the global `agent` scope;
285
+ `policies/agents/<slug>/lessons.md` for a per-agent `agent:<slug>` scope):
286
+
287
+ 11. GET the scope's `store=` file. Identify clusters of two or more lessons that
288
+ express the same underlying preference at different surfaces — e.g.
289
+ "shorter mail summary", "shorter standup", "shorter report" all express
290
+ "default to terse output". For each cluster:
291
+ - Replace its members with **one** higher-level bullet that captures the
292
+ shared principle:
293
+ `- [<today>] <generalized directive> <!-- ev=<sum of the cluster's ev, min 1> kind=<the cluster's strongest kind> src=<strongest src> conf=<high if any member was high, else medium> last=<today> -->`
294
+ (summing `ev` keeps the merged lesson harder to evict — never re-derive it lower).
295
+ - Leave a lesson that belongs to no cluster untouched, byte-for-byte.
296
+ - **Never collapse, merge, or promote a `<!-- provisional -->` lesson.** The
297
+ worksheet block lists only active (promoted) lessons; the file also holds
298
+ provisional lessons awaiting corroboration, which the nightly evening pass
299
+ alone may promote. Preserve every provisional lesson in the file exactly as
300
+ it is — re-generalization is not a promotion path.
301
+ - **Do not** collapse across a contradiction: if two lessons give opposing
302
+ guidance, keep them separate and prefer the one with the more recent `last=`;
303
+ drop the stale opposite only when a `correction` superseded it.
304
+ - Drop any lesson the block marks `stale="true"` unless it joins a cluster —
305
+ a `kind=constraint` lesson is durable and is never collapsed away or
306
+ stale-pruned.
307
+ Re-generalization should make each store **smaller**, not larger; if a scope
308
+ has no genuine clusters, leave it unchanged.
309
+ 12. After your edits, if the section still exceeds the scope's `cap_bytes` or
310
+ `max_entries`, remove existing lessons starting from `rank="1"` upward until
311
+ it fits, then append exactly one marker line:
312
+ `- [...N lower-signal lessons omitted — full history in feedback_signals]`.
313
+ Never evict a `kind=constraint` lesson.
314
+ Write the scope's section back with `PATCH <store= path> section=lessons
315
+ mode=replace`, applying the same GET-fresh / write-the-keep-list discipline
316
+ Phase 3a uses. A write failure on one scope must not block the others or any
317
+ later phase. There is **no consume call** in this phase — re-generalization
318
+ rewrites lessons in place and touches no `feedback_signals` rows.
319
+
247
320
  ### Phase 4: Notify (user-facing only)
248
321
  10. The notification is for the USER, not a report of Phases 1–3. Never
249
322
  mention journal/monthly/YYYY-MM.md, journal/agent.md, "Monthly Review complete",
@@ -1,34 +1,48 @@
1
1
  {context}
2
2
 
3
- ## Task: Append today's day-log entry to one research cluster
3
+ ## Task: Append the missing day-log entries to one research cluster
4
4
 
5
5
  The daemon enqueued this session because the cluster slug in
6
6
  `event.data.slug` has new meaningful activity since the last journal
7
- update. Your job is mechanical: read the delta, format one block,
8
- append it. Do NOT compose owner-facing DMs from this flow engagement
9
- offer DMs are composed by the `routine.research_offer_dm` agent, not
10
- by you.
7
+ update. Operate on that **one** slug only — the daemon already selected
8
+ the cluster and fans out one event per cluster, so do not list or
9
+ iterate clusters. Your job is mechanical: read the delta, format the
10
+ day blocks that are still missing from the journal, append them. Do NOT
11
+ compose owner-facing DMs from this flow — engagement offer DMs are
12
+ composed by the `routine.research_offer_dm` agent, not by you.
11
13
 
12
14
  Follow the `browser-history` skill, "Flow: routine.research_cluster_update".
13
15
 
14
16
  1. Fetch `GET /api/browser-history/research-clusters/<slug>` for the
15
17
  `displayName`, `topDomains`, and `agentSummaryRevision`.
16
18
  2. Fetch `GET /api/browser-history/research-clusters/<slug>/delta`.
17
- The response includes `days[]` with `date`, `meaningfulVisits`,
18
- `meaningfulForegroundSec`, and `newDomains` for each bucketed
19
- day. Identify the most-recent day not yet present in the existing
20
- journal.
19
+ The response's `days[]` carries `date`, `meaningfulVisits`,
20
+ `meaningfulForegroundSec`, `newDomains`, and `complete` for each
21
+ bucketed day. `days[]` is ordered **oldest-first** and capped to the
22
+ most recent 31 days. `complete: false` marks the still-accumulating
23
+ current agent day — its counts are not final yet.
21
24
  3. Read the existing journal at
22
- `context/research/<slug>.md` via `GET /api/context/research/<slug>.md`.
23
- If the GET returns 404, create the file from the initial template
24
- in the skill populate frontmatter from the cluster detail; the
25
- `## Day log` section starts with today's block. If the GET returns
26
- 200, leave existing content untouched and append today's block.
27
- 4. Append (or create) via the context API. Use `PATCH` with an
28
- `append:` body when the file already exists; use `PUT` for the
29
- initial-file case.
30
- 5. Optionally update the `## Cluster summary` block when the day's
31
- `newDomains` materially shifts the topic two short sentences,
25
+ `context/research/<slug>.md` via `GET /api/context/research/<slug>.md`,
26
+ and note which `### <YYYY-MM-DD>` headings already appear under
27
+ `## Day log`. If the GET returns 404, the file does not exist yet —
28
+ create it from the initial template in the skill (populate
29
+ frontmatter from the cluster detail). If the GET returns 200, leave
30
+ existing content untouched.
31
+ 4. Append a block for **every** day in `days[]` with `complete: true`
32
+ whose `date` is not already present under `## Day log`, **oldest
33
+ first** (iterate `days[]` in its natural order). Never append a
34
+ `complete: false` day its counts are still growing and this ledger
35
+ is append-only, so a premature block would freeze an undercounted
36
+ day forever; it will arrive complete on a later run. This backfills
37
+ any nights the update was skipped or failed — a failed run waits a
38
+ full agent-day before retrying, so missed days accumulate until the
39
+ next successful run, and the 31-day delta window bounds the
40
+ catch-up. Use `PATCH` with an `append:` body when the file already
41
+ exists; use `PUT` for the initial-file case (the first block is the
42
+ oldest missing day). Never rewrite earlier days — this is an
43
+ append-only ledger.
44
+ 5. Optionally update the `## Cluster summary` block when the new
45
+ `newDomains` materially shift the topic — two short sentences,
32
46
  no thesis statements the data does not support. This is the only
33
47
  case where you re-write an earlier section; never edit the day log.
34
48
 
@@ -84,8 +84,8 @@ coordinates the high-level gather → analyze → write loop.
84
84
  see at morning review (e.g. "you'll be reminded about ESTA in 3 weeks").
85
85
 
86
86
  3. Fetch pending `roadmap_candidate` observations — weak signals queued
87
- by `routine.hourly_check` (far-future calendar changes, user-edited
88
- vault notes mentioning trips / deadlines, etc.) that the hourly flow
87
+ by `routine.activity_scan` (far-future calendar changes, user-edited
88
+ vault notes mentioning trips / deadlines, etc.) that the activity-scan flow
89
89
  deliberately did NOT write to roadmap directly:
90
90
  ```
91
91
  curl -s 'http://localhost:8321/api/observations?source=roadmap_candidate&pending=true&limit=50'
@@ -21,7 +21,7 @@ day rotation and **not** a morning routine.
21
21
  tries. If still locked after the final retry, **return a one-line
22
22
  status (`deferred — morning routine lock held`) and stop**. Do NOT
23
23
  attempt to append a deferred line to `## Agent Log` — that PATCH is
24
- also blocked by the same lock. The next morning/hourly run will
24
+ also blocked by the same lock. The next morning/activity-scan run will
25
25
  reconcile.
26
26
 
27
27
  ### Step 1 — Read today's calendar from observations