Нарвался на трэп ASSERT(p IS Store, 21) в Stores.NewStore в модуле с типами
Element* = POINTER TO LIMITED RECORD (Stores.Store)
ElementDesc* = RECORD

Вроде как в Kernel неявные базовые типы метятся крышкой.
на
T = POINTER TO RECORD ... END;
получаем
T = POINTER TO T^
T^ = RECORD ... END

Однако в Stores это дело проскакивает как TDesc. Старое наследие, недопеределанное?

Воспроизведение (переименовать TDesc, трэп пропадает):
## Код:
```
MODULE PrivStoresDescTest;

   IMPORT Log, Files, Stores;
   
   TYPE
      T = POINTER TO RECORD (Stores.Store)
         n: INTEGER
      END;
      
      TDesc = RECORD
         n: INTEGER
      END;

   PROCEDURE (t: T) Externalize (VAR wr: Stores.Writer);
   BEGIN
      wr.WriteInt(t.n)
   END Externalize;
   
   PROCEDURE (t: T) Internalize (VAR rd: Stores.Reader);
   BEGIN
      rd.ReadInt(t.n)
   END Internalize;

   PROCEDURE WriteAndReadT* (n: INTEGER);
      VAR
         t: T; s: Stores.Store;
         f: Files.File; r: Stores.Reader; w: Stores.Writer;
   BEGIN
      NEW(t); t.n := n;
      f := Files.dir.Temp();
      w.ConnectTo(f); w.SetPos(0);
      w.WriteStore(t);
      r.ConnectTo(f); r.SetPos(0);
      r.ReadStore(s);
      Log.Int(s(T).n); Log.Ln
   END WriteAndReadT;

END PrivStoresDescTest.

^Q "PrivStoresDescTest.WriteAndReadT(1)"
```
