@forwardimpact/outpost 3.12.0 → 3.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +4 -4
- package/src/agent-path.js +10 -6
- package/src/agent-runner.js +28 -24
- package/src/index.js +2 -3
- package/src/kb-manager.js +21 -19
- package/src/outpost.js +37 -33
- package/src/posture.js +3 -3
- package/src/privilege.js +11 -11
- package/src/scheduler.js +14 -12
- package/src/socket-server.js +19 -18
- package/src/spawn-env.js +7 -6
- package/src/state-manager.js +2 -2
- package/templates/.claude/agents/chief-of-staff.md +22 -22
- package/templates/.claude/agents/concierge.md +19 -17
- package/templates/.claude/agents/head-hunter.md +27 -26
- package/templates/.claude/agents/librarian.md +17 -16
- package/templates/.claude/agents/postman.md +19 -18
- package/templates/.claude/agents/recruiter.md +31 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
- package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
- package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
- package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
- package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
- package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
- package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
- package/templates/.claude/skills/candidate-report/references/report.css +4 -4
- package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
- package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
- package/templates/.claude/skills/changelog/SKILL.md +55 -50
- package/templates/.claude/skills/deck-create/SKILL.md +30 -30
- package/templates/.claude/skills/deck-create/references/slide.css +4 -4
- package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/deck-review/SKILL.md +59 -57
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
- package/templates/.claude/skills/doc-create/SKILL.md +21 -20
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
- package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +5 -5
- package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
- package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
- package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
- package/templates/.claude/skills/organize-files/SKILL.md +24 -22
- package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
- package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
- package/templates/.claude/skills/person-identify/SKILL.md +24 -22
- package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
- package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
- package/templates/.claude/skills/req-assess/SKILL.md +27 -27
- package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
- package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-decide/SKILL.md +28 -25
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-forget/SKILL.md +28 -26
- package/templates/.claude/skills/req-forget/references/classify.md +13 -13
- package/templates/.claude/skills/req-forget/references/locations.md +2 -2
- package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
- package/templates/.claude/skills/req-scan/SKILL.md +21 -22
- package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
- package/templates/.claude/skills/req-scan/references/filters.md +13 -13
- package/templates/.claude/skills/req-scan/references/sources.md +7 -7
- package/templates/.claude/skills/req-scan/references/state.md +1 -1
- package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +31 -29
- package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
- package/templates/.claude/skills/req-screen/references/template.md +4 -4
- package/templates/.claude/skills/req-track/SKILL.md +40 -40
- package/templates/.claude/skills/req-track/references/fields.md +19 -18
- package/templates/.claude/skills/req-track/references/signals.md +12 -12
- package/templates/.claude/skills/req-track/references/statuses.md +3 -2
- package/templates/.claude/skills/req-track/references/templates.md +4 -4
- package/templates/.claude/skills/req-workday/SKILL.md +24 -24
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +13 -13
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
- package/templates/.claude/skills/send-chat/SKILL.md +47 -43
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
- package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
- package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
- package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
- package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
- package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
- package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
- package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
- package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
- package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
- package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
- package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
- package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
- package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
- package/templates/CLAUDE.md +40 -37
|
@@ -5,24 +5,23 @@ description: >
|
|
|
5
5
|
hire. Uses WebFetch to read public APIs (HN Algolia, GitHub, dev.to).
|
|
6
6
|
Writes prospect notes to Knowledge/Prospects/. Maintains
|
|
7
7
|
cursor/dedup state in ~/.cache/fit/outpost/head-hunter/. Use when the
|
|
8
|
-
head-hunter agent
|
|
8
|
+
head-hunter agent wakes or when the user asks to scan for open candidates.
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Scan Open Candidates
|
|
12
12
|
|
|
13
13
|
Fetch and filter publicly available candidate posts from platforms where people
|
|
14
|
-
**explicitly indicate** they are open for hire. This skill
|
|
15
|
-
|
|
16
|
-
updates.
|
|
14
|
+
**explicitly indicate** they are open for hire. This skill fetches, filters,
|
|
15
|
+
deduplicates, benchmarks, writes prospect notes, and updates memory.
|
|
17
16
|
|
|
18
17
|
## Trigger
|
|
19
18
|
|
|
20
|
-
- The head-hunter agent
|
|
19
|
+
- The scheduler wakes the head-hunter agent.
|
|
21
20
|
- The user asks to scan for open candidates or prospects.
|
|
22
21
|
|
|
23
22
|
## Prerequisites
|
|
24
23
|
|
|
25
|
-
- `WebFetch` tool available (Claude Code built-in
|
|
24
|
+
- `WebFetch` tool available (a Claude Code built-in, no curl/wget).
|
|
26
25
|
- `fit-pathway` CLI available (`bunx fit-pathway`).
|
|
27
26
|
- Memory directory `~/.cache/fit/outpost/head-hunter/`.
|
|
28
27
|
|
|
@@ -40,18 +39,18 @@ updates.
|
|
|
40
39
|
|
|
41
40
|
<do_confirm_checklist goal="Verify the wake produced a clean, ethical scan">
|
|
42
41
|
|
|
43
|
-
- [ ]
|
|
44
|
-
- [ ]
|
|
45
|
-
- [ ]
|
|
42
|
+
- [ ] Select the least-recently-checked source that is not suspended.
|
|
43
|
+
- [ ] Fetch with `WebFetch` (never curl/wget).
|
|
44
|
+
- [ ] Apply all 5 filters in order. Confirm each passed candidate has ≥ 2
|
|
46
45
|
standard-relevant skills.
|
|
47
|
-
- [ ]
|
|
48
|
-
- [ ]
|
|
49
|
-
- [ ]
|
|
50
|
-
- [ ]
|
|
51
|
-
prospects, failures, log.
|
|
52
|
-
- [ ]
|
|
53
|
-
|
|
54
|
-
- [ ]
|
|
46
|
+
- [ ] Deduplicate against `seen.tsv` before you process a candidate.
|
|
47
|
+
- [ ] Benchmark each prospect against a real `bunx fit-pathway job`.
|
|
48
|
+
- [ ] Follow the template for every prospect note (no fabricated names).
|
|
49
|
+
- [ ] Route every state mutation through `node scripts/state.mjs`: cursor,
|
|
50
|
+
seen, prospects, failures, log.
|
|
51
|
+
- [ ] Write the triage report to the state directory. Log any alternative
|
|
52
|
+
queries.
|
|
53
|
+
- [ ] Record every failure. Suspend a source at ≥ 3 consecutive failures.
|
|
55
54
|
|
|
56
55
|
</do_confirm_checklist>
|
|
57
56
|
|
|
@@ -75,12 +74,12 @@ follow [references/filters.md](references/filters.md#failure-handling).
|
|
|
75
74
|
### 3. Filter
|
|
76
75
|
|
|
77
76
|
Apply the 5-filter pipeline in
|
|
78
|
-
[references/filters.md](references/filters.md#filter-pipeline)
|
|
77
|
+
[references/filters.md](references/filters.md#filter-pipeline): signal, dedup,
|
|
79
78
|
geographic, skill alignment, experience level.
|
|
80
79
|
|
|
81
80
|
### 3b. Fallback — zero new prospects
|
|
82
81
|
|
|
83
|
-
If
|
|
82
|
+
If the filters eliminate every candidate, try up to **3 alternatives** per wake
|
|
84
83
|
from [references/fallbacks.md](references/fallbacks.md). Log every alternative
|
|
85
84
|
in `log.md`.
|
|
86
85
|
|
|
@@ -99,7 +98,7 @@ Classify match strength:
|
|
|
99
98
|
- **moderate** — some overlap, level roughly right, minor gaps.
|
|
100
99
|
- **weak** — few matching signals, significant gaps.
|
|
101
100
|
|
|
102
|
-
Write notes for **strong** and **moderate** matches only
|
|
101
|
+
Write notes for **strong** and **moderate** matches only. Use the template in
|
|
103
102
|
[references/template.md](references/template.md).
|
|
104
103
|
|
|
105
104
|
```bash
|
|
@@ -108,8 +107,8 @@ mkdir -p "Knowledge/Prospects"
|
|
|
108
107
|
|
|
109
108
|
### 5. Update state
|
|
110
109
|
|
|
111
|
-
All state changes go through `node scripts/state.mjs
|
|
112
|
-
[references/state.md](references/state.md). Each wake:
|
|
110
|
+
All state changes go through `node scripts/state.mjs`. The full command
|
|
111
|
+
reference is [references/state.md](references/state.md). Each wake:
|
|
113
112
|
|
|
114
113
|
1. Update the cursor (`cursor set`).
|
|
115
114
|
2. Reset failure count on success or increment on failure.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Fallback Strategies
|
|
2
2
|
|
|
3
3
|
Reference for `req-scan` when a primary source query yields zero new prospects
|
|
4
|
-
after
|
|
5
|
-
limits.
|
|
4
|
+
after the filters run. Try at most **3 alternatives per wake** to stay within
|
|
5
|
+
rate limits.
|
|
6
6
|
|
|
7
7
|
## Strategy 1 — alternative search terms
|
|
8
8
|
|
|
9
9
|
### HN
|
|
10
10
|
|
|
11
11
|
- Check the **previous** month's "Who Wants to Be Hired?" thread.
|
|
12
|
-
- Search for `"Who is hiring"` threads (
|
|
13
|
-
thread
|
|
12
|
+
- Search for `"Who is hiring"` threads. (Candidates sometimes post in the wrong
|
|
13
|
+
thread. Comments may link to candidate profiles.)
|
|
14
14
|
- Try
|
|
15
15
|
`https://hn.algolia.com/api/v1/search?query=%22freelancer+available%22&tags=comment`.
|
|
16
16
|
|
|
@@ -47,9 +47,9 @@ WebFetch URL: https://dev.to/api/articles?tag=career&per_page=25
|
|
|
47
47
|
If geography eliminated everyone, re-scan without the location filter. Mark
|
|
48
48
|
unmatched-location prospects as "location unconfirmed" in the prospect note.
|
|
49
49
|
|
|
50
|
-
If skill alignment filtered everyone out
|
|
51
|
-
to 1
|
|
52
|
-
capability)
|
|
50
|
+
If skill alignment filtered everyone out, lower the bar from 2 standard skills
|
|
51
|
+
to 1. Consider transferable skills (strong Python ⇒ likely data integration
|
|
52
|
+
capability). Accept adjacent indicators ("machine learning" implies data
|
|
53
53
|
skills).
|
|
54
54
|
|
|
55
55
|
## Strategy 3 — cross-reference
|
|
@@ -57,11 +57,11 @@ skills).
|
|
|
57
57
|
When a source yields very few results, enrich what you do find:
|
|
58
58
|
|
|
59
59
|
- A GitHub profile that links to a blog/portfolio → WebFetch it for more detail
|
|
60
|
-
before
|
|
60
|
+
before you decide skill fit.
|
|
61
61
|
- An HN post that mentions a GitHub username → fetch their GitHub profile for
|
|
62
62
|
richer signal.
|
|
63
63
|
|
|
64
|
-
##
|
|
64
|
+
## Log the alternatives
|
|
65
65
|
|
|
66
66
|
Log every alternative in `log.md`:
|
|
67
67
|
|
|
@@ -11,7 +11,7 @@ Apply in order. Stop at the first that excludes the candidate.
|
|
|
11
11
|
- HN "Who Wants to Be Hired?" → **auto-pass** (thread is opt-in).
|
|
12
12
|
- GitHub → must have `hireable: true` **or** bio contains an open-to-work
|
|
13
13
|
phrase.
|
|
14
|
-
- dev.to → must
|
|
14
|
+
- dev.to → the post must carry the tag `opentowork` or `lookingforwork`.
|
|
15
15
|
|
|
16
16
|
### 2. Deduplication
|
|
17
17
|
|
|
@@ -31,8 +31,8 @@ Prefer or accept candidates in or open to:
|
|
|
31
31
|
- **Remote / Anywhere / Global**.
|
|
32
32
|
|
|
33
33
|
Skip candidates explicitly locked to incompatible regions ("San Francisco only",
|
|
34
|
-
"APAC only"). When location is ambiguous or unstated, include the candidate
|
|
35
|
-
|
|
34
|
+
"APAC only"). When location is ambiguous or unstated, include the candidate.
|
|
35
|
+
Let the user decide.
|
|
36
36
|
|
|
37
37
|
### 4. Skill alignment
|
|
38
38
|
|
|
@@ -46,8 +46,8 @@ non-traditional path (law, policy, academia → tech), AI/ML tool proficiency
|
|
|
46
46
|
**Platform:** infrastructure / cloud / DevOps, architecture and system design,
|
|
47
47
|
API design and shared services, performance / scalability / reliability.
|
|
48
48
|
|
|
49
|
-
**Minimum bar:** at least 2 standard-relevant skills
|
|
50
|
-
|
|
49
|
+
**Minimum bar:** the post must show at least 2 standard-relevant skills. Skip
|
|
50
|
+
candidates with purely non-technical profiles.
|
|
51
51
|
|
|
52
52
|
### 5. Experience level
|
|
53
53
|
|
|
@@ -68,16 +68,16 @@ block page):
|
|
|
68
68
|
1. Increment the failure count:
|
|
69
69
|
`node scripts/state.mjs failure increment {source}`.
|
|
70
70
|
2. **Do not retry** the same source in this wake cycle.
|
|
71
|
-
3. Suspend after 3 consecutive failures
|
|
72
|
-
suspended sources once every 7 days to detect recovery.
|
|
71
|
+
3. Suspend after 3 consecutive failures. Skip a suspended source during source
|
|
72
|
+
selection. Retry suspended sources once every 7 days to detect recovery.
|
|
73
73
|
4. Log the failure in `log.md` with HTTP status and error.
|
|
74
74
|
5. Reset on success: `node scripts/state.mjs failure reset {source}`.
|
|
75
75
|
|
|
76
76
|
### Common failure patterns
|
|
77
77
|
|
|
78
|
-
| Symptom | Likely cause
|
|
79
|
-
| ------------------------ |
|
|
80
|
-
| 503 with HTML redirect |
|
|
81
|
-
| 403 Forbidden |
|
|
82
|
-
| 429 Too Many Requests | Rate limited
|
|
83
|
-
| Empty response / timeout | Transient
|
|
78
|
+
| Symptom | Likely cause |
|
|
79
|
+
| ------------------------ | -------------------------------------------------------- |
|
|
80
|
+
| 503 with HTML redirect | A corporate proxy blocks the domain. It will not recover |
|
|
81
|
+
| 403 Forbidden | The site needs auth, or it blocks automated requests |
|
|
82
|
+
| 429 Too Many Requests | Rate limited. It recovers. Do not suspend permanently |
|
|
83
|
+
| Empty response / timeout | Transient. It likely recovers next wake |
|
|
@@ -4,31 +4,31 @@ Reference for `req-scan` Step 2 (fetch & scan). One source per wake cycle.
|
|
|
4
4
|
|
|
5
5
|
## 1. Hacker News "Who Wants to Be Hired?"
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
A monthly thread that appears on the 1st.
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
WebFetch URL: https://hn.algolia.com/api/v1/search?query=%22Who+wants+to+be+hired%22&tags=ask_hn&hitsPerPage=5
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
The first hit whose title matches "Who wants to be hired?"
|
|
14
|
-
the current or previous month
|
|
13
|
+
The target thread is the first hit whose title matches "Who wants to be hired?"
|
|
14
|
+
and whose `created_at` falls in the current or previous month.
|
|
15
15
|
|
|
16
16
|
```text
|
|
17
17
|
WebFetch URL: https://hn.algolia.com/api/v1/items/{objectID}
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
`children[]` contains top-level comments
|
|
21
|
-
`text` field for:
|
|
20
|
+
`children[]` contains top-level comments. Each comment is one candidate. Parse
|
|
21
|
+
the `text` field for:
|
|
22
22
|
|
|
23
23
|
- **Location** ("Location: New York", "NYC / Remote").
|
|
24
24
|
- **Remote** ("Remote: Yes", "Open to remote").
|
|
25
25
|
- **Skills** — tech stack, language/standard mentions.
|
|
26
26
|
- **Experience** — years, role titles, past companies.
|
|
27
|
-
- **Contact** — email
|
|
27
|
+
- **Contact** — email, often obfuscated as "name [at] domain [dot] com".
|
|
28
28
|
- **Resume / CV** — links to personal sites, GitHub, LinkedIn.
|
|
29
29
|
|
|
30
30
|
**Cursor:** thread `objectID` plus the ID of the last processed child comment.
|
|
31
|
-
**Rate:** no strict limit
|
|
31
|
+
**Rate:** no strict limit. One fetch per wake cycle.
|
|
32
32
|
|
|
33
33
|
## 2. GitHub Open to Work
|
|
34
34
|
|
|
@@ -40,7 +40,7 @@ node scripts/state.mjs failure increment mastodon_hachyderm
|
|
|
40
40
|
node scripts/state.mjs failure reset github_open_to_work
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
##
|
|
43
|
+
## Logs
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
46
|
node scripts/state.mjs log-wake github_open_to_work "Primary query: 'open to work' location:UK — 30 results, 2 new prospects"
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Manage head-hunter agent state files.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
5
|
+
* The script provides atomic operations on the 5 state files that the
|
|
6
|
+
* head-hunter agent uses:
|
|
6
7
|
* cursor.tsv — source rotation state (source, last_checked, position)
|
|
7
8
|
* seen.tsv — deduplication index (source, id, date)
|
|
8
9
|
* prospects.tsv — prospect index (name, source, date, strength, level)
|
|
@@ -82,7 +83,7 @@ State dir: ~/.cache/fit/outpost/head-hunter/`);
|
|
|
82
83
|
process.exit(0);
|
|
83
84
|
}
|
|
84
85
|
|
|
85
|
-
// ---
|
|
86
|
+
// --- Make sure the state directory exists ---
|
|
86
87
|
|
|
87
88
|
mkdirSync(STATE_DIR, { recursive: true });
|
|
88
89
|
|
|
@@ -2,28 +2,29 @@
|
|
|
2
2
|
name: req-screen
|
|
3
3
|
description: >
|
|
4
4
|
Screen candidate CVs against the agent-aligned engineering standard to decide
|
|
5
|
-
whether to invest interview time.
|
|
6
|
-
with interview/pass recommendation and suggested interview
|
|
7
|
-
Use when the user asks to evaluate a CV or when a new
|
|
5
|
+
whether to invest interview time. It produces a structured screening
|
|
6
|
+
assessment with an interview/pass recommendation and suggested interview
|
|
7
|
+
focus areas. Use when the user asks to evaluate a CV, or when you find a new
|
|
8
|
+
CV.
|
|
8
9
|
---
|
|
9
10
|
|
|
10
11
|
# Screen CV
|
|
11
12
|
|
|
12
13
|
Screen a candidate's CV against the agent-aligned engineering standard defined
|
|
13
|
-
in `fit-pathway`.
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
in `fit-pathway`. This skill answers one question. **Is this candidate worth an
|
|
15
|
+
interview?** Ground every assessment in the standard. Never use subjective
|
|
16
|
+
impressions.
|
|
16
17
|
|
|
17
18
|
This is **Stage 1** of a three-stage hiring pipeline:
|
|
18
19
|
|
|
19
20
|
1. **Screen CV** (this skill) — CV arrives → interview or pass.
|
|
20
21
|
2. `req-assess` — interview transcript arrives → updated evidence.
|
|
21
|
-
3. `req-decide` — all stages complete → hire /
|
|
22
|
+
3. `req-decide` — all stages complete → hire / do not hire.
|
|
22
23
|
|
|
23
24
|
## Trigger
|
|
24
25
|
|
|
25
|
-
- A new CV
|
|
26
|
-
- A CV appears in `~/Downloads/` and
|
|
26
|
+
- A new CV appears in `Knowledge/Candidates/{Name}/`.
|
|
27
|
+
- A CV appears in `~/Downloads/` and matches a candidate.
|
|
27
28
|
- The user asks to screen, evaluate, or assess a CV.
|
|
28
29
|
- The user asks "is this person worth interviewing?".
|
|
29
30
|
|
|
@@ -38,9 +39,9 @@ This is **Stage 1** of a three-stage hiring pipeline:
|
|
|
38
39
|
- CV file path (e.g. `Knowledge/Candidates/{Name}/CV.pdf`).
|
|
39
40
|
- Target role (optional).
|
|
40
41
|
- Existing `Knowledge/Candidates/{Name}/brief.md`, if any.
|
|
41
|
-
- `Knowledge/Roles/*.md`
|
|
42
|
-
`Discipline`, `Hiring manager`, `Domain lead`, and the `**Status:**`
|
|
43
|
-
Look up by Req number or filename substring.
|
|
42
|
+
- `Knowledge/Roles/*.md` that matches the candidate's `Req`. It provides
|
|
43
|
+
`Level`, `Discipline`, `Hiring manager`, `Domain lead`, and the `**Status:**`
|
|
44
|
+
field. Look up by Req number or filename substring.
|
|
44
45
|
|
|
45
46
|
## Outputs
|
|
46
47
|
|
|
@@ -51,15 +52,15 @@ This is **Stage 1** of a three-stage hiring pipeline:
|
|
|
51
52
|
decision-rule-compliant">
|
|
52
53
|
|
|
53
54
|
- [ ] Every claim cites CV evidence or marks "Not evidenced".
|
|
54
|
-
- [ ] Two-level scepticism applied
|
|
55
|
-
- [ ] "Not evidenced" skills
|
|
56
|
-
- [ ] Recommendation follows the decision rules and threshold rule
|
|
57
|
-
gap count verified before
|
|
55
|
+
- [ ] Two-level scepticism applied. Vague phrases did not earn levels.
|
|
56
|
+
- [ ] "Not evidenced" skills count as gaps in the recommendation.
|
|
57
|
+
- [ ] Recommendation follows the decision rules and the threshold rule. Match %
|
|
58
|
+
and gap count verified before you pick a tier.
|
|
58
59
|
- [ ] "Interview with focus areas" used only for strong candidates with a named
|
|
59
|
-
concern
|
|
60
|
-
- [ ] Output file is exactly `screening.md
|
|
61
|
-
- [ ] `brief.md` links the screening as `[CV Screening](./screening.md)
|
|
62
|
-
|
|
60
|
+
concern. Never used as a soft "maybe".
|
|
61
|
+
- [ ] Output file is exactly `screening.md`. Any misnamed prior file deleted.
|
|
62
|
+
- [ ] `brief.md` links the screening as `[CV Screening](./screening.md)`.
|
|
63
|
+
Targeted edits updated Skills and Summary.
|
|
63
64
|
- [ ] Gender set only from explicit pronouns/titles.
|
|
64
65
|
- [ ] Recommendation header carries the advisory-only banner.
|
|
65
66
|
|
|
@@ -74,7 +75,7 @@ Extract the fields listed in
|
|
|
74
75
|
|
|
75
76
|
### 2. Anchor the target role
|
|
76
77
|
|
|
77
|
-
If `brief.md` carries a `Req`, look up the
|
|
78
|
+
If `brief.md` carries a `Req`, look up the Role file that matches it:
|
|
78
79
|
|
|
79
80
|
```bash
|
|
80
81
|
ls Knowledge/Roles/ | grep "{req_number}"
|
|
@@ -83,10 +84,10 @@ cat "Knowledge/Roles/{matching file}"
|
|
|
83
84
|
|
|
84
85
|
Use the Role's `Level` and `Discipline` as the target unless the user specified
|
|
85
86
|
a different target. Capture `Hiring manager` and `Domain lead` for the screening
|
|
86
|
-
header. Note the `**Status:**` field
|
|
87
|
-
|
|
87
|
+
header. Note the `**Status:**` field. Screen a still-active candidate even when
|
|
88
|
+
the role is `closed`.
|
|
88
89
|
|
|
89
|
-
If no target is available, estimate one
|
|
90
|
+
If no target is available, estimate one with the level heuristics in
|
|
90
91
|
[references/rubric.md](references/rubric.md#level-estimation-heuristics).
|
|
91
92
|
|
|
92
93
|
### 3. Load the standard
|
|
@@ -111,7 +112,7 @@ mapping and the scepticism rule in
|
|
|
111
112
|
bunx fit-pathway behaviour --list
|
|
112
113
|
```
|
|
113
114
|
|
|
114
|
-
Map CV evidence
|
|
115
|
+
Map CV evidence with the behaviour signals in
|
|
115
116
|
[references/rubric.md](references/rubric.md#behaviour-signals).
|
|
116
117
|
|
|
117
118
|
### 6. Classify gaps and strengths
|
|
@@ -124,12 +125,12 @@ bunx fit-pathway progress {discipline} {level} --track={track}
|
|
|
124
125
|
|
|
125
126
|
Classify each skill per
|
|
126
127
|
[references/rubric.md](references/rubric.md#skill-alignment-classification).
|
|
127
|
-
Pick the recommendation
|
|
128
|
+
Pick the recommendation with the decision rules and threshold rule in
|
|
128
129
|
[references/rubric.md](references/rubric.md#recommendation-decision-rules).
|
|
129
130
|
|
|
130
131
|
### 7. Write the screening
|
|
131
132
|
|
|
132
|
-
Save to `Knowledge/Candidates/{Name}/screening.md`
|
|
133
|
+
Save to `Knowledge/Candidates/{Name}/screening.md` with the template in
|
|
133
134
|
[references/template.md](references/template.md). Include the **Suggested
|
|
134
135
|
Interview Questions** when the recommendation is "Interview" or "Interview with
|
|
135
136
|
focus areas":
|
|
@@ -138,7 +139,7 @@ focus areas":
|
|
|
138
139
|
bunx fit-pathway interview {discipline} {level} --track={track}
|
|
139
140
|
```
|
|
140
141
|
|
|
141
|
-
Pick 3–5 questions most relevant to the gaps
|
|
142
|
+
Pick 3–5 questions most relevant to the gaps. Note which gap each one targets.
|
|
142
143
|
|
|
143
144
|
### 8. Enrich the brief
|
|
144
145
|
|
|
@@ -146,7 +147,8 @@ If `brief.md` exists, apply targeted edits:
|
|
|
146
147
|
|
|
147
148
|
- Add or update `## Skills` with agent-aligned standard skill IDs.
|
|
148
149
|
- Update `## Summary` if the CV provides better context.
|
|
149
|
-
- Set `**Gender:**` only when explicitly
|
|
150
|
+
- Set `**Gender:**` only when the CV states it explicitly and the field is
|
|
151
|
+
empty.
|
|
150
152
|
- Append `- [CV Screening](./screening.md)` if missing.
|
|
151
153
|
|
|
152
154
|
If no brief exists, tell the user to run `req-track` first to build the
|
|
@@ -14,7 +14,7 @@ Reference data for `req-screen` Steps 1, 3, 4, 5, and 6 (recommendation).
|
|
|
14
14
|
| **Leadership signals** | Team size, mentoring, cross-team work, architecture |
|
|
15
15
|
| **Scope signals** | Scale of systems, user base, revenue impact |
|
|
16
16
|
| **Communication** | Publications, talks, open source, documentation |
|
|
17
|
-
| **Gender** | Pronouns or gendered titles only
|
|
17
|
+
| **Gender** | Pronouns or gendered titles only. Never infer it from a name |
|
|
18
18
|
|
|
19
19
|
## Level estimation heuristics
|
|
20
20
|
|
|
@@ -40,21 +40,21 @@ Reference data for `req-screen` Steps 1, 3, 4, 5, and 6 (recommendation).
|
|
|
40
40
|
|
|
41
41
|
## Proficiency mapping
|
|
42
42
|
|
|
43
|
-
| Proficiency | CV evidence
|
|
44
|
-
| -------------- |
|
|
45
|
-
| `awareness` | Mentioned but no project evidence
|
|
46
|
-
| `foundational` | Used in projects, basic application
|
|
47
|
-
| `working` | Primary tool/skill in multiple roles, independent usage
|
|
48
|
-
| `practitioner` | Led teams
|
|
49
|
-
| `expert` | Published, shaped org practice, industry recognition
|
|
43
|
+
| Proficiency | CV evidence |
|
|
44
|
+
| -------------- | --------------------------------------------------------- |
|
|
45
|
+
| `awareness` | Mentioned but no project evidence |
|
|
46
|
+
| `foundational` | Used in projects, basic application |
|
|
47
|
+
| `working` | Primary tool/skill in multiple roles, independent usage |
|
|
48
|
+
| `practitioner` | Led teams that use this skill, mentored others, deep work |
|
|
49
|
+
| `expert` | Published, shaped org practice, industry recognition |
|
|
50
50
|
|
|
51
51
|
### Scepticism rule
|
|
52
52
|
|
|
53
|
-
CVs inflate. Default **two levels below** what the CV implies
|
|
54
|
-
candidate provides concrete, quantified evidence (metrics,
|
|
55
|
-
sizes, user/revenue scale). Vague phrases like "improved
|
|
56
|
-
initiatives" do not count. A skill
|
|
57
|
-
project context is `awareness` at most.
|
|
53
|
+
CVs inflate. Default **two levels below** what the CV implies. Make an
|
|
54
|
+
exception when the candidate provides concrete, quantified evidence (metrics,
|
|
55
|
+
named systems, team sizes, user/revenue scale). Vague phrases like "improved
|
|
56
|
+
performance" or "led initiatives" do not count. A skill that appears only in a
|
|
57
|
+
"Skills" section with no project context is `awareness` at most.
|
|
58
58
|
|
|
59
59
|
## Behaviour signals
|
|
60
60
|
|
|
@@ -73,8 +73,8 @@ project context is `awareness` at most.
|
|
|
73
73
|
- **Adequate** — exactly one level below expected with clear project evidence,
|
|
74
74
|
**or** at level but evidence thin.
|
|
75
75
|
- **Gap** — two or more levels below expected.
|
|
76
|
-
- **Not evidenced** — CV
|
|
77
|
-
|
|
76
|
+
- **Not evidenced** — the CV does not mention this skill area. **Treat it as a
|
|
77
|
+
gap.** Absence of evidence is not evidence of skill.
|
|
78
78
|
|
|
79
79
|
## Recommendation decision rules
|
|
80
80
|
|
|
@@ -82,7 +82,7 @@ project context is `awareness` at most.
|
|
|
82
82
|
| ------------------------------ | ------------------------------------------------------------------------ |
|
|
83
83
|
| **Interview** | ≥ 70 % Strong match, no core-skill gaps, strong behaviour signals |
|
|
84
84
|
| **Interview with focus areas** | ≥ 50 % Strong match, ≤ 2 gaps in non-core skills, no behaviour red flags |
|
|
85
|
-
| **Pass** | Everything else
|
|
85
|
+
| **Pass** | Everything else, including thin evidence |
|
|
86
86
|
|
|
87
87
|
**Threshold rule:** if more than **one third** of the target job's skills are
|
|
88
88
|
Gap or Not evidenced, the candidate cannot receive "Interview." If more than
|
|
@@ -90,5 +90,5 @@ Gap or Not evidenced, the candidate cannot receive "Interview." If more than
|
|
|
90
90
|
focus areas."
|
|
91
91
|
|
|
92
92
|
When in doubt, choose the stricter recommendation. "Interview with focus areas"
|
|
93
|
-
should be rare
|
|
94
|
-
candidate.
|
|
93
|
+
should be rare. Use it for a strong candidate with a specific, named concern.
|
|
94
|
+
Do not use it for a marginal candidate.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Screening Output Template
|
|
2
2
|
|
|
3
3
|
Reference template for `req-screen` Step 6. Save to
|
|
4
|
-
`Knowledge/Candidates/{Name}/screening.md`.
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
delete it after
|
|
4
|
+
`Knowledge/Candidates/{Name}/screening.md`. The filename **must** be
|
|
5
|
+
`screening.md`. Do not use `assessment.md`, `cv-screening.md`, or any variant.
|
|
6
|
+
Look in the folder for a misnamed screening file with `# CV Screening` in the
|
|
7
|
+
header. If one exists, delete it after you write the new one.
|
|
8
8
|
|
|
9
9
|
```markdown
|
|
10
10
|
# CV Screening — {Full Name}
|