@forwardimpact/outpost 3.12.0 → 3.13.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/README.md +2 -2
- package/bin/fit-outpost.js +3 -2
- package/package.json +6 -5
- package/src/agent-path.js +10 -6
- package/src/agent-runner.js +28 -24
- package/src/index.js +2 -3
- package/src/kb-manager.js +75 -20
- package/src/kb-validator.js +762 -0
- package/src/outpost.js +108 -39
- package/src/posture.js +3 -3
- package/src/privilege.js +11 -11
- package/src/scheduler.js +14 -12
- package/src/socket-server.js +19 -18
- package/src/spawn-env.js +7 -6
- package/src/state-manager.js +2 -2
- package/templates/.claude/agents/chief-of-staff.md +32 -24
- package/templates/.claude/agents/concierge.md +26 -17
- package/templates/.claude/agents/head-hunter.md +34 -26
- package/templates/.claude/agents/librarian.md +26 -18
- package/templates/.claude/agents/postman.md +26 -18
- package/templates/.claude/agents/recruiter.md +38 -27
- package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
- package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
- package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
- package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
- package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
- package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
- package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
- package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
- package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
- package/templates/.claude/skills/candidate-report/references/report.css +4 -4
- package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
- package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
- package/templates/.claude/skills/changelog/SKILL.md +122 -67
- package/templates/.claude/skills/deck-create/SKILL.md +90 -32
- package/templates/.claude/skills/deck-create/references/slide.css +4 -4
- package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/deck-review/SKILL.md +63 -58
- package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
- package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
- package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
- package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
- package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
- package/templates/.claude/skills/doc-create/SKILL.md +27 -23
- package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
- package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
- package/templates/.claude/skills/draft-emails/references/template.md +2 -2
- package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
- package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
- package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
- package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
- package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
- package/templates/.claude/skills/extract-entities/references/content.md +10 -9
- package/templates/.claude/skills/extract-entities/references/links.md +37 -13
- package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
- package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
- package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
- package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
- package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
- package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
- package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
- package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
- package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
- package/templates/.claude/skills/organize-files/SKILL.md +27 -22
- package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
- package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
- package/templates/.claude/skills/person-identify/SKILL.md +77 -27
- package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
- package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
- package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
- package/templates/.claude/skills/req-assess/SKILL.md +44 -36
- package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
- package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
- package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
- package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
- package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
- package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
- package/templates/.claude/skills/req-decide/SKILL.md +52 -41
- package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
- package/templates/.claude/skills/req-decide/references/template.md +2 -2
- package/templates/.claude/skills/req-forget/SKILL.md +58 -39
- package/templates/.claude/skills/req-forget/references/classify.md +15 -13
- package/templates/.claude/skills/req-forget/references/locations.md +27 -22
- package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
- package/templates/.claude/skills/req-scan/SKILL.md +27 -25
- package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
- package/templates/.claude/skills/req-scan/references/filters.md +13 -13
- package/templates/.claude/skills/req-scan/references/sources.md +7 -7
- package/templates/.claude/skills/req-scan/references/state.md +1 -1
- package/templates/.claude/skills/req-scan/references/template.md +11 -1
- package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
- package/templates/.claude/skills/req-screen/SKILL.md +96 -50
- package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
- package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
- package/templates/.claude/skills/req-screen/references/template.md +29 -17
- package/templates/.claude/skills/req-track/SKILL.md +76 -76
- package/templates/.claude/skills/req-track/references/fields.md +31 -27
- package/templates/.claude/skills/req-track/references/overlays.md +42 -0
- package/templates/.claude/skills/req-track/references/signals.md +12 -12
- package/templates/.claude/skills/req-track/references/statuses.md +3 -2
- package/templates/.claude/skills/req-track/references/templates.md +28 -27
- package/templates/.claude/skills/req-workday/SKILL.md +69 -40
- package/templates/.claude/skills/req-workday/references/brief.md +81 -0
- package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
- package/templates/.claude/skills/req-workday/references/templates.md +11 -78
- package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
- package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
- package/templates/.claude/skills/send-chat/SKILL.md +58 -54
- package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -19
- package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
- package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
- package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
- package/templates/.claude/skills/sync-apple-mail/SKILL.md +20 -14
- package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
- package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
- package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
- package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
- package/templates/.claude/skills/sync-teams/SKILL.md +46 -43
- package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
- package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
- package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
- package/templates/.claude/skills/upstream-instructions/SKILL.md +43 -41
- package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
- package/templates/CLAUDE.md +97 -85
- package/templates/MIGRATION.md +359 -0
- package/templates/registry.yaml +25 -0
- package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
- package/templates/.claude/skills/anarlog-trim/SKILL.md +0 -183
|
@@ -4,17 +4,21 @@ description: >
|
|
|
4
4
|
Process GDPR Article 17 data erasure requests. Finds and removes all personal
|
|
5
5
|
data related to a named individual from the knowledge base, cached data, and
|
|
6
6
|
agent state files. Use when the user receives a right-to-be-forgotten
|
|
7
|
-
request, asks to delete all data about a person, or
|
|
7
|
+
request, asks to delete all data about a person, or must comply with a
|
|
8
8
|
data erasure obligation.
|
|
9
9
|
compatibility: Requires macOS filesystem access
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
# Right to Be Forgotten
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
Write tier: `2-Confidential` (erasure record; sweep every tier present)
|
|
15
|
+
Frontmatter: erasure
|
|
16
|
+
|
|
17
|
+
Process data erasure requests under GDPR Article 17. Work from the person's
|
|
18
|
+
name and every recorded alias. Sweep every tier present, the owner's personal
|
|
19
|
+
surfaces (`0-Draft/`, `Briefings/`), the cached synced data, and the agent
|
|
20
|
+
state files. Produces an **erasure report** that records what you found,
|
|
21
|
+
deleted, and redacted. The report is the compliance audit trail.
|
|
18
22
|
|
|
19
23
|
## Trigger
|
|
20
24
|
|
|
@@ -37,22 +41,24 @@ what was found, deleted, and redacted — the compliance audit trail.
|
|
|
37
41
|
|
|
38
42
|
## Outputs
|
|
39
43
|
|
|
40
|
-
- `
|
|
41
|
-
- Deleted files and redacted references across
|
|
44
|
+
- `2-Confidential/Erasure/{Name}--{YYYY-MM-DD}.md` — erasure report.
|
|
45
|
+
- Deleted files and redacted references across every tier.
|
|
42
46
|
|
|
43
47
|
<do_confirm_checklist goal="Verify erasure is complete and the audit trail is
|
|
44
48
|
sound">
|
|
45
49
|
|
|
46
|
-
- [ ]
|
|
47
|
-
- [ ]
|
|
48
|
-
|
|
49
|
-
- [ ]
|
|
50
|
-
- [ ]
|
|
51
|
-
- [ ]
|
|
52
|
-
- [ ]
|
|
53
|
-
- [ ]
|
|
54
|
-
actions taken.
|
|
55
|
-
- [ ]
|
|
50
|
+
- [ ] Get the user's confirmation before any deletion.
|
|
51
|
+
- [ ] Run every discovery recipe for the name and each alias. Cover every tier
|
|
52
|
+
present, `Briefings/`, cache, and state in the inventory.
|
|
53
|
+
- [ ] Delete all dedicated files and directories.
|
|
54
|
+
- [ ] Redact all mentions and backlinks from other notes.
|
|
55
|
+
- [ ] Handle cached email threads, attachments, and calendar entries.
|
|
56
|
+
- [ ] Clean the agent state and `graph_processed`.
|
|
57
|
+
- [ ] Save the erasure report. Keep **no** personal data in it beyond the name
|
|
58
|
+
and the actions taken.
|
|
59
|
+
- [ ] Run a final `rg` search. Confirm the erasure report is the only match.
|
|
60
|
+
- [ ] Run `npx fit-outpost validate` on the KB root. Fix the dangles the
|
|
61
|
+
removal created.
|
|
56
62
|
|
|
57
63
|
</do_confirm_checklist>
|
|
58
64
|
|
|
@@ -66,18 +72,21 @@ State to the user:
|
|
|
66
72
|
>
|
|
67
73
|
> This will permanently delete all personal data related to {Name} from:
|
|
68
74
|
>
|
|
69
|
-
> -
|
|
75
|
+
> - Notes in every tier (People, Candidates, Organizations mentions)
|
|
76
|
+
> - Personal surfaces (`0-Draft/`, `Briefings/`)
|
|
70
77
|
> - Cached email threads and attachments
|
|
71
78
|
> - Agent state and triage files
|
|
72
79
|
>
|
|
73
|
-
>
|
|
80
|
+
> You cannot undo this action. Proceed?
|
|
74
81
|
|
|
75
|
-
**Wait for explicit confirmation before
|
|
82
|
+
**Wait for explicit confirmation before you continue.**
|
|
76
83
|
|
|
77
84
|
### 1. Discovery
|
|
78
85
|
|
|
79
|
-
Run every recipe in
|
|
80
|
-
|
|
86
|
+
Read the subject's frontmatter `aliases` first. Run every recipe in
|
|
87
|
+
[references/locations.md](references/locations.md) for the name, each alias,
|
|
88
|
+
and each email. Compile a complete inventory of every file and reference
|
|
89
|
+
found.
|
|
81
90
|
|
|
82
91
|
### 2. Classify
|
|
83
92
|
|
|
@@ -89,20 +98,21 @@ where redaction is the action.
|
|
|
89
98
|
|
|
90
99
|
Process most-specific to most-general.
|
|
91
100
|
|
|
92
|
-
**3a. Dedicated files and directories:**
|
|
101
|
+
**3a. Dedicated files and directories (repeat per tier present):**
|
|
93
102
|
|
|
94
103
|
```bash
|
|
95
|
-
rm -rf "
|
|
96
|
-
rm -f "
|
|
104
|
+
rm -rf "2-Confidential/Candidates/{Name}/"
|
|
105
|
+
rm -f "2-Confidential/People/{Name}.md" # overlay note
|
|
106
|
+
rm -f "3-Team/People/{Name}.md"
|
|
97
107
|
find ~/.cache/fit/outpost/apple_mail/attachments/ -iname "*{Name}*" -delete
|
|
98
108
|
```
|
|
99
109
|
|
|
100
|
-
**3b. Redact mentions in other notes:**
|
|
110
|
+
**3b. Redact mentions in other notes:** Read each file. Remove the specific
|
|
101
111
|
lines/bullets/sections per the rules in
|
|
102
|
-
[references/classify.md](references/classify.md#redaction-rules)
|
|
103
|
-
`[[backlinks]]` to deleted notes
|
|
112
|
+
[references/classify.md](references/classify.md#redaction-rules). Remove broken
|
|
113
|
+
`[[backlinks]]` to deleted notes. Write the file back.
|
|
104
114
|
|
|
105
|
-
**3c. Email threads:**
|
|
115
|
+
**3c. Email threads:** Delete sole-subject threads. Redact paragraphs only in
|
|
106
116
|
multi-person threads.
|
|
107
117
|
|
|
108
118
|
**3d. Agent state files:**
|
|
@@ -126,29 +136,38 @@ rg -v "{deleted_path}" ~/.cache/fit/outpost/state/graph_processed \
|
|
|
126
136
|
|
|
127
137
|
### 4. Write the erasure report
|
|
128
138
|
|
|
129
|
-
|
|
130
|
-
[references/report-template.md](references/report-template.md).
|
|
131
|
-
|
|
139
|
+
Use the template in
|
|
140
|
+
[references/report-template.md](references/report-template.md). Save to
|
|
141
|
+
`2-Confidential/Erasure/{Name}--{YYYY-MM-DD}.md`. Record **only** what you
|
|
142
|
+
deleted. Never record CV content, skills, or assessments.
|
|
132
143
|
|
|
133
144
|
### 5. Verify
|
|
134
145
|
|
|
146
|
+
Run from the KB root so the search covers every tier and personal surface:
|
|
147
|
+
|
|
135
148
|
```bash
|
|
136
|
-
rg "{Name}"
|
|
149
|
+
rg "{Name}" . ~/.cache/fit/outpost/
|
|
137
150
|
```
|
|
138
151
|
|
|
139
152
|
The only match should be the erasure report. If other matches remain, process
|
|
140
|
-
them and update the report.
|
|
153
|
+
them and update the report. Repeat for each alias and email. Then validate the
|
|
154
|
+
graph. The removal creates dangling links. Fix what the validator reports:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npx fit-outpost validate {kb-root}
|
|
158
|
+
```
|
|
141
159
|
|
|
142
160
|
## Scope variants
|
|
143
161
|
|
|
144
162
|
**`recruitment-only`** limits erasure to:
|
|
145
163
|
|
|
146
|
-
- `
|
|
147
|
-
- `
|
|
164
|
+
- `2-Confidential/Candidates/{Name}/`
|
|
165
|
+
- `2-Confidential/Candidates/Insights.md` mentions
|
|
148
166
|
- Recruitment threads (known agency domains)
|
|
149
167
|
- `recruiter_triage.md`
|
|
150
168
|
|
|
151
|
-
|
|
152
|
-
be a colleague or non-recruitment contact.
|
|
169
|
+
It leaves `3-Team/People/{Name}.md` and the wider graph intact. The person
|
|
170
|
+
may be a colleague or a non-recruitment contact.
|
|
153
171
|
|
|
154
|
-
**`all`** (default): full erasure across
|
|
172
|
+
**`all`** (default): full erasure across every tier, personal surfaces, cache,
|
|
173
|
+
and state.
|
|
@@ -3,21 +3,23 @@
|
|
|
3
3
|
Reference for `req-forget` Step 2. For every match in the inventory, pick the
|
|
4
4
|
action below.
|
|
5
5
|
|
|
6
|
-
| Reference Type | Action
|
|
7
|
-
| ---------------------------------- |
|
|
8
|
-
| **Dedicated note** (sole subject) | Delete
|
|
9
|
-
| **
|
|
10
|
-
| **
|
|
11
|
-
| **
|
|
12
|
-
| **
|
|
13
|
-
| **
|
|
14
|
-
| **
|
|
15
|
-
| **
|
|
6
|
+
| Reference Type | Action | Example |
|
|
7
|
+
| ---------------------------------- | ---------------------------------------------- | ---------------------------------------------------- |
|
|
8
|
+
| **Dedicated note** (sole subject) | Delete the file, in every tier it appears | `3-Team/People/{Name}.md` |
|
|
9
|
+
| **Overlay note** (narrower tier) | Delete the file | `2-Confidential/People/{Name}.md` |
|
|
10
|
+
| **Dedicated directory** | Delete the entire directory | `2-Confidential/Candidates/{Name}/` |
|
|
11
|
+
| **Mention in another note** | Redact: remove the lines that name the person | Backlink in `3-Team/Organizations/Agency.md` |
|
|
12
|
+
| **Personal-surface mention** | Redact, or delete a sole-subject draft/brief | `0-Draft/{file}.md`, `Briefings/{date}.md` |
|
|
13
|
+
| **Email thread** (sole subject) | Delete the file | `~/.cache/fit/outpost/apple_mail/thread.md` |
|
|
14
|
+
| **Email thread** (multiple people) | Redact: remove the paragraphs about the person | A thread about multiple candidates |
|
|
15
|
+
| **Attachment** (their CV, etc.) | Delete the file | `attachments/{thread}/CV.pdf` |
|
|
16
|
+
| **Triage/state file** | Redact: remove the lines that mention them | `recruiter_triage.md` |
|
|
17
|
+
| **Insights file** | Redact: remove the bullets that mention them | `2-Confidential/Candidates/Insights.md` |
|
|
16
18
|
|
|
17
19
|
## Redaction rules
|
|
18
20
|
|
|
19
21
|
- Remove entire bullet points that mention the person by name.
|
|
20
|
-
- Remove table rows
|
|
21
|
-
- Remove `## Connected to` entries
|
|
22
|
+
- Remove the table rows that contain the person's name.
|
|
23
|
+
- Remove the `## Connected to` entries that link to deleted notes.
|
|
22
24
|
- If a section becomes empty after redaction, remove its header too.
|
|
23
|
-
- Do **not** remove
|
|
25
|
+
- Do **not** remove nearby context that does not identify the person.
|
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
# Discovery Search Recipes
|
|
2
2
|
|
|
3
|
-
Reference for `req-forget` Step 1. Run every recipe
|
|
4
|
-
|
|
3
|
+
Reference for `req-forget` Step 1. Run every recipe from the KB root. Repeat
|
|
4
|
+
each recipe for every recorded alias and email. Record every match into the
|
|
5
|
+
inventory. The tier glob `[0-9]-*/` covers every tier present.
|
|
5
6
|
|
|
6
|
-
##
|
|
7
|
+
## Direct notes, per tier
|
|
7
8
|
|
|
8
9
|
```bash
|
|
9
|
-
ls -d "
|
|
10
|
-
ls "
|
|
10
|
+
ls -d "2-Confidential/Candidates/{Name}/" 2>/dev/null
|
|
11
|
+
ls "2-Confidential/Prospects/{Name}.md" 2>/dev/null
|
|
12
|
+
ls "2-Confidential/People/{Name}.md" 2>/dev/null # overlay note
|
|
13
|
+
ls "3-Team/People/{Name}.md" 2>/dev/null
|
|
14
|
+
|
|
15
|
+
# Common name variations, in any tier
|
|
16
|
+
ls [0-9]-*/People/"{First} {Last}.md" 2>/dev/null
|
|
17
|
+
ls [0-9]-*/People/"{Last}, {First}.md" 2>/dev/null
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Backlinks and mentions, every tier
|
|
11
21
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
```bash
|
|
23
|
+
rg -l "{Name}" [0-9]-*/
|
|
24
|
+
rg -l "{First name} {Last name}" [0-9]-*/
|
|
25
|
+
rg -l "\[\[.*{Name}.*\]\]" [0-9]-*/
|
|
26
|
+
rg -l "{email}" [0-9]-*/
|
|
15
27
|
```
|
|
16
28
|
|
|
17
|
-
##
|
|
29
|
+
## Personal surfaces
|
|
18
30
|
|
|
19
31
|
```bash
|
|
20
|
-
rg -l "{Name}"
|
|
21
|
-
rg -l "{First name} {Last name}" Knowledge/
|
|
22
|
-
rg -l "\[\[.*{Name}.*\]\]" Knowledge/
|
|
23
|
-
rg -l "{email}" Knowledge/
|
|
32
|
+
rg -l "{Name}" 0-Draft/ Briefings/ 2>/dev/null
|
|
24
33
|
```
|
|
25
34
|
|
|
26
35
|
## Cached email threads
|
|
@@ -41,19 +50,15 @@ rg -l "{email}" ~/.cache/fit/outpost/apple_calendar/ 2>/dev/null
|
|
|
41
50
|
## Agent state files
|
|
42
51
|
|
|
43
52
|
```bash
|
|
44
|
-
rg -l "{Name}" ~/.cache/fit/outpost/
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Drafts
|
|
48
|
-
|
|
49
|
-
```bash
|
|
50
|
-
rg -l "{Name}" Drafts/ 2>/dev/null
|
|
53
|
+
rg -l "{Name}" ~/.cache/fit/outpost/ 2>/dev/null
|
|
51
54
|
```
|
|
52
55
|
|
|
53
56
|
## Final verification
|
|
54
57
|
|
|
58
|
+
Run from the KB root so the search covers every tier and personal surface:
|
|
59
|
+
|
|
55
60
|
```bash
|
|
56
|
-
rg "{Name}"
|
|
61
|
+
rg "{Name}" . ~/.cache/fit/outpost/
|
|
57
62
|
```
|
|
58
63
|
|
|
59
|
-
Expected: only the erasure report matches.
|
|
64
|
+
Expected: only the erasure report matches. Repeat per alias and email.
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
# Erasure Report Template
|
|
2
2
|
|
|
3
3
|
Audit trail for `req-forget` Step 4. Save to
|
|
4
|
-
`
|
|
4
|
+
`2-Confidential/Erasure/{Name}--{YYYY-MM-DD}.md`.
|
|
5
5
|
|
|
6
6
|
**The report itself must not contain personal data** beyond the subject's name
|
|
7
7
|
and the actions taken. Do not copy CV content, skills, or assessments into the
|
|
8
|
-
report
|
|
8
|
+
report. Record only what you deleted. Do not record what it contained.
|
|
9
9
|
|
|
10
10
|
````markdown
|
|
11
|
+
---
|
|
12
|
+
type: erasure
|
|
13
|
+
created: {YYYY-MM-DD}
|
|
14
|
+
updated: {YYYY-MM-DD}
|
|
15
|
+
---
|
|
16
|
+
|
|
11
17
|
# Data Erasure Report — {Full Name}
|
|
12
18
|
|
|
13
19
|
**Date:** {YYYY-MM-DD HH:MM}
|
|
@@ -22,15 +28,17 @@ report — record only what was deleted, not what it contained.
|
|
|
22
28
|
## Actions Taken
|
|
23
29
|
|
|
24
30
|
### Deleted Files
|
|
25
|
-
- `
|
|
26
|
-
- `
|
|
27
|
-
- `
|
|
28
|
-
- `
|
|
29
|
-
- {
|
|
31
|
+
- `2-Confidential/Candidates/{Name}/brief.md`
|
|
32
|
+
- `2-Confidential/Candidates/{Name}/CV.pdf`
|
|
33
|
+
- `2-Confidential/Candidates/{Name}/screening.md`
|
|
34
|
+
- `2-Confidential/People/{Name}.md` (overlay)
|
|
35
|
+
- `3-Team/People/{Name}.md`
|
|
36
|
+
- {list all deleted files, per tier}
|
|
30
37
|
|
|
31
38
|
### Redacted References
|
|
32
|
-
- `
|
|
33
|
-
- `
|
|
39
|
+
- `3-Team/Organizations/{Agency}.md` — removed backlink
|
|
40
|
+
- `2-Confidential/Candidates/Insights.md` — removed {N} bullet(s)
|
|
41
|
+
- `Briefings/{date}.md` — removed {N} line(s)
|
|
34
42
|
- {list all redacted files and what was removed}
|
|
35
43
|
|
|
36
44
|
### Cached Data Removed
|
|
@@ -49,6 +57,8 @@ The following are outside this tool's reach:
|
|
|
49
57
|
- **Apple Mail** — original emails remain in the user's mailbox. Search
|
|
50
58
|
Mail.app for "{Name}" and delete threads manually.
|
|
51
59
|
- **Apple Calendar** — events remain in Calendar.app.
|
|
60
|
+
- **Synced tier copies** — teammates who receive a shared tier hold their own
|
|
61
|
+
copies. Notify them of the deletion.
|
|
52
62
|
- **Recruitment agencies** — notify {Agency} of the deletion and request
|
|
53
63
|
they do the same.
|
|
54
64
|
- **Interview notes** — check physical notebooks and external apps.
|
|
@@ -57,11 +67,9 @@ The following are outside this tool's reach:
|
|
|
57
67
|
## Verification
|
|
58
68
|
|
|
59
69
|
```bash
|
|
60
|
-
rg "{Name}"
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
Expected: no matches except this erasure report.
|
|
64
|
-
|
|
65
|
-
```text
|
|
66
|
-
|
|
70
|
+
rg "{Name}" . ~/.cache/fit/outpost/
|
|
71
|
+
npx fit-outpost validate {kb-root}
|
|
67
72
|
```
|
|
73
|
+
|
|
74
|
+
Expected: no matches except this erasure report, and a clean validator run.
|
|
75
|
+
````
|
|
@@ -3,26 +3,28 @@ name: req-scan
|
|
|
3
3
|
description: >
|
|
4
4
|
Scan publicly available sources for candidates who indicate they are open for
|
|
5
5
|
hire. Uses WebFetch to read public APIs (HN Algolia, GitHub, dev.to).
|
|
6
|
-
Writes prospect notes to
|
|
6
|
+
Writes prospect notes to 2-Confidential/Prospects/. Maintains
|
|
7
7
|
cursor/dedup state in ~/.cache/fit/outpost/head-hunter/. Use when the
|
|
8
|
-
head-hunter agent
|
|
8
|
+
head-hunter agent wakes or when the user asks to scan for open candidates.
|
|
9
9
|
---
|
|
10
10
|
|
|
11
11
|
# Scan Open Candidates
|
|
12
12
|
|
|
13
|
+
Write tier: `2-Confidential`
|
|
14
|
+
Frontmatter: prospect
|
|
15
|
+
|
|
13
16
|
Fetch and filter publicly available candidate posts from platforms where people
|
|
14
|
-
**explicitly indicate** they are open for hire. This skill
|
|
15
|
-
|
|
16
|
-
updates.
|
|
17
|
+
**explicitly indicate** they are open for hire. This skill fetches, filters,
|
|
18
|
+
deduplicates, benchmarks, writes prospect notes, and updates memory.
|
|
17
19
|
|
|
18
20
|
## Trigger
|
|
19
21
|
|
|
20
|
-
- The head-hunter agent
|
|
22
|
+
- The scheduler wakes the head-hunter agent.
|
|
21
23
|
- The user asks to scan for open candidates or prospects.
|
|
22
24
|
|
|
23
25
|
## Prerequisites
|
|
24
26
|
|
|
25
|
-
- `WebFetch` tool available (Claude Code built-in
|
|
27
|
+
- `WebFetch` tool available (a Claude Code built-in, no curl/wget).
|
|
26
28
|
- `fit-pathway` CLI available (`bunx fit-pathway`).
|
|
27
29
|
- Memory directory `~/.cache/fit/outpost/head-hunter/`.
|
|
28
30
|
|
|
@@ -34,24 +36,24 @@ updates.
|
|
|
34
36
|
|
|
35
37
|
## Outputs
|
|
36
38
|
|
|
37
|
-
- `
|
|
39
|
+
- `2-Confidential/Prospects/{Name}.md`.
|
|
38
40
|
- Updated `cursor.tsv`, `seen.tsv`, `prospects.tsv`, and `log.md`.
|
|
39
41
|
- `~/.cache/fit/outpost/state/head_hunter_triage.md`.
|
|
40
42
|
|
|
41
43
|
<do_confirm_checklist goal="Verify the wake produced a clean, ethical scan">
|
|
42
44
|
|
|
43
|
-
- [ ]
|
|
44
|
-
- [ ]
|
|
45
|
-
- [ ]
|
|
45
|
+
- [ ] Select the least-recently-checked source that is not suspended.
|
|
46
|
+
- [ ] Fetch with `WebFetch` (never curl/wget).
|
|
47
|
+
- [ ] Apply all 5 filters in order. Confirm each passed candidate has ≥ 2
|
|
46
48
|
standard-relevant skills.
|
|
47
|
-
- [ ]
|
|
48
|
-
- [ ]
|
|
49
|
-
- [ ]
|
|
50
|
-
- [ ]
|
|
51
|
-
prospects, failures, log.
|
|
52
|
-
- [ ]
|
|
53
|
-
|
|
54
|
-
- [ ]
|
|
49
|
+
- [ ] Deduplicate against `seen.tsv` before you process a candidate.
|
|
50
|
+
- [ ] Benchmark each prospect against a real `bunx fit-pathway job`.
|
|
51
|
+
- [ ] Follow the template for every prospect note (no fabricated names).
|
|
52
|
+
- [ ] Route every state mutation through `node scripts/state.mjs`: cursor,
|
|
53
|
+
seen, prospects, failures, log.
|
|
54
|
+
- [ ] Write the triage report to the state directory. Log any alternative
|
|
55
|
+
queries.
|
|
56
|
+
- [ ] Record every failure. Suspend a source at ≥ 3 consecutive failures.
|
|
55
57
|
|
|
56
58
|
</do_confirm_checklist>
|
|
57
59
|
|
|
@@ -75,12 +77,12 @@ follow [references/filters.md](references/filters.md#failure-handling).
|
|
|
75
77
|
### 3. Filter
|
|
76
78
|
|
|
77
79
|
Apply the 5-filter pipeline in
|
|
78
|
-
[references/filters.md](references/filters.md#filter-pipeline)
|
|
80
|
+
[references/filters.md](references/filters.md#filter-pipeline): signal, dedup,
|
|
79
81
|
geographic, skill alignment, experience level.
|
|
80
82
|
|
|
81
83
|
### 3b. Fallback — zero new prospects
|
|
82
84
|
|
|
83
|
-
If
|
|
85
|
+
If the filters eliminate every candidate, try up to **3 alternatives** per wake
|
|
84
86
|
from [references/fallbacks.md](references/fallbacks.md). Log every alternative
|
|
85
87
|
in `log.md`.
|
|
86
88
|
|
|
@@ -99,17 +101,17 @@ Classify match strength:
|
|
|
99
101
|
- **moderate** — some overlap, level roughly right, minor gaps.
|
|
100
102
|
- **weak** — few matching signals, significant gaps.
|
|
101
103
|
|
|
102
|
-
Write notes for **strong** and **moderate** matches only
|
|
104
|
+
Write notes for **strong** and **moderate** matches only. Use the template in
|
|
103
105
|
[references/template.md](references/template.md).
|
|
104
106
|
|
|
105
107
|
```bash
|
|
106
|
-
mkdir -p "
|
|
108
|
+
mkdir -p "2-Confidential/Prospects"
|
|
107
109
|
```
|
|
108
110
|
|
|
109
111
|
### 5. Update state
|
|
110
112
|
|
|
111
|
-
All state changes go through `node scripts/state.mjs
|
|
112
|
-
[references/state.md](references/state.md). Each wake:
|
|
113
|
+
All state changes go through `node scripts/state.mjs`. The full command
|
|
114
|
+
reference is [references/state.md](references/state.md). Each wake:
|
|
113
115
|
|
|
114
116
|
1. Update the cursor (`cursor set`).
|
|
115
117
|
2. Reset failure count on success or increment on failure.
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Fallback Strategies
|
|
2
2
|
|
|
3
3
|
Reference for `req-scan` when a primary source query yields zero new prospects
|
|
4
|
-
after
|
|
5
|
-
limits.
|
|
4
|
+
after the filters run. Try at most **3 alternatives per wake** to stay within
|
|
5
|
+
rate limits.
|
|
6
6
|
|
|
7
7
|
## Strategy 1 — alternative search terms
|
|
8
8
|
|
|
9
9
|
### HN
|
|
10
10
|
|
|
11
11
|
- Check the **previous** month's "Who Wants to Be Hired?" thread.
|
|
12
|
-
- Search for `"Who is hiring"` threads (
|
|
13
|
-
thread
|
|
12
|
+
- Search for `"Who is hiring"` threads. (Candidates sometimes post in the wrong
|
|
13
|
+
thread. Comments may link to candidate profiles.)
|
|
14
14
|
- Try
|
|
15
15
|
`https://hn.algolia.com/api/v1/search?query=%22freelancer+available%22&tags=comment`.
|
|
16
16
|
|
|
@@ -47,9 +47,9 @@ WebFetch URL: https://dev.to/api/articles?tag=career&per_page=25
|
|
|
47
47
|
If geography eliminated everyone, re-scan without the location filter. Mark
|
|
48
48
|
unmatched-location prospects as "location unconfirmed" in the prospect note.
|
|
49
49
|
|
|
50
|
-
If skill alignment filtered everyone out
|
|
51
|
-
to 1
|
|
52
|
-
capability)
|
|
50
|
+
If skill alignment filtered everyone out, lower the bar from 2 standard skills
|
|
51
|
+
to 1. Consider transferable skills (strong Python ⇒ likely data integration
|
|
52
|
+
capability). Accept adjacent indicators ("machine learning" implies data
|
|
53
53
|
skills).
|
|
54
54
|
|
|
55
55
|
## Strategy 3 — cross-reference
|
|
@@ -57,11 +57,11 @@ skills).
|
|
|
57
57
|
When a source yields very few results, enrich what you do find:
|
|
58
58
|
|
|
59
59
|
- A GitHub profile that links to a blog/portfolio → WebFetch it for more detail
|
|
60
|
-
before
|
|
60
|
+
before you decide skill fit.
|
|
61
61
|
- An HN post that mentions a GitHub username → fetch their GitHub profile for
|
|
62
62
|
richer signal.
|
|
63
63
|
|
|
64
|
-
##
|
|
64
|
+
## Log the alternatives
|
|
65
65
|
|
|
66
66
|
Log every alternative in `log.md`:
|
|
67
67
|
|
|
@@ -11,7 +11,7 @@ Apply in order. Stop at the first that excludes the candidate.
|
|
|
11
11
|
- HN "Who Wants to Be Hired?" → **auto-pass** (thread is opt-in).
|
|
12
12
|
- GitHub → must have `hireable: true` **or** bio contains an open-to-work
|
|
13
13
|
phrase.
|
|
14
|
-
- dev.to → must
|
|
14
|
+
- dev.to → the post must carry the tag `opentowork` or `lookingforwork`.
|
|
15
15
|
|
|
16
16
|
### 2. Deduplication
|
|
17
17
|
|
|
@@ -31,8 +31,8 @@ Prefer or accept candidates in or open to:
|
|
|
31
31
|
- **Remote / Anywhere / Global**.
|
|
32
32
|
|
|
33
33
|
Skip candidates explicitly locked to incompatible regions ("San Francisco only",
|
|
34
|
-
"APAC only"). When location is ambiguous or unstated, include the candidate
|
|
35
|
-
|
|
34
|
+
"APAC only"). When location is ambiguous or unstated, include the candidate.
|
|
35
|
+
Let the user decide.
|
|
36
36
|
|
|
37
37
|
### 4. Skill alignment
|
|
38
38
|
|
|
@@ -46,8 +46,8 @@ non-traditional path (law, policy, academia → tech), AI/ML tool proficiency
|
|
|
46
46
|
**Platform:** infrastructure / cloud / DevOps, architecture and system design,
|
|
47
47
|
API design and shared services, performance / scalability / reliability.
|
|
48
48
|
|
|
49
|
-
**Minimum bar:** at least 2 standard-relevant skills
|
|
50
|
-
|
|
49
|
+
**Minimum bar:** the post must show at least 2 standard-relevant skills. Skip
|
|
50
|
+
candidates with purely non-technical profiles.
|
|
51
51
|
|
|
52
52
|
### 5. Experience level
|
|
53
53
|
|
|
@@ -68,16 +68,16 @@ block page):
|
|
|
68
68
|
1. Increment the failure count:
|
|
69
69
|
`node scripts/state.mjs failure increment {source}`.
|
|
70
70
|
2. **Do not retry** the same source in this wake cycle.
|
|
71
|
-
3. Suspend after 3 consecutive failures
|
|
72
|
-
suspended sources once every 7 days to detect recovery.
|
|
71
|
+
3. Suspend after 3 consecutive failures. Skip a suspended source during source
|
|
72
|
+
selection. Retry suspended sources once every 7 days to detect recovery.
|
|
73
73
|
4. Log the failure in `log.md` with HTTP status and error.
|
|
74
74
|
5. Reset on success: `node scripts/state.mjs failure reset {source}`.
|
|
75
75
|
|
|
76
76
|
### Common failure patterns
|
|
77
77
|
|
|
78
|
-
| Symptom | Likely cause
|
|
79
|
-
| ------------------------ |
|
|
80
|
-
| 503 with HTML redirect |
|
|
81
|
-
| 403 Forbidden |
|
|
82
|
-
| 429 Too Many Requests | Rate limited
|
|
83
|
-
| Empty response / timeout | Transient
|
|
78
|
+
| Symptom | Likely cause |
|
|
79
|
+
| ------------------------ | -------------------------------------------------------- |
|
|
80
|
+
| 503 with HTML redirect | A corporate proxy blocks the domain. It will not recover |
|
|
81
|
+
| 403 Forbidden | The site needs auth, or it blocks automated requests |
|
|
82
|
+
| 429 Too Many Requests | Rate limited. It recovers. Do not suspend permanently |
|
|
83
|
+
| Empty response / timeout | Transient. It likely recovers next wake |
|
|
@@ -4,31 +4,31 @@ Reference for `req-scan` Step 2 (fetch & scan). One source per wake cycle.
|
|
|
4
4
|
|
|
5
5
|
## 1. Hacker News "Who Wants to Be Hired?"
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
A monthly thread that appears on the 1st.
|
|
8
8
|
|
|
9
9
|
```text
|
|
10
10
|
WebFetch URL: https://hn.algolia.com/api/v1/search?query=%22Who+wants+to+be+hired%22&tags=ask_hn&hitsPerPage=5
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
The first hit whose title matches "Who wants to be hired?"
|
|
14
|
-
the current or previous month
|
|
13
|
+
The target thread is the first hit whose title matches "Who wants to be hired?"
|
|
14
|
+
and whose `created_at` falls in the current or previous month.
|
|
15
15
|
|
|
16
16
|
```text
|
|
17
17
|
WebFetch URL: https://hn.algolia.com/api/v1/items/{objectID}
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
`children[]` contains top-level comments
|
|
21
|
-
`text` field for:
|
|
20
|
+
`children[]` contains top-level comments. Each comment is one candidate. Parse
|
|
21
|
+
the `text` field for:
|
|
22
22
|
|
|
23
23
|
- **Location** ("Location: New York", "NYC / Remote").
|
|
24
24
|
- **Remote** ("Remote: Yes", "Open to remote").
|
|
25
25
|
- **Skills** — tech stack, language/standard mentions.
|
|
26
26
|
- **Experience** — years, role titles, past companies.
|
|
27
|
-
- **Contact** — email
|
|
27
|
+
- **Contact** — email, often obfuscated as "name [at] domain [dot] com".
|
|
28
28
|
- **Resume / CV** — links to personal sites, GitHub, LinkedIn.
|
|
29
29
|
|
|
30
30
|
**Cursor:** thread `objectID` plus the ID of the last processed child comment.
|
|
31
|
-
**Rate:** no strict limit
|
|
31
|
+
**Rate:** no strict limit. One fetch per wake cycle.
|
|
32
32
|
|
|
33
33
|
## 2. GitHub Open to Work
|
|
34
34
|
|
|
@@ -40,7 +40,7 @@ node scripts/state.mjs failure increment mastodon_hachyderm
|
|
|
40
40
|
node scripts/state.mjs failure reset github_open_to_work
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
##
|
|
43
|
+
## Logs
|
|
44
44
|
|
|
45
45
|
```bash
|
|
46
46
|
node scripts/state.mjs log-wake github_open_to_work "Primary query: 'open to work' location:UK — 30 results, 2 new prospects"
|
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
# Prospect Note Template
|
|
2
2
|
|
|
3
|
-
Reference for `req-scan` Step 4. Save to `
|
|
3
|
+
Reference for `req-scan` Step 4. Save to `2-Confidential/Prospects/{Name}.md`.
|
|
4
|
+
The note opens with the frontmatter block. Select `status` from the registry
|
|
5
|
+
vocabulary (`registry.yaml`).
|
|
4
6
|
|
|
5
7
|
```markdown
|
|
8
|
+
---
|
|
9
|
+
type: prospect
|
|
10
|
+
created: {YYYY-MM-DD}
|
|
11
|
+
updated: {YYYY-MM-DD}
|
|
12
|
+
aliases: [{username or display-name variants, or an empty list}]
|
|
13
|
+
status: {registry status: identified / contacted / responded / converted / closed}
|
|
14
|
+
---
|
|
15
|
+
|
|
6
16
|
# {Name}
|
|
7
17
|
|
|
8
18
|
## Info
|