ProtoSpeech Foundation — v3.0 Draft

FUDGEL

A Meta-Language of Intent

Three sub-languages. One job each. No intermediate abstraction layer. Bija stores state. Rumus computes. Viesti routes. Everything else is a library. The source structure is the execution structure.

Scroll

The Trinity

Fudgel is composed of exactly three sub-languages, each with a single responsibility. No sub-language can perform the role of another. This separation is enforced by syntax, not convention.

Sub-language 01
Bija
seed / origin

The entire heap. All state lives here — entities, properties, templates, instances. Fully resolved at load time. Every human-readable name becomes a fixed memory address. No logic, no operations, no expressions. Pure structure.

Cannot: execute logic  ·  route data

Sub-language 02
Rumus
formula

Pure, finite functions operating exclusively in registers. Receives inputs, computes outputs, terminates. No heap allocation, no side effects, no back-edges. Every function is provably finite. Register scaffolding, not heap state.

Cannot: store state  ·  route data

Sub-language 03
Viesti
message / signal

The wiring layer. Connects Bija addresses to Rumus functions and writes results back. A signal resolves when its source address has data. One tilde between two addresses is the complete syntax. No logic, no time, no conditionals.

Cannot: store state  ·  execute logic

Bija — state
@Bija @Ehto TemplateWeapon; damage: 0 speed: 1 Player; name: Arin health: 100 {required} maxHP: =Config.maxHealth Sword: #TemplateWeapon | 28, 3 | Wave; minions: #Enemy !5
Rumus — logic
@Rumus ? clamp{x, min, max}; belowMin: x < min ? min : x result: belowMin > max ? max : belowMin ~result ? calcDamage{base, boost, roll}; hit: roll >= 40 ? 1 : 0 total: hit * (base + boost) ~total
Viesti — routing
@Viesti (── Single-line shorthand ─────────) Player.health ~ clamp ~ Player.health (── Multi-input function ──────────) Hero.attack ~ calcDamage.base Hero.upgrade ~ calcDamage.boost Roll.value ~ calcDamage.roll calcDamage ~ Enemy.health (── Dormant signal ───────────────) Player.health ~ checkCritical ~
"If you need logic, write a Rumus function. If you need to remember something, write it to a Bija entity. Viesti connects the two. Nothing else exists."

The
False
Tradeoff

Language design has historically operated on an assumed spectrum: human-readable on one end, machine-efficient on the other.


Every position on that spectrum is a compromise that leans one way and pretends it doesn't.


Fudgel's claim is that this tradeoff is false. A sufficiently honest representation of intent is also a sufficient representation for direct compilation — because intent at the right level of granularity is exactly what the machine needs.


The difficulty of assembly is not conceptual complexity — it is notational friction. Fudgel removes the friction without adding an abstraction layer, because the abstraction layer is what introduces the translation cost.

01
Deterministic by construction Same input state always produces the same output. Not a property you engineer — a guarantee that falls out of the architecture.
02
No GC. No heap allocation in functions. Rumus functions operate exclusively in registers. When a function returns, every intermediate value is gone. Garbage collection is an inapplicable concept.
03
No hidden control flow Every data dependency is a declared Viesti edge. Every iteration is a visible cycle in the graph. No implicit state, no framework magic.
04
The source is the execution graph No compiler transforms the structure before it runs. What you read is what the runtime executes. Bija is the heap. Viesti is the schedule.
05
Libraries are inherently open A library is Fudgel source. There is no compiled binary to distribute. The source is the library. The ecosystem is structurally open source whether or not that was anyone's explicit intention.

Try Fudgel Now

A live parser and visual schema renderer running entirely in your browser. Edit Bija, Rumus, or Viesti and watch the graph update in real time. No installation. No build step.

Fudgel IDE — fudgel.org
Editor
@Bija @Ehto Player; name: Arin health: 100 {required} mana: 60 {required} Config; maxHealth: 200 {immutable} Boss; health: 160 phase: 1 @Rumus ? clamp{x, min, max}; lo: x < min ? min : x result: lo > max ? max : lo ~result @Viesti Player.health ~ clamp ~ Player.health
Expanded Bija
@Bija Player; name: Arin health: 100 required: true mana: 60 required: true Config; maxHealth: 200 immutable: true Boss; health: 160 phase: 1 @Rumus clamp; x: true min: true max: true
Visual Schema
Player name: Arin health: 100 mana: 60
? clamp x: true min: true max: true ~result
Config maxHealth: 200
Boss health: 160 phase: 1

Architectural
Invariants

