リポジトリ全体で長期運用を見据えた設計基準を明確化するため、Shell Script, Python, Ruby の 3 言語について共通の実装ポリシー(Implementation Policy)を定義した。加えて、Emacs Lisp については特有の互換性問題に対応するための設計ガイドライン(Design Guidelines)を策定した。いずれも長期間の保守、明示的なエラー制御、可読性の一貫性を軸にしている。
実装ポリシー策定の背景
複数言語で書かれたスクリプト群を長年運用してきた結果、POSIX と Bash 構文の混在、Python における戻り値や例外処理の不統一、Ruby の記述スタイルのばらつきが顕在化することがあった。今回の策定ではどの言語でも同じ構造と判断基準で書けることを目的とし、ログ形式、終了コード、ドキュメント構成、テスト命名規則などを統一した。
Shell Script Implementation Policy
- POSIX(#!/bin/sh)準拠。Bash 固有構文や local は使用しない。
- set -e に依存せず、明示的にエラーを検出・処理する。正常系は関数で return、異常時のみ exit。
- ログは [INFO]、[WARN]、[ERROR] に統一。エラーは標準エラー出力。
- 終了コード:0=成功、1=失敗、2=ネットワーク到達不可、3=前提不足、126/127=実行不能/未発見。
- cron 実行時の件名は [admin][cron][delivery] FILENAME。
- 実行前チェックを徹底(必要コマンド、環境変数、到達性)。破壊的操作は事前検証。
- ドキュメント順序は Description → Requirements → Usage → Options → Test Cases → Version History。
Python Implementation Policy
- 対象は Python 3.2 以上(推奨 3.4+)。互換性を重視。
- sys.exit() は異常系専用。通常は main() が整数を返し sys.exit(main()) で終了。
- 例外は必ず捕捉し、原因と対象をログに出す。ログタグと出力先(stdout/stderr)は Shell Script と統一。
- 外部依存の排除。ファイル操作は UTF-8 を明示。パス操作は標準ライブラリで安全に扱う。
- 互換性検査は find_pycompat.py を使う(f-string や async 等の検出)。
- テストは test/FILENAME_test.py に統一し、CI でも整合性検証を行う。
Ruby Implementation Policy
- 対象は Ruby 3.0 以降を推奨。無理な下位互換よりも保守性と明示性を優先。
- 外部コマンド実行は Open3.capture3 や system を用い、戻り値と出力を明示的に検査。
- ファイル走査は File.foreach や Dir.glob を使用。I/O は UTF-8 を明示。
- ログタグと終了コード規約は他言語方針と共通化。
- テストは RSpec を採用し、配置は test/、命名は FILENAME_test.rb。
全文はこちら。
Emacs Lisp Design Guidelines
Emacs Lisp は強制規範ではなく設計指針(Guidelines)として整理した。理由は、Emacs 本体のバージョン差や API の非互換、環境依存が大きく、一律のポリシー化が現実的でないためである。基本方針は次のとおり。
- 存在確認の徹底:fboundp、boundp、featurep による安全な呼び出し。
- 段階的拡張:旧環境でも動作するコアを維持し、新しい Emacs では Tree-sitter や JSON 処理などを条件付きで有効化。
- 推奨記述:lexical-binding の明示、cl-lib の利用、バージョン差異のマクロ吸収、UI とロジックの分離。
- 依存関係は緩やかにし、欠落時は機能低下にとどめる。
全文はこちら。
総括
実装ポリシーは「必ず守る規範」、ガイドラインは「長期互換性を保つための推奨事項」である。両者を明確に分けることで、統一性と柔軟性の両立が可能になった。今後、他言語を追加する際も同様の形式で方針を定めていく。