@sonnechasser/ntrp 2.2.1 → 2.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -18345,21 +18345,21 @@ var init_metric_definitions = __esm({
18345
18345
  kind: "vital",
18346
18346
  label: "Freshness",
18347
18347
  group: "Vital Signs",
18348
- tagline: "Is the CRM still talking about live work \u2014 or a museum of old deals?",
18349
- how_computed: "NTRP computes a weighted average of people, organizations, and opportunities with recent activity. Open opportunities must also not be past-due. Default windows: people and organizations 90 days, opportunities 30 days. Weights are 35 / 30 / 35.",
18348
+ tagline: "Is the CRM talking about live deals \u2014 or a museum of old ones?",
18349
+ how_computed: "We look at how recently people, companies, and deals got a touch. Deals need a fresher pulse than people or companies, and past-due deals count as stale. The formula lines on this card show the exact mix and windows.",
18350
18350
  formula_lines: [
18351
18351
  "freshness = people%\xD70.35 + orgs%\xD70.30 + opps%\xD70.35",
18352
18352
  "people/orgs fresh if activity within 90d",
18353
18353
  "opps fresh if activity within 30d AND not past-due"
18354
18354
  ],
18355
- meaning: 'We treat Freshness as a truth check on the pipeline number. Quiet days mean different things by motion: in enterprise, 30 quiet days can be normal cadence; in a velocity book, that same silence often means the deal is already dead. Stale open amount is why we show "pipeline at risk."',
18356
- expert_read: `A useful first cut is by owner and by stage \u2014 reds tend to clump on people or process, not sprinkle evenly. A sudden cliff is usually a broken integration or a departed rep, not gradual decay. Watch for the false positive too: bulk-imported records nobody has touched yet can look "stale" when they're just new.`,
18355
+ meaning: `Freshness asks whether the pipeline number is still true. Quiet deals pad the forecast. Like milk dates on a shelf \u2014 past the date, don't trust the carton. Stale open dollars show as "pipeline at risk."`,
18356
+ expert_read: "Cut by owner and stage first \u2014 reds usually clump, they don't sprinkle. A sudden cliff is often a broken sync or a departed rep, not slow decay. New bulk imports can look stale when they're just new.",
18357
18357
  deepdive: [
18358
- "Status bands: green 80 or more, yellow 60 or more, red below 60. Motion presets can change the windows.",
18359
- 'Dollar translation: sum of amount on stale open opportunities \u2192 "pipeline at risk".',
18360
- "Layer 1 of the gating stack. A red score here limits trust in later layers.",
18361
- "Trigger play: Clean Dead Pipeline (clean-dead-pipeline) when the score is below 60.",
18362
- "Levers: stale-deal alert at N quiet days. Weekly hygiene scrub. Enrichment refresh on quiet records. Signal-triggered reactivation for paid dormant accounts."
18358
+ "Green 80+, yellow 60+, red below 60. Motion presets can change the windows.",
18359
+ 'Dollars: sum of amount on stale open deals \u2192 "pipeline at risk".',
18360
+ "Read this first. If Freshness is red, later vitals are harder to trust.",
18361
+ "Weak score \u2192 play Clean Dead Pipeline.",
18362
+ "Useful moves: stale-deal alert, weekly hygiene scrub, enrichment on quiet records."
18363
18363
  ],
18364
18364
  visual: {
18365
18365
  kind: "bars",
@@ -18383,21 +18383,21 @@ var init_metric_definitions = __esm({
18383
18383
  kind: "vital",
18384
18384
  label: "Flow Rate",
18385
18385
  group: "Vital Signs",
18386
- tagline: "Where does deal motion slow \u2014 and what's stuck behind that bottleneck?",
18387
- how_computed: "NTRP sets a base score from average open-deal age versus max_days. It then applies a penalty of up to 20 for the share of stuck deals. A deal is stuck when it has no update beyond stuck_days, or a past-due close. Status uses average open age, not the score alone.",
18386
+ tagline: "Where do deals stop moving \u2014 and what's piled up behind that stage?",
18387
+ how_computed: "We start from how old open deals are versus a max window, then shave points for the share that look stuck. A deal is stuck when it goes quiet too long or its close date is already past. The formula lines show the base, the penalty, and the stuck rules.",
18388
18388
  formula_lines: [
18389
18389
  "base = 100 \xD7 (1 \u2212 avgOpenAge / max_days)",
18390
18390
  "score = base \u2212 stuckSharePenalty (\u226420)",
18391
18391
  "stuck = no update > stuck_days OR past-due close"
18392
18392
  ],
18393
- meaning: 'We think of Flow Rate as velocity risk with a dollar tag. When deals stop advancing \u2014 and especially when close dates slip past due \u2014 next quarter starts to feel optimistic on paper. The dollar line is the amount still "stuck in pipeline."',
18394
- expert_read: "We prefer stage age over deal age alone: find the stage where advancement collapses \u2014 it's usually one stage, not everywhere. Compare stuck age to this company's own median cycle rather than a generic norm. Stuck deals plus past-due closes are often a forecast-credibility problem before they're a revenue miss.",
18393
+ meaning: 'Flow Rate asks whether deals are still advancing or sitting still. Stuck deals pad next quarter on paper. Like traffic behind a closed lane \u2014 the jam is one stage, not the whole highway. Dollars on stuck deals show as "stuck in pipeline."',
18394
+ expert_read: "Find the stage where advancement collapses first \u2014 it's usually one stage, not everywhere. Compare stuck age to this company's own median cycle rather than a generic norm. Stuck deals plus past-due closes are often a forecast-credibility problem before they're a revenue miss.",
18395
18395
  deepdive: [
18396
- "Status uses average open age. Green is 45 days or less. Yellow is 90 days or less. Else red. Defaults: max_days 120, stuck_days 60.",
18397
- 'Dollar translation: sum of amount on stuck deals \u2192 "stuck in pipeline".',
18398
- "Layer 2 of the gating stack, with Drop Rate.",
18399
- "Trigger play: Unstick the Pipeline (unstick-pipeline) when the score is weak.",
18400
- "Levers: stage-age report. Past-due close cleanup. Progression plans on stuck deals. Forecast hygiene on optimistic close dates."
18396
+ "Status uses average open age. Green \u226445 days, yellow \u226490, else red. Defaults: max_days 120, stuck_days 60.",
18397
+ 'Dollars: sum of amount on stuck deals \u2192 "stuck in pipeline".',
18398
+ "Read with Drop Rate \u2014 stuck deals and handoff leaks often show up together.",
18399
+ "Weak score \u2192 play Unstick the Pipeline.",
18400
+ "Useful moves: stage-age report, past-due close cleanup, progression plans on stuck deals, forecast hygiene on optimistic close dates."
18401
18401
  ],
18402
18402
  visual: {
18403
18403
  kind: "funnel",
@@ -18423,21 +18423,21 @@ var init_metric_definitions = __esm({
18423
18423
  kind: "vital",
18424
18424
  label: "Drop Rate",
18425
18425
  group: "Vital Signs",
18426
- tagline: "Where does paid demand fall between systems before anyone works it?",
18427
- how_computed: "NTRP blends cross-system retention and opportunity retention. Cross-system retention is marketing people also present in sales. Opportunity retention is open opportunities that are not abandoned. Default weights: cross-system 60 percent, opportunity retention 40 percent. Abandoned means open opportunities with no activity in 30 days.",
18426
+ tagline: "Where does paid demand fall between systems before a rep works it?",
18427
+ how_computed: "We blend two checks: do marketing people also show up in sales CRM, and are open deals still being worked (not abandoned). The formula lines show the weights and the 30-day abandon window.",
18428
18428
  formula_lines: [
18429
18429
  "score = crossSystemRetention\xD70.6 + oppRetention\xD70.4",
18430
18430
  "cross-system = marketing people also in sales CRM",
18431
18431
  "abandoned = open opps with no activity in 30d"
18432
18432
  ],
18433
- meaning: 'We read Drop Rate as the price of the handoff leak \u2014 budget already spent on leads that never reach a working rep. The dollar estimate is droppedCount \xD7 conversion \xD7 avg deal size: "est. lost at handoff."',
18434
- expert_read: 'In practice this usually looks like a systems story: routing rules, unassigned territories, dead rep queues, or a sync gap between marketing and CRM \u2014 more often than "lazy reps." A useful first cut is by lead source; the leak tends to concentrate in one or two sources. The cheapest pipeline a business can buy is often the leads it already paid for.',
18433
+ meaning: 'Drop Rate prices the handoff leak \u2014 money you already spent on leads that never reach a working rep. Like buying groceries and leaving half the bags in the parking lot. The dollar line is "est. lost at handoff."',
18434
+ expert_read: "A useful first cut is by lead source \u2014 the leak usually concentrates in one or two, not everywhere. Routing rules, unassigned territories, dead queues, or a sync gap between marketing and CRM show up more often than lazy reps. The cheapest pipeline you can buy is often the leads you already paid for.",
18435
18435
  deepdive: [
18436
- "Status bands: green 80 or more, yellow 60 or more, red below 60.",
18437
- 'Dollar translation: dropped \xD7 conversion \xD7 avg deal (fallback: drop% \xD7 open pipeline) \u2192 "est. lost at handoff".',
18438
- "Layer 2 of the gating stack, with Flow Rate.",
18439
- "Trigger play: Fix the Handoff Gap (fix-handoff-gap) when drop is high.",
18440
- "Levers: source-level handoff audit. Routing and sync repair. Time-to-first-touch SLA. Weekly marketing-only-leads report."
18436
+ "Green 80+, yellow 60+, red below 60.",
18437
+ 'Dollars: dropped \xD7 conversion \xD7 avg deal (fallback: drop% \xD7 open pipeline) \u2192 "est. lost at handoff".',
18438
+ "Read with Flow Rate \u2014 handoff leaks and stuck deals often show up together.",
18439
+ "Weak score \u2192 play Fix the Handoff Gap.",
18440
+ "Useful moves: source-level handoff audit, routing and sync repair, time-to-first-touch SLA, weekly marketing-only-leads report."
18441
18441
  ],
18442
18442
  visual: {
18443
18443
  kind: "funnel",
@@ -18462,21 +18462,21 @@ var init_metric_definitions = __esm({
18462
18462
  kind: "vital",
18463
18463
  label: "Signal:Noise",
18464
18464
  group: "Vital Signs",
18465
- tagline: "How much of the team's effort still aims at deals that can close?",
18466
- how_computed: "Over a 90-day lookback, NTRP computes (signal activities / all activities) \xD7 100. Signal is activity linked to an open opportunity, a pipeline person, or a pipeline organization.",
18465
+ tagline: "How much effort still aims at accounts that can close \u2014 versus dead ends?",
18466
+ how_computed: "We look at the last 90 days of activity and ask what share is signal \u2014 linked to an open deal, a pipeline person, or a pipeline company. The formula lines show the ratio and what counts as signal.",
18467
18467
  formula_lines: [
18468
18468
  "score = (signalCount / activityCount) \xD7 100",
18469
18469
  "signal = linked to open opp / pipeline person / pipeline org",
18470
18470
  "lookback = trailing 90 days"
18471
18471
  ],
18472
- meaning: `We treat Signal:Noise as activity efficiency with a capacity price. Noise hours \xD7 hours_per_activity \xD7 rep_hourly_cost becomes "misdirected effort" \u2014 energy aimed at accounts that can't still close.`,
18472
+ meaning: 'Signal:Noise asks whether activity still points at deals that can close. Noise hours are capacity spent on dead ends. Like a radio stuck between stations \u2014 lots of static, little signal. Those hours show as "misdirected effort."',
18473
18473
  expert_read: "A useful cut is by rep and by account status. Persistent noise often means reps keep working dead accounts they already know \u2014 stale targeting or coverage models more than a coaching gap. Also check whether activity is logged against closed or unlinked records; that can be a hygiene artifact pretending to be effort.",
18474
18474
  deepdive: [
18475
- "Status bands: green 65 or more, yellow 40 or more, red below 40.",
18476
- "Dollar defaults: 0.25 hours/activity \xD7 $75/hr (config: hours_per_activity, rep_hourly_cost).",
18477
- "Layer 3 of the gating stack. Trust Freshness, Flow Rate, and Drop Rate before you read activity efficiency.",
18478
- "Trigger play: Retarget Misdirected Effort (retarget-effort) when the score is low.",
18479
- "Levers: refresh account lists. Signal-based targeting. Stop logging against closed or unlinked records. Coverage-model redesign."
18475
+ "Green 65+, yellow 40+, red below 40.",
18476
+ 'Dollar defaults: 0.25 hours/activity \xD7 $75/hr (config: hours_per_activity, rep_hourly_cost) \u2192 "misdirected effort".',
18477
+ "Read Freshness, Flow Rate, and Drop Rate before you trust this score.",
18478
+ "Weak score \u2192 play Retarget Misdirected Effort.",
18479
+ "Useful moves: refresh account lists, signal-based targeting, stop logging against closed or unlinked records, coverage-model redesign."
18480
18480
  ],
18481
18481
  visual: {
18482
18482
  kind: "split",
@@ -18499,21 +18499,21 @@ var init_metric_definitions = __esm({
18499
18499
  kind: "vital",
18500
18500
  label: "Thread Depth",
18501
18501
  group: "Vital Signs",
18502
- tagline: "How fragile is revenue if one champion changes jobs?",
18503
- how_computed: "Percent of open deals with at least multi_thread_threshold distinct people active in the last 90 days. The default threshold is 2. People include opportunity-direct contacts and same-organization activity.",
18502
+ tagline: "How fragile is a deal if one champion changes jobs?",
18503
+ how_computed: "We ask what share of open deals have at least two people active in the last 90 days. Contacts on the deal and activity at the same company both count. The formula lines show the threshold.",
18504
18504
  formula_lines: [
18505
18505
  "score = % open deals with \u22652 active people (90d)",
18506
18506
  "people counted via opp contacts + same-org activity",
18507
18507
  "threshold configurable (default 2)"
18508
18508
  ],
18509
- meaning: "We read Thread Depth as resilience risk. One single-threaded mega-deal can outweigh ten small ones \u2014 and late-cycle single-threading is especially scary because champions change jobs. The dollar line sums amount on single-threaded deals.",
18510
- expert_read: "Weight by deal size when you triage. Single-threading late in the cycle tends to matter more than early. In enterprise motions, thin threads are often a leading indicator of slipped quarters: the champion leaves and there's no second contact warm enough to carry the deal.",
18509
+ meaning: 'Thread Depth asks how many people keep each deal warm. One contact is a single point of failure \u2014 if they leave, the deal often dies with them. Like a bridge with one cable. Dollars on thin deals show as "single-threaded."',
18510
+ expert_read: "Weight by deal size when you triage \u2014 one thin mega-deal can outweigh ten small ones. Late-cycle single-threading tends to matter more than early. In enterprise motions, thin threads often lead to slipped quarters: the champion leaves and nobody else is warm enough to carry the deal.",
18511
18511
  deepdive: [
18512
- "Status bands: green 65 or more, yellow 40 or more, red below 40.",
18513
- 'Dollar translation: sum of amount on single-threaded deals \u2192 "single-threaded".',
18514
- "Layer 4 of the gating stack. Read this last, after the upstream vital signs.",
18515
- "Trigger play: Multi-Thread Your Deals (multi-thread-deals) when depth is low.",
18516
- "Levers: buying-committee map. Warm internal referral first. CRM contact roles. Mid-stage single-thread alerts. Champion job-change signals."
18512
+ "Green 65+, yellow 40+, red below 40.",
18513
+ 'Dollars: sum of amount on single-threaded deals \u2192 "single-threaded".',
18514
+ "Read this last, after Freshness, Flow Rate, Drop Rate, and Signal:Noise.",
18515
+ "Weak score \u2192 play Multi-Thread Your Deals.",
18516
+ "Useful moves: buying-committee map, warm internal referral first, CRM contact roles, mid-stage single-thread alerts, champion job-change signals."
18517
18517
  ],
18518
18518
  visual: {
18519
18519
  kind: "bars",
@@ -12989,21 +12989,21 @@ var init_metric_definitions = __esm({
12989
12989
  kind: "vital",
12990
12990
  label: "Freshness",
12991
12991
  group: "Vital Signs",
12992
- tagline: "Is the CRM still talking about live work \u2014 or a museum of old deals?",
12993
- how_computed: "NTRP computes a weighted average of people, organizations, and opportunities with recent activity. Open opportunities must also not be past-due. Default windows: people and organizations 90 days, opportunities 30 days. Weights are 35 / 30 / 35.",
12992
+ tagline: "Is the CRM talking about live deals \u2014 or a museum of old ones?",
12993
+ how_computed: "We look at how recently people, companies, and deals got a touch. Deals need a fresher pulse than people or companies, and past-due deals count as stale. The formula lines on this card show the exact mix and windows.",
12994
12994
  formula_lines: [
12995
12995
  "freshness = people%\xD70.35 + orgs%\xD70.30 + opps%\xD70.35",
12996
12996
  "people/orgs fresh if activity within 90d",
12997
12997
  "opps fresh if activity within 30d AND not past-due"
12998
12998
  ],
12999
- meaning: 'We treat Freshness as a truth check on the pipeline number. Quiet days mean different things by motion: in enterprise, 30 quiet days can be normal cadence; in a velocity book, that same silence often means the deal is already dead. Stale open amount is why we show "pipeline at risk."',
13000
- expert_read: `A useful first cut is by owner and by stage \u2014 reds tend to clump on people or process, not sprinkle evenly. A sudden cliff is usually a broken integration or a departed rep, not gradual decay. Watch for the false positive too: bulk-imported records nobody has touched yet can look "stale" when they're just new.`,
12999
+ meaning: `Freshness asks whether the pipeline number is still true. Quiet deals pad the forecast. Like milk dates on a shelf \u2014 past the date, don't trust the carton. Stale open dollars show as "pipeline at risk."`,
13000
+ expert_read: "Cut by owner and stage first \u2014 reds usually clump, they don't sprinkle. A sudden cliff is often a broken sync or a departed rep, not slow decay. New bulk imports can look stale when they're just new.",
13001
13001
  deepdive: [
13002
- "Status bands: green 80 or more, yellow 60 or more, red below 60. Motion presets can change the windows.",
13003
- 'Dollar translation: sum of amount on stale open opportunities \u2192 "pipeline at risk".',
13004
- "Layer 1 of the gating stack. A red score here limits trust in later layers.",
13005
- "Trigger play: Clean Dead Pipeline (clean-dead-pipeline) when the score is below 60.",
13006
- "Levers: stale-deal alert at N quiet days. Weekly hygiene scrub. Enrichment refresh on quiet records. Signal-triggered reactivation for paid dormant accounts."
13002
+ "Green 80+, yellow 60+, red below 60. Motion presets can change the windows.",
13003
+ 'Dollars: sum of amount on stale open deals \u2192 "pipeline at risk".',
13004
+ "Read this first. If Freshness is red, later vitals are harder to trust.",
13005
+ "Weak score \u2192 play Clean Dead Pipeline.",
13006
+ "Useful moves: stale-deal alert, weekly hygiene scrub, enrichment on quiet records."
13007
13007
  ],
13008
13008
  visual: {
13009
13009
  kind: "bars",
@@ -13027,21 +13027,21 @@ var init_metric_definitions = __esm({
13027
13027
  kind: "vital",
13028
13028
  label: "Flow Rate",
13029
13029
  group: "Vital Signs",
13030
- tagline: "Where does deal motion slow \u2014 and what's stuck behind that bottleneck?",
13031
- how_computed: "NTRP sets a base score from average open-deal age versus max_days. It then applies a penalty of up to 20 for the share of stuck deals. A deal is stuck when it has no update beyond stuck_days, or a past-due close. Status uses average open age, not the score alone.",
13030
+ tagline: "Where do deals stop moving \u2014 and what's piled up behind that stage?",
13031
+ how_computed: "We start from how old open deals are versus a max window, then shave points for the share that look stuck. A deal is stuck when it goes quiet too long or its close date is already past. The formula lines show the base, the penalty, and the stuck rules.",
13032
13032
  formula_lines: [
13033
13033
  "base = 100 \xD7 (1 \u2212 avgOpenAge / max_days)",
13034
13034
  "score = base \u2212 stuckSharePenalty (\u226420)",
13035
13035
  "stuck = no update > stuck_days OR past-due close"
13036
13036
  ],
13037
- meaning: 'We think of Flow Rate as velocity risk with a dollar tag. When deals stop advancing \u2014 and especially when close dates slip past due \u2014 next quarter starts to feel optimistic on paper. The dollar line is the amount still "stuck in pipeline."',
13038
- expert_read: "We prefer stage age over deal age alone: find the stage where advancement collapses \u2014 it's usually one stage, not everywhere. Compare stuck age to this company's own median cycle rather than a generic norm. Stuck deals plus past-due closes are often a forecast-credibility problem before they're a revenue miss.",
13037
+ meaning: 'Flow Rate asks whether deals are still advancing or sitting still. Stuck deals pad next quarter on paper. Like traffic behind a closed lane \u2014 the jam is one stage, not the whole highway. Dollars on stuck deals show as "stuck in pipeline."',
13038
+ expert_read: "Find the stage where advancement collapses first \u2014 it's usually one stage, not everywhere. Compare stuck age to this company's own median cycle rather than a generic norm. Stuck deals plus past-due closes are often a forecast-credibility problem before they're a revenue miss.",
13039
13039
  deepdive: [
13040
- "Status uses average open age. Green is 45 days or less. Yellow is 90 days or less. Else red. Defaults: max_days 120, stuck_days 60.",
13041
- 'Dollar translation: sum of amount on stuck deals \u2192 "stuck in pipeline".',
13042
- "Layer 2 of the gating stack, with Drop Rate.",
13043
- "Trigger play: Unstick the Pipeline (unstick-pipeline) when the score is weak.",
13044
- "Levers: stage-age report. Past-due close cleanup. Progression plans on stuck deals. Forecast hygiene on optimistic close dates."
13040
+ "Status uses average open age. Green \u226445 days, yellow \u226490, else red. Defaults: max_days 120, stuck_days 60.",
13041
+ 'Dollars: sum of amount on stuck deals \u2192 "stuck in pipeline".',
13042
+ "Read with Drop Rate \u2014 stuck deals and handoff leaks often show up together.",
13043
+ "Weak score \u2192 play Unstick the Pipeline.",
13044
+ "Useful moves: stage-age report, past-due close cleanup, progression plans on stuck deals, forecast hygiene on optimistic close dates."
13045
13045
  ],
13046
13046
  visual: {
13047
13047
  kind: "funnel",
@@ -13067,21 +13067,21 @@ var init_metric_definitions = __esm({
13067
13067
  kind: "vital",
13068
13068
  label: "Drop Rate",
13069
13069
  group: "Vital Signs",
13070
- tagline: "Where does paid demand fall between systems before anyone works it?",
13071
- how_computed: "NTRP blends cross-system retention and opportunity retention. Cross-system retention is marketing people also present in sales. Opportunity retention is open opportunities that are not abandoned. Default weights: cross-system 60 percent, opportunity retention 40 percent. Abandoned means open opportunities with no activity in 30 days.",
13070
+ tagline: "Where does paid demand fall between systems before a rep works it?",
13071
+ how_computed: "We blend two checks: do marketing people also show up in sales CRM, and are open deals still being worked (not abandoned). The formula lines show the weights and the 30-day abandon window.",
13072
13072
  formula_lines: [
13073
13073
  "score = crossSystemRetention\xD70.6 + oppRetention\xD70.4",
13074
13074
  "cross-system = marketing people also in sales CRM",
13075
13075
  "abandoned = open opps with no activity in 30d"
13076
13076
  ],
13077
- meaning: 'We read Drop Rate as the price of the handoff leak \u2014 budget already spent on leads that never reach a working rep. The dollar estimate is droppedCount \xD7 conversion \xD7 avg deal size: "est. lost at handoff."',
13078
- expert_read: 'In practice this usually looks like a systems story: routing rules, unassigned territories, dead rep queues, or a sync gap between marketing and CRM \u2014 more often than "lazy reps." A useful first cut is by lead source; the leak tends to concentrate in one or two sources. The cheapest pipeline a business can buy is often the leads it already paid for.',
13077
+ meaning: 'Drop Rate prices the handoff leak \u2014 money you already spent on leads that never reach a working rep. Like buying groceries and leaving half the bags in the parking lot. The dollar line is "est. lost at handoff."',
13078
+ expert_read: "A useful first cut is by lead source \u2014 the leak usually concentrates in one or two, not everywhere. Routing rules, unassigned territories, dead queues, or a sync gap between marketing and CRM show up more often than lazy reps. The cheapest pipeline you can buy is often the leads you already paid for.",
13079
13079
  deepdive: [
13080
- "Status bands: green 80 or more, yellow 60 or more, red below 60.",
13081
- 'Dollar translation: dropped \xD7 conversion \xD7 avg deal (fallback: drop% \xD7 open pipeline) \u2192 "est. lost at handoff".',
13082
- "Layer 2 of the gating stack, with Flow Rate.",
13083
- "Trigger play: Fix the Handoff Gap (fix-handoff-gap) when drop is high.",
13084
- "Levers: source-level handoff audit. Routing and sync repair. Time-to-first-touch SLA. Weekly marketing-only-leads report."
13080
+ "Green 80+, yellow 60+, red below 60.",
13081
+ 'Dollars: dropped \xD7 conversion \xD7 avg deal (fallback: drop% \xD7 open pipeline) \u2192 "est. lost at handoff".',
13082
+ "Read with Flow Rate \u2014 handoff leaks and stuck deals often show up together.",
13083
+ "Weak score \u2192 play Fix the Handoff Gap.",
13084
+ "Useful moves: source-level handoff audit, routing and sync repair, time-to-first-touch SLA, weekly marketing-only-leads report."
13085
13085
  ],
13086
13086
  visual: {
13087
13087
  kind: "funnel",
@@ -13106,21 +13106,21 @@ var init_metric_definitions = __esm({
13106
13106
  kind: "vital",
13107
13107
  label: "Signal:Noise",
13108
13108
  group: "Vital Signs",
13109
- tagline: "How much of the team's effort still aims at deals that can close?",
13110
- how_computed: "Over a 90-day lookback, NTRP computes (signal activities / all activities) \xD7 100. Signal is activity linked to an open opportunity, a pipeline person, or a pipeline organization.",
13109
+ tagline: "How much effort still aims at accounts that can close \u2014 versus dead ends?",
13110
+ how_computed: "We look at the last 90 days of activity and ask what share is signal \u2014 linked to an open deal, a pipeline person, or a pipeline company. The formula lines show the ratio and what counts as signal.",
13111
13111
  formula_lines: [
13112
13112
  "score = (signalCount / activityCount) \xD7 100",
13113
13113
  "signal = linked to open opp / pipeline person / pipeline org",
13114
13114
  "lookback = trailing 90 days"
13115
13115
  ],
13116
- meaning: `We treat Signal:Noise as activity efficiency with a capacity price. Noise hours \xD7 hours_per_activity \xD7 rep_hourly_cost becomes "misdirected effort" \u2014 energy aimed at accounts that can't still close.`,
13116
+ meaning: 'Signal:Noise asks whether activity still points at deals that can close. Noise hours are capacity spent on dead ends. Like a radio stuck between stations \u2014 lots of static, little signal. Those hours show as "misdirected effort."',
13117
13117
  expert_read: "A useful cut is by rep and by account status. Persistent noise often means reps keep working dead accounts they already know \u2014 stale targeting or coverage models more than a coaching gap. Also check whether activity is logged against closed or unlinked records; that can be a hygiene artifact pretending to be effort.",
13118
13118
  deepdive: [
13119
- "Status bands: green 65 or more, yellow 40 or more, red below 40.",
13120
- "Dollar defaults: 0.25 hours/activity \xD7 $75/hr (config: hours_per_activity, rep_hourly_cost).",
13121
- "Layer 3 of the gating stack. Trust Freshness, Flow Rate, and Drop Rate before you read activity efficiency.",
13122
- "Trigger play: Retarget Misdirected Effort (retarget-effort) when the score is low.",
13123
- "Levers: refresh account lists. Signal-based targeting. Stop logging against closed or unlinked records. Coverage-model redesign."
13119
+ "Green 65+, yellow 40+, red below 40.",
13120
+ 'Dollar defaults: 0.25 hours/activity \xD7 $75/hr (config: hours_per_activity, rep_hourly_cost) \u2192 "misdirected effort".',
13121
+ "Read Freshness, Flow Rate, and Drop Rate before you trust this score.",
13122
+ "Weak score \u2192 play Retarget Misdirected Effort.",
13123
+ "Useful moves: refresh account lists, signal-based targeting, stop logging against closed or unlinked records, coverage-model redesign."
13124
13124
  ],
13125
13125
  visual: {
13126
13126
  kind: "split",
@@ -13143,21 +13143,21 @@ var init_metric_definitions = __esm({
13143
13143
  kind: "vital",
13144
13144
  label: "Thread Depth",
13145
13145
  group: "Vital Signs",
13146
- tagline: "How fragile is revenue if one champion changes jobs?",
13147
- how_computed: "Percent of open deals with at least multi_thread_threshold distinct people active in the last 90 days. The default threshold is 2. People include opportunity-direct contacts and same-organization activity.",
13146
+ tagline: "How fragile is a deal if one champion changes jobs?",
13147
+ how_computed: "We ask what share of open deals have at least two people active in the last 90 days. Contacts on the deal and activity at the same company both count. The formula lines show the threshold.",
13148
13148
  formula_lines: [
13149
13149
  "score = % open deals with \u22652 active people (90d)",
13150
13150
  "people counted via opp contacts + same-org activity",
13151
13151
  "threshold configurable (default 2)"
13152
13152
  ],
13153
- meaning: "We read Thread Depth as resilience risk. One single-threaded mega-deal can outweigh ten small ones \u2014 and late-cycle single-threading is especially scary because champions change jobs. The dollar line sums amount on single-threaded deals.",
13154
- expert_read: "Weight by deal size when you triage. Single-threading late in the cycle tends to matter more than early. In enterprise motions, thin threads are often a leading indicator of slipped quarters: the champion leaves and there's no second contact warm enough to carry the deal.",
13153
+ meaning: 'Thread Depth asks how many people keep each deal warm. One contact is a single point of failure \u2014 if they leave, the deal often dies with them. Like a bridge with one cable. Dollars on thin deals show as "single-threaded."',
13154
+ expert_read: "Weight by deal size when you triage \u2014 one thin mega-deal can outweigh ten small ones. Late-cycle single-threading tends to matter more than early. In enterprise motions, thin threads often lead to slipped quarters: the champion leaves and nobody else is warm enough to carry the deal.",
13155
13155
  deepdive: [
13156
- "Status bands: green 65 or more, yellow 40 or more, red below 40.",
13157
- 'Dollar translation: sum of amount on single-threaded deals \u2192 "single-threaded".',
13158
- "Layer 4 of the gating stack. Read this last, after the upstream vital signs.",
13159
- "Trigger play: Multi-Thread Your Deals (multi-thread-deals) when depth is low.",
13160
- "Levers: buying-committee map. Warm internal referral first. CRM contact roles. Mid-stage single-thread alerts. Champion job-change signals."
13156
+ "Green 65+, yellow 40+, red below 40.",
13157
+ 'Dollars: sum of amount on single-threaded deals \u2192 "single-threaded".',
13158
+ "Read this last, after Freshness, Flow Rate, Drop Rate, and Signal:Noise.",
13159
+ "Weak score \u2192 play Multi-Thread Your Deals.",
13160
+ "Useful moves: buying-committee map, warm internal referral first, CRM contact roles, mid-stage single-thread alerts, champion job-change signals."
13161
13161
  ],
13162
13162
  visual: {
13163
13163
  kind: "bars",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonnechasser/ntrp",
3
- "version": "2.2.1",
3
+ "version": "2.2.2",
4
4
  "description": "GTM Health Diagnostic CLI — local pipeline analysis tool",
5
5
  "homepage": "https://ntrp.sonnechasser.com",
6
6
  "repository": {