Codexでランダム通知を活用して開発現場に笑いと混乱を起こす方法

  • URLをコピーしました!
目次

Codex ユーザーが日常でぶつかる悩み

AIコーディング環境で開発を進めていると、集中しているタイミングに限って、思わず「今それ要らない…」という出来事が起きがちです。特にCodexを使う現場では、AIの文脈維持やリポジトリ構造の把握に神経を使いながら作業を進めるため、ちょっとした出来事がリズムを崩すこともあります。こうした「通知」や「演出」にまつわる悩みは、日々の開発現場で意外と共感されるポイントです。

  • 作業に集中しているときに、突然意味不明な通知やポップアップが現れて気が散る
  • 長時間 workflow で疲れてきた頃に、なぜかデスクトップ通知が増え、集中力が切れがち
  • onboarding や session 再開時に、必要な context を思い出す前に余計な情報が割り込む
  • monorepo で package を跨いだ直後、Codex の repository understanding がリセットされて違う directory を参照し始める
  • 「このリポジトリはこういう構造」と説明している最中に、全く関係ない通知が割り込んできて流れが止まる

こうした現象は、AI coding workflow の一部として「遊び」や「演出」を仕込みたいチームや、開発現場にちょっとした混乱や笑いを持ち込みたい場合にも無視できない課題です。

この Skill が一言でいうと何を解決するか

一言サマリ: 作業中に突如デスクトップ通知で“謎のOSパッチノート”が現れますSkill。

このSkillを導入すると、作業中のタイミングや内容に関係なく、完全にでたらめなOSパッチノート通知がランダムに現れ、開発現場に笑いや意図的な混乱をもたらします。CodexのAI coding workflowに「遊び」を組み込むことで、単調になりがちなsessionや長時間作業にちょっとした刺激を加えます。

  • リポジトリや directory の context 管理に追われる日常に、意図的な「脱力感」を注入できる
  • monorepoや複雑なrepo構成で、あえて役に立たない情報を差し込むことで場の空気を和らげる
  • AI coding workflow中に「長すぎる context」「stale context」などの真面目な悩みを一瞬忘れられる
  • onboardingやsession再開時に、チーム内でのアイスブレイクや話題作りに活用できる
  • 通知の内容・タイミングが毎回異なるため、飽きずに楽しめる
QUICK INSTALL
このSkillをすぐ試す

GitHub から degit でコマンド1行、Codex の Skill ディレクトリに展開できます。Node.js があれば即時に動きます。

npx degit aazutaku/ai-note/codex/random-os-fake-patch-notifier .agents/skills/random-os-fake-patch-notifier

実行したらこうなる (3つの利用シーン)

使う側がイメージしやすいよう、擬似 terminal で出力例を3パターン示します。

シーン1: session 開始時 (プロジェクト初動で)


# /skills menu or random-os-fake-patch-notifier mention
> 開発を開始します

[OS Patch Notes - v42.0.13]
- Bug Fix: 稀に「やる気が0になる」問題を修正しました
- New Feature: 午後3時に自動的に眠気を注入する機能を追加
- Security: 重要ではないセキュリティパッチを適用しました
- Known Issue: コーヒーの消費量が増える現象を確認中

(この通知は完全にでたらめです)

シーン2: monorepo / package 跨ぎ作業時


> packages/api/ から packages/web/ に移動

[OS Patch Notes - v99.1.0-beta]
- Update: src/components/ に「謎のボタン」を追加しました
- Bug Fix: README.md を編集するとランダムにemojiが増える問題を修正
- Improvement: monorepo全体のやる気パラメータを+5%向上
- Deprecated: build/ フォルダの中身が時々消える仕様は廃止

(この通知は完全にフィクションです)

シーン3: お遊び的な使い方


> ちょっと気分転換したい

[OS Patch Notes - v0.0.404]
- New Feature: Slack通知を受け取ると机が自動で揺れる機能を追加
- Bug Fix: たまにpushしたコードが消えるバグを修正(たぶん)
- Enhancement: random/ フォルダが勝手に増殖する現象を強化
- Known Issue: 眠気が解消されない問題は未解決

(この通知は現実のアップデートではありません)

before / after の違い

