@forwardimpact/outpost 3.12.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
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Scan for unprocessed emails and output their IDs and subjects.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* line per unprocessed thread:
|
|
8
|
-
*
|
|
5
|
+
* The script checks ~/.cache/fit/outpost/apple_mail/ for email thread markdown
|
|
6
|
+
* files. It skips a file that Drafts/handled or Drafts/ignored already lists.
|
|
7
|
+
* It outputs one tab-separated line per unprocessed thread:
|
|
8
|
+
* email_id<TAB>subject. The draft-emails skill uses this script to find
|
|
9
|
+
* threads that need a reply.
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
/**
|
|
3
|
-
* Send an email
|
|
3
|
+
* Send an email through Apple Mail with AppleScript.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* Apple Mail. The script writes a temporary
|
|
7
|
-
*
|
|
5
|
+
* The script builds an AppleScript command. That command creates an outgoing
|
|
6
|
+
* message and sends it through Apple Mail. The script writes a temporary
|
|
7
|
+
* .scpt file. It runs the file with osascript. It then deletes the file.
|
|
8
|
+
* Mail.app must run.
|
|
8
9
|
*
|
|
9
|
-
*
|
|
10
|
-
* or sign-off
|
|
10
|
+
* Use plain text for the body. Do not use HTML. Do NOT include an email
|
|
11
|
+
* signature or sign-off. Apple Mail appends the user's configured signature
|
|
12
|
+
* automatically.
|
|
11
13
|
*/
|
|
12
14
|
|
|
13
15
|
import { execFileSync } from "node:child_process";
|
|
@@ -20,7 +22,7 @@ import {
|
|
|
20
22
|
import { basename, join } from "node:path";
|
|
21
23
|
import { tmpdir } from "node:os";
|
|
22
24
|
|
|
23
|
-
const HELP = `send-email — send an email
|
|
25
|
+
const HELP = `send-email — send an email through Apple Mail
|
|
24
26
|
|
|
25
27
|
Usage: node scripts/send-email.mjs --to <addrs> --subject <subj> --body <text> [options]
|
|
26
28
|
|
|
@@ -30,10 +32,10 @@ Options:
|
|
|
30
32
|
--bcc <addrs> Comma-separated BCC recipients
|
|
31
33
|
--subject <subj> Email subject line (required)
|
|
32
34
|
--body <text> Plain-text email body (required)
|
|
33
|
-
--draft <path> Draft file
|
|
35
|
+
--draft <path> Draft file. The script deletes it after send and appends the ID to Drafts/handled
|
|
34
36
|
-h, --help Show this help message and exit
|
|
35
37
|
|
|
36
|
-
Mail.app must
|
|
38
|
+
Mail.app must run. You need no signature or sign-off. Apple Mail appends it.`;
|
|
37
39
|
|
|
38
40
|
if (process.argv.includes("-h") || process.argv.includes("--help")) {
|
|
39
41
|
console.log(HELP);
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
---
|
|
2
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/)
|
|
3
|
+
description: Process synced email/calendar files from ~/.cache/fit/outpost/ and ad-hoc document files (e.g. from ~/Desktop/ or ~/Downloads/). Extract structured knowledge into Knowledge/ as Obsidian-compatible markdown notes. Use on a schedule, when the user asks to process/extract entities, or when another skill invokes it (e.g. organize-files). Builds the core knowledge graph from raw data.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Extract Entities
|
|
7
7
|
|
|
8
8
|
Process synced email and calendar files from `~/.cache/fit/outpost/`, plus
|
|
9
|
-
ad-hoc documents
|
|
10
|
-
under `Knowledge/`.
|
|
9
|
+
ad-hoc documents from other skills, into Obsidian-compatible markdown notes
|
|
10
|
+
under `Knowledge/`. This skill builds the core knowledge graph.
|
|
11
11
|
|
|
12
12
|
## Trigger
|
|
13
13
|
|
|
14
|
-
-
|
|
14
|
+
- The schedule runs every 15 minutes for synced data.
|
|
15
15
|
- The user asks to process / extract entities from synced data.
|
|
16
|
-
- Another skill passes ad-hoc file paths (e.g. `organize-files` after
|
|
17
|
-
`~/Desktop/` and `~/Downloads/`).
|
|
16
|
+
- Another skill passes ad-hoc file paths (e.g. `organize-files` after it
|
|
17
|
+
organises `~/Desktop/` and `~/Downloads/`).
|
|
18
18
|
|
|
19
19
|
## Prerequisites
|
|
20
20
|
|
|
21
21
|
- Synced data in `~/.cache/fit/outpost/` and/or ad-hoc paths.
|
|
22
|
-
- User identity from
|
|
22
|
+
- User identity from the `person-identify` skill. That skill writes
|
|
23
23
|
`~/.cache/fit/outpost/state/identity.md` (Name, Email, Domain).
|
|
24
24
|
|
|
25
25
|
## Inputs
|
|
@@ -31,7 +31,7 @@ under `Knowledge/`. The core knowledge-graph builder.
|
|
|
31
31
|
- `~/.cache/fit/outpost/state/graph_processed` — processed-file index (TSV,
|
|
32
32
|
shared with `req-track` and `anarlog-process`).
|
|
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
|
|
|
@@ -39,54 +39,54 @@ under `Knowledge/`. The core knowledge-graph builder.
|
|
|
39
39
|
`Knowledge/Topics/` — created or updated.
|
|
40
40
|
- `Knowledge/Priorities/` — **updated only**, never
|
|
41
41
|
auto-created.
|
|
42
|
-
- `Knowledge/Conditions/` — created when cross-cutting patterns
|
|
42
|
+
- `Knowledge/Conditions/` — created when you detect cross-cutting patterns, or
|
|
43
43
|
updated.
|
|
44
44
|
- `Knowledge/Roles/*.md`, `Knowledge/Candidates/*/brief.md` — enriched with
|
|
45
|
-
inferred metadata.
|
|
45
|
+
inferred metadata. Create new role stubs with `**Status:** open`. Update to
|
|
46
46
|
`**Status:** closed` when a role closes.
|
|
47
47
|
- `~/.cache/fit/outpost/state/graph_processed` — updated.
|
|
48
48
|
|
|
49
49
|
<do_confirm_checklist goal="Verify the batch produced clean, linked,
|
|
50
50
|
well-grounded notes">
|
|
51
51
|
|
|
52
|
-
- [ ]
|
|
53
|
-
create, emails only update).
|
|
54
|
-
- [ ]
|
|
55
|
-
- [ ] "Would I prep?" test
|
|
56
|
-
a substantive `## Summary
|
|
57
|
-
`## Contacts
|
|
58
|
-
- [ ]
|
|
59
|
-
consistent (incl. Project ↔ Priority).
|
|
60
|
-
- [ ]
|
|
61
|
-
substantive
|
|
62
|
-
- [ ]
|
|
63
|
-
|
|
64
|
-
- [ ]
|
|
65
|
-
state
|
|
66
|
-
- [ ] Recruitment: Req numbers
|
|
67
|
-
HM/recruiter/domain-lead
|
|
68
|
-
- [ ] `graph_processed`
|
|
52
|
+
- [ ] Identify the source type correctly. Apply the meeting-vs-email rules
|
|
53
|
+
(meetings create, emails only update).
|
|
54
|
+
- [ ] Exclude yourself and `@user.domain` from the extraction.
|
|
55
|
+
- [ ] Apply the "Would I prep?" test. Write no stub profiles. Give every new
|
|
56
|
+
People note a substantive `## Summary`. Route calendar-only attendees to
|
|
57
|
+
the Organization `## Contacts` section.
|
|
58
|
+
- [ ] Use absolute paths `[[Folder/Name]]` for all links. Keep bidirectional
|
|
59
|
+
links consistent (incl. Project ↔ Priority).
|
|
60
|
+
- [ ] Describe the relationship in each summary. Omit the communication
|
|
61
|
+
method. Make key facts substantive. Make open items commitments.
|
|
62
|
+
- [ ] Log state changes with `[Field → value]`. Never auto-create a Priority
|
|
63
|
+
entity.
|
|
64
|
+
- [ ] Create a Condition only when ≥ 3 entities reference the same
|
|
65
|
+
cross-cutting state. Detect resolution when the evidence supports it.
|
|
66
|
+
- [ ] Recruitment: detect Req numbers and create or enrich Role files. Infer
|
|
67
|
+
HM/recruiter/domain-lead where the evidence strongly supports it.
|
|
68
|
+
- [ ] Update `graph_processed` for every processed file.
|
|
69
69
|
|
|
70
70
|
</do_confirm_checklist>
|
|
71
71
|
|
|
72
72
|
## Procedure
|
|
73
73
|
|
|
74
|
-
Process **10 files per run**. Write **one file at a time
|
|
74
|
+
Process **10 files per run**. Write **one file at a time**. Do not batch
|
|
75
75
|
writes.
|
|
76
76
|
|
|
77
77
|
### 0. Load context and pick the batch
|
|
78
78
|
|
|
79
|
-
Read the user's identity from `~/.cache/fit/outpost/state/identity.md
|
|
80
|
-
`person-identify` skill first if
|
|
81
|
-
files:
|
|
79
|
+
Read the user's identity from `~/.cache/fit/outpost/state/identity.md`. Run the
|
|
80
|
+
`person-identify` skill first if the file is missing or stale. Find new or
|
|
81
|
+
changed files:
|
|
82
82
|
|
|
83
83
|
```bash
|
|
84
84
|
node scripts/state.mjs check
|
|
85
85
|
```
|
|
86
86
|
|
|
87
|
-
Each line is a path. When
|
|
88
|
-
|
|
89
|
-
`graph_processed
|
|
87
|
+
Each line is a path. When another skill gives you ad-hoc paths, process those
|
|
88
|
+
directly. Do not scan `~/.cache/fit/outpost/`. Still check each path against
|
|
89
|
+
`graph_processed`. Skip a path when its hash did not change.
|
|
90
90
|
|
|
91
91
|
### 1. Build the knowledge index
|
|
92
92
|
|
|
@@ -96,27 +96,28 @@ find Knowledge/People Knowledge/Organizations Knowledge/Projects \
|
|
|
96
96
|
Knowledge/Conditions -name "*.md" 2>/dev/null
|
|
97
97
|
```
|
|
98
98
|
|
|
99
|
-
|
|
100
|
-
Organizations, Projects, Priorities, Topics by name, email,
|
|
101
|
-
role, status, and aliases.
|
|
99
|
+
Run `head -20` on each note to capture the key fields. Build a mental index of
|
|
100
|
+
People, Organizations, Projects, Priorities, Topics by name, email,
|
|
101
|
+
organization, role, status, and aliases.
|
|
102
102
|
|
|
103
103
|
### 2. Classify the source
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
summary
|
|
105
|
+
Find the type-detection rules, the skip rules, the warm-intro exception, and
|
|
106
|
+
the source-type summary in [references/sources.md](references/sources.md).
|
|
107
107
|
|
|
108
108
|
### 3. Read and parse the source
|
|
109
109
|
|
|
110
110
|
- **Emails:** Date, Subject, From, To/Cc, Thread ID, Body.
|
|
111
111
|
- **Meetings:** Date, Attendees, Transcript / Notes.
|
|
112
|
-
- **Ad-hoc documents:** Date (file mtime), Filename, Source path, Content.
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`textutil -convert txt`.
|
|
112
|
+
- **Ad-hoc documents:** Date (file mtime), Filename, Source path, Content. Read
|
|
113
|
+
`.md`, `.txt`, and `.rtf` direct. Read `.pdf` with `pdftotext` or `mdcat`.
|
|
114
|
+
Read `.csv` as-is and look for names, emails, or orgs in the columns. Read
|
|
115
|
+
`.doc` and `.docx` with `textutil -convert txt`.
|
|
116
116
|
|
|
117
117
|
Ad-hoc documents follow **meeting** rules (can create notes).
|
|
118
118
|
|
|
119
|
-
Exclude
|
|
119
|
+
Exclude yourself per
|
|
120
|
+
[references/sources.md](references/sources.md#self-exclusion).
|
|
120
121
|
Collect every name variant per
|
|
121
122
|
[references/resolution.md](references/resolution.md#name-variant-collection).
|
|
122
123
|
|
|
@@ -126,7 +127,7 @@ For each variant, search the knowledge index. Apply the
|
|
|
126
127
|
[matching table](references/resolution.md#matching) and the
|
|
127
128
|
[disambiguation priority](references/resolution.md#disambiguation-priority).
|
|
128
129
|
Priorities are
|
|
129
|
-
[never auto-created](references/resolution.md#never-auto-create)
|
|
130
|
+
[never auto-created](references/resolution.md#never-auto-create). Link to
|
|
130
131
|
existing entries only.
|
|
131
132
|
|
|
132
133
|
### 5. Identify new entities (meetings only)
|
|
@@ -134,42 +135,42 @@ existing entries only.
|
|
|
134
135
|
Apply the
|
|
135
136
|
["Would I prep?" test](references/resolution.md#would-i-prep-for-this-person--step-5)
|
|
136
137
|
and the [role inference rules](references/resolution.md#role-inference). For
|
|
137
|
-
contacts who don't merit their own note, add to the Organization's
|
|
138
|
-
section.
|
|
138
|
+
contacts who don't merit their own note, add them to the Organization's
|
|
139
|
+
`## Contacts` section.
|
|
139
140
|
|
|
140
141
|
### 6. Extract content
|
|
141
142
|
|
|
142
|
-
|
|
143
|
-
[references/content.md](references/content.md). Be
|
|
144
|
-
filler or meta-commentary.
|
|
143
|
+
Find the rules for decisions, commitments, key facts, open items, activity
|
|
144
|
+
lines, and summaries in [references/content.md](references/content.md). Be
|
|
145
|
+
substantive. Never write filler or meta-commentary.
|
|
145
146
|
|
|
146
147
|
### 7. Detect state changes and structural enrichment
|
|
147
148
|
|
|
148
149
|
- **State changes** (Project status, open-item resolution, role / title changes,
|
|
149
|
-
relationship changes): tables in
|
|
150
|
+
relationship changes): see the tables in
|
|
150
151
|
[references/content.md](references/content.md#state-change-tables). Be
|
|
151
|
-
conservative
|
|
152
|
+
conservative. Log inline `[Field → value]`.
|
|
152
153
|
- **Recruitment** (Req-number detection, hiring-manager / recruiter /
|
|
153
|
-
domain-lead inference):
|
|
154
|
+
domain-lead inference): see
|
|
154
155
|
[references/recruitment.md](references/recruitment.md).
|
|
155
|
-
- **Priority links** (Step 7c): rules in
|
|
156
|
+
- **Priority links** (Step 7c): see the rules in
|
|
156
157
|
[references/links.md](references/links.md#priorities-step-7c).
|
|
157
158
|
**Never auto-create.**
|
|
158
|
-
- **Conditions** (cross-cutting states
|
|
159
|
+
- **Conditions** (cross-cutting states that affect ≥ 3 entities): see
|
|
159
160
|
[references/conditions.md](references/conditions.md).
|
|
160
161
|
|
|
161
162
|
### 8. Check for duplicates
|
|
162
163
|
|
|
163
|
-
[references/content.md](references/content.md#duplicate-check-step-8)
|
|
164
|
-
same-day same-source activity entries
|
|
165
|
-
contradictions "(needs clarification)".
|
|
164
|
+
See [references/content.md](references/content.md#duplicate-check-step-8).
|
|
165
|
+
Skip same-day same-source activity entries. Dedupe key facts and open items.
|
|
166
|
+
Mark contradictions "(needs clarification)".
|
|
166
167
|
|
|
167
168
|
### 9. Write updates
|
|
168
169
|
|
|
169
|
-
For **new** entities, use the templates
|
|
170
|
-
[references/TEMPLATES.md](references/TEMPLATES.md).
|
|
170
|
+
For **new** entities, use the templates.
|
|
171
|
+
[references/TEMPLATES.md](references/TEMPLATES.md) indexes them.
|
|
171
172
|
|
|
172
|
-
For **existing** entities,
|
|
173
|
+
For **existing** entities, never rewrite the file. Apply targeted edits:
|
|
173
174
|
|
|
174
175
|
- Add the new activity entry at the **top** of `## Activity` (reverse
|
|
175
176
|
chronological).
|
|
@@ -180,7 +181,7 @@ For **existing** entities, apply targeted edits — never rewrite the file:
|
|
|
180
181
|
|
|
181
182
|
### 10. Ensure bidirectional links
|
|
182
183
|
|
|
183
|
-
After
|
|
184
|
+
After you write, verify that links go both ways. Use the
|
|
184
185
|
[bidirectional link rules](references/links.md#bidirectional-link-rules).
|
|
185
186
|
|
|
186
187
|
### 11. Update graph state
|
|
@@ -189,6 +190,5 @@ After writing, verify links go both ways using the
|
|
|
189
190
|
node scripts/state.mjs update "$FILE"
|
|
190
191
|
```
|
|
191
192
|
|
|
192
|
-
Run for every processed file.
|
|
193
|
-
|
|
194
|
-
input.
|
|
193
|
+
Run for every processed file. `req-track` and `anarlog-process` share the
|
|
194
|
+
state file. So neither skill scans the same input again.
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Note Templates
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
each file under the L5 cap. `anarlog-process` references
|
|
5
|
-
index.
|
|
3
|
+
Use these templates for new knowledge-base notes. One file holds each entity
|
|
4
|
+
family. This keeps each file under the L5 cap. `anarlog-process` references
|
|
5
|
+
this file as the index.
|
|
6
6
|
|
|
7
7
|
- [templates-people-orgs.md](templates-people-orgs.md) — People, Organizations.
|
|
8
8
|
- [templates-projects-topics.md](templates-projects-topics.md) — Projects,
|
|
9
9
|
Topics.
|
|
10
10
|
- [templates-priorities.md](templates-priorities.md) — Priorities.
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
`extract-entities` and `anarlog-process` **never auto-create** them.
|
|
12
|
+
The user sets them.
|
|
13
13
|
- [templates-conditions.md](templates-conditions.md) — Conditions (time-bound
|
|
14
14
|
cross-cutting states).
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Conditions
|
|
2
2
|
|
|
3
3
|
Reference for `extract-entities` Step 7d. Conditions are time-bound
|
|
4
|
-
organizational states
|
|
5
|
-
|
|
6
|
-
knowledge graph.
|
|
4
|
+
organizational states that affect multiple entities at the same time (hiring
|
|
5
|
+
freezes, reorgs, budget holds, leadership transitions). They are the "weather"
|
|
6
|
+
of the knowledge graph.
|
|
7
7
|
|
|
8
8
|
## Detection signals
|
|
9
9
|
|
|
@@ -18,18 +18,18 @@ same constraint or state, suspect a Condition.
|
|
|
18
18
|
| "waiting on", "pending approval from" | "Waiting on leadership decision" | Leadership Decision Pending |
|
|
19
19
|
| "new CTO", "leadership change" | "New CTO starting next month" | Leadership Transition |
|
|
20
20
|
|
|
21
|
-
##
|
|
21
|
+
## Create a Condition
|
|
22
22
|
|
|
23
23
|
1. Check existing: `ls Knowledge/Conditions/ 2>/dev/null`.
|
|
24
|
-
2. **No match:** create a new Condition note
|
|
25
|
-
[templates-conditions.md](templates-conditions.md).
|
|
26
|
-
("Hiring Freeze Q2", "Division Reorg").
|
|
24
|
+
2. **No match:** create a new Condition note with
|
|
25
|
+
[templates-conditions.md](templates-conditions.md). Give it a descriptive
|
|
26
|
+
name ("Hiring Freeze Q2", "Division Reorg").
|
|
27
27
|
3. **Match exists:** update with new activity and any changes to status,
|
|
28
28
|
blocker, or affected entities.
|
|
29
29
|
|
|
30
|
-
##
|
|
30
|
+
## Update affected entities
|
|
31
31
|
|
|
32
|
-
When
|
|
32
|
+
When you create or update a Condition:
|
|
33
33
|
|
|
34
34
|
1. Add `[[Conditions/{Condition}]]` to the `## Affects` section of affected
|
|
35
35
|
Priorities.
|
|
@@ -39,9 +39,9 @@ When a Condition is created or updated:
|
|
|
39
39
|
4. Log the Condition reference in activity entries:
|
|
40
40
|
`- **YYYY-MM-DD** ({source}): {update}. See [[Conditions/{Condition}]]`.
|
|
41
41
|
|
|
42
|
-
##
|
|
42
|
+
## Resolve Conditions
|
|
43
43
|
|
|
44
|
-
Source content indicates the Condition
|
|
44
|
+
Source content indicates the Condition ended: "approved", "freeze lifted",
|
|
45
45
|
"reorg complete", "back on track".
|
|
46
46
|
|
|
47
47
|
- Set `**Status:** resolved`, `**Resolved:** {date}`.
|
|
@@ -51,5 +51,6 @@ Source content indicates the Condition has ended: "approved", "freeze lifted",
|
|
|
51
51
|
## Conservatism
|
|
52
52
|
|
|
53
53
|
Only create Conditions for genuinely cross-cutting states that affect 3+
|
|
54
|
-
entities. A single project
|
|
55
|
-
Condition. A hiring freeze
|
|
54
|
+
entities. A single project that goes "on hold" is a project status change. It is
|
|
55
|
+
**not** a Condition. A hiring freeze that affects 20 roles across 5 teams **is**
|
|
56
|
+
a Condition.
|
|
@@ -15,8 +15,8 @@ Extract owner, action, deadline (if mentioned), status (`open`).
|
|
|
15
15
|
|
|
16
16
|
## Key facts — substantive only
|
|
17
17
|
|
|
18
|
-
Specific numbers (budget, team size, timeline), preferences,
|
|
19
|
-
background, technical requirements, what
|
|
18
|
+
Specific numbers (budget, team size, timeline), preferences, work style,
|
|
19
|
+
background, technical requirements, what people discussed or proposed.
|
|
20
20
|
|
|
21
21
|
**Never include:** meta-commentary about missing data, placeholder text, or
|
|
22
22
|
data-quality observations. If no key facts exist, leave the section empty.
|
|
@@ -40,9 +40,9 @@ background".
|
|
|
40
40
|
Always use canonical names with absolute paths (`[[People/Name]]`,
|
|
41
41
|
`[[Organizations/Name]]`).
|
|
42
42
|
|
|
43
|
-
## Summary — relationship
|
|
43
|
+
## Summary — relationship over method
|
|
44
44
|
|
|
45
|
-
2–3 sentences
|
|
45
|
+
Write 2–3 sentences that answer: "Who is this person and why do I know them?"
|
|
46
46
|
|
|
47
47
|
- **Good:** "VP Engineering at [[Organizations/Acme Corp]] leading the
|
|
48
48
|
[[Projects/Acme Integration]] pilot."
|
|
@@ -84,8 +84,8 @@ Change `- [ ]` → `- [x]` with completion date.
|
|
|
84
84
|
|
|
85
85
|
## Conservatism
|
|
86
86
|
|
|
87
|
-
Only apply clear, unambiguous state changes. If uncertain, add to
|
|
88
|
-
don't change fields.
|
|
87
|
+
Only apply clear, unambiguous state changes. If you are uncertain, add to
|
|
88
|
+
activity but don't change fields.
|
|
89
89
|
|
|
90
90
|
Log changes inline:
|
|
91
91
|
|
|
@@ -95,10 +95,11 @@ Log changes inline:
|
|
|
95
95
|
|
|
96
96
|
## Duplicate check (Step 8)
|
|
97
97
|
|
|
98
|
-
Before
|
|
98
|
+
Before you write:
|
|
99
99
|
|
|
100
100
|
- Look at the Activity section for an existing entry on this date from this
|
|
101
101
|
source.
|
|
102
|
-
- Compare key facts
|
|
102
|
+
- Compare key facts, then skip duplicates.
|
|
103
103
|
- Don't add the same open item twice.
|
|
104
|
-
- If new info contradicts existing, keep both with
|
|
104
|
+
- If new info contradicts the existing info, keep both with
|
|
105
|
+
"(needs clarification)".
|
|
@@ -4,7 +4,7 @@ Reference for `extract-entities` Step 10 and Step 7c (Priorities).
|
|
|
4
4
|
|
|
5
5
|
## Bidirectional link rules
|
|
6
6
|
|
|
7
|
-
After
|
|
7
|
+
After you write, verify each link goes both ways.
|
|
8
8
|
|
|
9
9
|
| If you add... | Then also add... |
|
|
10
10
|
| ---------------------- | -------------------------------------------- |
|
|
@@ -24,10 +24,10 @@ Use absolute paths everywhere: `[[People/Sarah Chen]]`,
|
|
|
24
24
|
Match source themes against priority names and descriptions.
|
|
25
25
|
|
|
26
26
|
- Add `[[Priorities/{Priority}]]` to a Project or Topic `## Related` section if
|
|
27
|
-
not already present.
|
|
27
|
+
it is not already present.
|
|
28
28
|
- Update the Priority's `## Projects` section when a new project emerges that
|
|
29
29
|
serves it.
|
|
30
30
|
|
|
31
|
-
**Never auto-create Priorities.** Don't over-link
|
|
32
|
-
to a Priority through a related Topic doesn't need a redundant direct
|
|
33
|
-
|
|
31
|
+
**Never auto-create Priorities.** Don't over-link. A project that already links
|
|
32
|
+
to a Priority through a related Topic doesn't need a redundant direct link to
|
|
33
|
+
the Priority.
|
|
@@ -15,30 +15,31 @@ distinguishes:
|
|
|
15
15
|
Scan email subjects and bodies for requisition numbers (e.g. 7-digit Workday
|
|
16
16
|
IDs).
|
|
17
17
|
|
|
18
|
-
1. `ls Knowledge/Roles/ | grep "{req_number}"` —
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
1. `ls Knowledge/Roles/ | grep "{req_number}"` — find out whether a Role file
|
|
19
|
+
exists.
|
|
20
|
+
2. **No file:** create a stub with the Role-stub template in `req-track` Step
|
|
21
|
+
0b, and set `**Status:** open`. Search `rg "{req_number}" Knowledge/` for
|
|
21
22
|
context to enrich it.
|
|
22
23
|
3. **File exists:** check the `**Status:**` field. If `open`, check whether the
|
|
23
|
-
email provides new metadata (hiring manager, recruiter, locations)
|
|
24
|
-
the Role file. If `closed`, link for historical reference only
|
|
25
|
-
new candidates
|
|
24
|
+
email provides new metadata (hiring manager, recruiter, locations). Then
|
|
25
|
+
update the Role file. If `closed`, link for historical reference only. Do not
|
|
26
|
+
add new candidates. Do not rebuild tables.
|
|
26
27
|
|
|
27
28
|
## Hiring manager — calendar inference
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
30
|
+
A calendar event title can match an interview pattern ("Interview", "Screening",
|
|
31
|
+
"Screen", "Decomposition", "Panel", "Technical Assessment", "Candidate") and
|
|
32
|
+
also carry a person name. When it does:
|
|
32
33
|
|
|
33
34
|
1. Cross-reference the candidate against `Knowledge/Candidates/`.
|
|
34
35
|
2. Extract the **organizer**. If the organizer isn't the user (per
|
|
35
36
|
`~/.cache/fit/outpost/state/identity.md`),
|
|
36
37
|
they are likely the hiring manager.
|
|
37
|
-
3. Confirm
|
|
38
|
-
indication.
|
|
39
|
-
4. Check the candidate's `brief.md` for a `Req` field
|
|
40
|
-
matching Role file's `Hiring manager` (only if currently `—`).
|
|
41
|
-
5. Set the candidate's `brief.md` `Hiring manager` field if currently `—`.
|
|
38
|
+
3. Confirm the hiring manager. Look up the organizer in `Knowledge/People/` for
|
|
39
|
+
an indication of a manager or HM role.
|
|
40
|
+
4. Check the candidate's `brief.md` for a `Req` field. If you know the req, set
|
|
41
|
+
the matching Role file's `Hiring manager` (only if it is currently `—`).
|
|
42
|
+
5. Set the candidate's `brief.md` `Hiring manager` field if it is currently `—`.
|
|
42
43
|
|
|
43
44
|
## Recruiter — email-thread inference
|
|
44
45
|
|
|
@@ -49,7 +50,7 @@ When a thread references candidates (name match against
|
|
|
49
50
|
2. If a CC'd person's note mentions "recruiter", "talent acquisition", or a
|
|
50
51
|
similar role, they are likely the internal recruiter.
|
|
51
52
|
3. Update the candidate's `brief.md` recruiter field and the matching Role file
|
|
52
|
-
(only if currently `—`).
|
|
53
|
+
(only if it is currently `—`).
|
|
53
54
|
|
|
54
55
|
## Domain lead — reporting-chain resolution
|
|
55
56
|
|
|
@@ -63,6 +64,6 @@ When a hiring manager is newly identified:
|
|
|
63
64
|
|
|
64
65
|
## Conservatism
|
|
65
66
|
|
|
66
|
-
Set hiring manager / domain lead / recruiter only when evidence is strong. A
|
|
67
|
-
single calendar invite
|
|
68
|
-
|
|
67
|
+
Set hiring manager / domain lead / recruiter only when the evidence is strong. A
|
|
68
|
+
single calendar invite from one organizer is suggestive but not conclusive.
|
|
69
|
+
Confirm against People notes or multiple data points before you set the field.
|
|
@@ -4,7 +4,7 @@ Reference for `extract-entities` Steps 2b–5.
|
|
|
4
4
|
|
|
5
5
|
## Name-variant collection
|
|
6
6
|
|
|
7
|
-
Extract every way each entity
|
|
7
|
+
Extract every way a source refers to each entity.
|
|
8
8
|
|
|
9
9
|
- **People:** full names, first / last names, initials, email addresses,
|
|
10
10
|
roles/titles, pronouns with clear antecedents.
|
|
@@ -27,11 +27,12 @@ Extract every way each entity is referenced.
|
|
|
27
27
|
|
|
28
28
|
Email match > Organization context > Role match > Aliases > Recency.
|
|
29
29
|
|
|
30
|
-
If still ambiguous, **skip** rather than guess.
|
|
30
|
+
If it is still ambiguous, **skip** rather than guess.
|
|
31
31
|
|
|
32
32
|
## "Would I prep for this person?" — Step 5
|
|
33
33
|
|
|
34
|
-
Apply
|
|
34
|
+
Apply this test to entities that you did not resolve to existing notes (meetings
|
|
35
|
+
only).
|
|
35
36
|
|
|
36
37
|
**Create a note for:**
|
|
37
38
|
|
|
@@ -48,27 +49,26 @@ Apply for entities not resolved to existing notes (meetings only).
|
|
|
48
49
|
- Large-group attendees you didn't interact with.
|
|
49
50
|
- Calendar-only attendees — people who appear solely on an invite's
|
|
50
51
|
attendee list with no interaction, decision, or discussion attributed to them.
|
|
51
|
-
- Assistants
|
|
52
|
+
- Assistants who handle only logistics.
|
|
52
53
|
|
|
53
54
|
People who don't get their own note go in the Organization note's `## Contacts`
|
|
54
55
|
section instead.
|
|
55
56
|
|
|
56
57
|
## Minimum content bar — no stubs
|
|
57
58
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
instead.
|
|
59
|
+
Create a People note only if you can write a substantive `## Summary` from the
|
|
60
|
+
source. The Summary says who they are, why you know them, and what you work on
|
|
61
|
+
together. **If you cannot write that Summary from the source, do not create the
|
|
62
|
+
note.** Record the contact in the Organization's `## Contacts` section instead.
|
|
63
63
|
|
|
64
64
|
Never write a placeholder profile (name + email + generic role + a boilerplate
|
|
65
65
|
"created from…" line and nothing else). An email address and a meeting invite
|
|
66
66
|
are not, on their own, a reason to create a profile. These stubs add noise
|
|
67
|
-
without signal
|
|
67
|
+
without signal. You must not produce them.
|
|
68
68
|
|
|
69
69
|
## Role inference
|
|
70
70
|
|
|
71
|
-
When role isn't explicit, infer from context
|
|
71
|
+
When the role isn't explicit, infer it from context. Qualify it with the basis:
|
|
72
72
|
|
|
73
73
|
- Organizer of a cross-company meeting → likely senior or partnerships.
|
|
74
74
|
- Technical questions → likely engineering.
|
|
@@ -80,5 +80,5 @@ Format: `**Role:** Product Lead (inferred from evaluation discussions)`.
|
|
|
80
80
|
|
|
81
81
|
## Never auto-create
|
|
82
82
|
|
|
83
|
-
`Priorities/`. Link to existing entries when
|
|
84
|
-
progress / backlinks
|
|
83
|
+
`Priorities/`. Link to existing entries when a source references them. Update
|
|
84
|
+
progress / backlinks. Never create new ones from extracted content.
|
|
@@ -19,11 +19,11 @@ Calendar events. Internal-only meetings still enrich Project and Topic notes
|
|
|
19
19
|
(decisions, agenda items). Only skip all-day placeholders with no attendees and
|
|
20
20
|
no description (e.g. "Block", "OOO").
|
|
21
21
|
|
|
22
|
-
**Stub guard:** calendar attendance alone never creates a People note
|
|
23
|
-
events only *enrich* existing notes (see the table below).
|
|
24
|
-
only on the invite list, with no interaction or decision
|
|
25
|
-
|
|
26
|
-
write a placeholder profile
|
|
22
|
+
**Stub guard:** calendar attendance alone never creates a People note. Calendar
|
|
23
|
+
events only *enrich* existing notes (see the table below). Do not profile an
|
|
24
|
+
attendee who is only on the invite list, with no interaction or decision
|
|
25
|
+
attributed to them. If they matter, they go in the Organization's `## Contacts`.
|
|
26
|
+
Never write a placeholder profile. See the
|
|
27
27
|
[minimum content bar](resolution.md#minimum-content-bar--no-stubs).
|
|
28
28
|
|
|
29
29
|
## Skip entirely
|
|
@@ -54,9 +54,9 @@ write a placeholder profile; see the
|
|
|
54
54
|
If an email is a warm introduction from someone with a note, and they introduce
|
|
55
55
|
a new person, **create** a note for the introduced person.
|
|
56
56
|
|
|
57
|
-
Signals: subject contains "Intro:", "Introduction:", "Meet",
|
|
58
|
-
contains "introduce you to", "want to connect",
|
|
59
|
-
|
|
57
|
+
Signals: the subject contains "Intro:", "Introduction:", "Meet", or
|
|
58
|
+
"Connecting". The body contains "introduce you to", "want to connect", or
|
|
59
|
+
"meet [Name]". The sender CCs the new person.
|
|
60
60
|
|
|
61
61
|
## Self-exclusion
|
|
62
62
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Condition Template
|
|
2
2
|
|
|
3
3
|
Conditions are time-bound organizational states that affect multiple entities.
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
The librarian agent can **auto-create** them when it detects cross-cutting
|
|
5
|
+
patterns. The user can also create them manually. Lifecycle: active → resolved.
|
|
6
6
|
|
|
7
7
|
```markdown
|
|
8
8
|
# {Condition Name}
|