From 977a894cc8c33a7ca4cffd997348db90f121b7e5 Mon Sep 17 00:00:00 2001 From: lachtan Date: Sun, 20 Sep 2026 20:02:42 +0200 Subject: [PATCH] nanobot: 2026-09-20 20:02:41 --- cron/jobs.json | 262 +++--------------- memory/.cursor | 2 +- memory/history.jsonl | 1 + projects/ai/memory.md | 38 +++ projects/devops/memory.md | 11 + projects/devops/state.md | 4 +- .../life/artifacts/.fyzio-cviky-kycele.md.swp | Bin 12288 -> 0 bytes 7 files changed, 86 insertions(+), 232 deletions(-) delete mode 100644 projects/life/artifacts/.fyzio-cviky-kycele.md.swp diff --git a/cron/jobs.json b/cron/jobs.json index 0e27c4b..3c5f999 100644 --- a/cron/jobs.json +++ b/cron/jobs.json @@ -149,146 +149,20 @@ "originMetadata": {} }, "state": { - "nextRunAtMs": 1789902137794, - "lastRunAtMs": 1789894937775, + "nextRunAtMs": 1789929218930, + "lastRunAtMs": 1789922018911, "lastStatus": "ok", "lastError": null, "runHistory": [ { - "runAtMs": 1789758137372, + "runAtMs": 1789914696411, "status": "ok", - "durationMs": 19, + "durationMs": 122499, "error": null, "runId": null }, { - "runAtMs": 1789765337393, - "status": "ok", - "durationMs": 18, - "error": null, - "runId": null - }, - { - "runAtMs": 1789772537413, - "status": "ok", - "durationMs": 24, - "error": null, - "runId": null - }, - { - "runAtMs": 1789779737438, - "status": "ok", - "durationMs": 20, - "error": null, - "runId": null - }, - { - "runAtMs": 1789786937459, - "status": "ok", - "durationMs": 20, - "error": null, - "runId": null - }, - { - "runAtMs": 1789794137480, - "status": "ok", - "durationMs": 19, - "error": null, - "runId": null - }, - { - "runAtMs": 1789801337501, - "status": "ok", - "durationMs": 19, - "error": null, - "runId": null - }, - { - "runAtMs": 1789808537521, - "status": "ok", - "durationMs": 20, - "error": null, - "runId": null - }, - { - "runAtMs": 1789815737542, - "status": "ok", - "durationMs": 19, - "error": null, - "runId": null - }, - { - "runAtMs": 1789822937564, - "status": "ok", - "durationMs": 20, - "error": null, - "runId": null - }, - { - "runAtMs": 1789830137585, - "status": "ok", - "durationMs": 19, - "error": null, - "runId": null - }, - { - "runAtMs": 1789837337605, - "status": "ok", - "durationMs": 23, - "error": null, - "runId": null - }, - { - "runAtMs": 1789844537629, - "status": "ok", - "durationMs": 19, - "error": null, - "runId": null - }, - { - "runAtMs": 1789851737649, - "status": "ok", - "durationMs": 20, - "error": null, - "runId": null - }, - { - "runAtMs": 1789858937670, - "status": "ok", - "durationMs": 23, - "error": null, - "runId": null - }, - { - "runAtMs": 1789866137695, - "status": "ok", - "durationMs": 18, - "error": null, - "runId": null - }, - { - "runAtMs": 1789873337715, - "status": "ok", - "durationMs": 19, - "error": null, - "runId": null - }, - { - "runAtMs": 1789880537736, - "status": "ok", - "durationMs": 19, - "error": null, - "runId": null - }, - { - "runAtMs": 1789887737756, - "status": "ok", - "durationMs": 18, - "error": null, - "runId": null - }, - { - "runAtMs": 1789894937775, + "runAtMs": 1789922018911, "status": "ok", "durationMs": 19, "error": null, @@ -296,8 +170,8 @@ } ] }, - "createdAtMs": 1776109113789, - "updatedAtMs": 1789894937794, + "createdAtMs": 1789907496400, + "updatedAtMs": 1789922018930, "deleteAfterRun": false }, { @@ -324,155 +198,85 @@ "originMetadata": {} }, "state": { - "nextRunAtMs": 1789900337802, - "lastRunAtMs": 1789898537802, + "nextRunAtMs": 1789927418939, + "lastRunAtMs": 1789925618938, "lastStatus": "ok", "lastError": null, "runHistory": [ { - "runAtMs": 1789864337702, + "runAtMs": 1789909296411, "status": "ok", "durationMs": 0, "error": null, "runId": null }, { - "runAtMs": 1789866137717, + "runAtMs": 1789911096413, "status": "ok", "durationMs": 0, "error": null, "runId": null }, { - "runAtMs": 1789867937718, + "runAtMs": 1789912896414, "status": "ok", "durationMs": 1, "error": null, "runId": null }, { - "runAtMs": 1789869737721, + "runAtMs": 1789914818914, "status": "ok", "durationMs": 0, "error": null, "runId": null }, { - "runAtMs": 1789871537722, + "runAtMs": 1789916618916, + "status": "ok", + "durationMs": 0, + "error": null, + "runId": null + }, + { + "runAtMs": 1789918418917, "status": "ok", "durationMs": 1, "error": null, "runId": null }, { - "runAtMs": 1789873337736, + "runAtMs": 1789920218920, "status": "ok", "durationMs": 0, "error": null, "runId": null }, { - "runAtMs": 1789875137737, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789876937738, + "runAtMs": 1789922018934, "status": "ok", "durationMs": 1, "error": null, "runId": null }, { - "runAtMs": 1789878737740, + "runAtMs": 1789923818936, + "status": "ok", + "durationMs": 0, + "error": null, + "runId": null + }, + { + "runAtMs": 1789925618938, "status": "ok", "durationMs": 1, "error": null, "runId": null - }, - { - "runAtMs": 1789880537758, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789882337760, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789884137768, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789885937770, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789887737778, - "status": "ok", - "durationMs": 1, - "error": null, - "runId": null - }, - { - "runAtMs": 1789889537780, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789891337781, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789893137783, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null - }, - { - "runAtMs": 1789894937796, - "status": "ok", - "durationMs": 1, - "error": null, - "runId": null - }, - { - "runAtMs": 1789896737798, - "status": "ok", - "durationMs": 1, - "error": null, - "runId": null - }, - { - "runAtMs": 1789898537802, - "status": "ok", - "durationMs": 0, - "error": null, - "runId": null } ] }, - "createdAtMs": 1776109113795, - "updatedAtMs": 1789898537802, + "createdAtMs": 1789907496402, + "updatedAtMs": 1789925618939, "deleteAfterRun": false } ] diff --git a/memory/.cursor b/memory/.cursor index a71e551..bc56e76 100644 --- a/memory/.cursor +++ b/memory/.cursor @@ -1 +1 @@ -430 \ No newline at end of file +431 \ No newline at end of file diff --git a/memory/history.jsonl b/memory/history.jsonl index 90fbe12..d6a1a89 100644 --- a/memory/history.jsonl +++ b/memory/history.jsonl @@ -428,3 +428,4 @@ {"cursor": 428, "timestamp": "2026-09-14 08:44", "content": "- [durable] llama.cpp server and ollama produce fundamentally different embeddings for `qwen3-embedding:0.6b` even on identical single-token input (`cat` → cosine 0.36); parity by reusing the ollama blob is not achievable — the forward pass itself yields different vectors.\n- [durable] Both engines read the same blob `sha256-06507c7b…` (Q8_0, `general.file_type=7`, `pooling_type=3`), so quantization was ruled out as the cause; suspected different GGUF build/tokenizer handling in ollama's vendored llama.cpp.\n- [durable] `tmp/queue.py` in the nanobot workspace shadows the stdlib `queue` module and breaks Python scripts importing `requests`/`urllib3` — run scripts from a subdirectory (e.g. `tmp/embed-test/`) instead.\n- [durable] ollama 0.34.0 at `nvidia.hell:11434` has no `/api/tokenize` endpoint; `/api/embed` options `raw`, `truncate`, `num_ctx` (512/1024/8192) have zero effect on output vectors.\n- [durable] llama.cpp server is fully deterministic (5× same input → cosine 1.000000) and `--pooling last` is the best-fitting pooling for qwen3-embedding (mean pooling measured worse: 0.50–0.71 vs 0.87–0.93 cosine).\n- [durable] Reference: GitHub issue ollama/ollama#14121 documents the same qwen3-embedding mismatch; note llama-cpp-python `n_batch=512` chunk-splitting corrupts embeddings for inputs >512 tokens (not the cause here, inputs were ~79 tokens).\n- [ephemeral] Decision pending: three paths offered for the wiki embedding index — (1) pull the same GGUF directly in llama.cpp and retest parity, (2) reindex wiki with llama.cpp server (port 8081, `--pooling last`) as the new source of truth (assistant's recommendation), (3) stay on ollama for embeddings (loses the goal of isolating embeddings from ollama's load-path instability). User has not yet chosen.\n- [skip] Context: this debugging is part of an ongoing embed-parity test effort to migrate embeddings away from ollama's unstable load path.", "session_key": "websocket:0d81522a-4774-490a-a2c3-10d72dcd4680"} {"cursor": 429, "timestamp": "2026-09-14 21:21", "content": "- [permanent] User communicates in Czech.\n- [skip] User has noted recipes for Karak (Middle Eastern milk tea) and Teh Tarik (Malaysian pulled tea) in their `caj/` directory.\n- [skip] Karak recipe serves 2 cups; ingredient amounts for ginger, cardamom, black tea, and cane sugar are unspecified and marked for future refinement.\n- [skip] Teh Tarik recipe serves 2; uses 700–800 ml water, 2 tbsp tea (steep 6 min), 2 tbsp condensed milk + 2 tbsp condensed milk/coffee creamer.\n- [skip] User's `recepty/` directory is currently empty.", "session_key": "telegram:8826147089"} {"cursor": 430, "timestamp": "2026-09-15 03:33", "content": "- [durable] The exec deny-pattern filter blocks `rm -rf`, `rm -r`, wildcard and multi-file `rm` in tmp/ — the working cleanup shape is an explicitly enumerated `rm` of individual files followed by `rmdir`; proposed an AGENTS.md patch documenting this\n- [durable] The exec safety guard blocks `curl` to `nvidia.hell:11434` as \"internal/private URL detected\"; workaround is writing a uv Python script (requests.post) to tmp/ and running it — block was routed around without diagnosis, flagged as recurring pattern\n- [correction] User corrected store routing: project-scoped decisions (e.g. the llama.cpp reindex decision) belong in `projects//memory.md`, not `keep.md` — keep.md is only for global user facts; entry was reverted and re-filed into projects/devops\n- [durable] llama.cpp stable releases (v0.4.0) ship no Linux CUDA binaries — prebuilt CUDA builds are distributed via the official installer `curl -LsSf https://llama.app/install.sh | sh` (llama.app, probing CUDA first on Linux)\n- [durable] Embedding parity between ollama and llama.cpp is unachievable for qwen3-embedding:0.6b even with the same GGUF blob — 1-token test gives cosine 0.36, not explainable by pooling, special tokens, or quantization; user decision: switching to pure llama.cpp requires a full reindex of the wiki base\n- [durable] `tmp/queue.py` in the workspace shadows stdlib `queue` — Python test scripts run from tmp/ fail on import; workaround is running them from a tmp subdirectory (e.g. tmp/embed-test/)\n- [durable] Typo \"pozlatejšího\" (instead of \"pozdějšího\") persists in the `projects/ai/state.md` section heading — the verification read targeted the wrong lines and the fix was claimed but never applied\n- [ephemeral] User preference during the embed migration: refuses to copy the ollama GGUF blob to a separate path (\"nic nikam kopirovat nebudu, llama to menit nebude\") — serve directly from the ollama blob store\n- [durable] The safety guard blocked `web_fetch` with \"repeated external lookup blocked\" on a URL already fetched — reuse existing results instead of re-fetching", "session_key": "reflect:20260915-033001-0"} +{"cursor": 431, "timestamp": "2026-09-20 14:19", "content": "- [ephemeral] Active objective: compare `deepseek-v4.1-flash` vs `glm-5.3` vs `kimi-k2.6` for agentic use in nanobot; research gathered but the comparison report is NOT yet written (next action: write it to `results/`).\n- [ephemeral] Earlier plan `plans/deepseek-v4.1-flash-eval.md` offers variant A (light: deep-research + usage delta) vs B (full: Fáze 0–3 vs glm baseline); user never chose — question still open.\n- [ephemeral] Created: `plans/deepseek-v4.1-flash-eval.md`, `results/2026-09-20_hodnoceni-beziciho-modelu-nanobot.md`, helpers `tmp/ds_probe/{preflight,tags_nvidia,where_served,quota_by_model,pinned_presets}.py`; committed as `b0468c4` \"nanobot: 2026-09-20 14:15:06\".\n- [durable] Preset `deepseek` = `deepseek-v4.1-flash:cloud`, ctx 976000, maxTokens 16384, temp 0.1, reasoningEffort high. Preset `glm` = `glm-5.3:cloud`, ctx 976000. Model ID `deepseek-v4.1-flash:cloud` reports `context_length` 1048576 with capabilities completion/thinking/tools/vision.\n- [durable] Ollama usage tiers (ollama.com/library tags): `deepseek-v4.1-flash:cloud` = **Medium Usage**, `glm-5.3:cloud` = **High Usage** (text-only, 753B), `kimi-k2.6:cloud` = **High Usage**, 256K ctx, text+image, 5 months old.\n- [durable] ollamatps live (2026-09-20): deepseek-v4.1-flash 175.9 tok/s, TTFT 366 ms, 99% reliability; glm-5.3 134.1 tok/s, TTFT 730 ms, 100%; kimi-k2.6 45.2 tok/s, TTFT 1.7 s, 100% — kimi-k2.6 is ~3–4× slower than the other two on our endpoint.\n- [correction] AA Intelligence Index is now **v4.3.2** (ten evals incl. Terminal-Bench 4.0). Current scores: GLM-5.3 44 (top open weights), GLM-5.3-Flash 42, DeepSeek V4 Pro 36; ollamatps lists DeepSeek V4.1 Flash 39.5 and Kimi K2.6 27. The \"GLM-5.3 = 60 / DeepSeek = 36.8\" figures in `knowledge/models.md` are the older v4.1.1 index — do not mix vintages.\n- [durable] Vendor benchmarks, DeepSeek V4.1 tech report: Terminal-Bench 2.1 **90.6** (beats Opus-5.0 89.1), TB 3.0 30.0, DeepSWE 74.2, AutomationBench 54.8, HLE 36.8, CodeForces 3471. GLM-5.3 vendor: TB 2.1 88.2, TB 3.0 28.3, DeepSWE 66.9, SWE-Marathon 42.5, AutomationBench 48.2, Toolathlon 73.0. Both self-reported.\n- [durable] Real usage from `db/ollama_usage.sqlite` (293 samples, 2026-09-15→09-20): peak weekly request counts glm-5.3 **1737**, deepseek-v4.1-flash 84, glm-5.3-flash 78, kimi-k2.7-code 62, **kimi-k2.6 only 5**. Session-window peak: glm-5.3 203, deepseek 84. Kimi K2.6 is effectively unexercised on this instance.\n- [durable] Kimi language drift is real but trigger-specific: MoonshotAI/Kimi-K2 issue #144 — kimi-k2.5 via OpenRouter spontaneously emitted Chinese after a playful \"we are Chinese now\" prompt. Other K2.6 reports (issue #128 empty output, NVIDIA forum repetition loop) are OSS/self-host issues, not Ollama Cloud.\n- [durable] nanobot has **no OpenTelemetry/GenAI instrumentation** (grep `gen_ai`/`otlp`/`opentelemetry` in `nanobot/` finds nothing). `AgentHook` (`nanobot/agent/hook.py`) with `after_iteration` and `usage` is the natural span-emission point.\n- [durable] `restrict_to_workspace` blocks exec on paths outside the workspace — `~/.nanobot/sessions/` and `~/.nanobot/config.json` are unreachable, so any eval harness reading session JSONL must run as a cron script (like `reflect_auto.py`) or via `detach`, not as tool calls in a turn.\n- [durable] Exec guard false-positives on any `X:` token in the raw command (e.g. `lambda x:-x[1]`, `date '+%H:%M:%S'`) — write the logic to a `tmp/` script and run the file path instead.\n- [durable] Session JSONL live at `/sessions//`; `tasks/*` frontmatter carries `model:` and `duration_seconds:` (enables per-model result attribution); webui token usage goes to a separate `token-usage.json`, not into the session rows.\n- [durable] Ollama Cloud allows max **3 parallel requests**; a 4th waits in queue and that wait lands in wall-clock, so latency must be measured in isolation.\n- [durable] Scripts pin presets: `skills/reflect/scripts/reflect_auto.py` → `MODEL_PRESET = \"glm\"`, `skills/compact-memory/scripts/compact_memory_auto.py` → `MODEL_PRESET = \"kimi\"`. Any preset rename must update these.\n- [durable] Preset `deepseek` is **missing from the preset table in `knowledge/models.md`**; the develop convention requires updating that table after adding/renaming a preset.\n- [permanent] User wants model/capability comparisons verified across multiple sources with source-by-source analysis and lessons-learned — not a single source; missing data must be stated openly rather than filled in.\n- [permanent] User rejects character-by-character breakdowns and research loops in place of concrete edits; prefers root-cause diagnosis over re-running tools blindly.", "session_key": "websocket:c6609d7a-1660-47d4-bb05-f52bd151a809"} diff --git a/projects/ai/memory.md b/projects/ai/memory.md index 02360dc..f312d56 100644 --- a/projects/ai/memory.md +++ b/projects/ai/memory.md @@ -151,3 +151,41 @@ Přesto: uživatel udělal plan, ten se opravoval opakovaně, ale výsledný kó Uživatelův závěr: kdyby si to od začátku psal sám — nebo aspoň kostru a typy, a nechal AI jen dokódovat — bylo by to o dost lepší. A nebylo to poprvé (koreluje s dřívější zkušeností: Solarflare 8.9., princip „rozhraní navrhuje člověk, model implementuje" z agent-to-human-tools.md). Kódování proběhlo 16.–17. 9. 2026; zápis dodatečně 18. 9. (původní session se nespustila v nanobotovi, proto deník chyběl). +- 2026-09-20: Zhodnocení článku „AI-Generated Technical Debt: Architecture Garbage Collection for Coding Agents" (Lukas Niessen, Medium, 2026-09-12; bookmark #1, fulltext v db/bookmark.sqlite) — hodnocení po přečtení: + +**Užitečné:** +- „Instructions change the probability of compliance. A test changes the definition of success." — zobecnění našeho poznatku: deterministický exec guard funguje, prose pravidla v AGENTS.md se porušují probabilisticky. Totéž platí pro architekturu: prosba vs. failnutý test pojmenující konkrétní import. +- Review data (MSR 2026, crewAI PRs): redundance 1.87× vyšší u agentů, ale reviewři pozitivnější — potvrzuje SpaceKeeper vzorec: plausible well-formatted kód prochází review, protože reviewr vidí dif, ne graf závislostí. +- Nejpraktičtější řádek: agent nesmí oslabit/smazat/přeskočit failing guardrail (CODEOWNERS na architekturní testy a thresholdech). Souvisí s AI security: agent optimalizující green CI má incentivu posunout verifier místo implementace. +- Tři smyčky: admission control (testy na PR), scheduled collection (agent otevírá 1 malý refactoring PR), ratchet (start na aktuální kvalitě, postupné utahování). + +**Opatrně:** +- Vendor bias: autor = zakladatel archunit.net, článek je soft-sell ArchUnitPython. +- Neřeší náš hlavní pain: ArchUnit chytá strukturální debt (vrstvy, cykly, LOC), ale naše opakovaná bolest (SpaceKeeper, Solarflare) je overengineering — sémantická komplexita, kterou layer testy nechytí. Článek to přiznává jedna větí (clone detector / LLM), na to deterministické řešení neexistuje. +- Ratchet metrics = Goodhart riziko pro agenta, autor sám říká „sensors, not quality scores". + +**Závěr pro nás:** zatím overkill (malé projekty), kandidát do Claude Code workflow až při větší míře AI-generovaného kódu: architekturní testy + CODEOWNERS + ratchet. +- 2026-09-20: Transfer závěrů z článku o architecture garbage collection (Niessen) na C# a Rust — jazykově obecné poznatky: + +**Obecný vzorec (jazykově agnostický):** +1. Pravidlo ≠ prose — invariant musí být spustitelný a failnout s pojmenováním viny. +2. Admission gate na PR/CI + scheduled collector (1 malý refactoring PR) + ratchet. +3. Guardrail mimo dosah agenta (nesmí ho oslabit/smazat — CODEOWNERS). + +**C#:** vzor z článku platí 1:1. Dvě zralé knihovny: NetArchTest (BenMorris, fluent reflection API) a ArchUnitNET — obyčejné xUnit testy. Silnější vrstva: Roslyn analyzers (compile-time — agent failne už na `dotnet build`, ne až v test runneru) + Threshold balík na LOC/CA ratchet. Volba: layering vynutit rozseknutím na assembly (compiler gate, zdarma) nebo NetArchTest nad jednou assembly (internal je jen per-assembly, ne per-modul). + +**Rust:** zralý ArchUnit ekvivalent neexistuje (jen experimentální agent skilly — ignorovat). Ale Rust invertuje model: vrstvy namodelovat jako crates v workspace → cargo zakáže cykly, směr závislostí vynucuje compiler, `pub` vs `pub(crate)` je visibility gate, trait bez impl = port. Agent nemůže zakázaný import ani napsat (compile error) — silnější než ArchUnit test, který zčervená až po vytvoření. Doplňky: cargo-deny (externí dependency policy), clippy thresholds (hrubá metrika/ratchet). + +**Síla gate pro AI agenta, vzestupně:** AGENTS.md prose < C# ArchUnit test < C# Roslyn analyzer < Rust crate struktura (compile error). Závěr: článek popisuje „test co hlídá pravidlo"; v C#/Rust lze začít o 1–2 úrovně výš — „struktura co pravidlo znemožní". Idiomatický Rust = vrstva jako crate, ne jedna velká crate s interními pravidly. +- 2026-09-20: Rozuzlení: jak přenést závěry z architecture-GC článku na náš skutečný pain — donutit AI agenta psát stručný, přehledný kód (ne jen layer pravidla). Po diskusi uživatel + agent: + +**Východisko:** na „stručný a přehledný" neexistuje test — sémantický overengineering prochází všema strukturálními testy. Řešení není jeden nástroj, ale čtyři páky (sestupně podle síly): + +1. **Struktura tasku** — proč AI nadýmá: volné zadání → optimalizuje na „vypadá dokonale", ne minimální diff. LLM poslouchá čísla, ne adjektiva: zadání s rozpočtem („max ~50 LOC, žádné nové soubory, žádná nová veřejná abstrakce"), diff-oriented prompt („uprav tyhle funkce, aby prošel test" místo „implementuj"), test-first spec (chování zafixované → méně prostoru pro vlastní abstrakce). Pojmenovat existující utility v zadání — nejčastější AI hřích je replikace místo reuse. +2. **Delete pass v nové session** — implementující agent má sunk cost, vlastní kód nemaže. Nová session s jediným úkolem: „udělej diff menší, smaž vše, co není potřeba pro acceptance kritéria" (checklist: nepoužitá abstrakce, spekulativní generalizace, „pro budoucnost"). Zrcadlí náš lessons-learned „review v nové session" — jen obráceně: nemaže historii, maže kód. +3. **Deterministické proxy** (nechytí overengineering, ale ohraničí škody, ratchet-able): Rust clippy `cognitive-complexity-threshold`/`too-many-arguments` v clippy.toml; C# Roslyn analyzers (Meziantou, SonarAnalyzer) compile-time; diff-size gate v CI (PR nad N řádků = lidské schválení). +4. **Anti-Goodhart**: každý gate může agent obejít posunem verifieru → clippy.toml/.editorconfig/testy pravidel do CODEOWNERS. + +**Praktická cesta pro nás (malé projekty, Claude Code):** zadání s čísly; delete pass po každé implementaci; complexity limity jednou nastavené na aktuální max (= celý ratchet); pokud agent třikrát předběhne u stejného typu zadání → kostru píše člověk (formalizace SpaceKeeper pravidla). + +**Závěr:** článek řeší „agent nesmí rozbít strukturu", ne „agent musí psát krásně" — druhé je open problém, dnešní odpověď = tlak ze tří stran: úzké zadání + adversariální delete pass + metrické stropy. diff --git a/projects/devops/memory.md b/projects/devops/memory.md index af3589f..5ed2c96 100644 --- a/projects/devops/memory.md +++ b/projects/devops/memory.md @@ -234,3 +234,14 @@ Postup (dohodnutý, dle konzultace s Gemini): 4. Ověřit: výstražná hláška zmizí a hodnoty po restartu zůstanou Pozn.: bezpečnostní důsledek — BIOS je po nasazení jumperu bez hesla, plně přístupný. U homelab stroje přijatelné. +- 2026-09-20: Uživatel se chce naučit git worktrees napříč CLI, VS Code a Claude Code. Sestavena učebnice `artifacts/2026-09-20_git-worktrees-guide.md` (ověřeno proti oficiální git dokumentaci, VS Code docs a Claude Code docs): mental model (sdílená historie, oddělené soubory/index/branch; stejná branch nesmí být checkoutnutá ve dvou worktrees), CLI kuchařka (add/remove/prune/list, konvence umístění, recovery), VS Code built-in podpora (Source Control → Repositories → Worktrees, `git.worktreeIncludeFiles`, `git.detectWorktrees`, Compare with Workspace, Migrate Worktree Changes), Claude Code `--worktree`/`-w` (fresh checkout, `.worktreeinclude`, isolation enforcement 4 checky nevypnutelné, `worktree.baseRef` fresh/head, PR checkout `-w "#42"`, cleanup/sweep chování, LFS/symlink/includeIf troubleshooting). Návaznost na homelab kontext: worktrees pro bisect, srovnávání verzí side-by-side, paralelní AI sessiony. +- 2026-09-20: correction: záznam o učení git worktrees byl vedle — uživatel použití ovládá (CLI, VS Code, Claude Code), nepotřebuje výuku ani teorii. Skutečný cíl: **rozjet praxi a získat grif** — sám říká, že se potřebuje "dokopat", aby worktrees reálně používal denně. Směr: habit-building (triggery, drill režim, případné připomínky), ne dokumentace. Guide zůstává v artifacts jako reference. +- 2026-09-20: K poznámkám k Proxmox serveru (Optiplex 9010): + +**Sekundární ventilátor (zadní stěna case):** řízení je nemožné — v Linuxu není žádná podpora (žádný PWM/registritelný hwmon kanál) a BIOS to také neresí; ventilátor jede buď naplno, nebo vůbec. Jediné funkční řešení, které uživatel našel, je externí USB ventilátorový radič. Uživatel to hodnotí skepticky („sranda aspoň za litr") — tedy možná, ale ne elegantní a něco stojí. + +**Konverze desktopu (hlavní PC z chlívku) na server — odmítnuta.** Uživatel ji zvažoval (Proxmox host + Windows VM přes RDP), ale rozhodl se proti: +- přestěhování Windows na VM by nebylo taková pohoda jako u Linuxu, +- potřeboval by sehnat rozumný HW, který by zvládl jak jeho každodenní práci, tak hry. + +Závěr: pro server preferuje sehnat jinou mašinu, desktop konvertovat nechce. diff --git a/projects/devops/state.md b/projects/devops/state.md index e894458..3c987dc 100644 --- a/projects/devops/state.md +++ b/projects/devops/state.md @@ -5,12 +5,12 @@ timestamp: draft # Project devops ## Kde to je -- **HW základna: Dell Optiplex 9010** (od 2026-09-18). Původní server — **Dell Optiplex 9020** workstation z raných dob RSJ, dlouholetý server (měněny zdroj/kabely/větrák, přidána RTX 4060 (deník: 4060 Ti — neověřeno) + hromada disků) — náhle zemřel (večer 2026-09-17, po vyjmutí RAM pípání chybových kódů; podezření CPU/DDR/deska). Proměřitelná hypotéza: AliExpress kabel zdroj→deska (odcházející měnič). Do 9010 přesunuty RAM, disky i GPU — vše jede; BIOS měl problémy (celý přesun >1 h), změny v BIOSu se neukládají — k dořešení. **Ergonomie 9010 je špatná**: stísněný case, grafika na krev, druhý NVme jen přes placatou PCIe redukci (slot pod grafikou); 550 W noční zdroj dává rezervu, ale práce s mašinou je nepříjemná. **Kapacita vyčerpaná: nic dalšího se do 9010 už nenacpe, max tocivý disk.** Hlavní riziko: 15+ let starý HW nedělany na 24/7 provoz → motivace pro novější HW je spolehlivost (RTO/RPO), ne výkon. Nová sestava (B550-PLUS + Ryzen 7 5700X + 32 GB DDR4 + chladic + case ≈ 16 k) zvažována vícekrát — vždy odložena; marginální upgrade na dead-end AM4/DDR4. Dlouhodobý kandidát na lepší host: ~~HP Z440 z práce~~ — padlo, z práce dostal právě ten 9010 (místo Z440); hot-spare zatím bez konkrétního kandidáta, levná opce zůstává Aukro deska 9020 (~3 k, po proměření kabelu). Zvažováno i vlastní PC z chlívku jako Proxmox host + Windows VM přes RDP. Vyřčená lekce: zálohovat kontejnery z Proxmoxu (nemá se kam — PBS chybí). +- **HW základna: Dell Optiplex 9010** (od 2026-09-18). Původní server — **Dell Optiplex 9020** workstation z raných dob RSJ, dlouholetý server (měněny zdroj/kabely/větrák, přidána RTX 4060 (deník: 4060 Ti — neověřeno) + hromada disků) — náhle zemřel (večer 2026-09-17, po vyjmutí RAM pípání chybových kódů; podezření CPU/DDR/deska). Proměřitelná hypotéza: AliExpress kabel zdroj→deska (odcházející měnič). Do 9010 přesunuty RAM, disky i GPU — vše jede; BIOS měl problémy (celý přesun >1 h), změny v BIOSu se neukládají — k dořešení. **Ergonomie 9010 je špatná**: stísněný case, grafika na krev, druhý NVme jen přes placatou PCIe redukci (slot pod grafikou); 550 W noční zdroj dává rezervu, ale práce s mašinou je nepříjemná. **Kapacita vyčerpaná: nic dalšího se do 9010 už nenacpe, max tocivý disk.** Hlavní riziko: 15+ let starý HW nedělany na 24/7 provoz → motivace pro novější HW je spolehlivost (RTO/RPO), ne výkon. Nová sestava (B550-PLUS + Ryzen 7 5700X + 32 GB DDR4 + chladic + case ≈ 16 k) zvažována vícekrát — vždy odložena; marginální upgrade na dead-end AM4/DDR4. Dlouhodobý kandidát na lepší host: ~~HP Z440 z práce~~ — padlo, z práce dostal právě ten 9010 (místo Z440); hot-spare zatím bez konkrétního kandidáta, levná opce zůstává Aukro deska 9020 (~3 k, po proměření kabelu). Zvažováno i vlastní PC z chlívku jako Proxmox host + Windows VM přes RDP — **zavrženo 2026-09-20** (přestěhování Windows není pohoda jako u Linuxu; chybí rozumný HW, který by unesl uživatelovu práci i hry; pro server se sežene jiná mašina). Vyřčená lekce: zálohovat kontejnery z Proxmoxu (nemá se kam — PBS chybí). - LibreChat: běží jako podman kontejnery; jako Code Interpreter sandbox vybrán LibreCodeInterpreter (nsjail, 3 kontejnery). Research hotový (2026-09-13), rozhodnutí o nasazení (sdílená Docker VM vs dedikovaná Proxmox VM) ještě nepadlo. - Ollama na nvidia.hell: po incidentech 12.–13. 9. 2026 zaevidován root cause pádů — kauzální řetěz: ollama rozhoduje load podle VRAM ne volné RAM + vypíná mmap (podmínka na 9,5 GiB stroji nesplnitelná nikdy, regrese od 2026-06-05) + PLE host buffer u gemma4 + přerušený load leakuje napinovanou host paměť (neviditelná pro ps/nvidia-smi/cgtop, detekce jen `nr_foll_pin` delta v /proc/vmstat), uvolní **jen reboot** (rmmod driveru ověřeně NE). Cgroup pojistka (`MemoryMax=6G`, `MemorySwapMax=0`, bez MemoryHigh) ověřena zátěžovým testem: 240/240 SSH heartbeatů, load 3,41 vs 81 při incidentu. Skutečný zdroj zátěže = nanobot.hell (dávky přes ~10 modelů + embedding), LibreChat jen zesilovač. Reporty v `artifacts/2026-09-13_ollama-nvidia-full-report.md` (ucelený, s kuchařkou pro triáž) a `artifacts/2026-09-13_ollama-nvidia-negative-findings.md` (negativní zjištění), shrnutí v memory.md 2026-09-14. Zavržené cesty: earlyoom i jakákoli externí kill varianta, MemoryHigh pod MemoryMax, navýšení RAM (headroom konstanta 7,5 GiB), limit počtu modelů, OLLAMA_LOAD_TIMEOUT, upgrade ollamy, mmap override (neexistuje), ballooning (`balloon: 0` + pevná paměť), rmmod jako remedy. ## Co dál -- **HW po migraci na Optiplex 9010 (aktuální fronta):** (1) ~~BIOS — neukládající se změny~~ — root cause nalezen 2026-09-19: vyndaný PSWD jumper drží desku v ochranném režimu; fix: nasadit jumper zpět na oba piny PSWD, nastavit hodnoty v BIOSu, uložit, ověřit persistenci (postup v memory.md 2026-09-19); (2) doladit sekundární vetrak; (3) instalovat nový 1TB NVme; (4) nahodit Proxmox Backup Server — kandidát pivo.hell (Atom), aby bylo kam zálohovat; (5) dlouhodobě plán nového HW — průzkum ukázal 15–20 l skříňky s převahou jader, což nevyhovuje (uživatel nechce víc jader); zvažovat mini-ITX SFF, Optiplex jako mezikrok, custom build. +- **HW po migraci na Optiplex 9010 (aktuální fronta):** (1) ~~BIOS — neukládající se změny~~ — root cause nalezen 2026-09-19: vyndaný PSWD jumper drží desku v ochranném režimu; fix: nasadit jumper zpět na oba piny PSWD, nastavit hodnoty v BIOSu, uložit, ověřit persistenci (postup v memory.md 2026-09-19); (2) doladit sekundární vetrak — zjištěno 2026-09-20: žádná Linux podpora, BIOS to taky neresí (jede naplno nebo vůbec), jediné řešení je USB radič (uživatel: „aspoň za litr"); (3) instalovat nový 1TB NVme; (4) nahodit Proxmox Backup Server — kandidát pivo.hell (Atom), aby bylo kam zálohovat; (5) dlouhodobě plán nového HW — průzkum ukázal 15–20 l skříňky s převahou jader, což nevyhovuje (uživatel nechce víc jader); zvažovat mini-ITX SFF, Optiplex jako mezikrok, custom build. - Rozhodnout umístění LibreCodeInterpreter (AI stack VM vs dedikovaná VM) a nasadit — viz memory.md 2026-09-13 pro capability požadavky (SYS_ADMIN, NET_ADMIN, apparmor:unconfined). - Ollama open body dle priority (report §11): (1) ~~zastavit dávky z nanobot.hell~~ — **neplatí jako provozní riziko** (dávky byly testovací tool-calling requesty, běžný provoz nanobot nesahá na lokální modely); (2) retest cgroup pojistky bez MemoryHigh (odblokováno rebootem; kritéria: heartbeat bez výpadku, MemAvailable > 2 GiB, dmesg constraint=MEMCG); (3) doladit MemoryMax podle memory.peak; (4) rozhodnout osud gemma4 (PLE ~5,9 GiB host bufferu, na 9,5 GiB stroji nikdy); (5) `OLLAMA_KV_CACHE_TYPE=q4_0` zrušit nebo nepoužívat granite-code; (6) drobnosti: `apt purge` earlyoom (rc), llama-server `--log-verbosity 4`, zabbix `Hostname=Zabbix server` → nvidia, LibreChat titleConvo duplicitní requesty, otázka real-time monitoringu (hlídač co killuje = zavržená cesta). - Návrh k rozhodnutí: izolovat embedding pipeline (wiki skill) ze ollamy na statický llama.cpp server (`llama-server --embeddings --pooling last`, stejný GGUF, /v1/embeddings) — obejde load path, kde vzniká leak; po ní nanobot nezůstane na lokální ollamě žádný provoz krom cloud proxy. Vyžaduje: úprava wiki_embed.py klienta, config.yaml endpoint, reindex --full. diff --git a/projects/life/artifacts/.fyzio-cviky-kycele.md.swp b/projects/life/artifacts/.fyzio-cviky-kycele.md.swp deleted file mode 100644 index 91b40cb42ef0e8424bbca8621800a0f4c2000c7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 zcmeI2JCEH&6vro2D3E}7)SR%*ZgltVBfNH-G$@D!5+NW$baU-ld9Ljl%N`rq1w{0> zqk*jq0%?m?LJ_)bfqg@fduv@=O2+kSTn8c%<1{=m8voD}@C1%0aE4vj+*r5ImR>$b&p-F! z@yq;OPrwuK1Uvyxz!UHUJONL@6ZlUOFxe^g88Ulfk=?n)`P3ul#ic)a0-k^;;0bsF zo`5Id33vjYfG6MycmkflzmNdOkLjmRGxi;1fB%2*|Ns4G7`q2$kcM7_UVwf%%h=D* zedr!^19}5`9s2VOV}C%mp=;1t=%=R{y9@mQ-G<(REpin3C zo0P%D@ZR}lC8n}4-QI|r5H7O3Yb(|7Qq^QS?e-P2&@1Q1h~TmaVO!~lQzD{3z)YOO zJeG_oh;%4H1kpJtSXL93yNKjyxZMtKr(H{1>p$M2f=s`gh?IW4@dZ^iK=iXA)=(oQ zWLA$TN_Yjg+?mieRh#kHVSGnK_DR#Vp$H<2>54X>4xAbA77GqW_cMSsd6~i4L)#Sd z)KM{-rXhHtY%~>$j8KhDj{stdQkHmU0=yp`uIv!ORZjiP)NnTVe?QYxxXSXvAO>(Q zjEIy-VLaEF(xsuKyJKQKA|)u*0TmK`G!PgX$+CXTjN@p{7#?vmVAT{`t45+6Nw=4l zl=D<5d9nd#NmC_kXj9vPnQml&8kvMUPR^!FVSaO{jRW#n{(m1PCghPghsbDo@YxPk zf;pXB4#{=zFq7x#W147x)Y!9H+wg3;w zC8((!^2SHrG!YFciT;hW1@2K$Y8+kCaIptM549g zx}PPOX*V8rUW;5;c382<)f4^8RfVQ@+fNH8a1|q<3hA;pxhd0Oo7tv~_3_qtbA9tQ zTFynR6(+2VG2abLr2VczYoJ#_*X|85C$6L&xl9(v?o~^4$$l-r$kmSaB5LdgF6z;d IU~QD_FL``c*#H0l