# 非機能要件定義書

## 概要

本ドキュメントは、Doom Emacs（バージョン 3.0.0-pre）の非機能要件を定義するものである。Doom Emacsは、GNU Emacsの設定フレームワークであり、パフォーマンス、安定性、再現性を重視して設計されている。本プロジェクトはEmacs Lispで実装されたデスクトップアプリケーション設定フレームワークであり、クライアントサイドで動作する。

## 性能要件

### レスポンスタイム

| 処理種別 | 目標値 | 備考 |
| --- | --- | --- |
| 起動時間 | 可能な限り高速化 | `gcmh-mode`によるGC最適化、遅延読み込みにより起動時間を最小化 |
| ファイルオープン | 即時応答 | 大規模ファイル（1MB以上）の場合は`so-long-mode`で最適化 |
| バッファ切替 | 即時応答 | `doom-switch-buffer-hook`実行時にGCを抑制 |
| ウィンドウ切替 | 即時応答 | `doom-switch-window-hook`実行時にGCを抑制 |
| フレームフォーカス変更 | 2.0秒のデバウンス | `doom-switch-frame-hook-debounce-delay`で制御 |

### スループット

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| プロセス読み取りバッファ | 64KB | `read-process-output-max`で設定、LSPモジュール等でさらに増加可能 |
| Windows IPC パイプバッファ | 64KB | `w32-pipe-buffer-size`で設定 |
| インクリメンタルローディング間隔 | 0.75秒 | `doom-incremental-idle-timer`で設定 |
| 初回インクリメンタルローディング待機 | 2.0秒（デーモン時0秒） | `doom-incremental-first-idle-timer`で設定 |

### ガベージコレクション最適化

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| GC閾値（起動時・CLI） | 128MB | `gc-cons-threshold`でCLI用に設定 |
| GC閾値（インタラクティブ起動時） | most-positive-fixnum | 起動中のGCを完全に抑制 |
| GC閾値（通常実行時） | 16MB | `doom-finalize`で設定（gcmh未使用時） |
| gcmh高GC閾値 | 64MB | `gcmh-high-cons-threshold`で設定 |
| gcmhアイドル遅延 | 自動（ファクター10） | `gcmh-idle-delay`および`gcmh-auto-idle-delay-factor` |
| フック実行時GC閾値 | most-positive-fixnum | バッファ/ウィンドウ/フレーム切替時に一時的に設定 |

## 可用性要件

| 項目 | 目標値 | 備考 |
| --- | --- | --- |
| サポートEmacs バージョン | 27.1 - 30.2（30.2推奨） | コアは27.1+、モジュールは28.1+、tree-sitterは29.1+ |
| サポートOS | macOS, Linux, Windows, BSD, WSL | `doom-system`で自動検出 |
| デーモンモード | 対応 | `daemonp`で検出し、最適化を適用 |
| プロファイル機能 | 対応 | 複数プロファイルの切り替えとバージョン管理が可能 |
| 自動リカバリ | オートセーブ機能有効 | `auto-save-default`がt、大規模削除も保存対象 |
| バックアップ | 無効（デフォルト） | VCS使用を推奨、有効時は5世代保持 |
| バッファ自動リバート | 対応 | ファイル保存時・バッファ/ウィンドウ切替時・フレームフォーカス時 |

## セキュリティ要件

### TLS/SSL設定

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| TLS証明書検証 | 有効（非対話モード時） | `gnutls-verify-error`がt |
| 最小TLSバージョン | TLS 1.2 | SSL3, TLS1.0, TLS1.1は無効 |
| TLS 1.3サポート | 条件付き有効 | libgnutls 3.6.5以上かつ非Windows環境 |
| 最小プライムビット | 3072ビット | keylength.comの推奨に基づく |
| 信頼チェック | 有効 | `tls-checktrust`がt |
| 暗号スイート優先度 | SECURE128+SECURE192 | 強力な暗号スイートを優先 |

### TLSプログラム設定

```
優先順位:
1. openssl s_client（SSL3/TLS1.0/TLS1.1無効）
2. gnutls-cli（SECURE192+SECURE128、OCSP有効、strict-tofu）
3. gnutls-cli（フォールバック）
```

### ファイルシステムセキュリティ

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| ロックファイル | 無効 | `create-lockfiles`がnil |
| サーバー認証ディレクトリ | $EMACSDIR/server/ | `server-auth-dir`で設定 |
| ディレクトリ作成パーミッション | 0700 | 自動作成ディレクトリに適用 |

## 拡張性要件

### モジュールシステム

| 項目 | 内容 |
| --- | --- |
| モジュール構造 | 2階層構造（グループ/モジュール名） |
| モジュール読み込みパス | `doom-module-load-path`で設定可能 |
| モジュールファイル | init.el（早期初期化）、config.el（設定）、packages.el（パッケージ定義） |
| フラグシステム | +/-プレフィックスによるオプション制御 |
| モジュール間依存 | `after!`マクロによる遅延評価 |

### パッケージ管理

