Eighteen nodes and eighteen typed edges, drawn from the Threadline reference graph, demonstrating a complete discovery-to-delivery traceability chain and the parallel Customer Feedback chain that fed the decision. Two domains in one traversal: this is the compounding property the paper argues for, made concrete.
{
"upg_version": "0.4.0",
"exported_at": "2026-04-23T12:00:00Z",
"source": { "tool": "upg-mcp-server", "tool_version": "0.2.0" },
"product": {
"id": "n_5KO9z8qsX-pYKVIb",
"title": "Threadline",
"stage": "growth"
},
"nodes": [
{ "id": "n_SuIk0TASeSWJRFaf", "type": "persona",
"title": "Felix, solo builder",
"properties": { "is_primary": true, "experience_level": "intermediate" } },
{ "id": "n_XqLDdZOoqrmufgjd", "type": "job",
"title": "Decide which feature to ship before the holiday window",
"properties": {
"job_type": "functional",
"importance": { "value": 5, "label": "Critical" }
} },
{ "id": "n_8B1SNCNbDSs4O8Qr", "type": "need",
"title": "Stop letting feedback volume decide the roadmap when volume and value are uncorrelated",
"status": "raw",
"properties": { "valence": "pain", "severity": { "value": 4, "label": "Severe" } } },
{ "id": "n_t84XZhG_BeB3FFSt", "type": "opportunity",
"title": "Cluster feedback by persona × retention bucket to surface the request that retained users actually pull",
"status": "identified",
"properties": {
"reach": { "value": 4, "label": "high" },
"frequency": { "value": 4, "label": "every-feature-decision" },
"pain": { "value": 4, "label": "high" }
} },
{ "id": "n_Xfn1ags7Jv2udgkJ", "type": "solution",
"title": "Cluster the last six weeks of feedback by persona × job × retention bucket",
"status": "proposed" },
{ "id": "n_DMlhLiZ3a5goK1cf", "type": "hypothesis",
"title": "One of the three requests is asked by retained week-8+ users at ≥3× the rate of churned users",
"status": "untested",
"properties": { "falsifiable": true, "confidence_prior": 0.6 } },
{ "id": "n_DMsfelprtcx5jfQC", "type": "experiment",
"title": "Tag 60 feedback items in Linear by persona, job-pursued, and retention bucket; recompute volume table",
"status": "done",
"properties": { "duration_days": 1, "method": "manual_tag_then_pivot", "owner": "Felix" } },
{ "id": "n_mtjqbFnY0hg3fQPK", "type": "learning",
"title": "The loudest request is a churn-cohort projection; the quietest request is a retained-cohort pull" },
{ "id": "n_Pobm-G9CKhm38L5w", "type": "feature",
"title": "Cross-meeting search",
"status": "proposed" },
{ "id": "n_eazzaR_5OTzrUa6h", "type": "feature_area",
"title": "Search & Recall",
"status": "planned" },
{ "id": "n_kTgncoZygHPxoo_v", "type": "feature_request",
"title": "Slack integration: push action items to a #meetings channel",
"status": "under_review",
"properties": { "vote_count": 25, "signal_sentiment": "mixed" } },
{ "id": "n__zNL5qCsBM0BP3hL", "type": "feature_request",
"title": "Cross-meeting search: find decisions across past meetings",
"status": "under_review",
"properties": { "vote_count": 8, "signal_sentiment": "positive" } },
{ "id": "n_kYKW9gqLeQJ8qVgv", "type": "customer_feedback",
"title": "Slack request verbatim, Team Lead, churned",
"properties": { "feedback_type": "review", "sentiment": "negative" } },
{ "id": "n_RQOfUYFvqmULpGcH", "type": "customer_feedback",
"title": "Cross-meeting search request verbatim, IC Researcher, week-12 retained",
"properties": { "feedback_type": "interview", "sentiment": "positive" } },
{ "id": "n_GpnnfzONZPWNeydY", "type": "behavioral_segment",
"title": "Churned within 30 days",
"properties": { "size": 113, "segment_type": "behavioral" } },
{ "id": "n_Q9KjiuhCDHu6kaEl", "type": "behavioral_segment",
"title": "Active week-8+",
"properties": { "size": 47, "segment_type": "behavioral" } },
{ "id": "n_KEjat6PPvUUhavwH", "type": "persona",
"title": "Team Lead (Threadline user)" },
{ "id": "n__xXl1ITTYamOrAAE", "type": "persona",
"title": "IC Researcher (Threadline user)" }
],
"edges": [
{ "id": "e1", "source": "n_SuIk0TASeSWJRFaf", "target": "n_XqLDdZOoqrmufgjd",
"type": "persona_pursues_job", "mapping_confidence": "high" },
{ "id": "e2", "source": "n_XqLDdZOoqrmufgjd", "target": "n_8B1SNCNbDSs4O8Qr",
"type": "job_surfaces_need", "mapping_confidence": "high" },
{ "id": "e3", "source": "n_t84XZhG_BeB3FFSt", "target": "n_8B1SNCNbDSs4O8Qr",
"type": "opportunity_addresses_need", "mapping_confidence": "high" },
{ "id": "e4", "source": "n_t84XZhG_BeB3FFSt", "target": "n_Xfn1ags7Jv2udgkJ",
"type": "opportunity_drives_solution", "mapping_confidence": "high" },
{ "id": "e5", "source": "n_Xfn1ags7Jv2udgkJ", "target": "n_DMlhLiZ3a5goK1cf",
"type": "solution_proposes_hypothesis", "mapping_confidence": "high" },
{ "id": "e6", "source": "n_DMlhLiZ3a5goK1cf", "target": "n_DMsfelprtcx5jfQC",
"type": "hypothesis_requires_experiment", "mapping_confidence": "high" },
{ "id": "e7", "source": "n_DMsfelprtcx5jfQC", "target": "n_mtjqbFnY0hg3fQPK",
"type": "experiment_produces_learning", "mapping_confidence": "high" },
{ "id": "e8", "source": "n_mtjqbFnY0hg3fQPK", "target": "n_t84XZhG_BeB3FFSt",
"type": "learning_validates_opportunity", "mapping_confidence": "high" },
{ "id": "e9", "source": "n_mtjqbFnY0hg3fQPK", "target": "n_Pobm-G9CKhm38L5w",
"type": "learning_informs_feature", "mapping_confidence": "high" },
{ "id": "e10", "source": "n__zNL5qCsBM0BP3hL", "target": "n_eazzaR_5OTzrUa6h",
"type": "feature_request_in_feature_area", "mapping_confidence": "high" },
{ "id": "e11", "source": "n_kYKW9gqLeQJ8qVgv", "target": "n_kTgncoZygHPxoo_v",
"type": "customer_feedback_becomes_feature_request", "mapping_confidence": "high" },
{ "id": "e12", "source": "n_RQOfUYFvqmULpGcH", "target": "n__zNL5qCsBM0BP3hL",
"type": "customer_feedback_becomes_feature_request", "mapping_confidence": "high" },
{ "id": "e13", "source": "n_kTgncoZygHPxoo_v", "target": "n_GpnnfzONZPWNeydY",
"type": "feature_request_from_behavioral_segment", "mapping_confidence": "high" },
{ "id": "e14", "source": "n__zNL5qCsBM0BP3hL", "target": "n_Q9KjiuhCDHu6kaEl",
"type": "feature_request_from_behavioral_segment", "mapping_confidence": "high" },
{ "id": "e15", "source": "n_kTgncoZygHPxoo_v", "target": "n_t84XZhG_BeB3FFSt",
"type": "feature_request_creates_opportunity", "mapping_confidence": "high" },
{ "id": "e16", "source": "n__zNL5qCsBM0BP3hL", "target": "n_t84XZhG_BeB3FFSt",
"type": "feature_request_creates_opportunity", "mapping_confidence": "high" },
{ "id": "e17", "source": "n_GpnnfzONZPWNeydY", "target": "n_KEjat6PPvUUhavwH",
"type": "behavioral_segment_maps_to_persona", "mapping_confidence": "high" },
{ "id": "e18", "source": "n_Q9KjiuhCDHu6kaEl", "target": "n__xXl1ITTYamOrAAE",
"type": "behavioral_segment_maps_to_persona", "mapping_confidence": "high" }
],
"_integrity": {
"checksum": "8e42b7f10c9d5a6b1f3e4c2d7a8b9e05",
"verified_at": "2026-04-23T12:00:00Z",
"verified_by": "upg-mcp-server@0.2.0"
}
}
This 18-node graph answers two questions in two traversals over the same data.
Why does the Cross-meeting search feature exist? n_Pobm-G9CKhm38L5w ← n_mtjqbFnY0hg3fQPK ← n_DMsfelprtcx5jfQC ← n_DMlhLiZ3a5goK1cf ← n_Xfn1ags7Jv2udgkJ ← n_t84XZhG_BeB3FFSt ← n_8B1SNCNbDSs4O8Qr ← n_XqLDdZOoqrmufgjd ← n_SuIk0TASeSWJRFaf. The discovery spine reads end to end from the persona to the shipped-decision feature.
Why was the loudest request the wrong one? n_kTgncoZygHPxoo_v → n_GpnnfzONZPWNeydY (Slack feature_request from the Churned within 30 days segment) versus n__zNL5qCsBM0BP3hL → n_Q9KjiuhCDHu6kaEl (Cross-meeting search from the Active week-8+ segment). The customer-feedback chain crosses into the Discovery domain through feature_request_creates_opportunity and supplies the evidence the spine validates. Every edge is typed; every verb reads both directions; every node has a stable ID that will survive the next AI session.