@forwardimpact/outpost 3.0.3

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 (120) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +15 -0
  3. package/bin/fit-outpost.js +3 -0
  4. package/config/scheduler.json +34 -0
  5. package/package.json +63 -0
  6. package/src/agent-runner.js +189 -0
  7. package/src/index.js +5 -0
  8. package/src/kb-manager.js +228 -0
  9. package/src/outpost.js +417 -0
  10. package/src/scheduler.js +195 -0
  11. package/src/socket-server.js +336 -0
  12. package/src/state-manager.js +126 -0
  13. package/templates/.claude/agents/chief-of-staff.md +58 -0
  14. package/templates/.claude/agents/concierge.md +46 -0
  15. package/templates/.claude/agents/head-hunter.md +57 -0
  16. package/templates/.claude/agents/librarian.md +60 -0
  17. package/templates/.claude/agents/postman.md +47 -0
  18. package/templates/.claude/agents/recruiter.md +63 -0
  19. package/templates/.claude/settings.json +88 -0
  20. package/templates/.claude/skills/candidate-report/SKILL.md +139 -0
  21. package/templates/.claude/skills/candidate-report/references/report-template.html +203 -0
  22. package/templates/.claude/skills/candidate-report/references/report.css +438 -0
  23. package/templates/.claude/skills/candidate-report/references/rubric.md +76 -0
  24. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +48 -0
  25. package/templates/.claude/skills/deck-create/SKILL.md +75 -0
  26. package/templates/.claude/skills/deck-create/references/slide.css +35 -0
  27. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +47 -0
  28. package/templates/.claude/skills/deck-summarize/SKILL.md +139 -0
  29. package/templates/.claude/skills/deck-summarize/references/brief-template.md +85 -0
  30. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +210 -0
  31. package/templates/.claude/skills/doc-collab/SKILL.md +112 -0
  32. package/templates/.claude/skills/doc-create/SKILL.md +105 -0
  33. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +50 -0
  34. package/templates/.claude/skills/draft-emails/SKILL.md +141 -0
  35. package/templates/.claude/skills/draft-emails/references/template.md +26 -0
  36. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +66 -0
  37. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +139 -0
  38. package/templates/.claude/skills/extract-entities/SKILL.md +187 -0
  39. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +14 -0
  40. package/templates/.claude/skills/extract-entities/references/conditions.md +55 -0
  41. package/templates/.claude/skills/extract-entities/references/content.md +104 -0
  42. package/templates/.claude/skills/extract-entities/references/links.md +48 -0
  43. package/templates/.claude/skills/extract-entities/references/recruitment.md +57 -0
  44. package/templates/.claude/skills/extract-entities/references/resolution.md +71 -0
  45. package/templates/.claude/skills/extract-entities/references/sources.md +70 -0
  46. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +36 -0
  47. package/templates/.claude/skills/extract-entities/references/templates-goals-priorities.md +63 -0
  48. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +67 -0
  49. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +68 -0
  50. package/templates/.claude/skills/extract-entities/scripts/state.mjs +131 -0
  51. package/templates/.claude/skills/hyprnote-follow/SKILL.md +174 -0
  52. package/templates/.claude/skills/hyprnote-follow/references/coaching.md +118 -0
  53. package/templates/.claude/skills/hyprnote-follow/references/debrief.md +59 -0
  54. package/templates/.claude/skills/hyprnote-follow/references/meeting-types.md +14 -0
  55. package/templates/.claude/skills/hyprnote-follow/scripts/follow.mjs +243 -0
  56. package/templates/.claude/skills/hyprnote-process/SKILL.md +147 -0
  57. package/templates/.claude/skills/hyprnote-process/references/extraction.md +84 -0
  58. package/templates/.claude/skills/hyprnote-process/references/sessions.md +81 -0
  59. package/templates/.claude/skills/hyprnote-process/scripts/scan.mjs +246 -0
  60. package/templates/.claude/skills/hyprnote-trim/SKILL.md +177 -0
  61. package/templates/.claude/skills/manage-tasks/SKILL.md +152 -0
  62. package/templates/.claude/skills/manage-tasks/references/format.md +73 -0
  63. package/templates/.claude/skills/meeting-prep/SKILL.md +180 -0
  64. package/templates/.claude/skills/organize-files/SKILL.md +146 -0
  65. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +105 -0
  66. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +91 -0
  67. package/templates/.claude/skills/req-assess/SKILL.md +137 -0
  68. package/templates/.claude/skills/req-assess/references/interview-template.md +62 -0
  69. package/templates/.claude/skills/req-assess/references/panel-template.md +117 -0
  70. package/templates/.claude/skills/req-assess/references/rubric.md +65 -0
  71. package/templates/.claude/skills/req-decide/SKILL.md +163 -0
  72. package/templates/.claude/skills/req-decide/references/rubric.md +63 -0
  73. package/templates/.claude/skills/req-decide/references/template.md +118 -0
  74. package/templates/.claude/skills/req-forget/SKILL.md +154 -0
  75. package/templates/.claude/skills/req-forget/references/classify.md +23 -0
  76. package/templates/.claude/skills/req-forget/references/locations.md +59 -0
  77. package/templates/.claude/skills/req-forget/references/report-template.md +67 -0
  78. package/templates/.claude/skills/req-scan/SKILL.md +145 -0
  79. package/templates/.claude/skills/req-scan/references/fallbacks.md +76 -0
  80. package/templates/.claude/skills/req-scan/references/filters.md +83 -0
  81. package/templates/.claude/skills/req-scan/references/sources.md +76 -0
  82. package/templates/.claude/skills/req-scan/references/state.md +54 -0
  83. package/templates/.claude/skills/req-scan/references/template.md +36 -0
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +396 -0
  85. package/templates/.claude/skills/req-screen/SKILL.md +151 -0
  86. package/templates/.claude/skills/req-screen/references/rubric.md +94 -0
  87. package/templates/.claude/skills/req-screen/references/template.md +91 -0
  88. package/templates/.claude/skills/req-track/SKILL.md +189 -0
  89. package/templates/.claude/skills/req-track/references/fields.md +114 -0
  90. package/templates/.claude/skills/req-track/references/signals.md +42 -0
  91. package/templates/.claude/skills/req-track/references/statuses.md +32 -0
  92. package/templates/.claude/skills/req-track/references/templates.md +127 -0
  93. package/templates/.claude/skills/req-workday/SKILL.md +162 -0
  94. package/templates/.claude/skills/req-workday/references/field-mapping.md +40 -0
  95. package/templates/.claude/skills/req-workday/references/status-mapping.md +38 -0
  96. package/templates/.claude/skills/req-workday/references/templates.md +126 -0
  97. package/templates/.claude/skills/req-workday/references/xlsx-format.md +56 -0
  98. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +313 -0
  99. package/templates/.claude/skills/send-chat/SKILL.md +170 -0
  100. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +145 -0
  101. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +80 -0
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +307 -0
  103. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +332 -0
  104. package/templates/.claude/skills/sync-apple-mail/SKILL.md +151 -0
  105. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +115 -0
  106. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +389 -0
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +372 -0
  108. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +239 -0
  109. package/templates/.claude/skills/sync-teams/SKILL.md +177 -0
  110. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +147 -0
  111. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +288 -0
  112. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +381 -0
  113. package/templates/.claude/skills/upstream-skill/SKILL.md +130 -0
  114. package/templates/.claude/skills/upstream-skill/references/examples.md +80 -0
  115. package/templates/.claude/skills/weekly-update/SKILL.md +141 -0
  116. package/templates/.claude/skills/weekly-update/references/template.md +55 -0
  117. package/templates/CLAUDE.md +134 -0
  118. package/templates/USER.md +3 -0
  119. package/templates/apm.yml +5 -0
  120. package/templates/knowledge/Briefings/.gitkeep +0 -0
