日本語 · English

Kairos 言語仕様 — 付録 B. 供給側プロファイル(表を配る側の契約)

本書は仕様ツリーに置く付録で、規範(§1〜7)の一部ではない。付録 A(発報層プロファイル)が 「点列を実行する側」の契約なら、本書は「表を配る側」の契約である。external(§3.8・ ADR-46)が実行時に受け取る解決値を、誰が作っても同じ形・同じ検査で届くように定める。 英訳は en/spec/61。

B.0 この文書は何か

言語は表の形と検査を持つ。表そのものは配らない。年で腐るデータ(祝日・節気・朔)は、公示する機関を上流に持つ供給側が配る。 本書は供給側に「これを満たせば言語の検査をそのまま通る」を示す。

適合の段は付録 A と同じ 3 つ。

本書の立場。

読む順は §3.8 → reference/external.md → 本書 → 付録 A の A.5。

B.1 配信物の形(静的束)

1 ファイルが 1 つの束。束縛名をキーに、表を 1 つずつ入れる。

祝日表の例。

{ "holidays": {
    "dates": ["2026-01-01", "2026-01-12", "…", "2027-11-23"],
    "covering": "2026-01-01..2027-12-31",
    "asof": "2026-10-22" } }

ラベル付きの例(節気)。宣言側は sekki = external(kind: dates, labels: [小寒, 大寒, 立春, …], source: "…")。

{ "sekki": {
    "dates":  ["2026-01-05", "2026-01-20", "2026-02-04"],
    "labels": ["小寒", "大寒", "立春"],
    "covering": "2026-01-01..2026-02-28",
    "asof": "2026-10-22" } }

B.2 covering=完全性の主張

covering は「この範囲は網羅した」の主張である。範囲内に無い日は「無い」と読まれる。範囲外は「未知」と読まれ、利用側に註釈が出る。

B.3 asof=版の識別子

asof は版の名前である。同一性だけが比べられる。順序も日付の意味も読まれない。

B.4 URL と版

配る場所は固定し、配った版は消さない。

B.5 更新の作法

表は年に 1 度延びる。延ばす約束を公開し、延ばしたら版を切る。

出所の例(日本)。表の権威は公示する機関にある。言語も供給側もそれを置き換えない。

表 出所 公示の時期
祝日 内閣府「国民の祝日について」 前年の 2 月上旬
二十四節気・朔 国立天文台 暦要項 前年の 2 月 1 日(官報)

B.6 受け入れ試験

言語側の配布物(npx kairos-lang・schema/supply.schema.json)だけで通る 4 本。配信の前と、延ばすたびに走らせる。 以下、新版を s.json(covering 2026〜2027 年・asof 2026-10-22)、旧版を old.json(covering 2026 年だけ)、宣言を check.kairos と呼ぶ。

(1) 形: schema/supply.schema.json に通る。評価時に CLI が形を検査するので、事前検査は任意の JSON Schema 検証器で。

(2) 契約: 評価器の検査を通る。宣言と表を組み、覆域の全体を評価する。

premise JP { calendar-system: Gregorian; tz: "Asia/Tokyo"; wkst: Mon
  holidays = external(kind: dates, source: "https://example.com/supply/jp-holidays.json") }
@JP
holidays
npx -y kairos-lang list --supply s.json --from 2026-01-01 --to 2028-01-01 --tz Asia/Tokyo check.kairos

期待: 終了コード 0。点が公示どおり。⚠ 範囲外 が出ない。末尾の被覆サマリが JP.holidays covering 2026-01-01..2027-12-31 asof 2026-10-22 残走路 0 日。

(3) 表の外は黙らない: covering の外を聞くと註釈が出る。出なければ covering が広すぎる。

npx -y kairos-lang list --supply s.json --from 2028-01-01 --to 2028-02-01 --tz Asia/Tokyo check.kairos

