Jerlshin's picture
defect fix career
f0894e2
Raw
History Blame Contribute Delete
9.73 kB
from __future__ import annotations
from collections.abc import Mapping
from enum import Enum
from types import MappingProxyType
from redstack.domain.candidate.quality import FeatureLayout, FeatureLayoutEntry
from redstack.domain.ids import FeatureIndex
LAYOUT_VERSION = "1.1.0"
SCHEMA_VERSION = LAYOUT_VERSION
class SourceSlice(str, Enum):
"""The ``CandidateRepresentation`` slice (or raw origin) a feature derives
from. Recorded per entry for traceability; serialized by value."""
IDENTITY = "identity"
LOGISTICS = "logistics"
CAREER = "career"
EDUCATION = "education"
CREDIBILITY = "credibility"
SEMANTIC = "semantic"
BEHAVIORAL = "behavioral"
INTEGRITY = "integrity"
DERIVED = "derived"
_COMPETENCY_GROUPS: tuple[str, ...] = (
"retr", "rank", "recsys", "ir", "nlp", "llm", "mle", "mlops", "eval",
)
_COMPETENCY_SUFFIXES: tuple[tuple[str, SourceSlice], ...] = (
("claimed", SourceSlice.CREDIBILITY),
("trust", SourceSlice.CREDIBILITY),
("in_career", SourceSlice.CREDIBILITY),
("semantic", SourceSlice.SEMANTIC),
("competency", SourceSlice.CREDIBILITY),
)
_BHV_NAMES: tuple[str, ...] = (
"availability", "recruitability", "response_reliability", "interview_reliability",
"market_demand", "market_momentum", "engagement_velocity", "candidate_temperature",
"recruiter_attractiveness", "hiring_probability_proxy", "freshness", "trust",
"signal_consistency", "behavioral_confidence", "behavioral_risk",
)
_CAREER_NAMES: tuple[str, ...] = (
"progression_quality", "stability", "promotion_velocity", "title_inflation",
"role_consistency", "experience_authenticity", "company_progression",
"product_company_density", "consulting_density", "technical_depth",
"hands_on_engineering", "research_only", "management_only", "production_exposure",
)
_HP_NAMES: tuple[str, ...] = (
"timeline_impossible", "skill_time_contradiction", "employment_overlap",
"title_seniority_anomaly", "education_career_anomaly", "salary_anomaly",
"experience_inflation", "keyword_stuffing", "behavioral_inconsistency",
"signal_impossibility", "identity_anomaly", "composite",
)
_JD_NAMES: tuple[str, ...] = (
"retrieval_ranking", "production_ml", "product_company", "shipping_mentality",
"eval_framework", "hybrid_retrieval", "keyword_only", "consulting_only",
"title_chaser", "pure_researcher", "framework_enthusiast", "inactive",
)
_UNIT = (0.0, 1.0)
_YEARS = (0.0, 50.0)
def _build_spec() -> tuple[tuple[str, str, SourceSlice, float, float], ...]:
"""Build the master ordered spec: ``(group, name, source_slice, lo, hi)``.
Ordering follows the dependency graph (Feature Layer Part 7): primitives →
competency → supporting → logistics → engagement → behavioral → derived
career → consistency/risk → honeypot → latents. Latents/composites trail
their constituents so the fixed extraction order is topological.
"""
rows: list[tuple[str, str, SourceSlice, float, float]] = []
# 1. Identity (metadata; structural, no scoring weight but holds a slot).
rows.append(("id", "is_valid_id", SourceSlice.IDENTITY, *_UNIT))
# 2. Geography.
for name in ("hub_match", "india_relocatable", "outside_india_no_sponsor"):
rows.append(("geo", name, SourceSlice.LOGISTICS, *_UNIT))
# 3. Experience.
rows.append(("exp", "years", SourceSlice.CAREER, *_YEARS))
rows.append(("exp", "in_band", SourceSlice.CAREER, *_UNIT))
rows.append(("exp", "derived_vs_stated_gap", SourceSlice.CAREER, *_UNIT))
# 4. Seniority.
rows.append(("sen", "level", SourceSlice.CAREER, *_UNIT))
rows.append(("sen", "title_vs_scope_gap", SourceSlice.CAREER, *_UNIT))
# 5. Education.
for name in ("tier_score", "field_relevance", "timeline_valid"):
rows.append(("edu", name, SourceSlice.EDUCATION, *_UNIT))
# 6. Company.
for name in ("scale_progression", "industry_relevance"):
rows.append(("co", name, SourceSlice.CAREER, *_UNIT))
# 7. Product-vs-Service.
for name in ("product_density", "consulting_density", "product_recent"):
rows.append(("pvs", name, SourceSlice.CAREER, *_UNIT))
# 8–16. Competency groups.
for group in _COMPETENCY_GROUPS:
for suffix, slice_ in _COMPETENCY_SUFFIXES:
rows.append((group, suffix, slice_, *_UNIT))
# 17. Open source.
for name in ("activity", "has_external_validation"):
rows.append(("oss", name, SourceSlice.CREDIBILITY, *_UNIT))
# 18. Leadership.
for name in ("scope", "management_only"):
rows.append(("lead", name, SourceSlice.CAREER, *_UNIT))
# 19. Startup fit.
for name in ("small_co_experience", "shipping_signal"):
rows.append(("startup", name, SourceSlice.CAREER, *_UNIT))
# 20. Founding engineer.
for name in ("ownership", "breadth"):
rows.append(("found", name, SourceSlice.CAREER, *_UNIT))
# 21. Availability.
for name in ("open", "recency", "available"):
rows.append(("avail", name, SourceSlice.BEHAVIORAL, *_UNIT))
# 22. Engagement.
for name in ("passive", "active", "network", "velocity"):
rows.append(("eng", name, SourceSlice.BEHAVIORAL, *_UNIT))
# 23. Responsiveness.
for name in ("rate", "speed", "reliable"):
rows.append(("resp", name, SourceSlice.BEHAVIORAL, *_UNIT))
# 24. Salary alignment.
for name in ("fit", "is_inverted"):
rows.append(("sal", name, SourceSlice.LOGISTICS, *_UNIT))
# 25. Relocation.
for name in ("willing", "needed"):
rows.append(("reloc", name, SourceSlice.LOGISTICS, *_UNIT))
# 26. Notice period.
for name in ("fit", "over_30"):
rows.append(("notice", name, SourceSlice.LOGISTICS, *_UNIT))
# 27. Behavioral composites.
for name in _BHV_NAMES:
rows.append(("bhv", name, SourceSlice.BEHAVIORAL, *_UNIT))
# Part 3. Career intelligence.
for name in _CAREER_NAMES:
rows.append(("career", name, SourceSlice.CAREER, *_UNIT))
# 29. Consistency.
for name in ("title_role_coherence", "skill_role_coherence", "summary_coherence"):
rows.append(("cons", name, SourceSlice.CREDIBILITY, *_UNIT))
# 28. Risk.
for name in ("uncertainty", "contradiction", "confidence"):
rows.append(("risk", name, SourceSlice.INTEGRITY, *_UNIT))
# 30. Honeypot detectors + composite.
for name in _HP_NAMES:
rows.append(("hp", name, SourceSlice.INTEGRITY, *_UNIT))
# Part 2. JD latents (composite — trail every constituent).
for name in _JD_NAMES:
rows.append(("jd", name, SourceSlice.DERIVED, *_UNIT))
return tuple(rows)
_SPEC = _build_spec()
def _build_layout() -> FeatureLayout:
entries = tuple(
FeatureLayoutEntry(
name=f"{group}.{name}",
index=FeatureIndex(position),
source_slice=slice_.value,
lower=lower,
upper=upper,
)
for position, (group, name, slice_, lower, upper) in enumerate(_SPEC)
)
return FeatureLayout(entries=entries, layout_version=LAYOUT_VERSION)
# The frozen, validated layout object (contiguity / uniqueness enforced by the
# domain ``FeatureLayout`` validator at import time).
FEATURE_LAYOUT: FeatureLayout = _build_layout()
# Dimensionality of the CQV value vector.
DIM: int = FEATURE_LAYOUT.dim
# Ordered feature-id tuple, aligned 1:1 with the ``(N, D)`` value columns.
FEATURE_IDS: tuple[str, ...] = tuple(entry.name for entry in FEATURE_LAYOUT.entries)
# id → index (the binding the registry exposes; pinned here).
INDEX_OF: Mapping[str, FeatureIndex] = MappingProxyType(
{entry.name: entry.index for entry in FEATURE_LAYOUT.entries}
)
ID_AT: Mapping[FeatureIndex, str] = MappingProxyType(
{entry.index: entry.name for entry in FEATURE_LAYOUT.entries}
)
def _group_of(feature_id: str) -> str:
return feature_id.split(".", 1)[0]
# Group order = first-appearance order in the value layout; the column order of
# the ``(N, num_groups)`` confidence matrix.
def _build_group_order() -> tuple[str, ...]:
seen: list[str] = []
seen_set: set[str] = set()
for feature_id in FEATURE_IDS:
group = _group_of(feature_id)
if group not in seen_set:
seen_set.add(group)
seen.append(group)
return tuple(seen)
GROUP_ORDER: tuple[str, ...] = _build_group_order()
NUM_GROUPS: int = len(GROUP_ORDER)
GROUP_COLUMN: Mapping[str, int] = MappingProxyType(
{group: column for column, group in enumerate(GROUP_ORDER)}
)
def _build_group_members() -> Mapping[str, tuple[str, ...]]:
members: dict[str, list[str]] = {group: [] for group in GROUP_ORDER}
for feature_id in FEATURE_IDS:
members[_group_of(feature_id)].append(feature_id)
return MappingProxyType({g: tuple(ids) for g, ids in members.items()})
# group → ordered feature ids in that group.
GROUP_MEMBERS: Mapping[str, tuple[str, ...]] = _build_group_members()
def index_of(feature_id: str) -> FeatureIndex:
"""Return the CQV index of ``feature_id``; raise ``KeyError`` if unknown."""
return INDEX_OF[feature_id]
def group_of(feature_id: str) -> str:
"""Return the group prefix of a ``"<group>.<name>"`` feature id."""
return _group_of(feature_id)
def group_column(group: str) -> int:
"""Return the confidence-matrix column index of ``group``."""
return GROUP_COLUMN[group]
__all__: tuple[str, ...] = (
"DIM",
"FEATURE_IDS",
"FEATURE_LAYOUT",
"GROUP_COLUMN",
"GROUP_MEMBERS",
"GROUP_ORDER",
"ID_AT",
"INDEX_OF",
"LAYOUT_VERSION",
"NUM_GROUPS",
"SCHEMA_VERSION",
"SourceSlice",
"group_column",
"group_of",
"index_of",
)