rtl-authoring — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited rtl-authoring (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.
Produce content that reads correctly right-to-left. The hard part is almost never "make it right-aligned" — it's the bidirectional (bidi) interaction between RTL text and the LTR runs embedded in it (numbers, currency, English words, code, URLs, dates). Get the model below right and 90% of "RTL is broken" complaints vanish.
You store text in logical order (the order you'd type/read it). The renderer applies the Unicode Bidi Algorithm (UBA) to compute visual order at display time. You almost never reorder characters yourself — you give the engine the right signals so its reordering is correct.
. , : ; ( ) [ ] / - + % , punctuation)take direction from their surroundings — this is where things break. A colon or a parenthesis next to Hebrew gets pulled RTL and lands on the "wrong" side.
The fix is almost always isolation: tell the engine "this run is its own direction, don't let the neighbours bleed in."
In an RTL context the engine mirrors (, ), [, ], {, }, <, >. Type them logically — type (74) and in RTL it renders as (74) correctly mirrored; do NOT pre-swap to )74( to "fix" it (that double-flips). Same for a trailing : or . — type it where you'd read it; let UBA place it.
If a number/parenthesis still lands wrong, the run isn't isolated — see below.
<html dir="rtl" lang="he"> <!-- set dir on the root; lang for fonts/hyphenation --><html>). This is the real switch —text-align: right alone is NOT RTL (it right-aligns LTR text; punctuation and wrapping stay wrong).
margin-inline-start, padding-inline-end, inset-inline-start, border-inline-*, text-align: start/end — NOT left/right.
long number+unit strings):
<bdi>…</bdi> (auto-isolate) or <span dir="ltr">…</span>.unicode-bidi: isolate (or isolate-override to also force direction).‏ (RLM) / ‎ (LRM),or isolates ⁦…⁩ (LRI/PDI).
exact URL must remain visually intact, isolate it and add white-space: nowrap; otherwise prefer a short link label.
<bdo dir="ltr"> only when you must force visual order (rare; debugging).Mixed example that renders correctly:
<p dir="rtl">המחיר הוא <bdi>120 ₪</bdi> עבור <bdi>ChatGPT Plus</bdi> (לחודש).</p>This is where Hebrew/Arabic most often comes out reversed or unjoined, because many libraries place glyphs with no bidi and no shaping.
NOT run UBA and do NOT shape Arabic. Output = backwards / isolated letters. Avoid for RTL body text.
free. Most reliable zero-setup renderer on a typical machine is headless Chrome: "…/Google Chrome" --headless --no-pdf-header-footer --print-to-pdf=out.pdf file://abs.html. weasyprint also works but needs native libs (pango/cairo) installed first; Playwright page.pdf() and wkhtmltopdf are fine if already set up.
visual) + `arabic-reshaper` (Arabic contextual forms). Hebrew needs python-bidi but NOT reshaping; Arabic needs both.
problem — use the translate-rtl-form skill (empty → mirror → refill).
don't, and you get tofu (□) or a silent fallback. Verify coverage.
Arabic — Noto Naskh/Sans Arabic, Cairo, Amiri, Tajawal.
isolated). The font + a shaping-aware renderer handle this; in a non-shaping context (some PDF libs) you must arabic-reshaper first or letters stay isolated.
<div dir="rtl"> … </div>. Many renderers (incl. some GitHub contexts) strip the dir attribute — verify in the actual target, and if stripped, fall back to a real HTML doc.
RTL in terminal emulators is unreliable (most don't implement UBA). Don't promise correct RTL in CLI output; render to HTML/PDF/file instead and open it.
Open the actual output (browser / PDF viewer / Read the PDF) and scan for:
punctuation placement need dir="rtl".
bidi engine; the real cause is a missing dir/isolation. Reversing double-breaks it the moment any number or English appears.
(<bdi>) or add ‏/‎.
real target; some need inline style="direction:rtl" or a wrapping table.
as a source of logical order; re-key or extract programmatically.
inherently-LTR data (phone numbers, IBANs, code, version strings) isolated LTR.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.