TANGEUL — Rules Written in Markdown, Audited by Humans תמונה: נוצרה בידי בינה מלאכותית

toulmin מחשב חוזים. חוקים הם פונקציות Go, חריגים מוכרזים כגרף תבוסה (defeat graph), ו-h-Categoriser הופך את הגרף לפסק דין. הבעיה היא שהאדם שבאמת צריך לבקר את החוזה בדרך כלל אינו יודע לקרוא Go.

רואה חשבון המבקר מדיניות הלוואות. בעל עסק קטן הבודק חוק בקרת גישה. פקיד בנק הסוקר את היגיון הפיצוי של העברה. אף אחד מהם אינו יכול להביט ב-func(ctx Context, specs Specs) (bool, any) ולומר “כן, זה נכון.” לא משנה עד כמה המתמטיקה של המנוע איתנה, אם הקורא אינו יכול לקרוא את הקוד, הביקורת היא הצגה.

בינה מלאכותית כותבת אותו, אדם קורא אותו

TANGL (Toulmin Amgoud Nute Graph Language) סוגר את הפער הזה. אתה כותב משפטי markdown, ואותם משפטים הם הקוד ההרצה.

## tangl:Cases
- in case of `can access`
  - `user` is required
  - `authenticate` is a general rule
  - `block ip` is a counter rule using `policy`.`IsIPBlocked` with `blocklist`
  - don't `authenticate` when `block ip`
  - do `policy`.`Allow` when `authenticate`

חמש השורות הללו הן כל גרף toulmin — Rule, Counter, Attacks, וקשת ההרצה. אין שלב קומפילציה נפרד שהמחבר צריך לחשוב עליו: כלי ה-tangl מנתחים את ה-markdown הזה ישירות אל *ast.Document, ו-validate/effects/gen פועלים עליו ללא שינוי. המחבר הוא בינה מלאכותית, המאמת הוא אדם — האסימטריה הזו היא כל העניין. הבינה המלאכותית צריכה לעקוב אחר דקדוק קנוני מחמיר אחד בלבד; האדם צריך רק לקרוא משפט בשפתו שלו.

סמנטיקה אחת, משטחים רבים

הסמנטיקה של TANGL מוגדרת פעם אחת, בדקדוק האנגלי: דואליות Evaluate/Run, once (אידמפוטנטיות של tick), undo (פיצוי), תזמון מפל, וסדר הרצה דטרמיניסטי. אף מהדורה מקומית — קוריאנית, או מה שיבוא אחריה — אינה מגדירה מחדש דבר מכל זה. היא רק מחליפה את טבלת מילות המפתח וסדר המילים היושבת מעל אותו AST. משפט קוריאני אחד ממופה 1:1 למשפט אנגלי אחד, ושניהם מנותחים לצומת AST זהה.

זו אינה שכבת תרגום שהוברגה מטעמי נוחות — היא נושאת משקל. הקוראים האמיתיים של TANGL בקוריאה הם מבקרים שאינם מפתחים: 소상공인, 세무사. מילות מפתח אנגליות כמו don't X when Y או is a general rule אינן מאפשרות למי שאינו מפתח לאשר “כן, זה נקרא נכון.” אם הקורא הוא קוריאני, המשטח חייב להיות קוריאני כדי שהביקורת באמת תעבוד — וההפך תקף באופן סימטרי לקוראים אנגלים.

בניית המהדורה הקוריאנית חשפה משהו שאינו מובן מאליו מהדקדוק האנגלי לבדו: סדר SOV של קוריאנית אינו נטל תרגום, אלא התאמה טובה יותר לחוקים מותנים. `Y`면 `X` 실행한다 (בערך, “כאשר Y, בצע X”) נקרא באופן טבעי יותר מ-do X when Y בקוריאנית — תנאי-תחילה, נשוא-בסוף הוא פשוט האופן שבו השפה בנויה מלכתחילה. מדיניות החלקיקים הקוריאנית דוחפת זאת הלאה: חלקיקים (은/는/이/가/을/를 …) הם אסימונים אופציונליים שהלקסר מסלק, אך הצורה הקנונית שנכתבת בידי הבינה המלאכותית תמיד כוללת אותם בכל זאת — למען הקורא האנושי, לא למען המנתח. מכיוון שהבינה המלאכותית היא המחבר היחיד, המנתח לעולם אינו צריך לקבל סדר מילים חופשי או וריאציה דבורה; עליו רק לנתח צורה קנונית אחת. אותה אסימטריה היא מה שהופך משטח שפה טבעית לא-טריוויאלי לבר-טיפול בכלל.