These are not conventions. A Fudgel compiler must reject any application that violates a compiler-enforceable invariant.

BJ-01

All shorthand resolves at parse time. Commas, ! multipliers, positional pipes, boolean metadata — none survive into the PAF. The runtime sees only expanded entities.

BJ-06

Only Viesti writes to Bija at runtime. No other mechanism can mutate state. Every state change is a named, visible signal in the graph.

RM-01

Every Rumus function is finite. No direct recursion. No cycles in the call graph. Turing-completeness requires an explicit, visible Viesti cycle — never hidden inside a function.

RM-09

No compiler optimisation pass. The compiler translates honestly. Performance is a product of design quality. A slow program is a design problem, visible in the structure.

VI-01

Signal order is execution order. Viesti signals resolve in the order they are written. Writing signals is simultaneously writing the execution schedule.

VI-07

Viesti has no concept of time. Timing, animation, and recurring execution are exclusively Lifga library concerns. The core has no run loop, no frame tick.

AR-01

No layer knows another layer exists. Bija does not know Rumus exists. Rumus does not know Viesti exists. Libraries do not know other libraries exist.

AR-07

Deterministic by construction. Non-determinism can only be introduced explicitly through a library — always an explicit choice, never an accidental one.

Standard
Libraries

Domain-specific semantic abstractions that compile directly to Bija entities, Rumus functions, and Viesti signals. No special compiler access. No runtime overhead beyond what their compiled output requires. Libraries are inherently open — source is the only distributable.

Compilation Pass
Run before PAF emission — errors here are compiler errors, not runtime exceptions
Foundational
Ehto
Constraint

Structural constraint validation. Reads boolean metadata on Bija entities and validates shape. Reference implementation for the compilation pass pattern.

Foundational
Primi
First / Memory

Memory and range validation. Provides primitive type constraints through metadata booleans. {int}, {float32}, and custom constraints.

Foundational
Peril
Peril / Verify

Parallelism verification. Proves ~~ independence claims at compile time by running each pool in both orderings and comparing outputs. Optional — but every ~~ it passes is proven, not asserted.

Visual Stack
Kadro → Smink → Pismo → Aquilla · each a distinct pass, each independently replaceable
Kadro
Frame / Layout

Where and how big. Pure spatial arithmetic on CPU — resolves layout before any rendering pass begins.

Smink
Makeup / Style

What does it look like. Property resolution over the entity tree — colours, borders, effects applied as a pass over Kadro-resolved entities.

Pismo
Font / Type

Text formatting and typography. Applies font metrics and shaping over Kadro layout entities as a dedicated pass.

Aquilla
Eagle / Render

What is visible and in what order. Compositing pass — produces a resolved list of rectangular regions written directly to the framebuffer. Invalidation-based: zero CPU when nothing changes.

Runtime & I/O
External systems, timing, and dynamic allocation
Lifga
Revive / Timing

The only library that introduces time. Writes to Bija entities on a schedule, triggering downstream signals naturally. Viesti never knows time exists.

Rezo
Network

High-performance network handling. External system interactions that may leave Bija addresses unpopulated — the graph stays inert, not hung.

Zapis
Record / I/O

File system and database I/O. Session persistence. Translates between external systems and Bija entity state.

Nësen
Nest / Dynamic

Dynamic entity allocation at runtime. Operates in a separate memory pool outside PAF space — PAF and Nësen addresses are unambiguously distinct, no type tag needed.

Application
Input, audio, security, and data handling
Tipus
User Input

Keyboard, pointer, touch, and gamepad input handling routed as Bija state updates.

Kani
Sound / Audio

Audio processing and playback. Sound state lives in Bija; Kani functions translate it to hardware output.

Cead
Permission

User access control and security. Permission state lives in Bija entities; Cead validates it during the compilation pass and at signal routing boundaries.

Drysu
Tangled / Crypto

Encryption and cryptographic safety. Non-determinism is an explicit, declared opt-in through this library.

Nyem
Squeeze / Compress

Compression and storage optimisation. Operates on Bija entity data as a pass — source representation unchanged, only the emitted binary is affected.

Localisation & Accessibility
Meaning layers applied as separate entity-tree passes
Giya
Guidance / A11y

Accessibility and semantic markers. Describes meaning for assistive technologies as a separate pass over the entity tree.

Hloov
Change / L10n

Translation and localisation. String resolution from locale tables as a Bija entity pass — no special runtime machinery required.

READ
THE
SPEC

The full architecture specification covers the PAF binary format, the IDE design, the compilation pipeline, and every invariant the compiler must enforce. v3.0 draft — live document.