An open-source, provenance-first recruiting intelligence framework. Not an ATS, not a CRM, not a CV matcher.
This document is the deep map. For the philosophical premises see docs/PHILOSOPHY.md. For onboarding see QUICKSTART.md. For per-module deep dives see docs/.
Recruiting is probabilistic organizational reasoning under uncertainty. Signals are noisy, reviewers disagree, evidence ages, organizations differ, and institutional learning compounds. The framework treats every claim as a confidence-weighted signal with full provenance so reasoning is explainable, auditable, and replayable end-to-end.
- ❌ An ATS or pipeline tool
- ❌ A recruiting CRM
- ❌ A CV matcher
- ❌ An interview summarizer
- ❌ A chatbot recruiter
- ✅ A multi-agent recruiting cognition framework
- ✅ A provenance-first reasoning infrastructure
- ✅ A deterministic intelligence operations platform
- ✅ A plugin-oriented, event-driven foundation for higher-order recruiting intelligence products
The framework ships as a single workspace package @workspace/framework with one subpath export per concern.
lib/framework/src/
ingestion/ Evidence intake. Adapters, normalization, conflicts,
reliability, candidate + organization pipelines,
audit, provenance, payload hashing.
cognition/ Cross-agent synthesis. Disagreement preservation,
uncertainty fusion, reconciliation, influence
engine, cross-agent memory.
organization_intelligence/ Org graph context, fit engine, organization-scoped
memory and agents.
evaluation/ Calibration, longitudinal outcomes, learning,
evaluation reports, cognition benchmark integration.
intelligence_operations/ Investigations, cases, hypotheses, evidence
handling, adversarial probes, consensus, workflow.
collaboration/ Reviewer coordination, consensus with dissent
preservation, override handling.
security/ Identity, multi-tenant isolation, capabilities,
append-only audit, sensitive evidence redaction,
session integrity, security benchmark suite.
agents/ Specialized agents incl. flagship dossier agents
(Bayesian, trajectory, contradiction, dossier).
skills/ Reusable cognition units (declared inputs → outputs).
providers/ LLM provider abstraction (OpenAI, Anthropic, custom).
memory/ Scoped persistent memory (candidate / org / role / global).
orchestrator/ Event-driven broker. Only inter-module message path.
workflows/ Declarative reasoning workflows. Not pipeline stages.
candidate_graph/ Trajectory-aware candidate graph.
organization_graph/ Org / role / team graph with calibration history.
reports/ Auditable synthesised intelligence briefs.
registry/ Composite seam wiring modules together.
benchmarks/ Cognition corpus (10 deterministic scenarios)
+ harness. Snapshot: tests/cognitive-smoke/snapshot.json.
shared/ Primitives: Signal, Provenance, FrameworkEvent,
ScopeKind, deterministic id helpers.
artifacts/
api-server/ Express 5 control plane. Thin HTTP surface over
FrameworkRegistry. Routes generated against the
same Zod schemas the clients consume.
console/ React + Vite + Tailwind + shadcn operator UI.
One section per framework module.
mockup-sandbox/ Component preview server (development only).
lib/
api-spec/ OpenAPI contract — single source of truth.
api-client-react/ Generated React Query hooks (do not edit).
api-zod/ Generated Zod schemas (do not edit).
db/ Drizzle schemas; runtime defaults to in-memory.
scripts/ benchmark:cognition, benchmark:cognition:update,
test:cognitive-smoke runners.
- Modular. Each module has its own subpath export. Nothing imports from a sibling implementation directly; everything flows through public surfaces.
- Open-source friendly. No proprietary lock-in. Provider, memory, and graph backends are swappable behind small interfaces.
- Plugin-oriented. Agents, skills, providers, and workflows register into typed registries at boot. Third parties can ship plugins as separate packages.
- Agent-native. The unit of cognition is the
Agent, not the request handler. Agents composeSkillsoverMemoryviaProviders. - Event-driven. Inter-agent coordination flows through
FrameworkEvents on theOrchestrator. No agent-to-agent coupling. - Workflow-ready. Workflows are declarative reasoning programs triggered by events. They orchestrate skills, NOT recruiting stages.
- Scalable. The in-process orchestrator can be swapped for an external broker (NATS, Kafka, Postgres LISTEN/NOTIFY) without touching agent/skill code.
- Observable. Every signal carries
Provenance. Every report carries theSignal[]it was derived from. Every provider call is logged.
Every artifact that crosses a module boundary uses these primitives:
Signal<T>— a typed observation wrapped in(value, confidence, provenance).Confidence—∈ [0, 1]. Not optional. Not implicit. Not a label.Provenance—producedBy,producedAt,rationale,derivedFrom[]. Recursive lineage.FrameworkEvent— the only inter-module message shape.ScopeKind—candidate | organization | role | global.
No claim exists in the system without a confidence and a provenance trail.
┌─────────────┐
inputs ─► ingestion │── normalized signals with reliability + provenance
└──────┬──────┘
▼
┌─────────────┐ ┌───────────────────────┐
│ cognition │◄────────┤ memory │
└──────┬──────┘ └───────────┬───────────┘
│ ▲
▼ │
┌──────────────────────────────┐ │
│ organization_intelligence │ │
│ (fit engine + org graph) │ │
└──────┬───────────────────────┘ │
▼ │
┌──────────────┐ outcomes ┌───────┴─────────┐
│ reports │──────────► │ evaluation │
└──────┬───────┘ └─────────────────┘
│
▼
┌──────────────┐
│ intelligence │ investigations · hypotheses · adversarial probes
│ operations │
└──────┬───────┘
▼
┌──────────────┐
│ collaboration│ reviewers · consensus · dissent · override
└──────┬───────┘
▼
┌──────────────────────────────────────────────┐
│ security — every action passes through it │
└──────────────────────────────────────────────┘
- Raw evidence enters via
ingestion.gateway. - The gateway routes the payload to the right adapter (by source kind).
- The adapter:
- normalizes the payload into typed signals,
- declares a reliability profile and computes per-event reliability,
- emits provenance referencing the adapter id + payload hash,
- writes an ingestion audit entry,
- detects and records conflicts with existing memory rather than overwriting.
- The candidate / organization pipeline emits the signals through the orchestrator.
See docs/ingestion/.
- Signals arrive at the cognition layer.
- Multiple agents produce overlapping signals; disagreement is preserved, not averaged.
uncertainty_fusioncombines confidences across overlapping signals using documented rules per signal kind.disagreementkeepsDisagreementRecords for inspection.reconciliationis invoked only when conflict is structural (supersession by freshness, retraction, reliability).influence_enginerecords which upstream agent influenced which downstream signal.- The synthesized output is itself a
Signal[]with full provenance back to ingested evidence.
See docs/cognition/.
- Synthesized signals reach
organization_intelligence.fit_engine. - The fit engine reads:
- the candidate's subgraph from
candidate_graph, - the organization's subgraph from
organization_graph, - organization-scoped calibration from
evaluation.
- the candidate's subgraph from
- Fit is computed as a function of both graphs.
- Output: a confidence-weighted assessment with supporting subgraph, identified risks, identified leverage moments, and a recommended next action.
See docs/organization-intelligence/.
- Outcomes are recorded post-hoc — "what actually happened" with the producer of that observation.
- For each signal that contributed to the original decision,
learning.tscomputes a calibration delta. - The delta is applied to the producer's weighting profile (per-reviewer-per-role).
- The update is itself a recorded artifact with provenance back to the outcome.
- Subsequent fit assessments consume the updated weights deterministically.
See docs/evaluation/.
- An investigation is opened (by automation or by a reviewer) when fit confidence is low, dissent is high, or adversarial probes warrant deeper inspection.
- The investigation collects hypotheses, supporting + countering evidence, and adversarial probes.
- Consensus is attempted via
consensus.ts— but dissent is preserved as a first-class artifact, not collapsed. - The investigation closes with an outcome that flows back into evaluation.
See docs/collaboration/.
- Reviewers participate as identities with capability bundles, not RBAC roles.
- Disagreement is structural. Two reviewers producing conflicting signals do not "resolve to" one position; both survive.
- Overrides are structured events with the previous recommendation, the new recommendation, and the justification.
- Every reviewer action passes through the security layer for capability + session validation.
The security layer is the choke point. Every action that mutates state, reads sensitive evidence, or crosses an organization boundary passes through AccessDecisionEngine.decide, which evaluates six ordered rules:
reviewer_identity— reviewer exists, reviewer.org matches request.org.organization_boundary— resource.org matches request.org, or resource is in an explicitglobal_demo/global_benchmarkcarve-out.capability— required capability derived server-side fromaction; reviewer holds it.visibility— resource's current visibility level admits the caller.escalation_restriction— escalate actions requireescalate_case(capability-based, no reviewer-type back door).session_integrity— for writes / privileged actions, validated against the session integrity layer.
Audit entries are append-only, per-org monotonic, and deep-frozen on append. The 8-scenario security benchmark runs through the audited checkAccess path.
See docs/security/ and SECURITY.md.
Two suites, both deterministic:
- Cognition — scenarios in
lib/framework/src/benchmarks/corpus.ts, harness inlib/framework/src/benchmarks/, runnerscripts/src/benchmark-cognition.ts, committed snapshot attests/cognitive-smoke/snapshot.json. 10 scenarios, 5 guard categories (determinism, provenance, calibration, snapshot, mutation guards). - Security (
lib/framework/src/security/benchmarks.ts) — 8 denial scenarios, all routed through the audited access engine, all asserting non-emptyauditEntryIds.
The cognition snapshot is committed in-tree at tests/cognitive-smoke/snapshot.json. Updates are explicit (pnpm benchmark:cognition:update) and require PR justification.
See docs/benchmarks/ and benchmarks/README.md.
Every artifact is a node in a directed acyclic provenance graph rooted at ingested evidence.
Signal { value, confidence, provenance }
Provenance { producedBy, producedAt, rationale, derivedFrom: ProvenanceRef[] }
A producer is one of: AgentId | ReviewerId | IngestionAdapterId | SystemRef. Anonymous producers are forbidden. Provenance is never erased during reconciliation — the reconciliation itself becomes a new producer, with the original producer preserved on the original signal.
See docs/provenance/.
The framework's reasoning is a pure function of (world, inputs, now):
- Time is always an argument. No
Date.now()inside cognition. - No
Math.random()inside cognition. IDs derive fromfnv1a+makeId(...parts). - Iteration order is stable. Maps are populated and serialized canonically.
- Snapshots are committed; the benchmark suite fails CI on drift.
Given the inputs + the framework version, any contributor can reproduce the framework's state byte-for-byte. The audit trail is part of the reproducibility contract — sequence numbers match across runs.
Memory is the moat. Every agent insight, every reviewer observation, every reconciliation is persisted as a MemoryEntry scoped to a subject (candidate | organization | role | global). Backends are pluggable; the reference implementation is in-process for development, Postgres + pgvector is on the roadmap.
The memory layer respects the security layer's visibility rules — there is no read path that bypasses access decisions.
The HTTP contract (lib/api-spec/openapi.yaml) is the single source of truth. From it:
- React Query hooks are generated into
lib/api-client-react/src/generated/. - Zod schemas are generated into
lib/api-zod/src/generated/. - The API server uses the same Zod schemas to validate inputs and outputs.
The generated files are never hand-edited. Adding an endpoint means editing the OpenAPI spec, regenerating, and implementing the route against the generated zod schema.
api-server is a thin HTTP surface over FrameworkRegistry. The route map roughly mirrors the module map:
GET /api/system/overview— telemetry counts across every moduleGET /api/registry/{agents,skills,providers,workflows}— registry introspectionGET /api/memory/entries— persistent memory tailGET /api/graph/{candidate,organization}— graph snapshotsGET /api/reports— synthesised reports with evidenceGET /api/ingestion/*— recent ingest, conflicts, reliability profilesGET /api/cognition/*— synthesis, disagreement, fusion decisionsGET /api/evaluation/*— calibration, outcomesGET /api/operations/*— investigations, hypothesesGET /api/collaboration/*— consensus records, overridesGET /api/security/snapshot/{orgId}— org boundaries, reviewers, decisions, audit, benchmarksPOST /api/security/check-access— programmatic access checks
The console (artifacts/console) is the operator face. One section per framework module; data is read through the generated hooks; confidence + provenance are first-class visual primitives.
Pages: Overview · Ingestion · Collaboration · Security · Intelligence · Cognition · Organization · Evaluation · Operations · Benchmarks · Agents · Skills · Providers · Workflows · Memory · Candidate Graph · Organization Graph · Reports.
A plugin is any package that registers into the framework registries at boot:
import { registry } from "@workspace/framework";
const reg = registry.createFrameworkRegistry();
reg.agents.register(myTrajectoryAgent);
reg.skills.register(myTrajectorySkill);
reg.providers.register(myAnthropicProvider);
reg.workflows.register(myOnboardingWorkflow);HTTP exposure, console rendering, audit wiring, and benchmark eligibility all pick up the new component automatically.
Pipeline stages encode the workflow of a recruiter, not the cognition of hiring. The framework deliberately stays one layer below — products built on top can implement their own stages by subscribing to framework events. The framework reasons about people and organizations.
- docs/PHILOSOPHY.md — why the framework is shaped this way.
- QUICKSTART.md — install and run.
- CONTRIBUTING.md — invariants you must preserve.
- SECURITY.md — security posture, disclosure, guarantees.
- ROADMAP.md — what is and isn't planned.
- GOVERNANCE.md — how the project is run.