שבעה מקטעים

Subject → See → Definitions → Rules → Cases → Provides → Internal
מקטעתפקידנדרש
Subjectמכריז על מה המסמך עוסקחובה
Seeמפנה לסמלים בחבילות חיצוניותאופציונלי
Definitionsמונחים ומבניםאופציונלי
Rulesפרדיקטים של תנאים inlineאופציונלי
Casesשיפוט + הרצה (הגרף עצמו)חובה
Providesנקודות קצהאופציונלי
Internalעבודה פנימית מונעת tick/אירועאופציונלי

כל מבנה תקף רק במקטע שלו — אותה משמעת תיחום שכל מהדורה מקומית יורשת ללא שינוי. הצהרות נקראות כמשפטים שלמים המכנים את סוגם: is a general rule, don't ... when, do ... once when, undo ... when, run ... when.

דוגמה: רובוט קפה

הנה כיצד סמנטיקת ההרצה של TANGL — דואליות Evaluate/Run, once, מפל — מופיעה כמשפטי markdown רגילים.

## tangl:Cases
- in case of `can place cup`
  - `order received` is a general rule using `sensor`.`isOrdered`
  - `no cup` is a counter rule using `sensor`.`noCupAvailable`
  - don't `order received` when `no cup`
  - do `arm`.`placeCup` once when `order received`
  - run `can pour water` when `order received`

- in case of `can pour water`
  - `cup placed` is a general rule using `sensor`.`cupIsPlaced`
  - do `arm`.`pourWater` once when `cup placed`
  - run `can brew espresso` when `cup placed`

## tangl:Provides
- provides `make coffee`
  - run `can place cup`

## tangl:Internal
- every 1s until `can serve coffee`
  - run `can place cup`

מבקר קורא זאת כך: “ברגע שהכוס ניתנת להנחה — אם ההזמנה התקבלה, הנח את הכוס פעם אחת והמשך למזיגת מים. אם אין כוס, ההזמנה בטלה. כדי להכין קפה, התחל מהנחת הכוס, ונסה שוב כל שנייה עד שניתן להגישה.”

בלי once, הזרוע הייתה מניחה כוס חדשה בכל tick כל עוד ההזמנה נשארת פעילה — המילה היא כל הסיבה לכך שעדכון חיישן איטי אינו הופך להרצה חוזרת מסוכנת פיזית. מבקר מאשר את בטיחות ההרצה החוזרת מהמשפט האחד הזה, מבלי שיקרא אי פעם סעיף שמירה (guard clause) של Go.

דוגמה: פיצוי — העולם נשאר שלם גם בכישלון

undo אינו זהה לדחייה. דחייה היא ענף רגיל של הגרף; undo הוא פיצוי על הרצה שמתה באמצע הדרך.

- do `bank`.`withdraw` once when `balance sufficient`
- undo `bank`.`refund` when `balance sufficient`
- run `can deposit` when `balance sufficient`

“אם היתרה מספקת, משוך פעם אחת; אם משהו במורד הזרם נכשל, גלגל לאחור באמצעות זיכוי; והמשך להפקדה.” בכישלון, הסדר הוא דטרמיניסטי:

1. withdraw succeeds        → refund is armed on the compensation stack
2. deposit errors           → the Run aborts immediately
3. stack unwinds LIFO       → refund fires, the money comes back
4. the original error is reported — the transfer failed, and the world looks like it never happened

אם refund עצמו נכשל, הפיצויים הנותרים נעצרים והעסקה כולה מוסלמת לשער סקירה אנושי (REVIEW) — המערכת מחליטה בעצמה שהעברה שבוצעה למחצה אינה משהו שיש לטייח אוטומטית.

היכן הטקסט מפסיק להיות מקור האמת — TANGEUL

