Insights: the sources tables' Interviews column and the Interviews widget count different things #449
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#449
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, comparing how the Insights figures define "reached an interview".Related to #224.
Checked again on 2026-10-01 against
mainat0a5cad587: still present.Two figures on the same Insights dashboard both claim to count applications that reached an interview, and they use different rules. The Interviews column of the sources tables counts applications whose status ever reached Screening, Interviewing or Assessment; the Interviews widget counts applications with an interview entry on the timeline. They disagree whenever a person moves a status without recording an interview, or records one without moving the status.
applications/analytics.py:492-493, thecounthelper insidebuild:if statuses & {Status.INTERVIEWING, Status.SCREENING, Status.ASSESSMENT}: row.interviewed += 1. Feeds the Interviews column of Where they came from, By referrer, By agency and By industry (templates/widgets/_source_table.html:14,:30).applications/analytics.py:457-458:interview_days = _first_interview_days(ever_applied);insights.interviewed = len(interview_days), which readsEventKind.INTERVIEWentries (:264-287). Shown as Applications that reached one (templates/widgets/interviews_summary.html:8).postulo.wiki/Insights.md:59-68describes both as how many applications "reached" an interview.settle_interviewdeliberately does not reopen) counts in the widget and not in the column.buildinto a set of ids, and use that set for bothinsights.interviewedandSourceRow.interviewed. If Screening is meant to count, name the column for what it counts instead (for example Screened or further) and say so inInsights.md.Done when
tests/test_insights.pybuilds insights for an application moved to Screening with no interview entry and one with an interview entry but no interview-stage status, and asserts that the widget's count and the sources row's count agree; it fails today.