70 if (
string.IsNullOrWhiteSpace(
73 throw new ArgumentException(
74 "A benchmark relative path is required.",
75 nameof(relativePath));
83 if (normalized.StartsWith(
85 StringComparison.Ordinal) ||
88 StringComparison.Ordinal) ||
91 StringComparison.Ordinal))
93 throw new InvalidOperationException(
94 "Benchmark artifact paths must remain relative and cannot traverse directories.");
97 string[] allowedPrefixes =
99 $
"{RootDirectory}/{RawDirectory}/",
100 $
"{RootDirectory}/{AnnotatedDirectory}/",
101 $
"{RootDirectory}/{SolutionsDirectory}/",
102 $
"{RootDirectory}/{CampaignsDirectory}/"
105 if (!allowedPrefixes.Any(
107 normalized.StartsWith(
109 StringComparison.Ordinal)))
111 throw new InvalidOperationException(
112 $
"Benchmark path '{normalized}' is outside the canonical raw/annotated/solutions/campaigns layout.");