Aliran GEUL adalah sekuens paket yang dimulai dan diakhiri dengan Meta Node, merepresentasikan satu dokumen GEUL yang lengkap.

Fitur Utama

  • Batas eksplisit: STREAM_START / STREAM_END (Meta Node)
  • Scope TID: Hanya berlaku dalam aliran
  • Referensi maju: Hanya TID yang sudah dideklarasikan yang bisa dirujuk
  • Big Endian: Network Byte Order

Struktur Aliran

┌─────────────────────────────────────┐
│          STREAM_START               │  ← wajib (Meta Node)
│          (deklarasi lebar TID)       │     0xC000 (TID 16-bit)
├─────────────────────────────────────┤
│          Metadata (opsional)        │
│          - VERSION    (0xC014)      │
│          - CREATED_AT (0xC008)      │
│          - CREATOR    (0xC010)      │
├─────────────────────────────────────┤
│          Paket isi                   │
│          - Entity Node              │
│          - Quantity Node            │
│          - Verb Edge                │
│          - Triple Edge              │
│          - Event6 Edge              │
│          - Clause Edge              │
│          - Context Edge             │
│          - Group Edge               │
│          - Faber Edge               │
├─────────────────────────────────────┤
│          STREAM_END                 │  ← opsional (direkomendasikan)
└─────────────────────────────────────┘

Aliran minimal: STREAM_START(1 word) + STREAM_END(1 word) = 2 word (4 byte); aliran kosong juga valid.

Prinsip Penetapan TID

AturanDeskripsi
WajibSetiap Edge/Node dalam aliran memiliki TID
UnikTID unik dalam aliran
ScopeTID hanya berlaku dalam aliran tersebut
Referensi majuHanya TID yang sudah dideklarasikan yang bisa dirujuk

Posisi TID

TipePosisi TIDPosisi referensi
Meta NodeTidak adaTidak ada
Entity NodeWord terakhirTidak ada
Quantity NodeWord terakhirTidak ada
Tiny Verb EdgeTidak adaTidak ada (inline)
Verb EdgeArea headerSetelah payload
Triple EdgeArea headerSetelah payload
Event6 EdgeArea headerSetelah payload
Clause EdgeArea headerSetelah payload
Context EdgeArea headerSetelah payload
Group EdgeWord ke-2Word ke-3+

Node hanya mendefinisikan diri sendiri sehingga TID di akhir; Edge merujuk TID lain sehingga TID ditempatkan sebelum referensi.

TID Cadangan

TIDKegunaan
0x0000Marker terminasi (Group Edge dll.)
0xFFFFCadangan (standar 16-bit)

Aturan Urutan Paket

Urutan Deklarasi-Referensi

Benar:
  [Entity: Budi, TID=0x0001]
  [Entity: Sari, TID=0x0002]
  [Verb Edge: bertemu, Subject=0x0001, Object=0x0002]

Salah:
  [Verb Edge: bertemu, Subject=0x0001, Object=0x0002]  ← 0x0001 belum dideklarasikan
  [Entity: Budi, TID=0x0001]
  [Entity: Sari, TID=0x0002]

Urutan yang Direkomendasikan

1. STREAM_START
2. Metadata (VERSION, CREATED_AT, CREATOR)
3. Entity Node (deklarasi entitas)
4. Quantity Node (bilangan/literal)
5. Group Edge (definisi grup)
6. Tiny Verb Edge (predikat inline)
7. Verb Edge (predikat umum)
8. Triple Edge (properti/relasi)
9. Event6 Edge (peristiwa)
10. Clause Edge (relasi diskursif)
11. Context Edge (konteks)
12. Faber Edge (kode/AST)
13. STREAM_END

Ini urutan yang direkomendasikan; penempatan bebas selama aturan deklarasi-referensi dipenuhi.

Larangan Referensi Siklis

Referensi siklis bentuk A → B → A tidak dimungkinkan. Jika relasi siklis diperlukan, gunakan Edge terpisah.

Diizinkan:
  [Entity A, TID=0x0001]
  [Entity B, TID=0x0002]
  [Edge: A→B, TID=0x0003]
  [Edge: B→A, TID=0x0004]

Contoh Aliran

“Budi bertemu Sari”

1. STREAM_START (TID 16 bit)
   0xC0 0x00

2. Entity: Budi (TID=0x0001)
   [Entity paket...] 0x00 0x01

3. Entity: Sari (TID=0x0002)
   [Entity paket...] 0x00 0x02

4. Verb Edge: meet (TID=0x0100)
   Subject: 0x0001
   Object: 0x0002

5. STREAM_END
   0xC0 0x04

“Budi dan Sari bertemu di sekolah”

1. STREAM_START
   0xC0 0x00

2. Entity: Budi (TID=0x0001)
3. Entity: Sari (TID=0x0002)
4. Entity: sekolah (TID=0x0003)

5. Group Edge: AND (TID=0x0010)
   Anggota: 0x0001, 0x0002, 0x0000 (terminasi)

6. Verb Edge: meet (TID=0x0100)
   Subject: 0x0010 (grup)
   Location: 0x0003

7. STREAM_END
   0xC0 0x04

Validasi Aliran

Validasi Wajib

ItemPemeriksaan
AwalDimulai dengan STREAM_START?
Keunikan TIDTidak ada TID duplikat?
Validitas referensiSemua TID yang dirujuk sudah dideklarasikan?
Referensi majuPada saat referensi, TID sudah dideklarasikan?

Kode Validasi

def validate_stream(packets: list) -> dict:
    """Validasi aliran"""
    errors = []
    declared_tids = set()

    # Pemeriksaan awal
    if not packets or packets[0].type != "STREAM_START":
        errors.append("Aliran tidak dimulai dengan STREAM_START")

    for packet in packets:
        # Pemeriksaan keunikan TID
        if packet.tid is not None:
            if packet.tid in declared_tids:
                errors.append(f"TID duplikat: {packet.tid}")
            declared_tids.add(packet.tid)

        # Pemeriksaan validitas referensi
        for ref_tid in packet.references:
            if ref_tid not in declared_tids:
                errors.append(f"Referensi ke TID belum dideklarasikan: {ref_tid}")

    return {
        "valid": len(errors) == 0,
        "errors": errors,
        "tid_count": len(declared_tids)
    }

Aliran Multipel

Setiap aliran independen, dan scope TID dipisahkan per aliran. TID=0x0001 Aliran A dan TID=0x0001 Aliran B adalah entitas berbeda.

Referensi silang (Cross-reference) antar aliran saat ini belum didukung. Di masa depan, dapat diperluas melalui pengenalan Stream ID dan mekanisme Import/Export.