@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
@@ -1,20 +1,22 @@
1
1
  ---
2
2
  name: req-track
3
- description: Scan synced email threads for recruitment candidates, extract structured profiles, and create/update notes in Knowledge/Candidates/. Use when the user asks to track candidates, process recruitment emails, or update the hiring pipeline.
3
+ description: Scan synced email threads for recruitment candidates, extract structured profiles, and create/update notes in 2-Confidential/Candidates/. Use when the user asks to track candidates, process recruitment emails, or update the hiring pipeline.
4
4
  ---
5
5
 
6
6
  # Track Candidates
7
7
 
8
+ Write tier: `2-Confidential`
9
+ Frontmatter: candidate
10
+
8
11
  Scan synced email threads from `~/.cache/fit/outpost/apple_mail/` for
9
12
  recruitment candidates. Extract structured candidate profiles and create or
10
- update notes in `Knowledge/Candidates/`. Builds a local, searchable recruitment
11
- pipeline from scattered email threads.
13
+ update notes in `2-Confidential/Candidates/`.
12
14
 
13
15
  ## Trigger
14
16
 
15
17
  - The user asks to track, process, or update candidates.
16
18
  - The user asks about recruitment pipeline status.
17
- - After `sync-apple-mail` has pulled new threads.
19
+ - After `sync-apple-mail` pulls new threads.
18
20
 
19
21
  ## Prerequisites
20
22
 
@@ -29,38 +31,38 @@ pipeline from scattered email threads.
29
31
  - `~/.cache/fit/outpost/apple_mail/attachments/` — CV/resume attachments.
30
32
  - `~/.cache/fit/outpost/apple_calendar/*.json` — calendar events (for
31
33
  cross-source inference).
32
- - `Knowledge/Roles/*.md` — role/requisition files (check the `**Status:**`
33
- field: `open` for active roles, `closed` for historical).
34
+ - `2-Confidential/Roles/*.md` — role/requisition files (check the
35
+ `**Status:**` field: `open` for active roles, `closed` for historical).
34
36
  - `~/.cache/fit/outpost/state/graph_processed` — processed-file index (shared
35
37
  with `extract-entities`).
36
38
  - `~/.cache/fit/outpost/state/identity.md` — user identity for self-exclusion
37
- (written by the `person-identify` skill).
39
+ (the `person-identify` skill writes it).
38
40
 
39
41
  ## Outputs
40
42
 
41
- - `Knowledge/Candidates/{Full Name}/brief.md` — candidate profile note.
42
- - `Knowledge/Candidates/{Full Name}/CV.pdf` (or `CV.docx`) — local CV copy.
43
- - `Knowledge/Candidates/{Full Name}/headshot.jpeg` — candidate photo.
44
- - `Knowledge/Roles/*.md` — role files created/updated; the `**Status:**` field
45
- determines visibility (open/closed).
43
+ - `2-Confidential/Candidates/{Full Name}/brief.md` — candidate profile note.
44
+ - `2-Confidential/Candidates/{Full Name}/CV.pdf` (or `CV.docx`) — local CV.
45
+ - `2-Confidential/Candidates/{Full Name}/headshot.jpeg` — candidate photo.
46
+ - `2-Confidential/Roles/*.md` — role files created or updated. The
47
+ `**Status:**` field determines visibility (open/closed).
46
48
  - `~/.cache/fit/outpost/state/graph_processed` — updated with processed threads.
47
49
 
48
50
  <do_confirm_checklist goal="Verify candidate processing batch is complete and
49
51
  correct">
50
52
 
51
- - [ ] Required Info fields present on every brief (Title, Source, Status, First
52
- seen, Last activity, Channel).
53
- - [ ] Pipeline status reflects latest thread activity; timeline in chronological
54
- order.
55
- - [ ] Bidirectional links present (Candidate Org / Recruiter / Role /
56
- Project).
57
- - [ ] Role files synced Candidates tables rebuilt, stubs created for any
53
+ - [ ] Frontmatter (`type`, `created`, `updated`, `aliases`, registry `status`)
54
+ and the required Info fields present on every brief.
55
+ - [ ] Pipeline status reflects the latest thread activity. Timeline in
56
+ chronological order.
57
+ - [ ] Backlinks land on `2-Confidential` overlay notes, never on `3-Team`
58
+ notes.
59
+ - [ ] Role files synced. Candidates tables rebuilt. Stubs created for any
58
60
  unknown reqs.
