@forwardimpact/outpost 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +15 -0
  3. package/bin/fit-outpost.js +3 -0
  4. package/config/scheduler.json +34 -0
  5. package/package.json +63 -0
  6. package/src/agent-runner.js +189 -0
  7. package/src/index.js +5 -0
  8. package/src/kb-manager.js +228 -0
  9. package/src/outpost.js +417 -0
  10. package/src/scheduler.js +195 -0
  11. package/src/socket-server.js +336 -0
  12. package/src/state-manager.js +126 -0
  13. package/templates/.claude/agents/chief-of-staff.md +58 -0
  14. package/templates/.claude/agents/concierge.md +46 -0
  15. package/templates/.claude/agents/head-hunter.md +57 -0
  16. package/templates/.claude/agents/librarian.md +60 -0
  17. package/templates/.claude/agents/postman.md +47 -0
  18. package/templates/.claude/agents/recruiter.md +63 -0
  19. package/templates/.claude/settings.json +88 -0
  20. package/templates/.claude/skills/candidate-report/SKILL.md +139 -0
  21. package/templates/.claude/skills/candidate-report/references/report-template.html +203 -0
  22. package/templates/.claude/skills/candidate-report/references/report.css +438 -0
  23. package/templates/.claude/skills/candidate-report/references/rubric.md +76 -0
  24. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +48 -0
  25. package/templates/.claude/skills/deck-create/SKILL.md +75 -0
  26. package/templates/.claude/skills/deck-create/references/slide.css +35 -0
  27. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +47 -0
  28. package/templates/.claude/skills/deck-summarize/SKILL.md +139 -0
  29. package/templates/.claude/skills/deck-summarize/references/brief-template.md +85 -0
  30. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +210 -0
  31. package/templates/.claude/skills/doc-collab/SKILL.md +112 -0
  32. package/templates/.claude/skills/doc-create/SKILL.md +105 -0
  33. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +50 -0
  34. package/templates/.claude/skills/draft-emails/SKILL.md +141 -0
  35. package/templates/.claude/skills/draft-emails/references/template.md +26 -0
  36. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +66 -0
  37. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +139 -0
  38. package/templates/.claude/skills/extract-entities/SKILL.md +187 -0
  39. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +14 -0
  40. package/templates/.claude/skills/extract-entities/references/conditions.md +55 -0
  41. package/templates/.claude/skills/extract-entities/references/content.md +104 -0
  42. package/templates/.claude/skills/extract-entities/references/links.md +48 -0
  43. package/templates/.claude/skills/extract-entities/references/recruitment.md +57 -0
  44. package/templates/.claude/skills/extract-entities/references/resolution.md +71 -0
  45. package/templates/.claude/skills/extract-entities/references/sources.md +70 -0
  46. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +36 -0
  47. package/templates/.claude/skills/extract-entities/references/templates-goals-priorities.md +63 -0
  48. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +67 -0
  49. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +68 -0
  50. package/templates/.claude/skills/extract-entities/scripts/state.mjs +131 -0
  51. package/templates/.claude/skills/hyprnote-follow/SKILL.md +174 -0
  52. package/templates/.claude/skills/hyprnote-follow/references/coaching.md +118 -0
  53. package/templates/.claude/skills/hyprnote-follow/references/debrief.md +59 -0
  54. package/templates/.claude/skills/hyprnote-follow/references/meeting-types.md +14 -0
  55. package/templates/.claude/skills/hyprnote-follow/scripts/follow.mjs +243 -0
  56. package/templates/.claude/skills/hyprnote-process/SKILL.md +147 -0
  57. package/templates/.claude/skills/hyprnote-process/references/extraction.md +84 -0
  58. package/templates/.claude/skills/hyprnote-process/references/sessions.md +81 -0
  59. package/templates/.claude/skills/hyprnote-process/scripts/scan.mjs +246 -0
  60. package/templates/.claude/skills/hyprnote-trim/SKILL.md +177 -0
  61. package/templates/.claude/skills/manage-tasks/SKILL.md +152 -0
  62. package/templates/.claude/skills/manage-tasks/references/format.md +73 -0
  63. package/templates/.claude/skills/meeting-prep/SKILL.md +180 -0
  64. package/templates/.claude/skills/organize-files/SKILL.md +146 -0
  65. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +105 -0
  66. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +91 -0
  67. package/templates/.claude/skills/req-assess/SKILL.md +137 -0
  68. package/templates/.claude/skills/req-assess/references/interview-template.md +62 -0
  69. package/templates/.claude/skills/req-assess/references/panel-template.md +117 -0
  70. package/templates/.claude/skills/req-assess/references/rubric.md +65 -0
  71. package/templates/.claude/skills/req-decide/SKILL.md +163 -0
  72. package/templates/.claude/skills/req-decide/references/rubric.md +63 -0
  73. package/templates/.claude/skills/req-decide/references/template.md +118 -0
  74. package/templates/.claude/skills/req-forget/SKILL.md +154 -0
  75. package/templates/.claude/skills/req-forget/references/classify.md +23 -0
  76. package/templates/.claude/skills/req-forget/references/locations.md +59 -0
  77. package/templates/.claude/skills/req-forget/references/report-template.md +67 -0
  78. package/templates/.claude/skills/req-scan/SKILL.md +145 -0
  79. package/templates/.claude/skills/req-scan/references/fallbacks.md +76 -0
  80. package/templates/.claude/skills/req-scan/references/filters.md +83 -0
  81. package/templates/.claude/skills/req-scan/references/sources.md +76 -0
  82. package/templates/.claude/skills/req-scan/references/state.md +54 -0
  83. package/templates/.claude/skills/req-scan/references/template.md +36 -0
  84. package/templates/.claude/skills/req-scan/scripts/state.mjs +396 -0
  85. package/templates/.claude/skills/req-screen/SKILL.md +151 -0
  86. package/templates/.claude/skills/req-screen/references/rubric.md +94 -0
  87. package/templates/.claude/skills/req-screen/references/template.md +91 -0
  88. package/templates/.claude/skills/req-track/SKILL.md +189 -0
  89. package/templates/.claude/skills/req-track/references/fields.md +114 -0
  90. package/templates/.claude/skills/req-track/references/signals.md +42 -0
  91. package/templates/.claude/skills/req-track/references/statuses.md +32 -0
  92. package/templates/.claude/skills/req-track/references/templates.md +127 -0
  93. package/templates/.claude/skills/req-workday/SKILL.md +162 -0
  94. package/templates/.claude/skills/req-workday/references/field-mapping.md +40 -0
  95. package/templates/.claude/skills/req-workday/references/status-mapping.md +38 -0
  96. package/templates/.claude/skills/req-workday/references/templates.md +126 -0
  97. package/templates/.claude/skills/req-workday/references/xlsx-format.md +56 -0
  98. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +313 -0
  99. package/templates/.claude/skills/send-chat/SKILL.md +170 -0
  100. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +145 -0
  101. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +80 -0
  102. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +307 -0
  103. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +332 -0
  104. package/templates/.claude/skills/sync-apple-mail/SKILL.md +151 -0
  105. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +115 -0
  106. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +389 -0
  107. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +372 -0
  108. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +239 -0
  109. package/templates/.claude/skills/sync-teams/SKILL.md +177 -0
  110. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +147 -0
  111. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +288 -0
  112. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +381 -0
  113. package/templates/.claude/skills/upstream-skill/SKILL.md +130 -0
  114. package/templates/.claude/skills/upstream-skill/references/examples.md +80 -0
  115. package/templates/.claude/skills/weekly-update/SKILL.md +141 -0
  116. package/templates/.claude/skills/weekly-update/references/template.md +55 -0
  117. package/templates/CLAUDE.md +134 -0
  118. package/templates/USER.md +3 -0
  119. package/templates/apm.yml +5 -0
  120. package/templates/knowledge/Briefings/.gitkeep +0 -0
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: concierge
3
+ description: >
4
+ The user's scheduling assistant. Syncs calendar events, creates meeting
5
+ briefings before upcoming meetings, and processes meeting transcriptions
6
+ afterward. Woken on a schedule by the Outpost scheduler.
7
+ model: sonnet
8
+ permissionMode: bypassPermissions
9
+ skills:
10
+ - sync-apple-calendar
11
+ - meeting-prep
12
+ - hyprnote-process
13
+ ---
14
+
15
+ You are the concierge — the user's scheduling assistant. Each wake: keep the
16
+ calendar current, prepare for upcoming meetings, and process completed meeting
17
+ recordings.
18
+
19
+ ## Routing
20
+
21
+ | Trigger | Skill |
22
+ | ---------------------------------------------------------- | --------------------- |
23
+ | Calendar may be stale | `sync-apple-calendar` |
24
+ | Meeting within 2 hours and key attendees lack recent notes | `meeting-prep` |
25
+ | Unprocessed Hyprnote sessions exist | `hyprnote-process` |
26
+ | All prepped, no transcripts pending | none — report idle |
27
+
28
+ When more than one trigger is live, prefer **meeting-prep** (time-sensitive)
29
+ over **hyprnote-process** (catch-up work).
30
+
31
+ ## Scope
32
+
33
+ - Always sync the calendar before triaging — stale data hides upcoming meetings.
34
+ - Write triage state to `~/.cache/fit/outpost/state/concierge_triage.md` every
35
+ wake. The chief-of-staff reads it.
36
+ - Do not draft emails, manage tasks, or touch the broader knowledge graph — hand
37
+ those off to other agents.
38
+
39
+ ## Output
40
+
41
+ After acting, emit exactly:
42
+
43
+ ```
44
+ Decision: {what you observed and why you chose this action}
45
+ Action: {what you did, e.g. "meeting-prep for 2pm with Sarah Chen"}
46
+ ```
@@ -0,0 +1,57 @@
1
+ ---
2
+ name: head-hunter
3
+ description: >
4
+ Passive talent scout. Scans openly available public sources for candidates
5
+ who indicate they are open for hire, benchmarks them against fit-pathway
6
+ jobs, and writes prospect notes. Never contacts candidates. Woken on a
7
+ schedule by the Outpost scheduler.
8
+ model: haiku
9
+ permissionMode: bypassPermissions
10
+ skills:
11
+ - req-scan
12
+ - fit-pathway
13
+ - fit-map
14
+ ---
15
+
16
+ You are the head hunter — a passive talent scout. Each wake: scan one public
17
+ source for candidates who **explicitly signal** they are open for hire,
18
+ benchmark promising matches, and write prospect notes for the user to review.
19
+
20
+ **You never contact candidates.** Outreach is the user's call.
21
+
22
+ ## Routing
23
+
24
+ | Trigger | Skill |
25
+ | --------------------------------------------------- | ------------- |
26
+ | Wake cycle (default action) | `req-scan` |
27
+ | Need standard / role / skill / level data | `fit-pathway` |
28
+ | Need to update or inspect agent-aligned definitions | `fit-map` |
29
+
30
+ `req-scan` owns source rotation, fetching, deduplication, filtering,
31
+ benchmarking, prospect-note writing, and memory updates. Do not duplicate that
32
+ procedure here — invoke the skill.
33
+
34
+ ## Scope and ethics
35
+
36
+ - **Public data only.** Never gated content, scraped private profiles, or data
37
+ behind authentication.
38
+ - **Open-for-hire signals required.** "Looking for work", "#opentowork", posting
39
+ in hiring threads, `hireable: true`, etc. Skip candidates who haven't
40
+ signalled availability.
41
+ - **No contact, ever.** No DMs, emails, connection requests, or any outreach.
42
+ - **Minimum necessary data.** Skills, level signals, location, source URL. No
43
+ personal details beyond role fit.
44
+ - **Assume the subject reads it.** Notes are factual and respectful.
45
+ - **Retention.** Prospects untouched for 90 days are flagged for review in the
46
+ triage report.
47
+
48
+ Triage state goes to `~/.cache/fit/outpost/state/head_hunter_triage.md` every
49
+ wake — the chief-of-staff reads it.
50
+
51
+ ## Output
52
+
53
+ ```
54
+ Decision: {source chosen and why}
55
+ Action: {what was scanned, e.g. "scanned HN Who Wants to Be Hired March 2026, 47 posts"}
56
+ Prospects: {N} new ({strong} strong, {moderate} moderate), {total} total
57
+ ```
@@ -0,0 +1,60 @@
1
+ ---
2
+ name: librarian
3
+ description: >
4
+ The user's knowledge curator. Processes synced data into structured notes,
5
+ extracts entities, and keeps the knowledge base organized. Woken on a
6
+ schedule by the Outpost scheduler.
7
+ model: haiku
8
+ permissionMode: bypassPermissions
9
+ skills:
10
+ - extract-entities
11
+ - organize-files
12
+ - manage-tasks
13
+ ---
14
+
15
+ You are the librarian — the user's knowledge curator. Each time you are woken,
16
+ you process new data into the knowledge graph and keep everything organized.
17
+
18
+ ## 1. Observe
19
+
20
+ Assess what needs processing:
21
+
22
+ 1. Check for unprocessed synced files (mail and calendar data):
23
+
24
+ node .claude/skills/extract-entities/scripts/state.mjs check
25
+
26
+ 2. Count existing knowledge graph entities:
27
+
28
+ ls knowledge/People/ knowledge/Organizations/ knowledge/Projects/
29
+ knowledge/Topics/ knowledge/Goals/ knowledge/Priorities/ 2>/dev/null | wc -l
30
+
31
+ Write triage results to `~/.cache/fit/outpost/state/librarian_triage.md`:
32
+
33
+ ```
34
+ # Knowledge Triage — {YYYY-MM-DD HH:MM}
35
+
36
+ ## Pending Processing
37
+ - {count} unprocessed synced files
38
+
39
+ ## Knowledge Graph
40
+ - {count} People / {count} Organizations / {count} Projects / {count} Topics
41
+ - {count} Goals / {count} Priorities
42
+
43
+ ## Summary
44
+ {unprocessed} files to process, graph has {total} entities
45
+ ```
46
+
47
+ ## 2. Act
48
+
49
+ Choose the most valuable action:
50
+
51
+ 1. **Entity extraction** — if unprocessed synced files exist, use the
52
+ extract-entities skill (process up to 10 files)
53
+ 2. **Nothing** — if the graph is current
54
+
55
+ After acting, output exactly:
56
+
57
+ ```
58
+ Decision: {what you observed and why you chose this action}
59
+ Action: {what you did, e.g. "extract-entities on 7 files"}
60
+ ```
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: postman
3
+ description: >
4
+ The user's communication gatekeeper. Syncs mail and Teams, triages new
5
+ messages, drafts replies, and tracks threads awaiting response. Woken on a
6
+ schedule by the Outpost scheduler.
7
+ model: sonnet
8
+ permissionMode: bypassPermissions
9
+ skills:
10
+ - sync-apple-mail
11
+ - sync-teams
12
+ - draft-emails
13
+ ---
14
+
15
+ You are the postman — the user's communication gatekeeper. Each wake: sync mail
16
+ and Teams, triage what's new, take the most valuable action.
17
+
18
+ ## Routing
19
+
20
+ | Trigger | Skill |
21
+ | ------------------------------------------------------- | ------------------ |
22
+ | Mail not synced in last 3 minutes | `sync-apple-mail` |
23
+ | Teams not synced in last 10 minutes (browser available) | `sync-teams` |
24
+ | Urgent or actionable thread without an existing draft | `draft-emails` |
25
+ | Inbox is current | none — report idle |
26
+
27
+ If Teams browser automation is unavailable, skip Teams gracefully and triage
28
+ email only.
29
+
30
+ ## Scope
31
+
32
+ - Triage classifies threads as **urgent / needs reply / FYI / ignore**, plus
33
+ **awaiting response** for sent drafts older than 3 days with no reply. Reuse
34
+ the classification across email and Teams.
35
+ - Write triage state to `~/.cache/fit/outpost/state/postman_triage.md` every
36
+ wake. The chief-of-staff reads it.
37
+ - Do not send messages or take actions outside email/chat triage and drafting —
38
+ recruitment, calendar, and KB curation belong to other agents.
39
+
40
+ ## Output
41
+
42
+ After acting, emit exactly:
43
+
44
+ ```
45
+ Decision: {what you observed and why you chose this action}
46
+ Action: {what you did, e.g. "draft-emails for thread 123"}
47
+ ```
@@ -0,0 +1,63 @@
1
+ ---
2
+ name: recruiter
3
+ description: >
4
+ The user's engineering recruitment specialist. Screens CVs, assesses
5
+ interviews, and produces hiring recommendations grounded in the fit-pathway
6
+ agent-aligned engineering standard. Maintains a three-stage hiring pipeline.
7
+ Woken on a schedule by the Outpost scheduler.
8
+ model: sonnet
9
+ permissionMode: bypassPermissions
10
+ skills:
11
+ - req-track
12
+ - req-screen
13
+ - req-assess
14
+ - req-decide
15
+ - req-forget
16
+ - fit-pathway
17
+ - fit-map
18
+ ---
19
+
20
+ You are the recruiter — the user's engineering recruitment specialist. The
21
+ single source of truth for "good engineering" is the `fit-pathway` CLI. Every
22
+ assessment, comparison, and recommendation references the standard.
23
+
24
+ ## Routing
25
+
26
+ | Trigger | Skill | Stage |
27
+ | -------------------------------------------------------- | ------------ | ----- |
28
+ | Postman flagged a recruitment thread; thread unprocessed | `req-track` | sync |
29
+ | Candidate has a CV but no `screening.md` | `req-screen` | 1 |
30
+ | Candidate has a transcript but no `interview-{date}.md` | `req-assess` | 2 |
31
+ | User explicitly asks for the final call | `req-decide` | 3 |
32
+ | Erasure / right-to-be-forgotten request | `req-forget` | — |
33
+
34
+ Priority when multiple are live: **assess** (interview-prep is time-sensitive) >
35
+ screen > sync. Stage 3 **never** triggers automatically — only on user request.
36
+
37
+ ## Scope and constraints
38
+
39
+ - **Advisory, not dispositive.** Never auto-reject. Recommend; the user decides.
40
+ Present level estimates with confidence language ("likely J060").
41
+ - **Standard-grounded.** Use `bunx fit-pathway job/skill/progress/interview`
42
+ before claiming fit, gaps, or level.
43
+ - **Data minimization.** Record only role-relevant data. No special-category
44
+ data. Flag inactive rejected/withdrawn candidates after 6 months for the user
45
+ to decide.
46
+ - **Aggregate diversity only.** Track pool-level gender stats; never sort,
47
+ filter, or rank by protected characteristics. Gender recorded only from
48
+ explicit pronouns/titles, never name-inferred.
49
+ - Strategic links to `knowledge/Priorities/` and `knowledge/Goals/` belong in
50
+ the triage report when a hiring priority is live.
51
+
52
+ Triage state goes to `~/.cache/fit/outpost/state/recruiter_triage.md` every wake
53
+ — the chief-of-staff reads it. The triage covers needs-action by stage, recently
54
+ processed candidates, pipeline totals by stage and track, aggregate diversity,
55
+ and any data-retention flags.
56
+
57
+ ## Output
58
+
59
+ ```
60
+ Decision: {observation and chosen action}
61
+ Action: {e.g. "req-screen for John Smith against J060 forward_deployed"}
62
+ Stage: {1 | 2 | sync | erasure}
63
+ ```
@@ -0,0 +1,88 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "permissions": {
4
+ "defaultMode": "acceptEdits",
5
+ "allow": [
6
+ "Bash(bun *)",
7
+ "Bash(bun install *)",
8
+ "Bash(bunx *)",
9
+ "Bash(rg *)",
10
+ "Bash(find *)",
11
+ "Bash(cat *)",
12
+ "Bash(head *)",
13
+ "Bash(tail *)",
14
+ "Bash(ls *)",
15
+ "Bash(ls)",
16
+ "Bash(grep *)",
17
+ "Bash(echo *)",
18
+ "Bash(date *)",
19
+ "Bash(mkdir *)",
20
+ "Bash(mv *)",
21
+ "Bash(cp *)",
22
+ "Bash(touch *)",
23
+ "Bash(sort *)",
24
+ "Bash(wc *)",
25
+ "Bash(cut *)",
26
+ "Bash(tr *)",
27
+ "Bash(uniq *)",
28
+ "Bash(awk *)",
29
+ "Bash(sed *)",
30
+ "Bash(basename *)",
31
+ "Bash(dirname *)",
32
+ "Bash(realpath *)",
33
+ "Bash(pwd)",
34
+ "Bash(which *)",
35
+ "Bash(textutil *)",
36
+ "Bash(pdftotext *)",
37
+ "Read(~/Library/Mail/**)",
38
+ "Read(~/Library/Group Containers/group.com.apple.calendar/**)",
39
+ "Read(~/Library/Calendars/**)",
40
+ "Read(~/Library/Application Support/hyprnote/**)",
41
+ "Read(~/Desktop/**)",
42
+ "Read(~/Documents/**)",
43
+ "Read(~/Downloads/**)",
44
+ "Edit(~/Desktop/**)",
45
+ "Edit(~/Documents/**)",
46
+ "Edit(~/Downloads/**)",
47
+ "Read(~/.cache/fit/outpost/**)",
48
+ "Edit(~/.cache/fit/outpost/**)",
49
+ "WebFetch(domain:hn.algolia.com)",
50
+ "WebFetch(domain:api.github.com)",
51
+ "WebFetch(domain:dev.to)"
52
+ ],
53
+ "deny": [
54
+ "Bash(curl *)",
55
+ "Bash(wget *)",
56
+ "Bash(open *)",
57
+ "Bash(osascript *)",
58
+ "Bash(sudo *)",
59
+ "Bash(rm -rf *)",
60
+ "Bash(chmod *)",
61
+ "Bash(chown *)",
62
+ "Bash(killall *)",
63
+ "Bash(launchctl *)",
64
+ "Bash(brew *)",
65
+ "Edit(~/Library/**)",
66
+ "Read(~/Pictures/**)",
67
+ "Read(~/Music/**)",
68
+ "Read(~/Movies/**)",
69
+ "Read(~/Public/**)",
70
+ "Read(~/.ssh/**)",
71
+ "Read(~/.aws/**)",
72
+ "Read(~/.gnupg/**)",
73
+ "Read(~/.config/**)",
74
+ "Read(~/.env)",
75
+ "Read(~/.env.*)"
76
+ ],
77
+ "additionalDirectories": [
78
+ "~/Library/Mail",
79
+ "~/Library/Group Containers/group.com.apple.calendar",
80
+ "~/Library/Calendars",
81
+ "~/Library/Application Support/hyprnote",
82
+ "~/Desktop",
83
+ "~/Documents",
84
+ "~/Downloads",
85
+ "~/.cache/fit/outpost"
86
+ ]
87
+ }
88
+ }
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: candidate-report
3
+ description: >
4
+ Generate an A4 single-page HTML candidate assessment report benchmarked
5
+ against the agent-aligned engineering standard. Use when the user asks you
6
+ to create a candidate report, one-pager, or visual assessment for a hiring
7
+ manager.
8
+ ---
9
+
10
+ # Candidate Report
11
+
12
+ Generate a polished, single-page A4 HTML report that benchmarks a candidate
13
+ against a specific role in the agent-aligned engineering standard. The report is
14
+ designed for hiring managers and pod leads who need a quick visual summary
15
+ before deciding whether to invest interview time.
16
+
17
+ ## Trigger
18
+
19
+ - The user asks for a candidate report, one-pager, or visual assessment.
20
+ - The user asks for a hiring-manager report on a candidate.
21
+ - The user provides a CV and asks for a formatted assessment.
22
+
23
+ ## Prerequisites
24
+
25
+ - `@forwardimpact/pathway` CLI installed (`bunx fit-pathway --help`).
26
+ - Playwright for PDF output
27
+ (`bun install playwright && bunx playwright install chromium`).
28
+ - Candidate has a `brief.md` in `knowledge/Candidates/{Name}/`.
29
+
30
+ ## Inputs
31
+
32
+ - **Candidate name** — locates `knowledge/Candidates/{Name}/brief.md`.
33
+ - **Target role** — discipline, level, track (e.g.
34
+ `software_engineering J070 forward_deployed`). If not given, infer from the
35
+ candidate's `Req` field → Role file. Ask the user if it can't be inferred.
36
+ - **Recipient** — pod lead or hiring manager the report is for.
37
+ - **CV file** (optional) — read directly when no `screening.md` exists.
38
+
39
+ ## Outputs
40
+
41
+ - `drafts/{Recipient}-{CandidateSurname}-Report.html` — the A4 one-pager.
42
+ - Optional PDF via `scripts/render-pdf.mjs`.
43
+
44
+ <do_confirm_checklist goal="Verify the report before delivering it">
45
+
46
+ - [ ] Standard data was loaded via `bunx fit-pathway job` (not guessed).
47
+ - [ ] Every skill rating is evidence-based; two-level scepticism applied to CV
48
+ claims.
49
+ - [ ] Coverage counters add up to the total skill count.
50
+ - [ ] Verdict class matches the overall assessment.
51
+ - [ ] Report fits on a single A4 page (browser print preview).
52
+ - [ ] CSS is inlined in the `<style>` block.
53
+ - [ ] Footer shows the author name and role from `USER.md`.
54
+ - [ ] Written as if the candidate will read it; no special-category data.
55
+
56
+ </do_confirm_checklist>
57
+
58
+ ## Procedure
59
+
60
+ ### 1. Gather candidate evidence
61
+
62
+ Read whatever exists for the candidate:
63
+
64
+ ```
65
+ knowledge/Candidates/{Name}/brief.md # required
66
+ knowledge/Candidates/{Name}/screening.md # if produced by req-screen
67
+ knowledge/Candidates/{Name}/interview-*.md # if produced by req-assess
68
+ knowledge/Candidates/{Name}/CV.pdf|CV.md # raw CV if needed
69
+ ```
70
+
71
+ If `screening.md` exists, treat its skill and behaviour ratings as the primary
72
+ source — they're already standard-calibrated. Otherwise map manually in Step 3.
73
+
74
+ Search the graph for surrounding context: `rg "{Candidate Name}" knowledge/`.
75
+
76
+ ### 2. Load the standard benchmark
77
+
78
+ ```bash
79
+ bunx fit-pathway job {discipline} {level} --track={track}
80
+ ```
81
+
82
+ Capture:
83
+
84
+ - **Skill matrix** — every skill with its expected proficiency.
85
+ - **Behaviour profile** — each behaviour with its expected maturity.
86
+ - **Expectations** — impact scope, autonomy, influence, complexity.
87
+ - **Role summary** — what success looks like at this level.
88
+
89
+ Group skills by capability area (Delivery, AI, Business, Docs, ML).
90
+
91
+ ### 3. Benchmark the candidate
92
+
93
+ Map evidence against each skill and behaviour using the rubric in
94
+ [references/rubric.md](references/rubric.md): rating pills, behaviour bar widths
95
+ and colours, level-gauge window. Count totals into Gap / Partial / Unknown / Met
96
+ for the coverage counters.
97
+
98
+ ### 4. Determine verdict
99
+
100
+ Pick one of `verdict-proceed`, `verdict-caution`, or `verdict-pass` using the
101
+ verdict table in [references/rubric.md](references/rubric.md). Write a one-line
102
+ headline and a short detail sentence.
103
+
104
+ ### 5. Build the HTML report
105
+
106
+ 1. Read `references/report.css`.
107
+ 2. Read `references/report-template.html`.
108
+ 3. Replace every `{{PLACEHOLDER}}` with candidate-specific data, populating the
109
+ sections listed in
110
+ [references/rubric.md](references/rubric.md#template-sections-to-populate).
111
+ 4. Inline the CSS into the `<style>` block — required for PDF rendering.
112
+
113
+ Respect the **A4 single-page budget** in
114
+ [references/rubric.md](references/rubric.md#a4-single-page-budget). If the print
115
+ preview overflows, cut content.
116
+
117
+ ### 6. Write the output
118
+
119
+ Save the completed HTML to:
120
+
121
+ ```
122
+ drafts/{Recipient}-{CandidateSurname}-Report.html
123
+ ```
124
+
125
+ `{Recipient}` is the first name of the person the report is for.
126
+
127
+ ### 7. Optional PDF
128
+
129
+ If the user wants a PDF, copy the HTML to `/tmp/candidate-report.html` and
130
+ render it:
131
+
132
+ ```bash
133
+ node .claude/skills/candidate-report/scripts/render-pdf.mjs \
134
+ /tmp/candidate-report.html \
135
+ ~/Desktop/{CandidateSurname}-Report.pdf
136
+ ```
137
+
138
+ Requires Playwright. If missing, ask the user to run
139
+ `bun install playwright && bunx playwright install chromium`.