@forwardimpact/outpost 3.12.1 → 3.13.0

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 (85) hide show
  1. package/package.json +3 -2
  2. package/src/kb-manager.js +58 -5
  3. package/src/kb-validator.js +762 -0
  4. package/src/outpost.js +73 -8
  5. package/templates/.claude/agents/chief-of-staff.md +14 -6
  6. package/templates/.claude/agents/concierge.md +9 -2
  7. package/templates/.claude/agents/head-hunter.md +9 -2
  8. package/templates/.claude/agents/librarian.md +11 -4
  9. package/templates/.claude/agents/postman.md +9 -2
  10. package/templates/.claude/agents/recruiter.md +9 -2
  11. package/templates/.claude/skills/anarlog-follow/SKILL.md +53 -29
  12. package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
  13. package/templates/.claude/skills/anarlog-process/SKILL.md +88 -45
  14. package/templates/.claude/skills/anarlog-process/references/extraction.md +19 -11
  15. package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
  16. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +404 -163
  17. package/templates/.claude/skills/candidate-report/SKILL.md +12 -9
  18. package/templates/.claude/skills/changelog/SKILL.md +106 -56
  19. package/templates/.claude/skills/deck-create/SKILL.md +60 -2
  20. package/templates/.claude/skills/deck-review/SKILL.md +4 -1
  21. package/templates/.claude/skills/deck-summarize/SKILL.md +6 -2
  22. package/templates/.claude/skills/deck-summarize/references/brief-template.md +1 -1
  23. package/templates/.claude/skills/doc-collab/SKILL.md +16 -11
  24. package/templates/.claude/skills/doc-create/SKILL.md +6 -3
  25. package/templates/.claude/skills/draft-emails/SKILL.md +31 -25
  26. package/templates/.claude/skills/draft-emails/references/template.md +1 -1
  27. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +14 -8
  28. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +9 -3
  29. package/templates/.claude/skills/extract-entities/SKILL.md +17 -16
  30. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +2 -1
  31. package/templates/.claude/skills/extract-entities/references/conditions.md +6 -5
  32. package/templates/.claude/skills/extract-entities/references/links.md +34 -10
  33. package/templates/.claude/skills/extract-entities/references/recruitment.md +15 -10
  34. package/templates/.claude/skills/extract-entities/references/resolution.md +1 -1
  35. package/templates/.claude/skills/extract-entities/references/sources.md +1 -1
  36. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +10 -4
  37. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
  38. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +8 -2
  39. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
  40. package/templates/.claude/skills/meeting-prep/SKILL.md +23 -18
  41. package/templates/.claude/skills/organize-files/SKILL.md +3 -0
  42. package/templates/.claude/skills/person-identify/SKILL.md +58 -10
  43. package/templates/.claude/skills/person-identify/scripts/identify.sh +110 -11
  44. package/templates/.claude/skills/person-lookup/SKILL.md +8 -3
  45. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +27 -1
  46. package/templates/.claude/skills/req-assess/SKILL.md +19 -11
  47. package/templates/.claude/skills/req-assess/references/interview-template.md +6 -1
  48. package/templates/.claude/skills/req-assess/references/panel-template.md +5 -1
  49. package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
  50. package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
  51. package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
  52. package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
  53. package/templates/.claude/skills/req-decide/SKILL.md +26 -18
  54. package/templates/.claude/skills/req-decide/references/template.md +2 -2
  55. package/templates/.claude/skills/req-forget/SKILL.md +39 -22
  56. package/templates/.claude/skills/req-forget/references/classify.md +12 -10
  57. package/templates/.claude/skills/req-forget/references/locations.md +27 -22
  58. package/templates/.claude/skills/req-forget/references/report-template.md +23 -15
  59. package/templates/.claude/skills/req-scan/SKILL.md +6 -3
  60. package/templates/.claude/skills/req-scan/references/template.md +11 -1
  61. package/templates/.claude/skills/req-screen/SKILL.md +78 -34
  62. package/templates/.claude/skills/req-screen/references/rubric.md +38 -42
  63. package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
  64. package/templates/.claude/skills/req-screen/references/template.md +26 -14
  65. package/templates/.claude/skills/req-track/SKILL.md +44 -44
  66. package/templates/.claude/skills/req-track/references/fields.md +18 -15
  67. package/templates/.claude/skills/req-track/references/overlays.md +42 -0
  68. package/templates/.claude/skills/req-track/references/signals.md +2 -2
  69. package/templates/.claude/skills/req-track/references/templates.md +28 -27
  70. package/templates/.claude/skills/req-workday/SKILL.md +49 -20
  71. package/templates/.claude/skills/req-workday/references/brief.md +81 -0
  72. package/templates/.claude/skills/req-workday/references/templates.md +6 -73
  73. package/templates/.claude/skills/req-workday/references/xlsx-format.md +19 -0
  74. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +96 -20
  75. package/templates/.claude/skills/send-chat/SKILL.md +11 -11
  76. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +3 -0
  77. package/templates/.claude/skills/sync-apple-mail/SKILL.md +3 -0
  78. package/templates/.claude/skills/sync-teams/SKILL.md +3 -0
  79. package/templates/.claude/skills/upstream-instructions/SKILL.md +8 -5
  80. package/templates/.claude/skills/upstream-instructions/references/examples.md +3 -3
  81. package/templates/CLAUDE.md +96 -87
  82. package/templates/MIGRATION.md +359 -0
  83. package/templates/registry.yaml +25 -0
  84. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
  85. package/templates/.claude/skills/anarlog-trim/SKILL.md +0 -186
