@forwardimpact/outpost 3.12.0 → 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 (129) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +6 -5
  4. package/src/agent-path.js +10 -6
  5. package/src/agent-runner.js +28 -24
  6. package/src/index.js +2 -3
  7. package/src/kb-manager.js +75 -20
  8. package/src/kb-validator.js +762 -0
  9. package/src/outpost.js +108 -39
  10. package/src/posture.js +3 -3
  11. package/src/privilege.js +11 -11
  12. package/src/scheduler.js +14 -12
  13. package/src/socket-server.js +19 -18
  14. package/src/spawn-env.js +7 -6
  15. package/src/state-manager.js +2 -2
  16. package/templates/.claude/agents/chief-of-staff.md +32 -24
  17. package/templates/.claude/agents/concierge.md +26 -17
  18. package/templates/.claude/agents/head-hunter.md +34 -26
  19. package/templates/.claude/agents/librarian.md +26 -18
  20. package/templates/.claude/agents/postman.md +26 -18
  21. package/templates/.claude/agents/recruiter.md +38 -27
  22. package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
  23. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  24. package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
  25. package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
  26. package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
  27. package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
  28. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
  29. package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
  30. package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
  31. package/templates/.claude/skills/candidate-report/references/report.css +4 -4
  32. package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
  33. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
  34. package/templates/.claude/skills/changelog/SKILL.md +122 -67
  35. package/templates/.claude/skills/deck-create/SKILL.md +90 -32
  36. package/templates/.claude/skills/deck-create/references/slide.css +4 -4
  37. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
  38. package/templates/.claude/skills/deck-review/SKILL.md +63 -58
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
  44. package/templates/.claude/skills/doc-create/SKILL.md +27 -23
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
  50. package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +37 -13
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
  57. package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
  59. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
  60. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
  61. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
  62. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  63. package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
  64. package/templates/.claude/skills/organize-files/SKILL.md +27 -22
  65. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  66. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  67. package/templates/.claude/skills/person-identify/SKILL.md +77 -27
  68. package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
  69. package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
  70. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
  71. package/templates/.claude/skills/req-assess/SKILL.md +44 -36
  72. package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
  73. package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
  74. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  75. package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
  76. package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
  77. package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
  78. package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
  79. package/templates/.claude/skills/req-decide/SKILL.md +52 -41
  80. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  81. package/templates/.claude/skills/req-decide/references/template.md +2 -2
  82. package/templates/.claude/skills/req-forget/SKILL.md +58 -39
  83. package/templates/.claude/skills/req-forget/references/classify.md +15 -13
  84. package/templates/.claude/skills/req-forget/references/locations.md +27 -22
  85. package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
  86. package/templates/.claude/skills/req-scan/SKILL.md +27 -25
  87. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  88. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  89. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  90. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  91. package/templates/.claude/skills/req-scan/references/template.md +11 -1
  92. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  93. package/templates/.claude/skills/req-screen/SKILL.md +96 -50
  94. package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
  95. package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
  96. package/templates/.claude/skills/req-screen/references/template.md +29 -17
  97. package/templates/.claude/skills/req-track/SKILL.md +76 -76
  98. package/templates/.claude/skills/req-track/references/fields.md +31 -27
  99. package/templates/.claude/skills/req-track/references/overlays.md +42 -0
  100. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  101. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  102. package/templates/.claude/skills/req-track/references/templates.md +28 -27
  103. package/templates/.claude/skills/req-workday/SKILL.md +69 -40
  104. package/templates/.claude/skills/req-workday/references/brief.md +81 -0
  105. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  106. package/templates/.claude/skills/req-workday/references/templates.md +11 -78
  107. package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
  108. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
  109. package/templates/.claude/skills/send-chat/SKILL.md +58 -54
  110. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -19
  111. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  112. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  113. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  114. package/templates/.claude/skills/sync-apple-mail/SKILL.md +20 -14
  115. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  116. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  117. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  118. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  119. package/templates/.claude/skills/sync-teams/SKILL.md +46 -43
  120. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  121. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  122. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  123. package/templates/.claude/skills/upstream-instructions/SKILL.md +43 -41
  124. package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
  125. package/templates/CLAUDE.md +97 -85
  126. package/templates/MIGRATION.md +359 -0
  127. package/templates/registry.yaml +25 -0
  128. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
  129. package/templates/.claude/skills/anarlog-trim/SKILL.md +0 -183
