ADR-37: 範囲外出自と covering: の活性化——評価註釈(I6)の具体化
判断: データ被覆域(covering:)の外に掛かる評価の統治を次のとおり確定する(F61。
draft §1.20 の候補設計=4 視点検証・設計者裁定 4 件(2026-07-08)を経た ADR 化。
ADR-15 が予約した「出自は評価註釈」の初めての具体化であり、ADR-35 判断 3 が要請した
bizDay 標準導出の註釈伝播をここで規定する)。
-
covering:は値に一切触れない。covering は「範囲内は完全・範囲外は未知」という二面の 主張であり、テーブルの値は書かれた列そのもの。主張と値の整合は静的検査で保証する—— 列の全要素は covering に包含(違反は乱順・重複と同格の静的エラー。覆域外の要素はほぼ確実に 誤記か覆域の書き漏らし)。この検査により「覆域外に点は無い」が静的に立ち、覆域外の評価は結果と して「空+範囲外註釈」になる——が、値を切る刃(clip)は言語に存在しない。値は列が決め、 註釈は covering が決める。覆域の端は premise の tz の市民日で解決し、covering: または日付 テーブルを持つ premise はtz:宣言必須(執行点は宣言時=ADR-35 判断 2 の実体要件の延長。 ADR-36 判断 2 の表の字面をここで正式化)。省略時は列の端(閉区間 [先頭要素, 末尾要素])が覆域 (ADR-26 既定のまま)。 -
註釈の種は「範囲外」(out-of-coverage)一種から始める。属性は〔区間・源(premise.束縛名)・ その covering・asof〕。「正当な空」は註釈なしの空として表現され、専用の種を持たない。 ただし註釈なしは「既知のデータ端に起因しない」ことを言うだけで、正当性の証明ではない (タイポの全落ち・供給未投入は註釈ゼロの空のまま外部判定に渡る。証拠の不在を不在の証拠に 格上げしない——判定器の文書にも義務づける字面)。種の集合は開放的(将来:
asof:の版差・ 観測データの未確定域)だが、本 ADR で規定するのは一種のみ。 -
註釈の付き先は区間——結果ストリームに chronos 上の註釈区間の列〔[a, b) ごとの種と属性〕が 並走する。点註釈は不可(範囲外の本質は「点が無いかもしれない」こと——存在しない点には 付けられない)。ストリーム全体フラグは粗すぎる(信頼できる部分範囲が識別できない)。註釈は 空でない結果にも付く(範囲外区間に satSun 由来の点は出続ける)。ADR-15 の「空の出自」から 「区間の出自」への一般化(ADR-15 に改訂節)。
-
伝播は註釈の輸送表——規範は「結果が覆域外データに依存し得る区間を漏らさない」 (過小近似は不可・過大近似は許容)。点でなく区間そのものを輸送する(註釈区間には定義上 点が無いので、点渡しの伝播は shift の平行移動〈満了 90 日前通知〉で漏れる)。ADR-36 の統治表と 同型に、core 全演算子に輸送行を義務づける(行の無い演算子は註釈を通せない=新演算子の追加時は 輸送行の定義が必須):
演算子 出力の註釈区間 結合子 \|・&・\両辺の和(自動相殺なし—— \|も例外にしない)shift(n, unit: U) 入力註釈 ∪ 註釈区間を n·U 平行移動した像(窓語 unit は窓添字ずらしの像・過大近似可) roll(規約, on: A) 入力註釈の像 ∪ 軸 A の註釈区間の依存像(規約の逆方向へ直前/直後の既知軸点まで拡張。 Modified等の双方向探査は照会域全体の包)。着地先が無い=軸のデータ端→空+註釈、ただし軸の覆域が完結(開端 covering)なら註釈なしの空(正当な該当なし)選択子 first/nth/last 対象窓が註釈区間に交差したら窓全域へ拡幅(窓内の序数は覆域外を覗き得る) stride/strideBy(from:) 歩行が註釈区間に交差したら最初の交差点から先すべて(位相は状態——汚染は下流へ伝染し続ける) segmentBy マーカー覆域の補集合。 edges:/empties:の発火判定は「マーカー覆域の端」であって「列の端」ではない——覆域内では最終マーカー起点の窓も覆域端まで確定して張る(この確定域=窓列の実効被覆域)filter(述語) 述語が範囲外参照を要求した点は落とし、依存束縛の註釈区間∩評価域を出力に註釈 射影(窓→値) ストリーム文脈は「落として註釈」・純値文脈は判断 6 within・snapTo・grid/span/split/cycle 入力(マーカー・対象窓)の註釈をそのまま(点変換は像で)通す。暦法純粋な生成子自体は註釈を生まない premise 束縛は定義でなく評価ごとに註釈を得る(I6——註釈は評価文脈の随伴。定義に焼き込まない)。 「単調(消えない)」は結合子の性質で、輸送は区間を移す——不変量は規範の側。
-
明示の被覆主張が相殺の唯一の口。年別テーブルの合成(
nonWorking = satSun | h2024 | h2025 | h2026——各年が各 asof を持つ現実の運用形)は和規則だけだと全期間が恒常註釈になり狼少年化する (覆域の積の補集合≒全時間)。自動相殺は偽陰性を作るため却下のまま、束縛への covering: 後置を 認める:nonWorking = (satSun | h2024 | h2025 | h2026) covering: 2024..2026。これは検証不能な 意味論的主張でありsource:/asof:と同格の統治を掛ける——黙って消すのではなく名指しで 引き受け、出自(判断 2 の属性の源)に記録し、被覆サマリ(判断 7)に常時表示する。必要条件の 静的検査を付す: 主張範囲 ⊆ 成分覆域の和(どの成分も語れない区間の完全性は主張できない。 規則ベースの成分は全時間を語る)。socket の器の被覆主張も同じ形(ADR-36 が整列で行った送りと同型)。 -
実効被覆域がエラーの分類器。失敗した参照の点が、その参照が実際に読む束縛の実効被覆域の外 (=判断 4 の輸送で計算された註釈区間の内)にあれば「範囲外」——ストリーム文脈は落として註釈・ 純値文脈は範囲外分類の明示エラー(「値なし」スロットは導入しない。属性〔源・covering・asof〕を メッセージが運ぶ)。実効被覆域の内なら従来どおり硬エラー(取り違え=プログラミングエラー。 ADR-16 の統治のまま)。基準を生テーブルの covering にしないのが要(派生構造の実効被覆域は輸送で ずれる——segmentBy の頭の edges: 領域など——ので、生 covering で分類すると「覆域内・窓なし」の 帯で系統的に誤爆する)。細則: 多依存は失敗したその参照の依存だけで分類し、範囲外とも取り違えとも 説明がつくときは安全側=硬エラー。完結データの正当な尽きは失敗ではない(判断 4 の roll 行)。 適用される失敗種の列挙: テーブル射影(点が列にない)・束縛名射影・
ordinalIn/epochOrdinalの 窓所属・roll/shift の着地・並行リスト添字(F62 連動)。 -
「判定は外部」の器は二つ。言語仕様が定めるのは「実装表面は結果とともに註釈を提示しなければ ならない」(I6)まで。対処は呼び手の責務(ADR-15)。(a) 区間註釈(動的・交差計算用)—— 評価範囲 [from, to) にクリップして返す。(b) 被覆サマリ(静的・監視用・クリップしない)—— 評価が参照した各データ源の〔源・covering・asof・完結主張の有無・評価 to からの残走路〕。 クリップ済み註釈だけだと「to の直後にデータが尽きる」が観測できず発報運用(データ更新のリード タイム確保)が立たない——覆域は静的に判明しているのに捨てるのは誤り。開端 covering の完結主張も ここに常時出す(黙らせた事実そのものを可観測にする)。正準形では両者は results と同格の フィールド(註釈を捨てる短絡アクセスを既定にしない。厳格モードは呼び手の判定の実装であって言語の 判定ではない)。
-
二重の地平線。(a) データ被覆域(covering:)=言語概念・註釈の源。(b) 評価範囲(from/to)= 評価の需要域・註釈のクリップ枠(覆域内に収まる狭い評価は註釈ゼロで走る——「狭い評価範囲を 殺さない」の実現形)。クリップは表面で一度だけ行い、内部伝播は非クリップで走らせる(葉で先に クリップすると、輸送で覆域外から評価範囲内へ入ってくる註釈を取りこぼす)。実装の実体化範囲 (リファレンス実装の to+約 400 日)は第三の、プロトタイプ限りの近似地平線であり言語には存在しない ——その越えは硬エラーでなくクリップ+実装警告(snapTo・roll 終端・shift の 4 サイトを三分岐に 統一: ①計算範囲以遠→クリップ+警告・②実効被覆域外→落として註釈・③それ以外→硬エラー維持)。
-
covering: の表現域を拡張する。(a) 開端:
covering: 2021..(以後完結)・..2027・..(全域完結=註釈を生まない宣言。単発除外テーブル[2026-01-05] covering: ..の受け皿)。意図的に 有限なデータ(一回性の法・告示)は「覆域外=未知」ではなく「列は全時間で完結」であり、閉区間しか 書けないと未来を永久に註釈で汚す。統治: 開端は検証不能な完結主張(「註釈を黙らせる最短の 2 文字」になり得る)なのでsource:/asof:宣言必須寄り+被覆サマリに常時表示。 (b) 区間リスト:covering: 2020..2022, 2024..2027(中抜けの正直な申告。閉区間一本だと過大主張 〈欠落年が「完全」の証明書付きで沈黙——ADR-15 の原文「祝日定義の年が抜けている」が偽の安全証明 付きになる〉か過小主張〈恒常註釈〉を強いる)。註釈の器は最初から区間列であり EBNF の小拡張で済む。 意味の対比: 省略=列の端(最狭の主張)・..=全域完結(最広の主張)——正反対(glossary に 注記)。省略既定は変えない(黙って完結扱いにすると官報表の covering 書き忘れがデータ切れの黙認に なる——うるさい側が安全側)。
図解(2026-07-13 追補・判断 3/6/8 の要約——判断内容の変更なし。gantt は spec §4.10 と同図):
gantt
dateFormat YYYY-MM-DD
axisFormat %Y-%m
title 二重の地平線(判断 8): covering 2026 のデータを 2026-07〜2027-06 で評価
section データ
covering(完全の主張・判断 1) :done, 2026-01-01, 2026-12-31
section 評価
評価範囲 [from, to)=クリップ枠 :active, 2026-07-01, 2027-06-30
section 結果(bizDay 等)
確定域=註釈なし : 2026-07-01, 2026-12-31
範囲外の区間註釈が値に並走 :crit, 2027-01-01, 2027-06-30
flowchart TD
F["参照の失敗(テーブル射影・束縛名射影・窓所属・<br/>roll/shift の着地・並行リスト添字=判断 6 の列挙)"]
F --> H{"点が実体化地平線<br/>(実装の計算範囲)の外?"}
H -- "はい" --> W["クリップ+実装警告<br/>(プロトタイプ限りの近似地平線——言語には存在しない=判断 8)"]
H -- "いいえ" --> E{"点が実効被覆域の外?<br/>(=判断 4 の輸送で計算された註釈区間の内)"}
E -- "はい" --> A["範囲外——ストリーム文脈は落として註釈・<br/>純値文脈は範囲外分類の明示エラー(判断 6)"]
E -- "いいえ" --> HE["硬エラー維持(取り違え=ADR-16 の統治のまま。<br/>多依存で説明が割れたら安全側=硬エラー)"]
背景: F61(stdlib 拡充で新出・2026-07-08 棚卸し)。impl は値射影のデータ被覆域外で硬エラーになり
everyDay 起点の六曜が書けず、テーブル時点が計算範囲を越えると snapTo が硬エラーになり狭い評価範囲が
書けなかった。covering: は RC1(ADR-26)で構文が入ったまま評価では不活性。ADR-35 判断 3 で優先度が
上がった——bizDay 標準導出は祝日データの尽きた先で everyDay \ satSun へ黙って退化し、出自を落とすと
退化が観測できない。40-examples/05 では観測ベースの暦法(イスラム暦ヒラール)の運用が F61 の活性化に
懸かることを確認。設計論点 8 点(INDEX 棚卸し)を draft §1.20 で具体化し、4 視点並列の検証(整合性・
コーパス全数掃引・実装可能性・敵対的、指摘約 40 件)で当初案の構造欠陥 4 つ——clip の致命反例・点渡し
伝播の過小近似・edges: の覆域端問題・恒常註釈の狼少年化——を修正、設計者裁定 4 件(値意味論・
付き先・伝播と相殺・covering 拡張=いずれも推奨案)で確定した。
却下した案:
- covering: が値を切る(clip。当初案): 覆域外の支持点アンカー(旧暦 newMoons の 2024-12-31)を 黙って抹消し、F60 の窓序数繰り上がり+F62 無検査の並行リストを経由して、旗艦例 rokuyo.kairos を 覆域内・エラーゼロ・註釈ゼロのまま全期間誤答に変える(敵対検証の最重大反例)。本設計が根絶する はずの「黙って違う結果」の再生産。
- 点註釈・ストリーム全体フラグ(判断 3 に理由)。
- 有効点ゼロでエラー停止(ADR-15 で却下済み。データ端で再燃するがなお異物)。
- 警告文字列(warnings)だけで返す: 機械可読の区間・源が無く「判定は外部」の器にならない。
|で被覆の自動合成(自動相殺): B の覆域で A の註釈を消す案。A の失われた点は B では補われず 偽陰性を作る。相殺が要る正当な意図は判断 5 の明示主張が名指しで引き受ける。- 省略既定を「完結」に反転: 単発テーブルの記述は軽くなるが、官報表の書き忘れがデータ切れの 黙認になる。
帰結:
- spec: §3.8 に covering の意味論(二面の主張・包含検査・開端・区間リスト・束縛後置の被覆主張・ tz: 必須)を改稿、本体層に評価註釈の節(輸送表・分類器・器の二形)を新設、§5.6 EBNF (covering-range の開端・リスト・束縛後置)、glossary(範囲外・実効被覆域・被覆主張・被覆サマリ・ 残走路)、I6 の字面に「区間の出自」を追補。
- ADR-15 に改訂節(空の出自→区間の出自への一般化)、ADR-26 に改訂節(covering の意味論の確定と 表現域の拡張)。
- stdlib/kyureki は covering を実端
2024-12-31..2027-12-31へ広げる(包含検査に適合)。 rokuyo.kairos のヘッダの運用注意(「評価範囲もデータ内で使うこと」)は不要になり削除。 - リファレンス実装: 註釈の値随伴伝播(整列タグ ADR-36 と同型)+純値文脈の範囲外シグナル(例外 チャネル)・包含検査・開端/リスト covering・被覆主張・RunResult の annotations/coverage・CLI の 註釈ブロックと被覆サマリ・地平線 4 サイトの三分岐降格・defCache キーへの asof/source 追加 (版差の誤共有防止)。
- 「評価範囲はデータ被覆域に重ねて取る」という impl/README の運用制約は解消される。
- 限界の明記: 評価範囲を覆域外に取ったテストは誤イディオム(
filter(d => sekki(d) == 立春)級)を 「落として註釈」で通す——同じ式が覆域内では硬エラーになる非対称は分類器の原理的性質(観測面は 「註釈つきの空」。判定は外部、の限界)。roll・filter 通過後の太った註釈区間では本物のプログラミング エラーが「範囲外」へ軟化され得る(過大近似=安全方向の選択の対価)。 - 残る宿題との接続: F62(並行リスト同長性)の優先度が上がる(covering 編集で窓 0 が動く変更の
防波堤——判断 6 の失敗種列挙に既に含めた。実装同期で実例が即発現: 覆域端確定により旧暦の窓が
37→38 になり monthNos の 38 個目が必要になった)。socket の器は整列(ADR-36)に加えて
被覆主張を含む。doctest の註釈照合規約(警告の機械可読化と
#=>の拡張)は実装の宿題。
改訂(2026-07-08・実装検証): 判断 5 の必要条件検査を精密化する——「規則ベースの成分は全時間を
語る」は数えない。正しい式は「主張範囲のうち註釈が掛かる区間は、いずれかのデータ成分の
covering に含まれること」(=主張範囲 ⊆ 註釈区間の補集合 ∪ データ成分覆域の和)。規則成分の完全性は
自明で、主張が上書きするのはデータ由来の註釈だけ——どのデータ成分も語れない区間への完結主張
((satSun | h2026) covering: 2026..2030 の 2027 以降)は出所も版も持たない主張であり、成分テーブル
側の開端 covering(source:/asof: の統治つき)へ倒すのが正しい置き場所。純規則の合成への主張は空虚だが
無害(註釈が無いので上書き対象が無い)。判断 1 の tz: 宣言必須の執行はリファレンス実装では
未実装(同梱 stdlib の tz 供給形と衝突するため。impl/README に宿題として記録)。
改訂 2(2026-07-08・ADR-38): 二点を改める。(1) 判断 4 の filter 輸送行を逆像拡幅に精密化——
述語が読むのは点 d 自身とは限らず d の属する窓の全域(coincides・データ由来窓越しの ordinalIn)
なので、輸送は「述語が読んだ領域(窓)が註釈区間に交差したら、その逆像(当該窓に属する入力点の
全域)へ拡幅」と一般化する(選択子行と同型。従来の「依存束縛の註釈区間∩評価域」は述語が d の近傍しか
読まない場合の特殊形で、窓越し参照では過小近似だった=F75。coincides が強制事例)。
(2) 判断 6 の失敗種列挙に「coincides の窓所属なし」を追記。あわせて coincides の確定は
証人規則(ADR-38 判断 4)——真の確定は非註釈区間の点(証人)に限る・偽の確定は窓の実効被覆域
完全性に依存する非対称——であり、「計算値に点が在れば真」ではないことを本 ADR の側からも注記する
(everyDay \ holidays の退化尾部の点は証人にならない——判断 3 の「註釈は空でない結果にも付く」の
消費側の規則)。
改訂 3(2026-07-25・発報層還流 第 5 便=F105): 判断 4 の segmentBy 行を頭側へ精密化する——
窓列の実効被覆域は「マーカー覆域」ではなく「窓の張られた範囲」。マーカー覆域の内側でも窓の
張られていない区間(edges: drop/error の頭側〔覆域始端〜最初のマーカー〕・empties: drop の
中抜け)は窓列由来の註釈とし、そこへの読み(labels 射影・coincides の窓所属)には分類器が
「落として註釈」で応える。末尾の覆域端確定(F72——最終マーカー起点の窓は覆域端まで確定)の
頭側対称。動機: filter は実体化範囲全域の点を述語評価するため、従来の「覆域内=硬エラー」では
覆域始端 < 最初のマーカーの構成(filter 派生マーカーの典型——第 5 便の暦×占い検証で実測)で
labels 射影の filter 正準形が構造的に評価不能だった。覆域註釈を持たない規則マーカーは従来どおり
対象外。覆域始端=最初のマーカーの従来形は挙動不変(頭側が空なら註釈も増えない)。エラー→註釈の
緩和方向のみの変更で、正しく評価できていた式の意味は変わらない。