@@ -1,13 +1,16 @@
1
1
  ---
2
2
  name: anarlog-process
3
- description: Process Anarlog meeting sessions (memos, summaries, transcripts) into the knowledge graph. Extracts people, organizations, projects, and topics from AI-generated meeting summaries and user notes. Creates or updates Obsidian-compatible notes in Knowledge/. Use when the user asks to process meeting notes or after Anarlog sessions.
3
+ description: Process Anarlog meeting sessions (memos, summaries, transcripts) into the knowledge graph. Extracts people, organizations, projects, and topics from AI-generated meeting summaries and user notes. Creates or updates Obsidian-compatible notes in the tier directories. Use when the user asks to process meeting notes or after Anarlog sessions.
4
4
  ---
5
5
 
6
6
  # Process Anarlog
7
7
 
8
+ Write tier: `3-Team`; dated entries route per the entry's own tier
9
+ Frontmatter: person, organization, project, topic
10
+
8
11
  Process meeting sessions from Anarlog (a local AI meeting-notes app) into the
9
12
  knowledge graph. Anarlog records meetings, transcribes them, and generates AI
10
- summaries. This skill reads that output and feeds it into `Knowledge/`.
13
+ summaries. This skill reads that output and feeds it into the tiers.
11
14
  `extract-entities` processes emails and calendar events in the same way.
12
15
 
13
16
  ## Trigger
@@ -18,43 +21,52 @@ summaries. This skill reads that output and feeds it into `Knowledge/`.
18
21
 
19
22
  ## Prerequisites
20
23
 
21
- - Anarlog installed. Sessions live at
22
- `~/Library/Application Support/anarlog/sessions/`.
24
+ - Anarlog installed. Meetings live in its local SQLite database (`app.db`).
25
+ Read them only through Anarlog's typed, read-only interfaces (per its own
26
+ `AGENTS.md`): prefer the **Anarlog MCP tools** (`get_meeting`,
27
+ `get_meeting_transcript`) when connected, else the **bundled `anarlog-cli`**
28
+ with `--json`. Never `grep`, crawl `sessions/`, or query SQLite directly.
23
29
  - The user identity. The `person-identify` skill writes it to
24
30
  `~/.cache/fit/outpost/state/identity.md`.
25
31
 
26
32
  ## Inputs
