@forwardimpact/outpost 3.0.3

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 (120) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +15 -0
  3. package/bin/fit-outpost.js +3 -0
  4. package/config/scheduler.json +34 -0
  5. package/package.json +63 -0
  6. package/src/agent-runner.js +189 -0
  7. package/src/index.js +5 -0
  8. package/src/kb-manager.js +228 -0
  9. package/src/outpost.js +417 -0
  10. package/src/scheduler.js +195 -0
  11. package/src/socket-server.js +336 -0
  12. package/src/state-manager.js +126 -0
  13. package/templates/.claude/agents/chief-of-staff.md +58 -0
  14. package/templates/.claude/agents/concierge.md +46 -0
  15. package/templates/.claude/agents/head-hunter.md +57 -0
  16. package/templates/.claude/agents/librarian.md +60 -0
  17. package/templates/.claude/agents/postman.md +47 -0
  18. package/templates/.claude/agents/recruiter.md +63 -0
  19. package/templates/.claude/settings.json +88 -0
  20. package/templates/.claude/skills/candidate-report/SKILL.md +139 -0
  21. package/templates/.claude/skills/candidate-report/references/report-template.html +203 -0
  22. package/templates/.claude/skills/candidate-report/references/report.css +438 -0
  23. package/templates/.claude/skills/candidate-report/references/rubric.md +76 -0
  24. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +48 -0
  25. package/templates/.claude/skills/deck-create/SKILL.md +75 -0
  26. package/templates/.claude/skills/deck-create/references/slide.css +35 -0
  27. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +47 -0
  28. package/templates/.claude/skills/deck-summarize/SKILL.md +139 -0
  29. package/templates/.claude/skills/deck-summarize/references/brief-template.md +85 -0
  30. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +210 -0
  31. package/templates/.claude/skills/doc-collab/SKILL.md +112 -0
  32. package/templates/.claude/skills/doc-create/SKILL.md +105 -0
  33. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +50 -0
  34. package/templates/.claude/skills/draft-emails/SKILL.md +141 -0
  35. package/templates/.claude/skills/draft-emails/references/template.md +26 -0
  36. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +66 -0
  37. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +139 -0
  38. package/templates/.claude/skills/extract-entities/SKILL.md +187 -0
  39. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +14 -0
  40. package/templates/.claude/skills/extract-entities/references/conditions.md +55 -0
  41. package/templates/.claude/skills/extract-entities/references/content.md +104 -0
  42. package/templates/.claude/skills/extract-entities/references/links.md +48 -0
  43. package/templates/.claude/skills/extract-entities/references/recruitment.md +57 -0
  44. package/templates/.claude/skills/extract-entities/references/resolution.md +71 -0
  45. package/templates/.claude/skills/extract-entities/references/sources.md +70 -0
  46. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +36 -0
  47. package/templates/.claude/skills/extract-entities/references/templates-goals-priorities.md +63 -0
  48. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +67 -0
  49. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +68 -0
  50. package/templates/.claude/skills/extract-entities/scripts/state.mjs +131 -0
  51. package/templates/.claude/skills/hyprnote-follow/SKILL.md +174 -0
  52. package/templates/.claude/skills/hyprnote-follow/references/coaching.md +118 -0
  53. package/templates/.claude/skills/hyprnote-follow/references/debrief.md +59 -0
  54. package/templates/.claude/skills/hyprnote-follow/references/meeting-types.md +14 -0
  55. package/templates/.claude/skills/hyprnote-follow/scripts/follow.mjs +243 -0
  56. package/templates/.claude/skills/hyprnote-process/SKILL.md +147 -0
  57. package/templates/.claude/skills/hyprnote-process/references/extraction.md +84 -0
  58. package/templates/.claude/skills/hyprnote-process/references/sessions.md +81 -0
  59. package/templates/.claude/skills/hyprnote-process/scripts/scan.mjs +246 -0
  60. package/templates/.claude/skills/hyprnote-trim/SKILL.md +177 -0
  61. package/templates/.claude/skills/manage-tasks/SKILL.md +152 -0
  62. package/templates/.claude/skills/manage-tasks/references/format.md +73 -0
  63. package/templates/.claude/skills/meeting-prep/SKILL.md +180 -0
  64. package/templates/.claude/skills/organize-files/SKILL.md +146 -0
  65. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +105 -0
  66. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +91 -0
  67. package/templates/.claude/skills/req-assess/SKILL.md +137 -0
  68. package/templates/.claude/skills/req-assess/references/interview-template.md +62 -0
  69. package/templates/.claude/skills/req-assess/references/panel-template.md +117 -0
  70. package/templates/.claude/skills/req-assess/references/rubric.md +65 -0
  71. package/templates/.claude/skills/req-decide/SKILL.md +163 -0
  72. package/templates/.claude/skills/req-decide/references/rubric.md +63 -0
  73. package/templates/.claude/skills/req-decide/references/template.md +118 -0
  74. package/templates/.claude/skills/req-forget/SKILL.md +154 -0
  75. package/templates/.claude/skills/req-forget/references/classify.md +23 -0
  76. package/templates/.claude/skills/req-forget/references/locations.md +59 -0
  77. package/templates/.claude/skills/req-forget/references/report-template.md +67 -0
  78. package/templates/.claude/skills/req-scan/SKILL.md +145 -0
  79. package/templates/.claude/skills/req-scan/references/fallbacks.md +76 -0
  80. package/templates/.claude/skills/req-scan/references/filters.md +83 -0
  81. package/templates/.claude/skills/req-scan/references/sources.md +76 -0
  82. package/templates/.claude/skills/req-scan/references/state.md +54 -0
  83. package/templates/.claude/skills/req-scan/references/template.md +36 -0
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +396 -0
  85. package/templates/.claude/skills/req-screen/SKILL.md +151 -0
  86. package/templates/.claude/skills/req-screen/references/rubric.md +94 -0
  87. package/templates/.claude/skills/req-screen/references/template.md +91 -0
  88. package/templates/.claude/skills/req-track/SKILL.md +189 -0
  89. package/templates/.claude/skills/req-track/references/fields.md +114 -0
  90. package/templates/.claude/skills/req-track/references/signals.md +42 -0
  91. package/templates/.claude/skills/req-track/references/statuses.md +32 -0
  92. package/templates/.claude/skills/req-track/references/templates.md +127 -0
  93. package/templates/.claude/skills/req-workday/SKILL.md +162 -0
  94. package/templates/.claude/skills/req-workday/references/field-mapping.md +40 -0
  95. package/templates/.claude/skills/req-workday/references/status-mapping.md +38 -0
  96. package/templates/.claude/skills/req-workday/references/templates.md +126 -0
  97. package/templates/.claude/skills/req-workday/references/xlsx-format.md +56 -0
  98. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +313 -0
  99. package/templates/.claude/skills/send-chat/SKILL.md +170 -0
  100. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +145 -0
  101. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +80 -0
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +307 -0
  103. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +332 -0
  104. package/templates/.claude/skills/sync-apple-mail/SKILL.md +151 -0
  105. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +115 -0
  106. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +389 -0
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +372 -0
  108. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +239 -0
  109. package/templates/.claude/skills/sync-teams/SKILL.md +177 -0
  110. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +147 -0
  111. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +288 -0
  112. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +381 -0
  113. package/templates/.claude/skills/upstream-skill/SKILL.md +130 -0
  114. package/templates/.claude/skills/upstream-skill/references/examples.md +80 -0
  115. package/templates/.claude/skills/weekly-update/SKILL.md +141 -0
  116. package/templates/.claude/skills/weekly-update/references/template.md +55 -0
  117. package/templates/CLAUDE.md +134 -0
  118. package/templates/USER.md +3 -0
  119. package/templates/apm.yml +5 -0
  120. package/templates/knowledge/Briefings/.gitkeep +0 -0
