@forwardimpact/outpost 3.12.0 → 3.13.0

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 (129) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +6 -5
  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 +75 -20
  8. package/src/kb-validator.js +762 -0
  9. package/src/outpost.js +108 -39
  10. package/src/posture.js +3 -3
  11. package/src/privilege.js +11 -11
  12. package/src/scheduler.js +14 -12
  13. package/src/socket-server.js +19 -18
  14. package/src/spawn-env.js +7 -6
  15. package/src/state-manager.js +2 -2
  16. package/templates/.claude/agents/chief-of-staff.md +32 -24
  17. package/templates/.claude/agents/concierge.md +26 -17
  18. package/templates/.claude/agents/head-hunter.md +34 -26
  19. package/templates/.claude/agents/librarian.md +26 -18
  20. package/templates/.claude/agents/postman.md +26 -18
  21. package/templates/.claude/agents/recruiter.md +38 -27
  22. package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
  23. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  24. package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
  25. package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
  26. package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
  27. package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
  28. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
  29. package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
  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 +122 -67
  35. package/templates/.claude/skills/deck-create/SKILL.md +90 -32
  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 +63 -58
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
  44. package/templates/.claude/skills/doc-create/SKILL.md +27 -23
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
  50. package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +37 -13
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
  57. package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
  59. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
  60. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
  61. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
  62. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  63. package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
  64. package/templates/.claude/skills/organize-files/SKILL.md +27 -22
  65. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  66. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  67. package/templates/.claude/skills/person-identify/SKILL.md +77 -27
  68. package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
  69. package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
  70. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
  71. package/templates/.claude/skills/req-assess/SKILL.md +44 -36
  72. package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
  73. package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
  74. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  75. package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
  76. package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
  77. package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
  78. package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
  79. package/templates/.claude/skills/req-decide/SKILL.md +52 -41
  80. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  81. package/templates/.claude/skills/req-decide/references/template.md +2 -2
  82. package/templates/.claude/skills/req-forget/SKILL.md +58 -39
  83. package/templates/.claude/skills/req-forget/references/classify.md +15 -13
  84. package/templates/.claude/skills/req-forget/references/locations.md +27 -22
  85. package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
  86. package/templates/.claude/skills/req-scan/SKILL.md +27 -25
  87. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  88. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  89. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  90. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  91. package/templates/.claude/skills/req-scan/references/template.md +11 -1
  92. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  93. package/templates/.claude/skills/req-screen/SKILL.md +96 -50
  94. package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
  95. package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
  96. package/templates/.claude/skills/req-screen/references/template.md +29 -17
  97. package/templates/.claude/skills/req-track/SKILL.md +76 -76
  98. package/templates/.claude/skills/req-track/references/fields.md +31 -27
  99. package/templates/.claude/skills/req-track/references/overlays.md +42 -0
  100. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  101. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  102. package/templates/.claude/skills/req-track/references/templates.md +28 -27
  103. package/templates/.claude/skills/req-workday/SKILL.md +69 -40
  104. package/templates/.claude/skills/req-workday/references/brief.md +81 -0
  105. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  106. package/templates/.claude/skills/req-workday/references/templates.md +11 -78
  107. package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
  108. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
  109. package/templates/.claude/skills/send-chat/SKILL.md +58 -54
  110. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -19
  111. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  112. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  113. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  114. package/templates/.claude/skills/sync-apple-mail/SKILL.md +20 -14
  115. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  116. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  117. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  118. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  119. package/templates/.claude/skills/sync-teams/SKILL.md +46 -43
  120. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  121. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  122. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  123. package/templates/.claude/skills/upstream-instructions/SKILL.md +43 -41
  124. package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
  125. package/templates/CLAUDE.md +97 -85
  126. package/templates/MIGRATION.md +359 -0
  127. package/templates/registry.yaml +25 -0
  128. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
  129. package/templates/.claude/skills/anarlog-trim/SKILL.md +0 -183
@@ -1,25 +1,28 @@
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 the tier directories 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
+ Write tier: `3-Team` (general); `2-Confidential` (recruitment entities)
9
+ Frontmatter: person, organization, project, topic, priority, condition
10
+
8
11
  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.