27
33
 
28
- - `~/Library/Application Support/anarlog/sessions/{uuid}/` see
29
- [references/sessions.md](references/sessions.md) for the file shape and skip
30
- rules.
31
- - `~/.cache/fit/outpost/state/graph_processed` processed-file index (TSV,
32
- shared with `extract-entities`).
34
+ - Meetings, read through `anarlog-cli` (`meetings list` / `get` /
35
+ `transcript`) — see [references/sessions.md](references/sessions.md) for the
36
+ CLI contract, content shapes, and skip rules. Older installs without the CLI
37
+ fall back to flat files under
38
+ `~/Library/Application Support/anarlog/sessions/{uuid}/`.
39
+ - `~/.cache/fit/outpost/state/graph_processed` — processed index (TSV, shared
40
+ with `extract-entities`). New meetings key as `anarlog://{id}`. Legacy
41
+ flat-file sessions keep their file-path keys and are never reprocessed.
33
42
  - `~/.cache/fit/outpost/state/identity.md` — user identity for self-exclusion
34
43
  (the `person-identify` skill writes it).
35
44
 
36
45
  ## Outputs
37
46
 
38
- - `Knowledge/People/`, `Knowledge/Organizations/`, `Knowledge/Projects/`,
39
- `Knowledge/Topics/` — created or updated.
40
- - `Knowledge/Priorities/` — **updated only**, never
41
- auto-created.
47
+ - `3-Team/People/`, `3-Team/Organizations/`, `3-Team/Projects/`,
48
+ `3-Team/Topics/` — created or updated.
49
+ - `3-Team/Priorities/` — **updated only**, never auto-created.
50
+ - `2-Confidential/Candidates/{Name}/transcript-{date}.md` — created for
51
+ interview sessions (verbatim transcript; the input `req-assess` waits on).
42
52
  - `~/.cache/fit/outpost/state/graph_processed` — updated.
43
53
 
44
54
  <do_confirm_checklist goal="Verify each session was processed correctly">
45
55
 
46
56
  - [ ] Skip the empty, test, and onboarding sessions (per the skip rules).
47
- - [ ] Read both `_memo.md` and `_summary.md` (when present). Consult the
57
+ - [ ] Read both the note and the summary (when present). Consult the
48
58
  transcript only for disambiguation.
49
59
  - [ ] Apply the "Would I prep?" test to each person. Exclude the user.
50
- - [ ] Write interview sessions to `Knowledge/Candidates/`. Never write them
51
- to `Knowledge/People/`.
52
- - [ ] Use an absolute path in every link (`[[Folder/Name]]`).
60
+ - [ ] Write interview sessions to `2-Confidential/Candidates/`. Never write them
61
+ to `3-Team/People/`.
62
+ - [ ] Write a verbatim `transcript-{date}.md` for each interview session
63
+ (skip when that date's file already exists).
64
+ - [ ] Use tier-prefixed absolute links (`[[3-Team/People/Name]]`).
53
65
  - [ ] Describe the relationship in each activity entry. Leave out the
54
66
  communication method.
55
67
  - [ ] Auto-create no new `Priorities/` note (the user sets these). Update the
56
68
  progress on every priority the content references.
57
- - [ ] Update `graph_processed` for every processed file (memo + summary).
69
+ - [ ] Update `graph_processed` for every processed meeting (`scan.mjs mark`).
58
70
 
59
71
  </do_confirm_checklist>
60
72
 
@@ -64,41 +76,64 @@ summaries. This skill reads that output and feeds it into `Knowledge/`.
64
76
 
65
77
  Read the user's identity from `~/.cache/fit/outpost/state/identity.md` (run the
66
78
  `person-identify` skill first if it is missing or stale). Scan unprocessed
67
- sessions:
79
+ meetings:
68
80
 
69
81
  ```bash
70
82
  node .claude/skills/anarlog-process/scripts/scan.mjs
71
83
  ```
72
84
 
