@unified-product-graph/core 0.9.6 → 0.9.8
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/CHANGELOG.md +40 -0
- package/dist/index.cjs +819 -74
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +255 -3
- package/dist/index.d.ts +255 -3
- package/dist/index.js +819 -74
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -707,7 +707,9 @@ var UPG_ENTITY_META = [
|
|
|
707
707
|
{ name: "objective", type_id: "ent_004", maturity: "stable", since: "0.1.0" },
|
|
708
708
|
{ name: "key_result", type_id: "ent_005", maturity: "stable", since: "0.1.0" },
|
|
709
709
|
{ name: "metric", type_id: "ent_006", maturity: "stable", since: "0.1.0" },
|
|
710
|
-
|
|
710
|
+
// F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.2,
|
|
711
|
+
// the metric-quality assessment artefact is settled with no open restructure.
|
|
712
|
+
{ name: "metric_quality_assessment", type_id: "ent_339", maturity: "stable", since: "0.2.2" },
|
|
711
713
|
{ name: "vision", type_id: "ent_007", maturity: "stable", since: "0.1.0" },
|
|
712
714
|
{ name: "mission", type_id: "ent_008", maturity: "stable", since: "0.1.0" },
|
|
713
715
|
{ name: "strategic_theme", type_id: "ent_009", maturity: "stable", since: "0.1.0" },
|
|
@@ -764,8 +766,11 @@ var UPG_ENTITY_META = [
|
|
|
764
766
|
{ name: "market_segment", type_id: "ent_036", maturity: "stable", since: "0.1.0" },
|
|
765
767
|
{ name: "competitive_analysis", type_id: "ent_037", maturity: "stable", since: "0.1.0" },
|
|
766
768
|
// Classification taxonomy hosted by competitive_analysis.
|
|
767
|
-
|
|
768
|
-
|
|
769
|
+
// F7 (UPG-673): graduated proposed → stable at v0.9.x — two minor releases
|
|
770
|
+
// stable since 0.4.0, the taxonomy-axis/value pair backs the competitive-
|
|
771
|
+
// analysis classification spine with no open rename/restructure ticket.
|
|
772
|
+
{ name: "classification_axis", type_id: "ent_346", maturity: "stable", since: "0.4.0" },
|
|
773
|
+
{ name: "classification_value", type_id: "ent_347", maturity: "stable", since: "0.4.0" },
|
|
769
774
|
// ── UX Research ──
|
|
770
775
|
{ name: "research_study", type_id: "ent_038", maturity: "stable", since: "0.1.0" },
|
|
771
776
|
{ name: "research_insight", type_id: "ent_039", maturity: "deprecated", since: "0.1.0", deprecated_in: "0.1.0", replacement: "insight" },
|
|
@@ -805,8 +810,10 @@ var UPG_ENTITY_META = [
|
|
|
805
810
|
{ name: "journey_phase", type_id: "ent_330", maturity: "proposed", since: "0.2.0" },
|
|
806
811
|
{ name: "journey_action", type_id: "ent_331", maturity: "proposed", since: "0.2.0" },
|
|
807
812
|
{ name: "design_decision", type_id: "ent_319", maturity: "deprecated", since: "0.2.0", deprecated_in: "0.2.0", replacement: "decision" },
|
|
808
|
-
|
|
809
|
-
|
|
813
|
+
// F7 (UPG-673): graduated proposed → stable at v0.9.x — proposed since 0.2.0,
|
|
814
|
+
// the brand-identity set (logo + imagery) is settled with no open rename.
|
|
815
|
+
{ name: "brand_logo", type_id: "ent_321", maturity: "stable", since: "0.2.0" },
|
|
816
|
+
{ name: "brand_imagery", type_id: "ent_322", maturity: "stable", since: "0.2.0" },
|
|
810
817
|
// ── Product Spec ──
|
|
811
818
|
{ name: "feature_area", type_id: "ent_314", maturity: "stable", since: "0.1.0" },
|
|
812
819
|
{ name: "feature", type_id: "ent_071", maturity: "stable", since: "0.1.0" },
|
|
@@ -822,6 +829,15 @@ var UPG_ENTITY_META = [
|
|
|
822
829
|
// alias. `story_task` (the original work half) was already collapsed into
|
|
823
830
|
// canonical `task` at v0.4.0. So the canonical shape is: user_story (statement)
|
|
824
831
|
// + task (work), linked by `task_implements_user_story`.
|
|
832
|
+
//
|
|
833
|
+
// F7 (UPG-673) — DEFERRED, deliberately kept `proposed`. The audit flagged
|
|
834
|
+
// user_story as a stable-spine candidate, but the v0.7.0 re-canon contract
|
|
835
|
+
// (UPG-571) freezes maturity at `proposed` until the re-canonicalised name
|
|
836
|
+
// has soaked across a full migration window. `user-story-split.test.ts`
|
|
837
|
+
// ("user_story is canonical again (ent_073, proposed, not deprecated)")
|
|
838
|
+
// asserts `proposed` as the post-re-canon invariant. Graduating here would
|
|
839
|
+
// break that contract; promotion is a separate, ticketed decision once the
|
|
840
|
+
// story_statement → user_story migration has fully aged out.
|
|
825
841
|
{ name: "user_story", type_id: "ent_073", maturity: "proposed", since: "0.1.0" },
|
|
826
842
|
{ name: "story_statement", type_id: "ent_342", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.7.0", replacement: "user_story" },
|
|
827
843
|
{ name: "story_task", type_id: "ent_343", maturity: "deprecated", since: "0.2.7", deprecated_in: "0.4.0", replacement: "task" },
|
|
@@ -1838,8 +1854,11 @@ var UPG_EDGE_CATALOG = {
|
|
|
1838
1854
|
value_proposition_targets_persona_cross_domain: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "cross-domain", source_type: "value_proposition", target_type: "persona" },
|
|
1839
1855
|
revenue_stream_drives_metric: { forward_verb: "drives", reverse_verb: "driven_by", classification: "cross-domain", source_type: "revenue_stream", target_type: "metric" },
|
|
1840
1856
|
// Ring 5 structural edges
|
|
1841
|
-
|
|
1842
|
-
|
|
1857
|
+
// (UPG-668, P-I) These three edges name `funnel_step` but were typed against
|
|
1858
|
+
// `funnel`, so they resolved from the wrong side and were invisible on the
|
|
1859
|
+
// funnel_step card. Repointed to `funnel_step`; keys unchanged.
|
|
1860
|
+
funnel_step_maps_to_journey_step: { forward_verb: "maps_to", reverse_verb: "mapped_by", classification: "cross-domain", source_type: "funnel_step", target_type: "journey_step" },
|
|
1861
|
+
customer_journey_stage_contains_funnel_step: { forward_verb: "contains", reverse_verb: "contained_in", classification: "cross-domain", source_type: "customer_journey_stage", target_type: "funnel_step" },
|
|
1843
1862
|
customer_journey_stage_spans_journey_step: { forward_verb: "spans", reverse_verb: "spanned_by", classification: "cross-domain", source_type: "customer_journey_stage", target_type: "journey_step" },
|
|
1844
1863
|
dependency_blocks_team: { forward_verb: "blocks", reverse_verb: "blocked_by", classification: "cross-domain", source_type: "dependency", target_type: "team" },
|
|
1845
1864
|
dependency_depends_on_team: { forward_verb: "depends_on", reverse_verb: "depended_on_by", classification: "cross-domain", source_type: "dependency", target_type: "team" },
|
|
@@ -1892,7 +1911,7 @@ var UPG_EDGE_CATALOG = {
|
|
|
1892
1911
|
positioning_within_market_segment: { forward_verb: "within", reverse_verb: "positioned_by", classification: "cross-domain", source_type: "positioning", target_type: "market_segment" },
|
|
1893
1912
|
ideal_customer_profile_targets_market_segment: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "cross-domain", source_type: "ideal_customer_profile", target_type: "market_segment" },
|
|
1894
1913
|
launch_amplified_by_marketing_channel: { forward_verb: "amplified_by", reverse_verb: "amplifies", classification: "cross-domain", source_type: "launch", target_type: "marketing_channel" },
|
|
1895
|
-
sales_motion_qualifies_via_funnel_step: { forward_verb: "qualifies_via", reverse_verb: "qualifies_for", classification: "cross-domain", source_type: "sales_motion", target_type: "
|
|
1914
|
+
sales_motion_qualifies_via_funnel_step: { forward_verb: "qualifies_via", reverse_verb: "qualifies_for", classification: "cross-domain", source_type: "sales_motion", target_type: "funnel_step" },
|
|
1896
1915
|
objection_sourced_from_quote: { forward_verb: "sourced_from", reverse_verb: "surfaced_objection", classification: "cross-domain", source_type: "objection", target_type: "quote" },
|
|
1897
1916
|
proof_point_derived_from_evidence: { forward_verb: "derived_from", reverse_verb: "evidences", classification: "cross-domain", source_type: "proof_point", target_type: "evidence" },
|
|
1898
1917
|
proof_point_derived_from_insight: { forward_verb: "derived_from", reverse_verb: "evidences", classification: "cross-domain", source_type: "proof_point", target_type: "insight" },
|
|
@@ -2906,7 +2925,104 @@ var UPG_EDGE_CATALOG = {
|
|
|
2906
2925
|
// to `journey_step_reveals_need` (existing); both express "what
|
|
2907
2926
|
// research surfaces at this step". Useful for any journey-based
|
|
2908
2927
|
// research method (CX mapping, service blueprint, behavioural cohort).
|
|
2909
|
-
journey_step_yields_observation: { forward_verb: "yields", reverse_verb: "yielded_in", classification: "cross-domain", source_type: "journey_step", target_type: "observation" }
|
|
2928
|
+
journey_step_yields_observation: { forward_verb: "yields", reverse_verb: "yielded_in", classification: "cross-domain", source_type: "journey_step", target_type: "observation" },
|
|
2929
|
+
// ── Part 11: F6 (UPG-672) dead-end & missing-bridge pass ────────────────────
|
|
2930
|
+
// P-A (scored / synthesis / verdict leaves with 0 outbound) + P-D (missing
|
|
2931
|
+
// forward bridges) from the 36-domain wiring audit. Every edge below closes a
|
|
2932
|
+
// confirmed dead-end or missing direction. Naming respects the F2 prefix gate
|
|
2933
|
+
// (key begins with its `source_type` as a whole token) and the F3 dup gate (no
|
|
2934
|
+
// source→target pair already in the catalog). Verified against the catalog at
|
|
2935
|
+
// build time; see the F6 commit body for the audit ledger references.
|
|
2936
|
+
// ── F6: Priority 1 — both-sides-verified cross-domain bridges ──────────────
|
|
2937
|
+
// data_classification ↔ privacy_policy (security SEC-3/L5 + legal). The
|
|
2938
|
+
// classification leaf reached only data_source; it could not reach the policy
|
|
2939
|
+
// that governs how it must be handled. A privacy_policy GOVERNS a data
|
|
2940
|
+
// classification (sets retention / handling rules for that sensitivity tier).
|
|
2941
|
+
data_classification_governed_by_privacy_policy: { forward_verb: "governed_by", reverse_verb: "governs", classification: "cross-domain", source_type: "data_classification", target_type: "privacy_policy" },
|
|
2942
|
+
// design_component → a11y conformance (design_system DS-3 + accessibility A).
|
|
2943
|
+
// The whole conformance DIRECTION was missing: a11y_issue → design_component
|
|
2944
|
+
// existed (defect points back), but no component → standard/guideline link
|
|
2945
|
+
// expressing "this component CONFORMS TO this rule". Both the testable
|
|
2946
|
+
// standard and the human-readable guideline are valid conformance targets.
|
|
2947
|
+
design_component_conforms_to_a11y_standard: { forward_verb: "conforms_to", reverse_verb: "governs_conformance_of", classification: "cross-domain", source_type: "design_component", target_type: "a11y_standard" },
|
|
2948
|
+
design_component_conforms_to_a11y_guideline: { forward_verb: "conforms_to", reverse_verb: "governs_conformance_of", classification: "cross-domain", source_type: "design_component", target_type: "a11y_guideline" },
|
|
2949
|
+
// feature_request → feature ship-closure (feedback + product_spec). A request
|
|
2950
|
+
// could reach an opportunity but never the feature that ships it, so the loop
|
|
2951
|
+
// from "user asked" to "we built it" had no closing edge. A feature_request
|
|
2952
|
+
// BECOMES a feature when the team commits to building it.
|
|
2953
|
+
feature_request_becomes_feature: { forward_verb: "becomes", reverse_verb: "originated_from", classification: "cross-domain", source_type: "feature_request", target_type: "feature" },
|
|
2954
|
+
// objective → outcome (OKR spine). objective reached key_result and metric but
|
|
2955
|
+
// not the outcome it exists to move; the strategic spine was severed at its
|
|
2956
|
+
// anchor (0 outbound to outcome). An objective ADVANCES an outcome. Intra-
|
|
2957
|
+
// domain (both in strategy) and directional → causal.
|
|
2958
|
+
objective_advances_outcome: { forward_verb: "advances", reverse_verb: "advanced_by", classification: "causal", source_type: "objective", target_type: "outcome" },
|
|
2959
|
+
// ── F6: Priority 2 — scored / synthesis / verdict dead-end leaves (P-A) ─────
|
|
2960
|
+
// desired_outcome (Ulwick-scored: importance × satisfaction) had 0 outbound —
|
|
2961
|
+
// the scores could not flow anywhere. An under-served desired_outcome REVEALS
|
|
2962
|
+
// an opportunity, and is QUANTIFIED BY the metric that tracks its satisfaction.
|
|
2963
|
+
desired_outcome_reveals_opportunity: { forward_verb: "reveals", reverse_verb: "revealed_by", classification: "cross-domain", source_type: "desired_outcome", target_type: "opportunity" },
|
|
2964
|
+
desired_outcome_quantified_by_metric: { forward_verb: "quantified_by", reverse_verb: "quantifies", classification: "cross-domain", source_type: "desired_outcome", target_type: "metric" },
|
|
2965
|
+
// feasibility_study + design_sprint: discovery VERDICTS with 0 outbound — they
|
|
2966
|
+
// could not reach the decision, solution, or learning they exist to produce.
|
|
2967
|
+
// A study/sprint INFORMS a decision, RECOMMENDS a solution, and PRODUCES a
|
|
2968
|
+
// learning. solution is intra-discovery (semantic); decision (strategy) and
|
|
2969
|
+
// learning (validation) are cross-domain.
|
|
2970
|
+
feasibility_study_informs_decision: { forward_verb: "informs", reverse_verb: "informed_by", classification: "cross-domain", source_type: "feasibility_study", target_type: "decision" },
|
|
2971
|
+
feasibility_study_recommends_solution: { forward_verb: "recommends", reverse_verb: "recommended_by", classification: "semantic", source_type: "feasibility_study", target_type: "solution" },
|
|
2972
|
+
feasibility_study_produces_learning: { forward_verb: "produces", reverse_verb: "produced_by", classification: "cross-domain", source_type: "feasibility_study", target_type: "learning" },
|
|
2973
|
+
design_sprint_informs_decision: { forward_verb: "informs", reverse_verb: "informed_by", classification: "cross-domain", source_type: "design_sprint", target_type: "decision" },
|
|
2974
|
+
design_sprint_recommends_solution: { forward_verb: "recommends", reverse_verb: "recommended_by", classification: "semantic", source_type: "design_sprint", target_type: "solution" },
|
|
2975
|
+
design_sprint_produces_learning: { forward_verb: "produces", reverse_verb: "produced_by", classification: "cross-domain", source_type: "design_sprint", target_type: "learning" },
|
|
2976
|
+
// affinity_cluster → observation (user_research). A cluster synthesised an
|
|
2977
|
+
// insight but could not OWN the raw observations it groups; the cluster's
|
|
2978
|
+
// membership was unrepresentable. Intra-domain ownership → hierarchy.
|
|
2979
|
+
affinity_cluster_groups_observation: { forward_verb: "groups", reverse_verb: "grouped_in", classification: "hierarchy", source_type: "affinity_cluster", target_type: "observation" },
|
|
2980
|
+
// feedback_theme → opportunity (feedback). A theme validated needs and
|
|
2981
|
+
// surfaced insights but could not point at the opportunity it implies — the
|
|
2982
|
+
// theme could not become actionable discovery input.
|
|
2983
|
+
feedback_theme_reveals_opportunity: { forward_verb: "reveals", reverse_verb: "revealed_by", classification: "cross-domain", source_type: "feedback_theme", target_type: "opportunity" },
|
|
2984
|
+
// competitor_feature → capability (market_intelligence). A competitor feature
|
|
2985
|
+
// inspired our solution/feature but could not map to the capability it
|
|
2986
|
+
// demonstrates — competitive capability benchmarking was unrepresentable.
|
|
2987
|
+
competitor_feature_benchmarks_capability: { forward_verb: "benchmarks", reverse_verb: "benchmarked_by", classification: "cross-domain", source_type: "competitor_feature", target_type: "capability" },
|
|
2988
|
+
// switching_cost → competitor (user). A switching cost is the friction of
|
|
2989
|
+
// leaving an incumbent, but the leaf had 0 outbound — it could not name the
|
|
2990
|
+
// competitor it locks the user into. It LOCKS IN a competitor.
|
|
2991
|
+
switching_cost_locks_in_competitor: { forward_verb: "locks_in", reverse_verb: "locked_in_by", classification: "cross-domain", source_type: "switching_cost", target_type: "competitor" },
|
|
2992
|
+
// ── F6: region tail — confirmed dead-end leaves across remaining domains ────
|
|
2993
|
+
// test_result (testing) had 0 outbound — a failing result could not file the
|
|
2994
|
+
// defect it found. A test_result REPORTS a bug.
|
|
2995
|
+
test_result_reports_bug: { forward_verb: "reports", reverse_verb: "reported_by", classification: "cross-domain", source_type: "test_result", target_type: "bug" },
|
|
2996
|
+
// content_piece → social_post (content → marketing). Content reached messaging
|
|
2997
|
+
// and campaigns but not the social post it is repurposed into — the atomisation
|
|
2998
|
+
// step had no edge.
|
|
2999
|
+
content_piece_repurposed_as_social_post: { forward_verb: "repurposed_as", reverse_verb: "repurposed_from", classification: "cross-domain", source_type: "content_piece", target_type: "social_post" },
|
|
3000
|
+
// translation_key (localisation) had 0 outbound — it could neither reach the
|
|
3001
|
+
// content it localises nor the locale it targets. Both bridges close the leaf.
|
|
3002
|
+
// translation_key → content_piece is cross-domain; → locale is intra-domain.
|
|
3003
|
+
translation_key_localises_content_piece: { forward_verb: "localises", reverse_verb: "localised_by", classification: "cross-domain", source_type: "translation_key", target_type: "content_piece" },
|
|
3004
|
+
translation_key_targets_locale: { forward_verb: "targets", reverse_verb: "targeted_by", classification: "semantic", source_type: "translation_key", target_type: "locale" },
|
|
3005
|
+
// partner_revenue_share → revenue_stream (ecosystem → business_model). The
|
|
3006
|
+
// share governed a partner tier but never fed the revenue stream it
|
|
3007
|
+
// contributes to — partner economics could not roll up to the model.
|
|
3008
|
+
partner_revenue_share_feeds_revenue_stream: { forward_verb: "feeds", reverse_verb: "fed_by", classification: "cross-domain", source_type: "partner_revenue_share", target_type: "revenue_stream" },
|
|
3009
|
+
// retrospective (team_org) had 0 outbound — its outputs (learnings, decisions/
|
|
3010
|
+
// action items) could not leave the ceremony. A retrospective PRODUCES a
|
|
3011
|
+
// learning and YIELDS a decision. Both targets cross-domain.
|
|
3012
|
+
retrospective_produces_learning: { forward_verb: "produces", reverse_verb: "produced_in", classification: "cross-domain", source_type: "retrospective", target_type: "learning" },
|
|
3013
|
+
retrospective_yields_decision: { forward_verb: "yields", reverse_verb: "decided_in", classification: "cross-domain", source_type: "retrospective", target_type: "decision" },
|
|
3014
|
+
// status_report → milestone (program_mgmt). A report had 0 outbound; it could
|
|
3015
|
+
// not name the milestone whose status it reports. Intra-domain → semantic.
|
|
3016
|
+
status_report_reports_on_milestone: { forward_verb: "reports_on", reverse_verb: "reported_in", classification: "semantic", source_type: "status_report", target_type: "milestone" },
|
|
3017
|
+
// quote_document → deal (sales). A quote had 0 outbound; it could not advance
|
|
3018
|
+
// the deal it prices. Intra-domain and directional → causal.
|
|
3019
|
+
quote_document_advances_deal: { forward_verb: "advances", reverse_verb: "advanced_by", classification: "causal", source_type: "quote_document", target_type: "deal" },
|
|
3020
|
+
// data_quality_rule → data_source (data_analytics). A quality rule had 0
|
|
3021
|
+
// outbound; it could not name the source it governs. Intra-domain → semantic.
|
|
3022
|
+
data_quality_rule_governs_data_source: { forward_verb: "governs", reverse_verb: "governed_by", classification: "semantic", source_type: "data_quality_rule", target_type: "data_source" },
|
|
3023
|
+
// press_release → launch (marketing → go_to_market). A press release had 0
|
|
3024
|
+
// outbound; it could not name the launch it announces.
|
|
3025
|
+
press_release_announces_launch: { forward_verb: "announces", reverse_verb: "announced_by", classification: "cross-domain", source_type: "press_release", target_type: "launch" }
|
|
2910
3026
|
};
|
|
2911
3027
|
var UPG_POLYMORPHIC_EDGE_KEYS = [
|
|
2912
3028
|
// Universal semantic verbs
|
|
@@ -2970,7 +3086,10 @@ var UPG_CROSS_EDGE_TYPES = [
|
|
|
2970
3086
|
"succeeds",
|
|
2971
3087
|
"hosts",
|
|
2972
3088
|
"contributes_to",
|
|
2973
|
-
"instance_of"
|
|
3089
|
+
"instance_of",
|
|
3090
|
+
"area_serves_persona",
|
|
3091
|
+
"area_targets_market_segment",
|
|
3092
|
+
"rolls_up_to"
|
|
2974
3093
|
];
|
|
2975
3094
|
var REGISTRY_PRODUCT_ID = "registry";
|
|
2976
3095
|
|
|
@@ -3255,7 +3374,11 @@ var UPG_VALID_CHILDREN = {
|
|
|
3255
3374
|
"survey_response"
|
|
3256
3375
|
],
|
|
3257
3376
|
observation: ["quote"],
|
|
3258
|
-
|
|
3377
|
+
// F6 (UPG-672): affinity_cluster owns the observations it groups, in addition
|
|
3378
|
+
// to the insights it synthesises. Pairs with `affinity_cluster_groups_observation`
|
|
3379
|
+
// in the edge catalog (hierarchy). An observation can be both directly owned by
|
|
3380
|
+
// its research_study and grouped under an affinity_cluster (multi-parent grammar).
|
|
3381
|
+
affinity_cluster: ["insight", "observation"],
|
|
3259
3382
|
// insight refines into insight; a raw insight can be distilled
|
|
3260
3383
|
// into a more specific insight (refines_into chain).
|
|
3261
3384
|
// v0.5.8 (UPG-528 Part 2d): insights own their evidencing quotes;
|
|
@@ -10473,6 +10596,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10473
10596
|
},
|
|
10474
10597
|
// LearningPathProperties: Learning path.
|
|
10475
10598
|
learning_path: {
|
|
10599
|
+
path_order: { type: "number", description: "Display order of this path within a curriculum or program (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). Makes a learning_path a deterministically orderable sequence among sibling paths rather than a star." },
|
|
10476
10600
|
path_difficulty: { type: "string", enum: ["beginner", "intermediate", "advanced"], description: "Overall difficulty level of the learning path" },
|
|
10477
10601
|
item_count: { type: "number", description: "Number of items (tutorials, videos, etc.) in the path" },
|
|
10478
10602
|
estimated_hours: { type: "number", description: "Estimated total hours to complete the path" },
|
|
@@ -10622,6 +10746,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10622
10746
|
},
|
|
10623
10747
|
// MilestoneProperties: Milestone.
|
|
10624
10748
|
milestone: {
|
|
10749
|
+
milestone_order: { type: "number", description: "Display order of this milestone within its parent project (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). Orders the delivery milestones a project moves through, independent of `due_date`." },
|
|
10625
10750
|
due_date: { type: "string", description: "Target due date (ISO format)" },
|
|
10626
10751
|
met_on_time: { type: "boolean", description: "Whether the milestone was met on time" }
|
|
10627
10752
|
},
|
|
@@ -10826,6 +10951,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
10826
10951
|
},
|
|
10827
10952
|
// PartnerTierProperties: Partner tier.
|
|
10828
10953
|
partner_tier: {
|
|
10954
|
+
tier_order: { type: "number", description: "Display order of this tier among sibling partner tiers (1 = first tier shown). Mirrors `pricing_tier.tier_order`; part of the spec-wide `*_order` sequence convention (UPG-663 / UPG-674). Distinct from `tier_level`, which is a prestige rank, not a presentation order." },
|
|
10829
10955
|
tier_level: { type: "number", description: "Numeric rank of the tier (higher = more prestigious)" },
|
|
10830
10956
|
requirements: { type: "string[]", description: "What a partner must achieve to reach this tier" },
|
|
10831
10957
|
benefits: { type: "string[]", description: "Benefits granted at this tier level" }
|
|
@@ -11248,6 +11374,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11248
11374
|
},
|
|
11249
11375
|
// ScreenStateProperties: Specific state of a screen.
|
|
11250
11376
|
screen_state: {
|
|
11377
|
+
state_order: { type: "number", description: "Display order of this state within its parent screen (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). Orders the states a screen moves through (e.g. skeleton, loading, populated)." },
|
|
11251
11378
|
state_name: { type: "string", enum: ["empty", "loading", "error", "populated", "skeleton", "partial"], description: "State" },
|
|
11252
11379
|
trigger: { type: "string", description: "Cause for entering this state" },
|
|
11253
11380
|
condition: { type: "string", description: "Data or environmental condition the state represents" },
|
|
@@ -11760,6 +11887,7 @@ var UPG_PROPERTY_SCHEMA = {
|
|
|
11760
11887
|
},
|
|
11761
11888
|
// UserFlowProperties: User flow.
|
|
11762
11889
|
user_flow: {
|
|
11890
|
+
flow_order: { type: "number", description: "Display order of this flow among sibling flows (0-indexed). The scalar ordering convention shared with `journey_step.step_order` and `journey_action.action_order` (UPG-663 / UPG-674). The free-text `steps` array below still captures the within-flow narrative; this scalar makes the flow itself a deterministically orderable sibling." },
|
|
11763
11891
|
trigger: { type: "string", description: "Initiating event" },
|
|
11764
11892
|
steps: { type: "string[]", description: "Ordered steps" },
|
|
11765
11893
|
success_state: { type: "string", description: "Successful completion" },
|
|
@@ -17823,7 +17951,10 @@ var PRIORITY_LABELS = [
|
|
|
17823
17951
|
{
|
|
17824
17952
|
id: "solution",
|
|
17825
17953
|
canonical_label: "Solution",
|
|
17826
|
-
|
|
17954
|
+
// 'concept' stripped (P-B / UPG-670): bare "concept" was shared with the
|
|
17955
|
+
// distinct `design_concept` type. `design_concept` keeps it; here a search
|
|
17956
|
+
// for a solution uses "approach" / "proposed solution".
|
|
17957
|
+
alt_labels: ["proposed solution", "solution idea", "approach"],
|
|
17827
17958
|
framework_labels: {
|
|
17828
17959
|
ost: "Solution",
|
|
17829
17960
|
design_thinking: "Solution",
|
|
@@ -17986,7 +18117,10 @@ var PRIORITY_LABELS = [
|
|
|
17986
18117
|
{
|
|
17987
18118
|
id: "outcome",
|
|
17988
18119
|
canonical_label: "Outcome",
|
|
17989
|
-
|
|
18120
|
+
// 'desired outcome' stripped (P-B / UPG-670): it was the canonical label of
|
|
18121
|
+
// the distinct `desired_outcome` (Ulwick JTBD) type. The OST framework_label
|
|
18122
|
+
// below still surfaces "Desired Outcome" in OST context, framework-scoped.
|
|
18123
|
+
alt_labels: ["product outcome", "business outcome", "target outcome"],
|
|
17990
18124
|
framework_labels: {
|
|
17991
18125
|
ost: "Desired Outcome",
|
|
17992
18126
|
okr_tree: "Outcome"
|
|
@@ -18014,7 +18148,10 @@ var PRIORITY_LABELS = [
|
|
|
18014
18148
|
{
|
|
18015
18149
|
id: "feature",
|
|
18016
18150
|
canonical_label: "Feature",
|
|
18017
|
-
|
|
18151
|
+
// 'capability' stripped (P-B / UPG-670): it is the canonical label of the
|
|
18152
|
+
// distinct `capability` type (Wardley / DDD). A search for "capability" must
|
|
18153
|
+
// resolve there, not to a feature.
|
|
18154
|
+
alt_labels: ["product feature", "functionality"],
|
|
18018
18155
|
framework_labels: {
|
|
18019
18156
|
rice: "Scored Item",
|
|
18020
18157
|
moscow: "Prioritised Item",
|
|
@@ -18085,7 +18222,10 @@ var PRIORITY_LABELS = [
|
|
|
18085
18222
|
{
|
|
18086
18223
|
id: "distribution_channel",
|
|
18087
18224
|
canonical_label: "Distribution Channel",
|
|
18088
|
-
|
|
18225
|
+
// bare 'channel' stripped (P-B / UPG-670): shared 3-way with
|
|
18226
|
+
// `acquisition_channel` and `marketing_channel`. BMC/Lean-Canvas framework
|
|
18227
|
+
// contexts still surface "Channel" via framework_labels below.
|
|
18228
|
+
alt_labels: ["distribution channel", "sales channel", "delivery channel", "distribution"],
|
|
18089
18229
|
framework_labels: {
|
|
18090
18230
|
bmc: "Channel",
|
|
18091
18231
|
lean_canvas: "Channel"
|
|
@@ -18265,7 +18405,8 @@ var PRIORITY_LABELS = [
|
|
|
18265
18405
|
];
|
|
18266
18406
|
var STANDARD_LABELS = {
|
|
18267
18407
|
// Strategic layer
|
|
18268
|
-
|
|
18408
|
+
// 'service' stripped (P-B / UPG-670): canonical label of the distinct `service` type.
|
|
18409
|
+
product: { alt_labels: ["offering", "app", "platform"] },
|
|
18269
18410
|
vision: { alt_labels: ["product vision", "north star vision", "long-term vision"] },
|
|
18270
18411
|
mission: { alt_labels: ["mission statement", "purpose"] },
|
|
18271
18412
|
strategic_theme: { alt_labels: ["focus area", "strategic focus area"] },
|
|
@@ -18283,7 +18424,8 @@ var STANDARD_LABELS = {
|
|
|
18283
18424
|
design_sprint: { alt_labels: ["sprint", "gv sprint", "google ventures sprint"] },
|
|
18284
18425
|
// Validation layer
|
|
18285
18426
|
learning: { alt_labels: ["validated learning", "lesson learned", "takeaway"] },
|
|
18286
|
-
|
|
18427
|
+
// 'experiment plan' stripped (P-B / UPG-670): canonical label of the distinct `experiment_plan` type.
|
|
18428
|
+
test_plan: { alt_labels: ["test strategy", "validation plan"] },
|
|
18287
18429
|
research_plan: { alt_labels: ["study plan", "research brief"] },
|
|
18288
18430
|
evidence: { alt_labels: ["proof", "supporting data", "signal"] },
|
|
18289
18431
|
variant: { alt_labels: ["test variant", "experiment arm", "variation"] },
|
|
@@ -18291,7 +18433,9 @@ var STANDARD_LABELS = {
|
|
|
18291
18433
|
competitor: { alt_labels: ["rival", "alternative", "competitive product", "competing product"] },
|
|
18292
18434
|
competitor_feature: { alt_labels: ["competitive feature", "rival capability"] },
|
|
18293
18435
|
market_trend: { alt_labels: ["trend", "industry trend", "macro trend"] },
|
|
18294
|
-
|
|
18436
|
+
// bare 'segment' stripped (P-B / UPG-670): shared 2-way with `behavioral_segment`.
|
|
18437
|
+
// 'market segment' is the qualified, unambiguous form.
|
|
18438
|
+
market_segment: { alt_labels: ["market segment", "market slice", "tam segment", "sam segment"] },
|
|
18295
18439
|
competitive_analysis: { alt_labels: ["competitor analysis", "competitive landscape", "market analysis"] },
|
|
18296
18440
|
// UX Research layer
|
|
18297
18441
|
research_study: { alt_labels: ["study", "user study", "research project", "ux study"] },
|
|
@@ -18327,7 +18471,8 @@ var STANDARD_LABELS = {
|
|
|
18327
18471
|
brand_typography: { alt_labels: ["typeface", "font family", "type system"] },
|
|
18328
18472
|
brand_voice: { alt_labels: ["tone of voice", "brand tone", "writing style"] },
|
|
18329
18473
|
// Product Specification layer
|
|
18330
|
-
|
|
18474
|
+
// 'initiative' stripped (P-B / UPG-670): canonical label of the distinct `initiative` type.
|
|
18475
|
+
epic: { alt_labels: ["large story", "feature set"] },
|
|
18331
18476
|
feature_area: { alt_labels: ["feature group", "capability area", "module"] },
|
|
18332
18477
|
acceptance_criterion: { alt_labels: ["ac", "done criterion", "acceptance criteria", "definition of done"] },
|
|
18333
18478
|
release: { alt_labels: ["version", "ship", "launch version", "build"] },
|
|
@@ -18341,8 +18486,10 @@ var STANDARD_LABELS = {
|
|
|
18341
18486
|
// Engineering layer
|
|
18342
18487
|
bounded_context: { alt_labels: ["context", "domain boundary", "module boundary"] },
|
|
18343
18488
|
service: { alt_labels: ["microservice", "backend service", "api service"] },
|
|
18344
|
-
|
|
18345
|
-
|
|
18489
|
+
// 'event' stripped (P-B / UPG-670): canonical label of the distinct `event` type.
|
|
18490
|
+
domain_event: { alt_labels: ["system event", "business event"] },
|
|
18491
|
+
// 'contract' stripped (P-B / UPG-670): canonical label of the distinct `contract` (legal) type.
|
|
18492
|
+
api_contract: { alt_labels: ["api spec", "api schema", "openapi spec"] },
|
|
18346
18493
|
technical_debt_item: { alt_labels: ["tech debt", "debt", "tech debt item", "cleanup"] },
|
|
18347
18494
|
feature_flag: { alt_labels: ["flag", "toggle", "feature toggle", "release flag"] },
|
|
18348
18495
|
aggregate: { alt_labels: ["aggregate root", "ddd aggregate"] },
|
|
@@ -18355,15 +18502,19 @@ var STANDARD_LABELS = {
|
|
|
18355
18502
|
queue_topic: { alt_labels: ["topic", "message queue", "event bus topic", "pubsub topic"] },
|
|
18356
18503
|
build_artifact: { alt_labels: ["artifact", "binary", "docker image", "package"] },
|
|
18357
18504
|
code_repository: { alt_labels: ["repo", "repository", "git repo", "codebase"] },
|
|
18358
|
-
|
|
18505
|
+
// 'dependency' stripped (P-B / UPG-670): canonical label of the distinct `dependency` type.
|
|
18506
|
+
library_dependency: { alt_labels: ["package", "library", "npm package"] },
|
|
18359
18507
|
integration_pattern: { alt_labels: ["integration", "pattern", "middleware pattern"] },
|
|
18360
18508
|
external_api: { alt_labels: ["third-party api", "vendor api", "saas integration"] },
|
|
18361
18509
|
data_flow: { alt_labels: ["data movement", "data transfer", "pipeline flow"] },
|
|
18362
18510
|
// Growth layer
|
|
18363
|
-
|
|
18511
|
+
// bare 'channel' stripped (P-B / UPG-670): shared 3-way (see distribution_channel).
|
|
18512
|
+
acquisition_channel: { alt_labels: ["acquisition channel", "traffic source", "user source"] },
|
|
18364
18513
|
growth_campaign: { alt_labels: ["campaign", "marketing campaign", "ad campaign", "growth campaign"] },
|
|
18365
18514
|
cohort: { alt_labels: ["user cohort", "retention cohort", "signup cohort"] },
|
|
18366
|
-
|
|
18515
|
+
// bare 'segment' stripped (P-B / UPG-670): shared 2-way with `market_segment`.
|
|
18516
|
+
// 'behavioral segment' / 'user segment' keep the affordance unambiguously.
|
|
18517
|
+
behavioral_segment: { alt_labels: ["user segment", "audience segment", "behavioural segment"] },
|
|
18367
18518
|
growth_loop: { alt_labels: ["viral loop", "referral loop", "flywheel"] },
|
|
18368
18519
|
attribution_model: { alt_labels: ["attribution", "marketing attribution", "channel attribution"] },
|
|
18369
18520
|
// Business Model layer
|
|
@@ -18392,7 +18543,8 @@ var STANDARD_LABELS = {
|
|
|
18392
18543
|
retrospective: { alt_labels: ["retro", "sprint retro", "team retro", "post-mortem"] },
|
|
18393
18544
|
dependency: { alt_labels: ["team dependency", "cross-team dependency", "blocker"] },
|
|
18394
18545
|
department: { alt_labels: ["org unit", "division", "business unit"] },
|
|
18395
|
-
|
|
18546
|
+
// 'capability' stripped (P-B / UPG-670): canonical label of the distinct `capability` type.
|
|
18547
|
+
skill: { alt_labels: ["competency", "expertise"] },
|
|
18396
18548
|
ceremony: { alt_labels: ["ritual", "meeting cadence", "standup", "retrospective meeting"] },
|
|
18397
18549
|
capacity_plan: { alt_labels: ["resourcing plan", "staffing plan", "headcount plan"] },
|
|
18398
18550
|
// Data & Analytics layer
|
|
@@ -18402,7 +18554,8 @@ var STANDARD_LABELS = {
|
|
|
18402
18554
|
data_model: { alt_labels: ["erd", "entity relationship diagram", "schema model"] },
|
|
18403
18555
|
data_quality_rule: { alt_labels: ["data rule", "quality check", "data validation"] },
|
|
18404
18556
|
data_product: { alt_labels: ["data asset", "data offering"] },
|
|
18405
|
-
|
|
18557
|
+
// 'data flow' stripped (P-B / UPG-670): canonical label of the distinct `data_flow` type.
|
|
18558
|
+
data_pipeline: { alt_labels: ["etl", "elt", "ingestion pipeline"] },
|
|
18406
18559
|
data_lineage: { alt_labels: ["lineage", "data provenance", "data trail"] },
|
|
18407
18560
|
glossary_term: { alt_labels: ["term", "definition", "business term"] },
|
|
18408
18561
|
data_domain: { alt_labels: ["data area", "data subject area"] },
|
|
@@ -18444,7 +18597,8 @@ var STANDARD_LABELS = {
|
|
|
18444
18597
|
error_budget: { alt_labels: ["reliability budget", "downtime budget"] },
|
|
18445
18598
|
investigation: { alt_labels: ["incident investigation", "root cause analysis", "debugging"] },
|
|
18446
18599
|
postmortem: { alt_labels: ["post-mortem", "incident review", "rca", "root cause analysis"] },
|
|
18447
|
-
|
|
18600
|
+
// 'playbook' stripped (P-B / UPG-670): canonical label of the distinct `playbook` type.
|
|
18601
|
+
runbook: { alt_labels: ["operations guide", "sop", "standard operating procedure"] },
|
|
18448
18602
|
monitor: { alt_labels: ["health check", "synthetic monitor", "uptime check"] },
|
|
18449
18603
|
alert_rule: { alt_labels: ["alert", "pager rule", "notification rule"] },
|
|
18450
18604
|
release_strategy: { alt_labels: ["rollout strategy", "deployment strategy", "canary release"] },
|
|
@@ -18459,17 +18613,26 @@ var STANDARD_LABELS = {
|
|
|
18459
18613
|
security_control: { alt_labels: ["control", "safeguard", "countermeasure", "mitigation"] },
|
|
18460
18614
|
security_policy: { alt_labels: ["infosec policy", "security standard"] },
|
|
18461
18615
|
penetration_test: { alt_labels: ["pentest", "pen test", "security test"] },
|
|
18462
|
-
|
|
18616
|
+
// bare 'audit' / 'security assessment' stripped (P-B / UPG-670): both owned by
|
|
18617
|
+
// `security_audit`. A `security_review` is a code-review-scoped activity; the
|
|
18618
|
+
// qualified 'security code review' keeps it findable without colliding.
|
|
18619
|
+
security_review: { alt_labels: ["code review", "security code review"] },
|
|
18463
18620
|
data_classification: { alt_labels: ["classification", "sensitivity level", "data label"] },
|
|
18464
18621
|
access_policy: { alt_labels: ["iam policy", "rbac rule", "permission", "access control"] },
|
|
18465
18622
|
// Sales & Revenue layer
|
|
18466
|
-
|
|
18467
|
-
|
|
18623
|
+
// 'organization' stripped (P-B / UPG-670): canonical label of the distinct `organization` type.
|
|
18624
|
+
account: { alt_labels: ["customer account", "client"] },
|
|
18625
|
+
// 'person' stripped (P-B / UPG-670): canonical label of the distinct `person` type.
|
|
18626
|
+
contact: { alt_labels: ["buyer", "champion"] },
|
|
18468
18627
|
lead: { alt_labels: ["prospect", "mql", "sql", "marketing lead"] },
|
|
18469
|
-
|
|
18628
|
+
// 'opportunity' stripped (P-B / UPG-670): canonical label of the distinct `opportunity` (OST) type.
|
|
18629
|
+
deal: { alt_labels: ["sales opportunity", "opp"] },
|
|
18470
18630
|
pipeline_sales: { alt_labels: ["sales pipeline", "deal pipeline", "revenue pipeline"] },
|
|
18471
18631
|
pipeline_stage: { alt_labels: ["deal stage", "sales stage"] },
|
|
18472
|
-
|
|
18632
|
+
// bare 'quote' qualified to 'sales quote' (P-B / UPG-670): 'quote' is the
|
|
18633
|
+
// canonical label of the distinct `quote` type. The qualified form keeps the
|
|
18634
|
+
// sales-document search affordance without misresolving.
|
|
18635
|
+
quote_document: { alt_labels: ["sales quote", "proposal", "estimate", "quotation"] },
|
|
18473
18636
|
subscription: { alt_labels: ["recurring revenue", "saas subscription", "plan"] },
|
|
18474
18637
|
invoice: { alt_labels: ["bill", "payment request"] },
|
|
18475
18638
|
forecast: { alt_labels: ["revenue forecast", "sales forecast", "projection"] },
|
|
@@ -18490,7 +18653,8 @@ var STANDARD_LABELS = {
|
|
|
18490
18653
|
a11y_annotation: { alt_labels: ["accessibility annotation", "aria note"] },
|
|
18491
18654
|
// Marketing & Communications layer
|
|
18492
18655
|
marketing_strategy: { alt_labels: ["marketing plan", "growth strategy"] },
|
|
18493
|
-
|
|
18656
|
+
// bare 'channel' stripped (P-B / UPG-670): shared 3-way (see distribution_channel).
|
|
18657
|
+
marketing_channel: { alt_labels: ["marketing channel", "paid channel", "organic channel"] },
|
|
18494
18658
|
marketing_campaign_plan: { alt_labels: ["campaign plan", "launch campaign"] },
|
|
18495
18659
|
email_sequence: { alt_labels: ["drip campaign", "nurture sequence", "email flow"] },
|
|
18496
18660
|
social_post: { alt_labels: ["tweet", "linkedin post", "social media post"] },
|
|
@@ -18564,7 +18728,9 @@ var STANDARD_LABELS = {
|
|
|
18564
18728
|
agent_session: { alt_labels: ["session", "agent run", "agent conversation"] },
|
|
18565
18729
|
review_gate: { alt_labels: ["approval gate", "quality gate", "stage gate"] },
|
|
18566
18730
|
approval_record: { alt_labels: ["approval", "sign-off", "authorization"] },
|
|
18567
|
-
|
|
18731
|
+
// bare 'skill' qualified to 'agent skill' (P-B / UPG-670): 'skill' is the
|
|
18732
|
+
// canonical label of the distinct team_org `skill` type.
|
|
18733
|
+
agent_skill: { alt_labels: ["agent skill", "tool", "agent capability"] },
|
|
18568
18734
|
agent_hook: { alt_labels: ["hook", "trigger", "callback"] },
|
|
18569
18735
|
workflow_artifact: { alt_labels: ["artifact", "output artifact", "generated artifact"] },
|
|
18570
18736
|
// Portfolio layer
|
|
@@ -23708,6 +23874,96 @@ var UPG_ANTI_PATTERNS = [
|
|
|
23708
23874
|
stages: ["concept", "validation", "build", "beta", "launch", "growth"],
|
|
23709
23875
|
severity: "high",
|
|
23710
23876
|
source: { kind: "fundamental" }
|
|
23877
|
+
},
|
|
23878
|
+
// ── F5 (UPG-671): anti-pattern enforcement ────────────────────────────────
|
|
23879
|
+
// P-C from the 36-domain wiring audit: domain-guide anti-patterns described
|
|
23880
|
+
// in prose with no machine-checkable detector. These two map cleanly to a
|
|
23881
|
+
// RelationshipCheck (edge presence/absence) and are promoted here.
|
|
23882
|
+
{
|
|
23883
|
+
id: "insights-without-evidence",
|
|
23884
|
+
name: "Insights without evidence",
|
|
23885
|
+
description: "The graph has insight entities but none are backed by a primary-evidence link: no observation yields them (`observation_yields_insight`), no survey response evidences them (`survey_response_evidences_insight`), and no quote is attached (`insight_evidenced_by_quote`). An insight with no evidence behind it is an opinion wearing a research label.",
|
|
23886
|
+
structured_condition: {
|
|
23887
|
+
operator: "and",
|
|
23888
|
+
checks: [
|
|
23889
|
+
{ check: { type: "entity_count", entity_type: "insight", comparison: "nonzero" } },
|
|
23890
|
+
{
|
|
23891
|
+
check: {
|
|
23892
|
+
type: "relationship",
|
|
23893
|
+
source_type: "observation",
|
|
23894
|
+
edge_type: "observation_yields_insight",
|
|
23895
|
+
target_type: "insight",
|
|
23896
|
+
comparison: "not_exists"
|
|
23897
|
+
}
|
|
23898
|
+
},
|
|
23899
|
+
{
|
|
23900
|
+
check: {
|
|
23901
|
+
type: "relationship",
|
|
23902
|
+
source_type: "survey_response",
|
|
23903
|
+
edge_type: "survey_response_evidences_insight",
|
|
23904
|
+
target_type: "insight",
|
|
23905
|
+
comparison: "not_exists"
|
|
23906
|
+
}
|
|
23907
|
+
},
|
|
23908
|
+
{
|
|
23909
|
+
check: {
|
|
23910
|
+
type: "relationship",
|
|
23911
|
+
source_type: "insight",
|
|
23912
|
+
edge_type: "insight_evidenced_by_quote",
|
|
23913
|
+
target_type: "quote",
|
|
23914
|
+
comparison: "not_exists"
|
|
23915
|
+
}
|
|
23916
|
+
}
|
|
23917
|
+
]
|
|
23918
|
+
},
|
|
23919
|
+
why_it_matters: "Insights untethered from evidence cannot be trusted, contested, or traced. Downstream opportunities and design questions inherit an unfalsifiable claim.",
|
|
23920
|
+
remediation: "Back each insight with at least one primary record via `observation_yields_insight`, `survey_response_evidences_insight`, or `insight_evidenced_by_quote`. Capture the supporting observation or quote first.",
|
|
23921
|
+
stages: ["concept", "validation", "build", "beta", "launch", "growth", "mature"],
|
|
23922
|
+
severity: "high",
|
|
23923
|
+
source: { kind: "practitioner", attribution: "Steve Portigal, Interviewing Users" }
|
|
23924
|
+
},
|
|
23925
|
+
{
|
|
23926
|
+
id: "feature-requests-without-provenance",
|
|
23927
|
+
name: "Feature requests without provenance",
|
|
23928
|
+
description: "The graph has feature_request entities but none trace back to a source: no feedback program collects them (`feedback_program_collects_feature_request`), no customer feedback becomes one (`customer_feedback_becomes_feature_request`), and none originate from a behavioural segment (`feature_request_from_behavioral_segment`). A request with no provenance cannot be weighed against who asked or how many.",
|
|
23929
|
+
structured_condition: {
|
|
23930
|
+
operator: "and",
|
|
23931
|
+
checks: [
|
|
23932
|
+
{ check: { type: "entity_count", entity_type: "feature_request", comparison: "nonzero" } },
|
|
23933
|
+
{
|
|
23934
|
+
check: {
|
|
23935
|
+
type: "relationship",
|
|
23936
|
+
source_type: "feedback_program",
|
|
23937
|
+
edge_type: "feedback_program_collects_feature_request",
|
|
23938
|
+
target_type: "feature_request",
|
|
23939
|
+
comparison: "not_exists"
|
|
23940
|
+
}
|
|
23941
|
+
},
|
|
23942
|
+
{
|
|
23943
|
+
check: {
|
|
23944
|
+
type: "relationship",
|
|
23945
|
+
source_type: "customer_feedback",
|
|
23946
|
+
edge_type: "customer_feedback_becomes_feature_request",
|
|
23947
|
+
target_type: "feature_request",
|
|
23948
|
+
comparison: "not_exists"
|
|
23949
|
+
}
|
|
23950
|
+
},
|
|
23951
|
+
{
|
|
23952
|
+
check: {
|
|
23953
|
+
type: "relationship",
|
|
23954
|
+
source_type: "feature_request",
|
|
23955
|
+
edge_type: "feature_request_from_behavioral_segment",
|
|
23956
|
+
target_type: "behavioral_segment",
|
|
23957
|
+
comparison: "not_exists"
|
|
23958
|
+
}
|
|
23959
|
+
}
|
|
23960
|
+
]
|
|
23961
|
+
},
|
|
23962
|
+
why_it_matters: "Requests without a source get prioritised on volume of voice, not on the strength or fit of who is asking. The loudest channel wins by default.",
|
|
23963
|
+
remediation: "Attach provenance to each `feature_request` via `feedback_program_collects_feature_request`, `customer_feedback_becomes_feature_request`, or `feature_request_from_behavioral_segment` before it enters prioritisation.",
|
|
23964
|
+
stages: ["beta", "launch", "growth", "mature"],
|
|
23965
|
+
severity: "medium",
|
|
23966
|
+
source: { kind: "practitioner", attribution: "Marty Cagan, Inspired (product discovery)" }
|
|
23711
23967
|
}
|
|
23712
23968
|
];
|
|
23713
23969
|
function getAntiPatternById(id) {
|
|
@@ -24046,6 +24302,10 @@ var UPG_REGIONS = [
|
|
|
24046
24302
|
"strategy"
|
|
24047
24303
|
],
|
|
24048
24304
|
entities: [
|
|
24305
|
+
{
|
|
24306
|
+
type: "product",
|
|
24307
|
+
role: "container"
|
|
24308
|
+
},
|
|
24049
24309
|
{
|
|
24050
24310
|
type: "vision",
|
|
24051
24311
|
role: "root"
|
|
@@ -24085,7 +24345,11 @@ var UPG_REGIONS = [
|
|
|
24085
24345
|
{
|
|
24086
24346
|
type: "metric",
|
|
24087
24347
|
role: "leaf",
|
|
24088
|
-
notes: "
|
|
24348
|
+
notes: "also anchors Analytics; canonical home is Strategy"
|
|
24349
|
+
},
|
|
24350
|
+
{
|
|
24351
|
+
type: "metric_quality_assessment",
|
|
24352
|
+
role: "leaf"
|
|
24089
24353
|
},
|
|
24090
24354
|
{
|
|
24091
24355
|
type: "decision",
|
|
@@ -24096,6 +24360,10 @@ var UPG_REGIONS = [
|
|
|
24096
24360
|
type: "assumption",
|
|
24097
24361
|
role: "leaf"
|
|
24098
24362
|
},
|
|
24363
|
+
{
|
|
24364
|
+
type: "constraint",
|
|
24365
|
+
role: "leaf"
|
|
24366
|
+
},
|
|
24099
24367
|
{
|
|
24100
24368
|
type: "outcome",
|
|
24101
24369
|
role: "hub"
|
|
@@ -24209,7 +24477,7 @@ var UPG_REGIONS = [
|
|
|
24209
24477
|
{
|
|
24210
24478
|
type: "participant",
|
|
24211
24479
|
role: "leaf",
|
|
24212
|
-
notes: "research-resolved persona"
|
|
24480
|
+
notes: "research-resolved persona; canonical home is Discovery/Research/Validation"
|
|
24213
24481
|
}
|
|
24214
24482
|
],
|
|
24215
24483
|
anchor: {
|
|
@@ -24380,6 +24648,14 @@ var UPG_REGIONS = [
|
|
|
24380
24648
|
role: "hub",
|
|
24381
24649
|
notes: "self-nesting"
|
|
24382
24650
|
},
|
|
24651
|
+
{
|
|
24652
|
+
type: "experiment_plan",
|
|
24653
|
+
role: "container"
|
|
24654
|
+
},
|
|
24655
|
+
{
|
|
24656
|
+
type: "experiment_run",
|
|
24657
|
+
role: "container"
|
|
24658
|
+
},
|
|
24383
24659
|
{
|
|
24384
24660
|
type: "learning",
|
|
24385
24661
|
role: "leaf"
|
|
@@ -24549,10 +24825,6 @@ var UPG_REGIONS = [
|
|
|
24549
24825
|
type: "competitive_analysis",
|
|
24550
24826
|
role: "container"
|
|
24551
24827
|
},
|
|
24552
|
-
{
|
|
24553
|
-
type: "territory",
|
|
24554
|
-
role: "leaf"
|
|
24555
|
-
},
|
|
24556
24828
|
{
|
|
24557
24829
|
type: "classification_axis",
|
|
24558
24830
|
role: "container",
|
|
@@ -24572,7 +24844,7 @@ var UPG_REGIONS = [
|
|
|
24572
24844
|
},
|
|
24573
24845
|
intra_edges: [
|
|
24574
24846
|
"competitor_offers_competitor_feature",
|
|
24575
|
-
"
|
|
24847
|
+
"competitive_analysis_analyses_competitor",
|
|
24576
24848
|
"competitive_analysis_dimensioned_by_classification_axis",
|
|
24577
24849
|
"classification_axis_includes_classification_value",
|
|
24578
24850
|
"competitor_classified_as_classification_value"
|
|
@@ -24673,6 +24945,10 @@ var UPG_REGIONS = [
|
|
|
24673
24945
|
type: "screen",
|
|
24674
24946
|
role: "leaf"
|
|
24675
24947
|
},
|
|
24948
|
+
{
|
|
24949
|
+
type: "screen_state",
|
|
24950
|
+
role: "leaf"
|
|
24951
|
+
},
|
|
24676
24952
|
{
|
|
24677
24953
|
type: "wireframe",
|
|
24678
24954
|
role: "leaf"
|
|
@@ -24750,6 +25026,18 @@ var UPG_REGIONS = [
|
|
|
24750
25026
|
type: "content_piece",
|
|
24751
25027
|
role: "leaf"
|
|
24752
25028
|
},
|
|
25029
|
+
{
|
|
25030
|
+
type: "knowledge_base_article",
|
|
25031
|
+
role: "leaf"
|
|
25032
|
+
},
|
|
25033
|
+
{
|
|
25034
|
+
type: "content_calendar",
|
|
25035
|
+
role: "container"
|
|
25036
|
+
},
|
|
25037
|
+
{
|
|
25038
|
+
type: "documentation_template",
|
|
25039
|
+
role: "leaf"
|
|
25040
|
+
},
|
|
24753
25041
|
{
|
|
24754
25042
|
type: "document",
|
|
24755
25043
|
role: "leaf"
|
|
@@ -24768,13 +25056,13 @@ var UPG_REGIONS = [
|
|
|
24768
25056
|
intra_edges: [
|
|
24769
25057
|
"user_journey_contains_journey_step",
|
|
24770
25058
|
"design_system_contains_design_component",
|
|
24771
|
-
"
|
|
24772
|
-
"
|
|
25059
|
+
"brand_identity_coloured_with_brand_colour",
|
|
25060
|
+
"design_component_composes_design_component"
|
|
24773
25061
|
],
|
|
24774
25062
|
boundary_edges: [
|
|
24775
25063
|
{
|
|
24776
25064
|
direction: "import",
|
|
24777
|
-
edge_id: "
|
|
25065
|
+
edge_id: "need_reframed_as_design_question",
|
|
24778
25066
|
crosses_into: "users_needs"
|
|
24779
25067
|
},
|
|
24780
25068
|
{
|
|
@@ -24798,8 +25086,8 @@ var UPG_REGIONS = [
|
|
|
24798
25086
|
crosses_into: "engineering_platform"
|
|
24799
25087
|
},
|
|
24800
25088
|
{
|
|
24801
|
-
direction: "
|
|
24802
|
-
edge_id: "
|
|
25089
|
+
direction: "export",
|
|
25090
|
+
edge_id: "wireframe_specifies_feature",
|
|
24803
25091
|
crosses_into: "product_delivery"
|
|
24804
25092
|
},
|
|
24805
25093
|
{
|
|
@@ -24874,20 +25162,68 @@ var UPG_REGIONS = [
|
|
|
24874
25162
|
role: "container",
|
|
24875
25163
|
notes: "semantic spanner, not containment"
|
|
24876
25164
|
},
|
|
25165
|
+
{
|
|
25166
|
+
type: "changelog",
|
|
25167
|
+
role: "leaf"
|
|
25168
|
+
},
|
|
25169
|
+
{
|
|
25170
|
+
type: "feedback_program",
|
|
25171
|
+
role: "container"
|
|
25172
|
+
},
|
|
25173
|
+
{
|
|
25174
|
+
type: "feature_request",
|
|
25175
|
+
role: "leaf"
|
|
25176
|
+
},
|
|
25177
|
+
{
|
|
25178
|
+
type: "feedback_vote",
|
|
25179
|
+
role: "leaf"
|
|
25180
|
+
},
|
|
25181
|
+
{
|
|
25182
|
+
type: "nps_campaign",
|
|
25183
|
+
role: "leaf"
|
|
25184
|
+
},
|
|
25185
|
+
{
|
|
25186
|
+
type: "user_advisory_board",
|
|
25187
|
+
role: "container"
|
|
25188
|
+
},
|
|
25189
|
+
{
|
|
25190
|
+
type: "beta_program",
|
|
25191
|
+
role: "leaf"
|
|
25192
|
+
},
|
|
25193
|
+
{
|
|
25194
|
+
type: "feedback_theme",
|
|
25195
|
+
role: "leaf"
|
|
25196
|
+
},
|
|
25197
|
+
{
|
|
25198
|
+
type: "program",
|
|
25199
|
+
role: "container"
|
|
25200
|
+
},
|
|
25201
|
+
{
|
|
25202
|
+
type: "project",
|
|
25203
|
+
role: "container"
|
|
25204
|
+
},
|
|
24877
25205
|
{
|
|
24878
25206
|
type: "milestone",
|
|
25207
|
+
role: "leaf"
|
|
25208
|
+
},
|
|
25209
|
+
{
|
|
25210
|
+
type: "risk_register",
|
|
24879
25211
|
role: "container"
|
|
24880
25212
|
},
|
|
24881
25213
|
{
|
|
24882
|
-
type: "
|
|
25214
|
+
type: "change_request",
|
|
24883
25215
|
role: "leaf"
|
|
24884
25216
|
},
|
|
24885
25217
|
{
|
|
24886
|
-
type: "
|
|
25218
|
+
type: "deliverable",
|
|
24887
25219
|
role: "leaf"
|
|
24888
25220
|
},
|
|
24889
25221
|
{
|
|
24890
|
-
type: "
|
|
25222
|
+
type: "resource_allocation",
|
|
25223
|
+
role: "leaf"
|
|
25224
|
+
},
|
|
25225
|
+
{
|
|
25226
|
+
type: "status_report",
|
|
24891
25227
|
role: "leaf"
|
|
24892
25228
|
}
|
|
24893
25229
|
],
|
|
@@ -24956,8 +25292,8 @@ var UPG_REGIONS = [
|
|
|
24956
25292
|
crosses_into: "discovery_research_validation"
|
|
24957
25293
|
},
|
|
24958
25294
|
{
|
|
24959
|
-
direction: "
|
|
24960
|
-
edge_id: "
|
|
25295
|
+
direction: "import",
|
|
25296
|
+
edge_id: "wireframe_specifies_feature",
|
|
24961
25297
|
crosses_into: "experience_design_brand"
|
|
24962
25298
|
},
|
|
24963
25299
|
{
|
|
@@ -25020,10 +25356,6 @@ var UPG_REGIONS = [
|
|
|
25020
25356
|
type: "database_schema",
|
|
25021
25357
|
role: "leaf"
|
|
25022
25358
|
},
|
|
25023
|
-
{
|
|
25024
|
-
type: "data_model",
|
|
25025
|
-
role: "leaf"
|
|
25026
|
-
},
|
|
25027
25359
|
{
|
|
25028
25360
|
type: "aggregate",
|
|
25029
25361
|
role: "container"
|
|
@@ -25088,6 +25420,111 @@ var UPG_REGIONS = [
|
|
|
25088
25420
|
{
|
|
25089
25421
|
type: "technical_debt_item",
|
|
25090
25422
|
role: "leaf"
|
|
25423
|
+
},
|
|
25424
|
+
{
|
|
25425
|
+
type: "investigation",
|
|
25426
|
+
role: "container"
|
|
25427
|
+
},
|
|
25428
|
+
{
|
|
25429
|
+
type: "root_cause",
|
|
25430
|
+
role: "container"
|
|
25431
|
+
},
|
|
25432
|
+
{
|
|
25433
|
+
type: "symptom",
|
|
25434
|
+
role: "leaf"
|
|
25435
|
+
},
|
|
25436
|
+
{
|
|
25437
|
+
type: "fix",
|
|
25438
|
+
role: "leaf"
|
|
25439
|
+
},
|
|
25440
|
+
{
|
|
25441
|
+
type: "ai_model",
|
|
25442
|
+
role: "container"
|
|
25443
|
+
},
|
|
25444
|
+
{
|
|
25445
|
+
type: "prompt_template",
|
|
25446
|
+
role: "leaf"
|
|
25447
|
+
},
|
|
25448
|
+
{
|
|
25449
|
+
type: "prompt_version",
|
|
25450
|
+
role: "leaf"
|
|
25451
|
+
},
|
|
25452
|
+
{
|
|
25453
|
+
type: "eval_benchmark",
|
|
25454
|
+
role: "container"
|
|
25455
|
+
},
|
|
25456
|
+
{
|
|
25457
|
+
type: "eval_run",
|
|
25458
|
+
role: "leaf"
|
|
25459
|
+
},
|
|
25460
|
+
{
|
|
25461
|
+
type: "ai_cost_tracker",
|
|
25462
|
+
role: "leaf"
|
|
25463
|
+
},
|
|
25464
|
+
{
|
|
25465
|
+
type: "hallucination_report",
|
|
25466
|
+
role: "leaf"
|
|
25467
|
+
},
|
|
25468
|
+
{
|
|
25469
|
+
type: "ai_guardrail",
|
|
25470
|
+
role: "leaf"
|
|
25471
|
+
},
|
|
25472
|
+
{
|
|
25473
|
+
type: "model_comparison",
|
|
25474
|
+
role: "leaf"
|
|
25475
|
+
},
|
|
25476
|
+
{
|
|
25477
|
+
type: "ai_experiment",
|
|
25478
|
+
role: "leaf"
|
|
25479
|
+
},
|
|
25480
|
+
{
|
|
25481
|
+
type: "ai_dataset",
|
|
25482
|
+
role: "leaf"
|
|
25483
|
+
},
|
|
25484
|
+
{
|
|
25485
|
+
type: "ai_trace",
|
|
25486
|
+
role: "container",
|
|
25487
|
+
notes: "self-nesting inference chain"
|
|
25488
|
+
},
|
|
25489
|
+
{
|
|
25490
|
+
type: "workflow_template",
|
|
25491
|
+
role: "container"
|
|
25492
|
+
},
|
|
25493
|
+
{
|
|
25494
|
+
type: "workflow_run",
|
|
25495
|
+
role: "container"
|
|
25496
|
+
},
|
|
25497
|
+
{
|
|
25498
|
+
type: "workflow_artifact",
|
|
25499
|
+
role: "leaf"
|
|
25500
|
+
},
|
|
25501
|
+
{
|
|
25502
|
+
type: "agent_definition",
|
|
25503
|
+
role: "container"
|
|
25504
|
+
},
|
|
25505
|
+
{
|
|
25506
|
+
type: "agent_session",
|
|
25507
|
+
role: "leaf"
|
|
25508
|
+
},
|
|
25509
|
+
{
|
|
25510
|
+
type: "agent_skill",
|
|
25511
|
+
role: "leaf"
|
|
25512
|
+
},
|
|
25513
|
+
{
|
|
25514
|
+
type: "agent_hook",
|
|
25515
|
+
role: "leaf"
|
|
25516
|
+
},
|
|
25517
|
+
{
|
|
25518
|
+
type: "agent_task",
|
|
25519
|
+
role: "leaf"
|
|
25520
|
+
},
|
|
25521
|
+
{
|
|
25522
|
+
type: "review_gate",
|
|
25523
|
+
role: "container"
|
|
25524
|
+
},
|
|
25525
|
+
{
|
|
25526
|
+
type: "approval_record",
|
|
25527
|
+
role: "leaf"
|
|
25091
25528
|
}
|
|
25092
25529
|
],
|
|
25093
25530
|
anchor: {
|
|
@@ -25106,7 +25543,7 @@ var UPG_REGIONS = [
|
|
|
25106
25543
|
"service_depends_on_library_dependency",
|
|
25107
25544
|
"service_carries_technical_debt_item",
|
|
25108
25545
|
"service_toggles_feature_flag",
|
|
25109
|
-
"
|
|
25546
|
+
"service_affected_by_root_cause",
|
|
25110
25547
|
"service_investigated_via_investigation"
|
|
25111
25548
|
],
|
|
25112
25549
|
boundary_edges: [
|
|
@@ -25190,6 +25627,26 @@ var UPG_REGIONS = [
|
|
|
25190
25627
|
type: "unit_economics",
|
|
25191
25628
|
role: "leaf"
|
|
25192
25629
|
},
|
|
25630
|
+
{
|
|
25631
|
+
type: "partnership",
|
|
25632
|
+
role: "leaf"
|
|
25633
|
+
},
|
|
25634
|
+
{
|
|
25635
|
+
type: "key_resource",
|
|
25636
|
+
role: "leaf"
|
|
25637
|
+
},
|
|
25638
|
+
{
|
|
25639
|
+
type: "key_activity",
|
|
25640
|
+
role: "leaf"
|
|
25641
|
+
},
|
|
25642
|
+
{
|
|
25643
|
+
type: "customer_relationship",
|
|
25644
|
+
role: "leaf"
|
|
25645
|
+
},
|
|
25646
|
+
{
|
|
25647
|
+
type: "distribution_channel",
|
|
25648
|
+
role: "leaf"
|
|
25649
|
+
},
|
|
25193
25650
|
{
|
|
25194
25651
|
type: "pricing_strategy",
|
|
25195
25652
|
role: "root"
|
|
@@ -25198,6 +25655,18 @@ var UPG_REGIONS = [
|
|
|
25198
25655
|
type: "pricing_tier",
|
|
25199
25656
|
role: "leaf"
|
|
25200
25657
|
},
|
|
25658
|
+
{
|
|
25659
|
+
type: "discount_strategy",
|
|
25660
|
+
role: "leaf"
|
|
25661
|
+
},
|
|
25662
|
+
{
|
|
25663
|
+
type: "trial_config",
|
|
25664
|
+
role: "leaf"
|
|
25665
|
+
},
|
|
25666
|
+
{
|
|
25667
|
+
type: "paywall",
|
|
25668
|
+
role: "leaf"
|
|
25669
|
+
},
|
|
25201
25670
|
{
|
|
25202
25671
|
type: "gtm_strategy",
|
|
25203
25672
|
role: "root"
|
|
@@ -25214,10 +25683,30 @@ var UPG_REGIONS = [
|
|
|
25214
25683
|
type: "messaging",
|
|
25215
25684
|
role: "leaf"
|
|
25216
25685
|
},
|
|
25686
|
+
{
|
|
25687
|
+
type: "content_strategy",
|
|
25688
|
+
role: "container"
|
|
25689
|
+
},
|
|
25690
|
+
{
|
|
25691
|
+
type: "sales_motion",
|
|
25692
|
+
role: "leaf"
|
|
25693
|
+
},
|
|
25694
|
+
{
|
|
25695
|
+
type: "demand_gen_program",
|
|
25696
|
+
role: "leaf"
|
|
25697
|
+
},
|
|
25698
|
+
{
|
|
25699
|
+
type: "territory",
|
|
25700
|
+
role: "leaf"
|
|
25701
|
+
},
|
|
25217
25702
|
{
|
|
25218
25703
|
type: "objection",
|
|
25219
25704
|
role: "leaf"
|
|
25220
25705
|
},
|
|
25706
|
+
{
|
|
25707
|
+
type: "rebuttal",
|
|
25708
|
+
role: "container"
|
|
25709
|
+
},
|
|
25221
25710
|
{
|
|
25222
25711
|
type: "proof_point",
|
|
25223
25712
|
role: "leaf"
|
|
@@ -25265,6 +25754,114 @@ var UPG_REGIONS = [
|
|
|
25265
25754
|
{
|
|
25266
25755
|
type: "variant",
|
|
25267
25756
|
role: "leaf"
|
|
25757
|
+
},
|
|
25758
|
+
{
|
|
25759
|
+
type: "account",
|
|
25760
|
+
role: "container"
|
|
25761
|
+
},
|
|
25762
|
+
{
|
|
25763
|
+
type: "contact",
|
|
25764
|
+
role: "leaf"
|
|
25765
|
+
},
|
|
25766
|
+
{
|
|
25767
|
+
type: "lead",
|
|
25768
|
+
role: "leaf"
|
|
25769
|
+
},
|
|
25770
|
+
{
|
|
25771
|
+
type: "deal",
|
|
25772
|
+
role: "container"
|
|
25773
|
+
},
|
|
25774
|
+
{
|
|
25775
|
+
type: "pipeline_sales",
|
|
25776
|
+
role: "container"
|
|
25777
|
+
},
|
|
25778
|
+
{
|
|
25779
|
+
type: "pipeline_stage",
|
|
25780
|
+
role: "leaf"
|
|
25781
|
+
},
|
|
25782
|
+
{
|
|
25783
|
+
type: "quote_document",
|
|
25784
|
+
role: "leaf"
|
|
25785
|
+
},
|
|
25786
|
+
{
|
|
25787
|
+
type: "subscription",
|
|
25788
|
+
role: "container"
|
|
25789
|
+
},
|
|
25790
|
+
{
|
|
25791
|
+
type: "invoice",
|
|
25792
|
+
role: "leaf"
|
|
25793
|
+
},
|
|
25794
|
+
{
|
|
25795
|
+
type: "forecast",
|
|
25796
|
+
role: "leaf"
|
|
25797
|
+
},
|
|
25798
|
+
{
|
|
25799
|
+
type: "marketing_strategy",
|
|
25800
|
+
role: "container"
|
|
25801
|
+
},
|
|
25802
|
+
{
|
|
25803
|
+
type: "marketing_channel",
|
|
25804
|
+
role: "container"
|
|
25805
|
+
},
|
|
25806
|
+
{
|
|
25807
|
+
type: "marketing_campaign_plan",
|
|
25808
|
+
role: "container"
|
|
25809
|
+
},
|
|
25810
|
+
{
|
|
25811
|
+
type: "email_sequence",
|
|
25812
|
+
role: "leaf"
|
|
25813
|
+
},
|
|
25814
|
+
{
|
|
25815
|
+
type: "social_post",
|
|
25816
|
+
role: "leaf"
|
|
25817
|
+
},
|
|
25818
|
+
{
|
|
25819
|
+
type: "seo_keyword",
|
|
25820
|
+
role: "leaf"
|
|
25821
|
+
},
|
|
25822
|
+
{
|
|
25823
|
+
type: "ad_creative",
|
|
25824
|
+
role: "leaf"
|
|
25825
|
+
},
|
|
25826
|
+
{
|
|
25827
|
+
type: "press_release",
|
|
25828
|
+
role: "leaf"
|
|
25829
|
+
},
|
|
25830
|
+
{
|
|
25831
|
+
type: "event",
|
|
25832
|
+
role: "leaf"
|
|
25833
|
+
},
|
|
25834
|
+
{
|
|
25835
|
+
type: "community_initiative",
|
|
25836
|
+
role: "leaf"
|
|
25837
|
+
},
|
|
25838
|
+
{
|
|
25839
|
+
type: "partner_program",
|
|
25840
|
+
role: "container"
|
|
25841
|
+
},
|
|
25842
|
+
{
|
|
25843
|
+
type: "partner_tier",
|
|
25844
|
+
role: "leaf"
|
|
25845
|
+
},
|
|
25846
|
+
{
|
|
25847
|
+
type: "api_ecosystem",
|
|
25848
|
+
role: "container"
|
|
25849
|
+
},
|
|
25850
|
+
{
|
|
25851
|
+
type: "marketplace_listing",
|
|
25852
|
+
role: "leaf"
|
|
25853
|
+
},
|
|
25854
|
+
{
|
|
25855
|
+
type: "developer_portal",
|
|
25856
|
+
role: "leaf"
|
|
25857
|
+
},
|
|
25858
|
+
{
|
|
25859
|
+
type: "integration_partner",
|
|
25860
|
+
role: "leaf"
|
|
25861
|
+
},
|
|
25862
|
+
{
|
|
25863
|
+
type: "partner_revenue_share",
|
|
25864
|
+
role: "leaf"
|
|
25268
25865
|
}
|
|
25269
25866
|
],
|
|
25270
25867
|
anchor: {
|
|
@@ -25371,7 +25968,8 @@ var UPG_REGIONS = [
|
|
|
25371
25968
|
entities: [
|
|
25372
25969
|
{
|
|
25373
25970
|
type: "metric",
|
|
25374
|
-
role: "anchor"
|
|
25971
|
+
role: "anchor",
|
|
25972
|
+
notes: "canonical home is Strategy; anchors Analytics as the measurement plane"
|
|
25375
25973
|
},
|
|
25376
25974
|
{
|
|
25377
25975
|
type: "data_source",
|
|
@@ -25385,24 +25983,36 @@ var UPG_REGIONS = [
|
|
|
25385
25983
|
type: "dashboard",
|
|
25386
25984
|
role: "container"
|
|
25387
25985
|
},
|
|
25986
|
+
{
|
|
25987
|
+
type: "data_model",
|
|
25988
|
+
role: "leaf"
|
|
25989
|
+
},
|
|
25388
25990
|
{
|
|
25389
25991
|
type: "data_domain",
|
|
25390
25992
|
role: "container"
|
|
25391
25993
|
},
|
|
25392
25994
|
{
|
|
25393
|
-
type: "
|
|
25995
|
+
type: "data_product",
|
|
25394
25996
|
role: "leaf"
|
|
25395
25997
|
},
|
|
25396
25998
|
{
|
|
25397
|
-
type: "
|
|
25999
|
+
type: "data_pipeline",
|
|
25398
26000
|
role: "leaf"
|
|
25399
26001
|
},
|
|
25400
26002
|
{
|
|
25401
|
-
type: "
|
|
26003
|
+
type: "data_lineage",
|
|
25402
26004
|
role: "leaf"
|
|
25403
26005
|
},
|
|
25404
26006
|
{
|
|
25405
|
-
type: "
|
|
26007
|
+
type: "glossary_term",
|
|
26008
|
+
role: "leaf"
|
|
26009
|
+
},
|
|
26010
|
+
{
|
|
26011
|
+
type: "report",
|
|
26012
|
+
role: "leaf"
|
|
26013
|
+
},
|
|
26014
|
+
{
|
|
26015
|
+
type: "data_quality_rule",
|
|
25406
26016
|
role: "leaf"
|
|
25407
26017
|
}
|
|
25408
26018
|
],
|
|
@@ -25528,7 +26138,27 @@ var UPG_REGIONS = [
|
|
|
25528
26138
|
{
|
|
25529
26139
|
type: "deployment",
|
|
25530
26140
|
role: "leaf",
|
|
25531
|
-
notes: "
|
|
26141
|
+
notes: "canonical home is Engineering; release event surfaced to Ops"
|
|
26142
|
+
},
|
|
26143
|
+
{
|
|
26144
|
+
type: "alert_rule",
|
|
26145
|
+
role: "leaf"
|
|
26146
|
+
},
|
|
26147
|
+
{
|
|
26148
|
+
type: "ci_pipeline",
|
|
26149
|
+
role: "container"
|
|
26150
|
+
},
|
|
26151
|
+
{
|
|
26152
|
+
type: "release_strategy",
|
|
26153
|
+
role: "leaf"
|
|
26154
|
+
},
|
|
26155
|
+
{
|
|
26156
|
+
type: "on_call_rotation",
|
|
26157
|
+
role: "leaf"
|
|
26158
|
+
},
|
|
26159
|
+
{
|
|
26160
|
+
type: "infrastructure_component",
|
|
26161
|
+
role: "container"
|
|
25532
26162
|
},
|
|
25533
26163
|
{
|
|
25534
26164
|
type: "test_suite",
|
|
@@ -25546,10 +26176,26 @@ var UPG_REGIONS = [
|
|
|
25546
26176
|
type: "test_result",
|
|
25547
26177
|
role: "leaf"
|
|
25548
26178
|
},
|
|
26179
|
+
{
|
|
26180
|
+
type: "regression_test",
|
|
26181
|
+
role: "leaf"
|
|
26182
|
+
},
|
|
26183
|
+
{
|
|
26184
|
+
type: "test_coverage_report",
|
|
26185
|
+
role: "leaf"
|
|
26186
|
+
},
|
|
26187
|
+
{
|
|
26188
|
+
type: "test_environment",
|
|
26189
|
+
role: "leaf"
|
|
26190
|
+
},
|
|
25549
26191
|
{
|
|
25550
26192
|
type: "threat_model",
|
|
25551
26193
|
role: "root"
|
|
25552
26194
|
},
|
|
26195
|
+
{
|
|
26196
|
+
type: "threat",
|
|
26197
|
+
role: "leaf"
|
|
26198
|
+
},
|
|
25553
26199
|
{
|
|
25554
26200
|
type: "security_control",
|
|
25555
26201
|
role: "leaf"
|
|
@@ -25566,14 +26212,34 @@ var UPG_REGIONS = [
|
|
|
25566
26212
|
type: "penetration_test",
|
|
25567
26213
|
role: "leaf"
|
|
25568
26214
|
},
|
|
26215
|
+
{
|
|
26216
|
+
type: "security_review",
|
|
26217
|
+
role: "container"
|
|
26218
|
+
},
|
|
26219
|
+
{
|
|
26220
|
+
type: "data_classification",
|
|
26221
|
+
role: "leaf"
|
|
26222
|
+
},
|
|
26223
|
+
{
|
|
26224
|
+
type: "access_policy",
|
|
26225
|
+
role: "leaf"
|
|
26226
|
+
},
|
|
25569
26227
|
{
|
|
25570
26228
|
type: "a11y_standard",
|
|
25571
26229
|
role: "leaf"
|
|
25572
26230
|
},
|
|
26231
|
+
{
|
|
26232
|
+
type: "a11y_guideline",
|
|
26233
|
+
role: "leaf"
|
|
26234
|
+
},
|
|
25573
26235
|
{
|
|
25574
26236
|
type: "a11y_audit",
|
|
25575
26237
|
role: "leaf"
|
|
25576
26238
|
},
|
|
26239
|
+
{
|
|
26240
|
+
type: "a11y_issue",
|
|
26241
|
+
role: "leaf"
|
|
26242
|
+
},
|
|
25577
26243
|
{
|
|
25578
26244
|
type: "a11y_annotation",
|
|
25579
26245
|
role: "leaf"
|
|
@@ -25591,11 +26257,15 @@ var UPG_REGIONS = [
|
|
|
25591
26257
|
role: "leaf"
|
|
25592
26258
|
},
|
|
25593
26259
|
{
|
|
25594
|
-
type: "
|
|
26260
|
+
type: "data_contract",
|
|
25595
26261
|
role: "leaf"
|
|
25596
26262
|
},
|
|
25597
26263
|
{
|
|
25598
|
-
type: "
|
|
26264
|
+
type: "audit_log_policy",
|
|
26265
|
+
role: "leaf"
|
|
26266
|
+
},
|
|
26267
|
+
{
|
|
26268
|
+
type: "security_audit",
|
|
25599
26269
|
role: "leaf"
|
|
25600
26270
|
},
|
|
25601
26271
|
{
|
|
@@ -25624,16 +26294,16 @@ var UPG_REGIONS = [
|
|
|
25624
26294
|
role: "root"
|
|
25625
26295
|
},
|
|
25626
26296
|
{
|
|
25627
|
-
type: "
|
|
26297
|
+
type: "customer_journey_stage",
|
|
25628
26298
|
role: "container"
|
|
25629
26299
|
},
|
|
25630
26300
|
{
|
|
25631
|
-
type: "
|
|
25632
|
-
role: "
|
|
26301
|
+
type: "touchpoint",
|
|
26302
|
+
role: "leaf"
|
|
25633
26303
|
},
|
|
25634
26304
|
{
|
|
25635
|
-
type: "
|
|
25636
|
-
role: "
|
|
26305
|
+
type: "success_milestone",
|
|
26306
|
+
role: "leaf"
|
|
25637
26307
|
},
|
|
25638
26308
|
{
|
|
25639
26309
|
type: "team",
|
|
@@ -25647,6 +26317,10 @@ var UPG_REGIONS = [
|
|
|
25647
26317
|
type: "role",
|
|
25648
26318
|
role: "leaf"
|
|
25649
26319
|
},
|
|
26320
|
+
{
|
|
26321
|
+
type: "person",
|
|
26322
|
+
role: "leaf"
|
|
26323
|
+
},
|
|
25650
26324
|
{
|
|
25651
26325
|
type: "stakeholder",
|
|
25652
26326
|
role: "leaf",
|
|
@@ -25674,6 +26348,78 @@ var UPG_REGIONS = [
|
|
|
25674
26348
|
},
|
|
25675
26349
|
{
|
|
25676
26350
|
type: "capacity_plan",
|
|
26351
|
+
role: "leaf"
|
|
26352
|
+
},
|
|
26353
|
+
{
|
|
26354
|
+
type: "legal_entity",
|
|
26355
|
+
role: "container"
|
|
26356
|
+
},
|
|
26357
|
+
{
|
|
26358
|
+
type: "ip_asset",
|
|
26359
|
+
role: "leaf"
|
|
26360
|
+
},
|
|
26361
|
+
{
|
|
26362
|
+
type: "contract",
|
|
26363
|
+
role: "container"
|
|
26364
|
+
},
|
|
26365
|
+
{
|
|
26366
|
+
type: "contract_clause",
|
|
26367
|
+
role: "leaf"
|
|
26368
|
+
},
|
|
26369
|
+
{
|
|
26370
|
+
type: "privacy_policy",
|
|
26371
|
+
role: "leaf"
|
|
26372
|
+
},
|
|
26373
|
+
{
|
|
26374
|
+
type: "locale",
|
|
26375
|
+
role: "container"
|
|
26376
|
+
},
|
|
26377
|
+
{
|
|
26378
|
+
type: "translation_key",
|
|
26379
|
+
role: "leaf"
|
|
26380
|
+
},
|
|
26381
|
+
{
|
|
26382
|
+
type: "translation_bundle",
|
|
26383
|
+
role: "container"
|
|
26384
|
+
},
|
|
26385
|
+
{
|
|
26386
|
+
type: "locale_config",
|
|
26387
|
+
role: "leaf"
|
|
26388
|
+
},
|
|
26389
|
+
{
|
|
26390
|
+
type: "cultural_adaptation",
|
|
26391
|
+
role: "leaf"
|
|
26392
|
+
},
|
|
26393
|
+
{
|
|
26394
|
+
type: "regional_pricing",
|
|
26395
|
+
role: "leaf"
|
|
26396
|
+
},
|
|
26397
|
+
{
|
|
26398
|
+
type: "education_program",
|
|
26399
|
+
role: "container"
|
|
26400
|
+
},
|
|
26401
|
+
{
|
|
26402
|
+
type: "tutorial",
|
|
26403
|
+
role: "leaf"
|
|
26404
|
+
},
|
|
26405
|
+
{
|
|
26406
|
+
type: "walkthrough",
|
|
26407
|
+
role: "leaf"
|
|
26408
|
+
},
|
|
26409
|
+
{
|
|
26410
|
+
type: "webinar",
|
|
26411
|
+
role: "leaf"
|
|
26412
|
+
},
|
|
26413
|
+
{
|
|
26414
|
+
type: "certification",
|
|
26415
|
+
role: "leaf"
|
|
26416
|
+
},
|
|
26417
|
+
{
|
|
26418
|
+
type: "help_video",
|
|
26419
|
+
role: "leaf"
|
|
26420
|
+
},
|
|
26421
|
+
{
|
|
26422
|
+
type: "learning_path",
|
|
25677
26423
|
role: "container"
|
|
25678
26424
|
}
|
|
25679
26425
|
],
|
|
@@ -25690,7 +26436,6 @@ var UPG_REGIONS = [
|
|
|
25690
26436
|
"incident_analysed_in_postmortem",
|
|
25691
26437
|
"incident_triggers_postmortem",
|
|
25692
26438
|
"incident_breaches_service_level_objective",
|
|
25693
|
-
"incident_caused_by_root_cause",
|
|
25694
26439
|
"incident_exploits_vulnerability"
|
|
25695
26440
|
],
|
|
25696
26441
|
boundary_edges: [
|
|
@@ -25711,8 +26456,8 @@ var UPG_REGIONS = [
|
|
|
25711
26456
|
},
|
|
25712
26457
|
{
|
|
25713
26458
|
direction: "export",
|
|
25714
|
-
edge_id: "
|
|
25715
|
-
crosses_into: "
|
|
26459
|
+
edge_id: "incident_caused_by_root_cause",
|
|
26460
|
+
crosses_into: "engineering_platform"
|
|
25716
26461
|
},
|
|
25717
26462
|
{
|
|
25718
26463
|
direction: "export",
|
|
@@ -26053,7 +26798,7 @@ var NODE_KEY_ORDER = [
|
|
|
26053
26798
|
"properties"
|
|
26054
26799
|
];
|
|
26055
26800
|
var EDGE_KEY_ORDER = ["id", "source", "target", "type", "mapping_confidence", "properties"];
|
|
26056
|
-
var CROSS_EDGE_KEY_ORDER = ["id", "source", "target", "type", "source_product_id", "target_product_id", "mapping_confidence"];
|
|
26801
|
+
var CROSS_EDGE_KEY_ORDER = ["id", "source", "target", "type", "source_product_id", "target_product_id", "mapping_confidence", "alias", "relevance", "audience_role"];
|
|
26057
26802
|
var PRODUCT_KEY_ORDER = ["id", "title", "description", "stage", "properties"];
|
|
26058
26803
|
function canonicalNode(node) {
|
|
26059
26804
|
const repaired = repairNodeDrift(node);
|
|
@@ -26246,7 +26991,7 @@ function isCanonical(text) {
|
|
|
26246
26991
|
}
|
|
26247
26992
|
|
|
26248
26993
|
// src/index.ts
|
|
26249
|
-
var UPG_VERSION = "0.9.
|
|
26994
|
+
var UPG_VERSION = "0.9.8";
|
|
26250
26995
|
var UPG_FORMAT_VERSION = "0.4.0";
|
|
26251
26996
|
var MARKDOWN_FORMAT_VERSION = "0.1";
|
|
26252
26997
|
var UPG_TYPES = getTypes();
|