six months ago i would have told you the answer is 'as many as it takes.' i would have been wrong.
after two job searches (one when i was L4, one now at senior/L5 level), i've gotten enough recruiter and hiring manager feedback to actually have a data-informed opinion on this.
the honest answer: 3-5 bullets per role, with a hard drop-off for roles older than 4 years.
here's why that number works. recruiters spend about 6-10 seconds on initial pass. they're not reading all 8 bullets on your 3-year stint at company X. they're reading the first 2-3 and making a judgment. the rest is just noise that makes your resume longer and harder to skim.
the exception is your most recent or most relevant role. that one can go up to 5-6 if the work is genuinely different enough to justify it.
for jobs older than 4-5 years: 2-3 bullets max. your 2019 role at a startup is context, not centerpiece. i cut a job from 7 bullets to 2 and literally nothing happened except my resume got better.
what actually matters in each bullet: start with a strong action verb (not 'responsible for') name the technical thing you built or changed give the impact: scale, latency, cost, reliability, team size, whatever is honest and specific keep it under two lines
what doesn't matter: listing every technology in your stack as a bullet describing your team's work when you mean your work being modest about scope. if you led something, say led. if you owned something, say owned.
my senior resume is now 1.5 pages with 3-4 bullets per role and a separate skills section. i get more recruiter responses than i did with my 2-page version that had 6-8 bullets per job and somehow said less.