73
- Flags: `--changed` (also detect changed memo/summary hashes), `--json`
74
- (programmatic output), `--count` (count only), `--limit N` (default 20).
85
+ The scan reads meetings through `anarlog-cli` (bulk enumerate-and-hash has no
86
+ MCP equivalent), so it finds every meeting even ones not yet exported to
87
+ flat files. Each row prints the meeting `id` for Steps 2 and 6.
88
+
89
+ Flags: `--changed` (re-check changed content), `--json`, `--count`,
90
+ `--limit N` (default 20), `--legacy`; `cli-path` prints the resolved CLI.
75
91
 
76
- Process a session when its `_memo.md` is not in `graph_processed`. Also process
77
- it when the memo hash changed (`--changed`). Also process it when its
78
- `_summary.md` exists and is not in `graph_processed`, or when the summary
79
- changed.
92
+ A meeting needs processing when it has a substantive note or summary and
93
+ `graph_processed` has no `anarlog://{id}` record for it (or, with `--changed`,
94
+ its content hash differs). Already-processed flat-file sessions stay frozen.
95
+ Without `anarlog-cli`, the scan falls back to flat files automatically.
80
96
 
81
- Process all unprocessed sessions in one run. **Don't write bespoke scan
82
- scripts.** This script handles the edge cases (empty memos, missing summaries,
83
- metadata fallback).
97
+ Process all unprocessed meetings in one run. **Don't write bespoke scan
98
+ scripts or query the database directly.**
84
99
 
85
100
  ### 1. Build the knowledge index
86
101
 
87
102
  ```bash
88
- ls Knowledge/People/ Knowledge/Organizations/ Knowledge/Projects/ \
89
- Knowledge/Topics/ Knowledge/Priorities/ \
90
- Knowledge/Conditions/ 2>/dev/null
103
+ ls 3-Team/People/ 3-Team/Organizations/ 3-Team/Projects/ \
104
+ 3-Team/Topics/ 3-Team/Priorities/ 3-Team/Conditions/ 2>/dev/null
91
105
  ```
92
106
 
93
107
  Read each note's header to build a mental index of known entities (same approach
94
108
  as `extract-entities` Step 0).
95
109
 
96
- ### 2. Read each session
110
+ ### 2. Read each meeting
111
+
112
+ For each unprocessed meeting, prefer the MCP tool:
113
+ `get_meeting({ meeting_id: id })`. Fall back to the CLI (already resolved by
114
+ `scan.mjs`) when the MCP server is not connected:
115
+
116
+ ```bash
117
+ CLI="$(node .claude/skills/anarlog-process/scripts/scan.mjs cli-path)"
118
+ "$CLI" --json meetings get {id}
119
+ ```
120
+
121
+ This returns `note.markdown` (the user's own notes — high signal),
122
+ `summaries[].markdown` (the AI summary — usually the richest source),
123
+ `participants`, and `action_items`. Read the note and the summary. Pull the
124
+ transcript only when disambiguation requires it — MCP
125
+ `get_meeting_transcript({ meeting_id: id, offset: 0, limit: 200 })`, or CLI
126
+ `"$CLI" --json meetings transcript {id} --limit 200 --offset 0`.
127
+
128
+ **Exception — interview sessions:** once Step 3 classifies a meeting as an
129
+ interview, fetch the transcript **in full**: page with `offset`/`next_offset`
130
+ until a short page and concatenate `data.text`. This is persistence, not
131
+ extraction — Step 4 stays note/summary-only; Step 5 writes it verbatim.
97
132
 
98
- For each unprocessed session, read in this order: `_meta.json`, `_memo.md`,
99
- `_summary.md` (if present), `transcript.json` (only when disambiguation requires
100
- it). See [references/sessions.md](references/sessions.md) for the file shapes
101
- and the skip rules.
133
+ MCP/CLI contract, content shapes, and skip rules:
134
+ [references/sessions.md](references/sessions.md). In `--legacy` mode, read the
135
+ `memoPath` / `summaryPath` files the scan reported instead (legacy
136
+ `transcript.json` is already complete — no pagination needed).
102
137
 
103
138
  ### 3. Classify the source
104
139
 
@@ -126,28 +161,36 @@ rules, and the linking rules.
126
161
  For **new** entities, use the templates in
127
162
  `.claude/skills/extract-entities/references/TEMPLATES.md`. For interview
128
163
  sessions, use the candidate brief template from `req-track` (under
129
- `Knowledge/Candidates/`).
164
+ `2-Confidential/Candidates/`).
130
165
 
