@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.
Files changed (114) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +4 -4
  4. package/src/agent-path.js +10 -6
  5. package/src/agent-runner.js +28 -24
  6. package/src/index.js +2 -3
  7. package/src/kb-manager.js +21 -19
  8. package/src/outpost.js +37 -33
  9. package/src/posture.js +3 -3
  10. package/src/privilege.js +11 -11
  11. package/src/scheduler.js +14 -12
  12. package/src/socket-server.js +19 -18
  13. package/src/spawn-env.js +7 -6
  14. package/src/state-manager.js +2 -2
  15. package/templates/.claude/agents/chief-of-staff.md +22 -22
  16. package/templates/.claude/agents/concierge.md +19 -17
  17. package/templates/.claude/agents/head-hunter.md +27 -26
  18. package/templates/.claude/agents/librarian.md +17 -16
  19. package/templates/.claude/agents/postman.md +19 -18
  20. package/templates/.claude/agents/recruiter.md +31 -27
  21. package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
  22. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  23. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
  24. package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
  25. package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
  26. package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
  27. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
  28. package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
  29. package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
  30. package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
  31. package/templates/.claude/skills/candidate-report/references/report.css +4 -4
  32. package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
  33. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
  34. package/templates/.claude/skills/changelog/SKILL.md +55 -50
  35. package/templates/.claude/skills/deck-create/SKILL.md +30 -30
  36. package/templates/.claude/skills/deck-create/references/slide.css +4 -4
  37. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
  38. package/templates/.claude/skills/deck-review/SKILL.md +59 -57
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
  44. package/templates/.claude/skills/doc-create/SKILL.md +21 -20
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
  50. package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +5 -5
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
  57. package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
  59. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
  60. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  61. package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
  62. package/templates/.claude/skills/organize-files/SKILL.md +24 -22
  63. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  64. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  65. package/templates/.claude/skills/person-identify/SKILL.md +24 -22
  66. package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
  67. package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
  68. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
  69. package/templates/.claude/skills/req-assess/SKILL.md +27 -27
  70. package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
  71. package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
  72. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  73. package/templates/.claude/skills/req-decide/SKILL.md +28 -25
  74. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  75. package/templates/.claude/skills/req-forget/SKILL.md +28 -26
  76. package/templates/.claude/skills/req-forget/references/classify.md +13 -13
  77. package/templates/.claude/skills/req-forget/references/locations.md +2 -2
  78. package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
  79. package/templates/.claude/skills/req-scan/SKILL.md +21 -22
  80. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  81. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  82. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  83. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  85. package/templates/.claude/skills/req-screen/SKILL.md +31 -29
  86. package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
  87. package/templates/.claude/skills/req-screen/references/template.md +4 -4
  88. package/templates/.claude/skills/req-track/SKILL.md +40 -40
  89. package/templates/.claude/skills/req-track/references/fields.md +19 -18
  90. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  91. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  92. package/templates/.claude/skills/req-track/references/templates.md +4 -4
  93. package/templates/.claude/skills/req-workday/SKILL.md +24 -24
  94. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  95. package/templates/.claude/skills/req-workday/references/templates.md +13 -13
  96. package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
  97. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
  98. package/templates/.claude/skills/send-chat/SKILL.md +47 -43
  99. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
  100. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  101. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  103. package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
  104. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  105. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  106. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  108. package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
  109. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  110. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  111. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  112. package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
  113. package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
  114. package/templates/CLAUDE.md +40 -37
