Bid Status Workflow - lifecycle states + pills¶
| Stage | Built |
|---|---|
| Status | Shipped |
| Design status | In progress |
| Estimate | M |
| Confidence | High |
| Linear | PIN-41 ↗ PIN-115 ↗ PIN-93 ↗ |
| Linear status | Done |
| Design | Design ↗ |
| Linear epic | Bid Intake & Pipeline |
| Module | Bids ↗ |
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.