==>(B Building on glalie(B ==>(B Checking for remote environment...(B ==>(B Syncing package to remote host...(B sending incremental file list created directory packages/python-prefab-ui ./ .SRCINFO 967B 100% 0B/s 0:00:00 967B 100% 0B/s 0:00:00 (xfr#1, to-chk=7/9) .nvchecker.toml 54B 100% 54,000B/s 0:00:00 54B 100% 54,000B/s 0:00:00 (xfr#2, to-chk=6/9) LICENSE 646B 100% 646,000B/s 0:00:00 646B 100% 646,000B/s 0:00:00 (xfr#3, to-chk=5/9) PKGBUILD 1,213B 100% 1,213,000B/s 0:00:00 1,213B 100% 1,213,000B/s 0:00:00 (xfr#4, to-chk=4/9) REUSE.toml 375B 100% 375,000B/s 0:00:00 375B 100% 375,000B/s 0:00:00 (xfr#5, to-chk=3/9) python-prefab-ui-0.21.1-1.log 864B 100% 864,000B/s 0:00:00 864B 100% 864,000B/s 0:00:00 (xfr#6, to-chk=2/9) LICENSES/ LICENSES/0BSD.txt -> ../LICENSE sent 2,624 bytes received 192 bytes 1,126.40 bytes/sec total size is 3,470 speedup is 1.23 ==>(B Running pkgctl build --arch riscv64 on remote host...(B ==> WARNING:(B invalid architecture: riscv64(B ==>(B Updating pacman database cache(B [?25l:: Synchronizing package databases... core downloading... extra downloading... multilib downloading... [?25h==>(B Building python-prefab-ui(B  ->(B repo: extra(B  ->(B arch: riscv64(B  ->(B worker: felix-0(B ==>(B Building python-prefab-ui for [extra] (riscv64)(B ]3008;start=a349b8677c7e4ec8b7a050d769cbce73;user=felix;hostname=glalie.felixc.at;machineid=72144a64db6f4720ade5ccd1e3c98c82;bootid=51ac5d2acb7245e0b17f8881054e1134;pid=886186;comm=sudo;targetuser=root;type=session\Note: in a future version of systemd-nspawn the default set of permitted socket address families will be restricted to AF_INET, AF_INET6 and AF_UNIX. Use --restrict-address-families= to configure the set of permitted socket address families, or set RestrictAddressFamilies= in a .nspawn file. ]3008;start=6c2192a4a5cd4b929775f6c5e368a783;user=root;hostname=glalie.felixc.at;machineid=72144a64db6f4720ade5ccd1e3c98c82;bootid=51ac5d2acb7245e0b17f8881054e1134;pid=886261;comm=systemd-nspawn;container=arch-nspawn-886261;type=container\]11;?\]2;🔵 Container arch-nspawn-886261 on glalie.felixc.at\[?25l:: Synchronizing package databases... core downloading... extra downloading... :: Starting full system upgrade... there is nothing to do [?25h[!p]104\[?7h]3008;end=6c2192a4a5cd4b929775f6c5e368a783\==>(B Building in chroot for [extra] (riscv64)...(B ==>(B Locking clean chroot [/var/lib/archbuild/extra-riscv64/root]...(Bdone(B ==>(B Synchronizing chroot copy [/var/lib/archbuild/extra-riscv64/root] -> [felix-0]...(Bdone(B ]3008;start=264b14a89b284ffd818fb1b9f2a7a2f3;user=root;hostname=glalie.felixc.at;machineid=72144a64db6f4720ade5ccd1e3c98c82;bootid=51ac5d2acb7245e0b17f8881054e1134;pid=889600;comm=sudo;targetuser=felix;type=session\==>(B Making package: python-prefab-ui 0.21.1-1 (Wed Oct 28 05:27:59 2026)(B ==>(B Retrieving sources...(B  ->(B Cloning prefab git repo...(B Cloning into bare repository '/home/felix/packages/python-prefab-ui/prefab'... remote: Enumerating objects: 18082, done. remote: Counting objects: 0% (1/497) remote: Counting objects: 1% (5/497) remote: Counting objects: 2% (10/497) remote: Counting objects: 3% (15/497) remote: Counting objects: 4% (20/497) remote: Counting objects: 5% (25/497) remote: Counting objects: 6% (30/497) remote: Counting objects: 7% (35/497) remote: Counting objects: 8% (40/497) remote: Counting objects: 9% (45/497) remote: Counting objects: 10% (50/497) remote: Counting objects: 11% (55/497) remote: Counting objects: 12% (60/497) remote: Counting objects: 13% (65/497) remote: Counting objects: 14% (70/497) remote: Counting objects: 15% (75/497) remote: Counting objects: 16% (80/497) remote: Counting objects: 17% (85/497) remote: Counting objects: 18% (90/497) remote: Counting objects: 19% (95/497) remote: Counting objects: 20% (100/497) remote: Counting objects: 21% (105/497) remote: Counting objects: 22% (110/497) remote: Counting objects: 23% (115/497) remote: Counting objects: 24% (120/497) remote: Counting objects: 25% (125/497) remote: Counting objects: 26% (130/497) remote: Counting objects: 27% (135/497) remote: Counting objects: 28% (140/497) remote: Counting objects: 29% (145/497) remote: Counting objects: 30% (150/497) remote: Counting objects: 31% (155/497) remote: Counting objects: 32% (160/497) remote: Counting objects: 33% (165/497) remote: Counting objects: 34% (169/497) remote: Counting objects: 35% (174/497) remote: Counting objects: 36% (179/497) remote: Counting objects: 37% (184/497) remote: Counting objects: 38% (189/497) remote: Counting objects: 39% (194/497) remote: Counting objects: 40% (199/497) remote: Counting objects: 41% (204/497) remote: Counting objects: 42% (209/497) remote: Counting objects: 43% (214/497) remote: Counting objects: 44% (219/497) remote: Counting objects: 45% (224/497) remote: Counting objects: 46% (229/497) remote: Counting objects: 47% (234/497) remote: Counting objects: 48% (239/497) remote: Counting objects: 49% (244/497) remote: Counting objects: 50% (249/497) remote: Counting objects: 51% (254/497) remote: Counting objects: 52% (259/497) remote: Counting objects: 53% (264/497) remote: Counting objects: 54% (269/497) remote: Counting objects: 55% (274/497) remote: Counting objects: 56% (279/497) remote: Counting objects: 57% (284/497) remote: Counting objects: 58% (289/497) remote: Counting objects: 59% (294/497) remote: Counting objects: 60% (299/497) remote: Counting objects: 61% (304/497) remote: Counting objects: 62% (309/497) remote: Counting objects: 63% (314/497) remote: Counting objects: 64% (319/497) remote: Counting objects: 65% (324/497) remote: Counting objects: 66% (329/497) remote: Counting objects: 67% (333/497) remote: Counting objects: 68% (338/497) remote: Counting objects: 69% (343/497) remote: Counting objects: 70% (348/497) remote: Counting objects: 71% (353/497) remote: Counting objects: 72% (358/497) remote: Counting objects: 73% (363/497) remote: Counting objects: 74% (368/497) remote: Counting objects: 75% (373/497) remote: Counting objects: 76% (378/497) remote: Counting objects: 77% (383/497) remote: Counting objects: 78% (388/497) remote: Counting objects: 79% (393/497) remote: Counting objects: 80% (398/497) remote: Counting objects: 81% (403/497) remote: Counting objects: 82% (408/497) remote: Counting objects: 83% (413/497) remote: Counting objects: 84% (418/497) remote: Counting objects: 85% (423/497) remote: Counting objects: 86% (428/497) remote: Counting objects: 87% (433/497) remote: Counting objects: 88% (438/497) remote: Counting objects: 89% (443/497) remote: Counting objects: 90% (448/497) remote: Counting objects: 91% (453/497) remote: Counting objects: 92% (458/497) remote: Counting objects: 93% (463/497) remote: Counting objects: 94% (468/497) remote: Counting objects: 95% (473/497) remote: Counting objects: 96% (478/497) remote: Counting objects: 97% (483/497) remote: Counting objects: 98% (488/497) remote: Counting objects: 99% (493/497) remote: Counting objects: 100% (497/497) remote: Counting objects: 100% (497/497), done. remote: Compressing objects: 1% (1/73) remote: Compressing objects: 2% (2/73) remote: Compressing objects: 4% (3/73) remote: Compressing objects: 5% (4/73) remote: Compressing objects: 6% (5/73) remote: Compressing objects: 8% (6/73) remote: Compressing objects: 9% (7/73) remote: Compressing objects: 10% (8/73) remote: Compressing objects: 12% (9/73) remote: Compressing objects: 13% (10/73) remote: Compressing objects: 15% (11/73) remote: Compressing objects: 16% (12/73) remote: Compressing objects: 17% (13/73) remote: Compressing objects: 19% (14/73) remote: Compressing objects: 20% (15/73) remote: Compressing objects: 21% (16/73) remote: Compressing objects: 23% (17/73) remote: Compressing objects: 24% (18/73) remote: Compressing objects: 26% (19/73) remote: Compressing objects: 27% (20/73) remote: Compressing objects: 28% (21/73) remote: Compressing objects: 30% (22/73) remote: Compressing objects: 31% (23/73) remote: Compressing objects: 32% (24/73) remote: Compressing objects: 34% (25/73) remote: Compressing objects: 35% (26/73) remote: Compressing objects: 36% (27/73) remote: Compressing objects: 38% (28/73) remote: Compressing objects: 39% (29/73) remote: Compressing objects: 41% (30/73) remote: Compressing objects: 42% (31/73) remote: Compressing objects: 43% (32/73) remote: Compressing objects: 45% (33/73) remote: Compressing objects: 46% (34/73) remote: Compressing objects: 47% (35/73) remote: Compressing objects: 49% (36/73) remote: Compressing objects: 50% (37/73) remote: Compressing objects: 52% (38/73) remote: Compressing objects: 53% (39/73) remote: Compressing objects: 54% (40/73) remote: Compressing objects: 56% (41/73) remote: Compressing objects: 57% (42/73) remote: Compressing objects: 58% (43/73) remote: Compressing objects: 60% (44/73) remote: Compressing objects: 61% (45/73) remote: Compressing objects: 63% (46/73) remote: Compressing objects: 64% (47/73) remote: Compressing objects: 65% (48/73) remote: Compressing objects: 67% (49/73) remote: Compressing objects: 68% (50/73) remote: Compressing objects: 69% (51/73) remote: Compressing objects: 71% (52/73) remote: Compressing objects: 72% (53/73) remote: Compressing objects: 73% (54/73) remote: Compressing objects: 75% (55/73) remote: Compressing objects: 76% (56/73) remote: Compressing objects: 78% (57/73) remote: Compressing objects: 79% (58/73) remote: Compressing objects: 80% (59/73) remote: Compressing objects: 82% (60/73) remote: Compressing objects: 83% (61/73) remote: Compressing objects: 84% (62/73) remote: Compressing objects: 86% (63/73) remote: Compressing objects: 87% (64/73) remote: Compressing objects: 89% (65/73) remote: Compressing objects: 90% (66/73) remote: Compressing objects: 91% (67/73) remote: Compressing objects: 93% (68/73) remote: Compressing objects: 94% (69/73) remote: Compressing objects: 95% (70/73) remote: Compressing objects: 97% (71/73) remote: Compressing objects: 98% (72/73) remote: Compressing objects: 100% (73/73) remote: Compressing objects: 100% (73/73), done. Receiving objects: 0% (1/18082) Receiving objects: 1% (181/18082) Receiving objects: 2% (362/18082) Receiving objects: 3% (543/18082) Receiving objects: 4% (724/18082) Receiving objects: 5% (905/18082), 952.01 KiB | 1.75 MiB/s Receiving objects: 6% (1085/18082), 952.01 KiB | 1.75 MiB/s Receiving objects: 7% (1266/18082), 952.01 KiB | 1.75 MiB/s Receiving objects: 8% (1447/18082), 952.01 KiB | 1.75 MiB/s Receiving objects: 8% (1542/18082), 952.01 KiB | 1.75 MiB/s Receiving objects: 9% (1628/18082), 952.01 KiB | 1.75 MiB/s Receiving objects: 10% (1809/18082), 952.01 KiB | 1.75 MiB/s Receiving objects: 11% (1990/18082), 2.74 MiB | 2.68 MiB/s Receiving objects: 12% (2170/18082), 2.74 MiB | 2.68 MiB/s Receiving objects: 13% (2351/18082), 2.74 MiB | 2.68 MiB/s Receiving objects: 14% (2532/18082), 5.36 MiB | 3.32 MiB/s Receiving objects: 14% (2601/18082), 5.36 MiB | 3.32 MiB/s Receiving objects: 15% (2713/18082), 8.31 MiB | 3.79 MiB/s Receiving objects: 16% (2894/18082), 8.31 MiB | 3.79 MiB/s Receiving objects: 17% (3074/18082), 8.31 MiB | 3.79 MiB/s Receiving objects: 17% (3112/18082), 11.77 MiB | 4.17 MiB/s Receiving objects: 18% (3255/18082), 11.77 MiB | 4.17 MiB/s Receiving objects: 19% (3436/18082), 15.48 MiB | 4.67 MiB/s Receiving objects: 20% (3617/18082), 15.48 MiB | 4.67 MiB/s Receiving objects: 21% (3798/18082), 15.48 MiB | 4.67 MiB/s Receiving objects: 21% (3811/18082), 18.79 MiB | 4.89 MiB/s Receiving objects: 22% (3979/18082), 18.79 MiB | 4.89 MiB/s Receiving objects: 23% (4159/18082), 18.79 MiB | 4.89 MiB/s Receiving objects: 24% (4340/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 25% (4521/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 26% (4702/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 27% (4883/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 28% (5063/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 29% (5244/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 30% (5425/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 31% (5606/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 32% (5787/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 32% (5899/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 33% (5968/18082), 22.14 MiB | 5.00 MiB/s Receiving objects: 34% (6148/18082), 24.80 MiB | 5.03 MiB/s Receiving objects: 35% (6329/18082), 24.80 MiB | 5.03 MiB/s Receiving objects: 36% (6510/18082), 24.80 MiB | 5.03 MiB/s Receiving objects: 37% (6691/18082), 27.07 MiB | 5.31 MiB/s Receiving objects: 37% (6727/18082), 27.07 MiB | 5.31 MiB/s Receiving objects: 38% (6872/18082), 29.27 MiB | 5.39 MiB/s Receiving objects: 39% (7052/18082), 29.27 MiB | 5.39 MiB/s Receiving objects: 40% (7233/18082), 29.27 MiB | 5.39 MiB/s Receiving objects: 41% (7414/18082), 29.27 MiB | 5.39 MiB/s Receiving objects: 42% (7595/18082), 29.27 MiB | 5.39 MiB/s Receiving objects: 43% (7776/18082), 30.17 MiB | 5.14 MiB/s Receiving objects: 44% (7957/18082), 30.17 MiB | 5.14 MiB/s Receiving objects: 45% (8137/18082), 30.17 MiB | 5.14 MiB/s Receiving objects: 46% (8318/18082), 30.17 MiB | 5.14 MiB/s Receiving objects: 47% (8499/18082), 30.17 MiB | 5.14 MiB/s Receiving objects: 48% (8680/18082), 30.17 MiB | 5.14 MiB/s Receiving objects: 49% (8861/18082), 30.17 MiB | 5.14 MiB/s Receiving objects: 49% (8894/18082), 32.36 MiB | 5.07 MiB/s Receiving objects: 50% (9041/18082), 32.36 MiB | 5.07 MiB/s Receiving objects: 51% (9222/18082), 32.36 MiB | 5.07 MiB/s Receiving objects: 52% (9403/18082), 37.29 MiB | 5.53 MiB/s Receiving objects: 53% (9584/18082), 37.29 MiB | 5.53 MiB/s Receiving objects: 54% (9765/18082), 37.29 MiB | 5.53 MiB/s Receiving objects: 54% (9909/18082), 37.29 MiB | 5.53 MiB/s Receiving objects: 55% (9946/18082), 40.86 MiB | 5.49 MiB/s Receiving objects: 56% (10126/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 57% (10307/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 58% (10488/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 59% (10669/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 60% (10850/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 61% (11031/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 62% (11211/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 63% (11392/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 64% (11573/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 65% (11754/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 66% (11935/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 67% (12115/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 68% (12296/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 69% (12477/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 70% (12658/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 71% (12839/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 72% (13020/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 73% (13200/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 74% (13381/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 75% (13562/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 75% (13730/18082), 42.96 MiB | 5.23 MiB/s Receiving objects: 76% (13743/18082), 48.16 MiB | 5.74 MiB/s Receiving objects: 77% (13924/18082), 48.16 MiB | 5.74 MiB/s Receiving objects: 78% (14104/18082), 48.16 MiB | 5.74 MiB/s Receiving objects: 79% (14285/18082), 51.52 MiB | 5.87 MiB/s Receiving objects: 80% (14466/18082), 51.52 MiB | 5.87 MiB/s Receiving objects: 81% (14647/18082), 51.52 MiB | 5.87 MiB/s Receiving objects: 82% (14828/18082), 51.52 MiB | 5.87 MiB/s Receiving objects: 83% (15009/18082), 51.52 MiB | 5.87 MiB/s Receiving objects: 84% (15189/18082), 51.52 MiB | 5.87 MiB/s Receiving objects: 84% (15296/18082), 51.52 MiB | 5.87 MiB/s Receiving objects: 85% (15370/18082), 55.77 MiB | 6.19 MiB/s Receiving objects: 86% (15551/18082), 55.77 MiB | 6.19 MiB/s Receiving objects: 87% (15732/18082), 55.77 MiB | 6.19 MiB/s Receiving objects: 88% (15913/18082), 55.77 MiB | 6.19 MiB/s Receiving objects: 89% (16093/18082), 60.24 MiB | 6.58 MiB/s Receiving objects: 90% (16274/18082), 60.24 MiB | 6.58 MiB/s Receiving objects: 90% (16383/18082), 60.24 MiB | 6.58 MiB/s Receiving objects: 91% (16455/18082), 60.24 MiB | 6.58 MiB/s Receiving objects: 92% (16636/18082), 60.24 MiB | 6.58 MiB/s Receiving objects: 93% (16817/18082), 64.88 MiB | 7.23 MiB/s Receiving objects: 94% (16998/18082), 64.88 MiB | 7.23 MiB/s Receiving objects: 94% (17020/18082), 69.63 MiB | 7.76 MiB/s Receiving objects: 95% (17178/18082), 69.63 MiB | 7.76 MiB/s Receiving objects: 96% (17359/18082), 72.92 MiB | 7.42 MiB/s Receiving objects: 96% (17470/18082), 74.80 MiB | 7.06 MiB/s Receiving objects: 97% (17540/18082), 74.80 MiB | 7.06 MiB/s Receiving objects: 98% (17721/18082), 74.80 MiB | 7.06 MiB/s Receiving objects: 99% (17902/18082), 74.80 MiB | 7.06 MiB/s remote: Total 18082 (delta 472), reused 426 (delta 424), pack-reused 17585 (from 2) Receiving objects: 100% (18082/18082), 74.80 MiB | 7.06 MiB/s Receiving objects: 100% (18082/18082), 78.63 MiB | 5.92 MiB/s, done. Resolving deltas: 0% (0/13952) Resolving deltas: 1% (140/13952) Resolving deltas: 2% (280/13952) Resolving deltas: 3% (419/13952) Resolving deltas: 4% (559/13952) Resolving deltas: 5% (698/13952) Resolving deltas: 6% (840/13952) Resolving deltas: 7% (977/13952) Resolving deltas: 8% (1117/13952) Resolving deltas: 9% (1256/13952) Resolving deltas: 10% (1396/13952) Resolving deltas: 11% (1535/13952) Resolving deltas: 12% (1675/13952) Resolving deltas: 13% (1815/13952) Resolving deltas: 14% (1954/13952) Resolving deltas: 15% (2096/13952) Resolving deltas: 16% (2236/13952) Resolving deltas: 17% (2372/13952) Resolving deltas: 18% (2512/13952) Resolving deltas: 19% (2651/13952) Resolving deltas: 20% (2791/13952) Resolving deltas: 21% (2930/13952) Resolving deltas: 22% (3072/13952) Resolving deltas: 23% (3209/13952) Resolving deltas: 24% (3349/13952) Resolving deltas: 25% (3488/13952) Resolving deltas: 26% (3628/13952) Resolving deltas: 27% (3768/13952) Resolving deltas: 28% (3907/13952) Resolving deltas: 29% (4047/13952) Resolving deltas: 30% (4186/13952) Resolving deltas: 31% (4327/13952) Resolving deltas: 32% (4465/13952) Resolving deltas: 33% (4605/13952) Resolving deltas: 34% (4744/13952) Resolving deltas: 35% (4884/13952) Resolving deltas: 36% (5025/13952) Resolving deltas: 37% (5163/13952) Resolving deltas: 38% (5302/13952) Resolving deltas: 39% (5442/13952) Resolving deltas: 40% (5581/13952) Resolving deltas: 41% (5721/13952) Resolving deltas: 42% (5860/13952) Resolving deltas: 43% (6000/13952) Resolving deltas: 44% (6139/13952) Resolving deltas: 45% (6279/13952) Resolving deltas: 46% (6418/13952) Resolving deltas: 47% (6558/13952) Resolving deltas: 48% (6697/13952) Resolving deltas: 49% (6837/13952) Resolving deltas: 50% (6976/13952) Resolving deltas: 51% (7116/13952) Resolving deltas: 52% (7256/13952) Resolving deltas: 53% (7395/13952) Resolving deltas: 54% (7535/13952) Resolving deltas: 55% (7674/13952) Resolving deltas: 56% (7814/13952) Resolving deltas: 57% (7953/13952) Resolving deltas: 58% (8093/13952) Resolving deltas: 59% (8232/13952) Resolving deltas: 60% (8372/13952) Resolving deltas: 61% (8511/13952) Resolving deltas: 62% (8651/13952) Resolving deltas: 63% (8790/13952) Resolving deltas: 64% (8930/13952) Resolving deltas: 65% (9069/13952) Resolving deltas: 66% (9209/13952) Resolving deltas: 67% (9348/13952) Resolving deltas: 68% (9488/13952) Resolving deltas: 69% (9627/13952) Resolving deltas: 70% (9768/13952) Resolving deltas: 71% (9907/13952) Resolving deltas: 72% (10046/13952) Resolving deltas: 73% (10185/13952) Resolving deltas: 74% (10325/13952) Resolving deltas: 75% (10464/13952) Resolving deltas: 76% (10604/13952) Resolving deltas: 77% (10744/13952) Resolving deltas: 78% (10884/13952) Resolving deltas: 79% (11023/13952) Resolving deltas: 80% (11162/13952) Resolving deltas: 81% (11302/13952) Resolving deltas: 82% (11441/13952) Resolving deltas: 83% (11581/13952) Resolving deltas: 84% (11720/13952) Resolving deltas: 85% (11860/13952) Resolving deltas: 86% (11999/13952) Resolving deltas: 87% (12139/13952) Resolving deltas: 88% (12278/13952) Resolving deltas: 89% (12418/13952) Resolving deltas: 90% (12557/13952) Resolving deltas: 91% (12697/13952) Resolving deltas: 92% (12836/13952) Resolving deltas: 93% (12976/13952) Resolving deltas: 94% (13115/13952) Resolving deltas: 95% (13255/13952) Resolving deltas: 96% (13394/13952) Resolving deltas: 97% (13534/13952) Resolving deltas: 98% (13673/13952) Resolving deltas: 99% (13813/13952) Resolving deltas: 99% (13896/13952) Resolving deltas: 100% (13952/13952) Resolving deltas: 100% (13952/13952), done. ==>(B Validating source files with sha512sums...(B prefab ... Passed ]3008;end=264b14a89b284ffd818fb1b9f2a7a2f3\Note: in a future version of systemd-nspawn the default set of permitted socket address families will be restricted to AF_INET, AF_INET6 and AF_UNIX. Use --restrict-address-families= to configure the set of permitted socket address families, or set RestrictAddressFamilies= in a .nspawn file. ]3008;start=3ab5bb8dff6f4a86b092cb5b14d64458;user=root;hostname=glalie.felixc.at;machineid=72144a64db6f4720ade5ccd1e3c98c82;bootid=51ac5d2acb7245e0b17f8881054e1134;pid=894679;comm=systemd-nspawn;container=makechrootpkg-python-prefab-ui.build.886231;type=container\]11;?\]2;🔵 Container makechrootpkg-python-prefab-ui.build.886231 on glalie.felixc.at\]3008;start=f7b92ec6038849cd9063175298ce42e9;user=root;hostname=makechrootpkg-python-prefab-ui.build.886231;machineid=bc09cb1bbe5d452fb1c6fa9ee790c373;bootid=ce0b0d5b44934a6cb90deb6d126dec72;pid=14;comm=sudo;targetuser=builduser;type=session\==>(B Making package: python-prefab-ui 0.21.1-1 (Tue Oct 27 21:28:44 2026)(B ==>(B Checking runtime dependencies...(B ==>(B Installing missing dependencies...(B ]3008;start=b4ffcff904dd40398a627e0dc0a86e30;user=builduser;hostname=makechrootpkg-python-prefab-ui.build.886231;machineid=bc09cb1bbe5d452fb1c6fa9ee790c373;bootid=ce0b0d5b44934a6cb90deb6d126dec72;pid=887;comm=sudo;targetuser=root;type=session\[?25lresolving dependencies... looking for conflicting packages... Package (13) New Version Net Change Download Size extra/python-annotated-types 0.8.0-1 0.12 MiB extra/python-attrs 26.1.0-1 0.63 MiB extra/python-docstring-parser 0.18.0-1 0.27 MiB 0.05 MiB extra/python-markdown-it-py 4.2.0-1 0.81 MiB extra/python-mdurl 0.1.2-9 0.06 MiB extra/python-pydantic-core 3:2.50.1-1 5.41 MiB extra/python-pygments 2.21.0-1 15.59 MiB extra/python-rich-rst 2.2.0-1 3.65 MiB 0.56 MiB extra/python-typing-inspection 0.4.4-1 0.13 MiB extra/python-cyclopts 5.3.1-1 3.39 MiB 0.56 MiB extra/python-pydantic 2.14.1-1 6.20 MiB extra/python-rich 15.0.0-1 4.49 MiB extra/python-typing_extensions 4.16.0-1 0.53 MiB Total Download Size: 1.17 MiB Total Installed Size: 41.26 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... python-cyclopts-5.3.1-1-any downloading... python-rich-rst-2.2.0-1-any downloading... python-docstring-parser-0.18.0-1-any downloading... checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing python-attrs... installing python-docstring-parser... installing python-mdurl... installing python-markdown-it-py... Optional dependencies for python-markdown-it-py python-mdit_py_plugins: core plugins python-linkify-it-py: linkify extension installing python-pygments... installing python-rich... installing python-rich-rst... installing python-cyclopts... Optional dependencies for python-cyclopts mkdocs: MkDocs documentation plugin python-pydantic: Pydantic model arguments [pending] python-pymdown-extensions: extended formatting for MkDocs documentation python-sphinx: Sphinx documentation extension python-trio: Trio async commands python-yaml: YAML configuration files installing python-annotated-types... installing python-typing_extensions... installing python-typing-inspection... installing python-pydantic-core... installing python-pydantic... Optional dependencies for python-pydantic mypy: for type validation with mypy python-dotenv: for .env file support python-email-validator: for email validation python-hypothesis: for hypothesis plugin when using legacy v1 :: Running post-transaction hooks... (1/1) Arming ConditionNeedsUpdate... [?25h]3008;end=b4ffcff904dd40398a627e0dc0a86e30\==>(B Checking buildtime dependencies...(B ==>(B Installing missing dependencies...(B ]3008;start=e02040dab9d54b42b83b71394e988621;user=builduser;hostname=makechrootpkg-python-prefab-ui.build.886231;machineid=bc09cb1bbe5d452fb1c6fa9ee790c373;bootid=ce0b0d5b44934a6cb90deb6d126dec72;pid=980;comm=sudo;targetuser=root;type=session\[?25lresolving dependencies... looking for conflicting packages... warning: insufficient columns available for table display Packages (38) default-cursors-3-1 jbigkit-2.2-1 jemalloc-1:5.4.0-1 lcms2-2.19.1-1 libdeflate-1.26-1 libjpeg-turbo-3.2.0-2 libtiff-4.7.2-2 libwebp-1.6.0-2 perl-error-0.17031-1 perl-mailtools-2.22-3 perl-timedate-2.35-1 python-dunamai-1.26.3-1 python-editables-0.6-1 python-iniconfig-2.3.0-1 python-jinja-1:3.1.6-3.1 python-jsonschema-specifications-2025.9.1-2 python-markupsafe-3.0.4-1 python-packaging-26.3-1 python-pathspec-1.1.1-1 python-pluggy-1.7.0-1 python-pyproject-hooks-1.3.3-1 python-referencing-0.37.0-3.1 python-rpds-py-2026.9.1-1 python-tomlkit-0.15.2-1 python-trove-classifiers-2026.9.21.13-1 wayland-1.26.0-1 zlib-ng-2.3.3-1 deno-2.9.8-1 git-2.56.0-1 python-build-1.6.1-1 python-hatchling-1.32.4-1 python-installer-1.1.0-1 python-jsonschema-4.26.0-1.1 python-pytest-1:9.1.1-1 python-pytest-asyncio-1.4.1-1 python-pytest-timeout-2.5.0-1 python-uv-dynamic-versioning-0.14.1-1 uv-0.13.6-1 Total Download Size: 47.33 MiB Total Installed Size: 190.14 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... deno-2.9.8-1-riscv64 downloading... uv-0.13.6-1-riscv64 downloading... checking keyring... checking package integrity... loading package files... checking for file conflicts... :: Processing package changes... installing perl-error... installing perl-timedate... installing perl-mailtools... installing zlib-ng... installing git... Optional dependencies for git git-zsh-completion: upstream zsh completion tk: gitk and git gui openssh: ssh transport and crypto man: show help with `git command --help` perl-libwww: git svn perl-term-readkey: git svn and interactive.singlekey setting perl-io-socket-ssl: git send-email TLS support perl-authen-sasl: git send-email TLS support perl-cgi: gitweb (web interface) support python: git svn & git p4 [installed] subversion: git svn org.freedesktop.secrets: keyring credential helper libsecret: libsecret credential helper [installed] less: the default pager for git installing python-packaging... installing python-pyproject-hooks... installing python-build... Optional dependencies for python-build python-pip: to use as the Python package installer (default) python-uv: to use as the Python package installer python-virtualenv: to use virtualenv for build isolation installing python-editables... installing python-pathspec... Optional dependencies for python-pathspec python-google-re2: re2 backend installing python-pluggy... installing python-tomlkit... installing python-trove-classifiers... installing python-hatchling... installing python-installer... installing python-dunamai... installing python-markupsafe... installing python-jinja... Optional dependencies for python-jinja python-babel: for i18n support installing python-uv-dynamic-versioning... installing libjpeg-turbo... installing jbigkit... installing libdeflate... installing libwebp... Optional dependencies for libwebp libwebp-utils: WebP conversion and inspection tools installing libtiff... Optional dependencies for libtiff freeglut: for using tiffgt installing lcms2... installing default-cursors... Optional dependencies for default-cursors adwaita-cursors: default cursor theme installing wayland... installing deno... installing python-rpds-py... installing python-referencing... installing python-jsonschema-specifications... installing python-jsonschema... Optional dependencies for python-jsonschema python-isoduration: for duration format python-fqdn: for hostname format python-idna: for idn-hostname format python-jsonpointer: for json-pointer & relative-json-pointer format python-rfc3339-validator: for date-time format python-rfc3987: for iri, iri-reference, uri & uri-reference format python-uri-template: for uri-template format python-webcolors: for color format installing python-iniconfig... installing python-pytest... installing python-pytest-asyncio... installing python-pytest-timeout... installing jemalloc... Optional dependencies for jemalloc perl: for jeprof [installed] installing uv... :: Running post-transaction hooks... (1/4) Creating system user accounts... Creating group 'git' with GID 968. Creating user 'git' (git daemon user) with UID 968 and GID 968. (2/4) Reloading system manager configuration... Skipped: Current root is not booted. (3/4) Arming ConditionNeedsUpdate... (4/4) Checking for old perl modules... WARNING: '/usr/lib/perl5/5.42' contains data from at least 1 packages which will NOT be used by the installed perl interpreter. -> Run the following command to get a list of affected packages: pacman -Qqo '/usr/lib/perl5/5.42' [?25h]3008;end=e02040dab9d54b42b83b71394e988621\==>(B Retrieving sources...(B ==> WARNING:(B Skipping all source file integrity checks.(B ==>(B Extracting sources...(B  ->(B Creating working copy of prefab git repo...(B Cloning into 'prefab'... done. Switched to a new branch 'makepkg' ==>(B Starting build()...(B * Getting build dependencies for wheel... * Building wheel... Successfully built prefab_ui-0.21.1-py3-none-any.whl ==>(B Starting check()...(B ============================= test session starts ============================== platform linux -- Python 3.14.8, pytest-9.1.1, pluggy-1.7.0 rootdir: /build/python-prefab-ui/src/prefab configfile: pyproject.toml testpaths: tests plugins: timeout-2.4.0, asyncio-1.4.1 timeout: 5.0s timeout method: signal timeout func_only: False asyncio: mode=Mode.AUTO, debug=False, asyncio_default_fixture_loop_scope=function, asyncio_default_test_loop_scope=function collected 1489 items tests/actions/test_app_tool.py .. [ 0%] tests/actions/test_base.py .. [ 0%] tests/actions/test_custom.py ...... [ 0%] tests/actions/test_fetch.py .................... [ 2%] tests/actions/test_mcp.py ................... [ 3%] tests/actions/test_state.py .......................... [ 5%] tests/cli/test_cli.py ... [ 5%] tests/components/charts/test_cartesian.py .............................. [ 7%] ... [ 7%] tests/components/charts/test_init.py . [ 7%] tests/components/charts/test_radial.py ...................... [ 8%] tests/components/charts/test_shared.py ................................. [ 11%] ........... [ 11%] tests/components/charts/test_sparkline.py ... [ 12%] tests/components/charts/test_waterfall.py ................ [ 13%] tests/components/test_accordion.py ...... [ 13%] tests/components/test_audio.py ... [ 13%] tests/components/test_badge.py . [ 13%] tests/components/test_base.py .......................................... [ 16%] ... [ 16%] tests/components/test_calendar.py ........ [ 17%] tests/components/test_carousel.py ........... [ 18%] tests/components/test_checkbox.py .... [ 18%] tests/components/test_code.py .. [ 18%] tests/components/test_combobox.py .......... [ 19%] tests/components/test_dashboard.py .................. [ 20%] tests/components/test_date_picker.py .. [ 20%] tests/components/test_dialog.py . [ 20%] tests/components/test_div.py ..... [ 21%] tests/components/test_drop_zone.py .. [ 21%] tests/components/test_embed.py .............. [ 22%] tests/components/test_field.py ................... [ 23%] tests/components/test_foreach.py .............................. [ 25%] tests/components/test_grid.py ....... [ 25%] tests/components/test_heading.py . [ 25%] tests/components/test_histogram.py ..................................... [ 28%] ....... [ 28%] tests/components/test_hover_card.py .... [ 29%] tests/components/test_image.py . [ 29%] tests/components/test_input.py ............ [ 30%] tests/components/test_label.py . [ 30%] tests/components/test_layout.py ..... [ 30%] tests/components/test_markdown.py ... [ 30%] tests/components/test_mermaid.py .... [ 30%] tests/components/test_metric.py ..................... [ 32%] tests/components/test_pages.py ... [ 32%] tests/components/test_popover.py . [ 32%] tests/components/test_progress.py ................. [ 33%] tests/components/test_radio.py ...... [ 34%] tests/components/test_ring.py ................ [ 35%] tests/components/test_select.py ................... [ 36%] tests/components/test_separator.py . [ 36%] tests/components/test_slider.py .................. [ 37%] tests/components/test_slot.py ..... [ 38%] tests/components/test_svg.py .... [ 38%] tests/components/test_switch.py .... [ 38%] tests/components/test_table.py ................ [ 39%] tests/components/test_tabs.py ....... [ 40%] tests/components/test_text.py ..................... [ 41%] tests/components/test_textarea.py .. [ 41%] tests/components/test_tooltip.py .... [ 41%] tests/components/test_video.py .... [ 42%] tests/rx/test_rx_mcp.py ....... [ 42%] tests/sandbox/test_pyodide.py ..FFF+++++++++++++++++++++++++++++++++++ Timeout ++++++++++++++++++++++++++++++++++++ ~~~~~~~~~~~~~~~~~~~~~~ Stack of asyncio_0 (273025585536) ~~~~~~~~~~~~~~~~~~~~~~~ File "/usr/lib/python3.14/threading.py", line 1044, in _bootstrap self._bootstrap_inner() File "/usr/lib/python3.14/threading.py", line 1082, in _bootstrap_inner self._context.run(self.run) File "/usr/lib/python3.14/threading.py", line 1024, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3.14/concurrent/futures/thread.py", line 119, in _worker work_item.run(ctx) File "/usr/lib/python3.14/concurrent/futures/thread.py", line 86, in run result = ctx.run(self.task) File "/usr/lib/python3.14/concurrent/futures/thread.py", line 73, in run return fn(*args, **kwargs) +++++++++++++++++++++++++++++++++++ Timeout ++++++++++++++++++++++++++++++++++++ F...........FF...... [ 44%] tests/test_actions.py .................................................. [ 47%] ...................... [ 49%] tests/test_app.py .......................................... [ 52%] tests/test_app_tools.py ........................... [ 53%] tests/test_auto_name.py ..................... [ 55%] tests/test_conditional.py ................. [ 56%] tests/test_contract.py ................................................. [ 59%] ........................................................................ [ 64%] ........ [ 65%] tests/test_define_use_state.py ....................... [ 66%] tests/test_executor_harness.py ..................... [ 68%] tests/test_form_model.py ............................................... [ 71%] ...... [ 71%] tests/test_generative.py .......................................FF.F [ 74%] tests/test_on_mount.py ........ [ 75%] tests/test_packaging.py . [ 75%] tests/test_playground_examples.py . [ 75%] tests/test_protocol_pages.py . [ 75%] tests/test_render_previews.py . [ 75%] tests/test_renderer.py ................. [ 76%] tests/test_responsive.py ................................. [ 78%] tests/test_rx.py ....................................................... [ 82%] ........................................................................ [ 87%] ............. [ 88%] tests/test_rx_expressions.py ........................................... [ 90%] ................... [ 92%] tests/test_sandbox.py sssssssssssssssssssssssssF [ 93%] tests/test_themes.py ................................................... [ 97%] .................................... [ 99%] tests/test_use.py ... [100%] =================================== FAILURES =================================== __________ test_print_does_not_desynchronize_results[print("debug")] ___________ output = 'print("debug")' @pytest.mark.timeout(120) @pytest.mark.skipif(shutil.which("deno") is None, reason="Deno not installed") @pytest.mark.parametrize( "output", [ 'print("debug")', "print({'result': {'view': {'content': 'printed'}}})", 'print("x" * 100_000)', 'import sys; print("x" * 100_000, file=sys.stderr)', ], ) async def test_print_does_not_desynchronize_results(output: str) -> None: > async with PyodideSandbox() as sandbox: ^^^^^^^^^^^^^^^^ tests/sandbox/test_pyodide.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:52: in __aenter__ await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E Download https://registry.npmjs.org/pyodide E Download https://registry.npmjs.org/ws E Download https://deno.land/std@0.224.0/io/read_lines.ts E Download https://deno.land/std@0.224.0/fs/walk.ts E Download https://deno.land/std@0.224.0/io/buf_reader.ts E Download https://deno.land/std@0.224.0/bytes/concat.ts E Download https://deno.land/std@0.224.0/path/join.ts E Download https://deno.land/std@0.224.0/path/normalize.ts E Download https://deno.land/std@0.224.0/fs/_to_path_string.ts E Download https://deno.land/std@0.224.0/fs/_create_walk_entry.ts E Download https://deno.land/std@0.224.0/assert/assert.ts E Download https://deno.land/std@0.224.0/bytes/copy.ts E Download https://deno.land/std@0.224.0/path/_os.ts E Download https://deno.land/std@0.224.0/path/posix/join.ts E Download https://deno.land/std@0.224.0/path/windows/j E ... E ============================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1260) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError _ test_print_does_not_desynchronize_results[print({'result': {'view': {'content': 'printed'}}})] _ output = "print({'result': {'view': {'content': 'printed'}}})" @pytest.mark.timeout(120) @pytest.mark.skipif(shutil.which("deno") is None, reason="Deno not installed") @pytest.mark.parametrize( "output", [ 'print("debug")', "print({'result': {'view': {'content': 'printed'}}})", 'print("x" * 100_000)', 'import sys; print("x" * 100_000, file=sys.stderr)', ], ) async def test_print_does_not_desynchronize_results(output: str) -> None: > async with PyodideSandbox() as sandbox: ^^^^^^^^^^^^^^^^ tests/sandbox/test_pyodide.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:52: in __aenter__ await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1275) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError _______ test_print_does_not_desynchronize_results[print("x" * 100_000)] ________ output = 'print("x" * 100_000)' @pytest.mark.timeout(120) @pytest.mark.skipif(shutil.which("deno") is None, reason="Deno not installed") @pytest.mark.parametrize( "output", [ 'print("debug")', "print({'result': {'view': {'content': 'printed'}}})", 'print("x" * 100_000)', 'import sys; print("x" * 100_000, file=sys.stderr)', ], ) async def test_print_does_not_desynchronize_results(output: str) -> None: > async with PyodideSandbox() as sandbox: ^^^^^^^^^^^^^^^^ tests/sandbox/test_pyodide.py:66: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:52: in __aenter__ await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1292) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError _ test_print_does_not_desynchronize_results[import sys; print("x" * 100_000, file=sys.stderr)] _ self = def runtest(self) -> None: runner_fixture_id = f"_{self._loop_scope}_scoped_runner" runner = self._request.getfixturevalue(runner_fixture_id) context = contextvars.copy_context() synchronized_obj = _synchronize_coroutine( getattr(*self._synchronization_target_attr), runner, context ) with MonkeyPatch.context() as c: c.setattr(*self._synchronization_target_attr, synchronized_obj) > super().runtest() /usr/lib/python3.14/site-packages/pytest_asyncio/plugin.py:570: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /usr/lib/python3.14/site-packages/pytest_asyncio/plugin.py:906: in inner runner.run(coro, context=context) /usr/lib/python3.14/asyncio/runners.py:128: in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /usr/lib/python3.14/asyncio/base_events.py:707: in run_until_complete self.run_forever() /usr/lib/python3.14/asyncio/base_events.py:678: in run_forever self._run_once() /usr/lib/python3.14/asyncio/base_events.py:2024: in _run_once event_list = self._selector.select(timeout) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , timeout = -1 def select(self, timeout=None): if timeout is None: timeout = -1 elif timeout <= 0: timeout = 0 else: # epoll_wait() has a resolution of 1 millisecond, round away # from zero to wait *at least* timeout seconds. timeout = math.ceil(timeout * 1e3) * 1e-3 # epoll_wait() expects `maxevents` to be greater than zero; # we want to make sure that `select()` can be called when no # FD is registered. max_ev = len(self._fd_to_key) or 1 ready = [] try: > fd_event_list = self._selector.poll(timeout, max_ev) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E Failed: Timeout (>120.0s) from pytest-timeout. /usr/lib/python3.14/selectors.py:452: Failed ____________ test_startup_uses_packaged_lock_from_another_directory ____________ tmp_path = PosixPath('/tmp/pytest-of-builduser/pytest-0/test_startup_uses_packaged_loc0') monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x3f92e31c70> @pytest.mark.timeout(120) @pytest.mark.skipif(shutil.which("deno") is None, reason="Deno not installed") async def test_startup_uses_packaged_lock_from_another_directory( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: (tmp_path / "deno.json").write_text('{"lock": "unrelated.lock"}') monkeypatch.chdir(tmp_path) > async with PyodideSandbox() as sandbox: ^^^^^^^^^^^^^^^^ /build/python-prefab-ui/src/prefab/tests/sandbox/test_pyodide.py:207: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ /build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:52: in __aenter__ await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1344) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace /build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError _____________ test_cold_start_keeps_download_logs_out_of_responses _____________ tmp_path = PosixPath('/tmp/pytest-of-builduser/pytest-0/test_cold_start_keeps_download0') monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x3f929a83d0> @pytest.mark.timeout(120) @pytest.mark.skipif(shutil.which("deno") is None, reason="Deno not installed") async def test_cold_start_keeps_download_logs_out_of_responses( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: monkeypatch.setenv("DENO_DIR", str(tmp_path / "deno-cache")) > async with PyodideSandbox() as sandbox: ^^^^^^^^^^^^^^^^ tests/sandbox/test_pyodide.py:222: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:52: in __aenter__ await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E Download https://registry.npmjs.org/pyodide E Download https://registry.npmjs.org/ws E Download https://deno.land/std@0.224.0/io/read_lines.ts E Download https://deno.land/std@0.224.0/fs/walk.ts E Download https://deno.land/std@0.224.0/io/buf_reader.ts E Download https://deno.land/std@0.224.0/bytes/concat.ts E Download https://deno.land/std@0.224.0/path/join.ts E Download https://deno.land/std@0.224.0/path/normalize.ts E Download https://deno.land/std@0.224.0/fs/_to_path_string.ts E Download https://deno.land/std@0.224.0/fs/_create_walk_entry.ts E Download https://deno.land/std@0.224.0/assert/assert.ts E Download https://deno.land/std@0.224.0/bytes/copy.ts E Download https://deno.land/std@0.224.0/path/_os.ts E Download https://deno.land/std@0.224.0/path/posix/join.ts E Download https://deno.land/std@0.224.0/path/windows/j E ... E ============================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1359) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError _______________________ TestExecute.test_basic_execution _______________________ code = 'from prefab_ui.components import Text\nview = Text("hello")' data = None sandbox = async def execute( code: str, *, data: dict[str, Any] | None = None, sandbox: Any | None = None, ) -> PrefabApp: """Execute Prefab Python code in a sandbox and render the result. The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the `components` tool to look up available components and their import paths. Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written: ```python from prefab_ui.components import Column, Heading, Text, Row, Badge from prefab_ui.app import PrefabApp with PrefabApp() as app: with Column(gap=4): Heading("Dashboard") with Row(gap=2): Text("Revenue: $1.2M") Badge("On Track", variant="success") ``` For interactive UIs, pass initial state as a dict and use `.rx` on stateful components for reactive bindings: ```python from prefab_ui.components import Column, Slider, Text from prefab_ui.app import PrefabApp with PrefabApp(state={"threshold": 50}) as app: with Column(gap=4): slider = Slider(value=50, min=0, max=100, name="threshold") Text(f"Threshold: {slider.rx}%") ``` `slider.rx` produces `{{ threshold }}`, a template expression that resolves against client-side state. Use `Rx("key")` directly, or apply pipe filters: `Rx("balance").currency()` produces `{{ balance | currency }}`. Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n). Charts live in `prefab_ui.components.charts`: ```python from prefab_ui.components.charts import BarChart, ChartSeries BarChart( data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}], series=[ChartSeries(data_key="rev", label="Revenue")], x_axis="month", ) ``` Values passed via `data` are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work. **Layout patterns:** - Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use `Card(css_class="p-6")`. - Use `Grid(columns=N, gap=4)` for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: `Grid(columns=[2, 1], gap=4)` gives a 2:1 ratio. - Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default. - Column and Row accept `gap` (Tailwind scale: 1-12), `align` (cross-axis), and `justify` (main-axis) as native props — prefer these over raw css_class for spacing. - Use `css_class="overflow-hidden"` on containers if chart or content edges should clip to the container boundary. Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call. """ if sandbox is None: from prefab_ui.sandbox import Sandbox sandbox = Sandbox() try: > wire = await sandbox.run(code, data=data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../test-env/lib/python3.14/site-packages/prefab_ui/generative.py:381: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:177: in run await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1387) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError The above exception was the direct cause of the following exception: self = sandbox = async def test_basic_execution(self, sandbox): > app = await execute( 'from prefab_ui.components import Text\nview = Text("hello")', sandbox=sandbox, ) tests/test_generative.py:282: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ code = 'from prefab_ui.components import Text\nview = Text("hello")' data = None sandbox = async def execute( code: str, *, data: dict[str, Any] | None = None, sandbox: Any | None = None, ) -> PrefabApp: """Execute Prefab Python code in a sandbox and render the result. The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the `components` tool to look up available components and their import paths. Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written: ```python from prefab_ui.components import Column, Heading, Text, Row, Badge from prefab_ui.app import PrefabApp with PrefabApp() as app: with Column(gap=4): Heading("Dashboard") with Row(gap=2): Text("Revenue: $1.2M") Badge("On Track", variant="success") ``` For interactive UIs, pass initial state as a dict and use `.rx` on stateful components for reactive bindings: ```python from prefab_ui.components import Column, Slider, Text from prefab_ui.app import PrefabApp with PrefabApp(state={"threshold": 50}) as app: with Column(gap=4): slider = Slider(value=50, min=0, max=100, name="threshold") Text(f"Threshold: {slider.rx}%") ``` `slider.rx` produces `{{ threshold }}`, a template expression that resolves against client-side state. Use `Rx("key")` directly, or apply pipe filters: `Rx("balance").currency()` produces `{{ balance | currency }}`. Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n). Charts live in `prefab_ui.components.charts`: ```python from prefab_ui.components.charts import BarChart, ChartSeries BarChart( data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}], series=[ChartSeries(data_key="rev", label="Revenue")], x_axis="month", ) ``` Values passed via `data` are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work. **Layout patterns:** - Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use `Card(css_class="p-6")`. - Use `Grid(columns=N, gap=4)` for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: `Grid(columns=[2, 1], gap=4)` gives a 2:1 ratio. - Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default. - Column and Row accept `gap` (Tailwind scale: 1-12), `align` (cross-axis), and `justify` (main-axis) as native props — prefer these over raw css_class for spacing. - Use `css_class="overflow-hidden"` on containers if chart or content edges should clip to the container boundary. Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call. """ if sandbox is None: from prefab_ui.sandbox import Sandbox sandbox = Sandbox() try: wire = await sandbox.run(code, data=data) except RuntimeError as exc: > raise ValueError(f"Code execution failed: {exc}") from exc E ValueError: Code execution failed: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1387) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/generative.py:383: ValueError __________________________ TestExecute.test_with_data __________________________ code = 'from prefab_ui.components import Text\nview = Text(f"Hello {name}")' data = {'name': 'Alice'} sandbox = async def execute( code: str, *, data: dict[str, Any] | None = None, sandbox: Any | None = None, ) -> PrefabApp: """Execute Prefab Python code in a sandbox and render the result. The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the `components` tool to look up available components and their import paths. Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written: ```python from prefab_ui.components import Column, Heading, Text, Row, Badge from prefab_ui.app import PrefabApp with PrefabApp() as app: with Column(gap=4): Heading("Dashboard") with Row(gap=2): Text("Revenue: $1.2M") Badge("On Track", variant="success") ``` For interactive UIs, pass initial state as a dict and use `.rx` on stateful components for reactive bindings: ```python from prefab_ui.components import Column, Slider, Text from prefab_ui.app import PrefabApp with PrefabApp(state={"threshold": 50}) as app: with Column(gap=4): slider = Slider(value=50, min=0, max=100, name="threshold") Text(f"Threshold: {slider.rx}%") ``` `slider.rx` produces `{{ threshold }}`, a template expression that resolves against client-side state. Use `Rx("key")` directly, or apply pipe filters: `Rx("balance").currency()` produces `{{ balance | currency }}`. Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n). Charts live in `prefab_ui.components.charts`: ```python from prefab_ui.components.charts import BarChart, ChartSeries BarChart( data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}], series=[ChartSeries(data_key="rev", label="Revenue")], x_axis="month", ) ``` Values passed via `data` are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work. **Layout patterns:** - Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use `Card(css_class="p-6")`. - Use `Grid(columns=N, gap=4)` for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: `Grid(columns=[2, 1], gap=4)` gives a 2:1 ratio. - Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default. - Column and Row accept `gap` (Tailwind scale: 1-12), `align` (cross-axis), and `justify` (main-axis) as native props — prefer these over raw css_class for spacing. - Use `css_class="overflow-hidden"` on containers if chart or content edges should clip to the container boundary. Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call. """ if sandbox is None: from prefab_ui.sandbox import Sandbox sandbox = Sandbox() try: > wire = await sandbox.run(code, data=data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../test-env/lib/python3.14/site-packages/prefab_ui/generative.py:381: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:177: in run await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1401) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError The above exception was the direct cause of the following exception: self = sandbox = async def test_with_data(self, sandbox): > app = await execute( 'from prefab_ui.components import Text\nview = Text(f"Hello {name}")', data={"name": "Alice"}, sandbox=sandbox, ) tests/test_generative.py:290: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ code = 'from prefab_ui.components import Text\nview = Text(f"Hello {name}")' data = {'name': 'Alice'} sandbox = async def execute( code: str, *, data: dict[str, Any] | None = None, sandbox: Any | None = None, ) -> PrefabApp: """Execute Prefab Python code in a sandbox and render the result. The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the `components` tool to look up available components and their import paths. Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written: ```python from prefab_ui.components import Column, Heading, Text, Row, Badge from prefab_ui.app import PrefabApp with PrefabApp() as app: with Column(gap=4): Heading("Dashboard") with Row(gap=2): Text("Revenue: $1.2M") Badge("On Track", variant="success") ``` For interactive UIs, pass initial state as a dict and use `.rx` on stateful components for reactive bindings: ```python from prefab_ui.components import Column, Slider, Text from prefab_ui.app import PrefabApp with PrefabApp(state={"threshold": 50}) as app: with Column(gap=4): slider = Slider(value=50, min=0, max=100, name="threshold") Text(f"Threshold: {slider.rx}%") ``` `slider.rx` produces `{{ threshold }}`, a template expression that resolves against client-side state. Use `Rx("key")` directly, or apply pipe filters: `Rx("balance").currency()` produces `{{ balance | currency }}`. Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n). Charts live in `prefab_ui.components.charts`: ```python from prefab_ui.components.charts import BarChart, ChartSeries BarChart( data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}], series=[ChartSeries(data_key="rev", label="Revenue")], x_axis="month", ) ``` Values passed via `data` are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work. **Layout patterns:** - Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use `Card(css_class="p-6")`. - Use `Grid(columns=N, gap=4)` for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: `Grid(columns=[2, 1], gap=4)` gives a 2:1 ratio. - Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default. - Column and Row accept `gap` (Tailwind scale: 1-12), `align` (cross-axis), and `justify` (main-axis) as native props — prefer these over raw css_class for spacing. - Use `css_class="overflow-hidden"` on containers if chart or content edges should clip to the container boundary. Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call. """ if sandbox is None: from prefab_ui.sandbox import Sandbox sandbox = Sandbox() try: wire = await sandbox.run(code, data=data) except RuntimeError as exc: > raise ValueError(f"Code execution failed: {exc}") from exc E ValueError: Code execution failed: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1401) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/generative.py:383: ValueError _____________________ TestExecute.test_returns_prefab_app ______________________ code = 'from prefab_ui.components import Text\nview = Text("hi")', data = None sandbox = async def execute( code: str, *, data: dict[str, Any] | None = None, sandbox: Any | None = None, ) -> PrefabApp: """Execute Prefab Python code in a sandbox and render the result. The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the `components` tool to look up available components and their import paths. Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written: ```python from prefab_ui.components import Column, Heading, Text, Row, Badge from prefab_ui.app import PrefabApp with PrefabApp() as app: with Column(gap=4): Heading("Dashboard") with Row(gap=2): Text("Revenue: $1.2M") Badge("On Track", variant="success") ``` For interactive UIs, pass initial state as a dict and use `.rx` on stateful components for reactive bindings: ```python from prefab_ui.components import Column, Slider, Text from prefab_ui.app import PrefabApp with PrefabApp(state={"threshold": 50}) as app: with Column(gap=4): slider = Slider(value=50, min=0, max=100, name="threshold") Text(f"Threshold: {slider.rx}%") ``` `slider.rx` produces `{{ threshold }}`, a template expression that resolves against client-side state. Use `Rx("key")` directly, or apply pipe filters: `Rx("balance").currency()` produces `{{ balance | currency }}`. Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n). Charts live in `prefab_ui.components.charts`: ```python from prefab_ui.components.charts import BarChart, ChartSeries BarChart( data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}], series=[ChartSeries(data_key="rev", label="Revenue")], x_axis="month", ) ``` Values passed via `data` are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work. **Layout patterns:** - Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use `Card(css_class="p-6")`. - Use `Grid(columns=N, gap=4)` for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: `Grid(columns=[2, 1], gap=4)` gives a 2:1 ratio. - Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default. - Column and Row accept `gap` (Tailwind scale: 1-12), `align` (cross-axis), and `justify` (main-axis) as native props — prefer these over raw css_class for spacing. - Use `css_class="overflow-hidden"` on containers if chart or content edges should clip to the container boundary. Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call. """ if sandbox is None: from prefab_ui.sandbox import Sandbox sandbox = Sandbox() try: > wire = await sandbox.run(code, data=data) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ../test-env/lib/python3.14/site-packages/prefab_ui/generative.py:381: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:177: in run await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1432) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError The above exception was the direct cause of the following exception: self = sandbox = async def test_returns_prefab_app(self, sandbox): > app = await execute( 'from prefab_ui.components import Text\nview = Text("hi")', sandbox=sandbox, ) tests/test_generative.py:303: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ code = 'from prefab_ui.components import Text\nview = Text("hi")', data = None sandbox = async def execute( code: str, *, data: dict[str, Any] | None = None, sandbox: Any | None = None, ) -> PrefabApp: """Execute Prefab Python code in a sandbox and render the result. The code runs in a Pyodide WASM sandbox with full Python support. Import everything you use. Use the `components` tool to look up available components and their import paths. Always use PrefabApp as the outermost context manager — this enables streaming so the UI renders progressively as code is written: ```python from prefab_ui.components import Column, Heading, Text, Row, Badge from prefab_ui.app import PrefabApp with PrefabApp() as app: with Column(gap=4): Heading("Dashboard") with Row(gap=2): Text("Revenue: $1.2M") Badge("On Track", variant="success") ``` For interactive UIs, pass initial state as a dict and use `.rx` on stateful components for reactive bindings: ```python from prefab_ui.components import Column, Slider, Text from prefab_ui.app import PrefabApp with PrefabApp(state={"threshold": 50}) as app: with Column(gap=4): slider = Slider(value=50, min=0, max=100, name="threshold") Text(f"Threshold: {slider.rx}%") ``` `slider.rx` produces `{{ threshold }}`, a template expression that resolves against client-side state. Use `Rx("key")` directly, or apply pipe filters: `Rx("balance").currency()` produces `{{ balance | currency }}`. Available pipes: upper, lower, currency, length, json, round(n), default(val), truncate(n). Charts live in `prefab_ui.components.charts`: ```python from prefab_ui.components.charts import BarChart, ChartSeries BarChart( data=[{"month": "Jan", "rev": 100}, {"month": "Feb", "rev": 200}], series=[ChartSeries(data_key="rev", label="Revenue")], x_axis="month", ) ``` Values passed via `data` are available as global variables in the code. Python features like loops, f-strings, and comprehensions all work. **Layout patterns:** - Card sub-components (CardHeader, CardContent, CardFooter) have built-in padding. Don't add extra padding to them. For a simple card without sub-components, use `Card(css_class="p-6")`. - Use `Grid(columns=N, gap=4)` for equal-width cards or panels. Grid handles sizing automatically — no flex classes needed. For unequal widths, pass a list: `Grid(columns=[2, 1], gap=4)` gives a 2:1 ratio. - Row is for inline elements (badges, icons + text, buttons). Prefer Grid when children should have equal or proportional widths. Row does not wrap by default. - Column and Row accept `gap` (Tailwind scale: 1-12), `align` (cross-axis), and `justify` (main-axis) as native props — prefer these over raw css_class for spacing. - Use `css_class="overflow-hidden"` on containers if chart or content edges should clip to the container boundary. Args: code: Python code that builds a Prefab component tree. data: Values injected as variables in the sandbox namespace. sandbox: A Sandbox instance. If not provided, a new one is created on each call. """ if sandbox is None: from prefab_ui.sandbox import Sandbox sandbox = Sandbox() try: wire = await sandbox.run(code, data=data) except RuntimeError as exc: > raise ValueError(f"Code execution failed: {exc}") from exc E ValueError: Code execution failed: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (1432) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/generative.py:383: ValueError ________________________ TestLifecycle.test_lazy_start _________________________ self = async def test_lazy_start(self): """Sandbox starts lazily on first run() without context manager.""" sandbox = Sandbox() try: > result = await sandbox.run(""" from prefab_ui.components import Column, Text with Column() as view: Text("lazy") """) tests/test_sandbox.py:372: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:177: in run await self._start() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = async def _start(self) -> None: deno = shutil.which("deno") if deno is None: raise RuntimeError( "Deno is required for the Prefab sandbox. " "Install it from https://deno.land" ) loop = asyncio.get_event_loop() env = { **os.environ, "DENO_V8_FLAGS": "--max-old-space-size=4096", "DENO_UNSTABLE_DETECT_CJS": "1", } starting = loop.run_in_executor( None, lambda: subprocess.Popen( [ deno, "run", "--no-config", f"--lock={DENO_LOCK}", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", str(RUNNER_JS), str(PREFAB_SRC), ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, ), ) try: proc = await asyncio.shield(starting) except asyncio.CancelledError: # Popen may still be running in its executor thread. Keep its # result available so the process can be reclaimed when it returns. def discard_startup( future: asyncio.Future[subprocess.Popen[bytes]], ) -> None: if not future.cancelled() and future.exception() is None: self._stop_process(future.result()) starting.add_done_callback(discard_startup) raise try: # Wait for the runner to signal readiness, collecting stderr assert proc.stderr is not None proc_stderr = proc.stderr stderr_lines: list[str] = [] while True: line = await loop.run_in_executor(None, proc_stderr.readline) if not line and proc.poll() is not None: err = "\n".join(stderr_lines) if len(err) > 2000: err = f"{err[:1000]}\n...\n{err[-1000:]}" > raise RuntimeError(f"Pyodide sandbox failed to start:\n{err}") E RuntimeError: Pyodide sandbox failed to start: E E ============================================================ E Deno has panicked. This is a bug in Deno. Please report this E at https://github.com/denoland/deno/issues/new. E If you can reliably reproduce this panic, include the E reproduction steps and re-run with the RUST_BACKTRACE=1 env E var set and include the backtrace in your report. E E Platform: linux riscv64 E Version: 2.9.8 E Args: ["/usr/bin/deno", "run", "--no-config", "--lock=/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/deno.lock", "--frozen", "--unstable-detect-cjs", "--no-prompt", "--allow-read", "--allow-write", "--allow-net=cdn.jsdelivr.net:443", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui/sandbox/runner.js", "/build/python-prefab-ui/src/test-env/lib/python3.14/site-packages/prefab_ui"] E E E thread '' (2139) panicked at cli/lib.rs:701:5: E Fatal error in :0: Check failed: trampoline_.start() > pos. E note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ../test-env/lib/python3.14/site-packages/prefab_ui/sandbox/_pyodide.py:121: RuntimeError =========================== short test summary info ============================ FAILED tests/sandbox/test_pyodide.py::test_print_does_not_desynchronize_results[print("debug")] FAILED tests/sandbox/test_pyodide.py::test_print_does_not_desynchronize_results[print({'result': {'view': {'content': 'printed'}}})] FAILED tests/sandbox/test_pyodide.py::test_print_does_not_desynchronize_results[print("x" * 100_000)] FAILED tests/sandbox/test_pyodide.py::test_print_does_not_desynchronize_results[import sys; print("x" * 100_000, file=sys.stderr)] FAILED tests/sandbox/test_pyodide.py::test_startup_uses_packaged_lock_from_another_directory FAILED tests/sandbox/test_pyodide.py::test_cold_start_keeps_download_logs_out_of_responses FAILED tests/test_generative.py::TestExecute::test_basic_execution - ValueErr... FAILED tests/test_generative.py::TestExecute::test_with_data - ValueError: Co... FAILED tests/test_generative.py::TestExecute::test_returns_prefab_app - Value... FAILED tests/test_sandbox.py::TestLifecycle::test_lazy_start - RuntimeError: ... =========== 10 failed, 1454 passed, 25 skipped in 1985.76s (0:33:05) =========== ==> ERROR:(B A failure occurred in check().(B  Aborting...(B ]3008;end=f7b92ec6038849cd9063175298ce42e9\[!p]104\[?7h]3008;end=3ab5bb8dff6f4a86b092cb5b14d64458\==> ERROR:(B Build failed, check /var/lib/archbuild/extra-riscv64/felix-0/build(B [?12l[?25h[?12l[?25h]3008;end=a349b8677c7e4ec8b7a050d769cbce73\[?12l[?25hreceiving incremental file list python-prefab-ui-0.21.1-1-riscv64-build.log python-prefab-ui-0.21.1-1-riscv64-check.log sent 62 bytes received 8,053 bytes 3,246.00 bytes/sec total size is 88,477 speedup is 10.90