Skip to content

Track 2 telco template: customer-impact swap (revenue × churn) + reviewer-feedback alignment#79

Open
cafzal wants to merge 2 commits into
mainfrom
track2/telco-customer-impact
Open

Track 2 telco template: customer-impact swap (revenue × churn) + reviewer-feedback alignment#79
cafzal wants to merge 2 commits into
mainfrom
track2/telco-customer-impact

Conversation

@cafzal
Copy link
Copy Markdown
Collaborator

@cafzal cafzal commented Jun 3, 2026

Summary

Replaces PageRank-as-headline on CellTower.weighted_impact with a customer-impact weighting — Subscriber.customer_value = LTV × (1 + churn_risk_score) summed across STATUS == "ACTIVE" callers routed through each tower — keeping PageRank exposed alongside as weighted_pagerank for the secondary network-effect view. Stage 4's MIP objective is unchanged (still reads weighted_impact by name); only the measure underneath shifted.

Per-tower selection rationale added: every selected upgrade carries an operational / advisory/predicted / high-value tag answering the "…and why?" tail of an operator's framing question.

Aligns the template README + runbook with reviewer feedback on the Summit demo.

Why

The previous weighted_impact (sum of caller PageRank influence) answers a network-effects question, not the prioritization question a telco operator actually asks: "how much revenue / what SLA exposure sits behind this tower?" Reviewer feedback specifically flagged PageRank as missing the mark for a telco operator audience. Revenue × churn answers the operator question directly while keeping the graph reasoner's role intact.

Changes

Make the prioritization measure operator-credible

CellTower.weighted_impact now sums Subscriber.customer_value = LTV × (1 + churn_risk_score) over the ACTIVE callers routed through each tower — "how much revenue, weighted by churn risk, sits behind this tower?" The previous PageRank influence sum is retained as CellTower.weighted_pagerank for the secondary network-effect view. Stage 4's objective consumes weighted_impact by name; only the underlying measure shifted.

  • Subscriber gains churn_risk_score, segment, status, and a precomputed customer_value
  • Aggregation filters to STATUS == "ACTIVE" (excludes 24.5% suspended subs)
  • weighted_pagerank is a sibling property; PageRank stays computed by the graph reasoner

Explain why each tower was picked

Every selected upgrade carries a rationale tag (operational / advisory/predicted / high-value) noting which upstream signal(s) drove inclusion, plus a rationale tally alongside the plan. Answers the "…and why?" an operator implicitly asks of the selected set.

Frame the demo honestly

README gains a Demo scope and caveats callout — synthetic-data shape, customer-impact scope (revenue + churn; SLA / strategic-corridor weighting deferred), enterprise concentration (~87% of customer-value from 50 ENT subs — realistic, with tuning knobs called out), and demo-vs-product framing. A notional source-system mapping table follows — OSS/NEM, EMS, NMS, CRM, mediation, vendor portals — typical operator integration sources. Runbook carries a parallel heads-up.

Latent bug surfaced by the swap

Binding-detection threshold lowered from 0.999 → 0.995. PageRank-era runs spent 99.96% of budget (cleared 0.999); customer-impact-weighted runs sit closer to 99.85% — still clearly budget-binding but was misreported as binding=none. New threshold handles both regimes.

Verified

Ran end-to-end against a real Snowflake-backed engine. GNN trained, MIP solved, 4 stages executed cleanly:

Selected upgrades: 27 across 5 regions
Total cost:               $4,992,276  (budget $5,000,000, binding)
Total install crew-weeks: 161         (budget 200, slack)
Capacity restored:        180 Gbps
Tier mix:                 {'BRONZE': 12, 'GOLD': 8, 'SILVER': 7}
Region breakdown:         {'SOUTH': 7, 'EAST': 6, 'WEST': 6, 'CENTRAL': 4, 'NORTH': 4}
Rationale tally: operational=2, advisory/predicted=27, high-value=17
                 (towers can fire on multiple signals)

vs. earlier PageRank-weighted runs (~36 towers, 207 Gbps, 17/15/4 tier mix, 194 install-weeks near-binding): the customer-value-weighted optimizer concentrates spend on fewer strategic towers with more GOLD share; install-weeks slack instead of near-binding. Top-10 subs by customer_value came out all ENTERPRISE_PREMIUM ($597K–$881K each) — confirms the enterprise-concentration caveat at runtime.

