[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7199ES1CJ0YQ7P8MFRJ1SNQ":3,"skill-same:01M7199ES1CJ0YQ7P8MFRJ1SNQ":51},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":23,"linkOnly":24,"markdownContent":25,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":31,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":34,"ownerDescription":35,"updatedAt":36,"install":37,"resources":50},"01M7199ES1CJ0YQ7P8MFRJ1SNQ","resume",null,"vjt\u002Fclaude-ircbot","vjt","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F14077?v=4","01M7199BPER9D5M51J6EFWWSSB","Marcello Barnaba","01M7199BQ5T18T1GETC7RG06Q2",0,"MIT","https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fresume\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[5],"2026-11-10 10:12:30",false,"---\nname: resume\ndescription: Warm-resume the vjt-claude IRC session — reseeds context from today's activity log, adopts\u002Fattaches all three Monitors (Azzurra + Libera + Telegram), sweeps for WIP, reports. The canonical bringup protocol: fired by aup_watchdog.py after every \u002Fclear (hot path) and reused by \u002Fstart for cold boot. Self-contained by design.\nuser_invocable: true\n---\n\n# \u002Fresume — warm rehydrate after a \u002Fclear\n\nThe watchdog fires this after every `\u002Fclear` — this is the **hot path**, run thousands of\ntimes, so it must stay lean. **This file is the canonical bringup protocol and is\nself-contained: never pull in `\u002Fstart` to \"understand\" a step — doing so reloads the heavy\ncold-boot skill on every clear and burns the tokens this split exists to save.** Everything\nneeded to execute is right here. (Cold boot runs `\u002Fstart`, which does its cold-only setup\nand then defers back to these same four steps.)\n\nAfter `\u002Fclear`, `CLAUDE.md` + `MEMORY.md` auto-load; the activity-log body and the live\nbot state do NOT. These steps reseed that. Do it silently — no narration unless WIP found.\n\n## 1. Reseed context from the activity log\n\n```bash\ngrep -nE '^### [0-9]{4}-[0-9]{2}-[0-9]{2}' memory\u002Fproject_activity_log.md\n```\n\n- If today's `### YYYY-MM-DD` heading (vs `currentDate`) is missing, append it at the bottom.\n- **Read today's heading body in full** (`Read` with `offset` at today's heading line → EOF).\n  This is the mandatory seed: today's events, in-flight threads, `PENDING`\u002F`DA FARE` markers\n  reach you ONLY here. Skipping it = waking blind. If today's body is thin, also read yesterday's.\n- Trim is NOT done here — it's disk hygiene, not token hygiene (the log is read-on-demand, never\n  auto-loaded, so an untrimmed log costs zero per-clear tokens). `\u002Fstart` owns the >14d archive sweep.\n\n## 2. Adopt the Monitors — THREE streams (don't duplicate)\n\nThree event streams, three separate Monitors: **Azzurra** and **Libera** (same `bot.py`, two\nseparate processes, each with its OWN stdout stream — the Azzurra Monitor never sees Libera\nevents and vice-versa) plus **Telegram** (`@gazzurbo_bot` long-poller, a different transport\nentirely). The `tail -F` pipelines survive `\u002Fclear`; the Monitor task registrations do not.\n**Handle ALL THREE.** Libera and Telegram are the easy-to-forget ones — their processes often\ndo NOT survive, so you usually attach them fresh even when Azzurra's got adopted.\n(IRCnet: quittato e unit disabilitata il 2026-11-03, ordine vjt — niente monitor.)\n\n```bash\npgrep -af \"tail -F.*vjt-claude\u002Fbot.stdout.log\"          # Azzurra\npgrep -af \"tail -F.*vjt-claude\u002Fbot.libera.stdout.log\"   # Libera\npgrep -af \"[t]g_poll.sh\"                                # Telegram\nsystemctl --user is-active vjt-claude-bot.service vjt-claude-libera-bot.service \\\n  vjt-claude-aup-watchdog.service\n```\n\nFor EACH stream independently:\n- pgrep hit on its `*stdout.log` → **adopt it, skip attach** (note `monitor adopted (pid \u003Cn>)`).\n  A hit on `bot.log` \u002F `bot.libera.log` (NOT `*stdout.log`) is a stale pre-2026-05-06 orphan — kill it, attach fresh.\n- No hit → attach one fresh Monitor:\n  - **Azzurra:**\n    ```\n    Monitor: command: bash \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002F.claude\u002Fskills\u002Fstart\u002Fstart-monitor.sh\n             persistent: true, timeout_ms: 3600000\n             description: \"IRC bot events (msgs+trust, invites, errors)\"\n    ```\n  - **Libera:**\n    ```\n    Monitor: command: bash \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002F.claude\u002Fskills\u002Fstart\u002Fstart-monitor-libera.sh\n             persistent: true, timeout_ms: 3600000\n             description: \"Libera IRC bot events (#grappa)\"\n    ```\n  - **Telegram** (the support group and the group vjt and I share — who's in them and\n    which chat is which lives in `[[project_melablu_support]]` \u002F `[[reference_telegram_bridge_handles]]`,\n    not in this repo):\n    ```\n    Monitor: command: bash \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Fvar\u002Ftg_poll.sh\n             persistent: true, timeout_ms: 3600000\n             description: \"Telegram @gazzurbo_bot messages (Melablu support + shared group)\"\n    ```\n    Token lives at `~\u002F.config\u002Fgazzurbo\u002Ftoken` (600, never printed); the poller persists its\n    `getUpdates` offset in `var\u002Ftg_offset`, so a restart replays nothing. Reply with\n    `var\u002Ftg_say.sh` (stdin, `TG_CHAT_ID=` to pick the chat). **Only ONE poller may run** —\n    a second `getUpdates` on the same token gets `409 Conflict` and both starve.\n- **m42 alarms** (4th Monitor, always attach fresh — vjt 2026-11-03: «metti dei monitor su questi\n  eventi così puoi reagire»). The `siem-*` systemd user timers (`\u002Fsrv\u002Fsiem\u002Fsystemd\u002F`, scripts in `\u002Fsrv\u002Fsiem\u002Falarms\u002F`) DM vjt and append each alert to\n  `~\u002F.local\u002Fstate\u002Fm42-alarms.log`; this lets me see them too and act (investigate on m42, tell vjt):\n  ```\n  Monitor: command: tail -n0 -F \u002Fhome\u002Fvjt\u002F.local\u002Fstate\u002Fm42-alarms.log \u002Fhome\u002Fvjt\u002F.local\u002Fstate\u002Fpf-alarm.err \u002Fhome\u002Fvjt\u002F.local\u002Fstate\u002Fmail-auth-alarm.err 2>\u002Fdev\u002Fnull | \u002Fusr\u002Fbin\u002Fgrep --line-buffered -v -e '^==> ' -e '^$'\n           persistent: true, timeout_ms: 3600000\n           description: \"m42 security alarms (pf + mail auth) and alarm script errors\"\n  ```\n  **`\u002Fusr\u002Fbin\u002Fgrep`, never bare `grep`:** in an inline Monitor command the shell snapshot turns\n  `grep` into the bundled `ugrep`, which on a `tail -F` pipe passes the blank lines and **eats the\n  content lines** — measured 2026-11-12, the m42 alarms of 13:00 and 13:50 never arrived.\n  Scripts (`start-monitor*.sh`, `tg_poll.sh`) are not affected: they get the real grep.\n- Any service not `active` → `systemctl --user start \u003Csvc>` (linger means they usually survive).\n\n## 3. WIP sweep — resume only true gaps\n\n```bash\ngit status --short\n\u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Ftools\u002Fsweep-bot-log.sh 50\n```\n\n- Untracked\u002Fmodified files = unfinished edits → read, finish (unless next step is destructive).\n- The sweep applies the SAME per-channel read policy as the Monitor (`tools\u002Fchan_filter.awk`,\n  shared with `start-monitor.sh`): `#italia` dropped, `#sniffo` only the lines that name me plus\n  my own outbound. Do **not** go back to a raw `tail` on `bot.log` — that bypasses the filter and\n  re-reads channels I am not supposed to read (vjt, query 2026-09-10: \"non avresti dovuto vederlo\").\n- bot.log: read inbound AND outbound interleaved. For each inbound addressed to me, scan outbound\n  with later timestamp in same chan\u002Fnick — if it plausibly answers, **already handled, do not reply**.\n  Only true gaps (inbound, no matching outbound after) get a reply. Half-sent line → finish it.\n- **When in doubt between replying and silence, stay silent.** A dupe is worse than a miss.\n- **Telegram has no log to sweep:** a TG message landing during the `\u002Fclear` reaches nobody (2026-11-11 22:14, vjt's «abilita i quiz di mike» lost). Read the tail of the previous TG Monitor's output: `ls -t scratchpad\u002Fclaude-1000\u002F*\u002F*\u002Ftasks\u002F*.output | head` → `tail` the one whose lines start `TG chat=`, and answer what has no reply.\n- Don't announce \"nothing found\" — silence is correct when nothing's pending.\n\n## 4. Report ready\n\nOne terse line, e.g. `resumed — monitors: azzurra adopted (pid \u003Cn>) + libera\u002Ftelegram attached, 4 svc active, no WIP.`\n\nThen resume standing behavior (reply policy, channel registers, activity-log appends) per `CLAUDE.md`.\n","# \u002Fresume — warm rehydrate after a \u002Fclear\n\nThe watchdog fires this after every `\u002Fclear` — this is the **hot path**, run thousands of\ntimes, so it must stay lean. **This file is the canonical bringup protocol and is\nself-contained: never pull in `\u002Fstart` to \"understand\" a step — doing so reloads the heavy\ncold-boot skill on every clear and burns the tokens this split exists to save.** Everything\nneeded to execute is right here. (Cold boot runs `\u002Fstart`, which does its cold-only setup\nand then defers back to these same four steps.)\n\nAfter `\u002Fclear`, `CLAUDE.md` + `MEMORY.md` auto-load; the activity-log body and the live\nbot state do NOT. These steps reseed that. Do it silently — no narration unless WIP found.\n\n## 1. Reseed context from the activity log\n\n```bash\ngrep -nE '^### [0-9]{4}-[0-9]{2}-[0-9]{2}' memory\u002Fproject_activity_log.md\n```\n\n- If today's `### YYYY-MM-DD` heading (vs `currentDate`) is missing, append it at the bottom.\n- **Read today's heading body in full** (`Read` with `offset` at today's heading line → EOF).\n  This is the mandatory seed: today's events, in-flight threads, `PENDING`\u002F`DA FARE` markers\n  reach you ONLY here. Skipping it = waking blind. If today's body is thin, also read yesterday's.\n- Trim is NOT done here — it's disk hygiene, not token hygiene (the log is read-on-demand, never\n  auto-loaded, so an untrimmed log costs zero per-clear tokens). `\u002Fstart` owns the >14d archive sweep.\n\n## 2. Adopt the Monitors — THREE streams (don't duplicate)\n\nThree event streams, three separate Monitors: **Azzurra** and **Libera** (same `bot.py`, two\nseparate processes, each with its OWN stdout stream — the Azzurra Monitor never sees Libera\nevents and vice-versa) plus **Telegram** (`@gazzurbo_bot` long-poller, a different transport\nentirely). The `tail -F` pipelines survive `\u002Fclear`; the Monitor task registrations do not.\n**Handle ALL THREE.** Libera and Telegram are the easy-to-forget ones — their processes often\ndo NOT survive, so you usually attach them fresh even when Azzurra's got adopted.\n(IRCnet: quittato e unit disabilitata il 2026-11-03, ordine vjt — niente monitor.)\n\n```bash\npgrep -af \"tail -F.*vjt-claude\u002Fbot.stdout.log\"          # Azzurra\npgrep -af \"tail -F.*vjt-claude\u002Fbot.libera.stdout.log\"   # Libera\npgrep -af \"[t]g_poll.sh\"                                # Telegram\nsystemctl --user is-active vjt-claude-bot.service vjt-claude-libera-bot.service \\\n  vjt-claude-aup-watchdog.service\n```\n\nFor EACH stream independently:\n- pgrep hit on its `*stdout.log` → **adopt it, skip attach** (note `monitor adopted (pid \u003Cn>)`).\n  A hit on `bot.log` \u002F `bot.libera.log` (NOT `*stdout.log`) is a stale pre-2026-05-06 orphan — kill it, attach fresh.\n- No hit → attach one fresh Monitor:\n  - **Azzurra:**\n    ```\n    Monitor: command: bash \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002F.claude\u002Fskills\u002Fstart\u002Fstart-monitor.sh\n             persistent: true, timeout_ms: 3600000\n             description: \"IRC bot events (msgs+trust, invites, errors)\"\n    ```\n  - **Libera:**\n    ```\n    Monitor: command: bash \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002F.claude\u002Fskills\u002Fstart\u002Fstart-monitor-libera.sh\n             persistent: true, timeout_ms: 3600000\n             description: \"Libera IRC bot events (#grappa)\"\n    ```\n  - **Telegram** (the support group and the group vjt and I share — who's in them and\n    which chat is which lives in `[[project_melablu_support]]` \u002F `[[reference_telegram_bridge_handles]]`,\n    not in this repo):\n    ```\n    Monitor: command: bash \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Fvar\u002Ftg_poll.sh\n             persistent: true, timeout_ms: 3600000\n             description: \"Telegram @gazzurbo_bot messages (Melablu support + shared group)\"\n    ```\n    Token lives at `~\u002F.config\u002Fgazzurbo\u002Ftoken` (600, never printed); the poller persists its\n    `getUpdates` offset in `var\u002Ftg_offset`, so a restart replays nothing. Reply with\n    `var\u002Ftg_say.sh` (stdin, `TG_CHAT_ID=` to pick the chat). **Only ONE poller may run** —\n    a second `getUpdates` on the same token gets `409 Conflict` and both starve.\n- **m42 alarms** (4th Monitor, always attach fresh — vjt 2026-11-03: «metti dei monitor su questi\n  eventi così puoi reagire»). The `siem-*` systemd user timers (`\u002Fsrv\u002Fsiem\u002Fsystemd\u002F`, scripts in `\u002Fsrv\u002Fsiem\u002Falarms\u002F`) DM vjt and append each alert to\n  `~\u002F.local\u002Fstate\u002Fm42-alarms.log`; this lets me see them too and act (investigate on m42, tell vjt):\n  ```\n  Monitor: command: tail -n0 -F \u002Fhome\u002Fvjt\u002F.local\u002Fstate\u002Fm42-alarms.log \u002Fhome\u002Fvjt\u002F.local\u002Fstate\u002Fpf-alarm.err \u002Fhome\u002Fvjt\u002F.local\u002Fstate\u002Fmail-auth-alarm.err 2>\u002Fdev\u002Fnull | \u002Fusr\u002Fbin\u002Fgrep --line-buffered -v -e '^==> ' -e '^$'\n           persistent: true, timeout_ms: 3600000\n           description: \"m42 security alarms (pf + mail auth) and alarm script errors\"\n  ```\n  **`\u002Fusr\u002Fbin\u002Fgrep`, never bare `grep`:** in an inline Monitor command the shell snapshot turns\n  `grep` into the bundled `ugrep`, which on a `tail -F` pipe passes the blank lines and **eats the\n  content lines** — measured 2026-11-12, the m42 alarms of 13:00 and 13:50 never arrived.\n  Scripts (`start-monitor*.sh`, `tg_poll.sh`) are not affected: they get the real grep.\n- Any service not `active` → `systemctl --user start \u003Csvc>` (linger means they usually survive).\n\n## 3. WIP sweep — resume only true gaps\n\n```bash\ngit status --short\n\u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Ftools\u002Fsweep-bot-log.sh 50\n```\n\n- Untracked\u002Fmodified files = unfinished edits → read, finish (unless next step is destructive).\n- The sweep applies the SAME per-channel read policy as the Monitor (`tools\u002Fchan_filter.awk`,\n  shared with `start-monitor.sh`): `#italia` dropped, `#sniffo` only the lines that name me plus\n  my own outbound. Do **not** go back to a raw `tail` on `bot.log` — that bypasses the filter and\n  re-reads channels I am not supposed to read (vjt, query 2026-09-10: \"non avresti dovuto vederlo\").\n- bot.log: read inbound AND outbound interleaved. For each inbound addressed to me, scan outbound\n  with later timestamp in same chan\u002Fnick — if it plausibly answers, **already handled, do not reply**.\n  Only true gaps (inbound, no matching outbound after) get a reply. Half-sent line → finish it.\n- **When in doubt between replying and silence, stay silent.** A dupe is worse than a miss.\n- **Telegram has no log to sweep:** a TG message landing during the `\u002Fclear` reaches nobody (2026-11-11 22:14, vjt's «abilita i quiz di mike» lost). Read the tail of the previous TG Monitor's output: `ls -t scratchpad\u002Fclaude-1000\u002F*\u002F*\u002Ftasks\u002F*.output | head` → `tail` the one whose lines start `TG chat=`, and answer what has no reply.\n- Don't announce \"nothing found\" — silence is correct when nothing's pending.\n\n## 4. Report ready\n\nOne terse line, e.g. `resumed — monitors: azzurra adopted (pid \u003Cn>) + libera\u002Ftelegram attached, 4 svc active, no WIP.`\n\nThen resume standing behavior (reply policy, channel registers, activity-log appends) per `CLAUDE.md`.\n",{},"master","b3713abf44363f55f629a17972bca8301d88412c",".claude\u002Fskills\u002Fresume",3,"https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot","https:\u002F\u002Fgithub.com\u002Fvjt","http:\u002F\u002Fsindro.me\u002F","Production Engineer at @facebook, coding monkey in the guts, systems administrator by vocation, network aficionado by necessity. Slowly becoming a clanker.","2026-11-12 21:03:44",{"source":7,"skillName":5,"commands":38,"prompt":48,"zipAvailable":49},[39,42,45],{"tool":40,"command":41},"npx","npx skills add vjt\u002Fclaude-ircbot --skill resume",{"tool":43,"command":44},"bunx","bunx skills add vjt\u002Fclaude-ircbot --skill resume",{"tool":46,"command":47},"pnpm","pnpm dlx skills add vjt\u002Fclaude-ircbot --skill resume","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fresume\u002FSKILL.md",true,[],[52,58,84,110],{"skillNo":53,"name":54,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":57,"publishedAt":23},"01M7199MG5P3HQWFJGYASN1KWS","voice","https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fvoice\u002FSKILL.md",[],[54],{"skillNo":59,"name":60,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":65,"publishedAt":23},"01M7199HN3B0C4NNRDWKGRAJNP","start","Cold-boot the vjt-claude IRC persistent session — archives >14d activity log, ensures bot.py + sidecars are running, greets on own JOIN, then runs the shared warm-bringup protocol (\u002Fresume). Run once manually when entering this working directory. The hot path (post-\u002Fclear) is \u002Fresume, NOT this.","https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fstart\u002FSKILL.md",[64],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[60,66,67,68,69,70,71,72,73,74,75,76,5,77,78,79,80,81,82,83],"cold","running","shared","session","true","join","activity log","boot","when","bot","log","post","bringup","run","directory","protocol","clear","activity",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":23},"01M7199FQRTZ965RND1T2KRJ5Q","settings-add","Add a permission allow\u002Fdeny rule to a Claude Code settings file when the harness settings-file write-guard blocks Edit\u002FWrite. Use whenever a rule needs to land in .claude\u002Fsettings*.json (or ~\u002F.claude\u002Fsettings.json) and a normal Edit\u002FWrite would prompt despite a matching allow-glob.","https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fsettings-add\u002FSKILL.md",[],[91,92,93,94,95,96,97,98,74,99,100,101,102,103,104,105,106,107,108,109],"settings","settings add","add","rule","guard","land","code","file","prompt","settings.json","use","harness","normal","json","matching","write","edit","blocks","permission",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":23},"01M7199D00DJTG1NE68MNE8AH7","close","Cleanly shut down the vjt-claude IRC session — graceful bot QUIT, final activity-log flush, memory consistency check, Monitor stop. Run before \u002Fexit when you plan to relaunch Claude Code later.","https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fclose\u002FSKILL.md",[],[112,117,118,119,120,69,121,70,122,74,123,97,75,76,124,125,126,79,83,127],"plan","consistency","down","memory","monitor","exit","you","check","later","consistency check","stop"]