@forwardimpact/outpost 3.3.4 → 3.5.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 +2 -4
- package/src/agent-path.js +42 -0
- package/src/agent-runner.js +60 -17
- package/src/kb-manager.js +5 -7
- package/src/outpost.js +43 -1
- package/src/posture.js +77 -0
- package/src/socket-server.js +15 -6
- package/src/spawn-env.js +62 -0
- package/src/state-manager.js +17 -2
- 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/settings.json +4 -0
- 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
|
@@ -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
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: extract-entities
|
|
3
|
-
description: Process synced email/calendar files from ~/.cache/fit/outpost/ and ad-hoc document files (e.g. from ~/Desktop/ or ~/Downloads/) to extract structured knowledge into
|
|
3
|
+
description: Process synced email/calendar files from ~/.cache/fit/outpost/ and ad-hoc document files (e.g. from ~/Desktop/ or ~/Downloads/) to extract structured knowledge into Knowledge/ as Obsidian-compatible markdown notes. Use on a schedule, when the user asks to process/extract entities, or when invoked by another skill (e.g. organize-files). Builds the core knowledge graph from raw data.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Extract Entities
|
|
7
7
|
|
|
8
8
|
Process synced email and calendar files from `~/.cache/fit/outpost/`, plus
|
|
9
9
|
ad-hoc documents passed by other skills, into Obsidian-compatible markdown notes
|
|
10
|
-
under `
|
|
10
|
+
under `Knowledge/`. The core knowledge-graph builder.
|
|
11
11
|
|
|
12
12
|
## Trigger
|
|
13
13
|
|
|
@@ -35,13 +35,13 @@ under `knowledge/`. The core knowledge-graph builder.
|
|
|
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
|
+
- `Knowledge/Conditions/` — created when cross-cutting patterns are detected, or
|
|
43
43
|
updated.
|
|
44
|
-
- `
|
|
44
|
+
- `Knowledge/Roles/`, `Knowledge/Candidates/*/brief.md` — enriched with inferred
|
|
45
45
|
metadata.
|
|
46
46
|
- `~/.cache/fit/outpost/state/graph_processed` — updated.
|
|
47
47
|
|
|
@@ -55,10 +55,10 @@ well-grounded notes">
|
|
|
55
55
|
a substantive `## Summary`, calendar-only attendees routed to Organization
|
|
56
56
|
`## Contacts`.
|
|
57
57
|
- [ ] All links use absolute paths `[[Folder/Name]]`; bidirectional links
|
|
58
|
-
consistent (incl.
|
|
58
|
+
consistent (incl. Project ↔ Priority).
|
|
59
59
|
- [ ] Summaries describe relationship, not communication method; key facts are
|
|
60
60
|
substantive; open items are commitments.
|
|
61
|
-
- [ ] State changes logged with `[Field → value]`; no
|
|
61
|
+
- [ ] State changes logged with `[Field → value]`; no Priority entities
|
|
62
62
|
auto-created.
|
|
63
63
|
- [ ] Conditions created only when ≥ 3 entities reference the same cross-cutting
|
|
64
64
|
state; resolution detected when evidence supports.
|
|
@@ -89,13 +89,13 @@ instead of scanning `~/.cache/fit/outpost/` — still check each against
|
|
|
89
89
|
### 1. Build the knowledge index
|
|
90
90
|
|
|
91
91
|
```bash
|
|
92
|
-
find
|
|
93
|
-
|
|
94
|
-
|
|
92
|
+
find Knowledge/People Knowledge/Organizations Knowledge/Projects \
|
|
93
|
+
Knowledge/Topics Knowledge/Priorities \
|
|
94
|
+
Knowledge/Conditions -name "*.md" 2>/dev/null
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
For each note, `head -20` to capture key fields. Build a mental index of People,
|
|
98
|
-
Organizations, Projects,
|
|
98
|
+
Organizations, Projects, Priorities, Topics by name, email, organization,
|
|
99
99
|
role, status, and aliases.
|
|
100
100
|
|
|
101
101
|
### 2. Classify the source
|
|
@@ -123,7 +123,7 @@ Collect every name variant per
|
|
|
123
123
|
For each variant, search the knowledge index. Apply the
|
|
124
124
|
[matching table](references/resolution.md#matching) and the
|
|
125
125
|
[disambiguation priority](references/resolution.md#disambiguation-priority).
|
|
126
|
-
|
|
126
|
+
Priorities are
|
|
127
127
|
[never auto-created](references/resolution.md#never-auto-create) — link to
|
|
128
128
|
existing entries only.
|
|
129
129
|
|
|
@@ -150,9 +150,8 @@ filler or meta-commentary.
|
|
|
150
150
|
- **Recruitment** (Req-number detection, hiring-manager / recruiter /
|
|
151
151
|
domain-lead inference):
|
|
152
152
|
[references/recruitment.md](references/recruitment.md).
|
|
153
|
-
- **
|
|
154
|
-
[references/links.md](references/links.md#
|
|
155
|
-
[Priorities](references/links.md#priorities-step-7c). **Never auto-create.**
|
|
153
|
+
- **Priority links** (Step 7c): rules in
|
|
154
|
+
[references/links.md](references/links.md#priorities-step-7c). **Never auto-create.**
|
|
156
155
|
- **Conditions** (cross-cutting states affecting ≥ 3 entities):
|
|
157
156
|
[references/conditions.md](references/conditions.md).
|
|
158
157
|
|
|
@@ -7,8 +7,8 @@ index.
|
|
|
7
7
|
- [templates-people-orgs.md](templates-people-orgs.md) — People, Organizations.
|
|
8
8
|
- [templates-projects-topics.md](templates-projects-topics.md) — Projects,
|
|
9
9
|
Topics.
|
|
10
|
-
- [templates-
|
|
11
|
-
|
|
10
|
+
- [templates-priorities.md](templates-priorities.md) — Priorities.
|
|
11
|
+
**Never auto-created** by `extract-entities` or `anarlog-process`
|
|
12
12
|
— set by the user.
|
|
13
13
|
- [templates-conditions.md](templates-conditions.md) — Conditions (time-bound
|
|
14
14
|
cross-cutting states).
|
|
@@ -20,7 +20,7 @@ same constraint or state, suspect a Condition.
|
|
|
20
20
|
|
|
21
21
|
## Creating a Condition
|
|
22
22
|
|
|
23
|
-
1. Check existing: `ls
|
|
23
|
+
1. Check existing: `ls Knowledge/Conditions/ 2>/dev/null`.
|
|
24
24
|
2. **No match:** create a new Condition note using
|
|
25
25
|
[templates-conditions.md](templates-conditions.md). Name descriptively
|
|
26
26
|
("Hiring Freeze Q2", "Division Reorg").
|
|
@@ -31,8 +31,8 @@ same constraint or state, suspect a Condition.
|
|
|
31
31
|
|
|
32
32
|
When a Condition is created or updated:
|
|
33
33
|
|
|
34
|
-
1. Add `[[Conditions/{Condition}]]` to the `##
|
|
35
|
-
|
|
34
|
+
1. Add `[[Conditions/{Condition}]]` to the `## Affects` section of affected
|
|
35
|
+
Priorities.
|
|
36
36
|
2. Add `[Status → on hold]` state changes to affected Projects where
|
|
37
37
|
appropriate.
|
|
38
38
|
3. Add a `## Blockers` entry to affected Role files if recruitment is frozen.
|
|
@@ -45,7 +45,7 @@ Source content indicates the Condition has ended: "approved", "freeze lifted",
|
|
|
45
45
|
"reorg complete", "back on track".
|
|
46
46
|
|
|
47
47
|
- Set `**Status:** resolved`, `**Resolved:** {date}`.
|
|
48
|
-
- Remove `[[Conditions/{Condition}]]` from affected
|
|
48
|
+
- Remove `[[Conditions/{Condition}]]` from affected Priority `## Affects`.
|
|
49
49
|
- Log with `[Status → resolved]`.
|
|
50
50
|
|
|
51
51
|
## Conservatism
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bidirectional Links
|
|
2
2
|
|
|
3
|
-
Reference for `extract-entities` Step 10 and Step 7c (
|
|
3
|
+
Reference for `extract-entities` Step 10 and Step 7c (Priorities).
|
|
4
4
|
|
|
5
5
|
## Bidirectional link rules
|
|
6
6
|
|
|
@@ -11,28 +11,13 @@ After writing, verify each link goes both ways.
|
|
|
11
11
|
| Person → Organization | Organization → Person (in People section) |
|
|
12
12
|
| Person → Project | Project → Person (in People section) |
|
|
13
13
|
| Project → Organization | Organization → Project (in Projects section) |
|
|
14
|
-
| Project → Goal | Goal → Project (in Projects section) |
|
|
15
|
-
| Goal → Priority | Priority → Goal (in Goals section) |
|
|
16
14
|
| Project → Priority | Priority → Project (in Projects section) |
|
|
17
|
-
| Condition → Goal | Goal → Condition (in Blockers section) |
|
|
18
15
|
| Condition → Project | Project → Condition (in Related section) |
|
|
19
16
|
| Condition → Role | Role → Condition (notes or status field) |
|
|
20
17
|
|
|
21
18
|
Use absolute paths everywhere: `[[People/Sarah Chen]]`,
|
|
22
19
|
`[[Organizations/Acme Corp]]`, `[[Projects/Acme Integration]]`,
|
|
23
|
-
`[[
|
|
24
|
-
`[[Conditions/Condition Name]]`.
|
|
25
|
-
|
|
26
|
-
## Goals (Step 7c)
|
|
27
|
-
|
|
28
|
-
When source content references an existing `knowledge/Goals/*.md`:
|
|
29
|
-
|
|
30
|
-
- Add a `[[Goals/{Goal}]]` link to the relevant Project or Topic activity entry.
|
|
31
|
-
- Add a progress entry to the Goal's `## Progress` section.
|
|
32
|
-
- If evidence suggests a status change ("we won't hit the Q3 target"), update
|
|
33
|
-
`**Status:**` and log `[Status → value]`.
|
|
34
|
-
|
|
35
|
-
**Never auto-create Goals.**
|
|
20
|
+
`[[Priorities/Priority Name]]`, `[[Conditions/Condition Name]]`.
|
|
36
21
|
|
|
37
22
|
## Priorities (Step 7c)
|
|
38
23
|
|
|
@@ -44,5 +29,5 @@ Match source themes against priority names and descriptions.
|
|
|
44
29
|
serves it.
|
|
45
30
|
|
|
46
31
|
**Never auto-create Priorities.** Don't over-link — a project that already links
|
|
47
|
-
to a
|
|
32
|
+
to a Priority through a related Topic doesn't need a redundant direct Priority
|
|
48
33
|
link.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Recruitment Inference
|
|
2
2
|
|
|
3
|
-
Reference for `extract-entities` Step 7b. Enrich `
|
|
4
|
-
`
|
|
3
|
+
Reference for `extract-entities` Step 7b. Enrich `Knowledge/Roles/` and
|
|
4
|
+
`Knowledge/Candidates/` with metadata that no single source carries.
|
|
5
5
|
|
|
6
6
|
## Requisition number detection
|
|
7
7
|
|
|
8
8
|
Scan email subjects and bodies for requisition numbers (e.g. 7-digit Workday
|
|
9
9
|
IDs).
|
|
10
10
|
|
|
11
|
-
1. `ls
|
|
11
|
+
1. `ls Knowledge/Roles/ | grep "{req_number}"` — does a Role file exist?
|
|
12
12
|
2. **No file:** create a stub using the Role-stub template in `req-track` Step
|
|
13
|
-
0b. Search `rg "{req_number}"
|
|
13
|
+
0b. Search `rg "{req_number}" Knowledge/` for context to enrich it.
|
|
14
14
|
3. **File exists:** check whether the email provides new metadata (hiring
|
|
15
15
|
manager, recruiter, locations) and update the Role file.
|
|
16
16
|
|
|
@@ -20,11 +20,11 @@ When a calendar event title matches an interview pattern — "Interview",
|
|
|
20
20
|
"Screening", "Screen", "Decomposition", "Panel", "Technical Assessment",
|
|
21
21
|
"Candidate" — combined with a person name:
|
|
22
22
|
|
|
23
|
-
1. Cross-reference the candidate against `
|
|
23
|
+
1. Cross-reference the candidate against `Knowledge/Candidates/`.
|
|
24
24
|
2. Extract the **organizer**. If the organizer isn't the user (per
|
|
25
25
|
`~/.cache/fit/outpost/state/identity.md`),
|
|
26
26
|
they are likely the hiring manager.
|
|
27
|
-
3. Confirm: look up the organizer in `
|
|
27
|
+
3. Confirm: look up the organizer in `Knowledge/People/` for a manager/HM role
|
|
28
28
|
indication.
|
|
29
29
|
4. Check the candidate's `brief.md` for a `Req` field; if known, set the
|
|
30
30
|
matching Role file's `Hiring manager` (only if currently `—`).
|
|
@@ -33,9 +33,9 @@ When a calendar event title matches an interview pattern — "Interview",
|
|
|
33
33
|
## Recruiter — email-thread inference
|
|
34
34
|
|
|
35
35
|
When a thread references candidates (name match against
|
|
36
|
-
`
|
|
36
|
+
`Knowledge/Candidates/`):
|
|
37
37
|
|
|
38
|
-
1. Cross-reference To/CC against `
|
|
38
|
+
1. Cross-reference To/CC against `Knowledge/People/`.
|
|
39
39
|
2. If a CC'd person's note mentions "recruiter", "talent acquisition", or a
|
|
40
40
|
similar role, they are likely the internal recruiter.
|
|
41
41
|
3. Update the candidate's `brief.md` recruiter field and the matching Role file
|
|
@@ -11,10 +11,8 @@ Extract every way each entity is referenced.
|
|
|
11
11
|
- **Organizations:** full names, short names, abbreviations, email domains.
|
|
12
12
|
- **Projects:** explicit names, descriptive references ("the pilot", "the
|
|
13
13
|
deal").
|
|
14
|
-
- **
|
|
15
|
-
match `
|
|
16
|
-
- **Priorities:** references to strategic directions that match
|
|
17
|
-
`knowledge/Priorities/` entries.
|
|
14
|
+
- **Priorities:** references to strategic directions, time-bound targets, or
|
|
15
|
+
measurable outcomes that match `Knowledge/Priorities/` entries.
|
|
18
16
|
|
|
19
17
|
## Matching
|
|
20
18
|
|
|
@@ -82,5 +80,5 @@ Format: `**Role:** Product Lead (inferred from evaluation discussions)`.
|
|
|
82
80
|
|
|
83
81
|
## Never auto-create
|
|
84
82
|
|
|
85
|
-
`
|
|
83
|
+
`Priorities/`. Link to existing entries when referenced; update
|
|
86
84
|
progress / backlinks; never create new ones from extracted content.
|
|
@@ -40,7 +40,7 @@ write a placeholder profile; see the
|
|
|
40
40
|
|
|
41
41
|
## Process — update existing notes only
|
|
42
42
|
|
|
43
|
-
- Emails from people already in `
|
|
43
|
+
- Emails from people already in `Knowledge/People/`.
|
|
44
44
|
- Emails referencing existing projects or organizations.
|
|
45
45
|
|
|
46
46
|
## Process — can create new notes
|
|
@@ -16,8 +16,8 @@ are detected, or manually created by the user. Lifecycle: active → resolved.
|
|
|
16
16
|
**Resolution signal:** {What would indicate this condition has ended}
|
|
17
17
|
|
|
18
18
|
## Affects
|
|
19
|
-
{
|
|
20
|
-
- [[
|
|
19
|
+
{Priorities, Projects, Roles, and People impacted by this condition}
|
|
20
|
+
- [[Priorities/{Priority}]] — {how it's affected}
|
|
21
21
|
- [[Projects/{Project}]] — {how it's affected}
|
|
22
22
|
- [[Roles/{Role}]] — {how it's affected}
|
|
23
23
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Priority Templates
|
|
2
|
+
|
|
3
|
+
Priorities are **never auto-created** by `extract-entities`. They are set
|
|
4
|
+
deliberately by the user. This template is for manual creation only —
|
|
5
|
+
`extract-entities` and `anarlog-process` only **link to** and **update progress
|
|
6
|
+
on** existing notes.
|
|
7
|
+
|
|
8
|
+
## Priorities
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
# {Priority Name}
|
|
12
|
+
|
|
13
|
+
## About
|
|
14
|
+
{2-3 sentences: what this strategic direction means and why it matters}
|
|
15
|
+
|
|
16
|
+
**Status:** {active|paused|retired}
|
|
17
|
+
**Owner:** [[People/{Person}]]
|
|
18
|
+
**Set:** {YYYY-MM-DD}
|
|
19
|
+
|
|
20
|
+
## What this means
|
|
21
|
+
{Bullet list of concrete implications — what does pursuing this priority look like?}
|
|
22
|
+
|
|
23
|
+
## Actions
|
|
24
|
+
{Concrete, time-bound actions that ladder to this priority. Targets live inline
|
|
25
|
+
here — there is no separate Goals entity.}
|
|
26
|
+
|
|
27
|
+
## Projects
|
|
28
|
+
- [[Projects/{Project}]] — {relationship}
|
|
29
|
+
|
|
30
|
+
## Key facts
|
|
31
|
+
{substantive facts only — leave empty if none}
|
|
32
|
+
```
|
|
@@ -22,13 +22,12 @@ meetings.
|
|
|
22
22
|
## Inputs
|
|
23
23
|
|
|
24
24
|
- `~/.cache/fit/outpost/apple_calendar/*.json` — calendar events
|
|
25
|
-
- `
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
28
|
-
- `
|
|
29
|
-
- `
|
|
30
|
-
- `
|
|
31
|
-
- `knowledge/Roles/*.md` — role/requisition context (for interview meetings)
|
|
25
|
+
- `Knowledge/People/*.md` — attendee context
|
|
26
|
+
- `Knowledge/Organizations/*.md` — company context
|
|
27
|
+
- `Knowledge/Projects/*.md` — project context
|
|
28
|
+
- `Knowledge/Priorities/*.md` — active priorities and strategic context for framing
|
|
29
|
+
- `Knowledge/Candidates/*/brief.md` — candidate context (for interview meetings)
|
|
30
|
+
- `Knowledge/Roles/*.md` — role/requisition context (for interview meetings)
|
|
32
31
|
|
|
33
32
|
## Outputs
|
|
34
33
|
|
|
@@ -44,8 +43,8 @@ knowledge base.**
|
|
|
44
43
|
When the user asks to prep for a meeting:
|
|
45
44
|
|
|
46
45
|
1. **STOP** — Do not create a generic brief
|
|
47
|
-
2. **SEARCH** — Look up each attendee: `rg -l "Attendee Name"
|
|
48
|
-
3. **READ** — Read their notes: `cat "
|
|
46
|
+
2. **SEARCH** — Look up each attendee: `rg -l "Attendee Name" Knowledge/`
|
|
47
|
+
3. **READ** — Read their notes: `cat "Knowledge/People/Attendee Name.md"`
|
|
49
48
|
4. **UNDERSTAND** — Extract role, organization, history, open items
|
|
50
49
|
5. **THEN BRIEF** — Create the meeting brief using this context
|
|
51
50
|
|
|
@@ -92,18 +91,18 @@ Extract: summary, start/end time, attendees (names and emails), description.
|
|
|
92
91
|
For each attendee:
|
|
93
92
|
|
|
94
93
|
```bash
|
|
95
|
-
rg -l "attendee_name"
|
|
96
|
-
rg -l "attendee_email"
|
|
97
|
-
cat "
|
|
98
|
-
cat "
|
|
99
|
-
rg -l "attendee_name"
|
|
94
|
+
rg -l "attendee_name" Knowledge/People/
|
|
95
|
+
rg -l "attendee_email" Knowledge/People/
|
|
96
|
+
cat "Knowledge/People/Attendee Name.md"
|
|
97
|
+
cat "Knowledge/Organizations/Their Company.md"
|
|
98
|
+
rg -l "attendee_name" Knowledge/Projects/
|
|
100
99
|
```
|
|
101
100
|
|
|
102
101
|
Extract: role/title, company, key facts, previous interactions, open items.
|
|
103
102
|
|
|
104
|
-
Also check `
|
|
103
|
+
Also check `Knowledge/Priorities/` for context relevant
|
|
105
104
|
to the meeting topic — e.g. if the meeting is about hiring, surface the relevant
|
|
106
|
-
hiring
|
|
105
|
+
hiring Priority's status and progress.
|
|
107
106
|
|
|
108
107
|
### Step 4: Create Meeting Brief
|
|
109
108
|
|
|
@@ -141,11 +140,11 @@ Suggested Talking Points
|
|
|
141
140
|
### Interview Meeting Context
|
|
142
141
|
|
|
143
142
|
When preparing for interview meetings (title contains "Interview", "Screening",
|
|
144
|
-
"Decomposition", "Panel", or a candidate name from `
|
|
143
|
+
"Decomposition", "Panel", or a candidate name from `Knowledge/Candidates/`):
|
|
145
144
|
|
|
146
|
-
1. **Read the candidate brief:** `
|
|
145
|
+
1. **Read the candidate brief:** `Knowledge/Candidates/{Name}/brief.md`
|
|
147
146
|
2. **Read the Role file:** Look up the `Req` field and read the corresponding
|
|
148
|
-
`
|
|
147
|
+
`Knowledge/Roles/*.md` file.
|
|
149
148
|
3. **Include in the briefing:**
|
|
150
149
|
- Candidate's current status, skills, and screening recommendation
|
|
151
150
|
- Role context: hiring manager, domain lead, remaining positions
|