12
+ ad-hoc documents from other skills, into Obsidian-compatible markdown notes
13
+ in the tier directories. This skill builds the core knowledge graph.
11
14
 
12
15
  ## Trigger
13
16
 
14
- - Schedule (every 15 minutes) for synced data.
17
+ - The schedule runs every 15 minutes for synced data.
15
18
  - 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/`).
19
+ - Another skill passes ad-hoc file paths (e.g. `organize-files` after it
20
+ organises `~/Desktop/` and `~/Downloads/`).
18
21
 
19
22
  ## Prerequisites
20
23
 
21
24
  - Synced data in `~/.cache/fit/outpost/` and/or ad-hoc paths.
22
- - User identity from running the `person-identify` skill, which writes
25
+ - User identity from the `person-identify` skill. That skill writes
23
26
  `~/.cache/fit/outpost/state/identity.md` (Name, Email, Domain).
24
27
 
25
28
  ## Inputs
@@ -31,92 +34,91 @@ under `Knowledge/`. The core knowledge-graph builder.
31
34
  - `~/.cache/fit/outpost/state/graph_processed` — processed-file index (TSV,
32
35
  shared with `req-track` and `anarlog-process`).
33
36
  - `~/.cache/fit/outpost/state/identity.md` — user identity for self-exclusion
34
- (written by the `person-identify` skill).
37
+ (the `person-identify` skill writes it).
35
38
 
36
39
  ## Outputs
37
40
 
38
- - `Knowledge/People/`, `Knowledge/Organizations/`, `Knowledge/Projects/`,
39
- `Knowledge/Topics/` — created or updated.
40
- - `Knowledge/Priorities/` — **updated only**, never
41
- auto-created.
42
- - `Knowledge/Conditions/` — created when cross-cutting patterns are detected, or
41
+ - `3-Team/People/`, `3-Team/Organizations/`, `3-Team/Projects/`,
42
+ `3-Team/Topics/` — created or updated.
43
+ - `3-Team/Priorities/` — **updated only**, never auto-created.
44
+ - `3-Team/Conditions/` — created when you detect cross-cutting patterns, or
43
45
  updated.
44
- - `Knowledge/Roles/*.md`, `Knowledge/Candidates/*/brief.md` — enriched with
45
- inferred metadata. New role stubs created with `**Status:** open`; update to
46
- `**Status:** closed` when a role closes.
46
+ - `2-Confidential/Roles/*.md`, `2-Confidential/Candidates/*/brief.md` — enriched
47
+ with inferred metadata. Create new role stubs with `**Status:** open`. Update
48
+ to `**Status:** closed` when a role closes.
47
49
  - `~/.cache/fit/outpost/state/graph_processed` — updated.
48
50
 
49
51
  <do_confirm_checklist goal="Verify the batch produced clean, linked,
50
52
  well-grounded notes">
51
53
 
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.
54
+ - [ ] Identify the source type correctly. Apply the meeting-vs-email rules
55
+ (meetings create, emails only update).
56
+ - [ ] Exclude yourself and `@user.domain` from the extraction.
57
+ - [ ] Apply the "Would I prep?" test. Write no stub profiles. Give every new
58
+ People note a substantive `## Summary`. Route calendar-only attendees to
59
+ the Organization `## Contacts` section.
60
+ - [ ] Use tier-prefixed absolute paths (`[[3-Team/People/Name]]`) for all
61
+ links. Keep bidirectional links consistent (incl. Project ↔ Priority).
62
+ - [ ] Describe the relationship in each summary. Omit the communication
63
+ method. Make key facts substantive. Make open items commitments.
64
+ - [ ] Log state changes with `[Field → value]`. Never auto-create a Priority
65
+ entity.
66
+ - [ ] Create a Condition only when ≥ 3 entities reference the same
67
+ cross-cutting state. Detect resolution when the evidence supports it.
68
+ - [ ] Recruitment: detect Req numbers and create or enrich Role files. Infer
69
+ HM/recruiter/domain-lead where the evidence strongly supports it.
70
+ - [ ] Update `graph_processed` for every processed file.
69
71
 
70
72
  </do_confirm_checklist>
71
73
 
72
74
  ## Procedure
73
75
 
74
- Process **10 files per run**. Write **one file at a time** do not batch
76
+ Process **10 files per run**. Write **one file at a time**. Do not batch
75
77
  writes.
