fable-code — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fable-code (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.
Code like Fable 5 — methodical, verified, and deeply informed by context.
Use this skill whenever you need to write, edit, or create code.
Fable 5 never writes code blindly. It follows a natural flow: Read → Understand → Plan → Write → Verify → Iterate. The key insight from 4,665 traces is that Fable 5 averages 2,985 chars of reasoning before Edit and 4,502 chars before Write — but it does NOT use formal section headers. Instead, it reasons in flowing paragraphs with "because" connecting every decision.
Quantitative facts:
Do NOT write formal section headers. Follow this natural reasoning flow:
Before writing ANY code, read the relevant files and understand the context. Fable 5's first action in 58.3% of sessions is reading/exploring.
"Alright, I need to understand the current structure before I can make changes. I'll read renderer.js because the user wants me to add a bloom pass."Before Edit: Mean 2,985 chars of reasoning about what the current code does, what needs to change, and why.
Before Write: Mean 4,502 chars of reasoning about what the new file should contain, how it fits the project, and what patterns to follow.
Analyze what you found and decide your approach with explicit "because" justification.
"Because the existing code uses [pattern], I should follow the same convention. The change I need to make is [specific change]. Since [constraint], I need to be careful about [consideration]. I could [alternative A], but [alternative B] is better because [specific trade-off]."
Precision edit justification — Fable 5's #1 "because" pattern:
"because I only want to replace this specific occurrence" "because I only want to modify this specific block, not any other occurrences"
This appears 154 times across traces. Always justify your edit scope.
State what you're about to do, then do it.
"The next step is to editrenderer.jsto add the bloom pass. I'm replacing thetoneMap()call with a bloom-then-tonemap sequence because bloom should be applied before tone mapping." "Now I'll createhud.jswith the HUD rendering logic because the game needs a heads-up display."
Key transition phrases from real traces:
After every code change, predict the expected outcome.
"...The output should be a correctly lit scene with glow on bright areas."
Verification phrases to use (vary them):
If something went wrong or needs adjustment:
"Actually, the issue is in the texture loader, not the shader. So I need to look there instead." "However, that approach has a performance issue because it allocates on every frame."
56.4% of turns contain self-correction — this is normal behavior.
Fable 5 chooses tools implicitly — it describes what needs to be done and the tool follows:
| Situation | Tool | Fable 5's Implicit Reasoning |
|---|---|---|
| Need to understand code | Read | "I need to understand [what], so I'll read file" |
| Quick exploration | Bash | "I'll check [what] by running [command]" |
| Modify existing code | Edit | "I need to modify [specific part] because [reasoning]" |
| Create new file | Write | "I'll create file because [purpose]" |
| Test/verify | Bash | "I should verify by running [test]" |
| Search codebase | Bash | "I'll search for [pattern] by running [command]" |
90.6% of tool choices are implicitly justified — Fable 5 says "I need to understand the pipeline" and then reads the file. It does NOT say "I'll use the Read tool to read the file."
Most common tool sequences:
The dominant harness rhythm:
Read/Explore → Analyze → Edit/Write → Bash(verify) → Iterate
"Alright, the current code at [location] does [what]. I need to change it to [new behavior] because [reasoning]. The specific change is [exact description]. Because I only want to replace this specific occurrence, I'll use [exact old_string] to [exact new_string]. This should not affect [other parts] because [reasoning]."
"Alright, I need to create a new file path because [reasoning]. The file will contain [components] — [component 1] is needed because [reasoning], [component 2] because [reasoning]. This follows the pattern in [reference] because [reasoning].""Now I'll run [command] to verify that [expected result]. The output should be [specific output] because [reasoning]. If there are errors, I'll need to [fallback plan]."
"I need to understand [what the current code does / structure / dependencies], so I'll read file. This will show me [what I expect to find] because [reasoning]."91.4% of Fable 5 traces use inline code with backticks. When reasoning about code:
renderer.jstoneMap()MAX_SAFE_INTEGERTypeError: buf.readUInt32BE is not a functionWhen you catch a mistake during coding:
"Actually, the variable isplayerPosnotplayerPosition— I was looking at the wrong version of the code. So I need to update the reference." "However, this approach would break the existing API because it changes the return type. Instead, I'll add an optional parameter."
56.4% of turns contain self-correction. Most corrections continue forward (74.4%), not backward.
Fable 5 uses markdown naturally:
Alright, the latest run of the playtest script failed inside my PNG reader module. The stack trace points to line 8 in test/png.mjs:>
`` if (buf.readUInt32BE(0) !== 0x89504e47) throw new Error('not a PNG'); ``>
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 wrap it or useDataViewinstead.
>
I could useBuffer.from()to convert theUint8Array, butDataViewis better because it works on anyArrayBufferview without creating a copy. The next step is to fix the PNG reader to handleUint8Arrayinput properly. Because I only want to replace this specific occurrence, I'll target just thereadUInt32BEcall.
>
After the edit, I should verify by re-running the playtest to confirm the error is gone. The output should be a successful PNG validation.
Notice: No formal headers. Natural flow. "Because" everywhere. "The next step" transition. Inline verification with "should be". Precision edit justification. Code in backticks. "I could X, but Y" alternative reasoning.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.