| 項目 | 内容 |
| --- | --- |
| パッケージマネージャ | straight.el（将来Elpacaへ移行予定） |
| パッケージソース | MELPA, ELPA, GitHub, GitLabなど |
| バージョン固定 | コミットハッシュによるピン留め可能 |
| 無効化 | `package!`の`:disable`オプション |
| ローカル開発 | `:type 'local`でサポート |

### フック機構

| フック名 | 用途 |
| --- | --- |
| `doom-before-init-hook` | コア初期化後、ユーザー設定前 |
| `doom-after-init-hook` | 全初期化完了後 |
| `doom-before-modules-init-hook` | モジュールinit.el読み込み前 |
| `doom-after-modules-init-hook` | モジュールinit.el読み込み後 |
| `doom-before-modules-config-hook` | モジュールconfig.el読み込み前 |
| `doom-after-modules-config-hook` | モジュールconfig.el読み込み後 |
| `doom-first-input-hook` | 初回ユーザー入力前 |
| `doom-first-file-hook` | 初回ファイルオープン前 |
| `doom-first-buffer-hook` | 初回バッファ切替前 |

## 保守性要件

### コード品質

| 項目 | 内容 |
| --- | --- |
| バイトコンパイル | 完全対応、`lexical-binding: t`必須 |
| ネイティブコンパイル | 対応（Emacs 28+、CPU 1/4使用） |
| コードスタイル | Emacs Lisp Style Guide準拠 |
| 非推奨警告 | `define-obsolete-*`で適切にマーク |

### データディレクトリ構成

| ディレクトリ | 用途 | 環境変数 |
| --- | --- | --- |
| `doom-emacs-dir` | Doom本体 | - |
| `doom-user-dir` | ユーザー設定 | DOOMDIR |
| `doom-data-dir` | 永続データ | XDG_DATA_HOME |
| `doom-cache-dir` | キャッシュ | XDG_CACHE_HOME |
| `doom-state-dir` | 状態ファイル | XDG_STATE_HOME |
| `doom-profile-cache-dir` | プロファイル別キャッシュ | - |
| `doom-profile-data-dir` | プロファイル別データ | - |
| `doom-profile-state-dir` | プロファイル別状態 | - |

### CLI ツール

| コマンド | 用途 |
| --- | --- |
| `doom sync` | パッケージ同期、キャッシュ再生成 |
| `doom upgrade` | Doomとパッケージの更新 |
| `doom doctor` | システム診断 |
| `doom env` | シェル環境のスナップショット保存 |
| `doom gc` | 不要ファイルのクリーンアップ |

## 運用・監視要件

### ロギング

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| ログレベル | 0-3（DEBUG環境変数で制御） | 0:なし、1:警告、2:通知、3:デバッグ |
| デバッグモード | `init-file-debug`で制御 | --debug-initまたはDEBUG環境変数 |
| 非対話時メッセージ抑制 | 有効 | `doom-inhibit-log`で制御 |
| ネイティブコンパイル警告 | デバッグモード時のみ表示 | `native-comp-async-report-warnings-errors` |

### 診断機能

| 機能 | 説明 |
| --- | --- |
| `doom doctor` | システム構成、依存関係、一般的な問題の診断 |
| `doom-display-benchmark-h` | 起動時間、パッケージ数、モジュール数の表示 |
| キャッシュサイズ監視 | savehist、projectile.cache等の異常サイズ検出（1MB超過で警告） |

### 大規模ファイル対策

| 項目 | 設定値 | 備考 |
| --- | --- | --- |
| 大規模ファイル閾値 | 1.0MB（デフォルト） | `doom-large-file-size-alist`で拡張子別設定可能 |
| 大規模ファイルモード | `so-long-minor-mode`自動有効化 | パフォーマンス通知メッセージ表示 |
| `so-long`閾値 | 400（Emacs 28以前）/5000（Emacs 29以降） | 長い行の検出閾値 |

### エラーハンドリング

| 項目 | 内容 |
| --- | --- |
| カスタムエラー型 | doom-error, doom-font-error, doom-module-error等 |
| フック実行エラー | `doom-hook-error`としてラップ、警告表示 |
| 起動エラー | 詳細なバックトレース表示、--debug-init推奨 |
| 非対話モードエラー | 適切なexit codeで終了 |

## 備考

### 依存ソフトウェア

**必須:**
- GNU Emacs 27.1-30.2（30.2推奨）
- Git >= 2.23
- ripgrep >= 11.0

**推奨:**
- fd >= 7.3.0（ファイルインデックス性能向上）
- GNU find, ls, tar（macOS/BSD）
- Symbola フォント（グリフフォールバック）

### 特記事項

1. **パフォーマンス最優先設計**: 起動時間とランタイムパフォーマンスを最優先とし、各種最適化を施している
2. **XDG Base Directory準拠**: データ、キャッシュ、状態ファイルをXDG仕様に従って分離
3. **クロスプラットフォーム対応**: macOS, Linux, Windows, BSD, WSLを明示的にサポート
4. **プロファイル機能**: 複数の設定プロファイルを切り替え可能、バージョン管理対応
5. **段階的ロード**: `doom-incremental-packages`によるパッケージの遅延読み込みで起動時間を最小化
6. **GCM Heuristics Mode**: `gcmh-mode`によるインテリジェントなGC制御でフリーズを防止
