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. The sample below is in canonical form (Appendix N); the integrity digest is computed by the canonicalizer, not illustrative.
{
"$upg": {
"format_version": "1.0.0",
"spec_version": "0.35.0",
"product": {
"id": "n_5KO9z8qsX-pYKVIb",
"title": "Threadline",
"stage": "growth"
},
"counts": {
"nodes": 18,
"edges": 18
},
"provenance": {
"tool": "upg-mcp-server",
"tool_version": "0.35.0",
"exported_at": "2026-06-18T12:00:00Z"
},
"integrity": {
"algorithm": "sha256-128",
"body": "fd8dad58a55e2939ed01eb8a52ddacac"
}
},
"product": {
"id": "n_5KO9z8qsX-pYKVIb",
"title": "Threadline",
"stage": "growth"
},
"nodes": [
{
"id": "n_Q9KjiuhCDHu6kaEl",
"type": "behavioral_segment",
"title": "Active week-8+",
"properties": {
"segment_type": "behavioral",
"size_estimate": 47
}
},
{
"id": "n_GpnnfzONZPWNeydY",
"type": "behavioral_segment",
"title": "Churned within 30 days",
"properties": {
"segment_type": "behavioral",
"size_estimate": 113
}
},
{
"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_kYKW9gqLeQJ8qVgv",
"type": "customer_feedback",
"title": "Slack request verbatim, Team Lead, churned",
"properties": {
"feedback_type": "review",
"sentiment": "negative"
}
},
{
"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_Pobm-G9CKhm38L5w",
"type": "feature",
"title": "Cross-meeting search",
"status": "proposed"
},
{
"id": "n_eazzaR_5OTzrUa6h",
"type": "feature_area",
"title": "Search & Recall",
"status": "planned"
},
{
"id": "n__zNL5qCsBM0BP3hL",
"type": "feature_request",
"title": "Cross-meeting search: find decisions across past meetings",
"status": "under_review",
"properties": {
"signal_sentiment": "positive",
"vote_count": 8
}
},
{
"id": "n_kTgncoZygHPxoo_v",
"type": "feature_request",
"title": "Slack integration: push action items to a #meetings channel",
"status": "under_review",
"properties": {
"signal_sentiment": "mixed",
"vote_count": 25
}
},
{
"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": {
"confidence_prior": 0.6,
"falsifiable": true
}
},
{
"id": "n_XqLDdZOoqrmufgjd",
"type": "job",
"title": "Decide which feature to ship before the holiday window",
"properties": {
"importance": {
"label": "Critical",
"value": 5
},
"job_type": "functional"
}
},
{
"id": "n_mtjqbFnY0hg3fQPK",
"type": "learning",
"title": "The loudest request is a churn-cohort projection; the quietest request is a retained-cohort pull"
},
{
"id": "n_8B1SNCNbDSs4O8Qr",
"type": "need",
"title": "Stop letting feedback volume decide the roadmap when volume and value are uncorrelated",
"status": "raw",
"properties": {
"severity": {
"label": "Severe",
"value": 4
},
"valence": "pain"
}
},
{
"id": "n_t84XZhG_BeB3FFSt",
"type": "opportunity",
"title": "Cluster feedback by persona × retention bucket to surface the request that retained users actually pull",
"status": "identified"
},
{
"id": "n_SuIk0TASeSWJRFaf",
"type": "persona",
"title": "Felix, solo builder",
"properties": {
"experience_level": "intermediate",
"is_primary": true
}
},
{
"id": "n__xXl1ITTYamOrAAE",
"type": "persona",
"title": "IC Researcher (Threadline user)"
},
{
"id": "n_KEjat6PPvUUhavwH",
"type": "persona",
"title": "Team Lead (Threadline user)"
},
{
"id": "n_Xfn1ags7Jv2udgkJ",
"type": "solution",
"title": "Cluster the last six weeks of feedback by persona × job × retention bucket",
"status": "proposed"
}
],
"edges": [
{
"id": "e6",
"source": "n_DMlhLiZ3a5goK1cf",
"target": "n_DMsfelprtcx5jfQC",
"type": "hypothesis_tested_by_experiment",
"mapping_confidence": "high"
},
{
"id": "e7",
"source": "n_DMsfelprtcx5jfQC",
"target": "n_mtjqbFnY0hg3fQPK",
"type": "experiment_produces_learning",
"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"
},
{
"id": "e12",
"source": "n_RQOfUYFvqmULpGcH",
"target": "n__zNL5qCsBM0BP3hL",
"type": "customer_feedback_becomes_feature_request",
"mapping_confidence": "high"
},
{
"id": "e1",
"source": "n_SuIk0TASeSWJRFaf",
"target": "n_XqLDdZOoqrmufgjd",
"type": "persona_pursues_job",
"mapping_confidence": "high"
},
{
"id": "e5",
"source": "n_Xfn1ags7Jv2udgkJ",
"target": "n_DMlhLiZ3a5goK1cf",
"type": "solution_proposes_hypothesis",
"mapping_confidence": "high"
},
{
"id": "e2",
"source": "n_XqLDdZOoqrmufgjd",
"target": "n_8B1SNCNbDSs4O8Qr",
"type": "job_surfaces_need",
"mapping_confidence": "high"
},
{
"id": "e14",
"source": "n__zNL5qCsBM0BP3hL",
"target": "n_Q9KjiuhCDHu6kaEl",
"type": "feature_request_from_behavioral_segment",
"mapping_confidence": "high"
},
{
"id": "e10",
"source": "n__zNL5qCsBM0BP3hL",
"target": "n_eazzaR_5OTzrUa6h",
"type": "feature_request_in_feature_area",
"mapping_confidence": "high"
},
{
"id": "e16",
"source": "n__zNL5qCsBM0BP3hL",
"target": "n_t84XZhG_BeB3FFSt",
"type": "feature_request_creates_opportunity",
"mapping_confidence": "high"
},
{
"id": "e13",
"source": "n_kTgncoZygHPxoo_v",
"target": "n_GpnnfzONZPWNeydY",
"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": "e11",
"source": "n_kYKW9gqLeQJ8qVgv",
"target": "n_kTgncoZygHPxoo_v",
"type": "customer_feedback_becomes_feature_request",
"mapping_confidence": "high"
},
{
"id": "e9",
"source": "n_mtjqbFnY0hg3fQPK",
"target": "n_Pobm-G9CKhm38L5w",
"type": "learning_informs_feature",
"mapping_confidence": "high"
},
{
"id": "e8",
"source": "n_mtjqbFnY0hg3fQPK",
"target": "n_t84XZhG_BeB3FFSt",
"type": "learning_validates_opportunity",
"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"
}
]
}
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.