@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.
- package/LICENSE +201 -0
- package/README.md +15 -0
- package/bin/fit-outpost.js +3 -0
- package/config/scheduler.json +34 -0
- package/package.json +63 -0
- package/src/agent-runner.js +189 -0
- package/src/index.js +5 -0
- package/src/kb-manager.js +228 -0
- package/src/outpost.js +417 -0
- package/src/scheduler.js +195 -0
- package/src/socket-server.js +336 -0
- package/src/state-manager.js +126 -0
- package/templates/.claude/agents/chief-of-staff.md +58 -0
- package/templates/.claude/agents/concierge.md +46 -0
- package/templates/.claude/agents/head-hunter.md +57 -0
- package/templates/.claude/agents/librarian.md +60 -0
- package/templates/.claude/agents/postman.md +47 -0
- package/templates/.claude/agents/recruiter.md +63 -0
- package/templates/.claude/settings.json +88 -0
- package/templates/.claude/skills/candidate-report/SKILL.md +139 -0
- package/templates/.claude/skills/candidate-report/references/report-template.html +203 -0
- package/templates/.claude/skills/candidate-report/references/report.css +438 -0
- package/templates/.claude/skills/candidate-report/references/rubric.md +76 -0
- package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +48 -0
- package/templates/.claude/skills/deck-create/SKILL.md +75 -0
- package/templates/.claude/skills/deck-create/references/slide.css +35 -0
- package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +47 -0
- package/templates/.claude/skills/deck-summarize/SKILL.md +139 -0
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +85 -0
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +210 -0
- package/templates/.claude/skills/doc-collab/SKILL.md +112 -0
- package/templates/.claude/skills/doc-create/SKILL.md +105 -0
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +50 -0
- package/templates/.claude/skills/draft-emails/SKILL.md +141 -0
- package/templates/.claude/skills/draft-emails/references/template.md +26 -0
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +66 -0
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +139 -0
- package/templates/.claude/skills/extract-entities/SKILL.md +187 -0
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +14 -0
- package/templates/.claude/skills/extract-entities/references/conditions.md +55 -0
- package/templates/.claude/skills/extract-entities/references/content.md +104 -0
- package/templates/.claude/skills/extract-entities/references/links.md +48 -0
- package/templates/.claude/skills/extract-entities/references/recruitment.md +57 -0
- package/templates/.claude/skills/extract-entities/references/resolution.md +71 -0
- package/templates/.claude/skills/extract-entities/references/sources.md +70 -0
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +36 -0
- package/templates/.claude/skills/extract-entities/references/templates-goals-priorities.md +63 -0
- package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +67 -0
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +68 -0
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +131 -0
- package/templates/.claude/skills/hyprnote-follow/SKILL.md +174 -0
- package/templates/.claude/skills/hyprnote-follow/references/coaching.md +118 -0
- package/templates/.claude/skills/hyprnote-follow/references/debrief.md +59 -0
- package/templates/.claude/skills/hyprnote-follow/references/meeting-types.md +14 -0
- package/templates/.claude/skills/hyprnote-follow/scripts/follow.mjs +243 -0
- package/templates/.claude/skills/hyprnote-process/SKILL.md +147 -0
- package/templates/.claude/skills/hyprnote-process/references/extraction.md +84 -0
- package/templates/.claude/skills/hyprnote-process/references/sessions.md +81 -0
- package/templates/.claude/skills/hyprnote-process/scripts/scan.mjs +246 -0
- package/templates/.claude/skills/hyprnote-trim/SKILL.md +177 -0
- package/templates/.claude/skills/manage-tasks/SKILL.md +152 -0
- package/templates/.claude/skills/manage-tasks/references/format.md +73 -0
- package/templates/.claude/skills/meeting-prep/SKILL.md +180 -0
- package/templates/.claude/skills/organize-files/SKILL.md +146 -0
- package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +105 -0
- package/templates/.claude/skills/organize-files/scripts/summarize.mjs +91 -0
- package/templates/.claude/skills/req-assess/SKILL.md +137 -0
- package/templates/.claude/skills/req-assess/references/interview-template.md +62 -0
- package/templates/.claude/skills/req-assess/references/panel-template.md +117 -0
- package/templates/.claude/skills/req-assess/references/rubric.md +65 -0
- package/templates/.claude/skills/req-decide/SKILL.md +163 -0
- package/templates/.claude/skills/req-decide/references/rubric.md +63 -0
- package/templates/.claude/skills/req-decide/references/template.md +118 -0
- package/templates/.claude/skills/req-forget/SKILL.md +154 -0
- package/templates/.claude/skills/req-forget/references/classify.md +23 -0
- package/templates/.claude/skills/req-forget/references/locations.md +59 -0
- package/templates/.claude/skills/req-forget/references/report-template.md +67 -0
- package/templates/.claude/skills/req-scan/SKILL.md +145 -0
- package/templates/.claude/skills/req-scan/references/fallbacks.md +76 -0
- package/templates/.claude/skills/req-scan/references/filters.md +83 -0
- package/templates/.claude/skills/req-scan/references/sources.md +76 -0
- package/templates/.claude/skills/req-scan/references/state.md +54 -0
- package/templates/.claude/skills/req-scan/references/template.md +36 -0
- package/templates/.claude/skills/req-scan/scripts/state.mjs +396 -0
- package/templates/.claude/skills/req-screen/SKILL.md +151 -0
- package/templates/.claude/skills/req-screen/references/rubric.md +94 -0
- package/templates/.claude/skills/req-screen/references/template.md +91 -0
- package/templates/.claude/skills/req-track/SKILL.md +189 -0
- package/templates/.claude/skills/req-track/references/fields.md +114 -0
- package/templates/.claude/skills/req-track/references/signals.md +42 -0
- package/templates/.claude/skills/req-track/references/statuses.md +32 -0
- package/templates/.claude/skills/req-track/references/templates.md +127 -0
- package/templates/.claude/skills/req-workday/SKILL.md +162 -0
- package/templates/.claude/skills/req-workday/references/field-mapping.md +40 -0
- package/templates/.claude/skills/req-workday/references/status-mapping.md +38 -0
- package/templates/.claude/skills/req-workday/references/templates.md +126 -0
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +56 -0
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +313 -0
- package/templates/.claude/skills/send-chat/SKILL.md +170 -0
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +145 -0
- package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +80 -0
- package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +307 -0
- package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +332 -0
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +151 -0
- package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +115 -0
- package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +389 -0
- package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +372 -0
- package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +239 -0
- package/templates/.claude/skills/sync-teams/SKILL.md +177 -0
- package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +147 -0
- package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +288 -0
- package/templates/.claude/skills/sync-teams/scripts/sync.mjs +381 -0
- package/templates/.claude/skills/upstream-skill/SKILL.md +130 -0
- package/templates/.claude/skills/upstream-skill/references/examples.md +80 -0
- package/templates/.claude/skills/weekly-update/SKILL.md +141 -0
- package/templates/.claude/skills/weekly-update/references/template.md +55 -0
- package/templates/CLAUDE.md +134 -0
- package/templates/USER.md +3 -0
- package/templates/apm.yml +5 -0
- 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
|
+
```
|