From 11190b493125ef0558377eed86b268788bfbe36d Mon Sep 17 00:00:00 2001 From: lachtan Date: Thu, 25 Jun 2026 05:22:57 +0200 Subject: [PATCH] runtime zaloha --- SOUL.md | 2 + cron/jobs.json | 209 +++++++++++++----- .../runs/439f7f4d_1782345600010_62e0ad11.json | 18 ++ skills/compact-memory/SKILL.md | 30 +-- 4 files changed, 192 insertions(+), 67 deletions(-) create mode 100644 cron/runs/439f7f4d_1782345600010_62e0ad11.json diff --git a/SOUL.md b/SOUL.md index a4ecc69..d18768e 100644 --- a/SOUL.md +++ b/SOUL.md @@ -25,6 +25,8 @@ Jsem [nanobot](https://github.com/HKUDS/nanobot) — lehký osobní asistent. Ml - Chybějící info dohledej tooly. Uživatele se ptej, jen když to tooly nezvládnou - Po vícekrokových změnách ověř výsledek (re-read, test, kontrola výstupu) - Když existuje víc cest, vynes tradeoff nahlas místo tichého výběru jedné +- Víc otázek pokládej **postupně, jednu po druhé** — u každé musí být prostor odpovědět +- Pravidla do `USER.md`/`SOUL.md`/`AGENTS.md` apod. piš **stručně a jasně** — krátké imperativní bullety, klíčové slovo tučně, bez vaty ## Faktografická pravidla - Když nevím / nejsem si jistý, **řeknu to nahlas**. Netipuji, nevymýšlím, neimprovizuji fakta jen aby odpověď zněla úplně. diff --git a/cron/jobs.json b/cron/jobs.json index 1518c13..c68f05e 100644 --- a/cron/jobs.json +++ b/cron/jobs.json @@ -70,8 +70,8 @@ "originMetadata": {} }, "state": { - "nextRunAtMs": 1782317405444, - "lastRunAtMs": 1782310204160, + "nextRunAtMs": 1782360633599, + "lastRunAtMs": 1782353432294, "lastStatus": "ok", "lastError": null, "runHistory": [ @@ -98,11 +98,47 @@ "status": "ok", "durationMs": 1284, "error": null + }, + { + "runAtMs": 1782317405445, + "status": "ok", + "durationMs": 21520, + "error": null + }, + { + "runAtMs": 1782324626966, + "status": "ok", + "durationMs": 1320, + "error": null + }, + { + "runAtMs": 1782331828288, + "status": "ok", + "durationMs": 1321, + "error": null + }, + { + "runAtMs": 1782339029610, + "status": "ok", + "durationMs": 1331, + "error": null + }, + { + "runAtMs": 1782346230943, + "status": "ok", + "durationMs": 1348, + "error": null + }, + { + "runAtMs": 1782353432294, + "status": "ok", + "durationMs": 1305, + "error": null } ] }, "createdAtMs": 1782281400007, - "updatedAtMs": 1782310205444, + "updatedAtMs": 1782353433599, "deleteAfterRun": false }, { @@ -129,123 +165,188 @@ "originMetadata": {} }, "state": { - "nextRunAtMs": 1782315605451, - "lastRunAtMs": 1782313805451, + "nextRunAtMs": 1782358833607, + "lastRunAtMs": 1782357033606, "lastStatus": "ok", "lastError": null, "runHistory": [ { - "runAtMs": 1782283200017, + "runAtMs": 1782322826973, + "status": "ok", + "durationMs": 0, + "error": null + }, + { + "runAtMs": 1782324628288, + "status": "ok", + "durationMs": 0, + "error": null + }, + { + "runAtMs": 1782326428289, "status": "ok", "durationMs": 1, "error": null }, { - "runAtMs": 1782285000019, - "status": "ok", - "durationMs": 0, - "error": null - }, - { - "runAtMs": 1782286800020, + "runAtMs": 1782328228292, "status": "ok", "durationMs": 1, "error": null }, { - "runAtMs": 1782288601407, + "runAtMs": 1782330028295, "status": "ok", "durationMs": 0, "error": null }, { - "runAtMs": 1782290401408, + "runAtMs": 1782331829614, + "status": "ok", + "durationMs": 0, + "error": null + }, + { + "runAtMs": 1782333629615, "status": "ok", "durationMs": 1, "error": null }, { - "runAtMs": 1782292201411, + "runAtMs": 1782335429618, "status": "ok", "durationMs": 0, "error": null }, { - "runAtMs": 1782294001413, + "runAtMs": 1782337229620, "status": "ok", "durationMs": 0, "error": null }, { - "runAtMs": 1782295802844, + "runAtMs": 1782339030946, "status": "ok", "durationMs": 0, "error": null }, { - "runAtMs": 1782297602845, - "status": "ok", - "durationMs": 0, - "error": null - }, - { - "runAtMs": 1782299402847, - "status": "ok", - "durationMs": 0, - "error": null - }, - { - "runAtMs": 1782301202848, - "status": "ok", - "durationMs": 0, - "error": null - }, - { - "runAtMs": 1782303004162, - "status": "ok", - "durationMs": 0, - "error": null - }, - { - "runAtMs": 1782304804163, - "status": "ok", - "durationMs": 0, - "error": null - }, - { - "runAtMs": 1782306604164, + "runAtMs": 1782340830948, "status": "ok", "durationMs": 1, "error": null }, { - "runAtMs": 1782308404166, + "runAtMs": 1782342630951, "status": "ok", "durationMs": 0, "error": null }, { - "runAtMs": 1782310205445, + "runAtMs": 1782344430952, "status": "ok", "durationMs": 1, "error": null }, { - "runAtMs": 1782312005448, + "runAtMs": 1782346232294, "status": "ok", "durationMs": 0, "error": null }, { - "runAtMs": 1782313805451, + "runAtMs": 1782348032296, "status": "ok", "durationMs": 0, "error": null + }, + { + "runAtMs": 1782349832297, + "status": "ok", + "durationMs": 1, + "error": null + }, + { + "runAtMs": 1782351632300, + "status": "ok", + "durationMs": 0, + "error": null + }, + { + "runAtMs": 1782353433603, + "status": "ok", + "durationMs": 0, + "error": null + }, + { + "runAtMs": 1782355233605, + "status": "ok", + "durationMs": 0, + "error": null + }, + { + "runAtMs": 1782357033606, + "status": "ok", + "durationMs": 1, + "error": null } ] }, "createdAtMs": 1782281400014, - "updatedAtMs": 1782313805451, + "updatedAtMs": 1782357033607, + "deleteAfterRun": false + }, + { + "id": "439f7f4d", + "name": "compact-memory-auto-daily", + "enabled": true, + "schedule": { + "kind": "cron", + "atMs": null, + "everyMs": null, + "expr": "0 2 * * *", + "tz": "Europe/Prague" + }, + "payload": { + "kind": "agent_turn", + "message": "Run /compact-memory auto skill to clean up memory/MEMORY.md", + "deliver": true, + "channel": "telegram", + "to": "8826147089", + "channelMeta": {}, + "sessionKey": "websocket:89051535-7544-4a44-90db-5c2630f52c6d", + "originChannel": "websocket", + "originChatId": "89051535-7544-4a44-90db-5c2630f52c6d", + "originMetadata": { + "remote": [ + "192.168.40.104", + 51922 + ], + "webui": true, + "webui_turn_id": "9a9a78bd-a85b-4420-a9be-60b74a75bd1a", + "workspace_scope": { + "project_path": "/home/nanobot/.nanobot/workspace", + "access_mode": "restricted" + }, + "_wants_stream": true + } + }, + "state": { + "nextRunAtMs": 1782432000000, + "lastRunAtMs": 1782345600003, + "lastStatus": "ok", + "lastError": null, + "runHistory": [ + { + "runAtMs": 1782345600003, + "status": "ok", + "durationMs": 77839, + "error": null + } + ] + }, + "createdAtMs": 1782319267399, + "updatedAtMs": 1782345677842, "deleteAfterRun": false } ] diff --git a/cron/runs/439f7f4d_1782345600010_62e0ad11.json b/cron/runs/439f7f4d_1782345600010_62e0ad11.json new file mode 100644 index 0000000..2227418 --- /dev/null +++ b/cron/runs/439f7f4d_1782345600010_62e0ad11.json @@ -0,0 +1,18 @@ +{ + "job_id": "439f7f4d", + "job_name": "compact-memory-auto-daily", + "session_key": "websocket:89051535-7544-4a44-90db-5c2630f52c6d", + "prompt_ref": { + "id": "cron.agent_turn.reminder", + "version": 1, + "sha256": "c9210a44f126470f0f01e39d90098351037c821206ba2e98347ff1676fd77b55" + }, + "prompt_vars": { + "message": "Run /compact-memory auto skill to clean up memory/MEMORY.md" + }, + "rendered_prompt": "The scheduled time has arrived. Execute this scheduled cron job now and report the result to the user in the same session.\n\nRules:\n- Speak directly to the user in their language.\n- Do not narrate internal progress.\n- Do not include user IDs.\n- Do not add status reports like \"Done\" or \"Reminded\" unless they are the natural response.\n\nCron job: Run /compact-memory auto skill to clean up memory/MEMORY.md", + "status": "ok", + "response": "Auto kompaktování MEMORY.md: žádné změny nebyly potřeba, soubor je už čistý (66 řádků). Záloha do `backup/` se vytvořila před kontrolou.", + "run_id": "439f7f4d:1782345600010:62e0ad11", + "updated_at_ms": 1782345677840 +} \ No newline at end of file diff --git a/skills/compact-memory/SKILL.md b/skills/compact-memory/SKILL.md index 90ffdfa..a7e249f 100644 --- a/skills/compact-memory/SKILL.md +++ b/skills/compact-memory/SKILL.md @@ -25,24 +25,26 @@ The line threshold is only a proactive trigger. When the user invokes the skill 1. Read `memory/MEMORY.md`, and — for duplicate detection — also `USER.md`, `SOUL.md`, and `keep.md` (all three in the workspace root). 2. Count total lines (`wc -l memory/MEMORY.md`). If the skill was **not** invoked explicitly by the user, the file is ≤ 250 lines, and there is no obvious staleness, report "nothing to clean up" and stop. When invoked explicitly, always continue to the audit. -3. Identify candidates: - - **superseded** — replaced by newer facts or no longer relevant. - - **detail** — concrete commands, flags, paths, or measurements that belong in a skill or `results/` file. +3. **Audit the WHOLE file in a single pass.** Walk every `##` section and every `###` subsection in order, top to bottom, and evaluate every bullet. Do not stop after the first few findings — the proposal in step 5 must cover the entire file at once. Re-running the skill should find nothing left, not "the next batch". +4. Identify candidates: + - **superseded** — replaced by newer facts, completed work, or no longer relevant. + - **detail** — concrete commands, flags, paths, measurements, or **code references** (e.g. `telegram.py:384`, script paths, DB paths) that belong in a skill, in code, or in a `results/` file. - **duplicate** — same fact already present in `USER.md`, `SOUL.md`, or `keep.md`. - - **ephemeral** — one-off debugging, temporary state, or resolved incident details. -4. Identify merge candidates within the same `###` subsection — related bullets that can be combined into one concise bullet. -5. Present a numbered proposal in chat: - - list each delete with reason and original text; + - **ephemeral** — one-off debugging, temporary state, resolved incidents, or transient build/run progress (counts, task-failure notes, in-flight status). + - **stale section** — an entire `##`/`###` section whose contents are all superseded or ephemeral (e.g. a finished project, a one-off task log, transient system state). Propose removing the whole block at once, not bullet by bullet. +5. Identify merge candidates within the same `###` subsection — related bullets that can be combined into one concise bullet. +6. Present a single numbered proposal in chat that covers the entire file: + - list each delete with reason and original text (use `[stale section]` and cite the heading for whole-section removals); - list each merge with merged text. - Kept items are not listed. -6. Wait for user approval. Accept commands like: +7. Wait for user approval. Accept commands like: - `apply` / `ok` / `yes` — apply all proposed changes. - `keep 3, 7, 12` — keep listed items, apply the rest. - `delete 2, 5` — delete only listed items. - `cancel` — abort. -7. Apply approved changes to `memory/MEMORY.md`. -8. Append deleted items to `log/memory-clean.log` with timestamp `YYYY-MM-DD HH:MM` (create the file if it does not exist). -9. Report summary. +8. Apply approved changes to `memory/MEMORY.md`. +9. Append deleted items to `log/memory-clean.log` with timestamp `YYYY-MM-DD HH:MM` (create the file if it does not exist). +10. Report summary. ### Auto mode @@ -60,8 +62,9 @@ Triggered by the user saying "memory-compact auto" or an equivalent with explici - Do not touch `SOUL.md`, `USER.md`, or `keep.md`. - In interactive mode do not create backups of `MEMORY.md`; rely on `log/memory-clean.log` for traceability. Auto mode always writes a full snapshot to `backup/` before deleting. - Merge only within the same `###` subsection (never across `##` sections or across different `###` subsections). -- Preserve active project context, user preferences, and infrastructure facts. -- When in doubt, keep it and mention the uncertainty in the report. +- Preserve active project context, user preferences, and durable infrastructure facts. +- Be exhaustive: propose every qualifying candidate in one pass, not a handful. The user prunes via `keep`/`delete`, so in interactive mode propose generously and flag borderline items rather than silently keeping them. +- In **auto mode** only, when in doubt keep it (no user is there to prune); list the borderline items you kept in the report. ## Output format @@ -73,6 +76,7 @@ Found X candidates to change in MEMORY.md: Delete: 1. [superseded] 2. [detail] +3. [stale section] ## (N bullets) — ... Merge: