@@ -201,30 +201,27 @@ export function inferMemberOrganizationStintChanges(
201201 continue
202202 }
203203
204- // 5. Only split when another org clearly sits between this stint and the new date.
205- // Overlapping orgs are treated as concurrent evidence, not a break in the stint.
204+ // 5. Only split when another org has meaningful exclusive presence in the gap
205+ // between the closest same-org stint and the new date (>30 days).
206+ // Concurrent/overlapping orgs that barely extend into the gap are not career breaks.
206207 const isForward = targetDate > neighbor . dateEnd
208+ const gapStart = isForward ? neighbor . dateEnd : targetDate
209+ const gapEnd = isForward ? targetDate : neighbor . dateStart
210+
207211 const hasSeparator = stints . some ( ( s ) => {
208- if (
209- s . organizationId === organizationId ||
210- ! s . dateStart ||
211- ! s . dateEnd ||
212- diff ( s . dateStart , s . dateEnd ) < 30
213- ) {
212+ if ( s . organizationId === organizationId || ! s . dateStart || ! s . dateEnd ) {
214213 return false
215214 }
216215
217- if ( isForward ) {
218- return (
219- ( s . dateStart > neighbor . dateEnd && s . dateStart <= targetDate ) ||
220- ( s . dateEnd > neighbor . dateEnd && s . dateEnd <= targetDate )
221- )
216+ // Wide umbrella orgs that fully wrap the neighbor are concurrent, not career breaks
217+ if ( s . dateStart <= neighbor . dateStart && s . dateEnd >= neighbor . dateEnd ) {
218+ return false
222219 }
223220
224- return (
225- ( s . dateStart >= targetDate && s . dateStart < neighbor . dateStart ) ||
226- ( s . dateEnd >= targetDate && s . dateEnd < neighbor . dateStart )
227- )
221+ const overlapStart = s . dateStart > gapStart ? s . dateStart : gapStart
222+ const overlapEnd = s . dateEnd < gapEnd ? s . dateEnd : gapEnd
223+
224+ return overlapStart < overlapEnd && diff ( overlapStart , overlapEnd ) > 30
228225 } )
229226
230227 if ( hasSeparator ) {
0 commit comments