@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.
- package/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +6 -5
- package/src/agent-path.js +10 -6
- package/src/agent-runner.js +28 -24
- package/src/index.js +2 -3
- package/src/kb-manager.js +75 -20
- package/src/kb-validator.js +762 -0
- package/src/outpost.js +108 -39
- package/src/posture.js +3 -3
- package/src/privilege.js +11 -11
- package/src/scheduler.js +14 -12
- package/src/socket-server.js +19 -18
- package/src/spawn-env.js +7 -6
- package/src/state-manager.js +2 -2
- package/templates/.claude/agents/chief-of-staff.md +32 -24
- package/templates/.claude/agents/concierge.md +26 -17
- package/templates/.claude/agents/head-hunter.md +34 -26
- package/templates/.claude/agents/librarian.md +26 -18
- package/templates/.claude/agents/postman.md +26 -18
- package/templates/.claude/agents/recruiter.md +38 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
- package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
- package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
- package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
- package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
- package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
- package/templates/.claude/skills/candidate-report/references/report.css +4 -4
- package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
- package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
- package/templates/.claude/skills/changelog/SKILL.md +122 -67
- package/templates/.claude/skills/deck-create/SKILL.md +90 -32
- package/templates/.claude/skills/deck-create/references/slide.css +4 -4
- package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/deck-review/SKILL.md +63 -58
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
- package/templates/.claude/skills/doc-create/SKILL.md +27 -23
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
- package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +37 -13
- package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
- package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
- package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
- package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
- package/templates/.claude/skills/organize-files/SKILL.md +27 -22
- package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
- package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
- package/templates/.claude/skills/person-identify/SKILL.md +77 -27
- package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
- package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
- package/templates/.claude/skills/req-assess/SKILL.md +44 -36
- package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
- package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
- package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
- package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
- package/templates/.claude/skills/req-decide/SKILL.md +52 -41
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-decide/references/template.md +2 -2
- package/templates/.claude/skills/req-forget/SKILL.md +58 -39
- package/templates/.claude/skills/req-forget/references/classify.md +15 -13
- package/templates/.claude/skills/req-forget/references/locations.md +27 -22
- package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
- package/templates/.claude/skills/req-scan/SKILL.md +27 -25
- package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
- package/templates/.claude/skills/req-scan/references/filters.md +13 -13
- package/templates/.claude/skills/req-scan/references/sources.md +7 -7
- package/templates/.claude/skills/req-scan/references/state.md +1 -1
- package/templates/.claude/skills/req-scan/references/template.md +11 -1
- package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +96 -50
- package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
- package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
- package/templates/.claude/skills/req-screen/references/template.md +29 -17
- package/templates/.claude/skills/req-track/SKILL.md +76 -76
- package/templates/.claude/skills/req-track/references/fields.md +31 -27
- package/templates/.claude/skills/req-track/references/overlays.md +42 -0
- package/templates/.claude/skills/req-track/references/signals.md +12 -12
- package/templates/.claude/skills/req-track/references/statuses.md +3 -2
- package/templates/.claude/skills/req-track/references/templates.md +28 -27
- package/templates/.claude/skills/req-workday/SKILL.md +69 -40
- package/templates/.claude/skills/req-workday/references/brief.md +81 -0
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +11 -78
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
- package/templates/.claude/skills/send-chat/SKILL.md +58 -54
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -19
- package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
- package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
- package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +20 -14
- package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
- package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
- package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
- package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
- package/templates/.claude/skills/sync-teams/SKILL.md +46 -43
- package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
- package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
- package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
- package/templates/.claude/skills/upstream-instructions/SKILL.md +43 -41
- package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
- package/templates/CLAUDE.md +97 -85
- package/templates/MIGRATION.md +359 -0
- package/templates/registry.yaml +25 -0
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
- 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
|
|
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
|
|
11
|
-
|
|
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
|
-
-
|
|
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
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
-
|
|
29
|
-
[references/sessions.md](references/sessions.md) for the
|
|
30
|
-
rules.
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
- `
|
|
39
|
-
`
|
|
40
|
-
- `
|
|
41
|
-
|
|
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
|
-
- [ ]
|
|
47
|
-
- [ ]
|
|
48
|
-
|
|
49
|
-
- [ ] "Would I prep?" test
|
|
50
|
-
- [ ]
|
|
51
|
-
`
|
|
52
|
-
- [ ]
|
|
53
|
-
|
|
54
|
-
- [ ]
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
79
|
+
meetings:
|
|
67
80
|
|
|
68
81
|
```bash
|
|
69
82
|
node .claude/skills/anarlog-process/scripts/scan.mjs
|
|
70
83
|
```
|
|
71
84
|
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
76
|
-
|
|
77
|
-
|
|
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
|
|
80
|
-
scripts
|
|
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
|
|
87
|
-
|
|
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
|
|
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
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
108
|
-
|
|
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
|
|
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).
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
`
|
|
164
|
+
`2-Confidential/Candidates/`).
|
|
127
165
|
|
|
128
|
-
For **existing** entities,
|
|
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
|
-
|
|
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/
|
|
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
|
-
|
|
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
|
|
4
|
-
|
|
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
|
-
-
|
|
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
|
-
- `
|
|
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
|
|
16
|
-
organization, relationship to the user
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
initiatives ("the hiring pipeline", "the product
|
|
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
|
-
|
|
31
|
-
decisions"). Only create a Topic note when the subject spans
|
|
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
|
|
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
|
|
42
|
-
**candidate
|
|
43
|
-
the candidate brief template from `req-track
|
|
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
|
-
|
|
59
|
-
backgrounds")
|
|
60
|
-
strategic context (market trends, competitive
|
|
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
|
|
75
|
-
strengths and concerns, any interview
|
|
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]]`,
|
|
80
|
-
`[[
|
|
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
|
|
84
|
-
**
|
|
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
|
|
2
|
-
|
|
3
|
-
Reference for `anarlog-process` Step
|
|
4
|
-
`~/Library/Application Support/anarlog/
|
|
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
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
## `
|
|
36
|
+
## `list_meetings` / `meetings list`
|
|
22
37
|
|
|
23
|
-
|
|
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
|
-
```
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
## `
|
|
52
|
+
## `get_meeting` / `meetings get <id>` — the main source
|
|
37
53
|
|
|
38
|
-
|
|
39
|
-
|
|
54
|
+
MCP: `get_meeting({ meeting_id: id })`. CLI: `"$CLI" --json meetings get {id}`.
|
|
55
|
+
`data` carries everything you extract from:
|
|
40
56
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
67
|
+
Prefer the summary when both note and summary exist; combine them for full
|
|
68
|
+
coverage.
|
|
50
69
|
|
|
51
|
-
|
|
52
|
-
```
|
|
70
|
+
## `get_meeting_transcript` / `meetings transcript <id>` — disambiguation only
|
|
53
71
|
|
|
54
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
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
|
-
|
|
77
|
-
- No `_summary.md` exists.
|
|
78
|
-
- Title is empty or generic ("Hello", "Welcome to Anarlog", "Test").
|
|
93
|
+
## Skip rules
|
|
79
94
|
|
|
80
|
-
|
|
81
|
-
|
|
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.
|