@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.
Files changed (114) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +4 -4
  4. package/src/agent-path.js +10 -6
  5. package/src/agent-runner.js +28 -24
  6. package/src/index.js +2 -3
  7. package/src/kb-manager.js +21 -19
  8. package/src/outpost.js +37 -33
  9. package/src/posture.js +3 -3
  10. package/src/privilege.js +11 -11
  11. package/src/scheduler.js +14 -12
  12. package/src/socket-server.js +19 -18
  13. package/src/spawn-env.js +7 -6
  14. package/src/state-manager.js +2 -2
  15. package/templates/.claude/agents/chief-of-staff.md +22 -22
  16. package/templates/.claude/agents/concierge.md +19 -17
  17. package/templates/.claude/agents/head-hunter.md +27 -26
  18. package/templates/.claude/agents/librarian.md +17 -16
  19. package/templates/.claude/agents/postman.md +19 -18
  20. package/templates/.claude/agents/recruiter.md +31 -27
  21. package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
  22. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  23. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
  24. package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
  25. package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
  26. package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
  27. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
  28. package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
  29. package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
  30. package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
  31. package/templates/.claude/skills/candidate-report/references/report.css +4 -4
  32. package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
  33. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
  34. package/templates/.claude/skills/changelog/SKILL.md +55 -50
  35. package/templates/.claude/skills/deck-create/SKILL.md +30 -30
  36. package/templates/.claude/skills/deck-create/references/slide.css +4 -4
  37. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
  38. package/templates/.claude/skills/deck-review/SKILL.md +59 -57
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
  44. package/templates/.claude/skills/doc-create/SKILL.md +21 -20
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
  50. package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +5 -5
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
  57. package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
  59. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
  60. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  61. package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
  62. package/templates/.claude/skills/organize-files/SKILL.md +24 -22
  63. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  64. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  65. package/templates/.claude/skills/person-identify/SKILL.md +24 -22
  66. package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
  67. package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
  68. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
  69. package/templates/.claude/skills/req-assess/SKILL.md +27 -27
  70. package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
  71. package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
  72. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  73. package/templates/.claude/skills/req-decide/SKILL.md +28 -25
  74. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  75. package/templates/.claude/skills/req-forget/SKILL.md +28 -26
  76. package/templates/.claude/skills/req-forget/references/classify.md +13 -13
  77. package/templates/.claude/skills/req-forget/references/locations.md +2 -2
  78. package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
  79. package/templates/.claude/skills/req-scan/SKILL.md +21 -22
  80. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  81. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  82. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  83. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  85. package/templates/.claude/skills/req-screen/SKILL.md +31 -29
  86. package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
  87. package/templates/.claude/skills/req-screen/references/template.md +4 -4
  88. package/templates/.claude/skills/req-track/SKILL.md +40 -40
  89. package/templates/.claude/skills/req-track/references/fields.md +19 -18
  90. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  91. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  92. package/templates/.claude/skills/req-track/references/templates.md +4 -4
  93. package/templates/.claude/skills/req-workday/SKILL.md +24 -24
  94. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  95. package/templates/.claude/skills/req-workday/references/templates.md +13 -13
  96. package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
  97. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
  98. package/templates/.claude/skills/send-chat/SKILL.md +47 -43
  99. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
  100. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  101. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  103. package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
  104. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  105. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  106. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  108. package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
  109. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  110. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  111. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  112. package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
  113. package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
  114. package/templates/CLAUDE.md +40 -37
