@forwardimpact/outpost 3.3.3 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -201
- package/config/skill-postures.json +28 -0
- package/package.json +1 -1
- package/src/agent-runner.js +52 -1
- package/src/kb-manager.js +5 -7
- package/src/outpost.js +42 -0
- package/src/posture.js +77 -0
- package/src/socket-server.js +1 -5
- package/templates/.claude/agents/chief-of-staff.md +24 -9
- package/templates/.claude/agents/concierge.md +14 -0
- package/templates/.claude/agents/head-hunter.md +14 -0
- package/templates/.claude/agents/librarian.md +19 -7
- package/templates/.claude/agents/postman.md +14 -0
- package/templates/.claude/agents/recruiter.md +21 -12
- package/templates/.claude/skills/anarlog-follow/SKILL.md +7 -7
- package/templates/.claude/skills/anarlog-process/SKILL.md +15 -16
- package/templates/.claude/skills/anarlog-process/references/extraction.md +5 -5
- package/templates/.claude/skills/candidate-report/SKILL.md +9 -9
- package/templates/.claude/skills/deck-create/SKILL.md +2 -2
- package/templates/.claude/skills/deck-summarize/SKILL.md +2 -2
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +1 -1
- package/templates/.claude/skills/doc-collab/SKILL.md +8 -8
- package/templates/.claude/skills/doc-create/SKILL.md +3 -3
- package/templates/.claude/skills/draft-emails/SKILL.md +19 -19
- package/templates/.claude/skills/draft-emails/references/template.md +1 -1
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +4 -4
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +2 -2
- package/templates/.claude/skills/extract-entities/SKILL.md +16 -17
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +2 -2
- package/templates/.claude/skills/extract-entities/references/conditions.md +4 -4
- package/templates/.claude/skills/extract-entities/references/links.md +3 -18
- package/templates/.claude/skills/extract-entities/references/recruitment.md +8 -8
- package/templates/.claude/skills/extract-entities/references/resolution.md +3 -5
- package/templates/.claude/skills/extract-entities/references/sources.md +1 -1
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +2 -2
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +32 -0
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +2 -2
- package/templates/.claude/skills/meeting-prep/SKILL.md +18 -19
- package/templates/.claude/skills/req-assess/SKILL.md +11 -11
- package/templates/.claude/skills/req-assess/references/interview-template.md +1 -1
- package/templates/.claude/skills/req-assess/references/panel-template.md +1 -1
- package/templates/.claude/skills/req-decide/SKILL.md +17 -17
- package/templates/.claude/skills/req-decide/references/template.md +1 -1
- package/templates/.claude/skills/req-forget/SKILL.md +8 -8
- package/templates/.claude/skills/req-forget/references/classify.md +4 -4
- package/templates/.claude/skills/req-forget/references/locations.md +10 -10
- package/templates/.claude/skills/req-forget/references/report-template.md +8 -8
- package/templates/.claude/skills/req-scan/SKILL.md +3 -3
- package/templates/.claude/skills/req-scan/references/template.md +1 -1
- package/templates/.claude/skills/req-screen/SKILL.md +9 -9
- package/templates/.claude/skills/req-screen/references/template.md +1 -1
- package/templates/.claude/skills/req-track/SKILL.md +17 -17
- package/templates/.claude/skills/req-track/references/fields.md +8 -8
- package/templates/.claude/skills/req-track/references/signals.md +2 -2
- package/templates/.claude/skills/req-track/references/templates.md +1 -1
- package/templates/.claude/skills/req-workday/SKILL.md +12 -12
- package/templates/.claude/skills/req-workday/references/templates.md +3 -3
- package/templates/.claude/skills/send-chat/SKILL.md +4 -4
- package/templates/.claude/skills/upstream-instructions/SKILL.md +154 -0
- package/templates/.claude/skills/upstream-instructions/references/examples.md +97 -0
- package/templates/CLAUDE.md +47 -53
- package/templates/.claude/skills/extract-entities/references/templates-goals-priorities.md +0 -63
- package/templates/.claude/skills/upstream-skill/SKILL.md +0 -130
- package/templates/.claude/skills/upstream-skill/references/examples.md +0 -80
- package/templates/knowledge/Briefings/.gitkeep +0 -0
|
@@ -19,6 +19,19 @@ benchmark promising matches, and write prospect notes for the user to review.
|
|
|
19
19
|
|
|
20
20
|
**You never contact candidates.** Outreach is the user's call.
|
|
21
21
|
|
|
22
|
+
## Priorities
|
|
23
|
+
|
|
24
|
+
At the start of every wake, before acting, read `Knowledge/Priorities/`. The
|
|
25
|
+
user's priorities are the lens for all your work this wake.
|
|
26
|
+
|
|
27
|
+
- **Always consider them.** Weigh each action against whether it advances a
|
|
28
|
+
priority, and favour work that does.
|
|
29
|
+
- **Always flag risks.** When you encounter a chat, email, transcript, or any
|
|
30
|
+
other signal that could **contradict, block, or slow** a priority, record it
|
|
31
|
+
under a `## Priority Watch` heading in your triage report — name the priority,
|
|
32
|
+
quote the evidence, and state the risk — and echo it in the `Priority Watch`
|
|
33
|
+
line of your output. Never let such a signal pass silently.
|
|
34
|
+
|
|
22
35
|
## Routing
|
|
23
36
|
|
|
24
37
|
| Trigger | Skill |
|
|
@@ -54,4 +67,5 @@ wake — the chief-of-staff reads it.
|
|
|
54
67
|
Decision: {source chosen and why}
|
|
55
68
|
Action: {what was scanned, e.g. "scanned HN Who Wants to Be Hired March 2026, 47 posts"}
|
|
56
69
|
Prospects: {N} new ({strong} strong, {moderate} moderate), {total} total
|
|
70
|
+
Priority Watch: {priority at risk + one-line why, or "none"}
|
|
57
71
|
```
|
|
@@ -14,6 +14,19 @@ skills:
|
|
|
14
14
|
You are the librarian — the user's knowledge curator. Each time you are woken,
|
|
15
15
|
you process new data into the knowledge graph and keep everything organized.
|
|
16
16
|
|
|
17
|
+
## Priorities
|
|
18
|
+
|
|
19
|
+
At the start of every wake, before acting, read `Knowledge/Priorities/`. The
|
|
20
|
+
user's priorities are the lens for all your work this wake.
|
|
21
|
+
|
|
22
|
+
- **Always consider them.** Weigh each action against whether it advances a
|
|
23
|
+
priority, and favour work that does.
|
|
24
|
+
- **Always flag risks.** When you encounter a chat, email, transcript, or any
|
|
25
|
+
other signal that could **contradict, block, or slow** a priority, record it
|
|
26
|
+
under a `## Priority Watch` heading in your triage report — name the priority,
|
|
27
|
+
quote the evidence, and state the risk — and echo it in the `Priority Watch`
|
|
28
|
+
line of your output. Never let such a signal pass silently.
|
|
29
|
+
|
|
17
30
|
## 1. Observe
|
|
18
31
|
|
|
19
32
|
Assess what needs processing:
|
|
@@ -24,21 +37,19 @@ Assess what needs processing:
|
|
|
24
37
|
|
|
25
38
|
2. Count existing knowledge graph entities:
|
|
26
39
|
|
|
27
|
-
ls
|
|
28
|
-
|
|
40
|
+
ls Knowledge/People/ Knowledge/Organizations/ Knowledge/Projects/
|
|
41
|
+
Knowledge/Topics/ Knowledge/Priorities/ 2>/dev/null | wc -l
|
|
29
42
|
|
|
30
43
|
Write triage results to `~/.cache/fit/outpost/state/librarian_triage.md`:
|
|
31
44
|
|
|
32
45
|
```
|
|
33
46
|
# Knowledge Triage — {YYYY-MM-DD HH:MM}
|
|
34
|
-
|
|
35
47
|
## Pending Processing
|
|
36
48
|
- {count} unprocessed synced files
|
|
37
|
-
|
|
38
49
|
## Knowledge Graph
|
|
39
|
-
- {count} People / {count}
|
|
40
|
-
|
|
41
|
-
|
|
50
|
+
- {count} People / {count} Orgs / {count} Projects / {count} Topics / {count} Priorities
|
|
51
|
+
## Priority Watch
|
|
52
|
+
- {priority risks found while processing, or "none"}
|
|
42
53
|
## Summary
|
|
43
54
|
{unprocessed} files to process, graph has {total} entities
|
|
44
55
|
```
|
|
@@ -56,4 +67,5 @@ After acting, output exactly:
|
|
|
56
67
|
```
|
|
57
68
|
Decision: {what you observed and why you chose this action}
|
|
58
69
|
Action: {what you did, e.g. "extract-entities on 7 files"}
|
|
70
|
+
Priority Watch: {priority at risk + one-line why, or "none"}
|
|
59
71
|
```
|
|
@@ -15,6 +15,19 @@ skills:
|
|
|
15
15
|
You are the postman — the user's communication gatekeeper. Each wake: sync mail
|
|
16
16
|
and Teams, triage what's new, take the most valuable action.
|
|
17
17
|
|
|
18
|
+
## Priorities
|
|
19
|
+
|
|
20
|
+
At the start of every wake, before acting, read `Knowledge/Priorities/`. The
|
|
21
|
+
user's priorities are the lens for all your work this wake.
|
|
22
|
+
|
|
23
|
+
- **Always consider them.** Weigh each action against whether it advances a
|
|
24
|
+
priority, and favour work that does.
|
|
25
|
+
- **Always flag risks.** When you encounter a chat, email, transcript, or any
|
|
26
|
+
other signal that could **contradict, block, or slow** a priority, record it
|
|
27
|
+
under a `## Priority Watch` heading in your triage report — name the priority,
|
|
28
|
+
quote the evidence, and state the risk — and echo it in the `Priority Watch`
|
|
29
|
+
line of your output. Never let such a signal pass silently.
|
|
30
|
+
|
|
18
31
|
## Routing
|
|
19
32
|
|
|
20
33
|
| Trigger | Skill |
|
|
@@ -44,4 +57,5 @@ After acting, emit exactly:
|
|
|
44
57
|
```
|
|
45
58
|
Decision: {what you observed and why you chose this action}
|
|
46
59
|
Action: {what you did, e.g. "draft-emails for thread 123"}
|
|
60
|
+
Priority Watch: {priority at risk + one-line why, or "none"}
|
|
47
61
|
```
|
|
@@ -3,8 +3,7 @@ name: recruiter
|
|
|
3
3
|
description: >
|
|
4
4
|
The user's engineering recruitment specialist. Screens CVs, assesses
|
|
5
5
|
interviews, and produces hiring recommendations grounded in the fit-pathway
|
|
6
|
-
agent-aligned engineering standard.
|
|
7
|
-
Woken on a schedule by the Outpost scheduler.
|
|
6
|
+
agent-aligned engineering standard. Woken on a schedule by the Outpost scheduler.
|
|
8
7
|
model: sonnet
|
|
9
8
|
permissionMode: bypassPermissions
|
|
10
9
|
skills:
|
|
@@ -18,8 +17,21 @@ skills:
|
|
|
18
17
|
---
|
|
19
18
|
|
|
20
19
|
You are the recruiter — the user's engineering recruitment specialist. The
|
|
21
|
-
single source of truth for "good engineering" is the `fit-pathway` CLI
|
|
22
|
-
assessment
|
|
20
|
+
single source of truth for "good engineering" is the `fit-pathway` CLI; every
|
|
21
|
+
assessment and recommendation references the standard.
|
|
22
|
+
|
|
23
|
+
## Priorities
|
|
24
|
+
|
|
25
|
+
At the start of every wake, before acting, read `Knowledge/Priorities/`. The
|
|
26
|
+
user's priorities are the lens for all your work this wake.
|
|
27
|
+
|
|
28
|
+
- **Always consider them.** Weigh each action against whether it advances a
|
|
29
|
+
priority, and favour work that does.
|
|
30
|
+
- **Always flag risks.** When you encounter a chat, email, transcript, or any
|
|
31
|
+
other signal that could **contradict, block, or slow** a priority, record it
|
|
32
|
+
under a `## Priority Watch` heading in your triage report — name the priority,
|
|
33
|
+
quote the evidence, and state the risk — and echo it in the `Priority Watch`
|
|
34
|
+
line of your output. Never let such a signal pass silently.
|
|
23
35
|
|
|
24
36
|
## Routing
|
|
25
37
|
|
|
@@ -40,19 +52,15 @@ screen > sync. Stage 3 **never** triggers automatically — only on user request
|
|
|
40
52
|
Present level estimates with confidence language ("likely J060").
|
|
41
53
|
- **Standard-grounded.** Use `bunx fit-pathway job/skill/progress/interview`
|
|
42
54
|
before claiming fit, gaps, or level.
|
|
43
|
-
- **Data minimization.** Record only role-relevant data
|
|
44
|
-
data. Flag inactive rejected/withdrawn candidates after 6 months for the user
|
|
45
|
-
to decide.
|
|
55
|
+
- **Data minimization.** Record only role-relevant data; no special-category
|
|
56
|
+
data. Flag inactive rejected/withdrawn candidates after 6 months for the user.
|
|
46
57
|
- **Aggregate diversity only.** Track pool-level gender stats; never sort,
|
|
47
58
|
filter, or rank by protected characteristics. Gender recorded only from
|
|
48
59
|
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
60
|
|
|
52
61
|
Triage state goes to `~/.cache/fit/outpost/state/recruiter_triage.md` every wake
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
and any data-retention flags.
|
|
62
|
+
(the chief-of-staff reads it): needs-action by stage, recently processed
|
|
63
|
+
candidates, pipeline totals by stage/track, aggregate diversity, retention flags.
|
|
56
64
|
|
|
57
65
|
## Output
|
|
58
66
|
|
|
@@ -60,4 +68,5 @@ and any data-retention flags.
|
|
|
60
68
|
Decision: {observation and chosen action}
|
|
61
69
|
Action: {e.g. "req-screen for John Smith against J060 forward_deployed"}
|
|
62
70
|
Stage: {1 | 2 | sync | erasure}
|
|
71
|
+
Priority Watch: {priority at risk + one-line why, or "none"}
|
|
63
72
|
```
|
|
@@ -31,8 +31,8 @@ content appears.
|
|
|
31
31
|
## Inputs
|
|
32
32
|
|
|
33
33
|
- Live `transcript.json` (growing during the session).
|
|
34
|
-
- `
|
|
35
|
-
`
|
|
34
|
+
- `Knowledge/People/`, `Knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
|
|
35
|
+
`Knowledge/Roles/`, `Knowledge/Organizations/`, `Knowledge/Projects/`.
|
|
36
36
|
- `~/.cache/fit/outpost/apple_calendar/*.json` for context.
|
|
37
37
|
|
|
38
38
|
## Outputs
|
|
@@ -91,8 +91,8 @@ Phase 2 context loading and Phase 3 dimensions.
|
|
|
91
91
|
Extract names from title and participant list. For each:
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
|
-
rg -l "{name}"
|
|
95
|
-
rg -l "{name}"
|
|
94
|
+
rg -l "{name}" Knowledge/People/
|
|
95
|
+
rg -l "{name}" Knowledge/Candidates/
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
Read matching notes for role, organization, history, open items, prior
|
|
@@ -100,8 +100,8 @@ interactions.
|
|
|
100
100
|
|
|
101
101
|
#### 5. Load type-specific context
|
|
102
102
|
|
|
103
|
-
**Interviews:** read `
|
|
104
|
-
look up the `Req` field's matching `
|
|
103
|
+
**Interviews:** read `Knowledge/Candidates/{Name}/{brief,screening,panel}.md`,
|
|
104
|
+
look up the `Req` field's matching `Knowledge/Roles/*.md`, and load standard
|
|
105
105
|
expectations:
|
|
106
106
|
|
|
107
107
|
```bash
|
|
@@ -109,7 +109,7 @@ bunx fit-pathway job {discipline} {level} --track={track}
|
|
|
109
109
|
```
|
|
110
110
|
|
|
111
111
|
**General meetings:** read attendee People notes plus referenced
|
|
112
|
-
Project/Organization notes. Check open tasks: `rg "{name}"
|
|
112
|
+
Project/Organization notes. Check open tasks: `rg "{name}" Knowledge/Tasks/`.
|
|
113
113
|
|
|
114
114
|
#### 6. Build the coaching brief
|
|
115
115
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: anarlog-process
|
|
3
|
-
description: Process Anarlog meeting sessions (memos, summaries, transcripts) into the knowledge graph. Extracts people, organizations, projects, and topics from AI-generated meeting summaries and user notes, creating or updating Obsidian-compatible notes in
|
|
3
|
+
description: Process Anarlog meeting sessions (memos, summaries, transcripts) into the knowledge graph. Extracts people, organizations, projects, and topics from AI-generated meeting summaries and user notes, creating or updating Obsidian-compatible notes in Knowledge/. Use when the user asks to process meeting notes or after Anarlog sessions.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Process Anarlog
|
|
7
7
|
|
|
8
8
|
Process meeting sessions from Anarlog (a local AI meeting-notes app) into the
|
|
9
9
|
knowledge graph. Anarlog records meetings, transcribes them, and generates AI
|
|
10
|
-
summaries; this skill reads that output and feeds it into `
|
|
10
|
+
summaries; this skill reads that output and feeds it into `Knowledge/` — the
|
|
11
11
|
same way `extract-entities` processes emails and calendar events.
|
|
12
12
|
|
|
13
13
|
## Trigger
|
|
@@ -35,9 +35,9 @@ same way `extract-entities` processes emails and calendar events.
|
|
|
35
35
|
|
|
36
36
|
## Outputs
|
|
37
37
|
|
|
38
|
-
- `
|
|
39
|
-
`
|
|
40
|
-
- `
|
|
38
|
+
- `Knowledge/People/`, `Knowledge/Organizations/`, `Knowledge/Projects/`,
|
|
39
|
+
`Knowledge/Topics/` — created or updated.
|
|
40
|
+
- `Knowledge/Priorities/` — **updated only**, never
|
|
41
41
|
auto-created.
|
|
42
42
|
- `~/.cache/fit/outpost/state/graph_processed` — updated.
|
|
43
43
|
|
|
@@ -47,12 +47,12 @@ same way `extract-entities` processes emails and calendar events.
|
|
|
47
47
|
- [ ] Both `_memo.md` and `_summary.md` read (when present); transcript
|
|
48
48
|
consulted only for disambiguation.
|
|
49
49
|
- [ ] "Would I prep?" test applied to each person; self excluded.
|
|
50
|
-
- [ ] Interview sessions wrote to `
|
|
51
|
-
`
|
|
50
|
+
- [ ] Interview sessions wrote to `Knowledge/Candidates/`, not
|
|
51
|
+
`Knowledge/People/`.
|
|
52
52
|
- [ ] All links use absolute paths `[[Folder/Name]]`.
|
|
53
53
|
- [ ] Activity entries describe relationship, not communication method.
|
|
54
|
-
- [ ] No new `
|
|
55
|
-
referenced
|
|
54
|
+
- [ ] No new `Priorities/` auto-created (user-set only); any
|
|
55
|
+
referenced priority had its progress updated.
|
|
56
56
|
- [ ] `graph_processed` updated for every processed file (memo + summary).
|
|
57
57
|
|
|
58
58
|
</do_confirm_checklist>
|
|
@@ -83,9 +83,9 @@ metadata fallback).
|
|
|
83
83
|
### 1. Build the knowledge index
|
|
84
84
|
|
|
85
85
|
```bash
|
|
86
|
-
ls
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
ls Knowledge/People/ Knowledge/Organizations/ Knowledge/Projects/ \
|
|
87
|
+
Knowledge/Topics/ Knowledge/Priorities/ \
|
|
88
|
+
Knowledge/Conditions/ 2>/dev/null
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
Read each note's header to build a mental index of known entities (same approach
|
|
@@ -104,7 +104,7 @@ Anarlog sessions are **meetings** and follow the meeting rules from
|
|
|
104
104
|
`extract-entities`:
|
|
105
105
|
|
|
106
106
|
- **Can create** People, Organization, Project, and Topic notes.
|
|
107
|
-
- **Can update** existing notes — including
|
|
107
|
+
- **Can update** existing notes — including Priorities, which are
|
|
108
108
|
user-set and never auto-created.
|
|
109
109
|
- **Can detect** state changes.
|
|
110
110
|
|
|
@@ -123,7 +123,7 @@ interview-note rules, and linking rules — live in
|
|
|
123
123
|
For **new** entities, use the templates in
|
|
124
124
|
`.claude/skills/extract-entities/references/TEMPLATES.md`. For interview
|
|
125
125
|
sessions, use the candidate brief template from `req-track` (under
|
|
126
|
-
`
|
|
126
|
+
`Knowledge/Candidates/`).
|
|
127
127
|
|
|
128
128
|
For **existing** entities, apply targeted edits — never rewrite the file:
|
|
129
129
|
|
|
@@ -133,8 +133,7 @@ For **existing** entities, apply targeted edits — never rewrite the file:
|
|
|
133
133
|
- Update open items (mark completed, add new).
|
|
134
134
|
- Apply state changes.
|
|
135
135
|
|
|
136
|
-
Verify bidirectional links per `extract-entities` Step 10 (
|
|
137
|
-
↔ Priority, Project ↔ Priority).
|
|
136
|
+
Verify bidirectional links per `extract-entities` Step 10 (Project ↔ Priority).
|
|
138
137
|
|
|
139
138
|
### 6. Update graph state
|
|
140
139
|
|
|
@@ -39,8 +39,8 @@ Never create or update a note for the user — match against name, email, or
|
|
|
39
39
|
## Interview sessions (special case)
|
|
40
40
|
|
|
41
41
|
If the title or memo indicates "interview with {Name}", the interviewee is a
|
|
42
|
-
**candidate** — create or update their note in `
|
|
43
|
-
the candidate brief template from `req-track`), **not** in `
|
|
42
|
+
**candidate** — create or update their note in `Knowledge/Candidates/` (using
|
|
43
|
+
the candidate brief template from `req-track`), **not** in `Knowledge/People/`.
|
|
44
44
|
|
|
45
45
|
## Content signals
|
|
46
46
|
|
|
@@ -77,8 +77,8 @@ strengths and concerns, any interview scoring or decisions.
|
|
|
77
77
|
## Linking rules
|
|
78
78
|
|
|
79
79
|
Use absolute paths everywhere: `[[People/Name]]`, `[[Organizations/Name]]`,
|
|
80
|
-
`[[Projects/Name]]`, `[[
|
|
80
|
+
`[[Projects/Name]]`, `[[Priorities/Priority Name]]`.
|
|
81
81
|
|
|
82
|
-
When meeting content references an existing
|
|
82
|
+
When meeting content references an existing Priority, follow the linking
|
|
83
83
|
rules in `extract-entities` Step 7c — update progress and add backlinks, but
|
|
84
|
-
**never** auto-create
|
|
84
|
+
**never** auto-create Priority notes.
|
|
@@ -25,11 +25,11 @@ before deciding whether to invest interview time.
|
|
|
25
25
|
- `@forwardimpact/pathway` CLI installed (`bunx fit-pathway --help`).
|
|
26
26
|
- Playwright for PDF output
|
|
27
27
|
(`bun install playwright && bunx playwright install chromium`).
|
|
28
|
-
- Candidate has a `brief.md` in `
|
|
28
|
+
- Candidate has a `brief.md` in `Knowledge/Candidates/{Name}/`.
|
|
29
29
|
|
|
30
30
|
## Inputs
|
|
31
31
|
|
|
32
|
-
- **Candidate name** — locates `
|
|
32
|
+
- **Candidate name** — locates `Knowledge/Candidates/{Name}/brief.md`.
|
|
33
33
|
- **Target role** — discipline, level, track (e.g.
|
|
34
34
|
`software_engineering J070 forward_deployed`). If not given, infer from the
|
|
35
35
|
candidate's `Req` field → Role file. Ask the user if it can't be inferred.
|
|
@@ -38,7 +38,7 @@ before deciding whether to invest interview time.
|
|
|
38
38
|
|
|
39
39
|
## Outputs
|
|
40
40
|
|
|
41
|
-
- `
|
|
41
|
+
- `Drafts/{Recipient}-{CandidateSurname}-Report.html` — the A4 one-pager.
|
|
42
42
|
- Optional PDF via `scripts/render-pdf.mjs`.
|
|
43
43
|
|
|
44
44
|
<do_confirm_checklist goal="Verify the report before delivering it">
|
|
@@ -62,16 +62,16 @@ before deciding whether to invest interview time.
|
|
|
62
62
|
Read whatever exists for the candidate:
|
|
63
63
|
|
|
64
64
|
```
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
69
|
```
|
|
70
70
|
|
|
71
71
|
If `screening.md` exists, treat its skill and behaviour ratings as the primary
|
|
72
72
|
source — they're already standard-calibrated. Otherwise map manually in Step 3.
|
|
73
73
|
|
|
74
|
-
Search the graph for surrounding context: `rg "{Candidate Name}"
|
|
74
|
+
Search the graph for surrounding context: `rg "{Candidate Name}" Knowledge/`.
|
|
75
75
|
|
|
76
76
|
### 2. Load the standard benchmark
|
|
77
77
|
|
|
@@ -119,7 +119,7 @@ preview overflows, cut content.
|
|
|
119
119
|
Save the completed HTML to:
|
|
120
120
|
|
|
121
121
|
```
|
|
122
|
-
|
|
122
|
+
Drafts/{Recipient}-{CandidateSurname}-Report.html
|
|
123
123
|
```
|
|
124
124
|
|
|
125
125
|
`{Recipient}` is the first name of the person the report is for.
|
|
@@ -22,7 +22,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
|
|
|
22
22
|
## Inputs
|
|
23
23
|
|
|
24
24
|
- User's description of the presentation
|
|
25
|
-
- `
|
|
25
|
+
- `Knowledge/` — optional context about company, product, team, projects
|
|
26
26
|
|
|
27
27
|
## Outputs
|
|
28
28
|
|
|
@@ -32,7 +32,7 @@ Run when the user asks to create a presentation, slide deck, or pitch deck.
|
|
|
32
32
|
|
|
33
33
|
## Workflow
|
|
34
34
|
|
|
35
|
-
1. Check `
|
|
35
|
+
1. Check `Knowledge/` for relevant context about the company, product, team,
|
|
36
36
|
etc.
|
|
37
37
|
2. Ensure Playwright is installed:
|
|
38
38
|
`bun install playwright && bunx playwright install chromium`
|
|
@@ -30,7 +30,7 @@ from a slide deck; or understand what a project deck is actually asking for.
|
|
|
30
30
|
## Outputs
|
|
31
31
|
|
|
32
32
|
- One markdown file per deck (or one combined file for related decks) written to
|
|
33
|
-
`
|
|
33
|
+
`Knowledge/Projects/{Project Name} - Engineering Brief.md`.
|
|
34
34
|
|
|
35
35
|
<do_confirm_checklist goal="Verify the brief is engineer-actionable before
|
|
36
36
|
delivering">
|
|
@@ -125,7 +125,7 @@ mismatches.
|
|
|
125
125
|
|
|
126
126
|
Use the structure in
|
|
127
127
|
[references/brief-template.md](references/brief-template.md). Save to
|
|
128
|
-
`
|
|
128
|
+
`Knowledge/Projects/{Project Name} - Engineering Brief.md`. For multiple related
|
|
129
129
|
decks, write one combined brief with shared dependencies.
|
|
130
130
|
|
|
131
131
|
### 9. Save and report
|
|
@@ -20,12 +20,12 @@ Run when the user asks to create, edit, review, or collaborate on a document.
|
|
|
20
20
|
## Inputs
|
|
21
21
|
|
|
22
22
|
- User's editing instructions
|
|
23
|
-
- `
|
|
23
|
+
- `Knowledge/` — existing notes and documents
|
|
24
24
|
- Document to edit (user-specified or searched)
|
|
25
25
|
|
|
26
26
|
## Outputs
|
|
27
27
|
|
|
28
|
-
- Created or modified documents in `
|
|
28
|
+
- Created or modified documents in `Knowledge/` or user-specified location
|
|
29
29
|
|
|
30
30
|
---
|
|
31
31
|
|
|
@@ -54,8 +54,8 @@ Follow their choice for the entire session.
|
|
|
54
54
|
Search thoroughly before saying a document doesn't exist:
|
|
55
55
|
|
|
56
56
|
```bash
|
|
57
|
-
rg -l -i "roadmap"
|
|
58
|
-
find
|
|
57
|
+
rg -l -i "roadmap" Knowledge/
|
|
58
|
+
find Knowledge/ -iname "*roadmap*" 2>/dev/null
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
**If found:** Read it and proceed. **If NOT found:** Ask "I couldn't find
|
|
@@ -63,7 +63,7 @@ find knowledge/ -iname "*roadmap*" 2>/dev/null
|
|
|
63
63
|
|
|
64
64
|
**Creating new documents:**
|
|
65
65
|
|
|
66
|
-
1. Ask: "Shall I create
|
|
66
|
+
1. Ask: "Shall I create Knowledge/[name].md?"
|
|
67
67
|
2. Create with just a title — don't pre-populate with structure
|
|
68
68
|
3. Ask: "What would you like in this?"
|
|
69
69
|
|
|
@@ -97,9 +97,9 @@ don't reorganize unless asked.
|
|
|
97
97
|
When the user mentions people, companies, or projects:
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
|
-
rg -l "Name"
|
|
101
|
-
cat "
|
|
102
|
-
cat "
|
|
100
|
+
rg -l "Name" Knowledge/
|
|
101
|
+
cat "Knowledge/People/Person.md"
|
|
102
|
+
cat "Knowledge/Organizations/Company.md"
|
|
103
103
|
```
|
|
104
104
|
|
|
105
105
|
Use `[[wiki-links]]` to connect to other notes. Only link to notes that exist.
|
|
@@ -23,18 +23,18 @@ submission, brief, or any multi-page PDF that is not a slide deck.
|
|
|
23
23
|
## Inputs
|
|
24
24
|
|
|
25
25
|
- User's description of the document
|
|
26
|
-
- `
|
|
26
|
+
- `Knowledge/` — optional context about company, product, team, projects
|
|
27
27
|
|
|
28
28
|
## Outputs
|
|
29
29
|
|
|
30
30
|
- An HTML file and a PDF rendered from it, placed where the user specifies
|
|
31
|
-
(default: `
|
|
31
|
+
(default: `Knowledge/Projects/`)
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
35
|
## Workflow
|
|
36
36
|
|
|
37
|
-
1. Check `
|
|
37
|
+
1. Check `Knowledge/` for relevant context about the company, product, team,
|
|
38
38
|
projects, or people mentioned.
|
|
39
39
|
2. Ensure Playwright is installed:
|
|
40
40
|
`bun install playwright && bunx playwright install chromium`
|
|
@@ -22,13 +22,13 @@ The user asks to draft, reply to, respond to, or send an email.
|
|
|
22
22
|
|
|
23
23
|
| Data | Location |
|
|
24
24
|
| --------------- | -------------------------------------------- |
|
|
25
|
-
| People | `
|
|
26
|
-
| Organizations | `
|
|
25
|
+
| People | `Knowledge/People/*.md` |
|
|
26
|
+
| Organizations | `Knowledge/Organizations/*.md` |
|
|
27
27
|
| Email threads | `~/.cache/fit/outpost/apple_mail/*.md` |
|
|
28
28
|
| Calendar events | `~/.cache/fit/outpost/apple_calendar/*.json` |
|
|
29
|
-
| Handled IDs | `
|
|
30
|
-
| Ignored IDs | `
|
|
31
|
-
| Draft files | `
|
|
29
|
+
| Handled IDs | `Drafts/handled` (one ID per line) |
|
|
30
|
+
| Ignored IDs | `Drafts/ignored` (one ID per line) |
|
|
31
|
+
| Draft files | `Drafts/{email_id}_draft.md` |
|
|
32
32
|
|
|
33
33
|
`handled` and `ignored` both exclude threads from `scan-emails.mjs`. Use
|
|
34
34
|
`handled` for resolved threads (sent here, replied manually, resolved via DM);
|
|
@@ -37,7 +37,7 @@ reply).
|
|
|
37
37
|
|
|
38
38
|
<do_confirm_checklist goal="Verify a draft is safe and ready before sending">
|
|
39
39
|
|
|
40
|
-
- [ ] Sender and organization were looked up in `
|
|
40
|
+
- [ ] Sender and organization were looked up in `Knowledge/` before drafting.
|
|
41
41
|
- [ ] Draft is a single email (not multiple variants) and matches the incoming
|
|
42
42
|
tone.
|
|
43
43
|
- [ ] Body has no sign-off / name / "Best" — Apple Mail signature handles it.
|
|
@@ -45,7 +45,7 @@ reply).
|
|
|
45
45
|
direct-to-candidate draft is flagged `⚠️ RECRUITER ONLY`.
|
|
46
46
|
- [ ] No sensitive personal data (health, politics, etc.) was included.
|
|
47
47
|
- [ ] User has explicitly approved the draft before any send.
|
|
48
|
-
- [ ] Send used `--draft <path>` so cleanup and `
|
|
48
|
+
- [ ] Send used `--draft <path>` so cleanup and `Drafts/handled` happen
|
|
49
49
|
automatically.
|
|
50
50
|
|
|
51
51
|
</do_confirm_checklist>
|
|
@@ -59,11 +59,11 @@ node scripts/scan-emails.mjs
|
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
Outputs `email_id<TAB>subject` for unprocessed emails (those not in
|
|
62
|
-
`
|
|
62
|
+
`Drafts/handled` or `Drafts/ignored`).
|
|
63
63
|
|
|
64
64
|
### 2. Classify
|
|
65
65
|
|
|
66
|
-
**Ignore** (append ID to `
|
|
66
|
+
**Ignore** (append ID to `Drafts/ignored`): newsletters, marketing, automated
|
|
67
67
|
notifications, spam, outbound with no reply.
|
|
68
68
|
|
|
69
69
|
**Draft a response**: meeting requests, personal mail from known contacts,
|
|
@@ -73,12 +73,12 @@ Be conservative with ignore — when in doubt, draft.
|
|
|
73
73
|
|
|
74
74
|
### 3. Gather context
|
|
75
75
|
|
|
76
|
-
Before drafting, look up the sender and organization in `
|
|
76
|
+
Before drafting, look up the sender and organization in `Knowledge/`:
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
rg -l "sender_name"
|
|
80
|
-
cat "
|
|
81
|
-
cat "
|
|
79
|
+
rg -l "sender_name" Knowledge/
|
|
80
|
+
cat "Knowledge/People/Sender Name.md"
|
|
81
|
+
cat "Knowledge/Organizations/Company Name.md"
|
|
82
82
|
```
|
|
83
83
|
|
|
84
84
|
For scheduling emails, also read the relevant calendar event:
|
|
@@ -93,7 +93,7 @@ unclear or the person has multiple contexts, **ask** rather than guess.
|
|
|
93
93
|
|
|
94
94
|
### 4. Write the draft
|
|
95
95
|
|
|
96
|
-
Save to `
|
|
96
|
+
Save to `Drafts/{email_id}_draft.md` using the template in
|
|
97
97
|
[references/template.md](references/template.md). Reference past interactions
|
|
98
98
|
naturally; for scheduling, propose specific times from calendar availability.
|
|
99
99
|
|
|
@@ -101,7 +101,7 @@ naturally; for scheduling, propose specific times from calendar availability.
|
|
|
101
101
|
|
|
102
102
|
Candidates **must never** be copied on internal threads about them.
|
|
103
103
|
|
|
104
|
-
- Identify the candidate from the thread and `
|
|
104
|
+
- Identify the candidate from the thread and `Knowledge/Candidates/`.
|
|
105
105
|
- Strip the candidate from To/CC; draft to internal stakeholders only.
|
|
106
106
|
- Direct-to-candidate emails carry the warning header
|
|
107
107
|
`⚠️ RECRUITER ONLY — This email goes directly to the candidate.`
|
|
@@ -124,18 +124,18 @@ node scripts/send-email.mjs \
|
|
|
124
124
|
--cc "other@example.com" \
|
|
125
125
|
--subject "Re: Subject" \
|
|
126
126
|
--body "Plain text body" \
|
|
127
|
-
--draft "
|
|
127
|
+
--draft "Drafts/12345_draft.md"
|
|
128
128
|
```
|
|
129
129
|
|
|
130
130
|
Required: `--to`, `--subject`, `--body` (plain text). Optional: `--cc`, `--bcc`,
|
|
131
131
|
`--draft`. With `--draft`, the draft file is deleted and the email ID is
|
|
132
|
-
appended to `
|
|
132
|
+
appended to `Drafts/handled` automatically.
|
|
133
133
|
|
|
134
134
|
### 8. Mark handled without sending
|
|
135
135
|
|
|
136
136
|
When a thread is resolved through other channels:
|
|
137
137
|
|
|
138
138
|
```bash
|
|
139
|
-
echo "$EMAIL_ID" >>
|
|
140
|
-
rm -f "
|
|
139
|
+
echo "$EMAIL_ID" >> Drafts/handled
|
|
140
|
+
rm -f "Drafts/${EMAIL_ID}_draft.md"
|
|
141
141
|
```
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Scan for unprocessed emails and output their IDs and subjects.
|
|
4
4
|
*
|
|
5
5
|
* Checks ~/.cache/fit/outpost/apple_mail/ for email thread markdown files not
|
|
6
|
-
* yet listed in
|
|
6
|
+
* yet listed in Drafts/handled or Drafts/ignored. Outputs one tab-separated
|
|
7
7
|
* line per unprocessed thread: email_id<TAB>subject. Used by the draft-emails
|
|
8
8
|
* skill to identify threads that need a reply.
|
|
9
9
|
*/
|
|
@@ -17,7 +17,7 @@ const HELP = `scan-emails — list unprocessed email threads
|
|
|
17
17
|
Usage: node scripts/scan-emails.mjs [-h|--help]
|
|
18
18
|
|
|
19
19
|
Scans ~/.cache/fit/outpost/apple_mail/ for .md thread files not yet
|
|
20
|
-
recorded in
|
|
20
|
+
recorded in Drafts/handled or Drafts/ignored. Outputs one line per
|
|
21
21
|
unprocessed thread as: email_id<TAB>subject`;
|
|
22
22
|
|
|
23
23
|
if (process.argv.includes("-h") || process.argv.includes("--help")) {
|
|
@@ -49,8 +49,8 @@ function extractSubject(filePath) {
|
|
|
49
49
|
function main() {
|
|
50
50
|
if (!existsSync(MAIL_DIR)) return;
|
|
51
51
|
|
|
52
|
-
const handled = loadIdSet("
|
|
53
|
-
const ignored = loadIdSet("
|
|
52
|
+
const handled = loadIdSet("Drafts/handled");
|
|
53
|
+
const ignored = loadIdSet("Drafts/ignored");
|
|
54
54
|
|
|
55
55
|
for (const name of readdirSync(MAIL_DIR).sort()) {
|
|
56
56
|
if (!name.endsWith(".md")) continue;
|
|
@@ -30,7 +30,7 @@ Options:
|
|
|
30
30
|
--bcc <addrs> Comma-separated BCC recipients
|
|
31
31
|
--subject <subj> Email subject line (required)
|
|
32
32
|
--body <text> Plain-text email body (required)
|
|
33
|
-
--draft <path> Draft file — deleted after send, ID appended to
|
|
33
|
+
--draft <path> Draft file — deleted after send, ID appended to Drafts/handled
|
|
34
34
|
-h, --help Show this help message and exit
|
|
35
35
|
|
|
36
36
|
Mail.app must be running. No signature or sign-off needed — Apple Mail appends it.`;
|
|
@@ -113,7 +113,7 @@ function handleDraftCleanup(draft) {
|
|
|
113
113
|
const draftBasename = basename(draft, ".md");
|
|
114
114
|
const emailId = draftBasename.replace(/_draft$/, "");
|
|
115
115
|
if (emailId) {
|
|
116
|
-
appendFileSync("
|
|
116
|
+
appendFileSync("Drafts/handled", emailId + "\n");
|
|
117
117
|
console.log(`Marked as handled: ${emailId}`);
|
|
118
118
|
}
|
|
119
119
|
}
|