76
78
 
77
79
  ### 0. Load context and pick the batch
78
80
 
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:
81
+ Read the user's identity from `~/.cache/fit/outpost/state/identity.md`. Run the
82
+ `person-identify` skill first if the file is missing or stale. Find new or
83
+ changed files:
82
84
 
83
85
  ```bash
84
86
  node scripts/state.mjs check
85
87
  ```
86
88
 
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.
89
+ Each line is a path. When another skill gives you ad-hoc paths, process those
90
+ directly. Do not scan `~/.cache/fit/outpost/`. Still check each path against
91
+ `graph_processed`. Skip a path when its hash did not change.
90
92
 
91
93
  ### 1. Build the knowledge index
92
94
 
93
95
  ```bash
94
- find Knowledge/People Knowledge/Organizations Knowledge/Projects \
95
- Knowledge/Topics Knowledge/Priorities \
96
- Knowledge/Conditions -name "*.md" 2>/dev/null
96
+ find 3-Team/People 3-Team/Organizations 3-Team/Projects 3-Team/Topics \
97
+ 3-Team/Priorities 3-Team/Conditions -name "*.md" 2>/dev/null
97
98
  ```
98
99
 
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.
100
+ Run `head -20` on each note to capture the key fields. Build a mental index of
101
+ People, Organizations, Projects, Priorities, Topics by name, email,
102
+ organization, role, status, and aliases.
102
103
 
103
104
  ### 2. Classify the source
104
105
 
105
- Type detection, skip rules, warm-intro exception, and the source-type rules
106
- summary: [references/sources.md](references/sources.md).
106
+ Find the type-detection rules, the skip rules, the warm-intro exception, and
107
+ the source-type summary in [references/sources.md](references/sources.md).
107
108
 
108
109
  ### 3. Read and parse the source
109
110
 
110
111
  - **Emails:** Date, Subject, From, To/Cc, Thread ID, Body.
111
112
  - **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`.
113
+ - **Ad-hoc documents:** Date (file mtime), Filename, Source path, Content. Read
114
+ `.md`, `.txt`, and `.rtf` direct. Read `.pdf` with `pdftotext` or `mdcat`.
115
+ Read `.csv` as-is and look for names, emails, or orgs in the columns. Read
116
+ `.doc` and `.docx` with `textutil -convert txt`.
116
117
 
117
118
  Ad-hoc documents follow **meeting** rules (can create notes).
118
119
 
119
- Exclude self per [references/sources.md](references/sources.md#self-exclusion).
120
+ Exclude yourself per
121
+ [references/sources.md](references/sources.md#self-exclusion).
120
122
  Collect every name variant per
121
123
  [references/resolution.md](references/resolution.md#name-variant-collection).
122
124
 
@@ -126,7 +128,7 @@ For each variant, search the knowledge index. Apply the
126
128
  [matching table](references/resolution.md#matching) and the
127
129
  [disambiguation priority](references/resolution.md#disambiguation-priority).
128
130
  Priorities are
129
- [never auto-created](references/resolution.md#never-auto-create) link to
131
+ [never auto-created](references/resolution.md#never-auto-create). Link to
130
132
  existing entries only.
131
133
 
132
134
  ### 5. Identify new entities (meetings only)
@@ -134,53 +136,53 @@ existing entries only.
134
136
  Apply the
135
137
  ["Would I prep?" test](references/resolution.md#would-i-prep-for-this-person--step-5)
136
138
  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.
139
+ contacts who don't merit their own note, add them to the Organization's
140
+ `## Contacts` section.
139
141
 
140
142
  ### 6. Extract content
141
143
 
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.
144
+ Find the rules for decisions, commitments, key facts, open items, activity
145
+ lines, and summaries in [references/content.md](references/content.md). Be
146
+ substantive. Never write filler or meta-commentary.
145
147
 
146
148
  ### 7. Detect state changes and structural enrichment
147
149
 
