Sandbox i promocja#
Pipeline do bezpiecznego pisania kodu Lua przez agentów AI. Drafty są pisane do izolowanego workspace, testowane w sandboxie (bez efektów ubocznych), a potem promowane do produkcji z automatycznym backupem.
Pipeline#
graph LR
A[draft_write] --> B[draft_validate]
B --> C[draft_test]
C --> D[draft_promote]
A -.- A1["workspace<br/>(drafts/)"]
B -.- B1["sprawdź<br/>składnię"]
C -.- C1["sandbox<br/>(izolacja)"]
D -.- D1["produkcja<br/>(backup + reload)"]- Write - AI pisze draft do
modules/*.luaw workspace - Validate - sprawdzenie składni Lua + blocklist niebezpiecznych wywołań
- Test - uruchomienie w izolowanym silniku Lua (bez realnych efektów ubocznych)
- Promote - zamiana pliku produkcyjnego (z backupem) + automatyczny reload runtime
Narzędzia sandbox#
vclu_draft_write#
Zapisuje lub nadpisuje plik draft w workspace. Tylko ścieżki modules/*.lua.
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
path | string | tak | Ścieżka, np. modules/biuro_auto.lua |
content | string | tak | Kod źródłowy Lua |
{ "env": "workspace", "ok": true, "path": "modules/biuro_auto.lua", "size": 850 }vclu_draft_read#
Odczytuje zawartość draftu.
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
path | string | tak | Ścieżka draftu |
vclu_draft_list#
Lista wszystkich draftów w workspace. Brak parametrów.
{ "env": "workspace", "drafts": [{ "path": "modules/biuro_auto.lua", "size": 850 }], "count": 1 }vclu_draft_delete#
Usuwa draft z workspace.
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
path | string | tak | Ścieżka draftu do usunięcia |
vclu_draft_validate#
Sprawdza składnię Lua i listę zabronionych wywołań (blocklist).
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
path | string | tak | Ścieżka draftu |
{
"env": "workspace",
"path": "modules/biuro_auto.lua",
"report": {
"valid": true,
"errors": [],
"warnings": []
}
}vclu_draft_test#
Uruchamia draft(y) w izolowanym sandboxie. Sandbox to osobny silnik Lua - żadne zmiany stanu nie trafiają do produkcji, MQTT, HomeKit ani GPIO.
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
path | string/array | tak | Draft(y) do przetestowania |
inject_events | array | nie | Zdarzenia do wstrzyknięcia w EventBus po załadowaniu |
Każdy element inject_events:
| Pole | Typ | Opis |
|---|---|---|
name | string | Nazwa zdarzenia: state_changed, mqtt.message itp. |
data | object | Payload zdarzenia |
Wynik testu#
{
"env": "sandbox",
"success": true,
"state_changes": [
{ "path": "CLU220000592.DOU3328", "old_value": 0, "new_value": 1 }
],
"blocked_calls": [
{ "type": "mqtt.publish", "args": { "topic": "grenton/biuro_led/state", "payload": "1" } }
],
"logs": ["[BIURO_AUTO] Lights turned on"],
"errors": [],
"duration_ms": 45
}state_changes- zmiany stanu urządzeń (symulowane, nie realne)blocked_calls- wywołania MQTT, GPIO, HTTP itp. zablokowane przez sandboxerrors- błędy Lua wykryte podczas uruchomienia
Test w sandboxie nie widzi plików produkcyjnych - testuje tylko drafty. Jeśli moduł wymaga innego modułu, oba muszą być w drafcie.
vclu_draft_promote#
Promuje draft(y) do produkcji. Tworzy backup istniejącego pliku, podmienia go na draft i automatycznie przeładowuje runtime Lua.
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
path | string/array/“all” | nie | Plik(i) do promocji. Pominięcie = wszystkie drafty |
Atomowość#
Promocja wielu plików jest atomowa - jeśli jeden plik się nie powiedzie, wszystkie dotychczasowe zmiany są cofane (rollback).
{
"ok": true,
"paths": ["modules/biuro_auto.lua", "modules/init.lua"],
"backups": ["modules/biuro_auto.lua.bak.20260302_183000", "modules/init.lua.bak.20260302_183000"]
}Automatyczny reload#
Po promocji vCLU automatycznie przeładowuje runtime Lua - nowy kod działa natychmiast, bez restartu serwera.
vclu_diff#
Porównuje draft z plikiem produkcyjnym (unified diff).
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
path | string | tak | Ścieżka draftu do porównania |
{
"env": "workspace",
"path": "modules/init.lua",
"diff": "--- a/modules/init.lua (production)\n+++ b/modules/init.lua (draft)\n@@ -1,2 +1,3 @@\n require(\"tasmota_biurko\")\n+require(\"biuro_auto\")\n print(\"[MODULES] User modules initialized\")"
}vclu_audit_log#
Historia operacji Layer 2 (zapis draftów, walidacje, testy, promocje). Log jest persystowany na dysku w formacie JSONL - wpisy przeżywają restart serwera.
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
limit | number | nie | Liczba wpisów (domyślnie: 50, max: 200) |
Pola wpisu#
| Pole | Opis |
|---|---|
time | Czas operacji |
tool | Narzędzie: draft_write, draft_test, draft_validate, promote, draft_delete |
path | Plik którego dotyczy operacja |
success | Czy operacja się powiodła |
actor | Kto wykonał operację - nazwa bota AI lub "human" |
session | Identyfikator sesji MCP (grupuje powiązane operacje jednego bota) |
details | Dodatkowe informacje (np. liczba promowanych plików) |
Persystencja#
Audit log jest zapisywany na dysku jako pliki JSONL z automatyczną rotacją:
audit.jsonl- aktywny plik (append-only, zero overhead w runtime)audit.1.jsonl,audit.2.jsonl- starsze rotacje- Rotacja gdy plik przekroczy 1000 wpisów
- Łącznie do 3000 wpisów historii (~600 KB)
Historia jest też dostępna wizualnie w Edytorze Lua - tab History z widokiem timeline i pipeline per plik.
Pamięć agenta#
vclu_context_save#
Dopisuje notatki do trwałej pamięci agenta. Używany do zapisywania obserwacji, odkrytych ograniczeń i TODOs na kolejne sesje.
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
notes | string | tak | Notatki w markdown |
vclu_context_read#
Odczytuje notatki z poprzednich sesji. Brak parametrów.
Rate limits#
| Operacja | Limit |
|---|---|
Sandbox test (vclu_draft_test) | 30 uruchomień / minutę |
Promocja (vclu_draft_promote) | 10 promocji / godzinę |
Bezpieczeństwo#
- Drafty mogą być pisane tylko do
modules/*.lua- nigdy doa/om.lua,a/user.luaania/main.lua - Walidacja blokuje niebezpieczne wywołania (np.
os.execute,io.open) - Sandbox jest izolowany - nie ma dostępu do sieci, GPIO ani MQTT
- Promocja tworzy backup z timestampem i może być cofnięta (rollback) - szczegóły w sekcji Kopie zapasowe
- Po promocji przez MCP uruchamiany jest watchdog - auto-rollback jeśli nowy kod generuje >3 błędy w ciągu 15s
- Audit log rejestruje każdą operację z nazwą bota i aktorem (bot vs człowiek)
- Historia persystowana na dysku (JSONL) - przeżywa restart serwera
Następny krok#
Edytor Lua - wbudowany edytor z zarządzaniem draftami i historią zmian