@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.
- package/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +4 -4
- 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 +21 -19
- package/src/outpost.js +37 -33
- 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 +22 -22
- package/templates/.claude/agents/concierge.md +19 -17
- package/templates/.claude/agents/head-hunter.md +27 -26
- package/templates/.claude/agents/librarian.md +17 -16
- package/templates/.claude/agents/postman.md +19 -18
- package/templates/.claude/agents/recruiter.md +31 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
- package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
- package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
- package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
- package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
- package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
- 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 +55 -50
- package/templates/.claude/skills/deck-create/SKILL.md +30 -30
- 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 +59 -57
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
- package/templates/.claude/skills/doc-create/SKILL.md +21 -20
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
- package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +5 -5
- package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
- package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
- package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
- package/templates/.claude/skills/organize-files/SKILL.md +24 -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 +24 -22
- package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
- package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
- package/templates/.claude/skills/req-assess/SKILL.md +27 -27
- package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
- package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-decide/SKILL.md +28 -25
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-forget/SKILL.md +28 -26
- package/templates/.claude/skills/req-forget/references/classify.md +13 -13
- package/templates/.claude/skills/req-forget/references/locations.md +2 -2
- package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
- package/templates/.claude/skills/req-scan/SKILL.md +21 -22
- 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/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +31 -29
- package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
- package/templates/.claude/skills/req-screen/references/template.md +4 -4
- package/templates/.claude/skills/req-track/SKILL.md +40 -40
- package/templates/.claude/skills/req-track/references/fields.md +19 -18
- 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 +4 -4
- package/templates/.claude/skills/req-workday/SKILL.md +24 -24
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +13 -13
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
- package/templates/.claude/skills/send-chat/SKILL.md +47 -43
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -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 +17 -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 +43 -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 +39 -40
- package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
- 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
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
|
22
|
+
- The user starts an Anarlog recording and wants real-time support.
|
|
23
23
|
|
|
24
24
|
## Prerequisites
|
|
25
25
|
|
|
26
|
-
- Anarlog installed
|
|
26
|
+
- Anarlog installed. Sessions live at
|
|
27
27
|
`~/Library/Application Support/anarlog/sessions/`.
|
|
28
28
|
- An active or about-to-start session.
|
|
29
|
-
-
|
|
29
|
+
- A populated knowledge base (attendee / candidate context).
|
|
30
30
|
|
|
31
31
|
## Inputs
|
|
32
32
|
|
|
33
|
-
- Live `transcript.json` (
|
|
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
|
-
-
|
|
41
|
-
- **
|
|
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
|
-
- [ ]
|
|
46
|
-
- [ ]
|
|
47
|
-
- [ ]
|
|
48
|
-
- [ ] For interviews
|
|
49
|
-
|
|
50
|
-
- [ ]
|
|
51
|
-
- [ ]
|
|
52
|
-
- [ ]
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
to follow a specific session. If
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
Phase 2
|
|
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
|
|
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
|
-
|
|
105
|
-
`**Status:**` field for context
|
|
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)
|
|
118
|
-
|
|
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
|
-
|
|
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)
|
|
143
|
-
|
|
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
|
|
155
|
-
("that's all", "let's wrap", "I'll let you go")
|
|
156
|
-
substantive follow-up. When
|
|
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
|
|
162
|
-
consecutive empty reads, ask the user whether the meeting
|
|
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
|
-
|
|
169
|
-
|
|
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
|
|
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
|
|
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** |
|
|
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** |
|
|
60
|
-
| **Decisions** |
|
|
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_
|
|
84
|
+
- **Evidence over claims.** Flag _claims_ vs. _demonstrations_. Push for
|
|
85
85
|
specific examples.
|
|
86
|
-
- **Coverage-aware.** Track which screening focus areas
|
|
87
|
-
|
|
88
|
-
- **Level-calibrated.** Know what the target level expects
|
|
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
|
|
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
|
|
97
|
-
commitments from
|
|
98
|
-
- **Time-conscious.** Nudge when the meeting
|
|
99
|
-
|
|
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
|
|
104
|
-
- **Channel awareness.** Channel 0 = user
|
|
105
|
-
the _guest_ 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
|
|
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
|
|
117
|
-
- **Privacy.** Coaching may appear on a shared screen
|
|
118
|
-
|
|
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.
|
|
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
|
-
//
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
|
11
|
-
|
|
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
|
-
-
|
|
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
|
|
21
|
+
- Anarlog installed. Sessions live at
|
|
22
22
|
`~/Library/Application Support/anarlog/sessions/`.
|
|
23
|
-
-
|
|
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
|
-
(
|
|
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
|
-
- [ ]
|
|
47
|
-
- [ ]
|
|
48
|
-
|
|
49
|
-
- [ ] "Would I prep?" test
|
|
50
|
-
- [ ]
|
|
51
|
-
`Knowledge/People/`.
|
|
52
|
-
- [ ]
|
|
53
|
-
- [ ]
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
`
|
|
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
|
|
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).
|
|
99
|
-
|
|
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
|
|
108
|
-
|
|
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
|
|
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).
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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,
|
|
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
|
|
16
|
-
organization, relationship to the user
|
|
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
|
-
|
|
21
|
-
|
|
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
|
-
|
|
26
|
-
initiatives ("the hiring pipeline", "the product
|
|
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
|
-
|
|
31
|
-
decisions"). Only create a Topic note when the subject spans
|
|
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
|
|
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
|
|
42
|
-
**candidate
|
|
43
|
-
|
|
43
|
+
If the title or the memo says "interview with {Name}", the interviewee is a
|
|
44
|
+
**candidate**. Create or update their note in `Knowledge/Candidates/` with the
|
|
45
|
+
candidate brief template from `req-track`. **Never** write it in
|
|
46
|
+
`Knowledge/People/`.
|
|
44
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
|
-
|
|
59
|
-
backgrounds")
|
|
60
|
-
strategic context (market trends, competitive
|
|
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
|
|
75
|
-
strengths and concerns, any interview
|
|
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
|
|
84
|
-
**
|
|
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
|
|
19
|
-
Anarlog
|
|
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
|
-
|
|
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
|
|
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
|
|
68
|
-
only
|
|
69
|
-
(channel 0 = user, channel 1 = other speaker)
|
|
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
|
-
|
|
74
|
+
Skip a session when **all** of these are true:
|
|
75
75
|
|
|
76
76
|
- `_memo.md` body is empty or only ` ` / whitespace.
|
|
77
77
|
- No `_summary.md` exists.
|
|
78
|
-
-
|
|
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
|
-
*
|
|
6
|
-
* state file
|
|
7
|
-
*
|
|
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
|
|
33
|
-
--json Output as JSON array
|
|
34
|
-
--count Just print the unprocessed count (for
|
|
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
|
|
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 {
|