59
61
  - [ ] CV and headshot copied into the candidate directory when available.
60
62
  - [ ] Skills tagged with agent-aligned engineering standard IDs from
61
63
  `bunx fit-pathway skill --list`.
62
64
  - [ ] Gender field populated only from explicit pronouns or titles.
63
- - [ ] No duplicate candidate notes; all processed threads marked in the state
65
+ - [ ] No duplicate candidate notes. All processed threads marked in the state
64
66
  file.
65
67
 
66
68
  </do_confirm_checklist>
@@ -72,108 +74,108 @@ Process **10 files per run**.
72
74
  ### 1. Load context and pick the batch
73
75
 
74
76
  Read the user's name, email, and domain from
75
- `~/.cache/fit/outpost/state/identity.md` (run the `person-identify` skill first
76
- if it is missing or stale). List new or changed source files:
77
+ `~/.cache/fit/outpost/state/identity.md`. Run the `person-identify` skill first
78
+ if that file is missing or stale. List new or changed source files:
77
79
 
78
80
  ```bash
79
81
  node .claude/skills/extract-entities/scripts/state.mjs check
80
82
  ```
81
83
 
82
- Filter the output to `apple_mail/*.md` only calendar files are not relevant
84
+ Filter the output to `apple_mail/*.md` only. Calendar files are not relevant
83
85
  here.
84
86
 
85
87
  ### 2. Build candidate, people, and org indexes
86
88
 
87
89
  ```bash
88
- ls -d Knowledge/Candidates/*/
90
+ ls -d 2-Confidential/Candidates/*/
89
91
  ```
90
92
 
91
93
  Read each existing brief's header (Name, Role, Source, Status) to build a mental
92
- index. Also scan `Knowledge/People/`, `Knowledge/Organizations/`, and
93
- `Knowledge/Projects/` to resolve recruiter names, agency orgs, and project
94
- links.
94
+ index. Also scan `3-Team/People/`, `3-Team/Organizations/`, and
95
+ `3-Team/Projects/` to resolve recruiter names, agency orgs, and project links.
95
96
 
96
- ### 3. Sync `Knowledge/Roles/`
97
+ ### 3. Sync `2-Confidential/Roles/`
97
98
 
98
- Role files are flat here; the `**Status:**` field is `open` or `closed`.
99
+ Role files are flat here. The `**Status:**` field is `open` or `closed`.
99
100
 
100
101
  1. Read each Role file's Info block to map Req → Role file path, Hiring manager,
101
102
  Domain lead, recruiter, Channel. Look up by filename substring so a req-less
102
- role stays findable: `ls Knowledge/Roles/ | grep "{partial_name_or_req}"`.
103
- 2. Find Reqs in candidate briefs missing a Role file:
104
- `rg "^\*\*Req:\*\*" Knowledge/Candidates/*/brief.md`. Check all Role files
105
- first; for a genuinely missing open role, create a stub with `**Status:**
106
- open` using the **Role file stub** in
107
- [references/templates.md](references/templates.md), then enrich:
108
- `rg "{req_number}" Knowledge/`.
109
- 3. Rebuild each **open** Role file's `## Candidates` table by scanning briefs:
110
- `rg -l "Req:.*{req_number}" Knowledge/Candidates/*/brief.md`. Use the **Role
111
- Candidates table** format from `references/templates.md`, newest first.
103
+ role stays findable:
104
+ `ls 2-Confidential/Roles/ | grep "{partial_name_or_req}"`.
105
+ 2. Find Reqs in candidate briefs that have no Role file:
106
+ `rg "^\*\*Req:\*\*" 2-Confidential/Candidates/*/brief.md`. Check all Role
107
+ files first. For a genuinely missing open role, create a stub with
108
+ `**Status:** open` from the **Role file stub** in
109
+ [references/templates.md](references/templates.md). Then enrich:
110
+ `rg "{req_number}" [0-9]-*/`.
111
+ 3. Scan briefs to rebuild each **open** Role file's `## Candidates` table:
112
+ `rg -l "Req:.*{req_number}" 2-Confidential/Candidates/*/brief.md`. Use the
113
+ **Role Candidates table** format from `references/templates.md`.
112
114
  4. If a Role file has a hiring manager but no domain lead, walk the
