@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.
- package/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +6 -5
- 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 +75 -20
- package/src/kb-validator.js +762 -0
- package/src/outpost.js +108 -39
- 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 +32 -24
- package/templates/.claude/agents/concierge.md +26 -17
- package/templates/.claude/agents/head-hunter.md +34 -26
- package/templates/.claude/agents/librarian.md +26 -18
- package/templates/.claude/agents/postman.md +26 -18
- package/templates/.claude/agents/recruiter.md +38 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
- package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
- package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
- package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
- package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
- 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 +122 -67
- package/templates/.claude/skills/deck-create/SKILL.md +90 -32
- 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 +63 -58
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
- package/templates/.claude/skills/doc-create/SKILL.md +27 -23
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
- package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +37 -13
- package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
- package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
- package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
- package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
- package/templates/.claude/skills/organize-files/SKILL.md +27 -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 +77 -27
- package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
- package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
- package/templates/.claude/skills/req-assess/SKILL.md +44 -36
- package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
- package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
- package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
- package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
- package/templates/.claude/skills/req-decide/SKILL.md +52 -41
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-decide/references/template.md +2 -2
- package/templates/.claude/skills/req-forget/SKILL.md +58 -39
- package/templates/.claude/skills/req-forget/references/classify.md +15 -13
- package/templates/.claude/skills/req-forget/references/locations.md +27 -22
- package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
- package/templates/.claude/skills/req-scan/SKILL.md +27 -25
- 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/references/template.md +11 -1
- package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +96 -50
- package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
- package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
- package/templates/.claude/skills/req-screen/references/template.md +29 -17
- package/templates/.claude/skills/req-track/SKILL.md +76 -76
- package/templates/.claude/skills/req-track/references/fields.md +31 -27
- package/templates/.claude/skills/req-track/references/overlays.md +42 -0
- 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 +28 -27
- package/templates/.claude/skills/req-workday/SKILL.md +69 -40
- package/templates/.claude/skills/req-workday/references/brief.md +81 -0
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +11 -78
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
- package/templates/.claude/skills/send-chat/SKILL.md +58 -54
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -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 +20 -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 +46 -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 +43 -41
- package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
- package/templates/CLAUDE.md +97 -85
- package/templates/MIGRATION.md +359 -0
- package/templates/registry.yaml +25 -0
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
- 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/)
|
|
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
|
|
10
|
-
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
-
(
|
|
37
|
+
(the `person-identify` skill writes it).
|
|
35
38
|
|
|
36
39
|
## Outputs
|
|
37
40
|
|
|
38
|
-
- `
|
|
39
|
-
`
|
|
40
|
-
- `
|
|
41
|
-
|
|
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
|
-
- `
|
|
45
|
-
inferred metadata.
|
|
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
|
-
- [ ]
|
|
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`
|
|
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
|
|
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
|
|
80
|
-
`person-identify` skill first if
|
|
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
|
|
88
|
-
|
|
89
|
-
`graph_processed
|
|
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
|
|
95
|
-
|
|
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
|
-
|
|
100
|
-
Organizations, Projects, Priorities, Topics by name, email,
|
|
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
|
-
|
|
106
|
-
summary
|
|
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.
|
|
113
|
-
|
|
114
|
-
|
|
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
|
|
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)
|
|
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
|
|
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
|
-
|
|
143
|
-
[references/content.md](references/content.md). Be
|
|
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
|
|
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
|
|
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)
|
|
164
|
-
same-day same-source activity entries
|
|
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
|
|
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,
|
|
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
|
|
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.
|
|
193
|
-
|
|
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
|
-
|
|
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. 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
|
-
|
|
12
|
-
|
|
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
|
|
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,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
|
-
##
|
|
21
|
+
## Create a Condition
|
|
22
22
|
|
|
23
|
-
1. Check existing: `ls
|
|
24
|
-
2. **No match:** create a new Condition note
|
|
25
|
-
[templates-conditions.md](templates-conditions.md).
|
|
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
|
-
##
|
|
30
|
+
## Update affected entities
|
|
31
31
|
|
|
32
|
-
When
|
|
32
|
+
When you create or update a Condition:
|
|
33
33
|
|
|
34
|
-
1. Add `[[Conditions/{Condition}]]` to the `## Affects` section of
|
|
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
|
-
##
|
|
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}`.
|
|
48
|
-
- Remove `[[Conditions/{Condition}]]` from affected Priority
|
|
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
|
|
55
|
-
Condition. A hiring freeze
|
|
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,
|
|
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)".
|
|
@@ -1,10 +1,34 @@
|
|
|
1
|
-
#
|
|
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
|
|
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
|
-
|
|
|
40
|
+
| Role → Condition | nothing — the pair crosses tiers |
|
|
17
41
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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`
|
|
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
|
|
32
|
-
to a Priority through a related Topic doesn't need a redundant direct
|
|
33
|
-
|
|
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 `
|
|
4
|
-
`
|
|
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
|
-
|
|
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
|
|
19
|
-
|
|
20
|
-
|
|
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)
|
|
24
|
-
the Role file. If `closed`, link for historical reference only
|
|
25
|
-
new candidates
|
|
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
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
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 `
|
|
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
|
|
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 `—`.
|
|
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
|
-
`
|
|
52
|
+
`2-Confidential/Candidates/`):
|
|
47
53
|
|
|
48
|
-
1. Cross-reference To/CC against `
|
|
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
|
|
68
|
-
|
|
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
|
|
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 `
|
|
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
|
|
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.
|