{"record":{"id":"26e5970c8fc9fb06","repo":"iOfficeAI/OfficeCLI","slug":"invalid-crossbetween-value-value-valid-mi","errorCode":null,"errorMessage":"Invalid 'crossBetween' value: '{value}'. Valid: midCat, between.","messagePattern":"Invalid 'crossBetween' value: '(.+?)'\\. Valid: midCat, between\\.","errorType":"validation","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/officecli/Core/Chart/ChartHelper.Setter.cs","lineNumber":1972,"sourceCode":"                    // overriding form; leaving the default crosses element in\n                    // place makes dump→replay surface a spurious crosses=autoZero\n                    // prop (R57 tester-1).\n                    if (!properties.ContainsKey(\"crosses\"))\n                        valAx.RemoveAllChildren<C.Crosses>();\n                    break;\n                }\n\n                case \"crossbetween\":\n                {\n                    var plotArea2 = chart.GetFirstChild<C.PlotArea>();\n                    var valAx = plotArea2?.GetFirstChild<C.ValueAxis>();\n                    if (valAx == null) { unsupported.Add(key); break; }\n                    // Validate BEFORE mutating.\n                    var cbVal = value.ToLowerInvariant() switch\n                    {\n                        \"midcat\" or \"midpoint\" => C.CrossBetweenValues.MidpointCategory,\n                        \"between\" => C.CrossBetweenValues.Between,\n                        _ => throw new ArgumentException($\"Invalid 'crossBetween' value: '{value}'. Valid: midCat, between.\")\n                    };\n                    valAx.RemoveAllChildren<C.CrossBetween>();\n                    // CT_ValAx schema: crossAx, crosses?, crossesAt?, crossBetween?,\n                    // majorUnit?, minorUnit?, dispUnits?, extLst?. AppendChild lands\n                    // it after majorUnit / minorUnit which the validator rejects.\n                    var cb = new C.CrossBetween { Val = cbVal };\n                    var cbAnchor = valAx.GetFirstChild<C.CrossesAt>() as OpenXmlElement\n                        ?? valAx.GetFirstChild<C.Crosses>() as OpenXmlElement\n                        ?? valAx.GetFirstChild<C.CrossingAxis>() as OpenXmlElement;\n                    if (cbAnchor != null) cbAnchor.InsertAfterSelf(cb);\n                    else valAx.AppendChild(cb);\n                    break;\n                }\n\n                case \"axisorientation\" or \"axisreverse\":\n                {\n                    var plotArea2 = chart.GetFirstChild<C.PlotArea>();\n                    var valAx = plotArea2?.GetFirstChild<C.ValueAxis>();","sourceCodeStart":1954,"sourceCodeEnd":1990,"githubUrl":"https://github.com/iOfficeAI/OfficeCLI/blob/1ced45e900782c5083ed550ddf328ee974e425e7/src/officecli/Core/Chart/ChartHelper.Setter.cs#L1954-L1990","documentation":"Thrown when 'crossBetween' is not midCat/midpoint or between (OOXML ST_CrossBetween). Validated BEFORE mutating to avoid dropping a prior value, then inserted in CT_ValAx schema order (after crossesAt/crosses/crossAx). midCat = data points cross midway between categories; between = data crosses between category boundaries.","triggerScenarios":"SetChartProperties with { [\"crossBetween\"] = \"auto\" }, \"inside\", or a misspelled token on the value axis.","commonSituations":"Confusing crossBetween with labelPos/crosses vocabulary; defaulting to 'auto' which is not a valid enum here.","solutions":["Use midCat (or midpoint) for mid-category crossing, or between for between-category crossing.","Trim and ToLowerInvariant the value.","Whitelist against the two enum values before calling Set."],"exampleFix":"// before\nSetChartProperties(part, new() { [\"crossBetween\"] = \"auto\" });\n// after\nSetChartProperties(part, new() { [\"crossBetween\"] = \"midCat\" });","handlingStrategy":"validation","validationCode":"static readonly HashSet<string> CrossBetween =\n    new[]{\"midcat\",\"midpoint\",\"between\"}, StringComparer.OrdinalIgnoreCase);\n\nstatic bool IsValidCrossBetween(string v) =>\n    !string.IsNullOrWhiteSpace(v) && CrossBetween.Contains(v.Trim().ToLowerInvariant());","typeGuard":"static bool IsKnownCrossBetween(string v) =>\n    (v?.Trim().ToLowerInvariant()) is \"midcat\" or \"midpoint\" or \"between\";","tryCatchPattern":"try { SetChartProperties(part, props); }\ncatch (ArgumentException ex) when (ex.Message.StartsWith(\"Invalid 'crossBetween'\"))\n{ /* default to between for bar/column or midCat for line and retry */ }","preventionTips":["Use midCat for line-style mid-category crossing, between for bar/column boundary crossing.","Whitelist crossBetween to its two enum values (plus midpoint alias).","Do not send 'auto' — it is not a valid ST_CrossBetween."],"tags":["ooxml","chart","input-validation","axis","csharp"],"backgroundTag":null,"analyzedSha":"1ced45e900782c5083ed550ddf328ee974e425e7","analyzedAt":"2026-08-13T13:01:07.193Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}