כל מה שלמעלה הוא TANGL: טקסט markdown המנותח ומורץ ישירות. אך היות הטקסט קלט ההרצה היא נוחות, לא הכרח. ברגע שלשפה יש שני משטחים — אנגלית וקוריאנית — צצה השאלה “מי מהם קנוני?” כרגע התשובה היא “אנגלית, לפי מוסכמה.” זו החלטה, לא ערובה מבנית.

TANGEUL מסלק את השאלה, והוא כבר מסופק כמקור האמת היחיד הבינארי pkg/tangeul עבור כלי ה-tangl. פריט ההרצה הקנוני הוא זרם גרף בינארי (.tangeul) ש-check/ast/effects/gen פועלים עליו כולם ישירות; קובצי ה-markdown באנגלית ובקוריאנית הם קודקים של משטח הנספגים אל תוך אותו גרף, ומעובדים חזרה ממנו.

 EN .md ──[EN codec]──┐                        ┌──[mode 1]── verbatim byte-identical round trip
                      ├──> .tangeul (SSOT) ────┤
 KO .md ──[KO codec]──┘                        └──[mode 2]── normalized EN/KO rendering
  • מצב 1 (verbatim): משחזר את הבתים המקוריים בדיוק, כך שפלט הפענוח זהה בבתים למקורי .mdנבדק על ידי מבחן ה-round-trip של ה-CLI.
  • מצב 2 (regenerated): decode --locale en|ko מעבד מחדש כל הצהרה דרך הקודק של המקום היעד, ומשחזר קטעי פרוזה verbatim. מסמך שנכתב בקוריאנית ניתן לעיבוד עבור מבקר אנגלי, ולהפך.

משטח הכתיבה של מסמך מקובע למקום יחיד (עירוב מקטעים באנגלית ובקוריאנית בקובץ אחד נדחה), אך זרם ה-.tangeul עצמו אינו יודע איזה מקום כתב אותו. ניתן לעבד אותו לכל אחת מהשפות לפי דרישה בדיוק משום שהפריט הקנוני הוא גרף, לא פסקה.

כל הידע ברמת הביט מבודד בשתי חבילות — word (מילים בנות 16 ביט, כותרות frame) ו-codebook (ערכי קוד למצורף-בלבד) — כך שהשכבות שמעליהן (packets, stream, מיכל המסמך) נשארות יציבות ללא קשר לאופן שבו הקידוד מתפתח:

pkg/tangeul/
├── word/       // 16-bit words, frame headers — bit-level knowledge stops here
├── codebook/   // NodeType/PropCode/Control codes, append-only
├── packet/     // Node/Edge/Control/Text packets
├── stream/     // Doc ↔ .tangeul serialization
└── doc/        // Doc container + VerifyTiling + the surface Codec interface

VerifyTiling הוא שער השלמות: הבלוקים המתועדים חייבים לרצף את טקסט המקור בדיוק, והוא פועל בכל טעינה ובכל פלט מקודד. מבחני parity מאמתים שה-AST הנטען מזרם .tangeul שווה ל-AST שהמנתח מפיק מה-.md המקורי (עד כדי מספרי שורות). מיקוד מחדש לבינארי אינו עוסק בשינוי מה שהקוד עושה — הגרף, ולכן הפלט המיוצר, זהה; הוא עוסק בהסרה מבנית של האפשרות להיסחפות בין עותקים מרובים של אותו טקסט.

חוזים ברי-ביקורת

מסקנת toulmin הייתה שפסק דין מחושב בנוסחה, לא מוכרע בידי אדם. TANGL מוסיף שורה אחת לכך: החישוב קריא בידי מי שמעולם לא כתב את הנוסחה.

  • Warrant (חוק) = משפט אחד, `n` is a ... rule
  • Rebuttal = משפט אחד, don't `X` when `Y`
  • Ground (ראיה) = קריאה אחת לתוך פונקציית חבילה מופנית
  • Verdict = נוסחת ה-h-Categoriser

ו-TANGEUL הוא מלאכת ההבטחה, ברמת הבית, שהמשפטים הללו מצביעים על אותו גרף ללא קשר לשפה שבה הם כתובים. האדם הכותב את החוק והאדם המבקר אותו אינם צריכים עוד לחלוק שפה.

MIT License. github.com/park-jun-woo/toulminpkg/tangl, pkg/tangeul, cmd/tangl.

מקורות

יומן שינויים

  • 2026-07-03: מהדורה ראשונה