148
150
  - **State changes** (Project status, open-item resolution, role / title changes,
149
- relationship changes): tables in
151
+ relationship changes): see the tables in
150
152
  [references/content.md](references/content.md#state-change-tables). Be
151
- conservative; log inline `[Field → value]`.
153
+ conservative. Log inline `[Field → value]`.
152
154
  - **Recruitment** (Req-number detection, hiring-manager / recruiter /
153
- domain-lead inference):
155
+ domain-lead inference): see
154
156
  [references/recruitment.md](references/recruitment.md).
155
- - **Priority links** (Step 7c): rules in
157
+ - **Priority links** (Step 7c): see the rules in
156
158
  [references/links.md](references/links.md#priorities-step-7c).
157
159
  **Never auto-create.**
158
- - **Conditions** (cross-cutting states affecting ≥ 3 entities):
160
+ - **Conditions** (cross-cutting states that affect ≥ 3 entities): see
159
161
  [references/conditions.md](references/conditions.md).
160
162
 
161
163
  ### 8. Check for duplicates
162
164
 
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)".
165
+ See [references/content.md](references/content.md#duplicate-check-step-8).
166
+ Skip same-day same-source activity entries. Dedupe key facts and open items.
167
+ Mark contradictions "(needs clarification)".
166
168
 
167
169
  ### 9. Write updates
168
170
 
169
- For **new** entities, use the templates indexed by
170
- [references/TEMPLATES.md](references/TEMPLATES.md).
171
+ For **new** entities, use the templates.
172
+ [references/TEMPLATES.md](references/TEMPLATES.md) indexes them.
171
173
 
172
- For **existing** entities, apply targeted edits — never rewrite the file:
174
+ For **existing** entities, never rewrite the file. Apply targeted edits:
173
175
 
174
176
  - Add the new activity entry at the **top** of `## Activity` (reverse
175
177
  chronological).
176
- - Update `Last seen`.
178
+ - Update `Last seen`, and stamp frontmatter `updated` in the same edit.
177
179
  - Add new key facts (skip duplicates).
178
180
  - Update open items (mark completed, add new).
179
181
  - Apply state changes to fields.
180
182
 
181
183
  ### 10. Ensure bidirectional links
182
184
 
183
- After writing, verify links go both ways using the
185
+ After you write, verify that links go both ways. Use the
184
186
  [bidirectional link rules](references/links.md#bidirectional-link-rules).
185
187
 
186
188
  ### 11. Update graph state
@@ -189,6 +191,5 @@ After writing, verify links go both ways using the
189
191
  node scripts/state.mjs update "$FILE"
190
192
  ```
191
193
 
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.
194
+ Run for every processed file. `req-track` and `anarlog-process` share the
195
+ state file. So neither skill scans the same input again.
@@ -1,14 +1,15 @@
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. Every template opens with its YAML frontmatter block
6
+ (core keys plus the type's conditional keys from `registry.yaml`).
6
7
 
7
8
  - [templates-people-orgs.md](templates-people-orgs.md) — People, Organizations.
8
9
  - [templates-projects-topics.md](templates-projects-topics.md) — Projects,
9
10
  Topics.
10
11
  - [templates-priorities.md](templates-priorities.md) — Priorities.
11
- **Never auto-created** by `extract-entities` or `anarlog-process`
12
- set by the user.
12
+ `extract-entities` and `anarlog-process` **never auto-create** them.
13
+ The user sets them.
13
14
  - [templates-conditions.md](templates-conditions.md) — Conditions (time-bound
14
15
  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,38 +18,40 @@ 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
- 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").
23
+ 1. Check existing: `ls 3-Team/Conditions/ 2>/dev/null`.
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
- 1. Add `[[Conditions/{Condition}]]` to the `## Affects` section of affected
35
- Priorities.
34
+ 1. Add `[[3-Team/Conditions/{Condition}]]` to the `## Affects` section of
35
+ affected Priorities.
36
36
  2. Add `[Status → on hold]` state changes to affected Projects where
37
37
  appropriate.
38
38
  3. Add a `## Blockers` entry to affected Role files if recruitment is frozen.
39
39
  4. Log the Condition reference in activity entries:
40
- `- **YYYY-MM-DD** ({source}): {update}. See [[Conditions/{Condition}]]`.
40
+ `- **YYYY-MM-DD** ({source}): {update}. See [[3-Team/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}`.
48
- - Remove `[[Conditions/{Condition}]]` from affected Priority `## Affects`.
48
+ - Remove `[[3-Team/Conditions/{Condition}]]` from affected Priority
49
+ `## Affects`.
49
50
  - Log with `[Status → resolved]`.
50
51
 
51
52
  ## Conservatism
52
53
 
53
54
  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.
55
+ entities. A single project that goes "on hold" is a project status change. It is
56
+ **not** a Condition. A hiring freeze that affects 20 roles across 5 teams **is**
57
+ 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)".
@@ -1,10 +1,34 @@
1
- # Bidirectional Links
2
-
3
- Reference for `extract-entities` Step 10 and Step 7c (Priorities).
1
+ # Links
2
+
3
+ Reference for `extract-entities` Step 10 and Step 7c (Priorities). Every
4
+ skill that writes wiki links follows the format and overlay rules here.
5
+
6
+ ## Link format
7
+
8
+ - In shared tiers (ranks 1 and up), write every wiki link tier-prefixed and
9
+ vault-absolute: `[[3-Team/People/Sarah Chen]]`,
10
+ `[[2-Confidential/Candidates/Jane Doe/brief]]`. A bare basename
11
+ (`[[Sarah Chen]]`) is a validation finding there, because overlays
12
+ duplicate basenames across tiers.
13
+ - Exemption: relative links between files inside one entity subdirectory (a
14
+ per-candidate folder, an asset collection) stay relative, so the folder
15
+ moves as one unit.
16
+ - Tier-0 notes may use bare basenames.
17
+ - Link legality (own tier or wider only) lives in CLAUDE.md § Placement and
18
+ Links; the validator flags the rest.
19
+
20
+ ## Overlay links
21
+
22
+ A sensitive facet of an entity lives as an **overlay** note in a narrower
23
+ tier. The overlay declares itself through its frontmatter `canonical`
24
+ property: a double-quoted, tier-prefixed, vault-absolute link to the
25
+ canonical note (`canonical: "[[3-Team/People/Jane Doe]]"`). The canonical
26
+ note **never links back**. Backlinks stay symmetric within one tier only; a
27
+ cross-tier reference is one-way, from the narrower note up.
4
28
 
5
29
  ## Bidirectional link rules
6
30
 
7
- After writing, verify each link goes both ways.
31
+ After you write, verify each link goes both ways **within the same tier**.
8
32
 
9
33
  | If you add... | Then also add... |
10
34
  | ---------------------- | -------------------------------------------- |
@@ -13,21 +37,21 @@ After writing, verify each link goes both ways.
13
37
  | Project → Organization | Organization → Project (in Projects section) |
14
38
  | Project → Priority | Priority → Project (in Projects section) |
15
39
  | Condition → Project | Project → Condition (in Related section) |
16
- | ConditionRole | Role Condition (notes or status field) |
40
+ | RoleCondition | nothing the pair crosses tiers |
17
41
 
18
- Use absolute paths everywhere: `[[People/Sarah Chen]]`,
19
- `[[Organizations/Acme Corp]]`, `[[Projects/Acme Integration]]`,
20
- `[[Priorities/Priority Name]]`, `[[Conditions/Condition Name]]`.
42
+ The Role Condition pair crosses tiers (rank 2 → rank 3), so only the
43
+ narrower side links: the Role file may name the Condition, and the Condition
44
+ never names the Role.
21
45
 
22
46
  ## Priorities (Step 7c)
23
47
 
24
48
  Match source themes against priority names and descriptions.
25
49
 
26
- - Add `[[Priorities/{Priority}]]` to a Project or Topic `## Related` section if
27
- not already present.
50
+ - Add `[[3-Team/Priorities/{Priority}]]` to a Project or Topic `## Related`
51
+ section if it is not already present.
28
52
  - Update the Priority's `## Projects` section when a new project emerges that
29
53
  serves it.
30
54
 
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.
55
+ **Never auto-create Priorities.** Don't over-link. A project that already links
56
+ to a Priority through a related Topic doesn't need a redundant direct link to
57
+ the Priority.
@@ -1,9 +1,14 @@
1
1
  # Recruitment Inference
2
2
 
3
- Reference for `extract-entities` Step 7b. Enrich `Knowledge/Roles/` and
4
- `Knowledge/Candidates/` with metadata that no single source carries.
3
+ Reference for `extract-entities` Step 7b. Enrich `2-Confidential/Roles/` and
4
+ `2-Confidential/Candidates/` with metadata that no single source carries.
5
5
 
6
- All Role files are flat in `Knowledge/Roles/`. The `**Status:**` field
6
+ Recruitment entities live in tier 2: route Candidates, Prospects, Roles, and
7
+ Erasure records to `2-Confidential/`. A recruitment fact about a `3-Team`
8
+ person lands in the person's `2-Confidential` overlay (a note with a
9
+ `canonical` link up to the `3-Team` note), never in the canonical team note.
10
+
11
+ All Role files are flat in `2-Confidential/Roles/`. The `**Status:**` field
7
12
  distinguishes:
8
13
 
9
14
  - **`Status: open`** — active openings (use for new candidates and table
@@ -15,41 +20,42 @@ distinguishes:
15
20
  Scan email subjects and bodies for requisition numbers (e.g. 7-digit Workday
16
21
  IDs).
17
22
 
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
23
+ 1. `ls 2-Confidential/Roles/ | grep "{req_number}"` — find out whether a Role
24
+ file exists.
25
+ 2. **No file:** create a stub with the Role-stub template in `req-track` Step
26
+ 0b, and set `**Status:** open`. Search `rg "{req_number}" [0-9]-*/` for
21
27
  context to enrich it.
22
28
  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.
29
+ email provides new metadata (hiring manager, recruiter, locations). Then
30
+ update the Role file. If `closed`, link for historical reference only. Do not
31
+ add new candidates. Do not rebuild tables.
26
32
 
27
33
  ## Hiring manager — calendar inference
28
34
 
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:
35
+ A calendar event title can match an interview pattern ("Interview", "Screening",
36
+ "Screen", "Decomposition", "Panel", "Technical Assessment", "Candidate") and
37
+ also carry a person name. When it does:
32
38
 
33
- 1. Cross-reference the candidate against `Knowledge/Candidates/`.
39
+ 1. Cross-reference the candidate against `2-Confidential/Candidates/`.
34
40
  2. Extract the **organizer**. If the organizer isn't the user (per
35
41
  `~/.cache/fit/outpost/state/identity.md`),