@@ -0,0 +1,187 @@
1
+ ---
2
+ name: extract-entities
3
+ description: Process synced email/calendar files from ~/.cache/fit/outpost/ and ad-hoc document files (e.g. from ~/Desktop/ or ~/Downloads/) to extract structured knowledge into knowledge/ as Obsidian-compatible markdown notes. Use on a schedule, when the user asks to process/extract entities, or when invoked by another skill (e.g. organize-files). Builds the core knowledge graph from raw data.
4
+ ---
5
+
6
+ # Extract Entities
7
+
8
+ Process synced email and calendar files from `~/.cache/fit/outpost/`, plus
9
+ ad-hoc documents passed by other skills, into Obsidian-compatible markdown notes
10
+ under `knowledge/`. The core knowledge-graph builder.
11
+
12
+ ## Trigger
13
+
14
+ - Schedule (every 15 minutes) for synced data.
15
+ - The user asks to process / extract entities from synced data.
16
+ - Another skill passes ad-hoc file paths (e.g. `organize-files` after organising
17
+ `~/Desktop/` and `~/Downloads/`).
18
+
19
+ ## Prerequisites
20
+
21
+ - Synced data in `~/.cache/fit/outpost/` and/or ad-hoc paths.
22
+ - User identity in `USER.md` (Name, Email, Domain).
23
+
24
+ ## Inputs
25
+
26
+ - `~/.cache/fit/outpost/apple_mail/*.md`,
27
+ `~/.cache/fit/outpost/apple_calendar/*.json`,
28
+ `~/.cache/fit/outpost/teams_chat/*.md`.
29
+ - Ad-hoc paths: `.pdf`, `.txt`, `.md`, `.rtf`, `.doc`, `.docx`, `.csv`, `.xlsx`.
30
+ - `~/.cache/fit/outpost/state/graph_processed` — processed-file index (TSV,
31
+ shared with `req-track` and `hyprnote-process`).
32
+ - `USER.md` — user identity for self-exclusion.
33
+
34
+ ## Outputs
35
+
36
+ - `knowledge/People/`, `knowledge/Organizations/`, `knowledge/Projects/`,
37
+ `knowledge/Topics/` — created or updated.
38
+ - `knowledge/Goals/`, `knowledge/Priorities/` — **updated only**, never
39
+ auto-created.
40
+ - `knowledge/Conditions/` — created when cross-cutting patterns are detected, or
41
+ updated.
42
+ - `knowledge/Roles/`, `knowledge/Candidates/*/brief.md` — enriched with inferred
43
+ metadata.
44
+ - `~/.cache/fit/outpost/state/graph_processed` — updated.
45
+
46
+ <do_confirm_checklist goal="Verify the batch produced clean, linked,
47
+ well-grounded notes">
48
+
49
+ - [ ] Source type correctly identified; meeting-vs-email rules applied (meetings
50
+ create, emails only update).
51
+ - [ ] Self and `@user.domain` excluded from extraction.
52
+ - [ ] "Would I prep?" test applied to each person.
53
+ - [ ] All links use absolute paths `[[Folder/Name]]`; bidirectional links
54
+ consistent (incl. Goal ↔ Project, Priority ↔ Goal).
55
+ - [ ] Summaries describe relationship, not communication method; key facts are
56
+ substantive; open items are commitments.
57
+ - [ ] State changes logged with `[Field → value]`; no Goal or Priority entities
58
+ auto-created.
59
+ - [ ] Conditions created only when ≥ 3 entities reference the same cross-cutting
60
+ state; resolution detected when evidence supports.
61
+ - [ ] Recruitment: Req numbers detected and Role files created/enriched;
62
+ HM/recruiter/domain-lead inferred where strongly supported.
63
+ - [ ] `graph_processed` updated for every processed file.
64
+
65
+ </do_confirm_checklist>
66
+
67
+ ## Procedure
68
+
69
+ Process **10 files per run**. Write **one file at a time** — do not batch
70
+ writes.
71
+
72
+ ### 0. Load context and pick the batch
73
+
74
+ Read `USER.md`. Find new/changed files:
75
+
76
+ ```bash
77
+ node scripts/state.mjs check
78
+ ```
79
+
80
+ Each line is a path. When invoked with ad-hoc paths, process those directly
81
+ instead of scanning `~/.cache/fit/outpost/` — still check each against
82
+ `graph_processed` and skip when the hash hasn't changed.
83
+
84
+ ### 1. Build the knowledge index
85
+
86
+ ```bash
87
+ find knowledge/People knowledge/Organizations knowledge/Projects \
88
+ knowledge/Topics knowledge/Goals knowledge/Priorities \
89
+ knowledge/Conditions -name "*.md" 2>/dev/null
90
+ ```
91
+
92
+ For each note, `head -20` to capture key fields. Build a mental index of People,
93
+ Organizations, Projects, Goals, Priorities, Topics by name, email, organization,
94
+ role, status, and aliases.
95
+
96
+ ### 2. Classify the source
97
+
98
+ Type detection, skip rules, warm-intro exception, and the source-type rules
99
+ summary: [references/sources.md](references/sources.md).
100
+
101
+ ### 3. Read and parse the source
102
+
103
+ - **Emails:** Date, Subject, From, To/Cc, Thread ID, Body.
104
+ - **Meetings:** Date, Attendees, Transcript / Notes.
105
+ - **Ad-hoc documents:** Date (file mtime), Filename, Source path, Content. `.md`
106
+ / `.txt` / `.rtf` direct; `.pdf` via `pdftotext` or `mdcat`; `.csv` as-is
107
+ (look for names / emails / orgs in columns); `.doc` / `.docx` via
108
+ `textutil -convert txt`.
109
+
110
+ Ad-hoc documents follow **meeting** rules (can create notes).
111
+
112
+ Exclude self per [references/sources.md](references/sources.md#self-exclusion).
113
+ Collect every name variant per
114
+ [references/resolution.md](references/resolution.md#name-variant-collection).
115
+
116
+ ### 4. Resolve entities
117
+
118
+ For each variant, search the knowledge index. Apply the
119
+ [matching table](references/resolution.md#matching) and the
120
+ [disambiguation priority](references/resolution.md#disambiguation-priority).
121
+ Goals and Priorities are
122
+ [never auto-created](references/resolution.md#never-auto-create) — link to
123
+ existing entries only.
124
+
125
+ ### 5. Identify new entities (meetings only)
126
+
127
+ Apply the
128
+ ["Would I prep?" test](references/resolution.md#would-i-prep-for-this-person--step-5)
129
+ and the [role inference rules](references/resolution.md#role-inference). For
130
+ contacts who don't merit their own note, add to the Organization's `## Contacts`
131
+ section.
132
+
133
+ ### 6. Extract content
134
+
135
+ Decisions, commitments, key facts, open items, activity lines, summaries:
136
+ [references/content.md](references/content.md). Be substantive; never write
137
+ filler or meta-commentary.
138
+
139
+ ### 7. Detect state changes and structural enrichment
140
+
141
+ - **State changes** (Project status, open-item resolution, role / title changes,
142
+ relationship changes): tables in
143
+ [references/content.md](references/content.md#state-change-tables). Be
144
+ conservative; log inline `[Field → value]`.
145
+ - **Recruitment** (Req-number detection, hiring-manager / recruiter /
146
+ domain-lead inference):
147
+ [references/recruitment.md](references/recruitment.md).
148
+ - **Goal & Priority links** (Step 7c): rules in
149
+ [references/links.md](references/links.md#goals-step-7c) and
150
+ [Priorities](references/links.md#priorities-step-7c). **Never auto-create.**
151
+ - **Conditions** (cross-cutting states affecting ≥ 3 entities):
152
+ [references/conditions.md](references/conditions.md).
153
+
154
+ ### 8. Check for duplicates
155
+
156
+ [references/content.md](references/content.md#duplicate-check-step-8) — skip
157
+ same-day same-source activity entries, dedupe key facts and open items, mark
158
+ contradictions "(needs clarification)".
159
+
160
+ ### 9. Write updates
161
+
162
+ For **new** entities, use the templates indexed by
163
+ [references/TEMPLATES.md](references/TEMPLATES.md).
164
+
165
+ For **existing** entities, apply targeted edits — never rewrite the file:
166
+
167
+ - Add the new activity entry at the **top** of `## Activity` (reverse
168
+ chronological).
169
+ - Update `Last seen`.
170
+ - Add new key facts (skip duplicates).
171
+ - Update open items (mark completed, add new).
172
+ - Apply state changes to fields.
173
+
174
+ ### 10. Ensure bidirectional links
175
+
176
+ After writing, verify links go both ways using the
177
+ [bidirectional link rules](references/links.md#bidirectional-link-rules).
178
+
179
+ ### 11. Update graph state
180
+
181
+ ```bash
182
+ node scripts/state.mjs update "$FILE"
183
+ ```
184
+
185
+ Run for every processed file. The state file is shared with `req-track` and
186
+ `hyprnote-process`, so this prevents either skill from re-scanning the same
187
+ input.
@@ -0,0 +1,14 @@
1
+ # Note Templates
2
+
3
+ Templates for creating new knowledge-base notes. Split by entity family to keep
4
+ each file under the L5 cap. `hyprnote-process` references this file as the
5
+ index.
6
+
7
+ - [templates-people-orgs.md](templates-people-orgs.md) — People, Organizations.
8
+ - [templates-projects-topics.md](templates-projects-topics.md) — Projects,
9
+ Topics.
10
+ - [templates-goals-priorities.md](templates-goals-priorities.md) — Goals,
11
+ Priorities. **Never auto-created** by `extract-entities` or `hyprnote-process`
12
+ — set by the user.
13
+ - [templates-conditions.md](templates-conditions.md) — Conditions (time-bound
14
+ cross-cutting states).
@@ -0,0 +1,55 @@
1
+ # Conditions
2
+
3
+ Reference for `extract-entities` Step 7d. Conditions are time-bound
4
+ organizational states (hiring freezes, reorgs, budget holds, leadership
5
+ transitions) that affect multiple entities simultaneously — the "weather" of the
6
+ knowledge graph.
7
+
8
+ ## Detection signals
9
+
10
+ When **3+ different entity updates in the same processing run** reference the
11
+ same constraint or state, suspect a Condition.
12
+
13
+ | Signal | Example | Potential Condition |
14
+ | ---------------------------------------- | -------------------------------- | --------------------------- |
15
+ | "on hold", "paused", "frozen", "blocked" | "All recruitment is on hold" | Hiring Freeze |
16
+ | "reorg", "restructuring", "transition" | "Team may move outside division" | Organizational Restructure |
17
+ | "budget", "cost reduction", "headcount" | "30% reduction planned" | Budget Constraint |
18
+ | "waiting on", "pending approval from" | "Waiting on leadership decision" | Leadership Decision Pending |
19
+ | "new CTO", "leadership change" | "New CTO starting next month" | Leadership Transition |
20
+
21
+ ## Creating a Condition
22
+
23
+ 1. Check existing: `ls knowledge/Conditions/ 2>/dev/null`.
24
+ 2. **No match:** create a new Condition note using
25
+ [templates-conditions.md](templates-conditions.md). Name descriptively
26
+ ("Hiring Freeze Q2", "Division Reorg").
27
+ 3. **Match exists:** update with new activity and any changes to status,
28
+ blocker, or affected entities.
29
+
30
+ ## Updating affected entities
31
+
32
+ When a Condition is created or updated:
33
+
34
+ 1. Add `[[Conditions/{Condition}]]` to the `## Blockers` section of affected
35
+ Goals.
36
+ 2. Add `[Status → on hold]` state changes to affected Projects where
37
+ appropriate.
38
+ 3. Add a `## Blockers` entry to affected Role files if recruitment is frozen.
39
+ 4. Log the Condition reference in activity entries:
40
+ `- **YYYY-MM-DD** ({source}): {update}. See [[Conditions/{Condition}]]`.
41
+
42
+ ## Resolving Conditions
43
+
44
+ Source content indicates the Condition has ended: "approved", "freeze lifted",
45
+ "reorg complete", "back on track".
46
+
47
+ - Set `**Status:** resolved`, `**Resolved:** {date}`.
48
+ - Remove `[[Conditions/{Condition}]]` from affected Goal `## Blockers`.
49
+ - Log with `[Status → resolved]`.
50
+
51
+ ## Conservatism
52
+
53
+ Only create Conditions for genuinely cross-cutting states that affect 3+
54
+ entities. A single project being "on hold" is a project status change, **not** a
55
+ Condition. A hiring freeze affecting 20 roles across 5 teams **is** a Condition.
@@ -0,0 +1,104 @@
1
+ # Content Extraction
2
+
3
+ Reference for `extract-entities` Step 6 (extract content) and Step 7 (detect
4
+ state changes).
5
+
6
+ ## Decisions
7
+
8
+ Signals: "We decided…", "We agreed…", "Let's go with…", "Approved", "Confirmed".
9
+
10
+ ## Commitments
11
+
12
+ Signals: "I'll…", "We'll…", "Can you…", "Please send…", "By Friday".
13
+
14
+ Extract owner, action, deadline (if mentioned), status (`open`).
15
+
16
+ ## Key facts — substantive only
17
+
18
+ Specific numbers (budget, team size, timeline), preferences, working style,
19
+ background, technical requirements, what was discussed or proposed.
20
+
21
+ **Never include:** meta-commentary about missing data, placeholder text, or
22
+ data-quality observations. If no key facts exist, leave the section empty.
23
+
24
+ ## Open items — commitments only
25
+
26
+ ```markdown
27
+ - [ ] Send API documentation — by Friday
28
+ - [ ] Schedule follow-up call with CTO
29
+ ```
30
+
31
+ **Never include:** "find their email", "add their role", "research company
32
+ background".
33
+
34
+ ## Activity — one line per source
35
+
36
+ ```markdown
37
+ - **2025-01-15** (meeting): Kickoff for [[Projects/Acme Integration]]. [[People/David Kim]] needs API access.
38
+ ```
39
+
40
+ Always use canonical names with absolute paths (`[[People/Name]]`,
41
+ `[[Organizations/Name]]`).
42
+
43
+ ## Summary — relationship not method
44
+
45
+ 2–3 sentences answering: "Who is this person and why do I know them?"
46
+
47
+ - **Good:** "VP Engineering at [[Organizations/Acme Corp]] leading the
48
+ [[Projects/Acme Integration]] pilot."
49
+ - **Bad:** "Attendee on the scheduled meeting (Aug 12, 2024)."
50
+
51
+ ## State-change tables
52
+
53
+ ### Project status
54
+
55
+ | Signal | New status |
56
+ | ------------------------------------- | ---------- |
57
+ | "approved" / "signed" / "green light" | active |
58
+ | "on hold" / "pausing" / "delayed" | on hold |
59
+ | "cancelled" / "not proceeding" | cancelled |
60
+ | "launched" / "completed" / "shipped" | completed |
61
+ | "exploring" / "considering" | planning |
62
+
63
+ ### Open-item resolution
64
+
65
+ | Signal | Action |
66
+ | ---------------------------- | --------------- |
67
+ | "Here's the X you requested" | Mark X complete |
68
+ | "I've sent the X" | Mark X complete |
69
+ | "X is done" / "X is ready" | Mark X complete |
70
+
71
+ Change `- [ ]` → `- [x]` with completion date.
72
+
73
+ ### Role / title
74
+
75
+ - New title in email signature.
76
+ - "I've been promoted to…".
77
+ - Different role than what's in the note.
78
+
79
+ ### Relationship
80
+
81
+ - "I've joined [New Company]".
82
+ - "We signed the contract" → prospect → customer.
83
+ - New email domain for a known person.
84
+
85
+ ## Conservatism
86
+
87
+ Only apply clear, unambiguous state changes. If uncertain, add to activity but
88
+ don't change fields.
89
+
90
+ Log changes inline:
91
+
92
+ ```markdown
93
+ - **2025-01-20** (email): Leadership approved pilot. [Status → active]
94
+ ```
95
+
96
+ ## Duplicate check (Step 8)
97
+
98
+ Before writing:
99
+
100
+ - Look at the Activity section for an existing entry on this date from this
101
+ source.
102
+ - Compare key facts; skip duplicates.
103
+ - Don't add the same open item twice.
104
+ - If new info contradicts existing, keep both with "(needs clarification)".
@@ -0,0 +1,48 @@
1
+ # Bidirectional Links
2
+
3
+ Reference for `extract-entities` Step 10 and Step 7c (Goals / Priorities).
4
+
5
+ ## Bidirectional link rules
6
+
7
+ After writing, verify each link goes both ways.
8
+
9
+ | If you add... | Then also add... |
10
+ | ---------------------- | -------------------------------------------- |
11
+ | Person → Organization | Organization → Person (in People section) |
12
+ | Person → Project | Project → Person (in People section) |
13
+ | Project → Organization | Organization → Project (in Projects section) |
14
+ | Project → Goal | Goal → Project (in Projects section) |
15
+ | Goal → Priority | Priority → Goal (in Goals section) |
16
+ | Project → Priority | Priority → Project (in Projects section) |
17
+ | Condition → Goal | Goal → Condition (in Blockers section) |
18
+ | Condition → Project | Project → Condition (in Related section) |
19
+ | Condition → Role | Role → Condition (notes or status field) |
20
+
21
+ Use absolute paths everywhere: `[[People/Sarah Chen]]`,
22
+ `[[Organizations/Acme Corp]]`, `[[Projects/Acme Integration]]`,
23
+ `[[Goals/Goal Name]]`, `[[Priorities/Priority Name]]`,
24
+ `[[Conditions/Condition Name]]`.
25
+
26
+ ## Goals (Step 7c)
27
+
28
+ When source content references an existing `knowledge/Goals/*.md`:
29
+
30
+ - Add a `[[Goals/{Goal}]]` link to the relevant Project or Topic activity entry.
31
+ - Add a progress entry to the Goal's `## Progress` section.
32
+ - If evidence suggests a status change ("we won't hit the Q3 target"), update
33
+ `**Status:**` and log `[Status → value]`.
34
+
35
+ **Never auto-create Goals.**
36
+
37
+ ## Priorities (Step 7c)
38
+
39
+ Match source themes against priority names and descriptions.
40
+
41
+ - Add `[[Priorities/{Priority}]]` to a Project or Topic `## Related` section if
42
+ not already present.
43
+ - Update the Priority's `## Projects` section when a new project emerges that
44
+ serves it.
45
+
46
+ **Never auto-create Priorities.** Don't over-link — a project that already links
47
+ to a Goal which links to a Priority doesn't need a redundant direct Priority
48
+ link.
@@ -0,0 +1,57 @@
1
+ # Recruitment Inference
2
+
3
+ Reference for `extract-entities` Step 7b. Enrich `knowledge/Roles/` and
4
+ `knowledge/Candidates/` with metadata that no single source carries.
5
+
6
+ ## Requisition number detection
7
+
8
+ Scan email subjects and bodies for requisition numbers (e.g. 7-digit Workday
9
+ IDs).
10
+
11
+ 1. `ls knowledge/Roles/ | grep "{req_number}"` — does a Role file exist?
12
+ 2. **No file:** create a stub using the Role-stub template in `req-track` Step
13
+ 0b. Search `rg "{req_number}" knowledge/` for context to enrich it.
14
+ 3. **File exists:** check whether the email provides new metadata (hiring
15
+ manager, recruiter, locations) and update the Role file.
16
+
17
+ ## Hiring manager — calendar inference
18
+
19
+ When a calendar event title matches an interview pattern — "Interview",
20
+ "Screening", "Screen", "Decomposition", "Panel", "Technical Assessment",
21
+ "Candidate" — combined with a person name:
22
+
23
+ 1. Cross-reference the candidate against `knowledge/Candidates/`.
24
+ 2. Extract the **organizer**. If the organizer isn't the user (per `USER.md`),
25
+ they are likely the hiring manager.
26
+ 3. Confirm: look up the organizer in `knowledge/People/` for a manager/HM role
27
+ indication.
28
+ 4. Check the candidate's `brief.md` for a `Req` field; if known, set the
29
+ matching Role file's `Hiring manager` (only if currently `—`).
30
+ 5. Set the candidate's `brief.md` `Hiring manager` field if currently `—`.
31
+
32
+ ## Recruiter — email-thread inference
33
+
34
+ When a thread references candidates (name match against
35
+ `knowledge/Candidates/`):
36
+
37
+ 1. Cross-reference To/CC against `knowledge/People/`.
38
+ 2. If a CC'd person's note mentions "recruiter", "talent acquisition", or a
39
+ similar role, they are likely the internal recruiter.
40
+ 3. Update the candidate's `brief.md` recruiter field and the matching Role file
41
+ (only if currently `—`).
42
+
43
+ ## Domain lead — reporting-chain resolution
44
+
45
+ When a hiring manager is newly identified:
46
+
47
+ 1. Read their People note for `**Reports to:**`.
48
+ 2. Walk up the chain to a VP or senior leader listed in a stakeholder map or
49
+ organizational hierarchy note.
50
+ 3. Set both the Role file's `Domain lead` and the candidate brief's
51
+ `Domain lead`.
52
+
53
+ ## Conservatism
54
+
55
+ Set hiring manager / domain lead / recruiter only when evidence is strong. A
56
+ single calendar invite organized by someone is suggestive but not conclusive —
57
+ confirm against People notes or multiple data points before setting the field.
@@ -0,0 +1,71 @@
1
+ # Entity Resolution
2
+
3
+ Reference for `extract-entities` Steps 2b–5.
4
+
5
+ ## Name-variant collection
6
+
7
+ Extract every way each entity is referenced.
8
+
9
+ - **People:** full names, first / last names, initials, email addresses,
10
+ roles/titles, pronouns with clear antecedents.
11
+ - **Organizations:** full names, short names, abbreviations, email domains.
12
+ - **Projects:** explicit names, descriptive references ("the pilot", "the
13
+ deal").
14
+ - **Goals:** references to time-bound targets, OKRs, or measurable outcomes that
15
+ match `knowledge/Goals/` entries.
16
+ - **Priorities:** references to strategic directions that match
17
+ `knowledge/Priorities/` entries.
18
+
19
+ ## Matching
20
+
21
+ | Source has | Note has | Match if |
22
+ | ------------------------ | ------------------------ | ------------------------- |
23
+ | First name "Sarah" | Full name "Sarah Chen" | Same organization context |
24
+ | Email "sarah@acme.com" | Email field | Exact match |
25
+ | Email domain "@acme.com" | Organization "Acme Corp" | Domain matches org |
26
+ | Any variant | Aliases field | Listed in aliases |
27
+
28
+ ## Disambiguation priority
29
+
30
+ Email match > Organization context > Role match > Aliases > Recency.
31
+
32
+ If still ambiguous, **skip** rather than guess.
33
+
34
+ ## "Would I prep for this person?" — Step 5
35
+
36
+ Apply for entities not resolved to existing notes (meetings only).
37
+
38
+ **Create a note for:**
39
+
40
+ - Decision makers or key contacts at customers, prospects, partners.
41
+ - Investors or potential investors.
42
+ - Candidates being interviewed.
43
+ - Advisors or mentors with ongoing relationships.
44
+ - Introducers who connect you to valuable contacts.
45
+
46
+ **Do not create notes for:**
47
+
48
+ - Transactional service providers (bank employees, support reps).
49
+ - One-time administrative contacts.
50
+ - Large-group attendees you didn't interact with.
51
+ - Assistants handling only logistics.
52
+
53
+ People who don't get their own note go in the Organization note's `## Contacts`
54
+ section instead.
55
+
56
+ ## Role inference
57
+
58
+ When role isn't explicit, infer from context and qualify with the basis:
59
+
60
+ - Organizer of a cross-company meeting → likely senior or partnerships.
61
+ - Technical questions → likely engineering.
62
+ - Pricing questions → likely procurement or finance.
63
+ - "I'll need to check with my team" → manager.
64
+ - "I can make that call" → decision maker.
65
+
66
+ Format: `**Role:** Product Lead (inferred from evaluation discussions)`.
67
+
68
+ ## Never auto-create
69
+
70
+ `Goals/` and `Priorities/`. Link to existing entries when referenced; update
71
+ progress / backlinks; never create new ones from extracted content.
@@ -0,0 +1,70 @@
1
+ # Source Classification
2
+
3
+ Reference for `extract-entities` Step 1.
4
+
5
+ ## Type detection
6
+
7
+ - `Meeting:` / `Attendees:` / `Transcript:` headers → **meeting** (creates
8
+ notes).
9
+ - `From:` and `To:` or `Subject:` → **email** (updates only).
10
+ - `**Platform:** Microsoft Teams` → **teams chat** (updates only).
11
+ - File in `Voice Memos/` → **voice memo** (creates notes).
12
+ - File in `apple_calendar/` → **calendar event** (enriches existing notes only).
13
+ - Ad-hoc document (from `~/Desktop/`, `~/Downloads/`, or another skill passing
14
+ the path) → **document** (creates notes — meeting rules).
15
+
16
+ ## Always process — never skip
17
+
18
+ Calendar events. Internal-only meetings still enrich Project and Topic notes
19
+ (decisions, agenda items). Only skip all-day placeholders with no attendees and
20
+ no description (e.g. "Block", "OOO").
21
+
22
+ ## Skip entirely
23
+
24
+ - Newsletters (unsubscribe links, "View in browser", bulk-sender indicators).
25
+ - Marketing emails (promotional language, no-reply senders).
26
+ - Automated notifications (GitHub, Jira, Slack, CI/CD, shipping).
27
+ - Spam / cold outreach with no existing relationship.
28
+ - Product-update emails, release notes, changelogs.
29
+ - Social-media notifications.
30
+ - Receipts and order confirmations.
31
+ - Calendar-invite emails that are just logistics.
32
+ - Mass emails (many recipients, mailing-list headers).
33
+
34
+ ## Process — update existing notes only
35
+
36
+ - Emails from people already in `knowledge/People/`.
37
+ - Emails referencing existing projects or organizations.
38
+
39
+ ## Process — can create new notes
40
+
41
+ - Meeting transcripts with external attendees.
42
+ - Voice memos.
43
+ - Ad-hoc documents.
44
+
45
+ ## Warm-intro exception
46
+
47
+ If an email is a warm introduction from someone with a note, and they introduce
48
+ a new person, **create** a note for the introduced person.
49
+
50
+ Signals: subject contains "Intro:", "Introduction:", "Meet", "Connecting"; body
51
+ contains "introduce you to", "want to connect", "meet [Name]"; new person is
52
+ CC'd.
53
+
54
+ ## Self-exclusion
55
+
56
+ Never create or update notes for the user (matches name, email, or @domain from
57
+ `USER.md`) or for `@{user.domain}` colleagues.
58
+
59
+ ## Source-type rules summary
60
+
61
+ | Source type | Creates notes? | Updates notes? | Detects state changes? |
62
+ | ----------------------- | --------------- | -------------- | ---------------------- |
63
+ | Calendar event | No | Yes (always) | Yes |
64
+ | Meeting | Yes | Yes | Yes |
65
+ | Voice memo | Yes | Yes | Yes |
66
+ | Ad-hoc document | Yes | Yes | Yes |
67
+ | Email (known contact) | No | Yes | Yes |
68
+ | Email (unknown contact) | No (SKIP) | No | No |
69
+ | Email (warm intro) | Yes (exception) | Yes | Yes |
70
+ | Teams chat | No | Yes | Yes |
@@ -0,0 +1,36 @@
1
+ # Condition Template
2
+
3
+ Conditions are time-bound organizational states that affect multiple entities.
4
+ They can be **auto-created** by the librarian agent when cross-cutting patterns
5
+ are detected, or manually created by the user. Lifecycle: active → resolved.
6
+
7
+ ```markdown
8
+ # {Condition Name}
9
+
10
+ ## Info
11
+ **Status:** {active|resolved}
12
+ **Since:** {YYYY-MM-DD}
13
+ **Resolved:** {YYYY-MM-DD or —}
14
+ **Trigger:** {What caused this condition}
15
+ **Blocker:** {Who/what must act for this to resolve}
16
+ **Resolution signal:** {What would indicate this condition has ended}
17
+
18
+ ## Affects
19
+ {Goals, Projects, Roles, and People impacted by this condition}
20
+ - [[Goals/{Goal}]] — {how it's affected}
21
+ - [[Projects/{Project}]] — {how it's affected}
22
+ - [[Roles/{Role}]] — {how it's affected}
23
+
24
+ ## Agent implications
25
+ {How agents should modify their behavior while this condition is active}
26
+ - **recruiter:** {e.g. "Hold offers. Continue interviews. Contractor route viable."}
27
+ - **postman:** {e.g. "Don't flag recruitment emails as urgent."}
28
+ - **chief-of-staff:** {e.g. "Surface in every briefing until resolved."}
29
+ - **head-hunter:** {e.g. "Continue scouting but note freeze in prospect notes."}
30
+
31
+ ## Activity
32
+ - **{YYYY-MM-DD}** ({source}): {Update — new information, escalation, progress toward resolution}
33
+
34
+ ## Key facts
35
+ {substantive facts only — leave empty if none}
36
+ ```