@@ -2,10 +2,11 @@
2
2
  /**
3
3
  * Scan for unprocessed emails and output their IDs and subjects.
4
4
  *
5
- * Checks ~/.cache/fit/outpost/apple_mail/ for email thread markdown files not
6
- * yet listed in Drafts/handled or Drafts/ignored. Outputs one tab-separated
7
- * line per unprocessed thread: email_id<TAB>subject. Used by the draft-emails
8
- * skill to identify threads that need a reply.
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 via Apple Mail using AppleScript.
3
+ * Send an email through Apple Mail with AppleScript.
4
4
  *
5
- * Builds an AppleScript command to create and send an outgoing message through
6
- * Apple Mail. The script writes a temporary .scpt file, executes it with
7
- * osascript, and cleans up afterwards. Mail.app must be running.
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
- * The body should be plain text no HTML. Do NOT include an email signature
10
- * or sign-off; Apple Mail appends the user's configured signature automatically.
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 via Apple Mail
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 deleted after send, ID appended to Drafts/handled
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 be running. No signature or sign-off needed — Apple Mail appends it.`;
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/) 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.
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 passed by other skills, into Obsidian-compatible markdown notes
10
- under `Knowledge/`. The core knowledge-graph builder.
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
- - Schedule (every 15 minutes) for synced data.
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 organising
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 running the `person-identify` skill, which writes
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
- (written by the `person-identify` skill).
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 are detected, or
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. New role stubs created with `**Status:** open`; update to
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
- - [ ] Source type correctly identified; meeting-vs-email rules applied (meetings
53
- create, emails only update).
54
- - [ ] Self and `@user.domain` excluded from extraction.
55
- - [ ] "Would I prep?" test applied; no stub profiles every new People note has
56
- a substantive `## Summary`, calendar-only attendees routed to Organization
57
- `## Contacts`.
58
- - [ ] All links use absolute paths `[[Folder/Name]]`; bidirectional links
59
- consistent (incl. Project ↔ Priority).
60
- - [ ] Summaries describe relationship, not communication method; key facts are
61
- substantive; open items are commitments.
62
- - [ ] State changes logged with `[Field → value]`; no Priority entities
63
- auto-created.
64
- - [ ] Conditions created only when ≥ 3 entities reference the same cross-cutting
65
- state; resolution detected when evidence supports.
66
- - [ ] Recruitment: Req numbers detected and Role files created/enriched;
67
- HM/recruiter/domain-lead inferred where strongly supported.
68
- - [ ] `graph_processed` updated for every processed file.
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** do not batch
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` (run the
80
- `person-identify` skill first if it is missing or stale). Find new/changed
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 invoked with ad-hoc paths, process those directly
88
- instead of scanning `~/.cache/fit/outpost/` still check each against
89
- `graph_processed` and skip when the hash hasn't changed.
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
- For each note, `head -20` to capture key fields. Build a mental index of People,
100
- Organizations, Projects, Priorities, Topics by name, email, organization,
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
- Type detection, skip rules, warm-intro exception, and the source-type rules
106
- summary: [references/sources.md](references/sources.md).
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. `.md`
113
- / `.txt` / `.rtf` direct; `.pdf` via `pdftotext` or `mdcat`; `.csv` as-is
114
- (look for names / emails / orgs in columns); `.doc` / `.docx` via
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 self per [references/sources.md](references/sources.md#self-exclusion).
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) link to
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 `## Contacts`
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
- Decisions, commitments, key facts, open items, activity lines, summaries:
143
- [references/content.md](references/content.md). Be substantive; never write
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; log inline `[Field → value]`.
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 affecting ≥ 3 entities):
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) — skip
164
- same-day same-source activity entries, dedupe key facts and open items, mark
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 indexed by
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, apply targeted edits — never rewrite the file:
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 writing, verify links go both ways using the
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. The state file is shared with `req-track` and
193
- `anarlog-process`, so this prevents either skill from re-scanning the same
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
- Templates for creating new knowledge-base notes. Split by entity family to keep
4
- each file under the L5 cap. `anarlog-process` references this file as the
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
- **Never auto-created** by `extract-entities` or `anarlog-process`
12
- set by the user.
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 (hiring freezes, reorgs, budget holds, leadership
5
- transitions) that affect multiple entities simultaneously the "weather" of the
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
- ## Creating a Condition
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 using
25
- [templates-conditions.md](templates-conditions.md). Name descriptively
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
- ## Updating affected entities
30
+ ## Update affected entities
31
31
 
32
- When a Condition is created or updated:
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
- ## Resolving Conditions
42
+ ## Resolve Conditions
43
43
 
44
- Source content indicates the Condition has ended: "approved", "freeze lifted",
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 being "on hold" is a project status change, **not** a
55
- Condition. A hiring freeze affecting 20 roles across 5 teams **is** a Condition.
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, working style,
19
- background, technical requirements, what was discussed or proposed.
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 not method
43
+ ## Summary — relationship over method
44
44
 
45
- 2–3 sentences answering: "Who is this person and why do I know them?"
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 activity but
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 writing:
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; skip duplicates.
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 "(needs clarification)".
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 writing, verify each link goes both ways.
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 a project that already links
32
- to a Priority through a related Topic doesn't need a redundant direct Priority
33
- link.
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}"` — does a Role file exist?
19
- 2. **No file:** create a stub using the Role-stub template in `req-track` Step
20
- 0b, with `**Status:** open`. Search `rg "{req_number}" Knowledge/` for
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) and update
24
- the Role file. If `closed`, link for historical reference only; do not add
25
- new candidates or rebuild tables.
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
- When a calendar event title matches an interview pattern "Interview",
30
- "Screening", "Screen", "Decomposition", "Panel", "Technical Assessment",
31
- "Candidate" combined with a person name:
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: look up the organizer in `Knowledge/People/` for a manager/HM role
38
- indication.
39
- 4. Check the candidate's `brief.md` for a `Req` field; if known, set the
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 organized by someone is suggestive but not conclusive
68
- confirm against People notes or multiple data points before setting the field.
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 is referenced.
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 for entities not resolved to existing notes (meetings only).
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 handling only logistics.
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
- A People note is only worth creating if you can write a substantive `## Summary`
59
- (who they are, why you know them, what you're working on together) grounded in
60
- the source. **If you cannot write that Summary from the source, do not create
61
- the note** record the contact in the Organization's `## Contacts` section
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 and must not be produced.
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 and qualify with the basis:
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 referenced; update
84
- progress / backlinks; never create new ones from extracted content.
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 — calendar
23
- events only *enrich* existing notes (see the table below). An attendee who is
24
- only on the invite list, with no interaction or decision attributed to them, is
25
- not profiled. If they matter, they go in the Organization's `## Contacts`. Never
26
- write a placeholder profile; see the
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", "Connecting"; body
58
- contains "introduce you to", "want to connect", "meet [Name]"; new person is
59
- CC'd.
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
- 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.
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}