113
- `**Reports to:**` chain in `Knowledge/People/` to a VP or senior leader.
115
+ `**Reports to:**` chain in `3-Team/People/` to a VP or senior leader.
114
116
  5. When a role closes (filled, cancelled, or frozen 6+ months), set its
115
- `**Status:**` field to `closed` only on a clear signal.
117
+ `**Status:**` field to `closed`. Do this only on a clear signal.
116
118
 
117
119
  ### 4. Identify recruitment threads
118
120
 
119
121
  For each thread in the batch, decide whether it contains recruitment content
120
- using the signals in [references/signals.md](references/signals.md). Skip
122
+ with the signals in [references/signals.md](references/signals.md). Skip
121
123
  threads that match no signal.
122
124
 
123
125
  ### 5. Extract candidate data
124
126
 
125
- For each candidate found, populate the field map from
126
- [references/fields.md](references/fields.md). That reference covers field
127
- sources, the `Channel` rule, the hiring-manager / domain-lead resolution chain,
128
- gender rules, source/recruiter resolution, CV copying, and headshot discovery.
127
+ For each candidate you find, populate the field map from
128
+ [references/fields.md](references/fields.md). It covers field sources, the
129
+ `Channel` rule, the hiring-manager / domain-lead resolution chain, gender rules,
130
+ source/recruiter resolution, how to copy a CV, and headshot discovery.
129
131
 
130
132
  ### 6. Determine pipeline status
131
133
 
132
- Assign a status using the table and advancement signals in
133
- [references/statuses.md](references/statuses.md). Default to `new`. Read the
134
- full thread chronologically; the most recent signal wins.
134
+ Assign a status with the table and advancement signals in
135
+ [references/statuses.md](references/statuses.md). Default to `new`.
135
136
 
136
137
  ### 7. Build the pipeline timeline
137
138
 
138
- Extract a chronological timeline one `**{date}**: {event}` line per meaningful
139
- event, capturing who did what. Skip noise (signature blocks, disclaimers,
140
- forwarded headers).
139
+ Extract a chronological timeline. Write one `**{date}**: {event}` line per
140
+ meaningful event. Each line captures who did what. Skip noise (signature
141
+ blocks, disclaimers, forwarded headers).
141
142
 
142
143
  ### 8. Write or update the candidate note
143
144
 
144
- For **new** candidates, create `Knowledge/Candidates/{Full Name}/brief.md` from
145
- the **Candidate brief** template in
145
+ For **new** candidates, create `2-Confidential/Candidates/{Full Name}/brief.md`
146
+ from the **Candidate brief** template in
146
147
  [references/templates.md](references/templates.md). Place the **Extra Info
147
148
  fields** after `Last activity` in the order shown there. Add the **Optional
148
149
  sections** when data warrants. Omit `## CV` if no attachment.
149
150
 
150
- For **existing** candidates, apply targeted edits do not rewrite the file:
151
- update `Status` and `Last activity`, append Pipeline entries, fill in newly
152
- known Info fields, and add new Skills.
151
+ For **existing** candidates, apply targeted edits. Do not rewrite the file.
152
+ Update `Status`, `Last activity`, and the frontmatter `status` and `updated`
153
+ keys. Append Pipeline entries, fill in newly known Info fields, and add new
154
+ Skills.
153
155
 
154
156
  ### 9. Capture cross-candidate insights
155
157
 
156
- Update `Knowledge/Candidates/Insights.md` only when an observation is
157
- high-signal: candidate may suit a **different role**, is a **strong match** for
158
- a specific team or leader, a meaningful **comparison between candidates**, or a
159
- hiring trade-off needs to be **remembered across sessions**.
158
+ Update `2-Confidential/Candidates/Insights.md` only when an observation is
159
+ high-signal: the candidate may suit a **different role**, is a **strong match**
160
+ for a specific team or leader, a meaningful **comparison between candidates**,
161
+ or you must **remember a hiring trade-off across sessions**.
160
162
 
161
- Skip per-candidate status and generic strengths/weaknesses those belong on
163
+ Skip per-candidate status and generic strengths/weaknesses. Those belong on
162
164
  `brief.md`. Format: one bullet under `## Placement Notes` with
163
- `[[Candidates/Name/brief|Name]]` and relevant people/org backlinks.
165
+ `[[2-Confidential/Candidates/Name/brief|Name]]` and relevant backlinks.
164
166
 
165
- ### 10. Ensure bidirectional links
167
+ ### 10. Make sure links are bidirectional
166
168
 
167
169
  | If you add... | Then also add... |
168
170
  | ------------------------ | ---------------------------------------------------------- |
169
- | Candidate → Organization | Organization → Candidate |
170
- | Candidate → Recruiter | Recruiter → Candidate (in Activity) |
171
- | Candidate → Project | Project → Candidate (in People section) |
171
+ | Candidate → Organization | Organization overlay → Candidate |
172
+ | Candidate → Recruiter | Recruiter overlay → Candidate (in Activity) |
173
+ | Candidate → Project | Project overlay → Candidate |
172
174
  | Candidate → Role | Role → Candidate (in Candidates table — rebuilt by Step 3) |
173
175
 
174
- Use absolute paths: `[[Candidates/Name/brief|Name]]`,
175
- `[[Organizations/Agency]]`, `[[People/Recruiter]]`. Only add a backlink when the
176
- target note doesn't already reference the candidate.
176
+ Write each backlink on the entity's `2-Confidential` overlay note, never on
177
+ the `3-Team` note (rules and stub in `references/overlays.md`). Only add a
178
+ backlink when the overlay does not already reference the candidate.
177
179
 
178
180
  ### 11. Mark each thread processed
179
181
 
@@ -181,8 +183,8 @@ target note doesn't already reference the candidate.
181
183
  node .claude/skills/extract-entities/scripts/state.mjs update "{file_path}"
182
184
  ```
183
185
 
184
- Shares state with `extract-entities`, so the thread won't be re-scanned by
185
- either skill until it changes.
186
+ `req-track` and `extract-entities` share this state. Neither skill re-scans the
187
+ thread until it changes.
186
188
 
187
189
  ### 12. Tag skills against the standard
188
190
 
@@ -190,7 +192,5 @@ either skill until it changes.
190
192
  bunx fit-pathway skill --list
191
193
  ```
192
194
 
193
- Use agent-aligned engineering standard IDs (e.g. `data-integration`,
194
- `full_stack_development`, `architecture_and_design`) in the `## Skills` section
195
- instead of free-form tags. Flag any candidate with a CV attachment for
196
- `req-screen`.
195
+ Use agent-aligned engineering standard IDs in the `## Skills` section instead
196
+ of free-form tags. Flag any candidate with a CV attachment for `req-screen`.
@@ -1,6 +1,6 @@
1
1
  # Candidate Field Extraction
2
2
 
3
- Field map and resolution rules for Step 2 of `req-track`.
3
+ Field map and resolution rules for Step 5 of `req-track`.
4
4
 
5
5
  ## Fields
6
6
 
@@ -18,12 +18,12 @@ Field map and resolution rules for Step 2 of `req-track`.
18
18
  | Skills | Email body, CV | If available |
19
19
  | Gender | Pronouns or gendered titles only | If identifiable |
20
20
  | Summary | Email body, CV | Yes — 2-3 sentences |
21
- | Role | Internal requisition profile being hired against | If available |
21
+ | Role | Internal requisition profile you hire against | If available |
22
22
  | Req | Requisition ID from hiring system | If available |
23
23
  | Channel | `hr` or `vendor` — see below | Yes |
24
24
  | Hiring manager | Cross-source inference — see below | If determinable |
25
25
  | Domain lead | Resolved from hiring manager's reporting chain | If determinable |
26
- | Internal/External | Whether candidate is internal or external | If available |
26
+ | Internal/External | Whether the candidate is internal or external | If available |
27
27
  | Model | Engagement model (B2B, Direct Hire, etc.) | If available |
28
28
  | Current title | CV or email body | If available |
29
29
  | Email | Email body, CV, signature | If available |
@@ -33,58 +33,62 @@ Field map and resolution rules for Step 2 of `req-track`.
33
33
 
34
34
  ## Channel
35
35
 
36
- - `vendor` — Source links to an `[[Organizations/...]]` flagged as
36
+ - `vendor` — Source links to a `[[3-Team/Organizations/...]]` note flagged as
37
37
  vendor/partner (keywords: supplier, recruitment partner, contractor,
38
- staffing), or Req contains "via {vendor name}" rather than a system ID.
39
- - `hr` — candidate came through a hiring system (numeric Req), applied
40
- internally, or was submitted by an internal recruiter.
38
+ staffing). A Req that contains "via {vendor name}" instead of a system ID
39
+ also means `vendor`.
40
+ - `hr` the candidate came through a hiring system (numeric Req), or applied
41
+ internally, or an internal recruiter submitted the candidate.
41
42
 
42
43
  ## Hiring manager and domain lead — resolution chain
43
44
 
44
45
  Stop at the first match:
45
46
 
46
- 1. **Req-first inheritance** — search `Knowledge/Roles/` for a file matching the
47
- Req number or role description (use filename substring lookup for req-less
48
- roles); check the `**Status:**` field (open/closed), then inherit Hiring
49
- manager and Domain lead from the Role file.
47
+ 1. **Req-first inheritance** — search `2-Confidential/Roles/` for a file that
48
+ matches the Req number or the role description. Use a filename substring
49
+ lookup for req-less roles. Check the `**Status:**` field (open/closed). Then
50
+ inherit Hiring manager and Domain lead from the Role file.
50
51
  2. **Calendar inference** —
51
52
  `rg -l "{Candidate Name}" ~/.cache/fit/outpost/apple_calendar/`. The non-user
52
53
  organizer of an interview event is likely the hiring manager.
53
- 3. **Email inference** — internal To/CC recipients (besides the user)
54
- cross-checked against `Knowledge/People/`.
55
- 4. **Reporting chain** — read the hiring manager's `**Reports to:**` field; walk
54
+ 3. **Email inference** — cross-check internal To/CC recipients (besides the
55
+ user) against `3-Team/People/`.
56
+ 4. **Reporting chain** — read the hiring manager's `**Reports to:**` field. Walk
56
57
  up to a VP / senior leader for the domain lead.
57
58
  5. **Staffing project timeline** — search staffing notes for the candidate or
58
- vendor; surrounding context often names the manager.
59
+ vendor. The nearby context often names the manager.
59
60
 
60
61
  If none resolve, set `—` and revisit on the next cycle.
61
62
 
62
63
  ## Gender
63
64
 
64
- Record only when **explicitly stated**:
65
+ Record only when the source states it **explicitly**:
65
66
 
66
67
  - Pronouns from the recruiter ("she is available", "her CV attached")
67
68
  - Gendered titles ("Ms.", "Mrs.", "Mr.")
68
69
 
69
70
  Record as `Woman`, `Man`, or `—` (unknown). When uncertain, use `—`. **Never
70
- infer gender from names** — name-based inference is unreliable and culturally
71
- biased. The field supports aggregate diversity tracking; it has no bearing on
71
+ infer gender from names.** Name-based inference is unreliable and culturally
72
+ biased. The field lets you track diversity in aggregate. It has no bearing on
72
73
  hiring decisions, assessment criteria, or candidate visibility.
73
74
 
74
75
  ## Source and recruiter
75
76
 
76
- - Map sender email domain to an organization in `Knowledge/Organizations/`.
77
- - The person who sent or forwarded the profile is the recruiter link with
78
- `[[People/Name]]`.
79
- - Create the organization or recruiter notes if missing.
77
+ - Map the sender email domain to an organization in `3-Team/Organizations/`.
78
+ - The person who sent or forwarded the profile is the recruiter. Link with
79
+ `[[3-Team/People/Name]]`.
80
+ - Write recruiter-side and agency-side backlinks on the entity's
81
+ `2-Confidential` overlay note ([overlays.md](overlays.md)), never on the
82
+ `3-Team` note. When the `3-Team` note is missing, keep the name as plain
83
+ text. `extract-entities` creates team notes.
80
84
 
81
85
  ## CV attachment
82
86
 
83
87
  ```bash
84
88
  ls ~/.cache/fit/outpost/apple_mail/attachments/{thread_id}/
85
- mkdir -p "Knowledge/Candidates/{Full Name}"
89
+ mkdir -p "2-Confidential/Candidates/{Full Name}"
86
90
  cp "~/.cache/fit/outpost/apple_mail/attachments/{thread_id}/{file}" \
87
- "Knowledge/Candidates/{Full Name}/CV.pdf"
91
+ "2-Confidential/Candidates/{Full Name}/CV.pdf"
88
92
  ```
89
93
 
90
94
  Use `CV.pdf` (PDF) or `CV.docx` (Word). The `## CV` link is `./CV.pdf`.
@@ -108,9 +112,9 @@ Match by name fragment (case-insensitive). Prefer the Downloads match. Always
108
112
  write `headshot.jpeg`:
109
113
 
110
114
  ```bash
111
- cp "{src}" "Knowledge/Candidates/{Full Name}/headshot.jpeg"
115
+ cp "{src}" "2-Confidential/Candidates/{Full Name}/headshot.jpeg"
112
116
  # PNG → JPEG
113
- magick "{src}.png" "Knowledge/Candidates/{Full Name}/headshot.jpeg"
117
+ magick "{src}.png" "2-Confidential/Candidates/{Full Name}/headshot.jpeg"
114
118
  # HEIC → JPEG
115
- magick "{src}.heic" "Knowledge/Candidates/{Full Name}/headshot.jpeg"
119
+ magick "{src}.heic" "2-Confidential/Candidates/{Full Name}/headshot.jpeg"
116
120
  ```
@@ -0,0 +1,42 @@
1
+ # Overlay Notes
2
+
3
+ Backlink rules for Step 10 of `req-track`. `req-workday` and `req-assess`
4
+ follow the same rules.
5
+
6
+ ## The rule
7
+
8
+ A `3-Team` note must not link into `2-Confidential`. Write every People-side,
9
+ Organization-side, and Project-side backlink on the entity's `2-Confidential`
10
+ overlay note, never on the `3-Team` note. The overlay declares its wide note
11
+ with a one-way `canonical` link: double-quoted, tier-prefixed, and
12
+ vault-absolute. Create the overlay when it is missing. When the `3-Team` note
13
+ itself is missing, keep the name as plain text. `extract-entities` creates
14
+ team notes.
15
+
16
+ ## Overlay stub
17
+
18
+ File: `2-Confidential/People/{Name}.md` (or
19
+ `2-Confidential/Organizations/{Name}.md`, `2-Confidential/Projects/{Name}.md`
20
+ with the matching `type`).
21
+
22
+ ```markdown
23
+ ---
24
+ type: person
25
+ created: {YYYY-MM-DD}
26
+ updated: {YYYY-MM-DD}
27
+ aliases:
28
+ - "{Name} (recruitment)"
29
+ canonical: "[[3-Team/People/{Name}]]"
30
+ ---
31
+
32
+ # {Name}
33
+
34
+ ## Activity
35
+ - **{date}**: Presented [[2-Confidential/Candidates/{Candidate}/brief|{Candidate}]]
36
+ ```
37
+
38
+ ## Assessment prose
39
+
40
+ Interview-outcome and assessment prose about a candidate lives only in the
41
+ candidate's own folder. A wider note, and an overlay, record only that an
42
+ event happened.
@@ -1,7 +1,7 @@
1
1
  # Recruitment Signals
2
2
 
3
3
  Decide whether an email thread is recruitment-related. Skip threads that match
4
- no signal most email is not.
4
+ no signal. Most email is not recruitment-related.
5
5
 
6
6
  ## CV/resume attachments
7
7
 
@@ -10,25 +10,25 @@ no signal — most email is not.
10
10
 
11
11
  ## Recruiter sender domains
12
12
 
13
- Sender domain maps to an organization in `Knowledge/Organizations/` tagged as a
14
- recruitment agency. When no agencies are catalogued yet, treat these patterns as
15
- hints:
13
+ The sender domain maps to an organization in `3-Team/Organizations/` tagged
14
+ as a recruitment agency. When no agencies are catalogued yet, treat these
15
+ patterns as hints:
16
16
 
17
- - Multiple candidates presented by the same sender
18
- - Structured profile formatting (rate, availability, skills)
19
- - Forwarding candidate CVs on behalf of others
17
+ - The same sender presents multiple candidates
18
+ - The profile uses a structured format (rate, availability, skills)
19
+ - The sender forwards candidate CVs on behalf of others
20
20
 
21
21
  ## Profile presentation patterns
22
22
 
23
- Structured candidate descriptions containing:
23
+ Structured candidate descriptions that contain:
24
24
 
25
25
  - "Rate:" or rate/cost information
26
26
  - "Availability:" or notice period
27
27
  - "English:" or language level
28
28
  - "Location:" or country/city
29
- - Candidate name + role formatting (e.g. "Staff Software Engineer")
29
+ - Candidate name + role format (e.g. "Staff Software Engineer")
30
30
  - "years of experience" / "YoE"
31
- - Skills/tech stack listings
31
+ - Lists of skills or the tech stack
32
32
 
33
33
  ## Interview scheduling
34
34
 
@@ -38,5 +38,5 @@ Structured candidate descriptions containing:
38
38
 
39
39
  ## Follow-up on existing candidates
40
40
 
41
- A thread mentions a candidate already in `Knowledge/Candidates/` by name
42
- process it to update pipeline status.
41
+ A thread mentions a candidate already in `2-Confidential/Candidates/` by name.
42
+ Process it to update the pipeline status.
@@ -1,7 +1,8 @@
1
1
  # Pipeline Statuses
2
2
 
3
- Used by Step 3 of `req-track`. Default to `new` if no advancement signals are
4
- found. Read the full thread chronologically; the most recent signal wins.
3
+ Step 3 of `req-track` uses these statuses. Default to `new` if you find no
4
+ advancement signals. Read the full thread chronologically. The most recent
5
+ signal wins.
5
6
 
6
7
  ## Statuses
7
8
 
@@ -1,10 +1,10 @@
1
1
  # Templates
2
2
 
3
- Markdown templates used by `req-track` for Role files and Candidate briefs.
3
+ Backlink rules and the overlay stub live in [overlays.md](overlays.md).
4
4
 
5
5
  ## Role file stub
6
6
 
7
- Used by Step 0b when a Req appears on a candidate brief but no Role file exists.
7
+ Step 3 stub for a Req with no Role file, in `2-Confidential/Roles/`.
8
8
 
9
9
  ```markdown
10
10
  # {Title from candidate Req field}
@@ -36,23 +36,31 @@ Used by Step 0b when a Req appears on a candidate brief but no Role file exists.
36
36
 
37
37
  ## Role Candidates table
38
38
 
39
- Step 0b rebuilds this table on each Role file by scanning briefs:
39
+ Step 3 scans briefs and rebuilds this table on each Role file. Sort by First
40
+ seen, newest first:
40
41
 
41
42
  ```markdown
42
43
  ## Candidates
43
44
  | Candidate | Status | Channel | First seen |
44
45
  |---|---|---|---|
45
- | [[Candidates/{Name}/brief\|{Name}]] | {status} | {channel} | {date} |
46
+ | [[2-Confidential/Candidates/{Name}/brief\|{Name}]] | {status} | {channel} | {date} |
46
47
  ```
47
48
 
48
- Sort by First seen, newest first.
49
-
50
49
  ## Candidate brief
51
50
 
52
- Used by Step 5 for new candidates. File:
53
- `Knowledge/Candidates/{Full Name}/brief.md`.
51
+ Step 8 uses this template for new candidates. File:
52
+ `2-Confidential/Candidates/{Full Name}/brief.md`. Frontmatter `status` uses
53
+ the registry vocabulary; the body `**Status:**` keeps the pipeline stage.
54
54
 
55
55
  ```markdown
56
+ ---
57
+ type: candidate
58
+ created: {YYYY-MM-DD}
59
+ updated: {YYYY-MM-DD}
60
+ aliases: [{alternate spellings, or an empty list}]
61
+ status: {registry status: new / screening / interviewing / offer / hired / rejected / withdrawn}
62
+ ---
63
+
56
64
  # {Full Name}
