{"record":{"id":"48ac827d09d1ebe7","repo":"siyuan-note/siyuan","slug":"skill-resource-exceeds-the-d-byte-limit-s-s","errorCode":null,"errorMessage":"skill resource exceeds the %d byte limit: %s/%s","messagePattern":"skill resource exceeds the (.+?) byte limit: (.+?)/(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"kernel/util/skill.go","lineNumber":375,"sourceCode":"\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"skill not found: %s\", skillName)\n\t}\n\n\ttarget := filepath.Join(realRoot, filepath.FromSlash(resource))\n\trealTarget, err := filepath.EvalSymlinks(target)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"skill resource not found: %s/%s\", skillName, resource)\n\t}\n\tif realTarget != realRoot && !gulu.File.IsSubPath(realRoot, realTarget) {\n\t\treturn \"\", fmt.Errorf(\"skill resource escapes skill directory: %s\", resource)\n\t}\n\n\tinfo, err := os.Stat(realTarget)\n\tif err != nil || !info.Mode().IsRegular() {\n\t\treturn \"\", fmt.Errorf(\"skill resource is not a regular file: %s/%s\", skillName, resource)\n\t}\n\tif info.Size() > maxSkillResourceBytes {\n\t\treturn \"\", fmt.Errorf(\"skill resource exceeds the %d byte limit: %s/%s\", maxSkillResourceBytes, skillName, resource)\n\t}\n\n\tfile, err := os.Open(realTarget)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"skill resource not found: %s/%s\", skillName, resource)\n\t}\n\tdefer file.Close()\n\tdata, err := io.ReadAll(io.LimitReader(file, maxSkillResourceBytes+1))\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"skill resource read failed: %s/%s\", skillName, resource)\n\t}\n\tif len(data) > maxSkillResourceBytes {\n\t\treturn \"\", fmt.Errorf(\"skill resource exceeds the %d byte limit: %s/%s\", maxSkillResourceBytes, skillName, resource)\n\t}\n\tif !utf8.Valid(data) {\n\t\treturn \"\", fmt.Errorf(\"skill resource is not valid UTF-8: %s/%s\", skillName, resource)\n\t}\n\treturn string(data), nil","sourceCodeStart":357,"sourceCodeEnd":393,"githubUrl":"https://github.com/siyuan-note/siyuan/blob/8641553a1f07374001902d3ce773285db1292b2d/kernel/util/skill.go#L357-L393","documentation":"Skill resources are size-capped at maxSkillResourceBytes to keep agent context and memory bounded. readSkillResource stats the target and returns this error when the file exceeds the limit, before opening it.","triggerScenarios":"Loading a skill resource whose file size is greater than maxSkillResourceBytes — e.g. a large PDF, dataset, or log file placed inside a skill directory and referenced as a resource.","commonSituations":"User drops large reference documents or media into a skill folder and links them as resources; generated files (logs, exports) accumulated inside the skill directory over time.","solutions":["Move the large file out of the skill directory and reference it by external path in the skill body instead","Split or compress the resource so each file is under the byte limit","Trim the resource to the relevant excerpt needed by the agent","If the content genuinely must be in-skill, restructure into multiple smaller resources"],"exampleFix":"// before\nresources:\n  - assets/full-dataset.csv  # 200 MB\n// after\nresources:\n  - assets/dataset-sample.csv  # few KB excerpt","handlingStrategy":"validation","validationCode":"const stat = require(\"fs\").statSync(p.join(skillDir, resource));\nif (stat.size > MAX_SKILL_RESOURCE_BYTES) {\n  console.warn(\"resource too large; link externally instead\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  return readSkillResource(dir, name, res);\n} catch (e) {\n  if (String(e).includes(\"byte limit\")) {\n    return readExcerptOnly(p.join(dir, res)); // read a bounded slice instead\n  }\n  throw e;\n}","preventionTips":["Keep skill resources small — excerpts and samples, not full datasets","Reference large files by absolute path in prose instead of registering them as resources","Periodically clean generated files (logs, exports) out of skill directories"],"tags":["skills","file-size","limits"],"backgroundTag":"file-size-limit-exceeded","analyzedSha":"8641553a1f07374001902d3ce773285db1292b2d","analyzedAt":"2026-09-11T16:08:28.414Z","contentChangedAt":"2026-09-11T16:08:28.414Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}