Active research · not frozen

Pratyabhijna World Model

A creative AI substrate, with a frozen LLM as the voice.

If you build models

A Dreamer-class textual world model (Trika RSSM, EFE actor, Hopfield memory, sleep) coupled to a frozen 120B LLM through a single trained logit-bias channel (VimarsaBridgeV2). Substrate and surface are measured separately.

If you read more than you code

PWM gives a creative AI an inner state that learns, remembers, dreams, and is rewarded for its own surprise. Then it asks a large language model to put that state into words. The model's mind and the model's mouth are different things.

Numbers on this page are read directly from JSON in benchmarks/results/ at build time. Generated Mon, 18 May 2026 19:25:54 GMT.

How to read this

The project is not frozen. Here is what is in flight.

Calling a research prototype done is the fastest way to oversell it. The site is honest about what is stable, what was revised this round, what is deprecated in spirit, and what is queued for the next pass.

AreaStateWhat it means now
Core world-model training stable Phase 6 checkpoint at 1M steps; A6 has two partial seeds queued for re-run.
Vimarsa Bridge v2 stable Trained; in use in the API v1 path and the H5b runner.
API v1 (POST /v1/generate, WS /v1/ws/generate) stable Faithful surface over PancakrtyaLoopV2.
API legacy (POST /generate, /refine, /batch) deprecated Parallel orchestration that bypasses EFE/Citta/Bridge; documented only, not refactored this round.
Paper revised H5b reframed as a bridge-bias ablation; four fidelity bugs corrected.
GitHub Pages site rebuilt Compact hero, architecture, philosophy table, dual-audience copy.
H5c composition / null-bias / low-resource tests queued Reframed in the project review; not run this round.
Human evaluation cohort queued Pre-registered for the follow-up journal submission.

Architecture

Two systems, one bridge.

PWM is a composite: a trainable world model that learns latent creative state, and a frozen 120B language model that turns that state into text. Almost every misread of the project comes from collapsing these two roles. The third box, the Vimarsa Bridge, is the only place learning crosses between them.

What the world model is for

The world model is the substrate. It learns latent state over text, holds memory, scores creative process, and never speaks.

  • Trika RSSM with three levels (Apara, Para-apara, Para) over text embeddings; emits (h, z) and prior/posterior logits each step.
  • EFE actor selects actions on (h, z); imagination rolls forward without the LLM in the loop.
  • Camatkara reward combines free-energy reduction, Hopfield-novelty gain and empowerment; fires sphuratta events on the recognised moments.
  • Citta-store (episodic + semantic Hopfield banks) recalls and blends a retrieval vector with the current latent.
  • NREM/REM sleep cycles consolidate replay and tune the prior; the LLM is silent throughout.
  • All quantities (VFE delta, sphuratta rate, retrieval coherence) are substrate-internal and have no LLM analogue.

Source files: pwm/world_model/trika.py , pwm/active_inference/efe_actor.py , pwm/rewards/camatk.py , pwm/memory/citta_store.py , pwm/sleep/consolidation.py .

What the frozen LLM is for

The frozen 120B LLM is the surface generator. Its weights are never trained; the world model couples to it through a single learned bias channel.

  • LLM weights are frozen everywhere; served via Ollama or llama.cpp.
  • Vimarsa Bridge v2 is the only place a world-model signal directly shapes LLM output: it maps h_t to a vocabulary-sized additive logit bias.
  • Narration is gated: the LLM is called for the jnana role on sphuratta events, not per step.
  • Optional WMReasoningTrace prefill serialises h_t as the LLM's pre-completed reasoning in the v2 production loop.
  • Embeddings for retrieval and goal-conditioning come from the LLM through encode().
  • Surface fluency is the LLM's job. Creative process is not its job.

Source files: pwm/llm/backend.py , pwm/vimarsa/bridge_v2.py , pwm/vimarsa/narrator.py , pwm/generation/llama_backend.py , pwm/pipeline/pancakrtya_loop_v2.py .

World model (trainable)                                Frozen LLM (sparse calls)
============================                          ==========================
text observation
      |
      v
encoder + LoRA --> Trika RSSM (h, z) --> EFE actor
                          |
                          +--> Citta-store (Hopfield recall + episodic store)
                          |              |
                          |              +--> NREM / REM consolidation
                          |
                          +--> Camatkara reward (dF + dI_Hopfield + Empowerment)
                          |              |
                          |              +--> sphuratta event
                          |
                          +--> VimarsaBridgeV2.as_logits_processor(h_t)
                                         |
                                         v
                                add logit bias  ->  nemotron-3-super:120b stream
                                                                   |
                                                                   v
                                                          surface text (lyrics, lines)

Note on the API

The repository exposes two API surfaces in api/main.py. The v1 endpoints (POST /v1/generate, WS /v1/ws/generate) delegate to PancakrtyaLoopV2 and exercise the world model, EFE actor, Citta-store, and bridge. The legacy endpoints (POST /generate, /refine, /batch) are a parallel orchestration that uses only a world-model-derived prompt prefix; they are deprecated in spirit and slated for unification. Consumers reproducing paper claims should use the v1 path.