ruff check clean. py_compile clean. dev-templates-review post-change pass run; findings addressed in this PR (apologetic GNN-vs-SQL prose removed from README, runbook Section 6 response-density trimmed, chain-ASCII numbers refreshed, stage-number references in Section 7 prompt swapped for property names).

Out of scope (separate PRs)

  • SLA tier extension — needs new SLA_TIER / is_emergency_service CSV fields
  • Strategic-corridor weighting — needs new tower attribute
  • Backhaul coupling constraint — gated on an engine-fit spike
  • Full plan explainability — verbalized RestorePlanLine concept + Cortex agent
  • Richer data model (vendor / sector / band / radio-unit) — separate data-gen rebuild
  • Sharpened GNN-vs-SQL claim in template docsdev-templates-review reclassified it as skill content, not customer-facing template README. Should land in the rai-predictive-modeling skill / agent dialogue instead.

Replaces PageRank-as-headline with revenue × churn customer-impact weighting on weighted_impact, keeping PageRank exposed alongside as a secondary network-effect signal (weighted_pagerank). Stage 4 objective unchanged — reads weighted_impact by name; only the measure underneath shifted.

Subscriber concept gains churn_risk_score, segment, status, and a precomputed customer_value property (LTV × (1 + churn_risk_score)). weighted_impact and weighted_pagerank aggregations filter to STATUS == "ACTIVE" subscribers.

Per-tower selection rationale: each selected tower now carries a rationale tag noting which upstream signal(s) drove inclusion (operational / advisory/predicted / high-value) — answers the "...and why?" tail of the operator framing.

Reviewer-feedback alignment in README + runbook: "Demo scope and caveats" callout (synthetic data, customer-impact scope, enterprise concentration ~87% of customer-value, deferred constraints); sharpened GNN-vs-SQL claim (SQL can do the joins; the GNN learns multi-hop feature interactions); notional source-system mapping (OSS/NMS/CRM/vendor portals); Stage 3 rewrite; Customize section updated for formula tuning.

Out of scope for this PR (separate Track 2 PRs): SLA tier / emergency-service criticality, strategic-corridor weighting, backhaul / F1 (gated on Q4 spike), full G explainability (RestorePlanLine + verbalizer).

Design doc: rai-summit-demo-2026/designs/summit-demo-evolution-plan.md (workstream C-substance, G-partial, B, D, H-lite).
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 3, 2026

The docs preview for this pull request has been deployed to Vercel!

✅ Preview: https://relationalai-docs-6snrmgvpi-relationalai.vercel.app/build/templates
🔍 Inspect: https://vercel.com/relationalai/relationalai-docs/9Wgs8tZx3NZp4S1tQq7JqixZ7bqM

@cafzal cafzal marked this pull request as draft June 3, 2026 14:09
@cafzal cafzal force-pushed the track2/telco-customer-impact branch 2 times, most recently from 4d715c3 to 2c5b584 Compare June 3, 2026 21:27
…book polish + script cleanup

README rewritten to match sample-template structure (Sample data + Model overview sections inserted between Template structure and How it works; Customize grouped under Use your own data / Tune parameters / Extend the model / Scale up; "What you'll build" reframed as outcomes; tiny Quickstart output; GNN spelled out on first use). Reasoner overview / Demo scope and caveats / Source-system mapping folded into canonical sections (Model overview / Sample data / Troubleshooting).

Runbook: sequential-cascade preface added explaining prompts run in order in a single agent session; /rai-* skill names now land under each STAGE label in the chain ASCII; Section 6 (graph) prompt reworked into question shape and anchors PageRank by structural test ("importance flows along incoming directed call edges") rather than naming the algorithm; Section 8 (interpretation) prompt reworded from imperative ("Summarize the plan") to question form.

Script: drop the hardcoded MIP_SOLVER constant — engine-configured solver picks up by default with the gurobi-failure fallback to HiGHS retained. Remove the SQL-vs-GNN comparison stdout block and two stale SQL-vs-GNN comments from Stage 1 (not the template's job to defend a reasoning approach). GNN recall metrics retained.

v1/README.md regenerated from the telco frontmatter description. No behavioral changes to model logic or numerics.
@cafzal cafzal force-pushed the track2/telco-customer-impact branch from 2c5b584 to 18201c3 Compare June 3, 2026 21:33
@cafzal cafzal marked this pull request as ready for review June 3, 2026 21:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant