-
Notifications
You must be signed in to change notification settings - Fork 0
Domain, Metro & Competency Entities
Relevant source files
- src-tauri/src/competency.rs
- src-tauri/src/domain.rs
- src-tauri/src/metro.rs
- src/lib/DomainPicker.svelte
- src/lib/domain.ts
- src/lib/styles/layout/domain-picker.css
Lodestar uses three primary reference entities to provide structure to unstructured Job Description (JD) data: Domains, Metros, and Competencies. These entities function as controlled vocabularies that allow the system to map free-text strings (from LLM extraction or scraping) into stable, user-defined categories for filtering and scoring.
The following diagram illustrates how raw text from a Job Description is resolved into structured Rust entities through normalization and alias matching.
Text Resolution Pipeline
flowchart LR
subgraph subGraph2 ["Code Entity Space"]
D["MetroIndex::resolve()"]
E["CompetencyIndex::matches()"]
F["Domain::parse_domain()"]
G["metros/new-york-city.md"]
H["competencies/react.md"]
I["domains/financial-services.md"]
end
subgraph subGraph1 ["Normalization (note::slugify)"]
A1["'nyc'"]
B1["'react-js'"]
C1["'fintech'"]
end
subgraph subGraph0 ["Natural Language Space"]
A["'NYC' (Location String)"]
B["'React.js' (Skill String)"]
C["'Fintech' (Domain String)"]
end
A --> A1
A1 --> D
B --> B1
B1 --> E
C --> C1
C1 --> F
D --> G
E --> H
F --> I
Sources: src-tauri/src/metro.rs#73-97src-tauri/src/competency.rs#55-59src-tauri/src/domain.rs#26-35
Domains represent industry or functional categories (e.g., "Financial Services", "Healthcare"). They are stored in the vault under the domains/ directory src-tauri/src/domain.rs#39
Each domain can be tagged with a screening status, which propagates to any company associated with that domain src-tauri/src/domain.rs#15
| Field | Type | Description |
|---|---|---|
slug |
String |
Unique identifier derived from filename src-tauri/src/domain.rs#11 |
name |
String |
Display name; defaults to slug if not in frontmatter src-tauri/src/domain.rs#31 |
aliases |
Vec<String> |
Alternative names for matching (e.g., "Fintech" for "Financial Services") src-tauri/src/domain.rs#13 |
screening |
Option<String> |
Can be "dealbreaker" or "caution"src-tauri/src/domain.rs#14-15
|
- Parsing: The
parse_domainfunction extracts YAML frontmatter usingsplit_frontmattersrc-tauri/src/domain.rs#26-35 - Screening Map: The
screening_mapfunction builds aHashMap<String, String>(slug -> status) used during company loading to flag undesirable industries src-tauri/src/domain.rs#66-76 - Frontend: The
DomainPicker.sveltecomponent provides a searchableComboboxfor assigning domains to companies, rendering them as removable chips src/lib/DomainPicker.svelte#26-38
Sources: src-tauri/src/domain.rs#9-35src/lib/domain.ts#3-8src/lib/DomainPicker.svelte#1-38
Metros represent geographic regions. The system uses a specialized MetroIndex to resolve ambiguous location strings (like "Norfolk, VA") into a single canonical metro slug src-tauri/src/metro.rs#1-2
The MetroIndex::resolve function implements a multi-step candidate search:
- Candidate Generation: Splits the input string by commas and treats both the whole string and parts as candidates src-tauri/src/metro.rs#74-76
- Normalization: Every candidate is passed through
note::slugifysrc-tauri/src/metro.rs#80 - Ambiguity Handling: If a slugified key (like
richmond) maps to multiple metros, it is skipped unless a more specific candidate resolves the conflict src-tauri/src/metro.rs#84-89 - Single Hit Rule: Returns a slug only if exactly one distinct metro is identified src-tauri/src/metro.rs#92-96
Metro Index Structure
classDiagram
class Metro {
+String slug
+String name
+String country
+Vec<String> aliases
}
class MetroIndex {
-HashMapUnsupported markdown: del> keys
+build(metros: &[Metro]) : MetroIndex
+resolve(location: &str) : Option<String>
}
MetroIndex -- Metro
Sources: src-tauri/src/metro.rs#10-15src-tauri/src/metro.rs#41-43src-tauri/src/metro.rs#73-97
Competencies define the skills and technologies the user tracks (e.g., "Ruby on Rails"). They are stored in competencies/*.mdsrc-tauri/src/competency.rs#34-35
Unlike Metros, which resolve to a single canonical slug, the CompetencyIndex is primarily used to validate if a skill mentioned in a JD exists in the user's "known" universe src-tauri/src/competency.rs#1-2
- Index Construction: The index flattens all names, slugs, and aliases into a single
HashSet<String>of slugified keys src-tauri/src/competency.rs#42-53 - Case-Insensitive Match: The
matchesfunction slugifies the input skill and checks for existence in the set src-tauri/src/competency.rs#55-58
| Input Term | Normalized Key | Match Target | Result |
|---|---|---|---|
| "a11y" | a11y |
aliases: ["a11y"] |
true |
| "Ruby on Rails" | ruby-on-rails |
name: "Ruby on Rails" |
true |
| "WCAG" | wcag |
aliases: ["WCAG"] |
true |
Sources: src-tauri/src/competency.rs#10-14src-tauri/src/competency.rs#37-39src-tauri/src/competency.rs#55-59
All three entities follow the Lodestar "Note" pattern:
- Storage: Markdown files in specific vault subdirectories (
/domains,/metros,/competencies) src-tauri/src/domain.rs#39src-tauri/src/metro.rs#37src-tauri/src/competency.rs#34 - Loading: Rust functions
list_domains,list_metros, andlist_competenciesusenote::read_notes_into bulk-parse files into structs src-tauri/src/domain.rs#57-61src-tauri/src/metro.rs#36-38src-tauri/src/competency.rs#33-35 - Tauri Commands: Domains are exposed to the frontend via the
list_domainscommand for use in UI pickers src-tauri/src/domain.rs#56-61
Sources: src-tauri/src/domain.rs#38-54src-tauri/src/metro.rs#25-34src-tauri/src/competency.rs#23-31