@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,20 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: req-track
|
|
3
|
-
description: Scan synced email threads for recruitment candidates, extract structured profiles, and create/update notes in
|
|
3
|
+
description: Scan synced email threads for recruitment candidates, extract structured profiles, and create/update notes in 2-Confidential/Candidates/. Use when the user asks to track candidates, process recruitment emails, or update the hiring pipeline.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Track Candidates
|
|
7
7
|
|
|
8
|
+
Write tier: `2-Confidential`
|
|
9
|
+
Frontmatter: candidate
|
|
10
|
+
|
|
8
11
|
Scan synced email threads from `~/.cache/fit/outpost/apple_mail/` for
|
|
9
12
|
recruitment candidates. Extract structured candidate profiles and create or
|
|
10
|
-
update notes in `
|
|
11
|
-
pipeline from scattered email threads.
|
|
13
|
+
update notes in `2-Confidential/Candidates/`.
|
|
12
14
|
|
|
13
15
|
## Trigger
|
|
14
16
|
|
|
15
17
|
- The user asks to track, process, or update candidates.
|
|
16
18
|
- The user asks about recruitment pipeline status.
|
|
17
|
-
- After `sync-apple-mail`
|
|
19
|
+
- After `sync-apple-mail` pulls new threads.
|
|
18
20
|
|
|
19
21
|
## Prerequisites
|
|
20
22
|
|
|
@@ -29,38 +31,38 @@ pipeline from scattered email threads.
|
|
|
29
31
|
- `~/.cache/fit/outpost/apple_mail/attachments/` — CV/resume attachments.
|
|
30
32
|
- `~/.cache/fit/outpost/apple_calendar/*.json` — calendar events (for
|
|
31
33
|
cross-source inference).
|
|
32
|
-
- `
|
|
33
|
-
field: `open` for active roles, `closed` for historical).
|
|
34
|
+
- `2-Confidential/Roles/*.md` — role/requisition files (check the
|
|
35
|
+
`**Status:**` field: `open` for active roles, `closed` for historical).
|
|
34
36
|
- `~/.cache/fit/outpost/state/graph_processed` — processed-file index (shared
|
|
35
37
|
with `extract-entities`).
|
|
36
38
|
- `~/.cache/fit/outpost/state/identity.md` — user identity for self-exclusion
|
|
37
|
-
(
|
|
39
|
+
(the `person-identify` skill writes it).
|
|
38
40
|
|
|
39
41
|
## Outputs
|
|
40
42
|
|
|
41
|
-
- `
|
|
42
|
-
- `
|
|
43
|
-
- `
|
|
44
|
-
- `
|
|
45
|
-
determines visibility (open/closed).
|
|
43
|
+
- `2-Confidential/Candidates/{Full Name}/brief.md` — candidate profile note.
|
|
44
|
+
- `2-Confidential/Candidates/{Full Name}/CV.pdf` (or `CV.docx`) — local CV.
|
|
45
|
+
- `2-Confidential/Candidates/{Full Name}/headshot.jpeg` — candidate photo.
|
|
46
|
+
- `2-Confidential/Roles/*.md` — role files created or updated. The
|
|
47
|
+
`**Status:**` field determines visibility (open/closed).
|
|
46
48
|
- `~/.cache/fit/outpost/state/graph_processed` — updated with processed threads.
|
|
47
49
|
|
|
48
50
|
<do_confirm_checklist goal="Verify candidate processing batch is complete and
|
|
49
51
|
correct">
|
|
50
52
|
|
|
51
|
-
- [ ]
|
|
52
|
-
|
|
53
|
-
- [ ] Pipeline status reflects latest thread activity
|
|
54
|
-
order.
|
|
55
|
-
- [ ]
|
|
56
|
-
|
|
57
|
-
- [ ] Role files synced
|
|
53
|
+
- [ ] Frontmatter (`type`, `created`, `updated`, `aliases`, registry `status`)
|
|
54
|
+
and the required Info fields present on every brief.
|
|
55
|
+
- [ ] Pipeline status reflects the latest thread activity. Timeline in
|
|
56
|
+
chronological order.
|
|
57
|
+
- [ ] Backlinks land on `2-Confidential` overlay notes, never on `3-Team`
|
|
58
|
+
notes.
|
|
59
|
+
- [ ] Role files synced. Candidates tables rebuilt. Stubs created for any
|
|
58
60
|
unknown reqs.
|
|
59
61
|
- [ ] CV and headshot copied into the candidate directory when available.
|
|
60
62
|
- [ ] Skills tagged with agent-aligned engineering standard IDs from
|
|
61
63
|
`bunx fit-pathway skill --list`.
|
|
62
64
|
- [ ] Gender field populated only from explicit pronouns or titles.
|
|
63
|
-
- [ ] No duplicate candidate notes
|
|
65
|
+
- [ ] No duplicate candidate notes. All processed threads marked in the state
|
|
64
66
|
file.
|
|
65
67
|
|
|
66
68
|
</do_confirm_checklist>
|
|
@@ -72,108 +74,108 @@ Process **10 files per run**.
|
|
|
72
74
|
### 1. Load context and pick the batch
|
|
73
75
|
|
|
74
76
|
Read the user's name, email, and domain from
|
|
75
|
-
`~/.cache/fit/outpost/state/identity.md
|
|
76
|
-
if
|
|
77
|
+
`~/.cache/fit/outpost/state/identity.md`. Run the `person-identify` skill first
|
|
78
|
+
if that file is missing or stale. List new or changed source files:
|
|
77
79
|
|
|
78
80
|
```bash
|
|
79
81
|
node .claude/skills/extract-entities/scripts/state.mjs check
|
|
80
82
|
```
|
|
81
83
|
|
|
82
|
-
Filter the output to `apple_mail/*.md` only
|
|
84
|
+
Filter the output to `apple_mail/*.md` only. Calendar files are not relevant
|
|
83
85
|
here.
|
|
84
86
|
|
|
85
87
|
### 2. Build candidate, people, and org indexes
|
|
86
88
|
|
|
87
89
|
```bash
|
|
88
|
-
ls -d
|
|
90
|
+
ls -d 2-Confidential/Candidates/*/
|
|
89
91
|
```
|
|
90
92
|
|
|
91
93
|
Read each existing brief's header (Name, Role, Source, Status) to build a mental
|
|
92
|
-
index. Also scan `
|
|
93
|
-
`
|
|
94
|
-
links.
|
|
94
|
+
index. Also scan `3-Team/People/`, `3-Team/Organizations/`, and
|
|
95
|
+
`3-Team/Projects/` to resolve recruiter names, agency orgs, and project links.
|
|
95
96
|
|
|
96
|
-
### 3. Sync `
|
|
97
|
+
### 3. Sync `2-Confidential/Roles/`
|
|
97
98
|
|
|
98
|
-
Role files are flat here
|
|
99
|
+
Role files are flat here. The `**Status:**` field is `open` or `closed`.
|
|
99
100
|
|
|
100
101
|
1. Read each Role file's Info block to map Req → Role file path, Hiring manager,
|
|
101
102
|
Domain lead, recruiter, Channel. Look up by filename substring so a req-less
|
|
102
|
-
role stays findable:
|
|
103
|
-
2
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
open
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
103
|
+
role stays findable:
|
|
104
|
+
`ls 2-Confidential/Roles/ | grep "{partial_name_or_req}"`.
|
|
105
|
+
2. Find Reqs in candidate briefs that have no Role file:
|
|
106
|
+
`rg "^\*\*Req:\*\*" 2-Confidential/Candidates/*/brief.md`. Check all Role
|
|
107
|
+
files first. For a genuinely missing open role, create a stub with
|
|
108
|
+
`**Status:** open` from the **Role file stub** in
|
|
109
|
+
[references/templates.md](references/templates.md). Then enrich:
|
|
110
|
+
`rg "{req_number}" [0-9]-*/`.
|
|
111
|
+
3. Scan briefs to rebuild each **open** Role file's `## Candidates` table:
|
|
112
|
+
`rg -l "Req:.*{req_number}" 2-Confidential/Candidates/*/brief.md`. Use the
|
|
113
|
+
**Role Candidates table** format from `references/templates.md`.
|
|
112
114
|
4. If a Role file has a hiring manager but no domain lead, walk the
|
|
113
|
-
`**Reports to:**` chain in `
|
|
115
|
+
`**Reports to:**` chain in `3-Team/People/` to a VP or senior leader.
|
|
114
116
|
5. When a role closes (filled, cancelled, or frozen 6+ months), set its
|
|
115
|
-
`**Status:**` field to `closed
|
|
117
|
+
`**Status:**` field to `closed`. Do this only on a clear signal.
|
|
116
118
|
|
|
117
119
|
### 4. Identify recruitment threads
|
|
118
120
|
|
|
119
121
|
For each thread in the batch, decide whether it contains recruitment content
|
|
120
|
-
|
|
122
|
+
with the signals in [references/signals.md](references/signals.md). Skip
|
|
121
123
|
threads that match no signal.
|
|
122
124
|
|
|
123
125
|
### 5. Extract candidate data
|
|
124
126
|
|
|
125
|
-
For each candidate
|
|
126
|
-
[references/fields.md](references/fields.md).
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
For each candidate you find, populate the field map from
|
|
128
|
+
[references/fields.md](references/fields.md). It covers field sources, the
|
|
129
|
+
`Channel` rule, the hiring-manager / domain-lead resolution chain, gender rules,
|
|
130
|
+
source/recruiter resolution, how to copy a CV, and headshot discovery.
|
|
129
131
|
|
|
130
132
|
### 6. Determine pipeline status
|
|
131
133
|
|
|
132
|
-
Assign a status
|
|
133
|
-
[references/statuses.md](references/statuses.md). Default to `new`.
|
|
134
|
-
full thread chronologically; the most recent signal wins.
|
|
134
|
+
Assign a status with the table and advancement signals in
|
|
135
|
+
[references/statuses.md](references/statuses.md). Default to `new`.
|
|
135
136
|
|
|
136
137
|
### 7. Build the pipeline timeline
|
|
137
138
|
|
|
138
|
-
Extract a chronological timeline
|
|
139
|
-
event
|
|
140
|
-
forwarded headers).
|
|
139
|
+
Extract a chronological timeline. Write one `**{date}**: {event}` line per
|
|
140
|
+
meaningful event. Each line captures who did what. Skip noise (signature
|
|
141
|
+
blocks, disclaimers, forwarded headers).
|
|
141
142
|
|
|
142
143
|
### 8. Write or update the candidate note
|
|
143
144
|
|
|
144
|
-
For **new** candidates, create `
|
|
145
|
-
the **Candidate brief** template in
|
|
145
|
+
For **new** candidates, create `2-Confidential/Candidates/{Full Name}/brief.md`
|
|
146
|
+
from the **Candidate brief** template in
|
|
146
147
|
[references/templates.md](references/templates.md). Place the **Extra Info
|
|
147
148
|
fields** after `Last activity` in the order shown there. Add the **Optional
|
|
148
149
|
sections** when data warrants. Omit `## CV` if no attachment.
|
|
149
150
|
|
|
150
|
-
For **existing** candidates, apply targeted edits
|
|
151
|
-
|
|
152
|
-
known Info fields, and add new
|
|
151
|
+
For **existing** candidates, apply targeted edits. Do not rewrite the file.
|
|
152
|
+
Update `Status`, `Last activity`, and the frontmatter `status` and `updated`
|
|
153
|
+
keys. Append Pipeline entries, fill in newly known Info fields, and add new
|
|
154
|
+
Skills.
|
|
153
155
|
|
|
154
156
|
### 9. Capture cross-candidate insights
|
|
155
157
|
|
|
156
|
-
Update `
|
|
157
|
-
high-signal: candidate may suit a **different role**, is a **strong match**
|
|
158
|
-
a specific team or leader, a meaningful **comparison between candidates**,
|
|
159
|
-
hiring trade-off
|
|
158
|
+
Update `2-Confidential/Candidates/Insights.md` only when an observation is
|
|
159
|
+
high-signal: the candidate may suit a **different role**, is a **strong match**
|
|
160
|
+
for a specific team or leader, a meaningful **comparison between candidates**,
|
|
161
|
+
or you must **remember a hiring trade-off across sessions**.
|
|
160
162
|
|
|
161
|
-
Skip per-candidate status and generic strengths/weaknesses
|
|
163
|
+
Skip per-candidate status and generic strengths/weaknesses. Those belong on
|
|
162
164
|
`brief.md`. Format: one bullet under `## Placement Notes` with
|
|
163
|
-
`[[Candidates/Name/brief|Name]]` and relevant
|
|
165
|
+
`[[2-Confidential/Candidates/Name/brief|Name]]` and relevant backlinks.
|
|
164
166
|
|
|
165
|
-
### 10.
|
|
167
|
+
### 10. Make sure links are bidirectional
|
|
166
168
|
|
|
167
169
|
| If you add... | Then also add... |
|
|
168
170
|
| ------------------------ | ---------------------------------------------------------- |
|
|
169
|
-
| Candidate → Organization | Organization → Candidate
|
|
170
|
-
| Candidate → Recruiter | Recruiter → Candidate (in Activity)
|
|
171
|
-
| Candidate → Project | Project → Candidate
|
|
171
|
+
| Candidate → Organization | Organization overlay → Candidate |
|
|
172
|
+
| Candidate → Recruiter | Recruiter overlay → Candidate (in Activity) |
|
|
173
|
+
| Candidate → Project | Project overlay → Candidate |
|
|
172
174
|
| Candidate → Role | Role → Candidate (in Candidates table — rebuilt by Step 3) |
|
|
173
175
|
|
|
174
|
-
|
|
175
|
-
`
|
|
176
|
-
|
|
176
|
+
Write each backlink on the entity's `2-Confidential` overlay note, never on
|
|
177
|
+
the `3-Team` note (rules and stub in `references/overlays.md`). Only add a
|
|
178
|
+
backlink when the overlay does not already reference the candidate.
|
|
177
179
|
|
|
178
180
|
### 11. Mark each thread processed
|
|
179
181
|
|
|
@@ -181,8 +183,8 @@ target note doesn't already reference the candidate.
|
|
|
181
183
|
node .claude/skills/extract-entities/scripts/state.mjs update "{file_path}"
|
|
182
184
|
```
|
|
183
185
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
`req-track` and `extract-entities` share this state. Neither skill re-scans the
|
|
187
|
+
thread until it changes.
|
|
186
188
|
|
|
187
189
|
### 12. Tag skills against the standard
|
|
188
190
|
|
|
@@ -190,7 +192,5 @@ either skill until it changes.
|
|
|
190
192
|
bunx fit-pathway skill --list
|
|
191
193
|
```
|
|
192
194
|
|
|
193
|
-
Use agent-aligned engineering standard IDs
|
|
194
|
-
|
|
195
|
-
instead of free-form tags. Flag any candidate with a CV attachment for
|
|
196
|
-
`req-screen`.
|
|
195
|
+
Use agent-aligned engineering standard IDs in the `## Skills` section instead
|
|
196
|
+
of free-form tags. Flag any candidate with a CV attachment for `req-screen`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Candidate Field Extraction
|
|
2
2
|
|
|
3
|
-
Field map and resolution rules for Step
|
|
3
|
+
Field map and resolution rules for Step 5 of `req-track`.
|
|
4
4
|
|
|
5
5
|
## Fields
|
|
6
6
|
|
|
@@ -18,12 +18,12 @@ Field map and resolution rules for Step 2 of `req-track`.
|
|
|
18
18
|
| Skills | Email body, CV | If available |
|
|
19
19
|
| Gender | Pronouns or gendered titles only | If identifiable |
|
|
20
20
|
| Summary | Email body, CV | Yes — 2-3 sentences |
|
|
21
|
-
| Role | Internal requisition profile
|
|
21
|
+
| Role | Internal requisition profile you hire against | If available |
|
|
22
22
|
| Req | Requisition ID from hiring system | If available |
|
|
23
23
|
| Channel | `hr` or `vendor` — see below | Yes |
|
|
24
24
|
| Hiring manager | Cross-source inference — see below | If determinable |
|
|
25
25
|
| Domain lead | Resolved from hiring manager's reporting chain | If determinable |
|
|
26
|
-
| Internal/External | Whether candidate is internal or external
|
|
26
|
+
| Internal/External | Whether the candidate is internal or external | If available |
|
|
27
27
|
| Model | Engagement model (B2B, Direct Hire, etc.) | If available |
|
|
28
28
|
| Current title | CV or email body | If available |
|
|
29
29
|
| Email | Email body, CV, signature | If available |
|
|
@@ -33,58 +33,62 @@ Field map and resolution rules for Step 2 of `req-track`.
|
|
|
33
33
|
|
|
34
34
|
## Channel
|
|
35
35
|
|
|
36
|
-
- `vendor` — Source links to
|
|
36
|
+
- `vendor` — Source links to a `[[3-Team/Organizations/...]]` note flagged as
|
|
37
37
|
vendor/partner (keywords: supplier, recruitment partner, contractor,
|
|
38
|
-
staffing)
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
staffing). A Req that contains "via {vendor name}" instead of a system ID
|
|
39
|
+
also means `vendor`.
|
|
40
|
+
- `hr` — the candidate came through a hiring system (numeric Req), or applied
|
|
41
|
+
internally, or an internal recruiter submitted the candidate.
|
|
41
42
|
|
|
42
43
|
## Hiring manager and domain lead — resolution chain
|
|
43
44
|
|
|
44
45
|
Stop at the first match:
|
|
45
46
|
|
|
46
|
-
1. **Req-first inheritance** — search `
|
|
47
|
-
Req number or role description
|
|
48
|
-
roles
|
|
49
|
-
manager and Domain lead from the Role file.
|
|
47
|
+
1. **Req-first inheritance** — search `2-Confidential/Roles/` for a file that
|
|
48
|
+
matches the Req number or the role description. Use a filename substring
|
|
49
|
+
lookup for req-less roles. Check the `**Status:**` field (open/closed). Then
|
|
50
|
+
inherit Hiring manager and Domain lead from the Role file.
|
|
50
51
|
2. **Calendar inference** —
|
|
51
52
|
`rg -l "{Candidate Name}" ~/.cache/fit/outpost/apple_calendar/`. The non-user
|
|
52
53
|
organizer of an interview event is likely the hiring manager.
|
|
53
|
-
3. **Email inference** — internal To/CC recipients (besides the
|
|
54
|
-
|
|
55
|
-
4. **Reporting chain** — read the hiring manager's `**Reports to:**` field
|
|
54
|
+
3. **Email inference** — cross-check internal To/CC recipients (besides the
|
|
55
|
+
user) against `3-Team/People/`.
|
|
56
|
+
4. **Reporting chain** — read the hiring manager's `**Reports to:**` field. Walk
|
|
56
57
|
up to a VP / senior leader for the domain lead.
|
|
57
58
|
5. **Staffing project timeline** — search staffing notes for the candidate or
|
|
58
|
-
vendor
|
|
59
|
+
vendor. The nearby context often names the manager.
|
|
59
60
|
|
|
60
61
|
If none resolve, set `—` and revisit on the next cycle.
|
|
61
62
|
|
|
62
63
|
## Gender
|
|
63
64
|
|
|
64
|
-
Record only when **explicitly
|
|
65
|
+
Record only when the source states it **explicitly**:
|
|
65
66
|
|
|
66
67
|
- Pronouns from the recruiter ("she is available", "her CV attached")
|
|
67
68
|
- Gendered titles ("Ms.", "Mrs.", "Mr.")
|
|
68
69
|
|
|
69
70
|
Record as `Woman`, `Man`, or `—` (unknown). When uncertain, use `—`. **Never
|
|
70
|
-
infer gender from names
|
|
71
|
-
biased. The field
|
|
71
|
+
infer gender from names.** Name-based inference is unreliable and culturally
|
|
72
|
+
biased. The field lets you track diversity in aggregate. It has no bearing on
|
|
72
73
|
hiring decisions, assessment criteria, or candidate visibility.
|
|
73
74
|
|
|
74
75
|
## Source and recruiter
|
|
75
76
|
|
|
76
|
-
- Map sender email domain to an organization in `
|
|
77
|
-
- The person who sent or forwarded the profile is the recruiter
|
|
78
|
-
`[[People/Name]]`.
|
|
79
|
-
-
|
|
77
|
+
- Map the sender email domain to an organization in `3-Team/Organizations/`.
|
|
78
|
+
- The person who sent or forwarded the profile is the recruiter. Link with
|
|
79
|
+
`[[3-Team/People/Name]]`.
|
|
80
|
+
- Write recruiter-side and agency-side backlinks on the entity's
|
|
81
|
+
`2-Confidential` overlay note ([overlays.md](overlays.md)), never on the
|
|
82
|
+
`3-Team` note. When the `3-Team` note is missing, keep the name as plain
|
|
83
|
+
text. `extract-entities` creates team notes.
|
|
80
84
|
|
|
81
85
|
## CV attachment
|
|
82
86
|
|
|
83
87
|
```bash
|
|
84
88
|
ls ~/.cache/fit/outpost/apple_mail/attachments/{thread_id}/
|
|
85
|
-
mkdir -p "
|
|
89
|
+
mkdir -p "2-Confidential/Candidates/{Full Name}"
|
|
86
90
|
cp "~/.cache/fit/outpost/apple_mail/attachments/{thread_id}/{file}" \
|
|
87
|
-
"
|
|
91
|
+
"2-Confidential/Candidates/{Full Name}/CV.pdf"
|
|
88
92
|
```
|
|
89
93
|
|
|
90
94
|
Use `CV.pdf` (PDF) or `CV.docx` (Word). The `## CV` link is `./CV.pdf`.
|
|
@@ -108,9 +112,9 @@ Match by name fragment (case-insensitive). Prefer the Downloads match. Always
|
|
|
108
112
|
write `headshot.jpeg`:
|
|
109
113
|
|
|
110
114
|
```bash
|
|
111
|
-
cp "{src}" "
|
|
115
|
+
cp "{src}" "2-Confidential/Candidates/{Full Name}/headshot.jpeg"
|
|
112
116
|
# PNG → JPEG
|
|
113
|
-
magick "{src}.png" "
|
|
117
|
+
magick "{src}.png" "2-Confidential/Candidates/{Full Name}/headshot.jpeg"
|
|
114
118
|
# HEIC → JPEG
|
|
115
|
-
magick "{src}.heic" "
|
|
119
|
+
magick "{src}.heic" "2-Confidential/Candidates/{Full Name}/headshot.jpeg"
|
|
116
120
|
```
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Overlay Notes
|
|
2
|
+
|
|
3
|
+
Backlink rules for Step 10 of `req-track`. `req-workday` and `req-assess`
|
|
4
|
+
follow the same rules.
|
|
5
|
+
|
|
6
|
+
## The rule
|
|
7
|
+
|
|
8
|
+
A `3-Team` note must not link into `2-Confidential`. Write every People-side,
|
|
9
|
+
Organization-side, and Project-side backlink on the entity's `2-Confidential`
|
|
10
|
+
overlay note, never on the `3-Team` note. The overlay declares its wide note
|
|
11
|
+
with a one-way `canonical` link: double-quoted, tier-prefixed, and
|
|
12
|
+
vault-absolute. Create the overlay when it is missing. When the `3-Team` note
|
|
13
|
+
itself is missing, keep the name as plain text. `extract-entities` creates
|
|
14
|
+
team notes.
|
|
15
|
+
|
|
16
|
+
## Overlay stub
|
|
17
|
+
|
|
18
|
+
File: `2-Confidential/People/{Name}.md` (or
|
|
19
|
+
`2-Confidential/Organizations/{Name}.md`, `2-Confidential/Projects/{Name}.md`
|
|
20
|
+
with the matching `type`).
|
|
21
|
+
|
|
22
|
+
```markdown
|
|
23
|
+
---
|
|
24
|
+
type: person
|
|
25
|
+
created: {YYYY-MM-DD}
|
|
26
|
+
updated: {YYYY-MM-DD}
|
|
27
|
+
aliases:
|
|
28
|
+
- "{Name} (recruitment)"
|
|
29
|
+
canonical: "[[3-Team/People/{Name}]]"
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
# {Name}
|
|
33
|
+
|
|
34
|
+
## Activity
|
|
35
|
+
- **{date}**: Presented [[2-Confidential/Candidates/{Candidate}/brief|{Candidate}]]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Assessment prose
|
|
39
|
+
|
|
40
|
+
Interview-outcome and assessment prose about a candidate lives only in the
|
|
41
|
+
candidate's own folder. A wider note, and an overlay, record only that an
|
|
42
|
+
event happened.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Recruitment Signals
|
|
2
2
|
|
|
3
3
|
Decide whether an email thread is recruitment-related. Skip threads that match
|
|
4
|
-
no signal
|
|
4
|
+
no signal. Most email is not recruitment-related.
|
|
5
5
|
|
|
6
6
|
## CV/resume attachments
|
|
7
7
|
|
|
@@ -10,25 +10,25 @@ no signal — most email is not.
|
|
|
10
10
|
|
|
11
11
|
## Recruiter sender domains
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
recruitment agency. When no agencies are catalogued yet, treat these
|
|
15
|
-
hints:
|
|
13
|
+
The sender domain maps to an organization in `3-Team/Organizations/` tagged
|
|
14
|
+
as a recruitment agency. When no agencies are catalogued yet, treat these
|
|
15
|
+
patterns as hints:
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
17
|
+
- The same sender presents multiple candidates
|
|
18
|
+
- The profile uses a structured format (rate, availability, skills)
|
|
19
|
+
- The sender forwards candidate CVs on behalf of others
|
|
20
20
|
|
|
21
21
|
## Profile presentation patterns
|
|
22
22
|
|
|
23
|
-
Structured candidate descriptions
|
|
23
|
+
Structured candidate descriptions that contain:
|
|
24
24
|
|
|
25
25
|
- "Rate:" or rate/cost information
|
|
26
26
|
- "Availability:" or notice period
|
|
27
27
|
- "English:" or language level
|
|
28
28
|
- "Location:" or country/city
|
|
29
|
-
- Candidate name + role
|
|
29
|
+
- Candidate name + role format (e.g. "Staff Software Engineer")
|
|
30
30
|
- "years of experience" / "YoE"
|
|
31
|
-
-
|
|
31
|
+
- Lists of skills or the tech stack
|
|
32
32
|
|
|
33
33
|
## Interview scheduling
|
|
34
34
|
|
|
@@ -38,5 +38,5 @@ Structured candidate descriptions containing:
|
|
|
38
38
|
|
|
39
39
|
## Follow-up on existing candidates
|
|
40
40
|
|
|
41
|
-
A thread mentions a candidate already in `
|
|
42
|
-
|
|
41
|
+
A thread mentions a candidate already in `2-Confidential/Candidates/` by name.
|
|
42
|
+
Process it to update the pipeline status.
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
# Pipeline Statuses
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
Step 3 of `req-track` uses these statuses. Default to `new` if you find no
|
|
4
|
+
advancement signals. Read the full thread chronologically. The most recent
|
|
5
|
+
signal wins.
|
|
5
6
|
|
|
6
7
|
## Statuses
|
|
7
8
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Templates
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Backlink rules and the overlay stub live in [overlays.md](overlays.md).
|
|
4
4
|
|
|
5
5
|
## Role file stub
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Step 3 stub for a Req with no Role file, in `2-Confidential/Roles/`.
|
|
8
8
|
|
|
9
9
|
```markdown
|
|
10
10
|
# {Title from candidate Req field}
|
|
@@ -36,23 +36,31 @@ Used by Step 0b when a Req appears on a candidate brief but no Role file exists.
|
|
|
36
36
|
|
|
37
37
|
## Role Candidates table
|
|
38
38
|
|
|
39
|
-
Step
|
|
39
|
+
Step 3 scans briefs and rebuilds this table on each Role file. Sort by First
|
|
40
|
+
seen, newest first:
|
|
40
41
|
|
|
41
42
|
```markdown
|
|
42
43
|
## Candidates
|
|
43
44
|
| Candidate | Status | Channel | First seen |
|
|
44
45
|
|---|---|---|---|
|
|
45
|
-
| [[Candidates/{Name}/brief\|{Name}]] | {status} | {channel} | {date} |
|
|
46
|
+
| [[2-Confidential/Candidates/{Name}/brief\|{Name}]] | {status} | {channel} | {date} |
|
|
46
47
|
```
|
|
47
48
|
|
|
48
|
-
Sort by First seen, newest first.
|
|
49
|
-
|
|
50
49
|
## Candidate brief
|
|
51
50
|
|
|
52
|
-
|
|
53
|
-
`
|
|
51
|
+
Step 8 uses this template for new candidates. File:
|
|
52
|
+
`2-Confidential/Candidates/{Full Name}/brief.md`. Frontmatter `status` uses
|
|
53
|
+
the registry vocabulary; the body `**Status:**` keeps the pipeline stage.
|
|
54
54
|
|
|
55
55
|
```markdown
|
|
56
|
+
---
|
|
57
|
+
type: candidate
|
|
58
|
+
created: {YYYY-MM-DD}
|
|
59
|
+
updated: {YYYY-MM-DD}
|
|
60
|
+
aliases: [{alternate spellings, or an empty list}]
|
|
61
|
+
status: {registry status: new / screening / interviewing / offer / hired / rejected / withdrawn}
|
|
62
|
+
---
|
|
63
|
+
|
|
56
64
|
# {Full Name}
|
|
57
65
|
|
|
58
66
|
## Info
|
|
@@ -62,7 +70,7 @@ Used by Step 5 for new candidates. File:
|
|
|
62
70
|
**English:** {level or "—"}
|
|
63
71
|
**Location:** {location or "—"}
|
|
64
72
|
**Gender:** {Woman / Man / —}
|
|
65
|
-
**Source:** [[Organizations/{Agency}]] via [[People/{Recruiter Name}]]
|
|
73
|
+
**Source:** [[3-Team/Organizations/{Agency}]] via [[3-Team/People/{Recruiter Name}]]
|
|
66
74
|
**Status:** {pipeline status}
|
|
67
75
|
**First seen:** {YYYY-MM-DD}
|
|
68
76
|
**Last activity:** {YYYY-MM-DD}
|
|
@@ -75,11 +83,11 @@ Used by Step 5 for new candidates. File:
|
|
|
75
83
|
- [CV.pdf](./CV.pdf)
|
|
76
84
|
|
|
77
85
|
## Connected to
|
|
78
|
-
- [[Organizations/{Agency}]] — sourced by
|
|
79
|
-
- [[People/{Recruiter}]] — recruiter
|
|
80
|
-
- [[Roles/{Role filename without .md}]] — applied to
|
|
81
|
-
- [[People/{Hiring manager}]] — hiring manager
|
|
82
|
-
- [[People/{Domain lead}]] — domain lead
|
|
86
|
+
- [[3-Team/Organizations/{Agency}]] — sourced by
|
|
87
|
+
- [[3-Team/People/{Recruiter}]] — recruiter
|
|
88
|
+
- [[2-Confidential/Roles/{Role filename without .md}]] — applied to
|
|
89
|
+
- [[3-Team/People/{Hiring manager}]] — hiring manager
|
|
90
|
+
- [[3-Team/People/{Domain lead}]] — domain lead
|
|
83
91
|
|
|
84
92
|
## Pipeline
|
|
85
93
|
- **{date}**: {event}
|
|
@@ -87,40 +95,33 @@ Used by Step 5 for new candidates. File:
|
|
|
87
95
|
## Skills
|
|
88
96
|
{comma-separated agent-aligned engineering standard skill IDs}
|
|
89
97
|
|
|
90
|
-
## Interview Notes
|
|
91
|
-
{omit section if no interviews yet}
|
|
92
|
-
|
|
93
98
|
## Notes
|
|
94
99
|
{free-form observations — always present, even if empty}
|
|
95
100
|
```
|
|
96
101
|
|
|
97
|
-
Omit `## CV` when no CV attachment exists.
|
|
98
|
-
|
|
99
102
|
## Extra Info fields
|
|
100
103
|
|
|
101
104
|
Place after `Last activity`, in this order, only when known:
|
|
102
105
|
|
|
103
106
|
```markdown
|
|
104
107
|
**Role:** {internal requisition profile, e.g. "Staff Engineer"}
|
|
105
|
-
**Req:** [[Roles/{filename}|{req number}]] — {title}
|
|
108
|
+
**Req:** [[2-Confidential/Roles/{filename}|{req number}]] — {title}
|
|
106
109
|
**Channel:** {hr / vendor}
|
|
107
|
-
**Hiring manager:** {[[People/{name}]] or "—"}
|
|
108
|
-
**Domain lead:** {[[People/{name}]] or "—"}
|
|
110
|
+
**Hiring manager:** {[[3-Team/People/{name}]] or "—"}
|
|
111
|
+
**Domain lead:** {[[3-Team/People/{name}]] or "—"}
|
|
109
112
|
**Internal/External:** {Internal / External / External (Prior Worker)}
|
|
110
113
|
**Model:** {engagement model, e.g. "B2B (via Agency) — conversion to FTE not possible"}
|
|
111
114
|
**Current title:** {current job title and employer}
|
|
112
115
|
**Email:** {personal or work email}
|
|
113
116
|
**Phone:** {phone number}
|
|
114
117
|
**LinkedIn:** {profile URL}
|
|
115
|
-
**Also known as:** {alternate spellings}
|
|
118
|
+
**Also known as:** {alternate spellings — mirror them into `aliases`}
|
|
116
119
|
```
|
|
117
120
|
|
|
118
121
|
For vendor-pipeline candidates the Req backlink uses
|
|
119
|
-
`[[Roles/{filename}|Vendor]] — {description}`.
|
|
120
|
-
|
|
121
|
-
## Optional sections
|
|
122
|
+
`[[2-Confidential/Roles/{filename}|Vendor]] — {description}`.
|
|
122
123
|
|
|
123
|
-
Add between `## Skills` and `## Notes
|
|
124
|
+
Add optional sections between `## Skills` and `## Notes`, in this order:
|
|
124
125
|
`## Education`, `## Certifications`, `## Work History`, `## Key Facts`,
|
|
125
126
|
`## Interview Notes` (`### YYYY-MM-DD — {description}` per interview).
|
|
126
127
|
|