131
166
  For **existing** entities, never rewrite the file. Apply targeted edits:
132
167
 
133
168
  - Add the new activity entry at the **top** of `## Activity`.
134
- - Update `Last seen` / `Last activity`.
169
+ - Update `Last seen` / `Last activity`, and stamp frontmatter `updated` in
170
+ the same edit.
135
171
  - Add new key facts (skip duplicates).
136
172
  - Update open items (mark completed, add new).
137
173
  - Apply state changes.
138
174
 
175
+ For interview sessions, also write the full transcript from Step 2 to
176
+ `2-Confidential/Candidates/{Name}/transcript-{date}.md`: verbatim, no
177
+ frontmatter, speaker turns labeled by channel (`0` = user, `1` = other —
178
+ cross-check against `participants` when ambiguous). `{date}` is the meeting's
179
+ `started_at` (fall back to `created_at`), `YYYY-MM-DD`. Skip the write when that
180
+ date's file already exists. The file is pure persistence for `req-assess`; never
181
+ mine it for entities.
182
+
139
183
  Verify bidirectional links per `extract-entities` Step 10 (Project ↔ Priority).
140
184
 
141
185
  ### 6. Update graph state
142
186
 
143
- For each processed session:
187
+ Mark each processed meeting so the scan does not pick it up again. This
188
+ records its `anarlog://{id}` content hash in `graph_processed`:
144
189
 
145
190
  ```bash
146
- node .claude/skills/extract-entities/scripts/state.mjs update \
147
- "$HOME/Library/Application Support/anarlog/sessions/{uuid}/_memo.md"
148
-
149
- node .claude/skills/extract-entities/scripts/state.mjs update \
150
- "$HOME/Library/Application Support/anarlog/sessions/{uuid}/_summary.md"
191
+ node .claude/skills/anarlog-process/scripts/scan.mjs mark {id} [{id}…]
151
192
  ```
152
193
 
