@forwardimpact/outpost 3.11.0 → 3.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +4 -4
- package/src/agent-path.js +10 -6
- package/src/agent-runner.js +28 -24
- package/src/index.js +2 -3
- package/src/kb-manager.js +21 -19
- package/src/outpost.js +37 -33
- package/src/posture.js +3 -3
- package/src/privilege.js +11 -11
- package/src/scheduler.js +14 -12
- package/src/socket-server.js +19 -18
- package/src/spawn-env.js +7 -6
- package/src/state-manager.js +2 -2
- package/templates/.claude/agents/chief-of-staff.md +22 -22
- package/templates/.claude/agents/concierge.md +19 -17
- package/templates/.claude/agents/head-hunter.md +27 -26
- package/templates/.claude/agents/librarian.md +17 -16
- package/templates/.claude/agents/postman.md +19 -18
- package/templates/.claude/agents/recruiter.md +31 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
- package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
- package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
- package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
- package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
- package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
- package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
- package/templates/.claude/skills/candidate-report/references/report.css +4 -4
- package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
- package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
- package/templates/.claude/skills/changelog/SKILL.md +55 -50
- package/templates/.claude/skills/deck-create/SKILL.md +30 -30
- package/templates/.claude/skills/deck-create/references/slide.css +4 -4
- package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/deck-review/SKILL.md +59 -57
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
- package/templates/.claude/skills/doc-create/SKILL.md +21 -20
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
- package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +5 -5
- package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
- package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
- package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
- package/templates/.claude/skills/organize-files/SKILL.md +24 -22
- package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
- package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
- package/templates/.claude/skills/person-identify/SKILL.md +24 -22
- package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
- package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
- package/templates/.claude/skills/req-assess/SKILL.md +27 -27
- package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
- package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-decide/SKILL.md +28 -25
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-forget/SKILL.md +28 -26
- package/templates/.claude/skills/req-forget/references/classify.md +13 -13
- package/templates/.claude/skills/req-forget/references/locations.md +2 -2
- package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
- package/templates/.claude/skills/req-scan/SKILL.md +21 -22
- package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
- package/templates/.claude/skills/req-scan/references/filters.md +13 -13
- package/templates/.claude/skills/req-scan/references/sources.md +7 -7
- package/templates/.claude/skills/req-scan/references/state.md +1 -1
- package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +31 -29
- package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
- package/templates/.claude/skills/req-screen/references/template.md +4 -4
- package/templates/.claude/skills/req-track/SKILL.md +40 -40
- package/templates/.claude/skills/req-track/references/fields.md +19 -18
- package/templates/.claude/skills/req-track/references/signals.md +12 -12
- package/templates/.claude/skills/req-track/references/statuses.md +3 -2
- package/templates/.claude/skills/req-track/references/templates.md +4 -4
- package/templates/.claude/skills/req-workday/SKILL.md +24 -24
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +13 -13
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
- package/templates/.claude/skills/send-chat/SKILL.md +47 -43
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
- package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
- package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
- package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
- package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
- package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
- package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
- package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
- package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
- package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
- package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
- package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
- package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
- package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
- package/templates/CLAUDE.md +40 -37
|
@@ -7,14 +7,14 @@ description: Scan synced email threads for recruitment candidates, extract struc
|
|
|
7
7
|
|
|
8
8
|
Scan synced email threads from `~/.cache/fit/outpost/apple_mail/` for
|
|
9
9
|
recruitment candidates. Extract structured candidate profiles and create or
|
|
10
|
-
update notes in `Knowledge/Candidates/`.
|
|
11
|
-
pipeline from scattered email threads.
|
|
10
|
+
update notes in `Knowledge/Candidates/`. This skill builds a local, searchable
|
|
11
|
+
recruitment pipeline from scattered email threads.
|
|
12
12
|
|
|
13
13
|
## Trigger
|
|
14
14
|
|
|
15
15
|
- The user asks to track, process, or update candidates.
|
|
16
16
|
- The user asks about recruitment pipeline status.
|
|
17
|
-
- After `sync-apple-mail`
|
|
17
|
+
- After `sync-apple-mail` pulls new threads.
|
|
18
18
|
|
|
19
19
|
## Prerequisites
|
|
20
20
|
|
|
@@ -34,15 +34,15 @@ pipeline from scattered email threads.
|
|
|
34
34
|
- `~/.cache/fit/outpost/state/graph_processed` — processed-file index (shared
|
|
35
35
|
with `extract-entities`).
|
|
36
36
|
- `~/.cache/fit/outpost/state/identity.md` — user identity for self-exclusion
|
|
37
|
-
(
|
|
37
|
+
(the `person-identify` skill writes it).
|
|
38
38
|
|
|
39
39
|
## Outputs
|
|
40
40
|
|
|
41
41
|
- `Knowledge/Candidates/{Full Name}/brief.md` — candidate profile note.
|
|
42
42
|
- `Knowledge/Candidates/{Full Name}/CV.pdf` (or `CV.docx`) — local CV copy.
|
|
43
43
|
- `Knowledge/Candidates/{Full Name}/headshot.jpeg` — candidate photo.
|
|
44
|
-
- `Knowledge/Roles/*.md` — role files created
|
|
45
|
-
determines visibility (open/closed).
|
|
44
|
+
- `Knowledge/Roles/*.md` — role files created or updated. The `**Status:**`
|
|
45
|
+
field determines visibility (open/closed).
|
|
46
46
|
- `~/.cache/fit/outpost/state/graph_processed` — updated with processed threads.
|
|
47
47
|
|
|
48
48
|
<do_confirm_checklist goal="Verify candidate processing batch is complete and
|
|
@@ -50,17 +50,17 @@ correct">
|
|
|
50
50
|
|
|
51
51
|
- [ ] Required Info fields present on every brief (Title, Source, Status, First
|
|
52
52
|
seen, Last activity, Channel).
|
|
53
|
-
- [ ] Pipeline status reflects latest thread activity
|
|
54
|
-
order.
|
|
53
|
+
- [ ] Pipeline status reflects the latest thread activity. Timeline in
|
|
54
|
+
chronological order.
|
|
55
55
|
- [ ] Bidirectional links present (Candidate ↔ Org / Recruiter / Role /
|
|
56
56
|
Project).
|
|
57
|
-
- [ ] Role files synced
|
|
57
|
+
- [ ] Role files synced. Candidates tables rebuilt. Stubs created for any
|
|
58
58
|
unknown reqs.
|
|
59
59
|
- [ ] CV and headshot copied into the candidate directory when available.
|
|
60
60
|
- [ ] Skills tagged with agent-aligned engineering standard IDs from
|
|
61
61
|
`bunx fit-pathway skill --list`.
|
|
62
62
|
- [ ] Gender field populated only from explicit pronouns or titles.
|
|
63
|
-
- [ ] No duplicate candidate notes
|
|
63
|
+
- [ ] No duplicate candidate notes. All processed threads marked in the state
|
|
64
64
|
file.
|
|
65
65
|
|
|
66
66
|
</do_confirm_checklist>
|
|
@@ -72,14 +72,14 @@ Process **10 files per run**.
|
|
|
72
72
|
### 1. Load context and pick the batch
|
|
73
73
|
|
|
74
74
|
Read the user's name, email, and domain from
|
|
75
|
-
`~/.cache/fit/outpost/state/identity.md
|
|
76
|
-
if
|
|
75
|
+
`~/.cache/fit/outpost/state/identity.md`. Run the `person-identify` skill first
|
|
76
|
+
if that file is missing or stale. List new or changed source files:
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
79
|
node .claude/skills/extract-entities/scripts/state.mjs check
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
-
Filter the output to `apple_mail/*.md` only
|
|
82
|
+
Filter the output to `apple_mail/*.md` only. Calendar files are not relevant
|
|
83
83
|
here.
|
|
84
84
|
|
|
85
85
|
### 2. Build candidate, people, and org indexes
|
|
@@ -95,49 +95,49 @@ links.
|
|
|
95
95
|
|
|
96
96
|
### 3. Sync `Knowledge/Roles/`
|
|
97
97
|
|
|
98
|
-
Role files are flat here
|
|
98
|
+
Role files are flat here. The `**Status:**` field is `open` or `closed`.
|
|
99
99
|
|
|
100
100
|
1. Read each Role file's Info block to map Req → Role file path, Hiring manager,
|
|
101
101
|
Domain lead, recruiter, Channel. Look up by filename substring so a req-less
|
|
102
102
|
role stays findable: `ls Knowledge/Roles/ | grep "{partial_name_or_req}"`.
|
|
103
|
-
2. Find Reqs in candidate briefs
|
|
103
|
+
2. Find Reqs in candidate briefs that have no Role file:
|
|
104
104
|
`rg "^\*\*Req:\*\*" Knowledge/Candidates/*/brief.md`. Check all Role files
|
|
105
|
-
first
|
|
106
|
-
open`
|
|
107
|
-
[references/templates.md](references/templates.md)
|
|
105
|
+
first. For a genuinely missing open role, create a stub with
|
|
106
|
+
`**Status:** open` from the **Role file stub** in
|
|
107
|
+
[references/templates.md](references/templates.md). Then enrich:
|
|
108
108
|
`rg "{req_number}" Knowledge/`.
|
|
109
|
-
3.
|
|
109
|
+
3. Scan briefs to rebuild each **open** Role file's `## Candidates` table:
|
|
110
110
|
`rg -l "Req:.*{req_number}" Knowledge/Candidates/*/brief.md`. Use the **Role
|
|
111
111
|
Candidates table** format from `references/templates.md`, newest first.
|
|
112
112
|
4. If a Role file has a hiring manager but no domain lead, walk the
|
|
113
113
|
`**Reports to:**` chain in `Knowledge/People/` to a VP or senior leader.
|
|
114
114
|
5. When a role closes (filled, cancelled, or frozen 6+ months), set its
|
|
115
|
-
`**Status:**` field to `closed
|
|
115
|
+
`**Status:**` field to `closed`. Do this only on a clear signal.
|
|
116
116
|
|
|
117
117
|
### 4. Identify recruitment threads
|
|
118
118
|
|
|
119
119
|
For each thread in the batch, decide whether it contains recruitment content
|
|
120
|
-
|
|
120
|
+
with the signals in [references/signals.md](references/signals.md). Skip
|
|
121
121
|
threads that match no signal.
|
|
122
122
|
|
|
123
123
|
### 5. Extract candidate data
|
|
124
124
|
|
|
125
|
-
For each candidate
|
|
126
|
-
[references/fields.md](references/fields.md).
|
|
127
|
-
|
|
128
|
-
|
|
125
|
+
For each candidate you find, populate the field map from
|
|
126
|
+
[references/fields.md](references/fields.md). It covers field sources, the
|
|
127
|
+
`Channel` rule, the hiring-manager / domain-lead resolution chain, gender rules,
|
|
128
|
+
source/recruiter resolution, how to copy a CV, and headshot discovery.
|
|
129
129
|
|
|
130
130
|
### 6. Determine pipeline status
|
|
131
131
|
|
|
132
|
-
Assign a status
|
|
132
|
+
Assign a status with the table and advancement signals in
|
|
133
133
|
[references/statuses.md](references/statuses.md). Default to `new`. Read the
|
|
134
|
-
full thread chronologically
|
|
134
|
+
full thread chronologically. The most recent signal wins.
|
|
135
135
|
|
|
136
136
|
### 7. Build the pipeline timeline
|
|
137
137
|
|
|
138
|
-
Extract a chronological timeline
|
|
139
|
-
event
|
|
140
|
-
forwarded headers).
|
|
138
|
+
Extract a chronological timeline. Write one `**{date}**: {event}` line per
|
|
139
|
+
meaningful event. Each line captures who did what. Skip noise (signature
|
|
140
|
+
blocks, disclaimers, forwarded headers).
|
|
141
141
|
|
|
142
142
|
### 8. Write or update the candidate note
|
|
143
143
|
|
|
@@ -147,22 +147,22 @@ the **Candidate brief** template in
|
|
|
147
147
|
fields** after `Last activity` in the order shown there. Add the **Optional
|
|
148
148
|
sections** when data warrants. Omit `## CV` if no attachment.
|
|
149
149
|
|
|
150
|
-
For **existing** candidates, apply targeted edits
|
|
151
|
-
|
|
150
|
+
For **existing** candidates, apply targeted edits. Do not rewrite the file.
|
|
151
|
+
Update `Status` and `Last activity`, append Pipeline entries, fill in newly
|
|
152
152
|
known Info fields, and add new Skills.
|
|
153
153
|
|
|
154
154
|
### 9. Capture cross-candidate insights
|
|
155
155
|
|
|
156
156
|
Update `Knowledge/Candidates/Insights.md` only when an observation is
|
|
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
|
|
157
|
+
high-signal: the candidate may suit a **different role**, is a **strong match**
|
|
158
|
+
for a specific team or leader, a meaningful **comparison between candidates**,
|
|
159
|
+
or you must **remember a hiring trade-off across sessions**.
|
|
160
160
|
|
|
161
|
-
Skip per-candidate status and generic strengths/weaknesses
|
|
161
|
+
Skip per-candidate status and generic strengths/weaknesses. Those belong on
|
|
162
162
|
`brief.md`. Format: one bullet under `## Placement Notes` with
|
|
163
163
|
`[[Candidates/Name/brief|Name]]` and relevant people/org backlinks.
|
|
164
164
|
|
|
165
|
-
### 10.
|
|
165
|
+
### 10. Make sure links are bidirectional
|
|
166
166
|
|
|
167
167
|
| If you add... | Then also add... |
|
|
168
168
|
| ------------------------ | ---------------------------------------------------------- |
|
|
@@ -173,7 +173,7 @@ Skip per-candidate status and generic strengths/weaknesses — those belong on
|
|
|
173
173
|
|
|
174
174
|
Use absolute paths: `[[Candidates/Name/brief|Name]]`,
|
|
175
175
|
`[[Organizations/Agency]]`, `[[People/Recruiter]]`. Only add a backlink when the
|
|
176
|
-
target note
|
|
176
|
+
target note does not already reference the candidate.
|
|
177
177
|
|
|
178
178
|
### 11. Mark each thread processed
|
|
179
179
|
|
|
@@ -181,8 +181,8 @@ target note doesn't already reference the candidate.
|
|
|
181
181
|
node .claude/skills/extract-entities/scripts/state.mjs update "{file_path}"
|
|
182
182
|
```
|
|
183
183
|
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
`req-track` and `extract-entities` share this state. Neither skill re-scans the
|
|
185
|
+
thread until it changes.
|
|
186
186
|
|
|
187
187
|
### 12. Tag skills against the standard
|
|
188
188
|
|
|
@@ -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 |
|
|
@@ -35,46 +35,47 @@ Field map and resolution rules for Step 2 of `req-track`.
|
|
|
35
35
|
|
|
36
36
|
- `vendor` — Source links to an `[[Organizations/...]]` 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 `Knowledge/Roles/` for a file
|
|
47
|
-
Req number or role description
|
|
48
|
-
roles
|
|
49
|
-
manager and Domain lead from the Role file.
|
|
47
|
+
1. **Req-first inheritance** — search `Knowledge/Roles/` for a file that matches
|
|
48
|
+
the Req number or the role description. Use a filename substring lookup for
|
|
49
|
+
req-less roles. Check the `**Status:**` field (open/closed). Then inherit
|
|
50
|
+
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 `Knowledge/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 `Knowledge/Organizations/`.
|
|
77
|
-
- The person who sent or forwarded the profile is the recruiter
|
|
77
|
+
- Map the sender email domain to an organization in `Knowledge/Organizations/`.
|
|
78
|
+
- The person who sent or forwarded the profile is the recruiter. Link with
|
|
78
79
|
`[[People/Name]]`.
|
|
79
80
|
- Create the organization or recruiter notes if missing.
|
|
80
81
|
|
|
@@ -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 `Knowledge/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 `Knowledge/Candidates/` by name
|
|
42
|
-
|
|
41
|
+
A thread mentions a candidate already in `Knowledge/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
|
+
`req-track` uses these markdown templates for Role files and Candidate briefs.
|
|
4
4
|
|
|
5
5
|
## Role file stub
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Step 0b uses this stub when a candidate brief has a Req but no Role file exists.
|
|
8
8
|
|
|
9
9
|
```markdown
|
|
10
10
|
# {Title from candidate Req field}
|
|
@@ -36,7 +36,7 @@ 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 0b rebuilds this table on each Role file
|
|
39
|
+
Step 0b scans briefs and rebuilds this table on each Role file:
|
|
40
40
|
|
|
41
41
|
```markdown
|
|
42
42
|
## Candidates
|
|
@@ -49,7 +49,7 @@ Sort by First seen, newest first.
|
|
|
49
49
|
|
|
50
50
|
## Candidate brief
|
|
51
51
|
|
|
52
|
-
|
|
52
|
+
Step 5 uses this template for new candidates. File:
|
|
53
53
|
`Knowledge/Candidates/{Full Name}/brief.md`.
|
|
54
54
|
|
|
55
55
|
```markdown
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
name: req-workday
|
|
3
3
|
description: >
|
|
4
4
|
Import candidates from a Workday requisition export (.xlsx) into
|
|
5
|
-
Knowledge/Candidates/.
|
|
6
|
-
creates candidate briefs and CV.md files from resume text
|
|
5
|
+
Knowledge/Candidates/. It parses requisition metadata and candidate data.
|
|
6
|
+
It creates candidate briefs and CV.md files from resume text. It integrates
|
|
7
7
|
with the existing req-track pipeline. Use when the user provides a
|
|
8
8
|
Workday export file or asks to import candidates from an XLSX requisition
|
|
9
9
|
export.
|
|
@@ -12,9 +12,9 @@ description: >
|
|
|
12
12
|
# Workday Requisition Import
|
|
13
13
|
|
|
14
14
|
Import candidates from a Workday requisition export (`.xlsx`) into
|
|
15
|
-
`Knowledge/Candidates/`. Extract requisition metadata and candidate profiles
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
`Knowledge/Candidates/`. Extract requisition metadata and candidate profiles.
|
|
16
|
+
Create standardized briefs and `CV.md` files from the embedded resume text.
|
|
17
|
+
Integrate with the `req-track` pipeline format.
|
|
18
18
|
|
|
19
19
|
## Trigger
|
|
20
20
|
|
|
@@ -45,18 +45,18 @@ integrate with the `req-track` pipeline format.
|
|
|
45
45
|
<do_confirm_checklist goal="Verify the Workday import is consistent with
|
|
46
46
|
req-track">
|
|
47
47
|
|
|
48
|
-
- [ ] XLSX parsed
|
|
48
|
+
- [ ] XLSX parsed. Candidate count matches the parser summary.
|
|
49
49
|
- [ ] Requisition metadata extracted (ID, title; HM/recruiter when available).
|
|
50
50
|
- [ ] Each candidate has a directory under `Knowledge/Candidates/{Clean Name}/`
|
|
51
51
|
(annotation stripped).
|
|
52
|
-
- [ ] `CV.md` created for every candidate with resume text
|
|
53
|
-
|
|
54
|
-
- [ ] Pipeline status mapped from **Step / Disposition** (not Stage)
|
|
52
|
+
- [ ] `CV.md` created for every candidate with resume text. Text reproduced
|
|
53
|
+
faithfully, with no rewrite.
|
|
54
|
+
- [ ] Pipeline status mapped from **Step / Disposition** (not Stage). Raw step
|
|
55
55
|
preserved in the Pipeline entry.
|
|
56
56
|
- [ ] Internal/External derived from name annotations and source.
|
|
57
|
-
- [ ] Existing candidates updated
|
|
58
|
-
- [ ] Skills tagged with standard IDs
|
|
59
|
-
Channel = `hr
|
|
57
|
+
- [ ] Existing candidates updated with targeted edits (not duplicated).
|
|
58
|
+
- [ ] Skills tagged with standard IDs. Gender set to `—` (export has no signal).
|
|
59
|
+
Channel = `hr`. Req backlinks to the Role file.
|
|
60
60
|
|
|
61
61
|
</do_confirm_checklist>
|
|
62
62
|
|
|
@@ -66,9 +66,9 @@ Process **10 candidates per run**.
|
|
|
66
66
|
|
|
67
67
|
### 1. Set up
|
|
68
68
|
|
|
69
|
-
Read the user's identity from `~/.cache/fit/outpost/state/identity.md
|
|
70
|
-
`person-identify` skill first if
|
|
71
|
-
|
|
69
|
+
Read the user's identity from `~/.cache/fit/outpost/state/identity.md`. Run the
|
|
70
|
+
`person-identify` skill first if that file is missing or stale. Confirm the
|
|
71
|
+
XLSX path. Make sure the parser dependency is installed:
|
|
72
72
|
|
|
73
73
|
```bash
|
|
74
74
|
bun pm ls read-excel-file 2>/dev/null || bun install read-excel-file
|
|
@@ -81,7 +81,7 @@ node .claude/skills/req-workday/scripts/parse-workday.mjs "<path>" --summary
|
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
Review the summary for sanity (candidate count, header detection). For the JSON
|
|
84
|
-
|
|
84
|
+
that later steps consume:
|
|
85
85
|
|
|
86
86
|
```bash
|
|
87
87
|
node .claude/skills/req-workday/scripts/parse-workday.mjs "<path>"
|
|
@@ -99,13 +99,13 @@ ls Knowledge/Roles/ | grep "{Req ID}"
|
|
|
99
99
|
|
|
100
100
|
New role files go in `Knowledge/Roles/` with `**Status:** open`. Use the
|
|
101
101
|
**Role file stub** in
|
|
102
|
-
[references/templates.md](references/templates.md). Resolve the domain lead
|
|
102
|
+
[references/templates.md](references/templates.md). Resolve the domain lead:
|
|
103
103
|
|
|
104
104
|
1. `rg "{Req ID}" Knowledge/` — look in project timelines, People notes, Topics
|
|
105
105
|
for context.
|
|
106
|
-
2.
|
|
107
|
-
|
|
108
|
-
3.
|
|
106
|
+
2. Read the hiring manager's People note for `**Reports to:**` and walk up to a
|
|
107
|
+
VP or senior leader.
|
|
108
|
+
3. Fall back to `Domain lead: —` for later cycles.
|
|
109
109
|
|
|
110
110
|
If the Role file already exists, follow the existing-file rules in
|
|
111
111
|
`references/templates.md`.
|
|
@@ -121,14 +121,14 @@ accents, spelling variations).
|
|
|
121
121
|
|
|
122
122
|
### 5. Determine pipeline status
|
|
123
123
|
|
|
124
|
-
Map **Step / Disposition** to the `req-track` status
|
|
124
|
+
Map **Step / Disposition** to the `req-track` status with
|
|
125
125
|
[references/status-mapping.md](references/status-mapping.md). Preserve the raw
|
|
126
126
|
step value in the Pipeline entry.
|
|
127
127
|
|
|
128
128
|
### 6. Write `CV.md`
|
|
129
129
|
|
|
130
130
|
For every candidate with resume text, create
|
|
131
|
-
`Knowledge/Candidates/{Clean Name}/CV.md`
|
|
131
|
+
`Knowledge/Candidates/{Clean Name}/CV.md` with the **CV.md template** in
|
|
132
132
|
[references/templates.md](references/templates.md).
|
|
133
133
|
|
|
134
134
|
### 7. Write or update the brief
|
|
@@ -141,12 +141,12 @@ Brief layout (new candidates) and edit rules (existing candidates):
|
|
|
141
141
|
mkdir -p "Knowledge/Candidates/{Clean Name}"
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
For existing candidates, apply targeted Edit operations only
|
|
144
|
+
For existing candidates, apply targeted Edit operations only. Never rewrite the
|
|
145
145
|
file.
|
|
146
146
|
|
|
147
147
|
### 8. Capture insights
|
|
148
148
|
|
|
149
|
-
After the batch, review for strategic observations
|
|
149
|
+
After the batch, review for strategic observations. Add bullets to
|
|
150
150
|
`Knowledge/Candidates/Insights.md` under `## Placement Notes` with
|
|
151
151
|
`[[Candidates/Name/brief|Name]]` links. See `req-track` Step 5b for the
|
|
152
152
|
inclusion criteria.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Step → Status Mapping
|
|
2
2
|
|
|
3
3
|
Reference for `req-workday` Step 3. Map the **Step / Disposition** column to the
|
|
4
|
-
`req-track` pipeline status. Do **not** use the Stage column for status
|
|
5
|
-
|
|
4
|
+
`req-track` pipeline status. Do **not** use the Stage column for status. Use
|
|
5
|
+
Stage only for row detection (stop condition).
|
|
6
6
|
|
|
7
7
|
| Workday Step / Disposition | Pipeline status |
|
|
8
8
|
| -------------------------------------- | ------------------ |
|
|
@@ -25,10 +25,10 @@ is only used for row detection (stop condition).
|
|
|
25
25
|
|
|
26
26
|
Empty or unrecognized step → default to `new`.
|
|
27
27
|
|
|
28
|
-
##
|
|
28
|
+
## Preserve the raw step
|
|
29
29
|
|
|
30
|
-
The raw `step` value
|
|
31
|
-
|
|
30
|
+
The parser always preserves the raw `step` value in its JSON output. Store that
|
|
31
|
+
value in the candidate brief's `## Pipeline` section, e.g.
|
|
32
32
|
|
|
33
33
|
```text
|
|
34
34
|
- **2026-02-10**: Applied via LinkedIn — Step: Manager Request to Move Forward (HS)
|
|
@@ -5,8 +5,8 @@ Reference templates for `req-workday` Steps 1b, 4, and 5.
|
|
|
5
5
|
## Role file stub
|
|
6
6
|
|
|
7
7
|
Use when no Role file exists for the requisition. Filename:
|
|
8
|
-
`Knowledge/Roles/{Req ID} — {Short Title}.md`.
|
|
9
|
-
(`open`/`closed`)
|
|
8
|
+
`Knowledge/Roles/{Req ID} — {Short Title}.md`. Update the `**Status:**` field
|
|
9
|
+
(`open`/`closed`) in place. Never move files.
|
|
10
10
|
|
|
11
11
|
```markdown
|
|
12
12
|
# {Requisition Title}
|
|
@@ -37,14 +37,14 @@ Use when no Role file exists for the requisition. Filename:
|
|
|
37
37
|
- Created from requisition export on {today}.
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
If the Role file already exists
|
|
41
|
-
provides one and the field is
|
|
42
|
-
`- Requisition export processed on {today}: {N} candidates` to Notes.
|
|
40
|
+
If the Role file already exists, set `Hiring manager` only when the export
|
|
41
|
+
provides one and the field is `—`. Then update `Last activity` to today. Then
|
|
42
|
+
append `- Requisition export processed on {today}: {N} candidates` to Notes.
|
|
43
43
|
|
|
44
44
|
## CV.md template
|
|
45
45
|
|
|
46
46
|
Save to `Knowledge/Candidates/{Clean Name}/CV.md` when resume text exists. Skip
|
|
47
|
-
when it
|
|
47
|
+
the file when it does not.
|
|
48
48
|
|
|
49
49
|
```markdown
|
|
50
50
|
# {Clean Name} — Resume
|
|
@@ -57,8 +57,8 @@ when it doesn't.
|
|
|
57
57
|
{Resume text from column AC, preserving original formatting}
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
**Formatting:** preserve paragraph breaks
|
|
61
|
-
`## Heading
|
|
60
|
+
**Formatting:** preserve paragraph breaks. Convert ALL-CAPS headers to
|
|
61
|
+
`## Heading`. Keep bullets and lists. Never rewrite or summarise.
|
|
62
62
|
|
|
63
63
|
## Candidate brief
|
|
64
64
|
|
|
@@ -121,8 +121,8 @@ Gender is `—` (Workday exports carry no gender signals).
|
|
|
121
121
|
|
|
122
122
|
## Existing-candidate edits
|
|
123
123
|
|
|
124
|
-
Apply targeted edits to `brief.md
|
|
125
|
-
`Status` if the Workday step is more advanced
|
|
126
|
-
`**{Date Applied}**: Applied to {Req ID} — {Title} via {Source}` to
|
|
127
|
-
|
|
128
|
-
with sparser Workday data.
|
|
124
|
+
Apply targeted edits to `brief.md`. Never rewrite it. Set or update `Req`.
|
|
125
|
+
Advance `Status` if the Workday step is more advanced. Update `Last activity`.
|
|
126
|
+
Append `**{Date Applied}**: Applied to {Req ID} — {Title} via {Source}` to
|
|
127
|
+
Pipeline. Fill only missing Email, Phone, and Location. Never overwrite richer
|
|
128
|
+
existing data with sparser Workday data.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Workday Export Format
|
|
2
2
|
|
|
3
|
-
Reference for `req-workday`. The export format varies between Workday versions
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
Reference for `req-workday`. The export format varies between Workday versions.
|
|
4
|
+
The parse script handles both. It maps columns by header and detects the header
|
|
5
|
+
row dynamically.
|
|
6
6
|
|
|
7
7
|
## Sheet 1 — requisition metadata
|
|
8
8
|
|
|
@@ -33,16 +33,16 @@ The new format does not carry hiring manager, recruiter, or location.
|
|
|
33
33
|
|
|
34
34
|
## Candidates sheet
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
The parser detects the format automatically:
|
|
37
37
|
|
|
38
38
|
- **Old format:** 3+ sheets; candidates on the "Candidates" sheet or Sheet3;
|
|
39
39
|
header at row 3 (index 2); two "Job Application" columns.
|
|
40
40
|
- **New format:** 2 sheets; candidates on Sheet2; header at row 8 (index 7);
|
|
41
41
|
single "Job Application" column.
|
|
42
42
|
|
|
43
|
-
Column mapping is header-driven
|
|
44
|
-
columns by name.
|
|
45
|
-
by", "Convenience Task")
|
|
43
|
+
Column mapping is header-driven. The parser reads the header row and maps
|
|
44
|
+
columns by name. It automatically handles columns that vary between exports
|
|
45
|
+
("Jobs Applied to", "Referred by", "Convenience Task").
|
|
46
46
|
|
|
47
47
|
## Name annotations
|
|
48
48
|
|