@forwardimpact/outpost 3.11.0 → 3.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +4 -4
  4. package/src/agent-path.js +10 -6
  5. package/src/agent-runner.js +28 -24
  6. package/src/index.js +2 -3
  7. package/src/kb-manager.js +21 -19
  8. package/src/outpost.js +37 -33
  9. package/src/posture.js +3 -3
  10. package/src/privilege.js +11 -11
  11. package/src/scheduler.js +14 -12
  12. package/src/socket-server.js +19 -18
  13. package/src/spawn-env.js +7 -6
  14. package/src/state-manager.js +2 -2
  15. package/templates/.claude/agents/chief-of-staff.md +22 -22
  16. package/templates/.claude/agents/concierge.md +19 -17
  17. package/templates/.claude/agents/head-hunter.md +27 -26
  18. package/templates/.claude/agents/librarian.md +17 -16
  19. package/templates/.claude/agents/postman.md +19 -18
  20. package/templates/.claude/agents/recruiter.md +31 -27
  21. package/templates/.claude/skills/anarlog-follow/SKILL.md +50 -49
  22. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  23. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +4 -4
  24. package/templates/.claude/skills/anarlog-process/SKILL.md +35 -32
  25. package/templates/.claude/skills/anarlog-process/references/extraction.md +26 -22
  26. package/templates/.claude/skills/anarlog-process/references/sessions.md +10 -10
  27. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +10 -9
  28. package/templates/.claude/skills/anarlog-trim/SKILL.md +43 -40
  29. package/templates/.claude/skills/candidate-report/SKILL.md +30 -28
  30. package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
  31. package/templates/.claude/skills/candidate-report/references/report.css +4 -4
  32. package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
  33. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
  34. package/templates/.claude/skills/changelog/SKILL.md +55 -50
  35. package/templates/.claude/skills/deck-create/SKILL.md +30 -30
  36. package/templates/.claude/skills/deck-create/references/slide.css +4 -4
  37. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
  38. package/templates/.claude/skills/deck-review/SKILL.md +59 -57
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +49 -43
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +4 -3
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +25 -25
  44. package/templates/.claude/skills/doc-create/SKILL.md +21 -20
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +37 -33
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +5 -4
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +11 -9
  50. package/templates/.claude/skills/extract-entities/SKILL.md +65 -65
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +5 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +14 -13
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +5 -5
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +19 -18
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +13 -13
  57. package/templates/.claude/skills/extract-entities/references/sources.md +8 -8
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
  59. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +2 -2
  60. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  61. package/templates/.claude/skills/meeting-prep/SKILL.md +25 -24
  62. package/templates/.claude/skills/organize-files/SKILL.md +24 -22
  63. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  64. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  65. package/templates/.claude/skills/person-identify/SKILL.md +24 -22
  66. package/templates/.claude/skills/person-identify/scripts/identify.sh +17 -17
  67. package/templates/.claude/skills/person-lookup/SKILL.md +28 -29
  68. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +19 -16
  69. package/templates/.claude/skills/req-assess/SKILL.md +27 -27
  70. package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
  71. package/templates/.claude/skills/req-assess/references/panel-template.md +3 -2
  72. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  73. package/templates/.claude/skills/req-decide/SKILL.md +28 -25
  74. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  75. package/templates/.claude/skills/req-forget/SKILL.md +28 -26
  76. package/templates/.claude/skills/req-forget/references/classify.md +13 -13
  77. package/templates/.claude/skills/req-forget/references/locations.md +2 -2
  78. package/templates/.claude/skills/req-forget/references/report-template.md +1 -1
  79. package/templates/.claude/skills/req-scan/SKILL.md +21 -22
  80. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  81. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  82. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  83. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  85. package/templates/.claude/skills/req-screen/SKILL.md +31 -29
  86. package/templates/.claude/skills/req-screen/references/rubric.md +18 -18
  87. package/templates/.claude/skills/req-screen/references/template.md +4 -4
  88. package/templates/.claude/skills/req-track/SKILL.md +40 -40
  89. package/templates/.claude/skills/req-track/references/fields.md +19 -18
  90. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  91. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  92. package/templates/.claude/skills/req-track/references/templates.md +4 -4
  93. package/templates/.claude/skills/req-workday/SKILL.md +24 -24
  94. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  95. package/templates/.claude/skills/req-workday/references/templates.md +13 -13
  96. package/templates/.claude/skills/req-workday/references/xlsx-format.md +7 -7
  97. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +19 -17
  98. package/templates/.claude/skills/send-chat/SKILL.md +47 -43
  99. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +20 -19
  100. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  101. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  103. package/templates/.claude/skills/sync-apple-mail/SKILL.md +17 -14
  104. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  105. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  106. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  108. package/templates/.claude/skills/sync-teams/SKILL.md +43 -43
  109. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  110. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  111. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  112. package/templates/.claude/skills/upstream-instructions/SKILL.md +39 -40
  113. package/templates/.claude/skills/upstream-instructions/references/examples.md +2 -2
  114. package/templates/CLAUDE.md +40 -37
