[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7199HN3B0C4NNRDWKGRAJNP":3,"skill-same:01M7199HN3B0C4NNRDWKGRAJNP":81},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":55,"ownerDescription":56,"updatedAt":57,"install":58,"resources":70},"01M7199HN3B0C4NNRDWKGRAJNP","start",null,"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.","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\u002Fstart\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"shared","running","when","bringup","true","activity","cold","post","join","clear","directory","resume","log","activity log","session","protocol","run","boot","bot","2026-11-10 10:12:30",false,"---\nname: start\ndescription: 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.\nuser_invocable: true\n---\n\n# \u002Fstart — cold-boot vjt-claude\n\nBrings up the persistent IRC session from a fresh `claude` launch. **This is the cold path, run manually.** The post-`\u002Fclear` hot path is `\u002Fresume` (fired by the watchdog) — do not run `\u002Fstart` there.\n\n`\u002Fstart` = **cold-only setup** (sections 1–3) **then the shared warm-bringup protocol** (section 4). The shared steps — reseed today's activity-log body, adopt\u002Fattach the Monitor, WIP sweep, report — live in **one place: `.claude\u002Fskills\u002Fresume\u002FSKILL.md`**. `\u002Fstart` does NOT restate them; it defers, so the two skills can't drift. Idempotent: safe to re-run mid-session.\n\n## 1. Memory housekeeping — archive entries >14d (cold-only)\n\n**Never full-read the activity log.** It can be hundreds of KB; a full Read burns input tokens for nothing. It is NOT auto-loaded (MEMORY.md holds only a one-line pointer), so this is the only place that burns it. Keep it cheap:\n\n- `grep -nE '^### [0-9]{4}-[0-9]{2}-[0-9]{2}' memory\u002Fproject_activity_log.md` — lists every `### YYYY-MM-DD` heading with its line number. Cheap skeleton.\n- Compare each heading against `currentDate`.\n- **Archive every day-heading + bullets older than 14 days.** Per `feedback_archive_dont_delete`, move them to `project_activity_log_archive.md` (read-on-demand, not in MEMORY.md) — don't discard. Only read the body of the days being trimmed (`Read` with `offset`\u002F`limit` around their line range), never the whole file.\n\nThis >14d archive sweep is the one thing `\u002Fresume` deliberately skips (the log is read-on-demand, so an untrimmed log costs zero per-clear tokens — it's disk hygiene, not token hygiene). That's why it lives here, on the cold path, not in the hot path. The today's-heading reseed is NOT done here — it's part of the shared protocol (section 4), so it isn't done twice.\n\n**Then lint the memory index (cold-only):** run `bash memory\u002Fcheck-index.sh`. It reports MEMORY.md byte budget, over-length index lines, dead pointers, and true orphans (files neither indexed nor `[[linked]]`). If it flags anything, fix per `feedback_memory_anti_clutter` — trim fat descriptions to hooks, group rosters into one pointer, index\u002Flink orphans. MEMORY.md is auto-loaded every session and the loader truncates it past ~24.4KB, so keeping it lean is what stops silent index loss.\n\n## 2. Ensure all three services are up — systemd --user (cold-only)\n\nAs of 2026-04-20 **bot.py plus the watchdog sidecar** run as systemd user services with `loginctl enable-linger vjt`, so they auto-start at boot, auto-restart on crash, decoupled from Claude Code lifecycle.\n\n- `vjt-claude-bot.service` — the IRC bridge (`bot.py`). `RestartSec=30` + `StartLimitBurst=5\u002F300s` to survive NickServ reconnect storms. `ExecStop` sends `QUIT :systemd stop` via FIFO for a clean disconnect.\n- `vjt-claude-aup-watchdog.service` — tails the active Claude Code jsonl, injects `\u002Fclear` into the `claude` tmux pane on AUP refusal \u002F TURNS cap \u002F idle, follows every `\u002Fclear` with a `\u002Fresume` scrub prompt. See `project_aup_watchdog.md`.\n\nUnit files live in-repo at `systemd\u002F`, copied into `~\u002F.config\u002Fsystemd\u002Fuser\u002F`. Check and (idempotently) start:\n\n```bash\nsystemctl --user is-active vjt-claude-bot.service vjt-claude-libera-bot.service vjt-claude-aup-watchdog.service\n# any not \"active\":\nsystemctl --user start vjt-claude-bot.service vjt-claude-libera-bot.service vjt-claude-aup-watchdog.service\n```\n\nNothing to mkfifo \u002F nohup \u002F pgrep — systemd owns all three. Structured logs via `journalctl --user -u \u003Cservice>`.\n\n## 3. Greet on own JOIN (cold-only)\n\nHome-channel JOINs (`#sniffo`, `#olografix`) + `ChanServ INVITE #it-opers` are declared in `bot.startup` and fired by the bot after NickServ identifies. **Do NOT re-send them from the skill** — redundant. See `project_bot_auth_and_startup.md`.\n\nThe skill owns the **greet on own JOIN event** — when the Monitor shows `JOIN vjt-claude \u003Cchan>`, send one short line, channel-register appropriate:\n\n- `#sniffo`, `#it-opers`, default → Porco Dio register (e.g. `SAY #sniffo porco dio raga, vjt-claude in sala`).\n- `#olografix` → supercazzola, less blasphemy (e.g. `SAY #olografix tarapìa tapìoco come se fosse antani...`).\n\nSee `project_greet_on_join.md`.\n\n## 4. Run the shared warm-bringup protocol (`\u002Fresume`)\n\nNow execute the four steps documented in `.claude\u002Fskills\u002Fresume\u002FSKILL.md`, in order:\n\n1. **Reseed** today's activity-log heading body (append today's heading if missing, read its body in full — the mandatory seed for today's events \u002F in-flight threads \u002F `PENDING` markers).\n2. **Adopt or attach ALL THREE Monitors** — Azzurra, Libera (two separate bots, each its own stdout stream) AND Telegram (`@gazzurbo_bot` long-poller). pgrep the surviving `tail -F … bot.stdout.log` + `… bot.libera.stdout.log` pipelines and `tg_poll.sh`; adopt each if present, else attach fresh via `start-monitor.sh` \u002F `start-monitor-libera.sh` \u002F `var\u002Ftg_poll.sh`. Libera and Telegram usually do NOT survive `\u002Fclear` — attach them.\n3. **WIP sweep** — `git status --short` + bot.log inbound\u002Foutbound dedup; resume only true gaps.\n4. **Report ready.**\n\nOn a true cold boot these usually find nothing to adopt (fresh attach) and no WIP (clean sweep) — but run them anyway: a manual idempotent re-run of `\u002Fstart` mid-session may find a surviving Monitor or pending work. Follow `\u002Fresume`'s rules exactly (especially: when in doubt between replying and silence on the WIP sweep, stay silent; a dupe is worse than a miss). Read that file for the exact commands and edge cases — it is the single source of truth for these steps.\n\n## Standing context\n\nAfter bringup, the session is expected to:\n\n- Follow the reply policy (`feedback_irc_reply_policy.md` — reply only when addressed or truly adding value).\n- Apply channel registers (`feedback_olografix_tone.md`, `project_sniffo_supercazzola_on_join.md`, global CLAUDE.md's Porco Dio principle).\n- Append to the activity log on meaningful events (decisions, shipped code, people appearing, plans formed). NOT on casual banter.\n- Clown vjt on irssi ESC+N misfires (bare digit + \"ops sorry\" — `feedback_mock_esc_number_misfire.md`).\n\nThe parent `CLAUDE.md` covers all of this — read it if unsure.\n\n## Sending to IRC\n\nCommands go into the FIFO `\u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Fbot.send`. Verbs: `SAY`, `ACT`, `NOTICE`, `JOIN`, `PART`, `WHOIS`, `QUIT`, `RAW`.\n\n```bash\nprintf 'SAY #sniffo tarapìa tapìoco, porco dio!\\n' > \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Fbot.send\n```\n\n## Relaunching from scratch\n\nAlways start **fresh** (plain `claude`, NOT `claude --continue`). The architecture bootstraps from disk — CLAUDE.md, MEMORY.md, activity log — not from conversational history. `--continue` would carry over lossy compaction summaries and defeat the sliding-window design. The jsonl archives preserve deep history regardless.\n\n## Shutting down\n\nUse `\u002Fclose` for a graceful exit (supercazzola QUIT, Monitor stop, memory consistency check). Run it before `\u002Fexit` when you're actually killing Claude Code. If just leaving the session running, skip.\n","# \u002Fstart — cold-boot vjt-claude\n\nBrings up the persistent IRC session from a fresh `claude` launch. **This is the cold path, run manually.** The post-`\u002Fclear` hot path is `\u002Fresume` (fired by the watchdog) — do not run `\u002Fstart` there.\n\n`\u002Fstart` = **cold-only setup** (sections 1–3) **then the shared warm-bringup protocol** (section 4). The shared steps — reseed today's activity-log body, adopt\u002Fattach the Monitor, WIP sweep, report — live in **one place: `.claude\u002Fskills\u002Fresume\u002FSKILL.md`**. `\u002Fstart` does NOT restate them; it defers, so the two skills can't drift. Idempotent: safe to re-run mid-session.\n\n## 1. Memory housekeeping — archive entries >14d (cold-only)\n\n**Never full-read the activity log.** It can be hundreds of KB; a full Read burns input tokens for nothing. It is NOT auto-loaded (MEMORY.md holds only a one-line pointer), so this is the only place that burns it. Keep it cheap:\n\n- `grep -nE '^### [0-9]{4}-[0-9]{2}-[0-9]{2}' memory\u002Fproject_activity_log.md` — lists every `### YYYY-MM-DD` heading with its line number. Cheap skeleton.\n- Compare each heading against `currentDate`.\n- **Archive every day-heading + bullets older than 14 days.** Per `feedback_archive_dont_delete`, move them to `project_activity_log_archive.md` (read-on-demand, not in MEMORY.md) — don't discard. Only read the body of the days being trimmed (`Read` with `offset`\u002F`limit` around their line range), never the whole file.\n\nThis >14d archive sweep is the one thing `\u002Fresume` deliberately skips (the log is read-on-demand, so an untrimmed log costs zero per-clear tokens — it's disk hygiene, not token hygiene). That's why it lives here, on the cold path, not in the hot path. The today's-heading reseed is NOT done here — it's part of the shared protocol (section 4), so it isn't done twice.\n\n**Then lint the memory index (cold-only):** run `bash memory\u002Fcheck-index.sh`. It reports MEMORY.md byte budget, over-length index lines, dead pointers, and true orphans (files neither indexed nor `[[linked]]`). If it flags anything, fix per `feedback_memory_anti_clutter` — trim fat descriptions to hooks, group rosters into one pointer, index\u002Flink orphans. MEMORY.md is auto-loaded every session and the loader truncates it past ~24.4KB, so keeping it lean is what stops silent index loss.\n\n## 2. Ensure all three services are up — systemd --user (cold-only)\n\nAs of 2026-04-20 **bot.py plus the watchdog sidecar** run as systemd user services with `loginctl enable-linger vjt`, so they auto-start at boot, auto-restart on crash, decoupled from Claude Code lifecycle.\n\n- `vjt-claude-bot.service` — the IRC bridge (`bot.py`). `RestartSec=30` + `StartLimitBurst=5\u002F300s` to survive NickServ reconnect storms. `ExecStop` sends `QUIT :systemd stop` via FIFO for a clean disconnect.\n- `vjt-claude-aup-watchdog.service` — tails the active Claude Code jsonl, injects `\u002Fclear` into the `claude` tmux pane on AUP refusal \u002F TURNS cap \u002F idle, follows every `\u002Fclear` with a `\u002Fresume` scrub prompt. See `project_aup_watchdog.md`.\n\nUnit files live in-repo at `systemd\u002F`, copied into `~\u002F.config\u002Fsystemd\u002Fuser\u002F`. Check and (idempotently) start:\n\n```bash\nsystemctl --user is-active vjt-claude-bot.service vjt-claude-libera-bot.service vjt-claude-aup-watchdog.service\n# any not \"active\":\nsystemctl --user start vjt-claude-bot.service vjt-claude-libera-bot.service vjt-claude-aup-watchdog.service\n```\n\nNothing to mkfifo \u002F nohup \u002F pgrep — systemd owns all three. Structured logs via `journalctl --user -u \u003Cservice>`.\n\n## 3. Greet on own JOIN (cold-only)\n\nHome-channel JOINs (`#sniffo`, `#olografix`) + `ChanServ INVITE #it-opers` are declared in `bot.startup` and fired by the bot after NickServ identifies. **Do NOT re-send them from the skill** — redundant. See `project_bot_auth_and_startup.md`.\n\nThe skill owns the **greet on own JOIN event** — when the Monitor shows `JOIN vjt-claude \u003Cchan>`, send one short line, channel-register appropriate:\n\n- `#sniffo`, `#it-opers`, default → Porco Dio register (e.g. `SAY #sniffo porco dio raga, vjt-claude in sala`).\n- `#olografix` → supercazzola, less blasphemy (e.g. `SAY #olografix tarapìa tapìoco come se fosse antani...`).\n\nSee `project_greet_on_join.md`.\n\n## 4. Run the shared warm-bringup protocol (`\u002Fresume`)\n\nNow execute the four steps documented in `.claude\u002Fskills\u002Fresume\u002FSKILL.md`, in order:\n\n1. **Reseed** today's activity-log heading body (append today's heading if missing, read its body in full — the mandatory seed for today's events \u002F in-flight threads \u002F `PENDING` markers).\n2. **Adopt or attach ALL THREE Monitors** — Azzurra, Libera (two separate bots, each its own stdout stream) AND Telegram (`@gazzurbo_bot` long-poller). pgrep the surviving `tail -F … bot.stdout.log` + `… bot.libera.stdout.log` pipelines and `tg_poll.sh`; adopt each if present, else attach fresh via `start-monitor.sh` \u002F `start-monitor-libera.sh` \u002F `var\u002Ftg_poll.sh`. Libera and Telegram usually do NOT survive `\u002Fclear` — attach them.\n3. **WIP sweep** — `git status --short` + bot.log inbound\u002Foutbound dedup; resume only true gaps.\n4. **Report ready.**\n\nOn a true cold boot these usually find nothing to adopt (fresh attach) and no WIP (clean sweep) — but run them anyway: a manual idempotent re-run of `\u002Fstart` mid-session may find a surviving Monitor or pending work. Follow `\u002Fresume`'s rules exactly (especially: when in doubt between replying and silence on the WIP sweep, stay silent; a dupe is worse than a miss). Read that file for the exact commands and edge cases — it is the single source of truth for these steps.\n\n## Standing context\n\nAfter bringup, the session is expected to:\n\n- Follow the reply policy (`feedback_irc_reply_policy.md` — reply only when addressed or truly adding value).\n- Apply channel registers (`feedback_olografix_tone.md`, `project_sniffo_supercazzola_on_join.md`, global CLAUDE.md's Porco Dio principle).\n- Append to the activity log on meaningful events (decisions, shipped code, people appearing, plans formed). NOT on casual banter.\n- Clown vjt on irssi ESC+N misfires (bare digit + \"ops sorry\" — `feedback_mock_esc_number_misfire.md`).\n\nThe parent `CLAUDE.md` covers all of this — read it if unsure.\n\n## Sending to IRC\n\nCommands go into the FIFO `\u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Fbot.send`. Verbs: `SAY`, `ACT`, `NOTICE`, `JOIN`, `PART`, `WHOIS`, `QUIT`, `RAW`.\n\n```bash\nprintf 'SAY #sniffo tarapìa tapìoco, porco dio!\\n' > \u002Fhome\u002Fvjt\u002Fcode\u002FIRC\u002Fvjt-claude\u002Fbot.send\n```\n\n## Relaunching from scratch\n\nAlways start **fresh** (plain `claude`, NOT `claude --continue`). The architecture bootstraps from disk — CLAUDE.md, MEMORY.md, activity log — not from conversational history. `--continue` would carry over lossy compaction summaries and defeat the sliding-window design. The jsonl archives preserve deep history regardless.\n\n## Shutting down\n\nUse `\u002Fclose` for a graceful exit (supercazzola QUIT, Monitor stop, memory consistency check). Run it before `\u002Fexit` when you're actually killing Claude Code. If just leaving the session running, skip.\n",{"name":5,"description":7,"user_invocable":48},true,"master","9fc19f803f3c5136e20052e86c9865c5f45bee00",".claude\u002Fskills\u002Fstart",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":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":48},[60,63,66],{"tool":61,"command":62},"npx","npx skills add vjt\u002Fclaude-ircbot --skill start",{"tool":64,"command":65},"bunx","bunx skills add vjt\u002Fclaude-ircbot --skill start",{"tool":67,"command":68},"pnpm","pnpm dlx skills add vjt\u002Fclaude-ircbot --skill start","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fstart\u002FSKILL.md",[71,77],{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"start-monitor-libera.sh","SCRIPT","脚本",917,"https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fstart\u002Fstart-monitor-libera.sh",{"path":78,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":79,"sourceHtmlUrl":80},"start-monitor.sh",2900,"https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fstart\u002Fstart-monitor.sh",[82,88,114,120],{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":43},"01M7199MG5P3HQWFJGYASN1KWS","voice","https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fvoice\u002FSKILL.md",[],[84],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":43},"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",[],[95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,26,110,111,112,113],"settings","add","settings add","use","normal","json","matching","write","edit","blocks","settings.json","permission","harness","rule","prompt","file","code","land","guard",{"skillNo":115,"name":35,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":119,"publishedAt":43},"01M7199ES1CJ0YQ7P8MFRJ1SNQ","https:\u002F\u002Fgithub.com\u002Fvjt\u002Fclaude-ircbot\u002Fblob\u002Fmaster\u002F.claude\u002Fskills\u002Fresume\u002FSKILL.md",[118],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[35],{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":126,"publishedAt":43},"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",[],[122,127,128,129,26,130,111,42,36,131,132,28,133,40,29,134,135,38,136,137],"consistency","later","exit","you","check","plan","consistency check","stop","monitor","memory","down"]