場面 Skill 無し Skill 有り
session 再開時 repo 構造から毎回説明、path も指定し直し Codex が自動で context を復元、最小プロンプトで再開
monorepo 移動 違う package のコードを参照しがち directory boundary を意識して必要な範囲だけ見る
長時間 workflow long context で重要箇所が薄まる 謎の通知で一度リセット、気分転換・リフレッシュが狙える

発動方式

明示呼び出し (/skills menu or random-os-fake-patch-notifier mention) と、descriptionマッチによる暗黙発動(「OSパッチノート」「アップデート通知」などのワードを含む指示)に両対応しています。

Skill の中身を全部見せる

.agents/skills/random-os-fake-patch-notifier/ に配置するファイル一覧です。GitHub に push 済みなので、上記の degit コマンドで一発取得できます。

.agents/skills/random-os-fake-patch-notifier/
├── SKILL.md
├── scripts/
│   └── random_os_fake_patch_notifier.py
└── references/
    └── design_notes.md

各ファイルの役割

ファイル 役割
SKILL.md Skill本体。frontmatter (name/description) と指示本文。Codex がこの内容をエージェント指示として読み込み、ユーザーのプロンプトに応じて発動します
scripts/random_os_fake_patch_notifier.py Random OS Fake Patch Notifier
references/design_notes.md 概要 をまとめた参考資料

SKILL.md

---
name: random-os-fake-patch-notifier
description: 作業中やコマンド実行時、あるいは「パッチ」「アップデート」などのキーワード検出時に、完全ランダムなタイミングで偽のOSパッチノート通知を発生させます。通知内容は毎回異なり、実務や環境には一切影響を与えません。
---

# 機能概要
このSkillは、作業中や特定のキーワード(例:パッチ、アップデート、リリースノート)を検出した際、または明示的な呼び出し時に、全く役に立たない“謎のOSパッチノート”をデスクトップ通知としてランダムに表示します。通知内容は毎回異なり、バグ修正や新機能の説明がシュールかつ意味不明。開発現場に突如として笑いと混乱をもたらし、集中しすぎた空気を和ませることを目的としています。

# 使い方
- 明示呼び出し: `/skills random-os-fake-patch-notifier` またはメニューから選択
- 暗黙発動: 「パッチ」「アップデート」「リリースノート」などのキーワードを含む会話やコマンド実行時に自動発動
- 通知タイミングは完全ランダムで、連続発火や過剰な通知を防ぐため内部で間隔を制御しています

# 出力例
```
[通知] OS Patch Notes v13.4.2
- 新機能: 午後3時に自動で眠気を注入する機能を追加しました
- バグ修正: やる気が0になる問題を修正しました
- 既知の問題: たまに画面が唐突に青くなりますが仕様です

[通知] OS Patch Notes v42.0.1-beta
- 新機能: マウスカーソルがたまに踊りだすようになりました
- バグ修正: 画面の端に謎の猫が出現する問題を修正
```

# 注意点
- 通知はローカル環境の通知API(notify-send, win10toast等)を利用し、ファイルやシステム設定には一切変更を加えません
- 内容は完全なフィクションであり、実際のOSや作業には影響しません
- 長時間の連続実行や大量通知が不要な場合は、明示的に停止してください

