@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.
Files changed (129) hide show
  1. package/README.md +2 -2
  2. package/bin/fit-outpost.js +3 -2
  3. package/package.json +6 -5
  4. package/src/agent-path.js +10 -6
  5. package/src/agent-runner.js +28 -24
  6. package/src/index.js +2 -3
  7. package/src/kb-manager.js +75 -20
  8. package/src/kb-validator.js +762 -0
  9. package/src/outpost.js +108 -39
  10. package/src/posture.js +3 -3
  11. package/src/privilege.js +11 -11
  12. package/src/scheduler.js +14 -12
  13. package/src/socket-server.js +19 -18
  14. package/src/spawn-env.js +7 -6
  15. package/src/state-manager.js +2 -2
  16. package/templates/.claude/agents/chief-of-staff.md +32 -24
  17. package/templates/.claude/agents/concierge.md +26 -17
  18. package/templates/.claude/agents/head-hunter.md +34 -26
  19. package/templates/.claude/agents/librarian.md +26 -18
  20. package/templates/.claude/agents/postman.md +26 -18
  21. package/templates/.claude/agents/recruiter.md +38 -27
  22. package/templates/.claude/skills/anarlog-follow/SKILL.md +91 -66
  23. package/templates/.claude/skills/anarlog-follow/references/coaching.md +22 -21
  24. package/templates/.claude/skills/anarlog-follow/references/sessions.md +52 -0
  25. package/templates/.claude/skills/anarlog-process/SKILL.md +108 -62
  26. package/templates/.claude/skills/anarlog-process/references/extraction.md +41 -29
  27. package/templates/.claude/skills/anarlog-process/references/sessions.md +92 -58
  28. package/templates/.claude/skills/anarlog-process/scripts/scan.mjs +402 -160
  29. package/templates/.claude/skills/candidate-report/SKILL.md +41 -36
  30. package/templates/.claude/skills/candidate-report/references/report-template.html +10 -10
  31. package/templates/.claude/skills/candidate-report/references/report.css +4 -4
  32. package/templates/.claude/skills/candidate-report/references/rubric.md +15 -14
  33. package/templates/.claude/skills/candidate-report/scripts/render-pdf.mjs +2 -2
  34. package/templates/.claude/skills/changelog/SKILL.md +122 -67
  35. package/templates/.claude/skills/deck-create/SKILL.md +90 -32
  36. package/templates/.claude/skills/deck-create/references/slide.css +4 -4
  37. package/templates/.claude/skills/deck-create/scripts/convert-to-pdf.mjs +6 -6
  38. package/templates/.claude/skills/deck-review/SKILL.md +63 -58
  39. package/templates/.claude/skills/deck-review/assets/slide-annotator.js +58 -49
  40. package/templates/.claude/skills/deck-summarize/SKILL.md +55 -45
  41. package/templates/.claude/skills/deck-summarize/references/brief-template.md +5 -4
  42. package/templates/.claude/skills/deck-summarize/scripts/extract-pptx.mjs +8 -7
  43. package/templates/.claude/skills/doc-collab/SKILL.md +39 -34
  44. package/templates/.claude/skills/doc-create/SKILL.md +27 -23
  45. package/templates/.claude/skills/doc-create/scripts/convert-to-pdf.mjs +6 -6
  46. package/templates/.claude/skills/draft-emails/SKILL.md +63 -53
  47. package/templates/.claude/skills/draft-emails/references/template.md +2 -2
  48. package/templates/.claude/skills/draft-emails/scripts/scan-emails.mjs +15 -8
  49. package/templates/.claude/skills/draft-emails/scripts/send-email.mjs +19 -11
  50. package/templates/.claude/skills/extract-entities/SKILL.md +76 -75
  51. package/templates/.claude/skills/extract-entities/references/TEMPLATES.md +6 -5
  52. package/templates/.claude/skills/extract-entities/references/conditions.md +20 -18
  53. package/templates/.claude/skills/extract-entities/references/content.md +10 -9
  54. package/templates/.claude/skills/extract-entities/references/links.md +37 -13
  55. package/templates/.claude/skills/extract-entities/references/recruitment.md +30 -24
  56. package/templates/.claude/skills/extract-entities/references/resolution.md +14 -14
  57. package/templates/.claude/skills/extract-entities/references/sources.md +9 -9
  58. package/templates/.claude/skills/extract-entities/references/templates-conditions.md +12 -6
  59. package/templates/.claude/skills/extract-entities/references/templates-people-orgs.md +29 -10
  60. package/templates/.claude/skills/extract-entities/references/templates-priorities.md +10 -4
  61. package/templates/.claude/skills/extract-entities/references/templates-projects-topics.md +19 -7
  62. package/templates/.claude/skills/extract-entities/scripts/state.mjs +9 -8
  63. package/templates/.claude/skills/meeting-prep/SKILL.md +42 -36
  64. package/templates/.claude/skills/organize-files/SKILL.md +27 -22
  65. package/templates/.claude/skills/organize-files/scripts/organize-by-type.mjs +5 -4
  66. package/templates/.claude/skills/organize-files/scripts/summarize.mjs +4 -4
  67. package/templates/.claude/skills/person-identify/SKILL.md +77 -27
  68. package/templates/.claude/skills/person-identify/scripts/identify.sh +125 -26
  69. package/templates/.claude/skills/person-lookup/SKILL.md +34 -30
  70. package/templates/.claude/skills/person-lookup/scripts/lookup.sh +46 -17
  71. package/templates/.claude/skills/req-assess/SKILL.md +44 -36
  72. package/templates/.claude/skills/req-assess/references/interview-template.md +7 -2
  73. package/templates/.claude/skills/req-assess/references/panel-template.md +7 -2
  74. package/templates/.claude/skills/req-assess/references/rubric.md +13 -13
  75. package/templates/.claude/skills/req-bundle/SKILL.md +164 -0
  76. package/templates/.claude/skills/req-bundle/references/matching.md +70 -0
  77. package/templates/.claude/skills/req-bundle/references/pdf-structure.md +74 -0
  78. package/templates/.claude/skills/req-bundle/scripts/split-bundle.mjs +377 -0
  79. package/templates/.claude/skills/req-decide/SKILL.md +52 -41
  80. package/templates/.claude/skills/req-decide/references/rubric.md +11 -10
  81. package/templates/.claude/skills/req-decide/references/template.md +2 -2
  82. package/templates/.claude/skills/req-forget/SKILL.md +58 -39
  83. package/templates/.claude/skills/req-forget/references/classify.md +15 -13
  84. package/templates/.claude/skills/req-forget/references/locations.md +27 -22
  85. package/templates/.claude/skills/req-forget/references/report-template.md +24 -16
  86. package/templates/.claude/skills/req-scan/SKILL.md +27 -25
  87. package/templates/.claude/skills/req-scan/references/fallbacks.md +9 -9
  88. package/templates/.claude/skills/req-scan/references/filters.md +13 -13
  89. package/templates/.claude/skills/req-scan/references/sources.md +7 -7
  90. package/templates/.claude/skills/req-scan/references/state.md +1 -1
  91. package/templates/.claude/skills/req-scan/references/template.md +11 -1
  92. package/templates/.claude/skills/req-scan/scripts/state.mjs +3 -2
  93. package/templates/.claude/skills/req-screen/SKILL.md +96 -50
  94. package/templates/.claude/skills/req-screen/references/rubric.md +46 -50
  95. package/templates/.claude/skills/req-screen/references/scoring.md +79 -0
  96. package/templates/.claude/skills/req-screen/references/template.md +29 -17
  97. package/templates/.claude/skills/req-track/SKILL.md +76 -76
  98. package/templates/.claude/skills/req-track/references/fields.md +31 -27
  99. package/templates/.claude/skills/req-track/references/overlays.md +42 -0
  100. package/templates/.claude/skills/req-track/references/signals.md +12 -12
  101. package/templates/.claude/skills/req-track/references/statuses.md +3 -2
  102. package/templates/.claude/skills/req-track/references/templates.md +28 -27
  103. package/templates/.claude/skills/req-workday/SKILL.md +69 -40
  104. package/templates/.claude/skills/req-workday/references/brief.md +81 -0
  105. package/templates/.claude/skills/req-workday/references/status-mapping.md +5 -5
  106. package/templates/.claude/skills/req-workday/references/templates.md +11 -78
  107. package/templates/.claude/skills/req-workday/references/xlsx-format.md +26 -7
  108. package/templates/.claude/skills/req-workday/scripts/parse-workday.mjs +113 -35
  109. package/templates/.claude/skills/send-chat/SKILL.md +58 -54
  110. package/templates/.claude/skills/sync-apple-calendar/SKILL.md +23 -19
  111. package/templates/.claude/skills/sync-apple-calendar/references/SCHEMA.md +7 -7
  112. package/templates/.claude/skills/sync-apple-calendar/scripts/query.mjs +6 -6
  113. package/templates/.claude/skills/sync-apple-calendar/scripts/sync.mjs +9 -8
  114. package/templates/.claude/skills/sync-apple-mail/SKILL.md +20 -14
  115. package/templates/.claude/skills/sync-apple-mail/references/SCHEMA.md +10 -10
  116. package/templates/.claude/skills/sync-apple-mail/scripts/parse-emlx.mjs +9 -9
  117. package/templates/.claude/skills/sync-apple-mail/scripts/sync-helpers.mjs +16 -13
  118. package/templates/.claude/skills/sync-apple-mail/scripts/sync.mjs +3 -3
  119. package/templates/.claude/skills/sync-teams/SKILL.md +46 -43
  120. package/templates/.claude/skills/sync-teams/scripts/idb-reader.mjs +22 -21
  121. package/templates/.claude/skills/sync-teams/scripts/leveldb-reader.mjs +4 -4
  122. package/templates/.claude/skills/sync-teams/scripts/sync.mjs +4 -4
  123. package/templates/.claude/skills/upstream-instructions/SKILL.md +43 -41
  124. package/templates/.claude/skills/upstream-instructions/references/examples.md +5 -5
  125. package/templates/CLAUDE.md +97 -85
  126. package/templates/MIGRATION.md +359 -0
  127. package/templates/registry.yaml +25 -0
  128. package/templates/.claude/skills/anarlog-follow/scripts/follow.mjs +0 -243
  129. 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 needs to comply with a
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
- Process data erasure requests under GDPR Article 17. Given a person's name,
15
- systematically find and remove all personal data from the knowledge base, cached
16
- synced data, and agent state files. Produces an **erasure report** documenting
17
- what was found, deleted, and redacted the compliance audit trail.
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
- - `Knowledge/Erasure/{Name}--{YYYY-MM-DD}.md` — erasure report.
41
- - Deleted files and redacted references across the knowledge base.
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
- - [ ] User confirmed intent before any deletion.
47
- - [ ] All discovery recipes ran; inventory covers knowledge, cache, state,
48
- drafts.
49
- - [ ] All dedicated files and directories deleted.
50
- - [ ] All mentions and backlinks redacted from other notes.
51
- - [ ] Cached email threads, attachments, and calendar entries handled.
52
- - [ ] Agent state and `graph_processed` cleaned.
53
- - [ ] Erasure report saved; contains **no** personal data beyond the name and
54
- actions taken.
55
- - [ ] Final `rg` search shows only the erasure report as a match.
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
- > - Knowledge base notes (People, Candidates, Organizations mentions)
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
- > This action cannot be undone. Proceed?
80
+ > You cannot undo this action. Proceed?
74
81
 
