Precon Opportunity Intake Workflow
Summary
Opportunity intake turns source messages, portal invitations, manual input, and solicitation evidence into durable opportunity state. It is where the platform decides whether evidence creates a new opportunity, appends to an existing one, or waits for review.
The concept page Precon Opportunity Intake explains the primitive. This thread explains the workflow from operator-visible evidence backward into mailbox, correspondence, solicitation, and opportunity services.
Reader Question
How does Precon preserve external bid evidence while deciding whether it belongs to a new or existing opportunity?
Surface Or Workflow
Operators see intake as new opportunities, solicitation lanes, source messages, correspondence, review issues, and queue changes. Engineers enter through mailbox sync, mail event processing, triage, source-message persistence, correspondence linking, solicitation processing, organization resolution, and opportunity lifecycle services.
Lifecycle
Mailbox and manual evidence are parsed into source messages and correspondence bundles. Triage and opportunity resolution decide whether to route evidence to an existing opportunity family or create a new one. Solicitation services then normalize due dates, contacts, package context, and review state.
When confidence is low, intake produces issues or reviewable state rather than silently creating duplicate opportunities. Follow-on jobs can then enqueue portal, document, sizing, or RFI processing tasks once the root state exists.
Child Threads
- Precon Portal Acquisition Workflow: starts when intake discovers portal evidence.
- Precon Document Publication Workflow: starts when source evidence yields files.
- Precon Estimator Workspace Workflow: consumes accepted opportunity state.
Implementation Boundaries
services/precon/mailbox, services/precon/intake, and services/precon/correspondence own source handling. Solicitation truth is under services/precon/solicitations; opportunity lifecycle behavior lives under services/precon/opportunities/lifecycle; jobs under jobs/precon keep mailbox sync and event processing thin.
Tradeoffs
Precon keeps source messages even after triage because future addenda and portal updates often change the interpretation of an opportunity. That creates more state than a simple inbox parser, but it makes later review, merge, and repair possible.
Visual
The current visual is a graph neighborhood. The intended visual is an intake lineage diagram from source message to bundle, solicitation, opportunity, issue/review, and follow-on processing task.
Source Evidence
docs/engineering/concepts/precon-opportunity-intake.mdservices/precon/mailboxservices/precon/intakeservices/precon/correspondenceservices/precon/solicitationsservices/precon/opportunities/lifecyclejobs/precon/sync_mailbox/run.pyjobs/precon/process_mail_event/run.pytests/precon/test_precon_mailbox_triage_contracts.pytests/precon/test_opportunity_creation_service.py