期待: 終了コード 0。# 0 点・# ⚠ 範囲外 2028-01-01..2028-02-01(JP.holidays covering 2026-01-01..2027-12-31, asof 2026-10-22)・残走路 -31 日。

(4) 延長は追加だけ: 旧版と新版の TSV の差分が追加だけで、削除が 0。

npx -y kairos-lang list --supply old.json --from 2026-01-01 --to 2028-01-01 --tz Asia/Tokyo --tsv check.kairos > old.tsv
npx -y kairos-lang list --supply s.json   --from 2026-01-01 --to 2028-01-01 --tz Asia/Tokyo --tsv check.kairos > new.tsv
diff old.tsv new.tsv | grep -c '^<'      # 期待: 0

契約違反の例(どれも終了コード 1)。

違反 診断(冒頭)
乱順・重複 契約違反: 解決値は昇順・重複なし
点が covering の外 契約違反: 解決値の点が covering の外
実在しない日 契約違反: 実在しない日付
kind 不一致 契約違反: kind: dates の解決値は dates("YYYY-MM-DD" の列)を運ぶ
ラベルが宣言の値域の外 契約違反: 宣言値域の外のラベル
ラベルの長さ違い 契約違反: labels は時点列と同長
宣言の無い束縛にラベル 契約違反: labels 無宣言の external にラベルが来た
covering・asof の欠落 --supply s.json の "holidays": covering(文字列)が必須

B.7 言語側が出すもの・出さないもの

言語側が出す 言語側が出さない
形の正本(schema)と評価器の検査 表そのもの(年で腐るデータ)
本書と受け入れ試験の手順 配信基盤・URL・キャッシュ
同梱例(impl/examples/)=照合用の点列 更新の約束・通知・課金・利用者管理

検査できないものは供給側の責務。

B.8 適合の自己申告(チェックリスト)

供給側が「Kairos の供給契約に適合」と言うときに添える一覧。MUST は全部に印を付け、SHOULD は外した項目と理由を書く。

MUST(形)

  1. 束は {束縛名: {dates|instants, covering, asof [, labels]}} の形で、schema に通る(B.1)
  2. dates は premise の tz の市民日・昇順・重複なし・実在日。instants は epoch ms・昇順(B.1)
  3. labels は点と同長の文字列で、宣言した値域の中。宣言の無い束縛に送らない(B.1)
  4. 点はすべて covering の中(B.2)

MUST(運用)

  1. covering は公示済みの範囲だけ。未公示の年を含めない(B.2)
  2. asof は非空の文字列。中身が変わったときだけ変える(B.3)
  3. 最新の固定 URL と、消えない版の URL(B.4)
  4. 延ばす約束(公示から何日以内)を公開し、延ばすときは covering と asof を同じ版で更新する(B.5)
  5. 受け入れ試験 (1)〜(4) を配信前と延長のたびに走らせ、記録を残す(B.6)

SHOULD

B.9 用語

用語 定義 参照
供給側 external の解決値(表)を作って配る側。公示する機関の値を写す B.0
静的束 束縛名ごとに dates/instants・covering・asof・labels を運ぶ JSON。1 回の評価で 1 回解決される B.1・A.5
covering 完全性の主張。範囲内に無い点は「無い」、範囲外は「未知」 B.2・§3.8
asof 版の識別子。同一性比較のみ B.3・§3.8
残走路 評価範囲の to から covering の末尾までの日数。負なら覆域切れ B.2・§4.10
範囲外の註釈 covering の外を評価したときに結果へ並走する註釈 B.2・§4.10
契約違反 解決値が形・整列・包含・実在・ラベルの検査に落ちた状態。終了コード 1・error.kind は supply B.6・ADR-46
供給エラー 解決そのものの失敗(解決子が無い・取得できない)。error.kind は契約違反と同じ supply A.4・ADR-46
正当な空 dates: []+covering。評価は成功し点は 0 B.2・ADR-45