75
- **Wait for explicit confirmation before continuing.**
82
+ **Wait for explicit confirmation before you continue.**
76
83
 
77
84
  ### 1. Discovery
78
85
 
79
- Run every recipe in [references/locations.md](references/locations.md) and
80
- compile a complete inventory of every file and reference found.
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 "Knowledge/Candidates/{Name}/"
96
- rm -f "Knowledge/People/{Name}.md"
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:** read each file, remove the specific
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), remove broken
103
- `[[backlinks]]` to deleted notes, write the file back.
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:** delete sole-subject threads; redact paragraphs only in
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
- Save to `Knowledge/Erasure/{Name}--{YYYY-MM-DD}.md` using the template in
130
- [references/report-template.md](references/report-template.md). Record **only**
131
- what was deleted never CV content, skills, or assessments.
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}" Knowledge/ ~/.cache/fit/outpost/ Drafts/
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
- - `Knowledge/Candidates/{Name}/`
147
- - `Knowledge/Candidates/Insights.md` mentions
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
- Leaves `Knowledge/People/{Name}.md` and the wider graph intact the person may
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 knowledge base, cache, and state.
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 | Example |
7
- | ---------------------------------- | ------------------------------------------- | ----------------------------------------------- |
8
- | **Dedicated note** (sole subject) | Delete entire file | `Knowledge/People/{Name}.md` |
9
- | **Dedicated directory** | Delete entire directory | `Knowledge/Candidates/{Name}/` |
10
- | **Mention in another note** | Redact: remove lines referencing the person | Backlink in `Knowledge/Organizations/Agency.md` |
11
- | **Email thread** (sole subject) | Delete file | `~/.cache/fit/outpost/apple_mail/thread.md` |
12
- | **Email thread** (multiple people) | Redact: remove paragraphs about the person | Thread discussing multiple candidates |
13
- | **Attachment** (their CV, etc.) | Delete file | `attachments/{thread}/CV.pdf` |
14
- | **Triage/state file** | Redact: remove lines mentioning them | `recruiter_triage.md` |
15
- | **Insights file** | Redact: remove bullets mentioning them | `Knowledge/Candidates/Insights.md` |
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 containing the person's name.
21
- - Remove `## Connected to` entries linking to deleted notes.
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 surrounding context that doesn't identify the person.
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; record every match into the
4
- inventory.
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
- ## Knowledge base direct notes
7
+ ## Direct notes, per tier
7
8
 
