@@ -226,16 +226,15 @@ func printHumanReadable(breakdown *cost.Breakdown, prURL string) {
226226 authorLabel += " (bot)"
227227 }
228228 fmt .Printf (" Author: %s • Open: %s\n " , authorLabel , formatTimeUnit (breakdown .PRDuration ))
229- fmt .Printf (" Rate: %s/hr • Salary: %s • Benefits: %.1fx\n " ,
229+ fmt .Printf (" Rate: %s/hr • Benefits multiplier : %.1fx\n " ,
230230 formatCurrency (breakdown .HourlyRate ),
231- formatCurrency (breakdown .AnnualSalary ),
232231 breakdown .BenefitsMultiplier )
233232 fmt .Println ()
234233
235234 // Author Costs (skip entire section if no costs)
236235 if breakdown .Author .TotalCost > 0 {
237- fmt .Println (" Development Cost " )
238- fmt .Println (" ────────────────" )
236+ fmt .Println (" Development Costs " )
237+ fmt .Println (" ───────────────── " )
239238 // Show development and adaptation separately (only if there are actual lines of code)
240239 if breakdown .Author .NewLines > 0 {
241240 fmt .Printf (" New Development %12s %d LOC • %s\n " ,
@@ -269,8 +268,8 @@ func printHumanReadable(breakdown *cost.Breakdown, prURL string) {
269268 totalParticipantHours += p .TotalHours
270269 }
271270
272- fmt .Println (" Participant Cost " )
273- fmt .Println (" ────────────────" )
271+ fmt .Println (" Participant Costs " )
272+ fmt .Println (" ───────────────── " )
274273 for _ , p := range breakdown .Participants {
275274 fmt .Printf (" %s\n " , p .Actor )
276275 // Only show review activity if they reviewed (LOC-based)
@@ -295,84 +294,87 @@ func printHumanReadable(breakdown *cost.Breakdown, prURL string) {
295294 fmt .Println ()
296295 }
297296
298- // Merge Delay Costs
299- fmt .Println (" Delay Costs" )
300- fmt .Println (" ───────────" )
301- if breakdown .DelayCostDetail .DeliveryDelayHours > 0 {
302- if breakdown .DelayCapped {
303- fmt .Printf (" Delivery %12s %s (capped)\n " ,
304- formatCurrency (breakdown .DelayCostDetail .DeliveryDelayCost ), formatTimeUnit (breakdown .DelayCostDetail .DeliveryDelayHours ))
305- } else {
306- fmt .Printf (" Delivery %12s %s\n " ,
307- formatCurrency (breakdown .DelayCostDetail .DeliveryDelayCost ), formatTimeUnit (breakdown .DelayCostDetail .DeliveryDelayHours ))
297+ // Delay and Future Costs - only show if there are any delay costs
298+ if breakdown .DelayCost > 0 {
299+ // Merge Delay Costs
300+ fmt .Println (" Delay Costs" )
301+ fmt .Println (" ───────────" )
302+ if breakdown .DelayCostDetail .DeliveryDelayHours > 0 {
303+ if breakdown .DelayCapped {
304+ fmt .Printf (" Delivery %12s %s (capped)\n " ,
305+ formatCurrency (breakdown .DelayCostDetail .DeliveryDelayCost ), formatTimeUnit (breakdown .DelayCostDetail .DeliveryDelayHours ))
306+ } else {
307+ fmt .Printf (" Delivery %12s %s\n " ,
308+ formatCurrency (breakdown .DelayCostDetail .DeliveryDelayCost ), formatTimeUnit (breakdown .DelayCostDetail .DeliveryDelayHours ))
309+ }
308310 }
309- }
310311
311- if breakdown .DelayCostDetail .CoordinationHours > 0 {
312- if breakdown .DelayCapped {
313- fmt .Printf (" Coordination %12s %s (capped)\n " ,
314- formatCurrency (breakdown .DelayCostDetail .CoordinationCost ), formatTimeUnit (breakdown .DelayCostDetail .CoordinationHours ))
315- } else {
316- fmt .Printf (" Coordination %12s %s\n " ,
317- formatCurrency (breakdown .DelayCostDetail .CoordinationCost ), formatTimeUnit (breakdown .DelayCostDetail .CoordinationHours ))
312+ if breakdown .DelayCostDetail .CoordinationHours > 0 {
313+ if breakdown .DelayCapped {
314+ fmt .Printf (" Coordination %12s %s (capped)\n " ,
315+ formatCurrency (breakdown .DelayCostDetail .CoordinationCost ), formatTimeUnit (breakdown .DelayCostDetail .CoordinationHours ))
316+ } else {
317+ fmt .Printf (" Coordination %12s %s\n " ,
318+ formatCurrency (breakdown .DelayCostDetail .CoordinationCost ), formatTimeUnit (breakdown .DelayCostDetail .CoordinationHours ))
319+ }
318320 }
319- }
320321
321- mergeDelayCost := breakdown .DelayCostDetail .DeliveryDelayCost + breakdown .DelayCostDetail .CoordinationCost
322- mergeDelayHours := breakdown .DelayCostDetail .DeliveryDelayHours + breakdown .DelayCostDetail .CoordinationHours
323- fmt .Println (" ────────────" )
324- fmt .Printf (" Subtotal %12s %s\n " ,
325- formatCurrency (mergeDelayCost ), formatTimeUnit (mergeDelayHours ))
326- fmt .Println ()
322+ mergeDelayCost := breakdown .DelayCostDetail .DeliveryDelayCost + breakdown .DelayCostDetail .CoordinationCost
323+ mergeDelayHours := breakdown .DelayCostDetail .DeliveryDelayHours + breakdown .DelayCostDetail .CoordinationHours
324+ fmt .Println (" ────────────" )
325+ fmt .Printf (" Subtotal %12s %s\n " ,
326+ formatCurrency (mergeDelayCost ), formatTimeUnit (mergeDelayHours ))
327+ fmt .Println ()
327328
328- // Future Costs
329- hasFutureCosts := breakdown .DelayCostDetail .ReworkPercentage > 0 ||
330- breakdown .DelayCostDetail .FutureReviewCost > 0 ||
331- breakdown .DelayCostDetail .FutureMergeCost > 0 ||
332- breakdown .DelayCostDetail .FutureContextCost > 0
333-
334- if hasFutureCosts {
335- fmt .Println (" Future Costs" )
336- fmt .Println (" ────────────" )
337-
338- if breakdown .DelayCostDetail .ReworkPercentage > 0 {
339- label := fmt .Sprintf ("Code Churn (%.0f%% drift)" , breakdown .DelayCostDetail .ReworkPercentage )
340- fmt .Printf (" %-24s %12s %s\n " ,
341- label ,
342- formatCurrency (breakdown .DelayCostDetail .CodeChurnCost ),
343- formatTimeUnit (breakdown .DelayCostDetail .CodeChurnHours ))
344- }
329+ // Future Costs
330+ hasFutureCosts := breakdown .DelayCostDetail .ReworkPercentage > 0 ||
331+ breakdown .DelayCostDetail .FutureReviewCost > 0 ||
332+ breakdown .DelayCostDetail .FutureMergeCost > 0 ||
333+ breakdown .DelayCostDetail .FutureContextCost > 0
334+
335+ if hasFutureCosts {
336+ fmt .Println (" Future Costs" )
337+ fmt .Println (" ────────────" )
338+
339+ if breakdown .DelayCostDetail .ReworkPercentage > 0 {
340+ label := fmt .Sprintf ("Code Churn (%.0f%% drift)" , breakdown .DelayCostDetail .ReworkPercentage )
341+ fmt .Printf (" %-26s %12s %s\n " ,
342+ label ,
343+ formatCurrency (breakdown .DelayCostDetail .CodeChurnCost ),
344+ formatTimeUnit (breakdown .DelayCostDetail .CodeChurnHours ))
345+ }
345346
346- if breakdown .DelayCostDetail .FutureReviewCost > 0 {
347- fmt .Printf (" %-24s %12s %s\n " ,
348- "Review" ,
349- formatCurrency (breakdown .DelayCostDetail .FutureReviewCost ), formatTimeUnit (breakdown .DelayCostDetail .FutureReviewHours ))
350- }
347+ if breakdown .DelayCostDetail .FutureReviewCost > 0 {
348+ fmt .Printf (" %-26s %12s %s\n " ,
349+ "Review" ,
350+ formatCurrency (breakdown .DelayCostDetail .FutureReviewCost ), formatTimeUnit (breakdown .DelayCostDetail .FutureReviewHours ))
351+ }
351352
352- if breakdown .DelayCostDetail .FutureMergeCost > 0 {
353- fmt .Printf (" %-24s %12s %s\n " ,
354- "Merge" ,
355- formatCurrency (breakdown .DelayCostDetail .FutureMergeCost ), formatTimeUnit (breakdown .DelayCostDetail .FutureMergeHours ))
356- }
353+ if breakdown .DelayCostDetail .FutureMergeCost > 0 {
354+ fmt .Printf (" %-26s %12s %s\n " ,
355+ "Merge" ,
356+ formatCurrency (breakdown .DelayCostDetail .FutureMergeCost ), formatTimeUnit (breakdown .DelayCostDetail .FutureMergeHours ))
357+ }
357358
358- if breakdown .DelayCostDetail .FutureContextCost > 0 {
359- fmt .Printf (" %-24s %12s %s\n " ,
360- "Context Switching" ,
361- formatCurrency (breakdown .DelayCostDetail .FutureContextCost ), formatTimeUnit (breakdown .DelayCostDetail .FutureContextHours ))
362- }
359+ if breakdown .DelayCostDetail .FutureContextCost > 0 {
360+ fmt .Printf (" %-26s %12s %s\n " ,
361+ "Context Switching" ,
362+ formatCurrency (breakdown .DelayCostDetail .FutureContextCost ), formatTimeUnit (breakdown .DelayCostDetail .FutureContextHours ))
363+ }
363364
364- futureCost := breakdown .DelayCostDetail .CodeChurnCost +
365- breakdown .DelayCostDetail .FutureReviewCost +
366- breakdown .DelayCostDetail .FutureMergeCost +
367- breakdown .DelayCostDetail .FutureContextCost
368- futureHours := breakdown .DelayCostDetail .CodeChurnHours +
369- breakdown .DelayCostDetail .FutureReviewHours +
370- breakdown .DelayCostDetail .FutureMergeHours +
371- breakdown .DelayCostDetail .FutureContextHours
372- fmt .Println (" ────────────" )
373- fmt .Printf (" Subtotal %12s %s\n " ,
374- formatCurrency (futureCost ), formatTimeUnit (futureHours ))
375- fmt .Println ()
365+ futureCost := breakdown .DelayCostDetail .CodeChurnCost +
366+ breakdown .DelayCostDetail .FutureReviewCost +
367+ breakdown .DelayCostDetail .FutureMergeCost +
368+ breakdown .DelayCostDetail .FutureContextCost
369+ futureHours := breakdown .DelayCostDetail .CodeChurnHours +
370+ breakdown .DelayCostDetail .FutureReviewHours +
371+ breakdown .DelayCostDetail .FutureMergeHours +
372+ breakdown .DelayCostDetail .FutureContextHours
373+ fmt .Println (" ────────────" )
374+ fmt .Printf (" Subtotal %12s %s\n " ,
375+ formatCurrency (futureCost ), formatTimeUnit (futureHours ))
376+ fmt .Println ()
377+ }
376378 }
377379
378380 // Grand Total
0 commit comments