{"record":{"id":"6ccbd7444b0ef85a","repo":"larksuite/cli","slug":"must-be-an-rfc-6901-json-pointer","errorCode":null,"errorMessage":"must be an RFC 6901 JSON Pointer","messagePattern":"must be an RFC 6901 JSON Pointer","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"shortcuts/common/typed_compile_contract.go","lineNumber":125,"sourceCode":"\t\tindex++\n\t\tswitch segment[index] {\n\t\tcase '0':\n\t\t\tbuilder.WriteByte('~')\n\t\tcase '1':\n\t\t\tbuilder.WriteByte('/')\n\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) {","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/larksuite/cli/blob/7fd6ef3c07182257ce776cdc5a614e122d5bd4b3/shortcuts/common/typed_compile_contract.go#L107-L143","documentation":"Thrown by resolveShapePointer when a shape override pointer is not a valid RFC 6901 JSON Pointer — specifically it must start with '/' (and segments must use ~0/~1 escaping). Empty pointers are allowed and mean 'no override'.","triggerScenarios":"Passing pointer \"data.items\" or \"items\" (no leading slash) to the shape-override resolution path, e.g. in a data-shape override used by compileDataOverride.","commonSituations":"Writing a dot-notation path (data.items) instead of slash notation (/data/items); forgetting the leading slash for root-level fields; hand-rolling pointer strings in tests.","solutions":["Prefix the pointer with '/', e.g. \"/data/items\"","Escape literal '~' as '~0' and '/' as '~1' inside segments","Pass \"\" (empty) to skip the override"],"exampleFix":"// before\npointer := \"data.items\"\n// after\npointer := \"/data/items\"","handlingStrategy":"validation","validationCode":"func validPointer(p string) bool {\n  return p == \"\" || strings.HasPrefix(p, \"/\")\n}","typeGuard":"func isRFC6901Pointer(s string) bool {\n  if s == \"\" { return true }\n  if !strings.HasPrefix(s, \"/\") { return false }\n  for _, seg := range strings.Split(strings.TrimPrefix(s, \"/\"), \"/\") {\n    if !validSegment(seg) { return false }\n  }\n  return true\n}","tryCatchPattern":"shape, err := common.ResolveShapePointer(base, ptr)\nif err != nil {\n  return fmt.Errorf(\"shape override pointer %q: %w\", ptr, err)\n}","preventionTips":["Convert dot-notation paths to slash notation with a leading '/'","Remember ~0 and ~1 escaping for literal '~' and '/'","Keep pointers as constants next to the shape they override"],"tags":["go","json-pointer","rfc6901","validation"],"backgroundTag":"invalid-json-pointer","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"}