8
9
  ```bash
9
- ls -d "Knowledge/Candidates/{Name}/" 2>/dev/null
10
- ls "Knowledge/People/{Name}.md" 2>/dev/null
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
- # Common name variations
13
- ls "Knowledge/People/{First} {Last}.md" 2>/dev/null
14
- ls "Knowledge/People/{Last}, {First}.md" 2>/dev/null
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
- ## Knowledge base — backlinks and mentions
29
+ ## Personal surfaces
18
30
 
19
31
  ```bash
20
- rg -l "{Name}" Knowledge/
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/state/ 2>/dev/null
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}" Knowledge/ ~/.cache/fit/outpost/ Drafts/
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
- `Knowledge/Erasure/{Name}--{YYYY-MM-DD}.md`.
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 record only what was deleted, not what it contained.
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
- - `Knowledge/Candidates/{Name}/brief.md`
26
- - `Knowledge/Candidates/{Name}/CV.pdf`
27
- - `Knowledge/Candidates/{Name}/screening.md`
28
- - `Knowledge/People/{Name}.md`
29
- - {list all deleted files}
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
- - `Knowledge/Organizations/{Agency}.md` — removed backlink
33
- - `Knowledge/Candidates/Insights.md` — removed {N} bullet(s)
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}" Knowledge/ ~/.cache/fit/outpost/
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 Knowledge/Prospects/. Maintains
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 is woken or when the user asks to scan for open candidates.
8
+ head-hunter agent wakes or when the user asks to scan for open candidates.
9
9
  ---
