@forwardimpact/outpost 3.11.0 → 3.12.1

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 (114) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +4 -4
  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 +21 -19
  8. package/src/outpost.js +37 -33
  9. package/src/posture.js +3 -3
  10. package/src/privilege.js +11 -11
  11. package/src/scheduler.js +14 -12
  12. package/src/socket-server.js +19 -18
  13. package/src/spawn-env.js +7 -6
  14. package/src/state-manager.js +2 -2
  15. package/templates/.claude/agents/chief-of-staff.md +22 -22
  16. package/templates/.claude/agents/concierge.md +19 -17
  17. package/templates/.claude/agents/head-hunter.md +27 -26
  18. package/templates/.claude/agents/librarian.md +17 -16
  19. package/templates/.claude/agents/postman.md +19 -18
  20. package/templates/.claude/agents/recruiter.md +31 -27
  21. package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
  22. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  23. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
  24. package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
  25. package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
  26. package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
  27. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
  28. package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
  29. package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
  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 +55 -50
  35. package/templates/.claude/skills/deck-create/SKILL.md +30 -30
  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 +59 -57
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
  44. package/templates/.claude/skills/doc-create/SKILL.md +21 -20
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
  50. package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +5 -5
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
  57. package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
  59. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
  60. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  61. package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
  62. package/templates/.claude/skills/organize-files/SKILL.md +24 -22
  63. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  64. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  65. package/templates/.claude/skills/person-identify/SKILL.md +24 -22
  66. package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
  67. package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
  68. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
  69. package/templates/.claude/skills/req-assess/SKILL.md +27 -27
  70. package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
  71. package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
  72. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  73. package/templates/.claude/skills/req-decide/SKILL.md +28 -25
  74. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  75. package/templates/.claude/skills/req-forget/SKILL.md +28 -26
  76. package/templates/.claude/skills/req-forget/references/classify.md +13 -13
  77. package/templates/.claude/skills/req-forget/references/locations.md +2 -2
  78. package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
  79. package/templates/.claude/skills/req-scan/SKILL.md +21 -22
  80. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  81. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  82. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  83. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  85. package/templates/.claude/skills/req-screen/SKILL.md +31 -29
  86. package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
  87. package/templates/.claude/skills/req-screen/references/template.md +4 -4
  88. package/templates/.claude/skills/req-track/SKILL.md +40 -40
  89. package/templates/.claude/skills/req-track/references/fields.md +19 -18
  90. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  91. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  92. package/templates/.claude/skills/req-track/references/templates.md +4 -4
  93. package/templates/.claude/skills/req-workday/SKILL.md +24 -24
  94. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  95. package/templates/.claude/skills/req-workday/references/templates.md +13 -13
  96. package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
  97. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
  98. package/templates/.claude/skills/send-chat/SKILL.md +47 -43
  99. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
  100. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  101. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  103. package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
  104. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  105. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  106. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  108. package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
  109. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  110. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  111. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  112. package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
  113. package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
  114. package/templates/CLAUDE.md +40 -37
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: anarlog-follow
3
3
  description: >
4
- Follow a live Anarlog session in real-time, coaching the user through a
4
+ Follow a live Anarlog session in real-time and coach the user through a
5
5
  meeting or interview. Understands context from the session title, knowledge
6
6
  base, and candidate pipeline. Provides talking points, flags gaps in
7
7
  coverage, and suggests follow-up questions as the conversation unfolds.
@@ -10,48 +10,49 @@ description: >
10
10
 
11
11
  # Anarlog Follow
12
12
 
13
- Follow a live Anarlog recording, read the transcript as it grows, and coach the
14
- user through the meeting in real time. Gather knowledge-base context once before
15
- the session, then poll the transcript and provide actionable nudges as new
16
- content appears.
13
+ Follow a live Anarlog recording. Read the transcript as it grows. Coach the user
14
+ through the meeting in real time. Gather knowledge-base context once before the
15
+ session. Then poll the transcript. Provide actionable nudges as new content
16
+ appears.
17
17
 
18
18
  ## Trigger
19
19
 
20
20
  - The user asks to follow, shadow, or coach them through a live meeting.
21
21
  - "Follow my meeting", "coach me", "shadow this call".
22
- - The user starts a Anarlog recording and wants real-time support.
22
+ - The user starts an Anarlog recording and wants real-time support.
23
23
 
24
24
  ## Prerequisites
25
25
 
26
- - Anarlog installed; sessions at
26
+ - Anarlog installed. Sessions live at
27
27
  `~/Library/Application Support/anarlog/sessions/`.
28
28
  - An active or about-to-start session.
29
- - Knowledge base populated (attendee / candidate context).
29
+ - A populated knowledge base (attendee / candidate context).
30
30
 
31
31
  ## Inputs
32
32
 
33
- - Live `transcript.json` (growing during the session).
33
+ - Live `transcript.json` (it grows during the session).
34
34
  - `Knowledge/People/`, `Knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
35
35
  `Knowledge/Roles/`, `Knowledge/Organizations/`, `Knowledge/Projects/`.
36
36
  - `~/.cache/fit/outpost/apple_calendar/*.json` for context.
37
37
 
38
38
  ## Outputs
39
39
 
40
- - Real-time coaching messages printed to the user.
41
- - **No files are written.** This skill is purely advisory.
40
+ - This skill prints real-time coaching messages to the user.
41
+ - **This skill writes no files.** It only advises.
42
42
 
43
43
  <do_confirm_checklist goal="Verify the follow session was useful and read-only">
44
44
 
45
- - [ ] Active session detected and confirmed with the user.
46
- - [ ] Meeting type classified from the title.
47
- - [ ] Knowledge-base context gathered for all attendees.
48
- - [ ] For interviews: standard expectations and screening focus areas loaded.
49
- - [ ] Coaching nudges were actionable and concise (1–3 lines each).
50
- - [ ] Coverage gaps tracked and surfaced before the meeting ended.
51
- - [ ] End-of-meeting detected; debrief provided.
52
- - [ ] Next steps offered (`req-assess` / `anarlog-process`); user decided
53
- whether to run them.
54
- - [ ] No files were modified during the session.
45
+ - [ ] Detect the active session and confirm it with the user.
46
+ - [ ] Classify the meeting type from the title.
47
+ - [ ] Gather knowledge-base context for all attendees.
48
+ - [ ] For interviews, load the standard expectations and the focus areas from
49
+ screening.
50
+ - [ ] Keep each coaching nudge actionable and concise (1–3 lines).
51
+ - [ ] Track the coverage gaps. Surface them before the meeting ends.
52
+ - [ ] Detect the end of the meeting. Debrief the user.
53
+ - [ ] Offer the next steps (`req-assess` / `anarlog-process`). Let the user
54
+ decide whether to run them.
55
+ - [ ] Modify no file during the session.
55
56
 
56
57
  </do_confirm_checklist>
57
58
 
@@ -65,10 +66,10 @@ content appears.
65
66
  node .claude/skills/anarlog-follow/scripts/follow.mjs --detect
66
67
  ```
67
68
 
68
- Returns the most recently modified session, whether it's live, and its title. If
69
- nothing has been modified in the last 5 minutes, warn the user and ask whether
70
- to follow a specific session. If multiple sessions could be active, confirm with
71
- the user.
69
+ The script returns the most recently modified session, whether it is live, and
70
+ its title. If nothing changed in the last 5 minutes, warn the user. Ask whether
71
+ to follow a specific session. If more than one session could be active, confirm
72
+ with the user.
72
73
 
73
74
  #### 2. Read session metadata
74
75
 
@@ -80,29 +81,29 @@ Capture **title**, **created_at**, **participants**.
80
81
 
81
82
  #### 3. Classify the meeting type
82
83
 
83
- Title pattern type → coaching focus:
84
- [references/meeting-types.md](references/meeting-types.md). The type drives
85
- Phase 2 context loading and Phase 3 dimensions.
84
+ [references/meeting-types.md](references/meeting-types.md) maps the title
85
+ pattern → type → coaching focus. The type drives the context you load in
86
+ Phase 2 and the dimensions you track in Phase 3.
86
87
 
87
88
  ### Phase 2 — Gather context (once)
88
89
 
89
90
  #### 4. Resolve attendees
90
91
 
91
- Extract names from title and participant list. For each:
92
+ Extract the names from the title and the participant list. For each name:
92
93
 
93
94
  ```bash
94
95
  rg -l "{name}" Knowledge/People/
95
96
  rg -l "{name}" Knowledge/Candidates/
96
97
  ```
97
98
 
98
- Read matching notes for role, organization, history, open items, prior
99
+ Read each note you find for role, organization, history, open items, and prior
99
100
  interactions.
100
101
 
101
102
  #### 5. Load type-specific context
102
103
 
103
- **Interviews:** read `Knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
104
- look up the `Req` field's matching `Knowledge/Roles/*.md` file (check the
105
- `**Status:**` field for context), and load standard expectations:
104
+ **Interviews:** read `Knowledge/Candidates/{Name}/{brief,screening,panel}.md`.
105
+ Look up the `Req` field's matching `Knowledge/Roles/*.md` file. Check its
106
+ `**Status:**` field for context. Then load the standard expectations:
106
107
 
107
108
  ```bash
108
109
  bunx fit-pathway job {discipline} {level} --track={track}
@@ -113,9 +114,9 @@ Project/Organization notes. Check open tasks: `rg "{name}" Knowledge/Tasks/`.
113
114
 
114
115
  #### 6. Build the coaching brief
115
116
 
116
- Synthesize gathered context into the pre-meeting brief format in
117
- [references/coaching.md](references/coaching.md#pre-meeting-brief-format) and
118
- print it to the user.
117
+ Synthesize the gathered context into the pre-meeting brief format in
118
+ [references/coaching.md](references/coaching.md#pre-meeting-brief-format). Print
119
+ it to the user.
119
120
 
120
121
  ### Phase 3 — Follow loop
121
122
 
@@ -133,40 +134,40 @@ Subsequent reads (pass the last word ID):
133
134
  node .claude/skills/anarlog-follow/scripts/follow.mjs <session-id> --after <last-word-id>
134
135
  ```
135
136
 
136
- Returns JSON with grouped text segments, channel labels, and the next last-word
137
- ID.
137
+ The script returns JSON with grouped text segments, channel labels, and the next
138
+ last-word ID.
138
139
 
139
140
  #### 8. Analyze new content
140
141
 
141
- Track the dimensions in
142
- [references/coaching.md](references/coaching.md#dimensions-to-track) interview
143
- vs. general — and apply the [principles](references/coaching.md#principles) and
142
+ Track the interview dimensions or the general dimensions in
143
+ [references/coaching.md](references/coaching.md#dimensions-to-track). Apply the
144
+ [principles](references/coaching.md#principles) and the
144
145
  [constraints](references/coaching.md#constraints).
145
146
 
146
147
  #### 9. Provide coaching
147
148
 
148
- Output only when actionable. Use the
149
+ Output only when the nudge is actionable. Use the
149
150
  [coaching output formats](references/coaching.md#coaching-output-formats). Keep
150
151
  each nudge 1–3 lines.
151
152
 
152
153
  #### 10. Detect meeting end
153
154
 
154
- Watch for: farewells ("bye", "take care", "have a good day"), wrap-up phrases
155
- ("that's all", "let's wrap", "I'll let you go"), or final thank-yous with no
156
- substantive follow-up. When detected, move to Phase 4.
155
+ Watch for farewells ("bye", "take care", "have a good day"). Watch for wrap-up
156
+ phrases ("that's all", "let's wrap", "I'll let you go"). Watch for final
157
+ thank-yous with no substantive follow-up. When you detect one, move to Phase 4.
157
158
 
158
159
  #### 11. Loop cadence
159
160
 
160
161
  **Do not use `sleep` or timed loops.** After each coaching output, read the next
161
- batch immediately natural cadence emerges from read/analyze/output. On two
162
- consecutive empty reads, ask the user whether the meeting has ended.
162
+ batch immediately. A natural cadence emerges from read/analyze/output. After two
163
+ consecutive empty reads, ask the user whether the meeting ended.
163
164
 
164
165
  ### Phase 4 — Wrap-up
165
166
 
166
167
  #### 12–13. Debrief
167
168
 
168
- Use the appropriate template in [references/debrief.md](references/debrief.md)
169
- interview vs. general.
169
+ Pick the interview template or the general template in
170
+ [references/debrief.md](references/debrief.md).
170
171
 
171
172
  #### 14. Offer next steps
172
173
 
@@ -45,19 +45,19 @@ Suggested topics:
45
45
 
46
46
  | Dimension | What to watch for |
47
47
  | ----------------------- | ---------------------------------------------------------------------------------- |
48
- | **Skills demonstrated** | Candidate shows (not just claims) standard skills |
48
+ | **Skills demonstrated** | Candidate shows standard skills. A claim alone does not count. |
49
49
  | **Behaviour signals** | Own the Outcome, Think in Systems, Communicate with Precision, Polymath, Curiosity |
50
50
  | **Level signals** | Autonomy, scope, complexity handling, mentoring |
51
- | **Coverage gaps** | Focus areas from screening that haven't been touched yet |
51
+ | **Coverage gaps** | Focus areas from screening that you did not touch yet |
52
52
  | **Red flags** | Contradictions with CV, vague answers, deflection |
53
- | **Time awareness** | Are you running out of time with uncovered areas? |
53
+ | **Time awareness** | Time runs out while areas stay uncovered |
54
54
 
55
55
  ### General meetings
56
56
 
57
57
  | Dimension | What to watch for |
58
58
  | --------------------- | ---------------------------------------------------- |
59
- | **Open items** | Were pending items raised and addressed? |
60
- | **Decisions** | What was decided? Who owns next steps? |
59
+ | **Open items** | Someone raised and addressed the pending items |
60
+ | **Decisions** | The decisions made, and who owns the next steps |
61
61
  | **New commitments** | Track who committed to what |
62
62
  | **Unasked questions** | Topics the user should raise before the meeting ends |
63
63
  | **Tone/dynamics** | Shifts in energy, resistance, enthusiasm |
@@ -81,30 +81,31 @@ Capture: decision made on {topic} — {who} will {what}
81
81
 
82
82
  - **Standard-grounded.** Every nudge ties to standard skills/behaviours. Don't
83
83
  coach on vibes.
84
- - **Evidence over claims.** Flag _claims_ vs. _demonstrations_; push for
84
+ - **Evidence over claims.** Flag _claims_ vs. _demonstrations_. Push for
85
85
  specific examples.
86
- - **Coverage-aware.** Track which screening focus areas have been explored and
87
- nudge before time runs out.
88
- - **Level-calibrated.** Know what the target level expects; flag
86
+ - **Coverage-aware.** Track which screening focus areas you explored. Nudge
87
+ before time runs out.
88
+ - **Level-calibrated.** Know what the target level expects. Flag
89
89
  below-/above-level answers.
90
- - **Don't lead.** Suggest open-ended probes, never loaded or leading questions.
90
+ - **Don't lead.** Suggest open-ended probes. Never suggest a loaded or leading
91
+ question.
91
92
 
92
93
  ### General meetings
93
94
 
94
95
  - **Agenda-aware.** Track coverage of known topics or open items.
95
96
  - **Decision-focused.** Flag decisions and capture owners.
96
- - **Commitment-tracking.** Note who said they'd do what; surface unresolved
97
- commitments from prior meetings.
98
- - **Time-conscious.** Nudge when the meeting is running long and key topics
99
- aren't raised.
97
+ - **Commitment-tracking.** Note who said they would do what. Surface unresolved
98
+ commitments from earlier meetings.
99
+ - **Time-conscious.** Nudge when the meeting runs long and nobody raises the key
100
+ topics.
100
101
 
101
102
  ### Universal
102
103
 
103
- - **Be quiet when things are going well.** Speak only when actionable.
104
- - **Channel awareness.** Channel 0 = user; channel 1+ = guest(s). Reference what
105
- the _guest_ said the user already knows what they said.
104
+ - **Be quiet when things go well.** Speak only when actionable.
105
+ - **Channel awareness.** Channel 0 = user. Channel 1+ = guest(s). Reference what
106
+ the _guest_ said. The user already knows what they said.
106
107
  - **Never interrupt flow.** Hold nudges for the next natural pause.
107
- - **Respect the user.** Coach at the margin, don't patronise.
108
+ - **Respect the user.** Coach at the margin. Do not patronise.
108
109
 
109
110
  ## Constraints
110
111
 
@@ -113,6 +114,6 @@ Capture: decision made on {topic} — {who} will {what}
113
114
  `req-assess`, or `anarlog-process`. Offer them after.
114
115
  - **Channel 0 = user.** Always.
115
116
  - **Transcription noise.** Live transcripts are messy. Don't coach from a single
116
- ambiguous word wait for context.
117
- - **Privacy.** Coaching may appear on a shared screen keep nudges generic
118
- enough that they don't reveal confidential assessment detail.
117
+ ambiguous word. Wait for context.
118
+ - **Privacy.** Coaching may appear on a shared screen. Keep nudges generic. They
119
+ must not reveal confidential assessment detail.
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * follow.mjs — Read a live Anarlog transcript and output new content since
5
- * the last read. Designed to be called repeatedly during a live session.
5
+ * the last read. Call it repeatedly during a live session.
6
6
  *
7
7
  * Usage:
8
8
  * node follow.mjs <session-id> # First read — outputs everything
@@ -75,7 +75,7 @@ function detectActiveSession() {
75
75
  best = entry;
76
76
  }
77
77
  } catch {
78
- // No transcript — skip
78
+ // Skip when no transcript exists
79
79
  }
80
80
  }
81
81
 
@@ -84,7 +84,7 @@ function detectActiveSession() {
84
84
  process.exit(1);
85
85
  }
86
86
 
87
- // Check if the transcript was modified recently (within last 5 minutes)
87
+ // Check whether the transcript changed in the last 5 minutes
88
88
  const ageMs = Date.now() - bestMtime;
89
89
  const isLive = ageMs < 5 * 60 * 1000;
90
90
 
@@ -188,7 +188,7 @@ function buildChannelStats(allWords) {
188
188
  function filterNewWords(allWords, afterId) {
189
189
  if (!afterId) return allWords;
190
190
  const idx = allWords.findIndex((w) => w.id === afterId);
191
- // If word ID not found, return everything (safety fallback)
191
+ // Return everything when the word ID is missing (safety fallback)
192
192
  return idx >= 0 ? allWords.slice(idx + 1) : allWords;
193
193
  }
194
194
 
@@ -1,26 +1,26 @@
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 Knowledge/. Use when the user asks to process meeting notes or after Anarlog sessions.
4
4
  ---
5
5
 
6
6
  # Process Anarlog
7
7
 
8
8
  Process meeting sessions from Anarlog (a local AI meeting-notes app) into the
9
9
  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.
10
+ summaries. This skill reads that output and feeds it into `Knowledge/`.
11
+ `extract-entities` processes emails and calendar events in the same way.
12
12
 
13
13
  ## Trigger
14
14
 
15
15
  - The user asks to process meeting notes or Anarlog sessions.
16
- - New meetings have been recorded.
16
+ - Anarlog recorded new meetings.
17
17
  - The user asks to update the knowledge base from recent meetings.
18
18
 
19
19
  ## Prerequisites
20
20
 
21
- - Anarlog installed; sessions at
21
+ - Anarlog installed. Sessions live at
22
22
  `~/Library/Application Support/anarlog/sessions/`.
23
- - User identity from running the `person-identify` skill, which writes
23
+ - The user identity. The `person-identify` skill writes it to
24
24
  `~/.cache/fit/outpost/state/identity.md`.
25
25
 
26
26
  ## Inputs
@@ -31,7 +31,7 @@ same way `extract-entities` processes emails and calendar events.
31
31
  - `~/.cache/fit/outpost/state/graph_processed` — processed-file index (TSV,
32
32
  shared with `extract-entities`).
33
33
  - `~/.cache/fit/outpost/state/identity.md` — user identity for self-exclusion
34
- (written by the `person-identify` skill).
34
+ (the `person-identify` skill writes it).
35
35
 
36
36
  ## Outputs
37
37
 
@@ -43,17 +43,18 @@ same way `extract-entities` processes emails and calendar events.
43
43
 
44
44
  <do_confirm_checklist goal="Verify each session was processed correctly">
45
45
 
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).
46
+ - [ ] Skip the empty, test, and onboarding sessions (per the skip rules).
47
+ - [ ] Read both `_memo.md` and `_summary.md` (when present). Consult the
48
+ transcript only for disambiguation.
49
+ - [ ] 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]]`).
53
+ - [ ] Describe the relationship in each activity entry. Leave out the
54
+ communication method.
55
+ - [ ] Auto-create no new `Priorities/` note (the user sets these). Update the
56
+ progress on every priority the content references.
57
+ - [ ] Update `graph_processed` for every processed file (memo + summary).
57
58
 
58
59
  </do_confirm_checklist>
59
60
 
@@ -72,12 +73,13 @@ node .claude/skills/anarlog-process/scripts/scan.mjs
72
73
  Flags: `--changed` (also detect changed memo/summary hashes), `--json`
73
74
  (programmatic output), `--count` (count only), `--limit N` (default 20).
74
75
 
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).
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.
78
80
 
79
81
  Process all unprocessed sessions in one run. **Don't write bespoke scan
80
- scripts** this script handles the edge cases (empty memos, missing summaries,
82
+ scripts.** This script handles the edge cases (empty memos, missing summaries,
81
83
  metadata fallback).
82
84
 
83
85
  ### 1. Build the knowledge index
@@ -95,8 +97,8 @@ as `extract-entities` Step 0).
95
97
 
96
98
  For each unprocessed session, read in this order: `_meta.json`, `_memo.md`,
97
99
  `_summary.md` (if present), `transcript.json` (only when disambiguation requires
98
- it). File shapes and skip rules:
99
- [references/sessions.md](references/sessions.md).
100
+ it). See [references/sessions.md](references/sessions.md) for the file shapes
101
+ and the skip rules.
100
102
 
101
103
  ### 3. Classify the source
102
104
 
@@ -104,19 +106,20 @@ Anarlog sessions are **meetings** and follow the meeting rules from
104
106
  `extract-entities`:
105
107
 
106
108
  - **Can create** People, Organization, Project, and Topic notes.
107
- - **Can update** existing notes including Priorities, which are
108
- user-set and never auto-created.
109
+ - **Can update** existing notes, including Priorities. The user sets a
110
+ Priority. Nothing auto-creates one.
109
111
  - **Can detect** state changes.
110
112
 
111
113
  Apply the "Would I prep for this person?" test from `extract-entities` Step 5
112
- before creating a person note.
114
+ before you create a person note.
113
115
 
114
116
  ### 4. Extract entities and content
115
117
 
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).
118
+ Combine the memo and the summary content (prefer the summary when both exist).
119
+ The extraction signals live in
120
+ [references/extraction.md](references/extraction.md). They cover entity types,
121
+ decisions, commitments, key facts, the activity-line format, the interview-note
122
+ rules, and the linking rules.
120
123
 
121
124
  ### 5. Write updates
122
125
 
@@ -125,7 +128,7 @@ For **new** entities, use the templates in
125
128
  sessions, use the candidate brief template from `req-track` (under
126
129
  `Knowledge/Candidates/`).
127
130
 
128
- For **existing** entities, apply targeted edits — never rewrite the file:
131
+ For **existing** entities, never rewrite the file. Apply targeted edits:
129
132
 
130
133
  - Add the new activity entry at the **top** of `## Activity`.
131
134
  - Update `Last seen` / `Last activity`.
@@ -12,35 +12,38 @@ Look for names in:
12
12
  platform team").
13
13
  - `_meta.json` participants.
14
14
 
15
- For each: resolve against the knowledge index (Step 0); extract role,
16
- organization, relationship to the user; note what was discussed.
15
+ For each name, resolve it against the knowledge index (Step 0). Extract the
16
+ role, the organization, and the relationship to the user. Note what they
17
+ discussed.
17
18
 
18
19
  ## Organizations
19
20
 
20
- Explicit mentions ("Acme Corp"), or inferred from people's roles or the
21
- surrounding context.
21
+ Look for explicit mentions ("Acme Corp"). Also infer an organization from a
22
+ person's role or from the context.
22
23
 
23
24
  ## Projects
24
25
 
25
- Explicit project names ("Customer Portal", "Q2 Migration") or described
26
- initiatives ("the hiring pipeline", "the product launch").
26
+ Look for explicit project names ("Customer Portal", "Q2 Migration"). Also look
27
+ for initiatives that the text describes ("the hiring pipeline", "the product
28
+ launch").
27
29
 
28
30
  ## Topics
29
31
 
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.
32
+ Look for themes that repeat ("AI coding agents", "interview process",
33
+ "architecture decisions"). Only create a Topic note when the subject spans
34
+ multiple meetings or is strategically important.
33
35
 
34
36
  ## Self-exclusion
35
37
 
36
- Never create or update a note for the user match against name, email, or
37
- `@domain` from `~/.cache/fit/outpost/state/identity.md`.
38
+ Never create or update a note for the user. Match against the name, the email,
39
+ or the `@domain` from `~/.cache/fit/outpost/state/identity.md`.
38
40
 
39
41
  ## Interview sessions (special case)
40
42
 
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/`.
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
47
 
45
48
  ## Content signals
46
49
 
@@ -51,13 +54,14 @@ the candidate brief template from `req-track`), **not** in `Knowledge/People/`.
51
54
  ### Commitments / action items
52
55
 
53
56
  "will share", "plans to", "needs to", "to be created", "will upload". Extract
54
- owner, action, deadline (if any), status (default `open`).
57
+ the owner, the action, the deadline (if any), and the status (default `open`).
55
58
 
56
59
  ### Key facts
57
60
 
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.
61
+ Look for specific numbers (headcount, budget, timeline) and preferences
62
+ ("non-traditional backgrounds"). Look for process details (interview stages,
63
+ evaluation criteria) and strategic context (market trends, competitive
64
+ landscape). Skip filler.
61
65
 
62
66
  ### Activity summary
63
67
 
@@ -71,8 +75,8 @@ One line per session per entity:
71
75
 
72
76
  ### Interview notes (for candidates)
73
77
 
74
- Add to the candidate's `## Notes` section: impressions, technical assessment,
75
- strengths and concerns, any interview scoring or decisions.
78
+ Add these to the candidate's `## Notes` section: impressions, the technical
79
+ assessment, strengths and concerns, and any interview scores or decisions.
76
80
 
77
81
  ## Linking rules
78
82
 
@@ -80,5 +84,5 @@ Use absolute paths everywhere: `[[People/Name]]`, `[[Organizations/Name]]`,
80
84
  `[[Projects/Name]]`, `[[Priorities/Priority Name]]`.
81
85
 
82
86
  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.
87
+ rules in `extract-entities` Step 7c. Update the progress and add the backlinks.
88
+ **Never** auto-create Priority notes.
@@ -15,8 +15,8 @@ Reference for `anarlog-process` Step 1. Each session lives at
15
15
  }
16
16
  ```
17
17
 
18
- Use: session date (from `created_at`), title, participants (often empty —
19
- Anarlog doesn't reliably populate this).
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.
20
20
 
21
21
  ## `_memo.md`
22
22
 
@@ -31,12 +31,12 @@ session_id: 213e0f78-a66a-468d-b8e5-bc3fbbe04bf4
31
31
  Chat with Sarah about the product roadmap.
32
32
  ```
33
33
 
34
- High-signal every name and observation is intentional.
34
+ The memo is high-signal. Every name and every observation is intentional.
35
35
 
36
36
  ## `_summary.md` (optional)
37
37
 
38
38
  YAML frontmatter (`id`, `position`, `session_id`, `title`) plus an AI-generated
39
- summary typically the richest source:
39
+ summary. The summary is typically the richest source:
40
40
 
41
41
  ```markdown
42
42
  ---
@@ -64,18 +64,18 @@ title: Summary
64
64
  }
65
65
  ```
66
66
 
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.
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
71
 
72
72
  ## Skip rules
73
73
 
74
- A session is skipped when **all** of:
74
+ Skip a session when **all** of these are true:
75
75
 
76
76
  - `_memo.md` body is empty or only `&nbsp;` / whitespace.
77
77
  - No `_summary.md` exists.
78
- - Title is empty or generic ("Hello", "Welcome to Anarlog", "Test").
78
+ - The title is empty or generic ("Hello", "Welcome to Anarlog", "Test").
79
79
 
80
80
  Process a session if it has **either** a substantive memo **or** a
81
81
  `_summary.md`.
@@ -2,9 +2,10 @@
2
2
  /**
3
3
  * Scan for unprocessed Anarlog sessions.
4
4
  *
5
- * Compares session _memo.md and _summary.md files against the graph_processed
6
- * state file to identify sessions that need processing. Reports unprocessed
7
- * sessions with title, date, and content preview.
5
+ * This script compares session _memo.md and _summary.md files against the
6
+ * graph_processed state file. It finds the sessions you must still process. It
7
+ * reports each unprocessed session with a title, a date, and a content
8
+ * preview.
8
9
  *
9
10
  * Usage:
10
11
  * node scripts/scan.mjs List unprocessed sessions
@@ -29,9 +30,9 @@ Usage:
29
30
  node scripts/scan.mjs [options]
30
31
 
31
32
  Options:
32
- --changed Also detect sessions whose memo/summary hash has changed
33
- --json Output as JSON array
34
- --count Just print the unprocessed count (for scripting)
33
+ --changed Also detect sessions whose memo/summary hash changed
34
+ --json Output as a JSON array
35
+ --count Just print the unprocessed count (for scripts)
35
36
  --limit N Max sessions to display (default: 20)
36
37
  -h, --help Show this help message
37
38
 
@@ -61,14 +62,14 @@ if (existsSync(STATE_FILE)) {
61
62
  }
62
63
 
63
64
  /**
64
- * Compute SHA-256 hash of file contents.
65
+ * Compute the SHA-256 hash of the file contents.
65
66
  */
66
67
  function fileHash(filePath) {
67
68
  return createHash("sha256").update(readFileSync(filePath)).digest("hex");
68
69
  }
69
70
 
70
71
  /**
71
- * Check if a file needs processing (new or changed).
72
+ * Check whether the script must process a file (new or changed).
72
73
  */
73
74
  function needsProcessing(filePath) {
74
75
  const storedHash = state.get(filePath);
@@ -81,7 +82,7 @@ function needsProcessing(filePath) {
81
82
  }
82
83
 
83
84
  /**
84
- * Extract title and date from a memo file.
85
+ * Extract the title and the date from a memo file.
85
86
  */
86
87
  function parseMemo(memoPath) {
87
88
  try {