@@ -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 is woken or when the user asks to scan for open candidates.
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 handles fetching,
15
- filtering, deduplication, benchmarking, prospect-note writing, and memory
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 is woken by the scheduler.
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 no curl/wget).
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
- - [ ] Selected the least-recently-checked, non-suspended source.
44
- - [ ] Fetched via `WebFetch` (never curl/wget).
45
- - [ ] Applied all 5 filters in order; passed candidates have ≥ 2
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
- - [ ] Deduplicated against `seen.tsv` before processing.
48
- - [ ] Benchmarked each prospect against a real `bunx fit-pathway job`.
49
- - [ ] Prospect notes follow the template (no fabricated names).
50
- - [ ] All state mutations went through `node scripts/state.mjs` cursor, seen,
51
- prospects, failures, log.
52
- - [ ] Triage report written to the state directory; alternative queries (if any)
53
- logged.
54
- - [ ] Failures recorded; sources with ≥ 3 consecutive failures suspended.
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) signal, dedup,
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 filtering eliminates every candidate, try up to **3 alternatives** per wake
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, using the template in
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` full command reference:
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 filtering. Try at most **3 alternatives per wake** to stay within rate
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 (candidates sometimes post in the wrong
13
- thread; comments may link to candidate profiles).
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: 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
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 deciding skill fit.
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
- ## Logging alternatives
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 be tagged `opentowork` or `lookingforwork`.
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
- let the user decide.
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 must be identifiable from
50
- the post. Skip candidates with purely non-technical profiles.
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 skip during source selection. Retry
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 | Corporate proxy blocking the domain (won't recover) |
81
- | 403 Forbidden | Auth required or automated requests blocked |
82
- | 429 Too Many Requests | Rate limited will recover; don't suspend permanently |
83
- | Empty response / timeout | Transient likely recovers next wake |
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
- Monthly thread, posted on the 1st.
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?" with `created_at` in
14
- the current or previous month is the target thread.
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 each is one candidate. Parse the
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 (often obfuscated: "name [at] domain [dot] com").
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; one fetch per wake cycle.
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
- ## Logging
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
- * Provides atomic operations on the 5 state files used by the head-hunter agent:
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
- // --- Ensure state directory exists ---
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. Produces a structured screening assessment
6
- with interview/pass recommendation and suggested interview focus areas.
7
- Use when the user asks to evaluate a CV or when a new CV is detected.
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`. The single question this skill answers: **is this candidate
14
- worth interviewing?** Every assessment is grounded in the standard no
15
- subjective impressions.
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 / don't hire.
22
+ 3. `req-decide` — all stages complete → hire / do not hire.
22
23
 
23
24
  ## Trigger
24
25
 
25
- - A new CV is added to `Knowledge/Candidates/{Name}/`.
26
- - A CV appears in `~/Downloads/` and is associated with a candidate.
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` matching the candidate's `Req` (provides `Level`,
42
- `Discipline`, `Hiring manager`, `Domain lead`, and the `**Status:**` field).
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; vague phrases didn't earn levels.
55
- - [ ] "Not evidenced" skills are counted as gaps in the recommendation.
56
- - [ ] Recommendation follows the decision rules and threshold rule match % and
57
- gap count verified before picking a tier.
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 not as a soft "maybe".
60
- - [ ] Output file is exactly `screening.md`; any misnamed prior file deleted.
61
- - [ ] `brief.md` links the screening as `[CV Screening](./screening.md)` and
62
- Skills/Summary updated via targeted edits.
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 matching Role file:
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, but don't let historical (`closed`) roles
87
- block screening of still-active candidates.
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 using the level heuristics in
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 using the behaviour signals in
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 using the decision rules and threshold rule in
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` using the template in
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; note which gap each targets.
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 stated and not already set.
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 never inferred from names |
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 using this skill, mentored others, deep work |
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 unless the
54
- candidate provides concrete, quantified evidence (metrics, named systems, team
55
- sizes, user/revenue scale). Vague phrases like "improved performance" or "led
56
- initiatives" do not count. A skill listed only in a "Skills" section with no
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 doesn't mention this skill area. **Treat as a gap**:
77
- absence of evidence is not evidence of skill.
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 including thin evidence |
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 strong candidate with a specific, named concern, not a marginal
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`. Filename **must** be `screening.md`
5
- not `assessment.md`, `cv-screening.md`, or any variant. If a misnamed
6
- screening file exists in the folder (look for `# CV Screening` in the header),
7
- delete it after writing.
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}