10
10
 
11
11
  # Scan Open Candidates
12
12
 
13
+ 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 handles fetching,
15
- filtering, deduplication, benchmarking, prospect-note writing, and memory
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 is woken by the scheduler.
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 no curl/wget).
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
- - `Knowledge/Prospects/{Name}.md`.
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
- - [ ] Selected the least-recently-checked, non-suspended source.
44
- - [ ] Fetched via `WebFetch` (never curl/wget).
45
- - [ ] Applied all 5 filters in order; passed candidates have ≥ 2
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
- - [ ] Deduplicated against `seen.tsv` before processing.
48
- - [ ] Benchmarked each prospect against a real `bunx fit-pathway job`.
49
- - [ ] Prospect notes follow the template (no fabricated names).
50
- - [ ] All state mutations went through `node scripts/state.mjs` cursor, seen,
51
- prospects, failures, log.
52
- - [ ] Triage report written to the state directory; alternative queries (if any)
53
- logged.
54
- - [ ] Failures recorded; sources with ≥ 3 consecutive failures suspended.
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) signal, dedup,
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 filtering eliminates every candidate, try up to **3 alternatives** per wake
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, using the template in
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 "Knowledge/Prospects"
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` full command reference:
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 filtering. Try at most **3 alternatives per wake** to stay within rate
5
- limits.
4
+ after the filters run. Try at most **3 alternatives per wake** to stay within
5
+ rate limits.
6
6
 
7
7
  ## Strategy 1 — alternative search terms
8
8
 
9
9
  ### HN
10
10
 
11
11
  - Check the **previous** month's "Who Wants to Be Hired?" thread.
12
- - Search for `"Who is hiring"` threads (candidates sometimes post in the wrong
13
- thread; comments may link to candidate profiles).
12
+ - Search for `"Who is hiring"` threads. (Candidates sometimes post in the wrong
13
+ thread. Comments may link to candidate profiles.)
14
14
  - Try
15
15
  `https://hn.algolia.com/api/v1/search?query=%22freelancer+available%22&tags=comment`.