57
65
 
58
66
  ## Info
@@ -62,7 +70,7 @@ Used by Step 5 for new candidates. File:
62
70
  **English:** {level or "—"}
63
71
  **Location:** {location or "—"}
64
72
  **Gender:** {Woman / Man / —}
65
- **Source:** [[Organizations/{Agency}]] via [[People/{Recruiter Name}]]
73
+ **Source:** [[3-Team/Organizations/{Agency}]] via [[3-Team/People/{Recruiter Name}]]
66
74
  **Status:** {pipeline status}
67
75
  **First seen:** {YYYY-MM-DD}
68
76
  **Last activity:** {YYYY-MM-DD}
@@ -75,11 +83,11 @@ Used by Step 5 for new candidates. File:
75
83
  - [CV.pdf](./CV.pdf)
76
84
 
77
85
  ## Connected to
78
- - [[Organizations/{Agency}]] — sourced by
79
- - [[People/{Recruiter}]] — recruiter
80
- - [[Roles/{Role filename without .md}]] — applied to
81
- - [[People/{Hiring manager}]] — hiring manager
82
- - [[People/{Domain lead}]] — domain lead
86
+ - [[3-Team/Organizations/{Agency}]] — sourced by
87
+ - [[3-Team/People/{Recruiter}]] — recruiter
88
+ - [[2-Confidential/Roles/{Role filename without .md}]] — applied to
89
+ - [[3-Team/People/{Hiring manager}]] — hiring manager
90
+ - [[3-Team/People/{Domain lead}]] — domain lead
83
91
 
84
92
  ## Pipeline
85
93
  - **{date}**: {event}
@@ -87,40 +95,33 @@ Used by Step 5 for new candidates. File:
87
95
  ## Skills
88
96
  {comma-separated agent-aligned engineering standard skill IDs}
89
97
 
90
- ## Interview Notes
91
- {omit section if no interviews yet}
92
-
93
98
  ## Notes
94
99
  {free-form observations — always present, even if empty}
95
100
  ```
96
101
 
97
- Omit `## CV` when no CV attachment exists.
98
-
99
102
  ## Extra Info fields
100
103
 
101
104
  Place after `Last activity`, in this order, only when known:
102
105
 
103
106
  ```markdown
104
107
  **Role:** {internal requisition profile, e.g. "Staff Engineer"}
105
- **Req:** [[Roles/{filename}|{req number}]] — {title}
108
+ **Req:** [[2-Confidential/Roles/{filename}|{req number}]] — {title}
106
109
  **Channel:** {hr / vendor}
107
- **Hiring manager:** {[[People/{name}]] or "—"}
108
- **Domain lead:** {[[People/{name}]] or "—"}
110
+ **Hiring manager:** {[[3-Team/People/{name}]] or "—"}
111
+ **Domain lead:** {[[3-Team/People/{name}]] or "—"}
109
112
  **Internal/External:** {Internal / External / External (Prior Worker)}
110
113
  **Model:** {engagement model, e.g. "B2B (via Agency) — conversion to FTE not possible"}
111
114
  **Current title:** {current job title and employer}
112
115
  **Email:** {personal or work email}
113
116
  **Phone:** {phone number}
114
117
  **LinkedIn:** {profile URL}
115
- **Also known as:** {alternate spellings}
118
+ **Also known as:** {alternate spellings — mirror them into `aliases`}
116
119
  ```
117
120
 
118
121
  For vendor-pipeline candidates the Req backlink uses
119
- `[[Roles/{filename}|Vendor]] — {description}`.
120
-
121
- ## Optional sections
122
+ `[[2-Confidential/Roles/{filename}|Vendor]] — {description}`.
122
123
 
123
- Add between `## Skills` and `## Notes` when data is rich enough, in this order:
124
+ Add optional sections between `## Skills` and `## Notes`, in this order:
124
125
  `## Education`, `## Certifications`, `## Work History`, `## Key Facts`,
125
126
  `## Interview Notes` (`### YYYY-MM-DD — {description}` per interview).
126
127