@@ -1,59 +1,72 @@
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, creating or updating 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/` — the
11
- same way `extract-entities` processes emails and calendar events.
13
+ summaries. This skill reads that output and feeds it into the tiers.
14
+ `extract-entities` processes emails and calendar events in the same way.
12
15
 
13
16
  ## Trigger
14
17
 
15
18
  - The user asks to process meeting notes or Anarlog sessions.
16
- - New meetings have been recorded.
19
+ - Anarlog recorded new meetings.
17
20
  - The user asks to update the knowledge base from recent meetings.
18
21
 
19
22
  ## Prerequisites
20
23
 
21
- - Anarlog installed; sessions at
22
- `~/Library/Application Support/anarlog/sessions/`.
23
- - User identity from running the `person-identify` skill, which writes
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.
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
- (written by the `person-identify` skill).
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
- - [ ] Empty / test / onboarding sessions skipped (per skip rules).
47
- - [ ] Both `_memo.md` and `_summary.md` read (when present); transcript
48
- consulted only for disambiguation.
49
- - [ ] "Would I prep?" test applied to each person; self excluded.
50
- - [ ] Interview sessions wrote to `Knowledge/Candidates/`, not
51
- `Knowledge/People/`.
52
- - [ ] All links use absolute paths `[[Folder/Name]]`.
53
- - [ ] Activity entries describe relationship, not communication method.
54
- - [ ] No new `Priorities/` auto-created (user-set only); any
55
- referenced priority had its progress updated.
56
- - [ ] `graph_processed` updated for every processed file (memo + summary).
56
+ - [ ] Skip the empty, test, and onboarding sessions (per the skip rules).
57
+ - [ ] Read both the note and the summary (when present). Consult the
58
+ transcript only for disambiguation.
59
+ - [ ] Apply the "Would I prep?" test to each person. Exclude the user.
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]]`).
65
+ - [ ] Describe the relationship in each activity entry. Leave out the
66
+ communication method.
67
+ - [ ] Auto-create no new `Priorities/` note (the user sets these). Update the
68
+ progress on every priority the content references.
69
+ - [ ] Update `graph_processed` for every processed meeting (`scan.mjs mark`).
57
70
 
58
71
  </do_confirm_checklist>
59
72
 
@@ -63,40 +76,64 @@ same way `extract-entities` processes emails and calendar events.
63
76
 
64
77
  Read the user's identity from `~/.cache/fit/outpost/state/identity.md` (run the
65
78
  `person-identify` skill first if it is missing or stale). Scan unprocessed
66
- sessions:
79
+ meetings:
67
80
 
68
81
  ```bash
69
82
  node .claude/skills/anarlog-process/scripts/scan.mjs
70
83
  ```
71
84
 
72
- Flags: `--changed` (also detect changed memo/summary hashes), `--json`
73
- (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.
74
91
 
75
- A session needs processing when its `_memo.md` is not in `graph_processed`, or
76
- its hash has changed (`--changed`), or its `_summary.md` exists and is not in
77
- `graph_processed` (or has 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.
78
96
 
79
- Process all unprocessed sessions in one run. **Don't write bespoke scan
80
- scripts** this script handles the edge cases (empty memos, missing summaries,
81
- metadata fallback).
97
+ Process all unprocessed meetings in one run. **Don't write bespoke scan
98
+ scripts or query the database directly.**
82
99
 
83
100
  ### 1. Build the knowledge index
84
101
 
85
102
  ```bash
86
- ls Knowledge/People/ Knowledge/Organizations/ Knowledge/Projects/ \
87
- Knowledge/Topics/ Knowledge/Priorities/ \
88
- 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
89
105
  ```
90
106
 
91
107
  Read each note's header to build a mental index of known entities (same approach
92
108
  as `extract-entities` Step 0).
93
109
 
94
- ### 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.
95
132
 
96
- For each unprocessed session, read in this order: `_meta.json`, `_memo.md`,
97
- `_summary.md` (if present), `transcript.json` (only when disambiguation requires
98
- it). File shapes and skip rules:
99
- [references/sessions.md](references/sessions.md).
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).
100
137
 