16
16
 
@@ -47,9 +47,9 @@ WebFetch URL: https://dev.to/api/articles?tag=career&per_page=25
47
47
  If geography eliminated everyone, re-scan without the location filter. Mark
48
48
  unmatched-location prospects as "location unconfirmed" in the prospect note.
49
49
 
50
- If skill alignment filtered everyone out: lower the bar from 2 standard skills
51
- to 1; consider transferable skills (strong Python ⇒ likely data integration
52
- capability); accept adjacent indicators ("machine learning" implies data
50
+ If skill alignment filtered everyone out, lower the bar from 2 standard skills
51
+ to 1. Consider transferable skills (strong Python ⇒ likely data integration
52
+ capability). Accept adjacent indicators ("machine learning" implies data
53
53
  skills).
54
54
 
55
55
  ## Strategy 3 — cross-reference
@@ -57,11 +57,11 @@ skills).
57
57
  When a source yields very few results, enrich what you do find:
58
58
 
59
59
  - A GitHub profile that links to a blog/portfolio → WebFetch it for more detail
60
- before deciding skill fit.
60
+ before you decide skill fit.
61
61
  - An HN post that mentions a GitHub username → fetch their GitHub profile for
62
62
  richer signal.
63
63
 
64
- ## Logging alternatives
64
+ ## Log the alternatives
65
65
 
66
66
  Log every alternative in `log.md`:
67
67
 
@@ -11,7 +11,7 @@ Apply in order. Stop at the first that excludes the candidate.
11
11
  - HN "Who Wants to Be Hired?" → **auto-pass** (thread is opt-in).
12
12
  - GitHub → must have `hireable: true` **or** bio contains an open-to-work
13
13
  phrase.
14
- - dev.to → must be tagged `opentowork` or `lookingforwork`.
14
+ - dev.to → the post must carry the tag `opentowork` or `lookingforwork`.
15
15
 
16
16
  ### 2. Deduplication
17
17
 
@@ -31,8 +31,8 @@ Prefer or accept candidates in or open to:
31
31
  - **Remote / Anywhere / Global**.
32
32
 
33
33
  Skip candidates explicitly locked to incompatible regions ("San Francisco only",
34
- "APAC only"). When location is ambiguous or unstated, include the candidate
35
- let the user decide.
34
+ "APAC only"). When location is ambiguous or unstated, include the candidate.
35
+ Let the user decide.
36
36
 
37
37
  ### 4. Skill alignment
38
38
 
@@ -46,8 +46,8 @@ non-traditional path (law, policy, academia → tech), AI/ML tool proficiency
46
46
  **Platform:** infrastructure / cloud / DevOps, architecture and system design,
47
47
  API design and shared services, performance / scalability / reliability.
48
48
 
49
- **Minimum bar:** at least 2 standard-relevant skills must be identifiable from
50
- the post. Skip candidates with purely non-technical profiles.
49
+ **Minimum bar:** the post must show at least 2 standard-relevant skills. Skip
50
+ candidates with purely non-technical profiles.
51
51
 
52
52
  ### 5. Experience level
53
53
 
@@ -68,16 +68,16 @@ block page):
68
68
  1. Increment the failure count:
69
69
  `node scripts/state.mjs failure increment {source}`.
70
70
  2. **Do not retry** the same source in this wake cycle.
71
- 3. Suspend after 3 consecutive failures skip during source selection. Retry
72
- suspended sources once every 7 days to detect recovery.
71
+ 3. Suspend after 3 consecutive failures. Skip a suspended source during source
72
+ selection. Retry suspended sources once every 7 days to detect recovery.
73
73
  4. Log the failure in `log.md` with HTTP status and error.
74
74
  5. Reset on success: `node scripts/state.mjs failure reset {source}`.
75
75
 
76
76
  ### Common failure patterns
77
77
 
78
- | Symptom | Likely cause |
79
- | ------------------------ | ------------------------------------------------------ |
80
- | 503 with HTML redirect | Corporate proxy blocking the domain (won't recover) |
81
- | 403 Forbidden | Auth required or automated requests blocked |
82
- | 429 Too Many Requests | Rate limited will recover; don't suspend permanently |
83
- | Empty response / timeout | Transient likely recovers next wake |
78
+ | Symptom | Likely cause |
79
+ | ------------------------ | -------------------------------------------------------- |
80
+ | 503 with HTML redirect | A corporate proxy blocks the domain. It will not recover |
81
+ | 403 Forbidden | The site needs auth, or it blocks automated requests |
82
+ | 429 Too Many Requests | Rate limited. It recovers. Do not suspend permanently |
83
+ | Empty response / timeout | Transient. It likely recovers next wake |
@@ -4,31 +4,31 @@ Reference for `req-scan` Step 2 (fetch & scan). One source per wake cycle.
4
4
 
5
5
  ## 1. Hacker News "Who Wants to Be Hired?"
6
6
 
7
- Monthly thread, posted on the 1st.
7
+ A monthly thread that appears on the 1st.
8
8
 
9
9
  ```text
10
10
  WebFetch URL: https://hn.algolia.com/api/v1/search?query=%22Who+wants+to+be+hired%22&tags=ask_hn&hitsPerPage=5
11
11
  ```
12
12
 
13
- The first hit whose title matches "Who wants to be hired?" with `created_at` in
14
- the current or previous month is the target thread.
13
+ The target thread is the first hit whose title matches "Who wants to be hired?"
14
+ and whose `created_at` falls in the current or previous month.
15
15
 
16
16
  ```text
17
17
  WebFetch URL: https://hn.algolia.com/api/v1/items/{objectID}
18
18
  ```
19
19
 
20
- `children[]` contains top-level comments each is one candidate. Parse the
21
- `text` field for:
20
+ `children[]` contains top-level comments. Each comment is one candidate. Parse
21
+ the `text` field for:
22
22
 
23
23
  - **Location** ("Location: New York", "NYC / Remote").
24
24
  - **Remote** ("Remote: Yes", "Open to remote").
25
25
  - **Skills** — tech stack, language/standard mentions.
26
26
  - **Experience** — years, role titles, past companies.
27
- - **Contact** — email (often obfuscated: "name [at] domain [dot] com").
27
+ - **Contact** — email, often obfuscated as "name [at] domain [dot] com".
28
28
  - **Resume / CV** — links to personal sites, GitHub, LinkedIn.
29
29
 
30
30
  **Cursor:** thread `objectID` plus the ID of the last processed child comment.
31
- **Rate:** no strict limit; one fetch per wake cycle.
31
+ **Rate:** no strict limit. One fetch per wake cycle.
32
32
 
33
33
  ## 2. GitHub Open to Work
34
34
 
@@ -40,7 +40,7 @@ node scripts/state.mjs failure increment mastodon_hachyderm
40
40
  node scripts/state.mjs failure reset github_open_to_work
41
41
  ```
42
42
 
43
- ## Logging
43
+ ## Logs
44
44
 
45
45
  ```bash
46
46
  node scripts/state.mjs log-wake github_open_to_work "Primary query: 'open to work' location:UK — 30 results, 2 new prospects"
@@ -1,8 +1,18 @@
1
1
  # Prospect Note Template
2
2
 
3
- Reference for `req-scan` Step 4. Save to `Knowledge/Prospects/{Name}.md`.
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