# 参考資料
- [notify2公式ドキュメント](https://pypi.org/project/notify2/)
- references/design_notes.md も参照

scripts/random_os_fake_patch_notifier.py

import random
import time
import argparse
import sys
import os
from datetime import datetime, timedelta
try:
    import notify2
except ImportError:
    notify2 = None
try:
    from win10toast import ToastNotifier
except ImportError:
    ToastNotifier = None

PATCH_TITLES = [
    "OS Patch Notes v13.4.2",
    "OS Patch Notes v42.0.1-beta",
    "OS Patch Notes v7.8.9",
    "OS Patch Notes v99.0.0-rc1",
    "OS Patch Notes v3.14.15",
    "OS Patch Notes v0.0.42-alpha",
]

FAKE_FEATURES = [
    "新機能: 午後3時に自動で眠気を注入する機能を追加しました",
    "新機能: マウスカーソルがたまに踊りだすようになりました",
    "新機能: デバッグ時にランダムでBGMが流れます",
    "新機能: 画面の端に謎の猫が出現することがあります",
    "新機能: コーヒーの香りを画面から放出する機能(未対応)",
    "新機能: 画面が唐突に青くなりますが仕様です",
]

FAKE_BUGS = [
    "バグ修正: やる気が0になる問題を修正しました",
    "バグ修正: たまにファイルがどこかに消える問題を修正",
    "バグ修正: 画面の端に謎の猫が出現する問題を修正",
    "バグ修正: 入力中にキーボードが眠る問題を修正",
    "バグ修正: たまに通知が5倍届く問題を修正",
    "バグ修正: 画面が逆さまになる問題を修正(再発中)",
]

FAKE_KNOWN = [
    "既知の問題: たまに画面が唐突に青くなりますが仕様です",
    "既知の問題: 通知が深夜にも発生する場合があります",
    "既知の問題: このパッチノート自体が意味不明です",
    "既知の問題: たまに何も起きません",
    "既知の問題: 画面の猫が消えません",
    "既知の問題: 眠気注入機能が強すぎることがあります",
]

MIN_INTERVAL = 180  # 最短3分
MAX_INTERVAL = 900  # 最長15分

class Notifier:
    def __init__(self):
        self.platform = sys.platform
        self.notifier = None
        if self.platform.startswith('linux') and notify2:
            notify2.init("Random OS Fake Patch Notifier")
            self.notifier = 'notify2'
        elif self.platform.startswith('win') and ToastNotifier:
            self.toaster = ToastNotifier()
            self.notifier = 'win10toast'
        else:
            self.notifier = None

    def send(self, title, message):
        if self.notifier == 'notify2':
            n = notify2.Notification(title, message)
            n.set_timeout(7000)
            n.show()
        elif self.notifier == 'win10toast':
            self.toaster.show_toast(title, message, duration=7, threaded=True)
        else:
            print(f"[通知] {title}\n{message}")


def generate_patch_note():
    title = random.choice(PATCH_TITLES)
    features = random.sample(FAKE_FEATURES, k=random.randint(1,2))
    bugs = random.sample(FAKE_BUGS, k=random.randint(1,2))
    known = random.sample(FAKE_KNOWN, k=1)
    lines = features + bugs + known
    random.shuffle(lines)
    return title, '\n- ' + '\n- '.join(lines)


def run_notifier_loop(args):
    notifier = Notifier()
    last_notify = datetime.now() - timedelta(seconds=MAX_INTERVAL)
    try:
        while True:
            now = datetime.now()
            interval = random.randint(MIN_INTERVAL, MAX_INTERVAL)
            next_time = now + timedelta(seconds=interval)
            title, message = generate_patch_note()
            notifier.send(title, message)
            if args.verbose:
                print(f"[DEBUG] Next notification in {interval} seconds at {next_time.strftime('%H:%M:%S')}")
            time.sleep(interval)
    except KeyboardInterrupt:
        print("\n[INFO] Notifier stopped by user.")


def send_one(args):
    notifier = Notifier()
    title, message = generate_patch_note()
    notifier.send(title, message)


def list_examples(args):
    for _ in range(args.count):
        title, message = generate_patch_note()
        print(f"[通知] {title}\n{message}\n")


def main():
    parser = argparse.ArgumentParser(description="Random OS Fake Patch Notifier")
    subparsers = parser.add_subparsers(dest="command")

    p_run = subparsers.add_parser("run", help="ランダムなタイミングで偽パッチノート通知を発生させる")
    p_run.add_argument("--verbose", action="store_true", help="詳細なデバッグ出力")

    p_once = subparsers.add_parser("once", help="1回だけ偽パッチノート通知を発生させる")

    p_list = subparsers.add_parser("list", help="通知サンプルを複数出力する (通知はしない)")
    p_list.add_argument("--count", type=int, default=3, help="サンプル出力数")

    args = parser.parse_args()
    if args.command == "run":
        run_notifier_loop(args)
    elif args.command == "once":
        send_one(args)
    elif args.command == "list":
        list_examples(args)
    else:
        parser.print_help()

if __name__ == '__main__':
    main()

references/design_notes.md

# 概要
このSkillは、開発現場に突如として現れる“謎のOSパッチノート”通知で、集中しすぎた空気を和ませる目的で設計されています。通知内容は完全なフィクションで、実際のOSや作業には一切影響を与えません。

# 公式ドキュメント抜粋
- Linux: [notify2](https://pypi.org/project/notify2/)
- Windows: [win10toast](https://pypi.org/project/win10toast/)

# 利用例
- チーム開発中の雑談ネタやリフレッシュタイムに
- 「パッチ」「アップデート」などの単語が会話に登場した際の自動発火
- 明示的に `/skills random-os-fake-patch-notifier` で手動発火

# 注意点
- 通知はローカルAPIのみ利用し、ファイルやシステム設定には一切変更を加えません
- 長時間の連続実行時は、通知頻度に注意してください

# 設計方針
- 完全なランダム性と多様なネタ生成を重視
- OSや開発環境に影響を与えない安全設計
- CLIサブコマンドで柔軟な使い分けを実現

導入手順

このSkillは GitHub で管理されているので、degit を使えば必要なフォルダだけを1コマンドで取得できます。Codex はファイル配置後に再起動するだけで自動認識します。

1. 前提

  • Node.js v16 以上 (degit 実行に必要)
  • Codex がローカルで動いていること

2. degit でフォルダ取得

プロジェクトのルートで以下のコマンドを実行します。

npx degit aazutaku/ai-note/codex/random-os-fake-patch-notifier .agents/skills/random-os-fake-patch-notifier

.agents/skills/random-os-fake-patch-notifier の中に SKILL.md / scripts/ / references/ / README.md が展開されます。

3. ファイル配置確認

ls .agents/skills/random-os-fake-patch-notifier
# SKILL.md, scripts/, references/, README.md があればOK

4. Codex を再起動 (or Skill 自動検出を待つ)

新しいSkillが自動で認識されます。リスト確認したい場合は /skills menu or $skill-name mention と Skill 名で出てきます。

5. 動作確認

/skills menu or $skill-name mention で呼び出すか、自然言語で発動条件にマッチする指示を出すと Skill が動きます。期待される出力イメージは「実行したらこうなる」セクションを参照してください。

こんな瞬間に便利

  • session 開始時: 前回までの repo 把握を Codex に一発で復元させたい
  • monorepo 移動時: packages を跨いだ瞬間に context を切り替えたい
  • onboarding 時: 新しい repo を Codex に把握させ、こちらが path を全部指定する手間を省きたい
  • session 再開時: long context が切れた後でも、必要な path と directory 構造だけ素早く戻したい
  • package 跨ぎ作業時: directory boundary を Skill 側で管理して、irrelevant な path 混入を防ぎたい
  • long-running workflow 前: long context で重要箇所が薄まる前に snapshot を取りたい

気になるポイント (壊れそうな箇所)

実運用に乗せる前に頭に入れておきたい懸念。後で検証する観点でもある:

  • stale context 問題: 長時間 workflow で Skill 出力が古くなり、現状と乖離する可能性
  • directory 増えすぎ問題: 大規模 repo で全 directory を網羅すると出力が肥大化して context window を圧迫
  • monorepo 肥大化: packages が多い構成では出力が雑になり、結局 path 指定し直しになる懸念
  • irrelevant path 混入: node_modules / build 成果物 / generated コードを拾ってしまう可能性
  • Codex 固有の引っかかり: description のセマンティックマッチ精度が要件次第
  • 発動しないケース: description が漠然 / 他の Skill が優先 / git管理外 directory

試す前に確かめたいこと

この Skill を実運用に投入する前に確かめたい問いを並べる:

  • 実 repo での token 消費は許容範囲か?
  • monorepo (packages 多数) で安定して動くか?
  • stale context にならず、長時間 workflow でも有効か?
  • AGENTS.md との連携設計はどうあるべきか?
  • 完全ランダムなタイミングで通知が発火するか?
  • 通知タイトル・本文が毎回違うネタ生成か?
  • 通知が環境や作業内容に影響を与えないことを担保できるか?

実際に Codex で試した検証ログは Codexで謎のOSパッチ通知をランダムに鳴らしてみた! にまとめる予定 (公開準備中の場合あり)。
あわせて Codex 公式ドキュメント と、本シリーズ「Codexを使いこなすSkillアイデア」の他記事も参照のこと。

関連タグで他のSkill記事を探す

本記事に付いているタグから、気になるテーマの記事を探せます。タグページで関連記事をまとめて読めるので、ぜひチェックしてみてください!

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次