AOSSIE-Org / AOSSIE-Org/OrgExplorer

[BUG]: Bus Factor metric on Contributors page always evaluates to 0 (UNKNOWN) due to property mismatch

Aperta Adatta ai principianti
#230 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
bug
Lingua principale
JavaScript
Stelle
34
Fork
92
Merge medio
8g 7h
PR unite (30g)
12

Descrizione

### Bug Description

On the Contributors page (`/contributors`), the **Bus Factor Risk** metric card always evaluates to `Bus Factor: 0` with risk level `UNKNOWN` and subtitle `0 contributors own over 50% of total commits. Knowledge distribution is heavily skewed.`, regardless of the organization analyzed.

This is caused by a property name mismatch between `model.contributors` and `computeBusFactor`:
- `computeBusFactor` in `src/services/analytics.js` expects contributor objects to have a `.contributions` property:
```javascript
const total = contributors.reduce((s, c) => s + c.contributions, 0)
```
- However, in `buildAnalyticalModel` (`src/services/analytics.js`), aggregate contributor objects in `model.contributors` store their commit counts under `.totalContribs`:
```javascript
contributorMap[c.login] = {
login: c.login,
totalContribs: 0,
...
}
```
- When `ContributorsPage.jsx` passes `scopedContributors` (from `model.contributors`) into `computeBusFactor(scopedContributors)`, `c.contributions` is `undefined`.
- As a result, `0 + undefined` results in `NaN`. Since `!NaN` evaluates to `true`, `if (!total)` immediately triggers and returns `{ factor: 0, risk: 'unknown' }` on every run.

### Steps to Reproduce

1. Open OrgExplorer and analyze any organization (e.g. `AOSSIE-Org`).
2. Navigate to the Contributors page (`/contributors`).
3. Look at the Bus Factor Risk card at the top left.
4. Note that it displays `Bus Factor: 0` and `UNKNOWN` instead of calculating the contributor concentration.

### Logs and Screenshots

Observed behavior in the UI:
- Title: `Bus Factor: 0`
- Badge: `UNKNOWN`
- Subtitle: `0 contributors own over 50% of total commits. Knowledge distribution is heavily skewed.`
- Risk Level: `UNKNOWN`
- Progress bar: `25%`

Proposed fix in `src/services/analytics.js`:
```javascript
export function computeBusFactor(contributors = []) {
if (!contributors.length) return { factor: 0, risk: 'unknown' }
const getCount = c => (typeof c === 'number' ? c : (c.contributions ?? c.totalContribs ?? 0))
const total = contributors.reduce((s, c) => s + getCount(c), 0)
if (!total) return { factor: 0, risk: 'unknown' }
let cum = 0
for (let i = 0; i < contributors.length; i++) {
cum += getCount(contributors[i])
if (cum / total > 0.5) {
const f = i + 1
return { factor: f, risk: f <= 1 ? 'critical' : f <= 2 ? 'high' : 'healthy' }
}
}
return { factor: contributors.length, risk: 'healthy' }
}
```

### Environment Details

- OS: macOS / Linux / Windows
- Browser: Chrome / Firefox / Safari
- Application version: 1.0.0 (main branch)

### Impact

High - Major feature is broken

### Code of Conduct

- [x] I have joined the [Discord server](https://discord.gg/hjUhu33uAn) and will post updates there
- [x] I have searched existing issues to avoid duplicates

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Start in src/services/analytics.js by reading computeBusFactor and buildAnalyticalModel, then follow the call from ContributorsPage.jsx using scopedContributors. Reproduce the metric on /contributors with an analyzed organization and verify the Bus Factor Risk card reports a calculated factor and risk instead of 0 and UNKNOWN.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
javascript
Ambito
analytics, frontend
Tipo di issue
Bug
Difficoltà
2/5
Tempo stimato
1-3 ore
Stato di attività
Attiva
Chiarezza
Specificata chiaramente
Idoneità per principianti
88/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.