Deployed 26 Feb 2026. Adds project roles, pipeline stages, team management, and stage transitions to Discoverant. Replaces dummy data in the Pipeline Dashboard with live role-filtered data.
Git commit a5c96d6 on dellb, rsync'd to della, deployed to both dev and prod containers.
A user's platform role sets the ceiling for what they can do across the entire organisation.
| Role | Access Level | Pricing |
|---|---|---|
super_admin |
System-wide access (Richard) | — |
administrator |
Manage users in their org, see all projects, configure org settings | — |
member |
Upload, register, search, export, run Workbench tools | £2,000/year |
trial_member |
Same as member for 30 days | £99/30 days |
guest |
View shared data only, no upload, no export except PDF | Free |
Within each project, users are assigned a project-level role that determines their permissions.
| Role | Permissions |
|---|---|
leader |
Full control — manage team, set stage, approve progression |
contributor |
Upload data, edit compounds, run tools — can't change project settings |
reviewer |
View and export, add comments — can be structure-masked |
observer |
View only, no export, no comments |
Not every platform role can hold every project role. Enforced by database trigger trg_project_members_role_check.
| Platform Role | leader | contributor | reviewer | observer |
|---|---|---|---|---|
super_admin |
Yes | Yes | Yes | Yes |
administrator |
Yes | Yes | Yes | Yes |
member |
Yes | Yes | Yes | Yes |
trial_member |
No | Yes | Yes | Yes |
guest |
No | No | Yes | Yes |
Project Leaders can mark Reviewers as "structure-masked". Masked users see bioactivity data, ADMET predictions, and all other properties — except chemical structures (a locked icon is shown instead).
This protects intellectual property when giving CRO partners data access without revealing proprietary chemical matter.
10 default stages, customisable per organisation:
IDE HIT H2L LO CS
Ideation --> Hit Finding --> Hit-to-Lead --> Lead Optimisation --> Candidate Selection
(1-3 mo) (3-6 mo) (6-12 mo) (12-18 mo) (1-3 mo)
--> PC --> IND --> PH1 --> PH2 --> PH3
Preclinical IND Filing Phase I Phase II Phase III
(6-12 mo) (1-3 mo) (12-18 mo) (18-24 mo) (24-36 mo)
Each stage has configurable gate criteria (a checklist). When advancing a project to the next stage:
require_stage_approval enabled; admin must approve| Stage | Criterion | Required |
|---|---|---|
| HIT | Confirmed hits with IC50 < 10 µM | Yes |
| HIT | Dose-response curves for ≥ 3 chemical series | Yes |
| HIT | Counter-screen data (selectivity) | Yes |
| HIT | IP landscape assessment completed | No |
| H2L | Lead series with ≥ 100-fold selectivity | Yes |
| H2L | Preliminary ADMET data on lead compounds | Yes |
| H2L | SAR established across ≥ 2 scaffolds | Yes |
| H2L | Synthetic route scalable to 100 mg | No |
| LO | Candidate meets target product profile | Yes |
| LO | In vivo PK supporting QD/BID dosing | Yes |
| LO | Clean hERG (IC50 > 30x clinical Cmax) | Yes |
| LO | CMC package initiated | Yes |
| LO | Backup compound identified | No |
8 default therapeutic area codes. Organisations can add custom codes.
| Code | Area |
|---|---|
ONC | Oncology |
CNS | Central Nervous System |
INF | Inflammation |
CVD | Cardiovascular |
INX | Infectious Disease |
MET | Metabolic |
RSP | Respiratory |
IMM | Immunology |
| Table | Purpose | Key Details |
|---|---|---|
pipeline_stages |
10 default stages with codes, descriptions, typical durations | Unique on (code, tenant_id) |
gate_criteria |
Configurable checklist per stage | 13 defaults for HIT/H2L/LO gates |
project_members |
Project-level role assignments | Unique on (project_id, user_id), structure_masked flag |
stage_transitions |
Audit trail for stage changes | Who, when, from/to stage, justification, gate criteria met |
org_settings |
4 configurable org-level settings | Unique on (tenant_id, setting_key), JSONB values |
projects Tablestage_id, therapeutic_area, status (enum: active/on_hold/at_risk/completed/cancelled), target_name, progress (0-100), budget_allocated*, budget_spent*, budget_currency*, cancel_reason, cancelled_at, stage_entered_at
*Budget columns exist in DB but are NOT exposed through API or UI (removed per Don's guidance — salary derivation risk).
users Tableplatform_role (enum, default 'member')
| Enum | Values |
|---|---|
platform_role | super_admin, administrator, member, trial_member, guest |
project_role | leader, contributor, reviewer, observer |
project_status | active, on_hold, at_risk, completed, cancelled |
transition_status | approved, pending_approval, rejected, overridden |
v_portfolio_summary — Joins projects, stages, TAs, members, and molecules for dashboard queriesv_project_team — Joins project_members with users for team display/api/v1/pm/)| Method | Path | Auth | Description |
|---|---|---|---|
GET | /pipeline-stages | member | 10 stages |
GET | /therapeutic-areas | member | TA list |
GET | /portfolio/summary | member | Dashboard data with filters (role-filtered) |
GET | /projects/{id} | member | Single project PM fields |
PUT | /projects/{id} | member | Update stage/TA/status/progress |
POST | /projects/{id}/stage-transition | member | Advance stage with gate criteria |
GET | /projects/{id}/stage-history | member | Transition audit log |
GET | /projects/{id}/team | member | List team members |
POST | /projects/{id}/team | member | Add team member |
PUT | /projects/{id}/team/{user_id} | member | Update member role |
DELETE | /projects/{id}/team/{user_id} | member | Remove member |
GET | /projects/{id}/team-candidates | member | Users available to add |
GET | /gate-criteria/{stage_id} | member | Gate criteria checklist |
GET | /org-settings | admin | Tenant settings |
PUT | /org-settings/{key} | admin | Update setting |
| Key | Default | Description |
|---|---|---|
require_stage_approval | false | Leaders can advance stages directly |
admin_sees_all_projects | true | Admins auto-see all projects |
trial_member_can_lead | false | Trial members can't be Leaders |
default_structure_mask | false | New reviewers not auto-masked |
All views are wired to live data via /api/v1/pm/portfolio/summary.
project_membersAll demo users use password: Password1!
| User | Platform Role | Project Assignment | Project Role |
|---|---|---|---|
| Dr. Sarah Tan | administrator | All 3 projects | — |
| Dr. James Smith | member | EGFR | leader |
| Dr. Rachel Jones | member | EGFR | contributor |
| Dr. Anil Patel | member | EGFR | contributor |
| Sarah Mitchell | guest | EGFR | reviewer (masked) |
| Dr. Mark Williams | member | KRAS | leader |
| Dr. Wei Chen | member | Nav1.7 | leader |
| File | Purpose |
|---|---|
PipelineDashboard.tsx | Main dashboard with 3 view tabs, filters, summary cards |
PipelineView.tsx | Swim-lane component |
PipelineTable.tsx | Sortable table component |
StageBoard.tsx | Kanban with drag-and-drop |
ProjectDetailPanel.tsx | Slide-out panel with Overview/Team/History tabs |
TeamPanel.tsx | Team member list, add/remove, role changes, structure masking |
AdvanceStageModal.tsx | Gate criteria checklist with justification |
StageHistory.tsx | Timeline of stage transitions |
OrgSettingsPage.tsx | Admin settings with toggle cards |
api/v1/project_management.py — 809 lines, all PM routes. Registered in main.py at line 81 (import) and line 245 (include_router).