6 Commits

Author SHA1 Message Date
kk0t9 35cd6b7230 fix(v0.3): E2E power-safe — пере-bind machine-id + reset-failed (start-limit)
Полный чистый `just vm-reset && just e2e` (PRE→reboot→POST) впервые прогнан после
добавления power-safe-блока — вскрыл два латентных шва харнесса (FSM/сервис-код цел):

1. start-limit-hit: блок намеренно рестартит shturman-power N+ раз за <10s →
   systemd StartLimitBurst (5/10s) → power в failed, имя ru.shturman.Power теряется,
   блок abort не доезжает. Фикс: reset-failed перед намеренными рестартами (как при
   реальном reboot); ждать active power, не только settings.

2. machine-id залипал на нижнем rootfs-значении: цикл/power-cut делает
   `umount /etc/machine-id`, но `systemctl start shturman.target` НЕ пере-bind-ит —
   shturman-machineid это oneshot RemainAfterExit (уже active) → ExecStart не
   перезапускается. POST-чек стабильности machine-id (§9.3.4) падал после reboot.
   Фикс: `systemctl restart shturman-machineid` после remount (форсит пере-bind).

E2E OK  с нуля (vm-reset → PRE → reboot → POST); регресс v0.1/v0.2 цел.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-25 00:17:23 +03:00
kk0t9 93382d2de6 fix(v0.3): E2E power-safe-блок по реальным ошибкам Lima
- machineid bind (/data/state/machine-id→/etc/machine-id) держит /data busy →
  снимаем bind перед umount; remount через systemctl start (не mount /data — нет fstab).
- restart power/settings после install (повторный just run: иначе крутится старый
  бинарь, start=no-op) + restart power в начале power-safe-блока (чистый FSM Running).
- §3 oneshot-чек: firstboot/machineid валидны в active|inactive (отработал ИЛИ корректно
  пропущен Condition'ом на повторном boot); реальный сбой = failed.
- stage2.target тянет savetime.timer (WantedBy без enable не срабатывал).
Блок power-safe зелёный: N=3 цикла /data цел, abort→ShutdownAborted, power-cut fsck-clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 23:33:36 +03:00
kk0t9 586ba29821 feat(v0.3): lima/E2E блок power-safe (N циклов + abort + power-cut)
P7.4: lima/run.sh раскладывают watchdog (system.conf.d) + savetime.service/.timer.
run.sh блок power-safe: N=3 цикла зажигания (ACC-off→ShutdownImminent→stop stage1→
umount/remount /data→restart; маркер+счётчик целы), abort до PONR (re-power→
ShutdownAborted, /data RW), power-cut-сим (SIGKILL до fsync→fsck clean, night present),
watchdog/savetime конфиг. shellcheck чист.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 23:20:33 +03:00
kk0t9 2442f091d2 feat(v0.2): splash-frame + lima/E2E раскладка Stage 0/1/2
P6.4: just splash-frame; lima yaml ставит stage0/1/2.target + tmpfiles
(splash/warmup ловит glob *.service). run.sh: install splash-бинаря, раскладка
новых юнитов+tmpfiles, блок «Stage 0/1/2 разделены» (3 таргета reached, splash.png
до frame.png, stage2.ready после, systemd-analyze лог). Убран restart shell
(ломал бы порядок warmup-после-кадра — фазовый старт рендерит всё по порядку).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 20:12:02 +03:00
kk0t9 9b87751ab8 feat(v0.6): Lima E2E зелёный с нуля + shell software-render screenshot
План 5 ч.2: поднял Lima-VM и довёл сквозной E2E до зелёного из чистого yaml
(just vm-reset && just e2e — exit 0). Приёмка §9.4 (v0.1 + v0.6 + шагающий скелет).

Shell (lib+bin split):
- режим --screenshot <path>: headless software-render первого кадра в PNG
  (Slint software-renderer, без дисплея/композитора, §6); TDD-тест «кадр не
  пустой + тема отражена», зелёный и на dev-Mac, и в VM (Linux).
- shturman-shell.service → oneshot software-render → /run/shturman/frame.png
  (RemainAfterExit → is-active детерминированно, без хрупкого weston;
  живой weston-shell — v0.5). just shell-frame — инспекция кадра.

E2E (tests/e2e/run.sh, двухфазно pre→reboot→post):
- /data+power-safe опции, volatile-tmpfs, first-boot идемпотентность, per-unit
  active, имена на шине + GetPowerState, fake-ACC SetAcc→AccChanged, первый кадр
  PNG, base-бюджеты (journald volatile / zram / oomd / fake-hwclock→/data /
  eMMC-прокси), персист Settings + machine-id every-boot bind после reboot.

Провижининг (lima/shturman.yaml) — правки по реальным ошибкам Lima:
- build-deps Slint/winit на Linux (libfontconfig1-dev/libxkbcommon-dev/libwayland-dev);
- linux-modules-extra (zram/vcan не в vz-ядре); systemd-oomd; rm стокового
  /etc/fake-hwclock.data (A11); VM-локальный CARGO_TARGET_DIR.

Док-синхронизация (спека §13/§8.1/§7.5 + CLAUDE.md): швы реализации, eMMC-порог
T=4096 сект, fake-hwclock masked-в-Lima, dev-mock policy не нужен.

Перф-вердикт — на RK3588 (в VM — функционально, performance §2). just ci зелёный.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 17:14:31 +03:00
kk0t9 bc2c0b8cfd feat(harness): systemd-юниты + Lima-конфиг + E2E-харнесс (файлы)
systemd/ (target/data.mount/firstboot/machineid/power/settings/shell + dbus-policy + journald/zram/oomd):
ordering data.mount->firstboot->machineid->dbus->power+settings->shell; Requires+After firstboot; OOMScoreAdjust.
lima/shturman.yaml (vz, Ubuntu ARM64, /data loopback, провижининг). tests/e2e/run.sh (каркас приёмки).
justfile: vm-up/down/reset/shell, run, e2e, shell-frame. Валидация — часть 2 (поднятие Lima).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Alexander <akotenev2003@gmail.com>
2026-06-24 13:26:45 +03:00