Philosophy meets code

Sanskrit concept → textual source → module.

The Kashmir Saiva vocabulary is not decoration. Each term constrained a design decision: what state is shared, when the LLM is invoked, what counts as a recognised moment. The mapping below is concrete and lives in the codebase you can read.

ConceptSourceComputational realisationModule
Pratyabhijna Utpaladeva, IPK 1.3-1.4 Recognition density q_phi(z | h, o) pwm/world_model/rssm.py
Spanda Vasugupta, SpandaKarika 1.1 Stochastic discrete latent z ~ Cat(32x32) pwm/world_model/rssm.py
Vimarsa Utpaladeva, IPK 1.5.11 Reflexive bridge from h to LLM logit bias pwm/vimarsa/bridge_v2.py
Sphuratta Abhinavagupta, Tantraloka 1.56 Recognised-moment event firing pwm/rewards/camatk.py
Camatkara Abhinavagupta on Dhvanyaloka 1.1 Intrinsic creative reward (dF + dI_Hopfield + Emp) pwm/rewards/camatk.py
Citta Pratyabhijnahrdayam 9 Posterior memory; Hopfield retrieval pwm/memory/citta_store.py
Svatantrya Utpaladeva, IPK 2.1 Max-entropy policy prior pwm/active_inference/efe_actor.py

What we found

Positive results first, then the boundary.

