{"record":{"id":"3b7f7415303f4799","repo":"larksuite/cli","slug":"segment-q-has-invalid-rfc-6901-escaping","errorCode":null,"errorMessage":"segment %q has invalid RFC 6901 escaping","messagePattern":"segment %q has invalid RFC 6901 escaping","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"shortcuts/common/typed_compile_contract.go","lineNumber":131,"sourceCode":"\t\tdefault:\n\t\t\treturn \"\", false\n\t\t}\n\t}\n\treturn builder.String(), true\n}\n\nfunc resolveShapePointer(shape typedValueShape, pointer string) (typedValueShape, error) {\n\tif pointer == \"\" {\n\t\treturn shape, nil\n\t}\n\tif !strings.HasPrefix(pointer, \"/\") {\n\t\treturn nil, fmt.Errorf(\"must be an RFC 6901 JSON Pointer\")\n\t}\n\tcurrent := shape\n\tfor _, encoded := range strings.Split(strings.TrimPrefix(pointer, \"/\"), \"/\") {\n\t\tname, valid := decodeJSONPointerSegment(encoded)\n\t\tif !valid {\n\t\t\treturn nil, fmt.Errorf(\"segment %q has invalid RFC 6901 escaping\", encoded)\n\t\t}\n\t\tvar err error\n\t\tcurrent, err = resolveShapeField(current, name)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\t}\n\treturn current, nil\n}\n\nfunc resolveShapeField(shape typedValueShape, name string) (typedValueShape, error) {\n\tswitch value := shape.(type) {\n\tcase typedObjectShape:\n\t\tfor _, field := range value.Fields {\n\t\t\tif field.Name == name {\n\t\t\t\treturn field.Shape, nil\n\t\t\t}\n\t\t}","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/shortcuts/common/typed_compile_contract.go#L113-L149","documentation":"resolveShapePointer walks an RFC 6901 JSON Pointer through a compiled shape. Each '/'-separated segment must be validly escaped per RFC 6901 (~0 = '~', ~1 = '/'); if a segment decodes invalidly, the library rejects the pointer rather than guessing at the target field. This protects override paths from silently targeting the wrong field.","triggerScenarios":"Calling compileData (via a typed output definition with Output.Data.Overrides, or applyDataOverride) with an override Path containing a '~' not followed by '0' or '1', e.g. \"/fields/~2/name\" or a trailing lone '~'.","commonSituations":"Hand-writing JSON Pointer override paths and escaping '~' incorrectly; building paths programmatically with string concatenation without escaping '~' (e.g. field names containing '~'); copying pointers from non-RFC-6901 systems.","solutions":["Escape every literal '~' in a segment as '~0' and every '/' as '~1', e.g. \"/a~1b/~0name\" for fields 'a/b' and '~name'.","Remove unnecessary '~' characters from the override Path if no escaping was intended.","Verify the pointer targets an existing field via resolveShapeField by checking the struct shape first."],"exampleFix":"// before\nTypedDataDefinition{Overrides: []TypedDataOverride{{Path: \"/na~me\", Value: 1}}}\n// after\nTypedDataDefinition{Overrides: []TypedDataOverride{{Path: \"/na~0me\", Value: 1}}}","handlingStrategy":"validation","validationCode":"func validJSONPointer(p string) bool {\n  if p == \"\" || p[0] != '/' { return false }\n  for _, seg := range strings.Split(strings.TrimPrefix(p, \"/\"), \"/\") {\n    for i := 0; i < len(seg); i++ {\n      if seg[i] == '~' {\n        if i+1 >= len(seg) || (seg[i+1] != '0' && seg[i+1] != '1') { return false }\n        i++\n      }\n    }\n  }\n  return true\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Escape '~' as '~0' and '/' as '~1' whenever building pointer segments from arbitrary field names","Keep a helper that constructs pointers from segments and does the escaping","Test override paths against invalid-escape cases like \"~2\" and trailing \"~\""],"tags":["json-pointer","rfc6901","validation","shortcuts"],"backgroundTag":"invalid-json-pointer-escaping","analyzedSha":"7fd6ef3c07182257ce776cdc5a614e122d5bd4b3","analyzedAt":"2026-09-04T21:17:44.649Z","contentChangedAt":"2026-09-04T21:17:44.649Z","schemaVersion":2},"datasetVersion":"2026-09-12T02:17:10.037Z"}