101
138
  ### 3. Classify the source
102
139
 
@@ -104,47 +141,56 @@ Anarlog sessions are **meetings** and follow the meeting rules from
104
141
  `extract-entities`:
105
142
 
106
143
  - **Can create** People, Organization, Project, and Topic notes.
107
- - **Can update** existing notes including Priorities, which are
108
- user-set and never auto-created.
144
+ - **Can update** existing notes, including Priorities. The user sets a
145
+ Priority. Nothing auto-creates one.
109
146
  - **Can detect** state changes.
110
147
 
111
148
  Apply the "Would I prep for this person?" test from `extract-entities` Step 5
112
- before creating a person note.
149
+ before you create a person note.
113
150
 
114
151
  ### 4. Extract entities and content
115
152
 
116
- Combine memo and summary content (prefer summary when both exist). Extraction
117
- signals entity types, decisions, commitments, key facts, activity-line format,
118
- interview-note rules, and linking rules — live in
119
- [references/extraction.md](references/extraction.md).
153
+ Combine the memo and the summary content (prefer the summary when both exist).
154
+ The extraction signals live in
155
+ [references/extraction.md](references/extraction.md). They cover entity types,
156
+ decisions, commitments, key facts, the activity-line format, the interview-note
157
+ rules, and the linking rules.
120
158
 
121
159
  ### 5. Write updates
122
160
 
123
161
  For **new** entities, use the templates in
124
162
  `.claude/skills/extract-entities/references/TEMPLATES.md`. For interview
125
163
  sessions, use the candidate brief template from `req-track` (under
126
- `Knowledge/Candidates/`).
164
+ `2-Confidential/Candidates/`).
127
165
 
128
- For **existing** entities, apply targeted edits — never rewrite the file:
166
+ For **existing** entities, never rewrite the file. Apply targeted edits:
129
167
 
130
168
  - Add the new activity entry at the **top** of `## Activity`.
131
- - Update `Last seen` / `Last activity`.
169
+ - Update `Last seen` / `Last activity`, and stamp frontmatter `updated` in
170
+ the same edit.
132
171
  - Add new key facts (skip duplicates).
133
172
  - Update open items (mark completed, add new).
134
173
  - Apply state changes.
135
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
+
136
183
  Verify bidirectional links per `extract-entities` Step 10 (Project ↔ Priority).
137
184
 
138
185
  ### 6. Update graph state
139
186
 
140
- 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`:
141
189
 
142
190
  ```bash
143
- node .claude/skills/extract-entities/scripts/state.mjs update \
144
- "$HOME/Library/Application Support/anarlog/sessions/{uuid}/_memo.md"
145
-
146
- node .claude/skills/extract-entities/scripts/state.mjs update \
147
- "$HOME/Library/Application Support/anarlog/sessions/{uuid}/_summary.md"
191
+ node .claude/skills/anarlog-process/scripts/scan.mjs mark {id} [{id}…]
148
192
  ```
149
193
 
150
- (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,46 +1,56 @@
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
- For each: resolve against the knowledge index (Step 0); extract role,
16
- organization, relationship to the user; note what was discussed.
16
+ For each name, resolve it against the knowledge index (Step 0). Extract the
17
+ role, the organization, and the relationship to the user. Note what they
18
+ discussed.
17
19
 
18
20
  ## Organizations
19
21
 
20
- Explicit mentions ("Acme Corp"), or inferred from people's roles or the
21
- surrounding context.
22
+ Look for explicit mentions ("Acme Corp"). Also infer an organization from a
23
+ person's role or from the context.
22
24
 
23
25
  ## Projects
24
26
 
25
- Explicit project names ("Customer Portal", "Q2 Migration") or described
26
- initiatives ("the hiring pipeline", "the product launch").
27
+ Look for explicit project names ("Customer Portal", "Q2 Migration"). Also look
28
+ for initiatives that the text describes ("the hiring pipeline", "the product
29
+ launch").
27
30
 
28
31
  ## Topics
29
32
 
30
- Recurring themes ("AI coding agents", "interview process", "architecture
31
- decisions"). Only create a Topic note when the subject spans multiple meetings
32
- or is strategically important.
33
+ Look for themes that repeat ("AI coding agents", "interview process",
34
+ "architecture decisions"). Only create a Topic note when the subject spans
35
+ multiple meetings or is strategically important.
33
36
 
34
37
  ## Self-exclusion
35
38
 
36
- Never create or update a note for the user match against name, email, or
37
- `@domain` from `~/.cache/fit/outpost/state/identity.md`.
39
+ Never create or update a note for the user. Match against the name, the email,
40
+ or the `@domain` from `~/.cache/fit/outpost/state/identity.md`.
38
41
 
39
42
  ## Interview sessions (special case)
40
43
 
41
- If the title or memo indicates "interview with {Name}", the interviewee is a
42
- **candidate** create or update their note in `Knowledge/Candidates/` (using
43
- the candidate brief template from `req-track`), **not** in `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.
44
54
 
45
55
  ## Content signals
46
56
 
@@ -51,13 +61,14 @@ the candidate brief template from `req-track`), **not** in `Knowledge/People/`.
51
61
  ### Commitments / action items
52
62
 
53
63
  "will share", "plans to", "needs to", "to be created", "will upload". Extract
54
- owner, action, deadline (if any), status (default `open`).
64
+ the owner, the action, the deadline (if any), and the status (default `open`).
55
65
 
56
66
  ### Key facts
57
67
 
58
- Specific numbers (headcount, budget, timeline), preferences ("non-traditional
59
- backgrounds"), process details (interview stages, evaluation criteria),
60
- strategic context (market trends, competitive landscape). Skip filler.
68
+ Look for specific numbers (headcount, budget, timeline) and preferences
69
+ ("non-traditional backgrounds"). Look for process details (interview stages,
70
+ evaluation criteria) and strategic context (market trends, competitive
71
+ landscape). Skip filler.
61
72
 
62
73
  ### Activity summary
63
74
 
@@ -65,20 +76,21 @@ One line per session per entity:
65
76
 
66
77
  ```markdown
67
78
  - **2026-02-14** (meeting): Discussed hiring pipeline. 11 internal
68
- 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
69
80
  the team.
70
81
  ```
71
82
 
72
83
  ### Interview notes (for candidates)
73
84
 
74
- Add to the candidate's `## Notes` section: impressions, technical assessment,
75
- strengths and concerns, any interview scoring or decisions.
85
+ Add these to the candidate's `## Notes` section: impressions, the technical
86
+ assessment, strengths and concerns, and any interview scores or decisions.
76
87
 
77
88
  ## Linking rules
78
89
 
79
- Use absolute paths everywhere: `[[People/Name]]`, `[[Organizations/Name]]`,
80
- `[[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]]`.
81
93
 
82
94
  When meeting content references an existing Priority, follow the linking
83
- rules in `extract-entities` Step 7c update progress and add backlinks, but
84
- **never** auto-create Priority notes.
95
+ rules in `extract-entities` Step 7c. Update the progress and add the backlinks.
96
+ **Never** auto-create Priority notes.
@@ -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: session date (from `created_at`), title, participants (often empty —
19
- Anarlog doesn't reliably populate this).
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
- High-signal every name and 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 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** too noisy. Consult it
68
- only to disambiguate a name from the memo or summary, confirm who said what
69
- (channel 0 = user, channel 1 = other speaker), or find context around a specific
70
- 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
- A session is skipped when **all** of:
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
- - 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.