Kairos 言語仕様 — 1. 導入
1.1 Kairos とは
Kairos は、汎用スケジューラのためのスケジュール定義言語である。連続時間軸という基底(Chronos)から、 発報すべき意味ある時点(kairos)の集合を紡ぐ——名はこの営みに由来する。ギリシャ語で Chronos が「流れる連続 した時間」を、kairos が「機を得た特定の時」を指す対に重ねている。
言語はスケジュール(日時の列=時間ストリーム)の生成に特化し、その列を出力するところまでを担う。列を解釈して 実際に発報・登録・実行するのは実装系の責務であり、言語のスコープ外とする(§1.4)。
1.2 解こうとする問題
一般的なスケジューラでは「月末 N 日前」「第 N 営業日(祝日考慮)」といった指定を簡潔に書けない。独立・標準化 された定義言語は事実上 iCalendar の RRULE(RFC 5545)のみで、他はスケジューラ固有の cron 系方言である。いずれも 「月末 N 日前(暦日)」までは書けるが、「第 N 営業日」を式の中で簡潔に書けるものは無く、営業日対応は言語ではなく 「営業日カレンダー」オブジェクト+「非営業日はスキップ/翌営業日へずらす」フラグの外付け二層で解決されている。
既存言語がこの穴を埋められない本質は、機能不足ではなく、式が一枚岩で合成できない点にある。cron も RRULE も 「導いた日を基準にさらに別の定義を作る」閉包性を持たない。Kairos はこの閉包性を中核に据える(§2 で詳述)。
既存方式との比較——何ができて、何ができないか
○=言語/定義の中で書ける・△=部分的(ハック・外付け・実装依存)・✗=書けない。比較対象は
POSIX/Vixie cron・Quartz の cron 拡張(L/W/#+除外カレンダー)・iCalendar RRULE
(RFC 5545+RFC 7529)・営業日カレンダー付きの業務スケジューラ一般(カレンダーオブジェクト+
前後シフトのフラグ二層)。
| 能力 | cron | Quartz | RRULE | 営業日付き製品 | Kairos |
|---|---|---|---|---|---|
| 固定時刻の繰り返し(毎日 9:00) | ○ | ○ | ○ | ○ | ○ |
| 第 N 曜日(第 2 月曜) | △(日と曜日の OR 罠) | ○(#) |
○(BYDAY+BYSETPOS) | ○ | ○(nth・§4.3) |
| 月末・月末 N 日前(暦日) | ✗(28〜31 列挙のハック) | ○(L) |
○(BYMONTHDAY=-1) | ○ | ○(month \|> last \|> shift) |
| 営業日の認識(祝日考慮) | ✗ | △(除外=スキップのみ) | ✗(EXDATE の静的列挙) | ○ | ○(実体+bizDay 導出・§3.9) |
| 営業日算術(第 N 営業日・月末 3 営業日前) | ✗ | ✗ | ✗ | △(前後シフトのフラグ止まり) | ○(roll・shift(unit: bizDay)・§7.1) |
| 祝日の導出(振替・国民の休日をルールで) | ✗ | ✗ | ✗ | ✗(データ列挙のみ) | ○(カスケード・§7.5) |
| 独自暦(会計年度・ISO 週・旧暦・二十四節気) | ✗ | ✗ | △(RFC 7529 RSCALE・実装は稀) | ✗ | ○(premise 層=暦法のユーザー定義・§3) |
| 合成・閉包(導いた列を入力に次を定義) | ✗ | ✗ | △(RDATE/EXDATE の和差のみ) | ✗ | ○(全式がストリーム→ストリーム・§2.3) |
| クロス TZ の合成(東京×NY の共通営業日) | ✗ | ✗ | ✗ | ✗ | ○(rebase・整列検査・§4.4) |
| DST の規定 | △(実装依存=飛び・二重発火) | △ | ○(壁時計) | △ | ○(壁時計宣言・隙間/重複は明示エラー・§3.6) |
| データの尽きた先の検出(鮮度の可観測性) | ✗ | ✗ | ✗ | ✗ | ○(covering・範囲外註釈・残走路・§4.10) |
| 決定性・監査(定義=時点の集合) | ✗(現在時刻への内包) | ✗ | ○ | △ | ○(外延・missed-fire も列挙可能) |
| 取り違えの静的検査 | ✗ | ✗ | ✗ | ✗ | ○(整列・粒度・tz・宣言必須の統治・§4.5) |
Kairos が(意図して)できないことと、その受け皿:
| できないこと | 受け皿・分解 |
|---|---|
| 発報・リトライ・実行管理 | 実装系(発報層)の責務——言語は時点の集合を定義するまで(§1.4・分業の一般形と図は §7.8) |
| 実行状態へのフィードバック(「前回完了から 5 時間ごと」の単一無限列) | 注入された時点からの次回計算に分解すれば現行語彙の純関数(§7.7——スコープ外はフィードバックだけ) |
| 回数での終了(RRULE の COUNT=10 相当) | 評価範囲・covering での有界化(「列の先頭 N 個」の選択語は持たない——需要待ち) |
| カレンダーデータの真正性の保証 | 出所統治(source:/asof:)で判定材料を運ぶ——判定は外部(ADR-15) |
| 実行履歴・負荷などランタイム条件での分岐 | スコープ外(発報層で t やデータとして注入する側に倒す) |
1.3 設計の背骨
- 基底 Chronos は固定 — TZ 非依存の単一絶対軸。TZ は chronos から市民座標への写像(premise 相対の 射影の錨。ADR-33)で、全ての暦法・粒度はここへの射影。相対化しない。
- 暦法は自由 — 基底の上の窓分割としての暦法はユーザー定義でき、グレゴリオ暦もその一インスタンス。
- 閉包 — 全式は時間ストリーム → 時間ストリーム。導いた結果をさらに入力にできる。
- 二層 — premise 層(暦法・カレンダーを組み立てる。DDL 的)と本体層(スケジュールを紡ぐ。DML 的)。
- core 族と糖衣 — 本体層は最小の core 族と、その合成に名を付けた糖衣の二層。糖衣は core への展開で消せる。
- premise 相対の意味論 — 式の意味は前提(premise)に相対的。名前もまた premise 相対に解決される。
- 記号は三役に一対一 —
|>(段の連結)・.(premise 修飾)・|(ストリームの和)。
1.4 スコープ
含む: スケジュール定義の表現(言語そのもの)/定義からの時間ストリーム生成/営業日・暦・窓・ロール規約の表現。
含まない:
- 発報・タスクの実行・管理(列を解釈しての起動、リトライ、状態追跡)。言語は発報すべき時点の集合(外延)を 定義するところまでで、その列を解釈して Chronos 上で実際に発報するのは実装系の責務。
- カレンダーデータの真正性の保証(祝日・組織休日データの正しさ判定。差し込む器は用意する)。
- 実行起点に相対な窓(「前回完了から 5 時間」など、過去の実行結果に依存するもの)。ただしスコープ外は 実行状態へのフィードバックだけ——注入された時点からの次回計算は射程内(§7.7)。
- 複数物理時間軸の相対論的調停(基底の単一性を守るため)。
1.5 本仕様の構成と凡例
- 導入(本章)
- 型と層 — 三つの型・二層構造・閉包・記号
- premise 層 — 前文・暦法定義(原始/派生)・値式
- 本体層 — 生成子・窓・選択子・点変換・結合子・フィルタ・ストライド・糖衣
- 文法と記号 — 記号一覧・演算子シグネチャ・命名の確定状況・字句・EBNF
- 用語集 — 引くための索引(概念用語・記述語・記号・不変条件)
- 代表例
凡例: 命名は全語確定済み——仮称は残っていない(F51 の一括確定と rephase 裁定〈2026-07-26〉・§5.4)。設計判断
の根拠(なぜそう決めたか)は設計記録 20-adr/(ADR-01〜47)と 10-domain-model.md に対応し、本仕様では要旨の
みを畳んで示す。