153
- (Skip the summary call if `_summary.md` doesn't exist.)
194
+ Pass every meeting you processed in one call. If the scan ran in `--legacy`
195
+ mode, instead mark the flat files it reported:
196
+ `extract-entities/scripts/state.mjs update <memoPath> <summaryPath>`.
@@ -1,16 +1,17 @@
1
1
  # Entity Extraction Signals
2
2
 
3
- Reference for `anarlog-process` Steps 3 and 4. Combine `_memo.md` and
4
- `_summary.md` (prefer the summary when both exist).
3
+ Reference for `anarlog-process` Steps 3 and 4. Combine the meeting's note and
4
+ summary (prefer the summary when both exist).
5
5
 
6
6
  ## People
7
7
 
8
8
  Look for names in:
9
9
 
10
- - Memo text ("chat with Sarah Chen", "interview with David Kim").
10
+ - Note text ("chat with Sarah Chen", "interview with David Kim").
11
11
  - Summary bullets ("the user will serve as the senior engineer", "Alex from the
12
12
  platform team").
13
- - `_meta.json` participants.
13
+ - The meeting's `participants` (from `meetings get`) — a hint only. Confirm
14
+ each person from the note or summary text.
14
15
 
15
16
  For each name, resolve it against the knowledge index (Step 0). Extract the
16
17
  role, the organization, and the relationship to the user. Note what they
@@ -40,10 +41,16 @@ or the `@domain` from `~/.cache/fit/outpost/state/identity.md`.
40
41
 
41
42
  ## Interview sessions (special case)
42
43
 
43
- If the title or the memo says "interview with {Name}", the interviewee is a
44
- **candidate**. Create or update their note in `Knowledge/Candidates/` with the
45
- candidate brief template from `req-track`. **Never** write it in
46
- `Knowledge/People/`.
44
+ If the title or the note says "interview with {Name}", the interviewee is a
45
+ **candidate**. Create or update their note in `2-Confidential/Candidates/` with
46
+ the candidate brief template from `req-track`. **Never** write it in
47
+ `3-Team/People/`.
48
+
49
+ Also write the full transcript to
50
+ `2-Confidential/Candidates/{Name}/transcript-{date}.md` (SKILL.md Steps 2 and
51
+ 5). This is the input `req-assess` waits on to move the candidate to Stage 2. It
52
+ is separate from the extraction above: persist the transcript file verbatim and
53
+ never mine it for entities.
47
54
 
48
55
  ## Content signals
49
56
 
@@ -69,7 +76,7 @@ One line per session per entity:
69
76
 
70
77
  ```markdown
71
78
  - **2026-02-14** (meeting): Discussed hiring pipeline. 11 internal
72
- candidates, plan to shortlist to 6-7. [[People/Sarah Chen]] managing
79
+ candidates, plan to shortlist to 6-7. [[3-Team/People/Sarah Chen]] managing
73
80
  the team.
74
81
  ```
75
82
 
@@ -80,8 +87,9 @@ assessment, strengths and concerns, and any interview scores or decisions.
80
87
 
81
88
  ## Linking rules
82
89
 
83
- Use absolute paths everywhere: `[[People/Name]]`, `[[Organizations/Name]]`,
84
- `[[Projects/Name]]`, `[[Priorities/Priority Name]]`.
90
+ Use absolute paths everywhere: `[[3-Team/People/Name]]`,
91
+ `[[3-Team/Organizations/Name]]`, `[[3-Team/Projects/Name]]`,
92
+ `[[3-Team/Priorities/Priority Name]]`.
85
93
 
86
94
  When meeting content references an existing Priority, follow the linking
87
95
  rules in `extract-entities` Step 7c. Update the progress and add the backlinks.
@@ -1,81 +1,115 @@
1
- # Anarlog Session Files
2
-
3
- Reference for `anarlog-process` Step 1. Each session lives at
4
- `~/Library/Application Support/anarlog/sessions/{uuid}/`.
1
+ # Anarlog Meeting Data
2
+
3
+ Reference for `anarlog-process` Step 2. Anarlog stores meetings in a local
4
+ SQLite database (`~/Library/Application Support/anarlog/app.db`). Read them
5
+ through Anarlog's typed, read-only interfaces — its own `AGENTS.md` is
6
+ explicit:
7
+
8
+ > Use Anarlog's typed, read-only interfaces for meeting data. Do not use `find`,
9
+ > `grep`, `rg`, filesystem crawling, or direct SQLite queries.
10
+
11
+ **Prefer the MCP tools** (`get_meeting`, `get_meeting_transcript`,
12
+ `list_meetings`, `get_recurring_meeting_history`) when the `anarlog` MCP server
13
+ is connected — call them directly, no shell needed. **Fall back to the CLI**
14
+ (`anarlog --json ...`) otherwise; `scan.mjs`'s bulk scan (Step 0) always uses
15
+ the CLI regardless, since enumerating and hashing every meeting has no MCP
16
+ equivalent. Resolve the CLI binary once (`scan.mjs` finds it via `ANARLOG_CLI`,
17
+ the app bundle, or `PATH`):
18
+
19
+ ```bash
20
+ CLI="$(node .claude/skills/anarlog-process/scripts/scan.mjs cli-path)"
21
+ ```
5
22
 
6
- ## `_meta.json`
23
+ Every CLI command takes a global `--json` flag and returns a stable envelope;
24
+ MCP tools return the same `data`/`pagination` shape directly as the tool
25
+ result:
7
26
 
8
27
  ```json
9
- {
10
- "created_at": "2026-02-16T13:01:59.187Z",
11
- "id": "7888363f-4cc6-4987-8470-92f386e5bdfc",
12
- "participants": [],
13
- "title": "Director-Level Hiring Pipeline",
14
- "user_id": "00000000-0000-0000-0000-000000000000"
15
- }
28
+ { "schema_version": "1", "command": "meetings.get", "data": { … },
29
+ "pagination": { "offset": 0, "limit": 20, "returned": 20, "next_offset": 20 } }
16
30
  ```
17
31
 
18
- Use the session date (from `created_at`), the title, and the participants.
19
- Anarlog does not reliably populate the participants, so the list is often empty.
32
+ Read the payload from `.data` (CLI) or the tool result directly (MCP). Never
33
+ guess a meeting ID get it from the scan output or `meetings list` /
34
+ `list_meetings`.
20
35
 
21
- ## `_memo.md`
36
+ ## `list_meetings` / `meetings list`
22
37
 
23
- YAML frontmatter (`id`, `session_id`) plus the user's markdown notes:
38
+ MCP: `list_meetings({ limit, offset, query, series_id })`. CLI:
39
+ `"$CLI" --json meetings list --limit 200 --offset 0` (also `--query`,
40
+ `--series-id`). `data` is an array of meeting summaries:
24
41
 
25
- ```markdown
26
- ---
27
- id: 213e0f78-a66a-468d-b8e5-bc3fbbe04bf4
28
- session_id: 213e0f78-a66a-468d-b8e5-bc3fbbe04bf4
29
- ---
30
-
31
- Chat with Sarah about the product roadmap.
42
+ ```json
43
+ { "id": "a104a542-…", "title": "1-1 with Sarah Chen", "kind": "meeting",
44
+ "status": "active", "created_at": "2026-07-22T08:27:42.499Z",
45
+ "updated_at": "…", "started_at": "", "ended_at": "", "series_id": "" }
32
46
  ```
33
47
 
34
- The memo is high-signal. Every name and every observation is intentional.
48
+ Page with `pagination.next_offset` until a short page. `scan.mjs` does this for
49
+ you via the CLI; call `list`/`list_meetings` directly only for ad-hoc lookups
50
+ (e.g. resolving an ID by title).
35
51
 
36
- ## `_summary.md` (optional)
52
+ ## `get_meeting` / `meetings get <id>` — the main source
37
53
 
38
- YAML frontmatter (`id`, `position`, `session_id`, `title`) plus an AI-generated
39
- summary. The summary is typically the richest source:
54
+ MCP: `get_meeting({ meeting_id: id })`. CLI: `"$CLI" --json meetings get {id}`.
55
+ `data` carries everything you extract from:
40
56
 
41
- ```markdown
42
- ---
43
- id: 152d9bc9-0cdc-4fb2-9916-cb7670f3a6df
44
- position: 1
45
- session_id: 213e0f78-a66a-468d-b8e5-bc3fbbe04bf4
46
- title: Summary
47
- ---
57
+ - **`note`** — the user's own notes (object, or `null`). `note.markdown` is
58
+ high-signal: every name and observation is intentional. May be just a title.
59
+ - **`summaries`** — array of AI-generated summaries; `summaries[].markdown` is
60
+ usually the richest source. Often one entry; can be empty.
61
+ - **`participants`** — array of `{ human_id, display_name, email, role,
62
+ job_title, organization_name }`. Frequently sparse/empty — a hint, not a
63
+ source of truth; still confirm people from the note/summary text.
64
+ - **`action_items`** — array of `{ text, status, assignee_human_id, due_at }`.
65
+ Useful as open items / commitments when populated.
48
66
 
49
- # Product Roadmap Review
67
+ Prefer the summary when both note and summary exist; combine them for full
68
+ coverage.
50
69
 
51
- - Both speakers reviewed the Q2 roadmap priorities...
52
- ```
70
+ ## `get_meeting_transcript` / `meetings transcript <id>` disambiguation only
53
71
 
54
- ## `transcript.json` (disambiguation only)
72
+ MCP: `get_meeting_transcript({ meeting_id: id, offset: 0, limit: 200 })`. CLI:
73
+ `"$CLI" --json meetings transcript {id} --limit 200 --offset 0` (`limit`
74
+ capped at 500 by both):
55
75
 
56
76
  ```json
57
- {
58
- "transcripts": [{
59
- "words": [
60
- {"channel": 0, "text": "Hello", "start_ms": 0, "end_ms": 500},
61
- {"channel": 1, "text": "Hi", "start_ms": 600, "end_ms": 900}
62
- ]
63
- }]
64
- }
77
+ { "meeting_id": "a104a542-…", "text": "Yeah, so the overall …",
78
+ "words": [ { "channel": 0, "text": " Yeah,", "start_ms": 0, "end_ms": 400 } ] }
65
79
  ```
66
80
 
67
- **Do not extract entities from the full transcript.** It is too noisy. Consult
68
- it only for these purposes. Disambiguate a name from the memo or the summary.
69
- Confirm who said what (channel 0 = user, channel 1 = other speaker). Find
70
- context around a specific topic or decision.
71
-
72
- ## Skip rules
81
+ `data.text` is the joined page; `pagination.total` is the word count (page with
82
+ `next_offset`). **Do not extract entities from the full transcript** too
83
+ noisy. Use it only to disambiguate a name, confirm who said what (channel `0` =
84
+ user, channel `1` = other speaker — a heuristic), or find context around a
85
+ decision.
73
86
 
74
- Skip a session when **all** of these are true:
87
+ **Exception interview sessions:** page through the full transcript (not just
88
+ enough to disambiguate) and persist it verbatim to
89
+ `2-Confidential/Candidates/{Name}/transcript-{date}.md`. This doesn't relax the
90
+ no-entity-extraction rule above — the persisted file is a `req-assess` input,
91
+ not a source `anarlog-process` itself mines.
75
92
 
76
- - `_memo.md` body is empty or only `&nbsp;` / whitespace.
77
- - No `_summary.md` exists.
78
- - The title is empty or generic ("Hello", "Welcome to Anarlog", "Test").
93
+ ## Skip rules
79
94
 
80
- Process a session if it has **either** a substantive memo **or** a
81
- `_summary.md`.
95
+ Skip a meeting when it has **neither** a substantive note **nor** any summary
96
+ (empty / onboarding / test sessions — e.g. a note that is only its title, or a
97
+ generic title like "Hello" / "Welcome to Anarlog" with no content). Process a
98
+ meeting if it has **either** a substantive note **or** a summary. `scan.mjs`
99
+ already applies this, so a meeting in the scan output is worth processing.
100
+
101
+ ## Legacy flat files (fallback only)
102
+
103
+ Older Anarlog versions exported each session to
104
+ `~/Library/Application Support/anarlog/sessions/{uuid}/`. `scan.mjs` falls back
105
+ to these only when `anarlog-cli` is unavailable; already-processed flat-file
106
+ sessions are frozen and never reprocessed. Shapes:
107
+
108
+ - **`_meta.json`** — `{ created_at, id, title, participants }` (participants
109
+ often empty). Session date from `created_at`.
110
+ - **`_memo.md`** — YAML frontmatter (`id`, `session_id`) + the user's markdown
111
+ notes. Equivalent to the CLI's `note.markdown`.
112
+ - **`_summary.md`** — YAML frontmatter (`id`, `session_id`, `title`) + an
113
+ AI-generated summary. Equivalent to a `summaries[]` entry.
114
+ - **`transcript.json`** — `{ transcripts: [{ words: [{ channel, text, start_ms,
115
+ end_ms }] }] }`. Same channel convention as above.