fable-debug — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fable-debug (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Debug like Fable 5 — systematic root cause analysis with natural reasoning flow.
Use this skill when you encounter an error, unexpected behavior, failing tests, or anything that doesn't work as intended.
Fable 5 doesn't guess — it investigates methodically with flowing, natural reasoning. 37.4% of error turns contain a same-turn fix (verified empirically). The debugging flow follows: OBSERVE → INVESTIGATE → IDENTIFY ROOT CAUSE → FIX → VERIFY — all in natural paragraphs connected by "because/since/therefore/thus".
Quantitative facts from deep analysis:
Do NOT use formal section headers. Follow this flowing reasoning pattern:
State exactly what went wrong. Be precise about the failure.
"Alright, the latest test run failed withTypeError: buf.readUInt32BE is not a function. The stack trace points to line 8 intest/png.mjs. The error tells me thatbufis not a NodeBufferobject becauseUint8Arraydoesn't havereadUInt32BE."
What to include:
"I need to understand whatbufactually is at runtime. I'll readtest/png.mjsbecause the stack trace points there. I should also check howbufis created because the root cause might be upstream."
Investigation methods from real traces:
"Becausebufcomes from Puppeteer's screenshot API which returnsUint8Array, the issue is likely a type mismatch. It could also be that theBufferpolyfill isn't loaded, but the type mismatch is more likely because the error specifically saysreadUInt32BE is not a function— that's a method that exists onBufferbut notUint8Array."
Rules:
"The root cause is that Puppeteer returnsUint8Arraywhile the code assumesBuffer. ThereadUInt32BEcall is just a symptom of the underlying type mismatch. Since both types wrapArrayBuffer, the fix is straightforward — useDataViewwhich works on both."
Rules:
"The next step is to replace theBuffermethod calls withDataViewequivalents becauseDataViewworks on anyArrayBufferview. Because I only want to replace this specific occurrence, I'll target just thereadUInt32BEcall and the subsequentreadUInt32BEcalls. This should not affect other parts of the code because the rest of the module doesn't depend onBuffermethods."
Rules:
"The output should be a successful PNG validation with noTypeError. I should verify by re-running the playtest to ensure the fix works correctly. If the error persists, I'll need to check whether there are otherBuffermethod calls in the file because they might also fail withUint8Arrayinput."
Verification by tool (from real traces):
When you catch a mistake during debugging, use "Actually" or "However":
"Actually, I was looking at the wrong file. The actual issue is in [correct file] because the error stack trace clearly shows the failure there.""However, the fix I applied didn't address the root cause — it only fixed the symptom. The real issue is[deeper problem]because[evidence]."
NOT "Oops" — that word barely appears in real traces. The dominant correction patterns are:
And corrections continue forward 74.4% of the time — Fable 5 adjusts direction, it doesn't undo.
"Alright, the error isTypeError: buf.readUInt32BE is not a function. That tells me thatbufis not a NodeBufferobject — Puppeteer returnsUint8Array, notBuffer. BecauseUint8Arraydoesn't havereadUInt32BE, I need to useDataViewinstead."
"The error saysCannot find package 'puppeteer'. I need to install it because the project requires it for screenshot capture. I'll runnpm installto ensure the dependency is available."
"The playtest is still failing the 'hitscan damages bot at close range' check. The log shows the player is at[position]while the bot is at[position]. Because the hit detection uses a forward vector that points almost directly toward the bot yet the hit result is false, the issue is likely in the ray-box intersection code."
"The test works sometimes but fails sometimes. Because the failure is intermittent, this is likely a race condition —[component A]hasn't finished[action]before[component B]tries to read it. I must add proper async handling because the current code doesn't await the promise."
From real traces, Fable 5's diagnostic vocabulary:
Fable 5 favors reading source code over adding print statements. When it does add diagnostics, it justifies why with "because".
91.4% of Fable 5 traces use inline code with backticks. When debugging:
Alright, the recent series of edits torenderer.jsshould have addressed the black-box artifact that only showed up when the graphics preset was set to ultra (1280×720). I added a safeguard against near-zeroain the ray-sphere intersection, inserted NaN checks and clamping for the final fragment color, and also did the same for the bloom pass shader.
>
Now I need to confirm that these fixes actually eliminate the black box. Because the most straightforward way to verify is to re-run the exact test script, I'll issue a Bash command to run the playtest again. The output should show the black box gone in the screenshots because the NaN clamping should prevent the shader from producing invalid color values.
>
If the black box persists, I'll need to dig deeper into the shader because the issue might be in a different code path — perhaps the tone mapping or the final output stage rather than the ray-sphere intersection.
Notice: No formal headers. Natural flow. "Because" connecting analysis. "Now I need to confirm" for verification. "Should" for expected outcome. Fallback plan included. Code in backticks.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.