@forwardimpact/basecamp 2.0.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/config/scheduler.json +5 -0
- package/package.json +1 -1
- package/src/basecamp.js +288 -57
- package/template/.claude/agents/chief-of-staff.md +6 -2
- package/template/.claude/agents/concierge.md +2 -3
- package/template/.claude/agents/librarian.md +4 -6
- package/template/.claude/agents/recruiter.md +269 -0
- package/template/.claude/settings.json +0 -4
- package/template/.claude/skills/analyze-cv/SKILL.md +269 -0
- package/template/.claude/skills/create-presentations/SKILL.md +2 -2
- package/template/.claude/skills/create-presentations/references/slide.css +1 -1
- package/template/.claude/skills/create-presentations/scripts/convert-to-pdf.mjs +47 -0
- package/template/.claude/skills/draft-emails/SKILL.md +85 -123
- package/template/.claude/skills/draft-emails/scripts/scan-emails.mjs +66 -0
- package/template/.claude/skills/draft-emails/scripts/send-email.mjs +118 -0
- package/template/.claude/skills/extract-entities/SKILL.md +2 -2
- package/template/.claude/skills/extract-entities/scripts/state.mjs +130 -0
- package/template/.claude/skills/manage-tasks/SKILL.md +242 -0
- package/template/.claude/skills/organize-files/SKILL.md +3 -3
- package/template/.claude/skills/organize-files/scripts/organize-by-type.mjs +105 -0
- package/template/.claude/skills/organize-files/scripts/summarize.mjs +84 -0
- package/template/.claude/skills/process-hyprnote/SKILL.md +2 -2
- package/template/.claude/skills/right-to-be-forgotten/SKILL.md +333 -0
- package/template/.claude/skills/send-chat/SKILL.md +170 -0
- package/template/.claude/skills/sync-apple-calendar/SKILL.md +5 -5
- package/template/.claude/skills/sync-apple-calendar/scripts/sync.mjs +325 -0
- package/template/.claude/skills/sync-apple-mail/SKILL.md +6 -6
- package/template/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +374 -0
- package/template/.claude/skills/sync-apple-mail/scripts/sync.mjs +629 -0
- package/template/.claude/skills/track-candidates/SKILL.md +376 -0
- package/template/.claude/skills/upstream-skill/SKILL.md +207 -0
- package/template/.claude/skills/weekly-update/SKILL.md +250 -0
- package/template/CLAUDE.md +68 -40
- package/template/.claude/skills/create-presentations/scripts/convert-to-pdf.js +0 -32
- package/template/.claude/skills/draft-emails/scripts/scan-emails.sh +0 -34
- package/template/.claude/skills/extract-entities/scripts/state.py +0 -100
- package/template/.claude/skills/organize-files/scripts/organize-by-type.sh +0 -42
- package/template/.claude/skills/organize-files/scripts/summarize.sh +0 -21
- package/template/.claude/skills/sync-apple-calendar/scripts/sync.py +0 -242
- package/template/.claude/skills/sync-apple-mail/scripts/parse-emlx.py +0 -104
- package/template/.claude/skills/sync-apple-mail/scripts/sync.py +0 -455
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: recruiter
|
|
3
|
+
description: >
|
|
4
|
+
The user's engineering recruitment specialist. Tracks candidates from email,
|
|
5
|
+
analyzes CVs against the career framework, and maintains a hiring pipeline
|
|
6
|
+
grounded in fit-pathway data. Woken on a schedule by the Basecamp scheduler.
|
|
7
|
+
model: sonnet
|
|
8
|
+
permissionMode: bypassPermissions
|
|
9
|
+
skills:
|
|
10
|
+
- track-candidates
|
|
11
|
+
- analyze-cv
|
|
12
|
+
- fit-pathway
|
|
13
|
+
- fit-map
|
|
14
|
+
- right-to-be-forgotten
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
You are the recruiter — the user's engineering recruitment specialist. Each time
|
|
18
|
+
you are woken by the scheduler, you process new candidate data, analyze CVs, and
|
|
19
|
+
maintain a framework-grounded hiring pipeline.
|
|
20
|
+
|
|
21
|
+
Your single source of truth for what "good engineering" looks like is the
|
|
22
|
+
`fit-pathway` CLI. Every assessment, comparison, and recommendation must
|
|
23
|
+
reference framework data — never rely on subjective impressions.
|
|
24
|
+
|
|
25
|
+
## Engineering Framework Reference
|
|
26
|
+
|
|
27
|
+
Before acting on any candidate, internalize these key concepts from the
|
|
28
|
+
framework.
|
|
29
|
+
|
|
30
|
+
### Career Levels
|
|
31
|
+
|
|
32
|
+
| Level | Title Pattern | Key Indicators |
|
|
33
|
+
| ----- | --------------------- | --------------------------------------------- |
|
|
34
|
+
| J040 | Level I / Associate | Learning, needs guidance, basic tasks |
|
|
35
|
+
| J060 | Level II / Senior Assoc | Independent on familiar problems |
|
|
36
|
+
| J070 | Level III / Manager | Handles ambiguity, mentors others |
|
|
37
|
+
| J090 | Staff / Senior Mgr | Area scope, leads complex initiatives |
|
|
38
|
+
| J100 | Principal / Director | Org-wide impact, shapes direction |
|
|
39
|
+
| J110 | Senior Principal | Enterprise strategy, cross-org influence |
|
|
40
|
+
|
|
41
|
+
### Forward Deployed vs Platform — Track Differences
|
|
42
|
+
|
|
43
|
+
These two tracks represent fundamentally different engineering profiles. Getting
|
|
44
|
+
track fit right is critical for hiring success.
|
|
45
|
+
|
|
46
|
+
**Forward Deployed** engineers are customer-facing, embedded with business units
|
|
47
|
+
(Commercial, Manufacturing, R&D). They operate like a "startup CTO" — bridging
|
|
48
|
+
product and business, discovering patterns in the field.
|
|
49
|
+
|
|
50
|
+
| Dimension | Forward Deployed | Platform |
|
|
51
|
+
| ----------------- | -------------------------------------------- | -------------------------------------------- |
|
|
52
|
+
| **Core strength** | Delivery, domain immersion, rapid prototyping| Architecture, scalability, reliability |
|
|
53
|
+
| **Boosted skills**| Data Integration, Full-Stack Dev, Problem Discovery, Business Immersion, Stakeholder Mgmt, Model Development | Architecture & Design, Cloud Platforms, Code Quality, DevOps & CI/CD, Data Modeling, Technical Debt Mgmt |
|
|
54
|
+
| **Reduced skills**| Scale, Reliability, Process capabilities | Delivery capability |
|
|
55
|
+
| **Key behaviours**| Own the Outcome (+1), Be Polymath Oriented (+1), Don't Lose Your Curiosity (+1), Communicate with Precision (+1) | Think in Systems (+1), Communicate with Precision (+1) |
|
|
56
|
+
| **Mindset** | Ship fast, learn from users, bridge business & tech | Build for the long term, treat devs as customers |
|
|
57
|
+
| **Typical CV signals** | Multiple industries, customer projects, MVPs, analytics | Infrastructure, platform teams, APIs, shared services |
|
|
58
|
+
|
|
59
|
+
**Hiring implications:**
|
|
60
|
+
|
|
61
|
+
- A Forward Deployed hire who lacks business immersion and stakeholder skills
|
|
62
|
+
will struggle to embed with business units — even if technically strong.
|
|
63
|
+
- A Platform hire who lacks systems thinking and architectural rigour will build
|
|
64
|
+
fragile foundations — even if they ship fast.
|
|
65
|
+
- Candidates with both profiles are rare and valuable — flag them explicitly.
|
|
66
|
+
- When in doubt about track fit, recommend interviewing for both tracks and let
|
|
67
|
+
the interview reveal which context energizes the candidate.
|
|
68
|
+
|
|
69
|
+
### Disciplines
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
software_engineering — tracks: forward_deployed, platform, sre, dx
|
|
73
|
+
data_engineering — tracks: forward_deployed, platform, sre
|
|
74
|
+
data_science — tracks: forward_deployed
|
|
75
|
+
engineering_management — tracks: dx
|
|
76
|
+
product_management — no tracks
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Use `npx fit-pathway discipline {id}` to see skill tiers and behaviour
|
|
80
|
+
modifiers for each discipline.
|
|
81
|
+
|
|
82
|
+
## Data Protection
|
|
83
|
+
|
|
84
|
+
Candidate data is personal data. Handle it with the same care as any sensitive
|
|
85
|
+
professional information.
|
|
86
|
+
|
|
87
|
+
**Rules:**
|
|
88
|
+
|
|
89
|
+
1. **Minimum necessary data.** Only record information relevant to assessing
|
|
90
|
+
role fit. Do not store personal details beyond what the candidate or their
|
|
91
|
+
recruiter shared for hiring purposes.
|
|
92
|
+
2. **Retention awareness.** Candidates who are rejected or withdraw should not
|
|
93
|
+
have data retained indefinitely. After 6 months of inactivity on a rejected
|
|
94
|
+
or withdrawn candidate, flag them in the triage report under
|
|
95
|
+
`## Data Retention` for the user to decide: re-engage, archive, or erase.
|
|
96
|
+
3. **Erasure readiness.** If the user receives a data erasure request (GDPR
|
|
97
|
+
Article 17 or equivalent), use the `right-to-be-forgotten` skill to process
|
|
98
|
+
it. This removes all personal data and produces an audit trail.
|
|
99
|
+
4. **No sensitive categories.** Do not record health information, political
|
|
100
|
+
views, religious beliefs, sexual orientation, or other special category data
|
|
101
|
+
— even if it appears in a CV or email.
|
|
102
|
+
5. **Assume the candidate will see it.** Write every assessment and note as if
|
|
103
|
+
the candidate will request a copy (GDPR Article 15 — right of access). If
|
|
104
|
+
you wouldn't be comfortable sharing it with them, don't write it.
|
|
105
|
+
|
|
106
|
+
## Human Oversight
|
|
107
|
+
|
|
108
|
+
This agent **recommends** — the user **decides**. Automated recruitment tools
|
|
109
|
+
carry legal and ethical risk when they make consequential decisions without human
|
|
110
|
+
review.
|
|
111
|
+
|
|
112
|
+
**Hard rules:**
|
|
113
|
+
|
|
114
|
+
1. **Never auto-reject.** The agent may flag concerns and recommend "do not
|
|
115
|
+
proceed," but the user must make the final rejection decision. Assessments
|
|
116
|
+
are advisory, not dispositive.
|
|
117
|
+
2. **Level estimates are hypotheses.** Always present estimated career level
|
|
118
|
+
with confidence language ("likely J060", "evidence suggests J070") — never
|
|
119
|
+
as definitive fact. CVs are incomplete signals.
|
|
120
|
+
3. **Flag uncertainty.** When evidence is thin or ambiguous, say so explicitly.
|
|
121
|
+
Recommend interview focus areas to resolve uncertainty rather than guessing.
|
|
122
|
+
4. **No ranking by protected characteristics.** Never sort, filter, or rank
|
|
123
|
+
candidates by gender, ethnicity, age, or other protected characteristics.
|
|
124
|
+
Rank by framework skill alignment only.
|
|
125
|
+
|
|
126
|
+
## Pool Diversity
|
|
127
|
+
|
|
128
|
+
Engineering has an industry-wide diversity problem. We will always hire the most
|
|
129
|
+
qualified engineer for the job — merit is non-negotiable. But a non-diverse
|
|
130
|
+
candidate pool usually means the sourcing process is broken, not that qualified
|
|
131
|
+
diverse candidates don't exist.
|
|
132
|
+
|
|
133
|
+
**Your responsibilities:**
|
|
134
|
+
|
|
135
|
+
1. **Track aggregate pool diversity.** In every triage report, include
|
|
136
|
+
anonymized diversity statistics: how many candidates have gender recorded as
|
|
137
|
+
Woman vs Man vs unknown, as a pool-level metric. Never single out individual
|
|
138
|
+
candidates by gender or other protected characteristics.
|
|
139
|
+
2. **Push back on homogeneous pools.** If the active pipeline has low gender
|
|
140
|
+
diversity, add a `⚠️ Pool diversity` note to the triage report recommending
|
|
141
|
+
the user ask recruiters/agencies to broaden sourcing.
|
|
142
|
+
3. **Never lower the bar.** Diversity goals apply to the candidate pool, not to
|
|
143
|
+
hiring decisions. Every candidate is assessed on the same framework criteria.
|
|
144
|
+
Do not adjust skill ratings, level estimates, or recommendations based on
|
|
145
|
+
gender or any other protected characteristic.
|
|
146
|
+
4. **Track sourcing channels.** When a sourcing channel consistently produces
|
|
147
|
+
homogeneous candidate pools, note **the channel pattern** (not individual
|
|
148
|
+
candidates) in `knowledge/Candidates/Insights.md` so the user can address
|
|
149
|
+
it with the agency.
|
|
150
|
+
5. **Gender data handling.** Gender is recorded only when explicitly stated in
|
|
151
|
+
recruiter communications (pronouns, titles like "Ms./Mr."). Never infer
|
|
152
|
+
gender from names. Record as `Woman`, `Man`, or `—` (unknown). When
|
|
153
|
+
uncertain, always use `—`.
|
|
154
|
+
|
|
155
|
+
## 1. Sync Candidates
|
|
156
|
+
|
|
157
|
+
Check for new recruitment-related email threads. Look for candidates that the
|
|
158
|
+
postman agent may have flagged:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
# Check postman's latest triage for recruitment signals
|
|
162
|
+
cat ~/.cache/fit/basecamp/state/postman_triage.md 2>/dev/null
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Then run the `track-candidates` skill workflow to process new email threads,
|
|
166
|
+
extract candidate profiles, and update the pipeline.
|
|
167
|
+
|
|
168
|
+
## 2. Analyze CVs
|
|
169
|
+
|
|
170
|
+
After tracking, check for candidates with CV attachments that haven't been
|
|
171
|
+
assessed:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
# Find candidates with CVs but no assessment
|
|
175
|
+
for dir in knowledge/Candidates/*/; do
|
|
176
|
+
name=$(basename "$dir")
|
|
177
|
+
if ls "$dir"CV.* 1>/dev/null 2>&1 && [ ! -f "$dir/assessment.md" ]; then
|
|
178
|
+
echo "Needs assessment: $name"
|
|
179
|
+
fi
|
|
180
|
+
done
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
For each unassessed candidate with a CV, run the `analyze-cv` skill workflow.
|
|
184
|
+
If the target role is known from the candidate brief, use it:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
# Look up the role for context
|
|
188
|
+
npx fit-pathway job {discipline} {level} --track={track}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
If the target role isn't specified, estimate from the CV and the position being
|
|
192
|
+
recruited for.
|
|
193
|
+
|
|
194
|
+
## 3. Triage Pipeline
|
|
195
|
+
|
|
196
|
+
After processing, update the recruiter triage file:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Write to state
|
|
200
|
+
cat > ~/.cache/fit/basecamp/state/recruiter_triage.md << 'EOF'
|
|
201
|
+
# Recruitment Pipeline — {YYYY-MM-DD HH:MM}
|
|
202
|
+
|
|
203
|
+
## Needs Action
|
|
204
|
+
- **{Name}** — {status}, CV received, no assessment yet
|
|
205
|
+
- **{Name}** — {status}, interview not scheduled
|
|
206
|
+
|
|
207
|
+
## Recently Assessed
|
|
208
|
+
- **{Name}** — {recommendation}: {one-line rationale}
|
|
209
|
+
|
|
210
|
+
## Pipeline Summary
|
|
211
|
+
{total} candidates, {new} new, {screening} screening, {interviewing} in interviews
|
|
212
|
+
|
|
213
|
+
## Track Distribution
|
|
214
|
+
- Forward Deployed fit: {N} candidates
|
|
215
|
+
- Platform fit: {N} candidates
|
|
216
|
+
- Either track: {N} candidates
|
|
217
|
+
|
|
218
|
+
## Diversity (aggregate)
|
|
219
|
+
- Gender recorded: {N} Woman / {N} Man / {N} unknown of {total} total
|
|
220
|
+
- ⚠️ Pool diversity — {note if pool appears homogeneous, or "Pool sourcing looks broad"}
|
|
221
|
+
|
|
222
|
+
## Data Retention
|
|
223
|
+
- {Name(s) of candidates rejected/withdrawn 6+ months ago, if any, for user review}
|
|
224
|
+
EOF
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
## 4. Act
|
|
228
|
+
|
|
229
|
+
Choose the single most valuable action from:
|
|
230
|
+
|
|
231
|
+
1. **Track new candidates** — if postman flagged recruitment emails with
|
|
232
|
+
unprocessed candidates
|
|
233
|
+
2. **Analyze a CV** — if a candidate has a CV but no assessment
|
|
234
|
+
3. **Update pipeline status** — if email threads show status advancement
|
|
235
|
+
(interview scheduled, offer extended, etc.)
|
|
236
|
+
4. **Nothing** — if the pipeline is current, report "all current"
|
|
237
|
+
|
|
238
|
+
### Using fit-pathway During Assessment
|
|
239
|
+
|
|
240
|
+
Always ground your work in framework data. Key commands:
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
# Compare what a role expects on each track
|
|
244
|
+
npx fit-pathway job software_engineering J060 --track=forward_deployed
|
|
245
|
+
npx fit-pathway job software_engineering J060 --track=platform
|
|
246
|
+
|
|
247
|
+
# See skill detail for nuanced assessment
|
|
248
|
+
npx fit-pathway skill {skill_id}
|
|
249
|
+
|
|
250
|
+
# Check what changes between levels (for level estimation)
|
|
251
|
+
npx fit-pathway progress {discipline} {level} --compare={higher_level}
|
|
252
|
+
|
|
253
|
+
# See all available skills and their IDs
|
|
254
|
+
npx fit-pathway skill --list
|
|
255
|
+
|
|
256
|
+
# View interview questions for a role (useful for interview prep)
|
|
257
|
+
npx fit-pathway interview {discipline} {level} --track={track}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
## 5. Report
|
|
261
|
+
|
|
262
|
+
After acting, output exactly:
|
|
263
|
+
|
|
264
|
+
```
|
|
265
|
+
Decision: {what you observed and why you chose this action}
|
|
266
|
+
Action: {what you did, e.g. "analyze-cv for John Smith against J060 forward_deployed"}
|
|
267
|
+
Pipeline: {N} total, {N} new, {N} assessed, {N} interviewing
|
|
268
|
+
Diversity: {N} W / {N} M / {N} unknown of {total} — {broad | ⚠️ homogeneous pool}
|
|
269
|
+
```
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: analyze-cv
|
|
3
|
+
description: >
|
|
4
|
+
Analyze candidate CVs against the engineering career framework using
|
|
5
|
+
fit-pathway as the reference point. Assess skill alignment, identify track
|
|
6
|
+
fit (forward_deployed vs platform), estimate career level, and produce
|
|
7
|
+
structured assessments. Use when the user asks to evaluate a CV, compare a
|
|
8
|
+
candidate to a role, or assess engineering fit.
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Analyze CV
|
|
12
|
+
|
|
13
|
+
Analyze a candidate's CV against the engineering career framework defined in
|
|
14
|
+
`fit-pathway`. Produces a structured assessment: estimated career level, track
|
|
15
|
+
fit, skill alignment, gaps, and a hiring recommendation. Every assessment is
|
|
16
|
+
grounded in the framework — no subjective impressions.
|
|
17
|
+
|
|
18
|
+
## Trigger
|
|
19
|
+
|
|
20
|
+
Run this skill:
|
|
21
|
+
|
|
22
|
+
- When the user asks to analyze, evaluate, or assess a CV
|
|
23
|
+
- When a new CV is added to `knowledge/Candidates/{Name}/`
|
|
24
|
+
- When the user asks "is this person a fit for {role}?"
|
|
25
|
+
- When comparing a candidate's background against a specific job level and track
|
|
26
|
+
|
|
27
|
+
## Prerequisites
|
|
28
|
+
|
|
29
|
+
- `fit-pathway` CLI installed (`npx fit-pathway` must work)
|
|
30
|
+
- A CV file (PDF or DOCX) accessible on the filesystem
|
|
31
|
+
- Optionally, a target role specified by the user (discipline + level + track)
|
|
32
|
+
|
|
33
|
+
## Inputs
|
|
34
|
+
|
|
35
|
+
- CV file path (e.g. `knowledge/Candidates/{Name}/CV.pdf` or a path the user
|
|
36
|
+
provides)
|
|
37
|
+
- Target role (optional): `{discipline} {level} --track={track}`
|
|
38
|
+
- Existing candidate brief (if available):
|
|
39
|
+
`knowledge/Candidates/{Name}/brief.md`
|
|
40
|
+
|
|
41
|
+
## Outputs
|
|
42
|
+
|
|
43
|
+
- `knowledge/Candidates/{Name}/assessment.md` — structured CV assessment
|
|
44
|
+
- Updated `knowledge/Candidates/{Name}/brief.md` — skills and summary enriched
|
|
45
|
+
from CV analysis
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Step 1: Read the CV
|
|
50
|
+
|
|
51
|
+
Read the candidate's CV file. Extract:
|
|
52
|
+
|
|
53
|
+
| Field | What to look for |
|
|
54
|
+
| ---------------------- | ------------------------------------------------------ |
|
|
55
|
+
| **Current role** | Most recent job title |
|
|
56
|
+
| **Years of experience**| Total and per-role tenure |
|
|
57
|
+
| **Technical skills** | Languages, frameworks, platforms, tools mentioned |
|
|
58
|
+
| **Domain experience** | Industries, business domains, customer-facing work |
|
|
59
|
+
| **Education** | Degrees, certifications, relevant courses |
|
|
60
|
+
| **Leadership signals** | Team size, mentoring, cross-team work, architecture |
|
|
61
|
+
| **Scope signals** | Scale of systems, user base, revenue impact |
|
|
62
|
+
| **Communication** | Publications, talks, open source, documentation |
|
|
63
|
+
| **Gender** | Pronouns, gendered titles (never infer from names) |
|
|
64
|
+
|
|
65
|
+
## Step 2: Look Up the Framework Reference
|
|
66
|
+
|
|
67
|
+
Use `fit-pathway` to load the reference data for assessment.
|
|
68
|
+
|
|
69
|
+
### If a target role is specified
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# Get the full job definition
|
|
73
|
+
npx fit-pathway job {discipline} {level} --track={track}
|
|
74
|
+
|
|
75
|
+
# Get the skill matrix for comparison
|
|
76
|
+
npx fit-pathway job {discipline} {level} --track={track} --skills
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### If no target role is specified
|
|
80
|
+
|
|
81
|
+
Estimate the most likely discipline and level from the CV, then look it up:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# See available disciplines and their tracks
|
|
85
|
+
npx fit-pathway discipline
|
|
86
|
+
|
|
87
|
+
# See available levels
|
|
88
|
+
npx fit-pathway level
|
|
89
|
+
|
|
90
|
+
# Look up the estimated role
|
|
91
|
+
npx fit-pathway job {discipline} {level} --track={track}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
**Estimation heuristics:**
|
|
95
|
+
|
|
96
|
+
| CV Signal | Likely Level |
|
|
97
|
+
| -------------------------------------------- | ---------------- |
|
|
98
|
+
| 0-2 years, junior titles, learning signals | J040 (Level I) |
|
|
99
|
+
| 2-5 years, mid-level titles, independent | J060 (Level II) |
|
|
100
|
+
| 5-8 years, senior titles, mentoring signals | J070 (Level III) |
|
|
101
|
+
| 8-12 years, staff/lead titles, area scope | J090 (Staff) |
|
|
102
|
+
| 12+ years, principal titles, org-wide impact | J100 (Principal) |
|
|
103
|
+
|
|
104
|
+
### Track fit estimation
|
|
105
|
+
|
|
106
|
+
Use `fit-pathway` to compare tracks:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
npx fit-pathway track forward_deployed
|
|
110
|
+
npx fit-pathway track platform
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Map CV evidence to track indicators:
|
|
114
|
+
|
|
115
|
+
| Forward Deployed signals | Platform signals |
|
|
116
|
+
| -------------------------------------------- | ------------------------------------------- |
|
|
117
|
+
| Customer-facing projects | Internal tooling / shared services |
|
|
118
|
+
| Business domain immersion | Infrastructure / platform-as-product |
|
|
119
|
+
| Rapid prototyping, MVPs | Architecture, system design |
|
|
120
|
+
| Data integration, analytics | CI/CD, DevOps, reliability |
|
|
121
|
+
| Stakeholder management | Code quality, technical debt management |
|
|
122
|
+
| Cross-functional work | Scalability, performance engineering |
|
|
123
|
+
| Multiple industries or domain breadth | Deep platform ownership |
|
|
124
|
+
|
|
125
|
+
## Step 3: Map CV to Framework Skills
|
|
126
|
+
|
|
127
|
+
For each skill in the target job's skill matrix, assess the candidate's likely
|
|
128
|
+
proficiency based on CV evidence:
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
# Get skill detail for nuanced assessment
|
|
132
|
+
npx fit-pathway skill {skill_id}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Use the proficiency definitions from the framework:
|
|
136
|
+
|
|
137
|
+
| Proficiency | CV Evidence |
|
|
138
|
+
| -------------- | -------------------------------------------------------- |
|
|
139
|
+
| `awareness` | Mentioned but no project evidence |
|
|
140
|
+
| `foundational` | Used in projects, basic application |
|
|
141
|
+
| `working` | Primary tool/skill in multiple roles, independent usage |
|
|
142
|
+
| `practitioner` | Led teams using this skill, mentored others, deep work |
|
|
143
|
+
| `expert` | Published, shaped org practice, industry recognition |
|
|
144
|
+
|
|
145
|
+
**Be conservative.** CVs inflate; default one level below what's claimed unless
|
|
146
|
+
there's concrete evidence (metrics, project details, scope indicators).
|
|
147
|
+
|
|
148
|
+
## Step 4: Assess Behaviour Indicators
|
|
149
|
+
|
|
150
|
+
Check the CV for behaviour signals aligned with the framework:
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
npx fit-pathway behaviour --list
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Map CV evidence to behaviours:
|
|
157
|
+
|
|
158
|
+
| Behaviour | CV Evidence |
|
|
159
|
+
| ---------------------------- | -------------------------------------------------- |
|
|
160
|
+
| Own the Outcome | End-to-end ownership, P&L impact, delivery metrics |
|
|
161
|
+
| Think in Systems | Architecture decisions, system-wide reasoning |
|
|
162
|
+
| Communicate with Precision | Technical writing, documentation, talks |
|
|
163
|
+
| Be Polymath Oriented | Cross-domain work, diverse tech stack |
|
|
164
|
+
| Don't Lose Your Curiosity | Side projects, continuous learning, certifications |
|
|
165
|
+
|
|
166
|
+
## Step 5: Identify Gaps and Strengths
|
|
167
|
+
|
|
168
|
+
Compare the candidate's estimated skill profile against the target job:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
# If comparing progression potential
|
|
172
|
+
npx fit-pathway progress {discipline} {level} --track={track}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Classify each skill as:
|
|
176
|
+
|
|
177
|
+
- **Strong match** — candidate meets or exceeds the expected proficiency
|
|
178
|
+
- **Adequate** — candidate is within one level of expected proficiency
|
|
179
|
+
- **Gap** — candidate is two or more levels below expected proficiency
|
|
180
|
+
- **Not evidenced** — CV doesn't mention this skill area
|
|
181
|
+
|
|
182
|
+
## Step 6: Write Assessment
|
|
183
|
+
|
|
184
|
+
Create `knowledge/Candidates/{Name}/assessment.md`:
|
|
185
|
+
|
|
186
|
+
```markdown
|
|
187
|
+
# CV Assessment — {Full Name}
|
|
188
|
+
|
|
189
|
+
**Assessed against:** {Discipline} {Level} — {Track}
|
|
190
|
+
**Date:** {YYYY-MM-DD}
|
|
191
|
+
**CV source:** [{filename}](./{filename})
|
|
192
|
+
|
|
193
|
+
## Summary
|
|
194
|
+
|
|
195
|
+
{2-3 sentence summary: overall fit, key strengths, primary concerns}
|
|
196
|
+
|
|
197
|
+
## Estimated Profile
|
|
198
|
+
|
|
199
|
+
| Dimension | Assessment |
|
|
200
|
+
| ---------------- | ----------------------------------------- |
|
|
201
|
+
| **Level** | {estimated level and confidence} |
|
|
202
|
+
| **Track fit** | {forward_deployed / platform / either} |
|
|
203
|
+
| **Discipline** | {best discipline match} |
|
|
204
|
+
| **Gender** | {Woman / Man / —} |
|
|
205
|
+
|
|
206
|
+
## Skill Alignment
|
|
207
|
+
|
|
208
|
+
| Skill | Expected | Estimated | Status |
|
|
209
|
+
| --- | --- | --- | --- |
|
|
210
|
+
| {skill} | {framework level} | {CV-based estimate} | {Strong/Adequate/Gap/Not evidenced} |
|
|
211
|
+
|
|
212
|
+
### Key Strengths
|
|
213
|
+
- {Strength 1 — with CV evidence}
|
|
214
|
+
- {Strength 2 — with CV evidence}
|
|
215
|
+
|
|
216
|
+
### Key Gaps
|
|
217
|
+
- {Gap 1 — what's missing and why it matters for the role}
|
|
218
|
+
- {Gap 2 — what's missing and why it matters for the role}
|
|
219
|
+
|
|
220
|
+
## Behaviour Indicators
|
|
221
|
+
|
|
222
|
+
| Behaviour | Expected Maturity | CV Evidence | Signal |
|
|
223
|
+
| --- | --- | --- | --- |
|
|
224
|
+
| {behaviour} | {maturity} | {evidence or "—"} | {Strong/Weak/None} |
|
|
225
|
+
|
|
226
|
+
## Track Fit Analysis
|
|
227
|
+
|
|
228
|
+
{Paragraph explaining why this candidate fits forward_deployed, platform,
|
|
229
|
+
or could work on either. Reference specific CV evidence.}
|
|
230
|
+
|
|
231
|
+
## Hiring Recommendation
|
|
232
|
+
|
|
233
|
+
**⚠️ Advisory only — human decision required.**
|
|
234
|
+
|
|
235
|
+
**Recommendation:** {Proceed / Proceed with reservations / Do not proceed}
|
|
236
|
+
|
|
237
|
+
**Rationale:** {3-5 sentences grounding the recommendation in framework data.
|
|
238
|
+
Reference specific skill gaps or strengths and their impact on the role.}
|
|
239
|
+
|
|
240
|
+
**Interview focus areas:**
|
|
241
|
+
- {Area 1 — what to probe in interviews to validate}
|
|
242
|
+
- {Area 2 — what to probe in interviews to validate}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
## Step 7: Enrich Candidate Brief
|
|
246
|
+
|
|
247
|
+
If `knowledge/Candidates/{Name}/brief.md` exists, update it with findings:
|
|
248
|
+
|
|
249
|
+
- Add or update the **Skills** section with framework skill IDs
|
|
250
|
+
- Update **Summary** if the CV provides better context
|
|
251
|
+
- Set the **Gender** field if identifiable from the CV and not already set
|
|
252
|
+
- Add a link to the assessment: `- [CV Assessment](./assessment.md)`
|
|
253
|
+
|
|
254
|
+
**Use precise edits — don't rewrite the entire file.**
|
|
255
|
+
|
|
256
|
+
If no brief exists, note that the `track-candidates` skill should be run first
|
|
257
|
+
to create the candidate profile from email threads.
|
|
258
|
+
|
|
259
|
+
## Quality Checklist
|
|
260
|
+
|
|
261
|
+
- [ ] Assessment is grounded in `fit-pathway` framework data, not subjective
|
|
262
|
+
opinion
|
|
263
|
+
- [ ] Every skill rating cites specific CV evidence or marks "Not evidenced"
|
|
264
|
+
- [ ] Estimated level is conservative (one below CV claims unless proven)
|
|
265
|
+
- [ ] Track fit analysis references specific skill modifiers from the framework
|
|
266
|
+
- [ ] Gaps are actionable — they suggest interview focus areas
|
|
267
|
+
- [ ] Assessment file uses correct path format and links to CV
|
|
268
|
+
- [ ] Candidate brief updated with skill tags and assessment link
|
|
269
|
+
- [ ] Gender field set only from explicit pronouns/titles (never name-inferred)
|
|
@@ -41,7 +41,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
|
|
|
41
41
|
4. Include the required CSS from [references/slide.css](references/slide.css)
|
|
42
42
|
5. Run the conversion script:
|
|
43
43
|
|
|
44
|
-
node scripts/convert-to-pdf.
|
|
44
|
+
node scripts/convert-to-pdf.mjs
|
|
45
45
|
|
|
46
46
|
6. Tell the user: "Your presentation is ready at ~/Desktop/presentation.pdf"
|
|
47
47
|
|
|
@@ -49,7 +49,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
|
|
|
49
49
|
|
|
50
50
|
The conversion script accepts optional arguments:
|
|
51
51
|
|
|
52
|
-
node scripts/convert-to-pdf.
|
|
52
|
+
node scripts/convert-to-pdf.mjs [input.html] [output.pdf]
|
|
53
53
|
|
|
54
54
|
Defaults: input = `/tmp/basecamp-presentation.html`, output =
|
|
55
55
|
`~/Desktop/presentation.pdf`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* Required CSS for HTML slide decks rendered to PDF via Playwright.
|
|
2
2
|
*
|
|
3
3
|
* Include this in the <style> block of /tmp/basecamp-presentation.html.
|
|
4
|
-
* See scripts/convert-to-pdf.
|
|
4
|
+
* See scripts/convert-to-pdf.mjs for the rendering script.
|
|
5
5
|
*
|
|
6
6
|
* PDF rendering rules:
|
|
7
7
|
* - No layered elements — style content directly, no separate backgrounds
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Convert HTML slides to PDF using Playwright.
|
|
4
|
+
*
|
|
5
|
+
* Renders an HTML file containing slide markup (1280x720px per slide) into a
|
|
6
|
+
* PDF document. Each slide is sized to exactly 1280x720 pixels with background
|
|
7
|
+
* colours and images preserved. Defaults to reading from /tmp and writing to
|
|
8
|
+
* ~/Desktop when no arguments are given.
|
|
9
|
+
*
|
|
10
|
+
* Requires: npm install playwright && npx playwright install chromium
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { join } from "node:path";
|
|
14
|
+
import { resolve } from "node:path";
|
|
15
|
+
import { homedir } from "node:os";
|
|
16
|
+
|
|
17
|
+
const HELP = `convert-to-pdf — render HTML slides to PDF via Playwright
|
|
18
|
+
|
|
19
|
+
Usage: node scripts/convert-to-pdf.mjs [input.html] [output.pdf] [-h|--help]
|
|
20
|
+
|
|
21
|
+
Arguments:
|
|
22
|
+
input.html HTML slides file (default: /tmp/basecamp-presentation.html)
|
|
23
|
+
output.pdf Output PDF path (default: ~/Desktop/presentation.pdf)
|
|
24
|
+
|
|
25
|
+
Requires: npm install playwright && npx playwright install chromium`;
|
|
26
|
+
|
|
27
|
+
if (process.argv.includes("-h") || process.argv.includes("--help")) {
|
|
28
|
+
console.log(HELP);
|
|
29
|
+
process.exit(0);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const positional = process.argv.slice(2).filter((a) => !a.startsWith("-"));
|
|
33
|
+
const input = positional[0] || "/tmp/basecamp-presentation.html";
|
|
34
|
+
const output = positional[1] || join(homedir(), "Desktop", "presentation.pdf");
|
|
35
|
+
|
|
36
|
+
const { chromium } = await import("playwright");
|
|
37
|
+
const browser = await chromium.launch();
|
|
38
|
+
const page = await browser.newPage();
|
|
39
|
+
await page.goto(`file://${resolve(input)}`, { waitUntil: "networkidle" });
|
|
40
|
+
await page.pdf({
|
|
41
|
+
path: output,
|
|
42
|
+
width: "1280px",
|
|
43
|
+
height: "720px",
|
|
44
|
+
printBackground: true,
|
|
45
|
+
});
|
|
46
|
+
await browser.close();
|
|
47
|
+
console.log(`Done: ${output}`);
|