Skip to content

Bid Status Workflow - lifecycle states + pills

StageBuilt
StatusShipped
Design statusIn progress
EstimateM
ConfidenceHigh
LinearPIN-41 ↗ PIN-115 ↗ PIN-93 ↗
Linear statusDone
DesignDesign ↗
Linear epicBid Intake & Pipeline
ModuleBids ↗

Status: Built · Route: status chip on /bids (Bid List) and /bids/:bidId (Bid Detail)

Scope

Bid status chip + transition UI on Bid List and Bid Detail: a color-coded status backed by an enforced state machine, with the change control limited to valid next states. (Source: PIN-41, PIN-115, PIN-93.)

Acceptance criteria

  • 6-state proto enum (New, Reviewing, Submitted, Awarded, Lost, No-Bid); backend rejects invalid transitions with InvalidArgument
  • Status chip color-coded per state on both Bid List and Bid Detail
  • Status-change control only offers valid next states for the current status
  • Award modal: contract value, PM assignment, GC selection; hands off to project conversion
  • Lost prompt: reason (Price, Relationship, Scope, Timing, Other) + optional notes
  • No-Bid prompt: reason (Capacity, Not a Fit, Missed Deadline, Other)
  • Every transition logged to history (who, when, from → to)

The bid lifecycle state machine. Every bid carries a status; transitions are validated on both backend and frontend. The status chip is colour-coded, and the change control only offers valid next states. Awarded prompts "Convert to Project?" (handoff to Award to Project); Lost / No-Bid prompt for an optional reason. Every change is written to the transition history (who, when, from → to).

Workflow

Core states (shipped): New → Reviewing → Submitted → Awarded / Lost / No-Bid. Allowed transitions are enforced in the service layer — e.g. a bid cannot jump straight from New to Awarded.

Deferred states (defined but not yet implemented; revisit once the core workflow is stable): Budget, Withdrawn, Reopened, Superseded.

Notes

Shipped across three tickets: the state machine + transition validation (PIN-41), the status enum + transition rules (PIN-115), and the frontend status actions/chip (PIN-93). Exact status labels were client-confirmed; the estimating-stage label ("Qualifying" vs "Estimating") is being tightened separately under the Bid List cleanup tickets.

Open question for Conor

Confirm whether the four deferred statuses (Budget / Withdrawn / Reopened / Superseded) are still wanted, and their transition rules.

Reference

  • Linear: PIN-41 (Bid Status Workflow), PIN-115 (status enum + transitions), PIN-93 (frontend status actions)
  • Depends on Bid Detail Page (PIN-39); Awarded hands off to Bid → Project Conversion (PIN-42 / PIN-274)