36
42
  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 `—`.
43
+ 3. Confirm the hiring manager. Look up the organizer in `3-Team/People/` for
44
+ an indication of a manager or HM role.
45
+ 4. Check the candidate's `brief.md` for a `Req` field. If you know the req, set
46
+ the matching Role file's `Hiring manager` (only if it is currently `—`).
47
+ 5. Set the candidate's `brief.md` `Hiring manager` field if it is currently `—`.
42
48
 
43
49
  ## Recruiter — email-thread inference
44
50
 
45
51
  When a thread references candidates (name match against
46
- `Knowledge/Candidates/`):
52
+ `2-Confidential/Candidates/`):
47
53
 
48
- 1. Cross-reference To/CC against `Knowledge/People/`.
54
+ 1. Cross-reference To/CC against `3-Team/People/`.
49
55
  2. If a CC'd person's note mentions "recruiter", "talent acquisition", or a
50
56
  similar role, they are likely the internal recruiter.
51
57
  3. Update the candidate's `brief.md` recruiter field and the matching Role file
52
- (only if currently `—`).
58
+ (only if it is currently `—`).
53
59
 
54
60
  ## Domain lead — reporting-chain resolution
55
61
 
@@ -63,6 +69,6 @@ When a hiring manager is newly identified:
63
69
 
64
70
  ## Conservatism
65
71
 
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.
72
+ Set hiring manager / domain lead / recruiter only when the evidence is strong. A
73
+ single calendar invite from one organizer is suggestive but not conclusive.
74
+ 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.
@@ -12,7 +12,7 @@ Extract every way each entity is referenced.
12
12
  - **Projects:** explicit names, descriptive references ("the pilot", "the
13
13
  deal").
14
14
  - **Priorities:** references to strategic directions, time-bound targets, or
15
- measurable outcomes that match `Knowledge/Priorities/` entries.
15
+ measurable outcomes that match `3-Team/Priorities/` entries.
16
16
 
17
17
  ## Matching
18
18
 
@@ -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.