FocusIndividual
A focus individual is a person profiled as part of a project — a named executive with scores, location, career history and a set of narrative profile sections.
Purpose
Section titled “Purpose”Projects identify people worth examining: potential hires, succession candidates, or figures shaping a market. Each row holds both structured signals (four numeric scores, geography, experience tags) and long-form profile content stored as JSON. Most of the table is profile material added over successive releases as the individual profile pages grew.
Focus individuals are imported from research, edited by staff, and surfaced across the client app.
app/Services/FocusIndividualImporter.php— imports profiles into a project.app/Services/ProjectService.php— merges them into the aggregated report list as pseudo-reports oftype: 'focus-individual'.app/Services/SuccessionPipelineService.phpandSuccessionPipelineWriter.php— promote individuals into succession pipelines.app/Services/Voice/Tools/GetFocusIndividualsBySignal.php— voice-agent lookup by recruitment signal.app/Filament/Resources/FocusIndividualResource.phpandProjectResource/RelationManagers/FocusIndividualsRelationManager.php— staff editing.
Relationships
Section titled “Relationships”| Relation | Type | Related model |
|---|---|---|
project |
belongsTo |
Project |
avatar |
belongsTo |
Attachment via avatar_id |
profile |
belongsTo |
Attachment via profile_id |
The inverse is Project::focusIndividuals() (hasMany).
Data shape
Section titled “Data shape”Table: focus_individuals.
Identity
Section titled “Identity”| Column | Type | Notes |
|---|---|---|
id |
uuid |
Primary key |
project_id |
uuid |
FK to projects, cascade delete |
name |
string |
Indexed |
position |
string |
Nullable |
company |
string |
Nullable |
linkedin |
string |
Nullable |
industry |
string |
Nullable |
bio |
text |
Nullable |
avatar_id |
uuid |
Nullable FK to attachments, null on delete |
profile_id |
uuid |
Nullable FK to attachments, null on delete |
created_at, updated_at |
timestamp |
Scores and location
Section titled “Scores and location”| Column | Type | Notes |
|---|---|---|
divergence |
tinyint |
Nullable |
performance |
tinyint |
Nullable |
potential |
tinyint |
Nullable |
agency |
tinyint |
Nullable |
country |
string(3) |
Nullable; country code |
city |
string |
Nullable |
latitude |
decimal(10,7) |
Nullable, cast decimal:7 |
longitude |
decimal(10,7) |
Nullable, cast decimal:7 |
Profile content (all json, all nullable, cast to array)
Section titled “Profile content (all json, all nullable, cast to array)”| Column | Notes |
|---|---|
recruitment_signals |
List of signal strings |
vertical_experience |
Sector tags |
functional_experience |
Function tags |
career_history |
Companies with nested roles and dates |
education |
Institutions and degrees |
highlights |
Keyed narrative bullet groups |
career_mobility |
Rating plus narrative |
suitability |
Titled narrative blocks |
unique_strengths |
List of strings |
bibliography |
Sources with optional URLs |
proximity |
Reference person, base and company links |
thought_leadership |
Publications and speaking roles |
career_progression is a nullable text column, not JSON.