Nine hypotheses pass under their pre-registered protocols (Hedges' g, BCa 95 percent CI, 50,000-permutation paired tests). Each card cites the source JSON; click through to the repository for full artefacts.

H1 pass

EFE actor

29.72x mean reward ratio

Time-to-sphuratta diagnostic failed; mean reward is the primary gate.

phase_2_gate.json
H2 pass

Hopfield completion

1.307x completion ratio

Sphuratta-rate diagnostic overshot its target band.

phase_3_gate_step0300000.json
H3 caveat

Sleep consolidation

near-zero forgetting

With-sleep and without-sleep values are identical at recorded precision.

phase_4_gate_step0300000.json
H4 pass

Vimarsha narration proxy

100% meaningful proxy

Proxy metric, not a completed human evaluation.

phase_5_gate_step0500000.json
H5a pass

Internal imagination reward

2.142x over Phase 2 baseline

Internal reward/imagination protocol, not live text quality.

phase_5_gate_step0500000.json
H6 pass

Reward entropy

1.897 nats

Use phase_6_gate_step1000000.json as the current source of truth.

phase_6_gate_step1000000.json
H7 caveat

Trika hierarchy

23.6x advantage

Two A6 seeds are partial timeout runs.

ablation_a6_1level_wm.json
H8 pass

Encoder stability

norm 13.2

Within registered [1, 50] bounds.

phase_6_gate_step1000000.json
H9 pass

Policy diversity

0.582 nats

Automated diversity proxy.

phase_6_gate_step1000000.json

Boundary condition H5b: a bridge-bias logit-channel ablation

H5b is not a head-to-head between the world model and the LLM. It is an ablation of the single trained coupling channel between them. Both sides use the same 120B model, the same prompts and the same decoding hyperparameters. The only difference is whether VimarsaBridgeV2.as_logits_processor(h_t) is applied to next-token logits, or whether an identity processor is used. The scorer is the stripped text-only camatkara heuristic that omits VFE so the unconditioned baseline is not penalised by construction.

With-bridge 0.7878, identity 0.8618, Hedges' g -0.4733, BCa 95 percent CI [-0.1214, -0.0225], paired permutation p 0.996, n = 30 across three domains.

The WM conditioning does not improve text-level quality when the LLM is sufficiently powerful. This is consistent with the theoretical frame: the WM's contribution is in the creative PROCESS (sphurattā events, vimarśa state, long-horizon planning) not in improving text-surface quality over an unconditioned 120B baseline. The LLM is already near-ceiling on the text-only scorer for English domains (0.93-1.0). The Kannada film domain shows near-parity, suggesting WM conditioning may be more valuable for lower-resource domains.

Read this as a boundary condition on the current coupling channel, not as a verdict on the world model as a substrate. The world model's contribution lives in latent process quantities (VFE, sphuratta firing, Hopfield retrieval coherence, empowerment) that the scorer explicitly removes and that the unconditioned baseline does not have. On the lower-resource Kannada domain, where the LLM is further from its training centre of mass, the gap collapses.

Per-domain means

DomainWith bridgeIdentityWins
english pop 0.883 0.937 2 / 8
carnatic 0.867 0.976 0 / 10
kannada film 0.655 0.672 4 / 6

Source: benchmarks/results/h5_live_ablation.json

Figures with story

Six pictures, in the order an outside reader should meet them.

Each figure here gets a paragraph of context, the figure itself, a one-line caption, and a pointer to what comes next. The aim is to make the project legible without reading the paper.

The whole pipeline on one page

PWM is a composite system. A trainable world model (left) holds latent state, scores creative process, and consolidates during sleep. A frozen 120B LLM (right) generates surface text. The Vimarsa Bridge is the single learned channel between them.

Read this diagram first if you only want to understand the architecture in one minute. Everything else on this page elaborates one box.

NextNext: see how the runtime call sequence flows through these boxes per stanza.

PWM system overview
Pancakrtya loop, world model, reward, memory, sleep, and bridge in their actual file locations.

H1: active inference beats REINFORCE by ~30x

Active inference is not a paperware concept here. The EFE actor's mean episode reward on the project's intrinsic creativity reward is about 30 times the REINFORCE baseline.

This is the strongest internal result and the cleanest evidence that the world model is learning something a weak policy cannot. It is measured under the project's own reward, not external human judgment; that gap is what H5c-style follow-ups should close.

NextNext: does the three-level hierarchy help over one level?

H1 EFE vs REINFORCE
Mean episode reward ratio (29.72x) between the EFE actor and a REINFORCE baseline in the Phase 2 gate.

A6: three-level Trika versus one-level world model

The three-level Trika hierarchy converges to substantially better final VFE than a one-level baseline. Across the seeds that completed, the advantage factor is roughly the order of magnitude reported here.

The honest caveat: two of three seeds hit GPU contention timeouts before finishing. The direction is consistent across what completed; a clean rerun is queued as forward work.

NextNext: the negative-result panel that bounds what the bridge channel does.

A6 hierarchy ablation
Final VFE ratio per seed; advantage factor 23.6x. Two of three seeds are partial timeout runs (annotated).

H5b: bridge-bias channel under a stripped text proxy

This is the figure people misread the most. Both sides use the same 120B language model with the same prompts. Side A adds the trained logit bias from the world model's h_t. Side B uses identity logits.

On English-script domains the baseline saturates the text-only proxy and the bias does not lift it. On the Kannada film domain the gap collapses to near-parity. The negative result is the boundary of this one coupling channel, not a verdict on the world model as a substrate.

NextNext: the latency contradiction Phase 7 resolved (and the warm vs cold confound).

H5b live per-domain
Paired per-domain breakdown. Same 120B model both sides; the only difference is whether VimarsaBridgeV2 adds a logit bias.

TTFT: warm-path works, aggregate run has a measurement confound

Phase 7 introduced a 4B/120B cascade plus WMReasoningTrace prefill to collapse a long chain-of-thought into a few seconds. Under warm-model timing both ADRs pass.

The aggregate live run still records gate_pass = false because of a separately documented cold-start confound. The site reports both numbers separately rather than collapsing them into a single 'TTFT pass'.

NextNext: the H1 failure chain that motivated the diagnostic discipline behind every other result.

TTFT warm vs cold
Warm-model measurements (ADR-001 and ADR-002 satisfied) versus aggregate live run.

Why static text is a hostile world-model substrate

PWM had to identify failure modes that interactive RL environments do not exhibit. Static text has no causal action-to-observation transition, so the policy can learn nothing or learn the wrong thing in characteristic ways.

The IDL fix and surrogate actions in the Phase 2 gate are the engineering response. The H1 result above only makes sense once this cascade is acknowledged.

NextNext: how to reproduce all of this from the public repo.

H1 failure chain
The diagnostic cascade behind the passive-corpus repair: action blindness, zero-action replay, reward sparsity, decoder bypass.

Where this should go next

Stop scoring composite systems with one scalar.

The TRIZ-style moves below are the project's own follow-up agenda. They follow from H5b's constructive reading: substrate gains and surface gains are different things and should not be averaged together.

PrincipleMove
1. Segmentation Report WM-substrate metrics and LLM-surface metrics separately. Stop collapsing a composite system into a single g.
2. Take Out / Extract Add a null-bias condition (random or norm-matched) so the learned-bias claim is isolated from raw LLM strength.
15. Dynamicity Make the conditioning channel selectable per phase (bridge only, bridge + Hopfield prefix, bridge + WMReasoningTrace prefill, bridge + LoRA).
25. Self-Service Fine-tune Vimarsa Bridge v2 against a richer dual proxy (substrate + surface), not only next-token CE on (h_t, next_token).
40. Composite Always present PWM as composite WM + frozen LLM. Stop framing H5b as 'WM vs LLM'.

Reproduce

Every number on this page points to a checked-in file.

Clone the repository, activate the project Python environment, and the gate JSONs are the single source of truth. The H5b live ablation additionally requires a local Ollama server with nemotron-3-super:120b and nemotron-mini:4b pulled.

benchmarks/results/phase_2_gate.jsonbenchmarks/results/phase_3_gate_step0300000.jsonbenchmarks/results/phase_4_gate_step0300000.jsonbenchmarks/results/phase_5_gate_step0500000.jsonbenchmarks/results/phase_6_gate_step1000000.jsonbenchmarks/results/h5_live_ablation.jsonbenchmarks/results/ablation_a6_1level_wm.jsonbenchmarks/results/ttft_live_validation.jsonbenchmarks/results/phase7_gate.jsonbenchmarks/results/phase8_gate.json

Known limits

Full 120B inference requires local model weights and checkpoint paths that are not shipped in this repository. The most reproducible public layer is the source code, paper, figure scripts, and JSON result artefacts. Treat this site as a companion to the repo, not a product.