@@ -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/`. Builds a local, searchable recruitment
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` has pulled new threads.
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
- (written by the `person-identify` skill).
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/updated; the `**Status:**` field
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; timeline in chronological
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 Candidates tables rebuilt, stubs created for any
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; all processed threads marked in the state
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` (run the `person-identify` skill first
76
- if it is missing or stale). List new or changed source files:
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 calendar files are not relevant
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; the `**Status:**` field is `open` or `closed`.
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 missing a Role file:
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; for a genuinely missing open role, create a stub with `**Status:**
106
- open` using the **Role file stub** in
107
- [references/templates.md](references/templates.md), then enrich:
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. Rebuild each **open** Role file's `## Candidates` table by scanning briefs:
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` only on a clear signal.
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
- using the signals in [references/signals.md](references/signals.md). Skip
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 found, populate the field map from
126
- [references/fields.md](references/fields.md). That reference covers field
127
- sources, the `Channel` rule, the hiring-manager / domain-lead resolution chain,
128
- gender rules, source/recruiter resolution, CV copying, and headshot discovery.
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 using the table and advancement signals in
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; the most recent signal wins.
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 one `**{date}**: {event}` line per meaningful
139
- event, capturing who did what. Skip noise (signature blocks, disclaimers,
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 do not rewrite the file:
151
- update `Status` and `Last activity`, append Pipeline entries, fill in newly
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** for
158
- a specific team or leader, a meaningful **comparison between candidates**, or a
159
- hiring trade-off needs to be **remembered across sessions**.
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 those belong on
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. Ensure bidirectional links
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 doesn't already reference the candidate.
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
- Shares state with `extract-entities`, so the thread won't be re-scanned by
185
- either skill until it changes.
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 being hired against | If available |
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 | If available |
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), or Req contains "via {vendor name}" rather than a system ID.
39
- - `hr` — candidate came through a hiring system (numeric Req), applied
40
- internally, or was submitted by an internal recruiter.
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 matching the
47
- Req number or role description (use filename substring lookup for req-less
48
- roles); check the `**Status:**` field (open/closed), then inherit Hiring
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 user)
54
- cross-checked against `Knowledge/People/`.
55
- 4. **Reporting chain** — read the hiring manager's `**Reports to:**` field; walk
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; surrounding context often names the manager.
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 stated**:
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** — name-based inference is unreliable and culturally
71
- biased. The field supports aggregate diversity tracking; it has no bearing on
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 link with
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 most email is not.
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
- Sender domain maps to an organization in `Knowledge/Organizations/` tagged as a
14
- recruitment agency. When no agencies are catalogued yet, treat these patterns as
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
- - Multiple candidates presented by the same sender
18
- - Structured profile formatting (rate, availability, skills)
19
- - Forwarding candidate CVs on behalf of others
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 containing:
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 formatting (e.g. "Staff Software Engineer")
29
+ - Candidate name + role format (e.g. "Staff Software Engineer")
30
30
  - "years of experience" / "YoE"
31
- - Skills/tech stack listings
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
- process it to update pipeline status.
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
- Used by Step 3 of `req-track`. Default to `new` if no advancement signals are
4
- found. Read the full thread chronologically; the most recent signal wins.
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
- Markdown templates used by `req-track` for Role files and Candidate briefs.
3
+ `req-track` uses these markdown templates for Role files and Candidate briefs.
4
4
 
5
5
  ## Role file stub
6
6
 
7
- Used by Step 0b when a Req appears on a candidate brief but no Role file exists.
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 by scanning briefs:
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
- Used by Step 5 for new candidates. File:
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/. Parses requisition metadata and candidate data,
6
- creates candidate briefs and CV.md files from resume text, and integrates
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
- create standardized briefs and `CV.md` files from the embedded resume text, and
17
- integrate with the `req-track` pipeline format.
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; candidate count matches the parser summary.
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 faithfully
53
- reproduced (no rewriting).
54
- - [ ] Pipeline status mapped from **Step / Disposition** (not Stage); raw step
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 via 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.
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` (run the
70
- `person-identify` skill first if it is missing or stale). Confirm the XLSX path.
71
- Ensure the parser dependency is installed:
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
- consumed by later steps:
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 by:
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. Reading the hiring manager's People note for `**Reports to:**` and walking up
107
- to a VP or senior leader.
108
- 3. Falling back to `Domain lead: —` for later cycles.
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 using
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` using the **CV.md template** in
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 never rewrite the
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 and add bullets to
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 — Stage
5
- is only used for row detection (stop condition).
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
- ## Preserving the raw step
28
+ ## Preserve the raw step
29
29
 
30
- The raw `step` value is always preserved in the parser's JSON output and must be
31
- stored in the candidate brief's `## Pipeline` section, e.g.
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`. The `**Status:**` field
9
- (`open`/`closed`) is updated in place never move files.
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: set `Hiring manager` only when the export
41
- provides one and the field is `—`; update `Last activity` to today; append
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 doesn't.
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; convert ALL-CAPS headers to
61
- `## Heading`; keep bullets/lists; never rewrite or summarise.
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` never rewrite. Set/update `Req`, advance
125
- `Status` if the Workday step is more advanced, update `Last activity`, append
126
- `**{Date Applied}**: Applied to {Req ID} — {Title} via {Source}` to Pipeline,
127
- fill only missing Email/Phone/ Location. Never overwrite richer existing data
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
- the parse script handles both with header-driven column mapping and dynamic
5
- header-row detection.
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
- Auto-detected:
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 the parser reads the header row and maps
44
- columns by name. Columns that vary between exports ("Jobs Applied to", "Referred
45
- by", "Convenience Task") are handled automatically.
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