Developer Page Specifications
Status Logic
Open / ClosingSoon / Rolling / Closed computation rules + sponsored/verified stored flags.
Status is computed, not stored — with one exception. The four primary statuses (Open / ClosingSoon / Rolling / Closed) derive from DeadlineDate + IsRolling at every read. IsSponsored and IsVerified are stored boolean flags set by admin. A nightly job persists computed status to the column for fast filtering, but every read still recomputes to defend against drift.
Computed statuses
- Open
- IsRolling = false AND DeadlineDate > NOW() + INTERVAL '7 days'. Default state for a verified future opportunity with a deadline more than a week away.
- ClosingSoon
- IsRolling = false AND DeadlineDate BETWEEN NOW() AND NOW() + INTERVAL '7 days'. Triggers warning tint + "Closing soon" pill + upgraded CTA label "Apply (closing soon)".
- Rolling
- IsRolling = true. DeadlineDate is ignored. Cards render with the purple accent and "Rolling applications" label.
- Closed
- IsRolling = false AND DeadlineDate < NOW(). Cards desaturate to 60% opacity, "Apply" CTA disables. Filter-excluded from default Status=all view; appear only when user explicitly filters Status=closed.
Stored editorial flags
- IsSponsored
- Stored boolean. Set when a commercial sponsorship covers this opportunity placement. Renders "SPONSORED" pill + sponsor disclosure ribbon at the top of the details body. Editorial standard still applies — sponsorship buys placement, not relaxed fact-check.
- IsVerified
- Stored boolean. Set after the 3-gate editorial verification passes (source authority · detail accuracy · ecosystem relevance — see §9.6 verification doctrine). Drives the green ✓ chip.
Configurability
- ClosingSoon window default = 7 days. Configurable via FeatureFlag.opportunityClosingSoonDays (admin can change to 5 or 14 globally).
- Closed auto-archive cutoff = 180 days after DeadlineDate. After that, the row stays IsActive=true and queryable, but moves to a separate "archive" admin surface and is excluded from listing by default.
Timezone considerations
DeadlineDate is always stored in UTC (timestamptz). Display logic converts to the viewer’s locale. BUT status computation always uses UTC NOW() — never the viewer’s clock. A founder in Cairo at 11:55pm sees the same Closed state as a founder in San Francisco at 12:55pm UTC. This matters for fairness — every applicant globally sees the same window close at the same instant.