@@ -0,0 +1,127 @@
1
+ # Templates
2
+
3
+ Markdown templates used by `req-track` for Role files and Candidate briefs.
4
+
5
+ ## Role file stub
6
+
7
+ Used by Step 0b when a Req appears on a candidate brief but no Role file exists.
8
+
9
+ ```markdown
10
+ # {Title from candidate Req field}
11
+
12
+ ## Info
13
+ **Req:** {req number}
14
+ **Title:** {title from Req field}
15
+ **Level:** —
16
+ **Track:** —
17
+ **Discipline:** —
18
+ **Domain lead:** —
19
+ **Hiring manager:** —
20
+ **Locations:** —
21
+ **Positions:** —
22
+ **Channel:** hr
23
+ **Status:** open
24
+ **Opened:** —
25
+ **Last activity:** {today}
26
+
27
+ ## Connected to
28
+ - Staffing/recruitment project
29
+
30
+ ## Candidates
31
+ <!-- Rebuilt each cycle -->
32
+
33
+ ## Notes
34
+ - Stub created automatically — enrich with data from emails, calendar, and imports.
35
+ ```
36
+
37
+ ## Role Candidates table
38
+
39
+ Step 0b rebuilds this table on each Role file by scanning briefs:
40
+
41
+ ```markdown
42
+ ## Candidates
43
+ | Candidate | Status | Channel | First seen |
44
+ |---|---|---|---|
45
+ | [[Candidates/{Name}/brief\|{Name}]] | {status} | {channel} | {date} |
46
+ ```
47
+
48
+ Sort by First seen, newest first.
49
+
50
+ ## Candidate brief
51
+
52
+ Used by Step 5 for new candidates. File:
53
+ `knowledge/Candidates/{Full Name}/brief.md`.
54
+
55
+ ```markdown
56
+ # {Full Name}
57
+
58
+ ## Info
59
+ **Title:** {professional title/function}
60
+ **Rate:** {rate or "—"}
61
+ **Availability:** {availability or "—"}
62
+ **English:** {level or "—"}
63
+ **Location:** {location or "—"}
64
+ **Gender:** {Woman / Man / —}
65
+ **Source:** [[Organizations/{Agency}]] via [[People/{Recruiter Name}]]
66
+ **Status:** {pipeline status}
67
+ **First seen:** {YYYY-MM-DD}
68
+ **Last activity:** {YYYY-MM-DD}
69
+ {extra fields here — see below}
70
+
71
+ ## Summary
72
+ {2-3 sentences: role, experience level, key strengths}
73
+
74
+ ## CV
75
+ - [CV.pdf](./CV.pdf)
76
+
77
+ ## 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
83
+
84
+ ## Pipeline
85
+ - **{date}**: {event}
86
+
87
+ ## Skills
88
+ {comma-separated agent-aligned engineering standard skill IDs}
89
+
90
+ ## Interview Notes
91
+ {omit section if no interviews yet}
92
+
93
+ ## Notes
94
+ {free-form observations — always present, even if empty}
95
+ ```
96
+
97
+ Omit `## CV` when no CV attachment exists.
98
+
99
+ ## Extra Info fields
100
+
101
+ Place after `Last activity`, in this order, only when known:
102
+
103
+ ```markdown
104
+ **Role:** {internal requisition profile, e.g. "Staff Engineer"}
105
+ **Req:** [[Roles/{filename}|{req number}]] — {title}
106
+ **Channel:** {hr / vendor}
107
+ **Hiring manager:** {[[People/{name}]] or "—"}
108
+ **Domain lead:** {[[People/{name}]] or "—"}
109
+ **Internal/External:** {Internal / External / External (Prior Worker)}
110
+ **Model:** {engagement model, e.g. "B2B (via Agency) — conversion to FTE not possible"}
111
+ **Current title:** {current job title and employer}
112
+ **Email:** {personal or work email}
113
+ **Phone:** {phone number}
114
+ **LinkedIn:** {profile URL}
115
+ **Also known as:** {alternate spellings}
116
+ ```
117
+
118
+ For vendor-pipeline candidates the Req backlink uses
119
+ `[[Roles/{filename}|Vendor]] — {description}`.
120
+
121
+ ## Optional sections
122
+
123
+ Add between `## Skills` and `## Notes` when data is rich enough, in this order:
124
+ `## Education`, `## Certifications`, `## Work History`, `## Key Facts`,
125
+ `## Interview Notes` (`### YYYY-MM-DD — {description}` per interview).
126
+
127
+ `## Notes` is always last. If `## Open Items` exists, place it after Notes.
@@ -0,0 +1,162 @@
1
+ ---
2
+ name: req-workday
3
+ description: >
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
7
+ with the existing req-track pipeline. Use when the user provides a
8
+ Workday export file or asks to import candidates from an XLSX requisition
9
+ export.
10
+ ---
11
+
12
+ # Workday Requisition Import
13
+
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.
18
+
19
+ ## Trigger
20
+
21
+ - The user provides a Workday requisition export (`.xlsx`).
22
+ - The user asks to import candidates from Workday or an XLSX export.
23
+ - The user mentions a requisition ID and asks to process the export.
24
+
25
+ ## Prerequisites
26
+
27
+ - A Workday requisition export accessible on the filesystem.
28
+ - `read-excel-file` package installed:
29
+ `bun pm ls read-excel-file 2>/dev/null || bun install read-excel-file`.
30
+ - User identity in `USER.md`.
31
+
32
+ ## Inputs
33
+
34
+ - Path to the `.xlsx` file (e.g. `~/Downloads/4951493_…(Open).xlsx`).
35
+
36
+ ## Outputs
37
+
38
+ - `knowledge/Candidates/{Clean Name}/brief.md` — candidate profile.
39
+ - `knowledge/Candidates/{Clean Name}/CV.md` — resume text as markdown.
40
+ - `knowledge/Roles/{Req ID} — {Title}.md` — created or updated.
41
+ - Updated existing briefs when a candidate already exists.
42
+
43
+ <do_confirm_checklist goal="Verify the Workday import is consistent with
44
+ req-track">
45
+
46
+ - [ ] XLSX parsed; candidate count matches the parser summary.
47
+ - [ ] Requisition metadata extracted (ID, title; HM/recruiter when available).
48
+ - [ ] Each candidate has a directory under `knowledge/Candidates/{Clean Name}/`
49
+ (annotation stripped).
50
+ - [ ] `CV.md` created for every candidate with resume text — faithfully
51
+ reproduced (no rewriting).
52
+ - [ ] Pipeline status mapped from **Step / Disposition** (not Stage); raw step
53
+ preserved in the Pipeline entry.
54
+ - [ ] Internal/External derived from name annotations and source.
55
+ - [ ] Existing candidates updated via targeted edits (not duplicated).
56
+ - [ ] Skills tagged with standard IDs; Gender set to `—` (export has no signal);
57
+ Channel = `hr`; Req backlinks to the Role file.
58
+
59
+ </do_confirm_checklist>
60
+
61
+ ## Procedure
62
+
63
+ Process **10 candidates per run**.
64
+
65
+ ### 1. Set up
66
+
67
+ Read `USER.md`. Confirm the XLSX path. Ensure the parser dependency is
68
+ installed:
69
+
70
+ ```bash
71
+ bun pm ls read-excel-file 2>/dev/null || bun install read-excel-file
72
+ ```
73
+
74
+ ### 2. Parse the export
75
+
76
+ ```bash
77
+ node .claude/skills/req-workday/scripts/parse-workday.mjs "<path>" --summary
78
+ ```
79
+
80
+ Review the summary for sanity (candidate count, header detection). For the JSON
81
+ consumed by later steps:
82
+
83
+ ```bash
84
+ node .claude/skills/req-workday/scripts/parse-workday.mjs "<path>"
85
+ ```
86
+
87
+ The output is `{ requisition, candidates }`. Format details (sheet shapes,
88
+ header indices, name annotations) are in
89
+ [references/xlsx-format.md](references/xlsx-format.md).
90
+
91
+ ### 3. Create or update the Role file
92
+
93
+ ```bash
94
+ ls knowledge/Roles/ | grep "{Req ID}"
95
+ ```
96
+
97
+ Use the **Role file stub** in
98
+ [references/templates.md](references/templates.md). Resolve the domain lead by:
99
+
100
+ 1. `rg "{Req ID}" knowledge/` — look in project timelines, People notes, Topics
101
+ for context.
102
+ 2. Reading the hiring manager's People note for `**Reports to:**` and walking up
103
+ to a VP or senior leader.
104
+ 3. Falling back to `Domain lead: —` for later cycles.
105
+
106
+ If the Role file already exists, follow the existing-file rules in
107
+ `references/templates.md`.
108
+
109
+ ### 4. Build the candidate index
110
+
111
+ ```bash
112
+ ls -d knowledge/Candidates/*/ 2>/dev/null
113
+ ```
114
+
115
+ Match imported candidates against existing notes by name (fuzzy — middle names,
116
+ accents, spelling variations).
117
+
118
+ ### 5. Determine pipeline status
119
+
120
+ Map **Step / Disposition** to the `req-track` status using
121
+ [references/status-mapping.md](references/status-mapping.md). Preserve the raw
122
+ step value in the Pipeline entry.
123
+
124
+ ### 6. Write `CV.md`
125
+
126
+ For every candidate with resume text, create
127
+ `knowledge/Candidates/{Clean Name}/CV.md` using the **CV.md template** in
128
+ [references/templates.md](references/templates.md).
129
+
130
+ ### 7. Write or update the brief
131
+
132
+ Column-to-field map: [references/field-mapping.md](references/field-mapping.md).
133
+ Brief layout (new candidates) and edit rules (existing candidates):
134
+ [references/templates.md](references/templates.md).
135
+
136
+ ```bash
137
+ mkdir -p "knowledge/Candidates/{Clean Name}"
138
+ ```
139
+
140
+ For existing candidates, apply targeted Edit operations only — never rewrite the
141
+ file.
142
+
143
+ ### 8. Capture insights
144
+
145
+ After the batch, review for strategic observations and add bullets to
146
+ `knowledge/Candidates/Insights.md` under `## Placement Notes` with
147
+ `[[Candidates/Name/brief|Name]]` links. See `req-track` Step 5b for the
148
+ inclusion criteria.
149
+
150
+ ### 9. Tag skills
151
+
152
+ ```bash
153
+ bunx fit-pathway skill --list
154
+ ```
155
+
156
+ Use standard skill IDs in each brief's `## Skills` section. Flag candidates with
157
+ a `CV.md` for `req-screen`.
158
+
159
+ ### 10. Batch and report
160
+
161
+ Process 10 candidates per run. Report `Processed {N}/{Total}`. If more remain,
162
+ tell the user how many and offer to continue.
@@ -0,0 +1,40 @@
1
+ # Field Mapping
2
+
3
+ Reference for `req-workday` Step 5. Map Workday columns to candidate brief
4
+ fields.
5
+
6
+ ## Core columns
7
+
8
+ | Header | Maps to brief field… |
9
+ | ---------------------- | ------------------------------------------------- |
10
+ | Job Application | `# {Name}` |
11
+ | Stage | Row detection only (not used for status) |
12
+ | Step / Disposition | **Workday step** → status (see status-mapping.md) |
13
+ | Resume | Reference only (no file) |
14
+ | Date Applied | **First seen** |
15
+ | Current Job Title | **Current title**, Title |
16
+ | Current Company | **Current title** suffix |
17
+ | Source | **Source** |
18
+ | Referred by | **Source** suffix |
19
+ | Candidate Location | **Location** |
20
+ | Phone | **Phone** |
21
+ | Email | **Email** |
22
+ | Availability Date | **Availability** |
23
+ | Visa Requirement | Notes |
24
+ | Eligible to Work | Notes |
25
+ | Relocation | Notes |
26
+ | Salary Expectations | **Rate** |
27
+ | Non-Compete | Notes |
28
+ | Total Years Experience | Summary context |
29
+ | All Job Titles | Work History context |
30
+ | Companies | Work History context |
31
+ | Degrees | Education |
32
+ | Fields of Study | Education |
33
+ | Language | **English** / Language |
34
+ | Resume Text | `CV.md` content |
35
+
36
+ ## Extra info field order
37
+
38
+ After `Last activity`, in this order, only when known: `Req`,
39
+ `Internal/External`, `Current title`, `Email`, `Phone`, `LinkedIn`. Follow the
40
+ same order as `req-track`.
@@ -0,0 +1,38 @@
1
+ # Step → Status Mapping
2
+
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).
6
+
7
+ | Workday Step / Disposition | Pipeline status |
8
+ | -------------------------------------- | ------------------ |
9
+ | `Considered` | `new` |
10
+ | `Review` | `new` |
11
+ | `Manager Resume Screen` | `screening` |
12
+ | `Schedule Recruiter Phone Screen` | `screening` |
13
+ | `Manager Request to Move Forward (HS)` | `screening` |
14
+ | `Proposed Interview Slate` | `screening` |
15
+ | `Assessment` | `screening` |
16
+ | `Manager Request to Decline (HS)` | `rejected` |
17
+ | `Interview` / `Phone Screen` | `first-interview` |
18
+ | `Second Interview` | `second-interview` |
19
+ | `Reference Check` | `second-interview` |
20
+ | `Offer` | `offer` |
21
+ | `Employment Agreement` | `offer` |
22
+ | `Background Check` | `hired` |
23
+ | `Ready for Hire` | `hired` |
24
+ | `Rejected` / `Declined` | `rejected` |
25
+
26
+ Empty or unrecognized step → default to `new`.
27
+
28
+ ## Preserving the raw step
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.
32
+
33
+ ```
34
+ - **2026-02-10**: Applied via LinkedIn — Step: Manager Request to Move Forward (HS)
35
+ ```
36
+
37
+ This lets the user filter and query candidates by their exact Workday
38
+ disposition.
@@ -0,0 +1,126 @@
1
+ # Output Templates
2
+
3
+ Reference templates for `req-workday` Steps 1b, 4, and 5.
4
+
5
+ ## Role file stub
6
+
7
+ Use when no Role file exists for the requisition. Filename:
8
+ `knowledge/Roles/{Req ID} — {Short Title}.md`.
9
+
10
+ ```markdown
11
+ # {Requisition Title}
12
+
13
+ ## Info
14
+ **Req:** {Req ID}
15
+ **Title:** {Full title from export}
16
+ **Level:** {Infer from title: "Principal" → J100, "Staff" → J090, "Director" → J100 M-track, "Senior" → J070}
17
+ **Track:** {P-track for IC roles, M-track for Director/Manager roles}
18
+ **Discipline:** {Infer: "Software Engineer" → software_engineering, "Data Engineer" → data_engineering, "Data Scientist" → data_science}
19
+ **Domain lead:** —
20
+ **Hiring manager:** {From export metadata if available, or "—"}
21
+ **Locations:** {Primary Location from export}
22
+ **Positions:** —
23
+ **Channel:** hr
24
+ **Status:** open
25
+ **Opened:** {Recruiting Start Date from export}
26
+ **Last activity:** {today}
27
+
28
+ ## Connected to
29
+ - Staffing/recruitment project
30
+
31
+ ## Candidates
32
+ <!-- Rebuilt by req-track role sync -->
33
+
34
+ ## Notes
35
+ - Created from requisition export on {today}.
36
+ ```
37
+
38
+ If the Role file already exists: set `Hiring manager` only when the export
39
+ provides one and the field is `—`; update `Last activity` to today; append
40
+ `- Requisition export processed on {today}: {N} candidates` to Notes.
41
+
42
+ ## CV.md template
43
+
44
+ Save to `knowledge/Candidates/{Clean Name}/CV.md` when resume text exists. Skip
45
+ when it doesn't.
46
+
47
+ ```markdown
48
+ # {Clean Name} — Resume
49
+
50
+ > Extracted from Workday requisition export {Req ID} on {today's date}.
51
+ > Original file: {Resume filename from column G}
52
+
53
+ ---
54
+
55
+ {Resume text from column AC, preserving original formatting}
56
+ ```
57
+
58
+ **Formatting:** preserve paragraph breaks; convert ALL-CAPS headers to
59
+ `## Heading`; keep bullets/lists; never rewrite or summarise.
60
+
61
+ ## Candidate brief
62
+
63
+ Save to `knowledge/Candidates/{Clean Name}/brief.md`. Format follows
64
+ `req-track`.
65
+
66
+ ```markdown
67
+ # {Clean Name}
68
+
69
+ ## Info
70
+ **Title:** {Current Job Title or "—"}
71
+ **Rate:** {Salary Expectations or "—"}
72
+ **Availability:** {Availability Date or "—"}
73
+ **English:** {Language field or "—"}
74
+ **Location:** {Candidate Location or "—"}
75
+ **Gender:** —
76
+ **Source:** {Source} {via Referred by, if present}
77
+ **Status:** {pipeline status}
78
+ **First seen:** {Date Applied, YYYY-MM-DD}
79
+ **Last activity:** {Date Applied, YYYY-MM-DD}
80
+ **Req:** [[Roles/{Role filename}|{Req ID}]] — {Req Title}
81
+ **Channel:** hr
82
+ **Hiring manager:** {From Role file or "—"}
83
+ **Domain lead:** {From Role file or "—"}
84
+ **Internal/External:** {Internal / External / External (Prior Worker)}
85
+ **Current title:** {Current Job Title at Current Company}
86
+ **Email:** {Email or "—"}
87
+ **Phone:** {Phone or "—"}
88
+
89
+ ## Summary
90
+ {2–3 sentences from resume text: focus, years of experience, key strengths.
91
+ Fall back to Current Job Title + Total Years Experience.}
92
+
93
+ ## CV
94
+ - [CV.md](./CV.md)
95
+
96
+ ## Connected to
97
+ - [[Roles/{Role filename}]] — applied to
98
+ - {[[People/{Hiring manager}]] — hiring manager, if known}
99
+ - {[[People/{Domain lead}]] — domain lead, if known}
100
+ - {Referred-by person, if present}
101
+
102
+ ## Pipeline
103
+ - **{Date Applied}**: Applied via {Source} — Step: {Workday step}
104
+
105
+ ## Skills
106
+ {Agent-aligned standard skill IDs from `bunx fit-pathway skill --list`}
107
+
108
+ ## Education
109
+ {Degrees + Fields of Study}
110
+
111
+ ## Work History
112
+ {All Job Titles + Companies}
113
+
114
+ ## Notes
115
+ {Visa, Eligibility, Relocation, Non-compete, Years experience}
116
+ ```
117
+
118
+ Gender is `—` (Workday exports carry no gender signals).
119
+
120
+ ## Existing-candidate edits
121
+
122
+ Apply targeted edits to `brief.md` — never rewrite. Set/update `Req`, advance
123
+ `Status` if the Workday step is more advanced, update `Last activity`, append
124
+ `**{Date Applied}**: Applied to {Req ID} — {Title} via {Source}` to Pipeline,
125
+ fill only missing Email/Phone/ Location. Never overwrite richer existing data
126
+ with sparser Workday data.
@@ -0,0 +1,56 @@
1
+ # Workday Export Format
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.
6
+
7
+ ## Sheet 1 — requisition metadata
8
+
9
+ ### Old format (key/value)
10
+
11
+ | Row | Field | Example |
12
+ | --- | --------------------- | -------------------------------------- |
13
+ | 1 | Title header | `4951493 Principal Software Engineer…` |
14
+ | 2 | Recruiting Start Date | `02/10/2026` |
15
+ | 3 | Target Hire Date | `02/10/2026` |
16
+ | 4 | Primary Location | `USA - NY - Headquarters` |
17
+ | 5 | Hiring Manager Title | `Hiring Manager` |
18
+ | 6 | Hiring Manager | Name |
19
+ | 7 | Recruiter Title | `Recruiter` |
20
+ | 8 | Recruiter | Name |
21
+
22
+ ### New format (stage-count summary)
23
+
24
+ | Row | Field | Example |
25
+ | --- | ----------------- | -------------------------------------- |
26
+ | 1 | Title header | `4951493 Principal Software Engineer…` |
27
+ | 2 | Active Candidates | `74 of 74` |
28
+ | 3 | Active Referrals | `3 of 3` |
29
+ | 4 | Active Internal | `4 of 4` |
30
+ | 7+ | Stage counts | `56 → Considered` |
31
+
32
+ The new format does not carry hiring manager, recruiter, or location.
33
+
34
+ ## Candidates sheet
35
+
36
+ Auto-detected:
37
+
38
+ - **Old format:** 3+ sheets; candidates on the "Candidates" sheet or Sheet3;
39
+ header at row 3 (index 2); two "Job Application" columns.
40
+ - **New format:** 2 sheets; candidates on Sheet2; header at row 8 (index 7);
41
+ single "Job Application" column.
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.
46
+
47
+ ## Name annotations
48
+
49
+ Names may include parenthetical annotations:
50
+
51
+ - `(Prior Worker)` → Internal/External = `External (Prior Worker)`.
52
+ - `(Internal)` → Internal/External = `Internal`.
53
+ - No annotation, source contains "Internal" → `Internal`.
54
+ - Otherwise → `External`.
55
+
56
+ Strip the annotation from the directory name and the brief heading.