Prospex docs

Reason codes

Stable, language-independent tokens for why something happened in selection, research or outreach. Branch on the code. Show the text to a person.

State fields answer what happened. Reason codes answer why. The code is stable and language-independent.

Selection

CodeMeaning
manual_pin A person pinned this company to the top.
good_market_fit The offering assessment rated this company a strong or good fit.
recent_relevant_signal The list reported a relevant signal inside the project's signal window.
several_sources The list and a manual pin both contributed this company.
held_by_budget The cycle reached its research budget before this company's turn.
selected_for_research The cycle selected this company and spent a research place on it.

Beyond the first design: The original design lists the reasons a candidate waits, not the one it is chosen for. A cycle item stores selected, and a caller reading the cycle needs a code for the successful case too.

current_research_exists Research against the current offering already exists, so the cycle skipped it.

Beyond the first design: Emitted by ProspectCycleItem.reason == 'current_research'. It is the commonest reason a candidate is not in a cycle's spend, and without a code it reads as an unexplained omission.

no_current_source The list no longer contributes this company.

Beyond the first design: A signal ages out of the window, or the list drops the company from Core. Neither is an eligibility decision, so it cannot borrow manual_exclusion or not_a_fit.

dismissed A person dismissed this company from the project.

Beyond the first design: Prospect.disposition is a separate axis from selection state, and a dismissed row still appears in the feed with its history.

Eligibility

CodeMeaning
manual_exclusion A person excluded this company from the project.
relationship_excluded An account relationship the project excludes applies to this company.
outside_territory The company sits outside the project's territory.

Documented and reserved. No rule computes it: Prospect has no territory field, and the geographic focus it would have used was removed from the product in August 2026. It stays in the taxonomy so a later territory rule does not have to invent a second name for it.

not_a_fit The offering assessment rated this company a poor fit.
insufficient_information Too little is known about the company to assess it.
awaiting_external_qualification An external qualification job for this company is still open.

Beyond the first design: New with external executors. Without it an unassessed candidate ranks ahead of not_a_fit and would enter research and spend a unit before its qualifier answered.

awaiting_external_research An external research job for this company is still open.

Beyond the first design: The same hold one stage later. The cycle that dispatched the job has already finished, and the prospect stays out of the next one.

awaiting_external_outreach An external outreach job for this company is still open.

Beyond the first design: The same hold at the writing stage. Research is already accepted and ready. The copy is with the customer's worker, and a later cycle must not write a second opener for the same revision.

Identity

CodeMeaning
identity_confirmed The researched pages are this company.
identity_ambiguous The researched pages could belong to more than one company.
identity_mismatch The researched pages belong to a different company.
identity_unresolved The supplied identifiers did not resolve to one Prospex company.

Research

CodeMeaning
specific_angle_supported The evidence supports a specific, project-relevant angle.
no_defensible_angle Research finished without a defensible project-specific angle.
source_unavailable A cited or required public page could not be read.
research_failed Research stopped on an operational error.
research_stale The offering changed after this research was accepted.
research_needs_review Research stopped on an ambiguity a person or a later pass must resolve.

Beyond the first design: needs_review is one of the three qualification outcomes the product exposes everywhere else, and the original design's example list names only the other two.

evidence_unverified_external The cited pages were submitted by an external worker and not retrieved by Prospex.

Beyond the first design: The honest name for the gap this release leaves open. It rides on every externally accepted revision so a consumer can route those rows differently without parsing the caveat text.

Outreach

CodeMeaning
bundle_ready A verified outreach bundle is ready for approval.
bundle_needs_review The outreach bundle has validation findings to resolve before approval.
bundle_approved A named immutable bundle revision was approved.
unsupported_claim The copy makes a factual claim no submitted evidence supports.
new_angle_available A newer bundle exists on the current offering than the approved one.
ambiguous_identity The bundle rests on research whose company identity is not confirmed.

Beyond the first design: Emitted by outreach.validate_draft.

missing_copy The subject, opener or angle explanation is empty.

Beyond the first design: Emitted by outreach.validate_draft.

subject_too_long The subject exceeds 200 characters once its evidence marks are removed.

Beyond the first design: Emitted by outreach.validate_draft.

unknown_angle_type The angle type is not one of the five the product defines.

Beyond the first design: Emitted by outreach.validate_draft.

language_mismatch The copy is not in one of the project's three languages.

Beyond the first design: Emitted by outreach.validate_draft and by the model verification stage.

unknown_evidence The copy cites an evidence key the research revision does not contain.

Beyond the first design: Emitted by outreach.validate_draft.

untracked_claim A listed claim does not appear in the copy it is supposed to describe.

Beyond the first design: Emitted by outreach.validate_draft.

interpretation_as_fact The copy presents an interpretation as a sourced fact.

Beyond the first design: Emitted by outreach.validate_draft.

dishonest_date The copy calls something recent that no cited evidence dates inside six months.

Beyond the first design: Emitted by outreach.validate_draft.

verification_failed The verification stage rejected the copy for a reason outside the named set.

Beyond the first design: Emitted by outreach.validate_draft for an unrecognised verifier finding.

External stage

CodeMeaning
input_stale The submitted input fingerprint no longer matches the job's snapshot.
result_schema_invalid The submitted result did not match the documented result schema.
evidence_reference_missing A claim references evidence the submission does not contain.
job_expired The job reached its deadline unfinished.
external_worker_failed The external worker reported that it could not complete the job.
job_cancelled A customer cancelled the job explicitly.

Beyond the first design: cancelled is one of the eight documented job states and needs a code like the rest.

lease_expired A claim lease ran out and the job returned to the external queue.

Beyond the first design: Distinct from job_expired on purpose: the work is still available, and a worker that conflates the two stops polling.

job_allowance_full The project is at its outstanding-stage-job allowance, so no job was created.

Beyond the first design: The original design gives projects a visible limit on outstanding jobs but names no code for hitting it. Without one, a cycle that dispatched nothing looks identical to a cycle with no candidates.

job_not_open The job has reached a terminal state and takes no further submissions.

Beyond the first design: The refusal for a late submission, distinct from a stale fingerprint.

job_not_claimed A result was submitted for a job this worker does not hold a live claim on.

Beyond the first design: The claim lease decides who may submit, so a result arriving without one has to be refused for the lease to mean anything. Correcting a rejected result is the same two calls as the first attempt: claim it, then submit.

upstream_revision_changed The research or offering revision the job was built on is no longer current.

Beyond the first design: A submission can be structurally perfect and still target copy for research that has since been replaced. Rejecting it as input_stale would point the worker at the fingerprint rather than at the revision that actually moved.

identity_not_confirmed An external result declared a company ready whose identity is not confirmed.

Beyond the first design: The original design states the rule (an external qualification result cannot declare an ambiguously resolved company ready) without naming the code that refuses it.