- Shipped
- September 6, 2026 at 1:21 AM UTC
- Author
- Kamo
- Commit
- f24039c
Two conditions, and no right among them: the viewer is a team member, and the organization has at least one posting open and taking applications. The second changed the character of the gate. A tab that opens onto a board with nothing on it is worse than no tab — it reads as a broken feature rather than an absent one — so an organization that is not hiring simply does not carry the surface. The count is of the POSTING, not the caller: a role this member has already applied to still holds the tab open, because counting canApply would delete the tab, and with it their own application, the moment they applied to the last open role. VIEW_JOB_LISTINGS no longer decides this. CareersAccess.requireView moved to the same rule so the two cannot disagree, and the widening is described there. isHrs drops out as an assertion and returns as an implication: a posting is written from the HR module, so an org without it never counts above zero. The not-yet-employed special case goes with it — every team member is admitted now, so a candidate needs no exception. The count is withheld until it arrives rather than assumed zero, so the tab bar timecard gate beside it follows. The effect writes no state synchronously, so it adds no new react-hooks/set-state-in-effect violation. One consequence worth knowing: RestrictedMembershipGuard still sends a non-Active member from the home screen to ?tab=careers, and in an organization with nothing open that tab is now absent. SettingsView falls back to the first tab, so they land on their profile rather than on anything broken.