@quolu/lattice 0.29.0 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE CHANGED
@@ -1,25 +1,148 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 quolu (kitepon-rgb)
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- The bundled sensor (sensor/) is a fork of @colbymchenry/codegraph (MIT);
16
- its original license and attribution are preserved in sensor/LICENSE and
17
- sensor/NOTICE.
18
-
19
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
- SOFTWARE.
1
+ # PolyForm Noncommercial License 1.0.0
2
+
3
+ <https://polyformproject.org/licenses/noncommercial/1.0.0>
4
+
5
+ ## Acceptance
6
+
7
+ In order to get any license under these terms, you must agree
8
+ to them as both strict obligations and conditions to all
9
+ your licenses.
10
+
11
+ ## Copyright License
12
+
13
+ The licensor grants you a copyright license for the
14
+ software to do everything you might do with the software
15
+ that would otherwise infringe the licensor's copyright
16
+ in it for any permitted purpose. However, you may
17
+ only distribute the software according to [Distribution
18
+ License](#distribution-license) and make changes or new works
19
+ based on the software according to [Changes and New Works
20
+ License](#changes-and-new-works-license).
21
+
22
+ ## Distribution License
23
+
24
+ The licensor grants you an additional copyright license
25
+ to distribute copies of the software. Your license
26
+ to distribute covers distributing the software with
27
+ changes and new works permitted by [Changes and New Works
28
+ License](#changes-and-new-works-license).
29
+
30
+ ## Notices
31
+
32
+ You must ensure that anyone who gets a copy of any part of
33
+ the software from you also gets a copy of these terms or the
34
+ URL for them above, as well as copies of any plain-text lines
35
+ beginning with `Required Notice:` that the licensor provided
36
+ with the software. For example:
37
+
38
+ > Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
39
+
40
+ ## Changes and New Works License
41
+
42
+ The licensor grants you an additional copyright license to
43
+ make changes and new works based on the software for any
44
+ permitted purpose.
45
+
46
+ ## Patent License
47
+
48
+ The licensor grants you a patent license for the software that
49
+ covers patent claims the licensor can license, or becomes able
50
+ to license, that you would infringe by using the software.
51
+
52
+ ## Noncommercial Purposes
53
+
54
+ Any noncommercial purpose is a permitted purpose.
55
+
56
+ ## Personal Uses
57
+
58
+ Personal use for research, experiment, and testing for
59
+ the benefit of public knowledge, personal study, private
60
+ entertainment, hobby projects, amateur pursuits, or religious
61
+ observance, without any anticipated commercial application,
62
+ is use for a permitted purpose.
63
+
64
+ ## Noncommercial Organizations
65
+
66
+ Use by any charitable organization, educational institution,
67
+ public research organization, public safety or health
68
+ organization, environmental protection organization,
69
+ or government institution is use for a permitted purpose
70
+ regardless of the source of funding or obligations resulting
71
+ from the funding.
72
+
73
+ ## Fair Use
74
+
75
+ You may have "fair use" rights for the software under the
76
+ law. These terms do not limit them.
77
+
78
+ ## No Other Rights
79
+
80
+ These terms do not allow you to sublicense or transfer any of
81
+ your licenses to anyone else, or prevent the licensor from
82
+ granting licenses to anyone else. These terms do not imply
83
+ any other licenses.
84
+
85
+ ## Patent Defense
86
+
87
+ If you make any written claim that the software infringes or
88
+ contributes to infringement of any patent, your patent license
89
+ for the software granted under these terms ends immediately. If
90
+ your company makes such a claim, your patent license ends
91
+ immediately for work on behalf of your company.
92
+
93
+ ## Violations
94
+
95
+ The first time you are notified in writing that you have
96
+ violated any of these terms, or done anything with the software
97
+ not covered by your licenses, your licenses can nonetheless
98
+ continue if you come into full compliance with these terms,
99
+ and take practical steps to correct past violations, within
100
+ 32 days of receiving notice. Otherwise, all your licenses
101
+ end immediately.
102
+
103
+ ## No Liability
104
+
105
+ ***As far as the law allows, the software comes as is, without
106
+ any warranty or condition, and the licensor will not be liable
107
+ to you for any damages arising out of these terms or the use
108
+ or nature of the software, under any kind of legal claim.***
109
+
110
+ ## Definitions
111
+
112
+ The **licensor** is the individual or entity offering these
113
+ terms, and the **software** is the software the licensor makes
114
+ available under these terms.
115
+
116
+ **You** refers to the individual or entity agreeing to these
117
+ terms.
118
+
119
+ **Your company** is any legal entity, sole proprietorship,
120
+ or other kind of organization that you work for, plus all
121
+ organizations that have control over, are under the control of,
122
+ or are under common control with that organization. **Control**
123
+ means ownership of substantially all the assets of an entity,
124
+ or the power to direct its management and policies by vote,
125
+ contract, or otherwise. Control can be direct or indirect.
126
+
127
+ **Your licenses** are all the licenses granted to you for the
128
+ software under these terms.
129
+
130
+ **Use** means anything you do with the software requiring one
131
+ of your licenses.
132
+
133
+ ---
134
+
135
+ Required Notice: Copyright 2026 quolu (kitepon-rgb) — https://github.com/kitepon-rgb/Lattice
136
+
137
+ Patent notice: this software implements the subject matter of Japanese patent
138
+ application 特願2026-178950 (filed 2026-07-27). Patent rights are reserved except as
139
+ licensed above for permitted (noncommercial) purposes.
140
+
141
+ Commercial use: not granted by these terms. A separate license from the copyright and
142
+ patent holder is required. Enquiries: https://github.com/kitepon-rgb/Lattice/issues
143
+ Whether such a license is granted, and on what terms, is decided case by case.
144
+
145
+ Third-party components: the bundled structure sensor in `sensor/` is third-party work
146
+ absorbed into this repository and remains under the MIT License. Its upstream origin and
147
+ attribution are recorded in `sensor/NOTICE`; the license text is `sensor/LICENSE`.
148
+ These terms do not modify that license.
package/README.ja.md ADDED
@@ -0,0 +1,251 @@
1
+ <p align="center">
2
+ <img src=".github/og.png" alt="Lattice — 見かけだけの競合で作業を直列化しない" width="100%">
3
+ </p>
4
+
5
+ # Lattice
6
+
7
+ [![npm](https://img.shields.io/npm/v/@quolu/lattice?color=cb3837&logo=npm)](https://www.npmjs.com/package/@quolu/lattice)
8
+ [![CI](https://github.com/kitepon-rgb/Lattice/actions/workflows/ci.yml/badge.svg)](https://github.com/kitepon-rgb/Lattice/actions/workflows/ci.yml)
9
+ [![license](https://img.shields.io/badge/license-PolyForm%20Noncommercial%201.0.0-blue)](LICENSE)
10
+ [![node](https://img.shields.io/node/v/@quolu/lattice?color=339933&logo=node.js&logoColor=white)](https://nodejs.org/)
11
+ [![patent](https://img.shields.io/badge/patent-pending%20JP%202026--178950-6366f1)](#特許)
12
+
13
+ [English](README.md) · **日本語**
14
+
15
+ > **見かけだけの競合で、作業を直列化しない。**
16
+ > Latticeはmulti-agent開発のためのschedulability compilerです。codebaseの実際の境界を観測して
17
+ > どのtaskが並列に走れるかを裏付け、本当に衝突している場合は**その境界をrefactorして
18
+ > planを再コンパイルし、並列に走れる形へ変えます**。
19
+
20
+ ## なぜ要るのか
21
+
22
+ 3つのagentに3つのtaskを渡すと、たいてい次のどちらかで失敗します。
23
+
24
+ - **直列にしすぎる。** 「どちらも`renderer.ts`を触るから順番に」——実際には*別々のsymbol*を
25
+ 触っていて、同時に走れたかもしれない。
26
+ - **直列にしなさすぎる。** 依存を誰も宣言しなかったので並列で走らせ、両方が書いた後で衝突に気づく。
27
+
28
+ どちらも原因は同じで、**誰も境界を実測していない**ことです。task listの依存線は意図の主張であって、
29
+ codeについての証拠ではありません。
30
+
31
+ Latticeはここを違う手で塞ぎます。競合を**検出する**だけでなく**取り除く**。2つのtaskが1つのfileを
32
+ 奪い合っているなら、切り方を導出し、隔離worktreeで適用し、五条件で検証し、変換後のsourceに対して
33
+ planを再コンパイルします。共有面が共有でなくなるので、競合辺そのものが消えます。
34
+
35
+ ### 実例(このrepo自身)
36
+
37
+ 2つの工程がどちらも`src/seam-commit.mjs`を変更する必要がありました。Latticeは宣言をcompileして
38
+ `conflict_count: 1`・`severability: code_seam`と判定し、切り方を提案し、隔離worktreeで適用。
39
+ 五条件をすべて満たしたので、fileは工程ごとの所有面+共有面+残余面へ分割されました。
40
+ 再コンパイルは`conflict_count: 0`を返し、両工程は同じparallel groupに入りました。
41
+
42
+ 人が手で切ったのではありません。**工程を並列化するために製品が切りました。**
43
+
44
+ ### 変換の受入五条件
45
+
46
+ **5つすべて**を満たしたときだけ採用します。1つでも欠ければ棄却です。
47
+
48
+ | 条件 | 意味 |
49
+ |---|---|
50
+ | `behavior_equivalent` | 原pathの公開export面が保たれている |
51
+ | `focused_tests_passed` | 影響testが変換後のsourceで実際に通る |
52
+ | `sensor_fresh` | 構造索引を取り直し、新しい面を収載している |
53
+ | `overlap_reduced` | 対象の競合が消え、**かつ**plan全体の競合対が増えていない |
54
+ | `parallelism_improved` | 実行段階数が減っている |
55
+
56
+ ## 開発工場での位置づけ
57
+
58
+ Latticeは[dotagents開発工場](https://github.com/kitepon-rgb/dotagents)が管理する
59
+ 自作コア10製品の一つです。本repoはplan/ToDo/run store、sensor、schema、migration、
60
+ release、diagnosticsを所有し、dotagentsは製品横断の工程利用・導入・host統合を所有します。
61
+ 廃止済みの前身sensorは独立製品として配線せず、Lattice sensorだけを現役面とします。
62
+ MarkItDownは別区分の第三者CLIです。
63
+
64
+ 現在の工程状態と完了証拠の正本は、このrepoのLattice storeです。文書の役割と現行導線は
65
+ [docs/README.md](docs/README.md)、製品思想は[PLAN.md](PLAN.md)、公開contractは
66
+ [docs/00_product-contract.md](docs/00_product-contract.md)を参照してください。
67
+
68
+ CLIの全体像は`lattice --help`、各公開namespaceの正規構文は
69
+ `lattice <plan|run|event|todo|sensor|factory-diagnostics|runtime-errors|bridge> --help`で確認できます。
70
+ 個別操作は`lattice <namespace> <subcommand> --help`または`lattice help <namespace> <subcommand>`で
71
+ 正規optionをstore非依存に確認できます。
72
+
73
+ ## 開発
74
+
75
+ ```bash
76
+ npm test
77
+ npm run check
78
+ npm run ci
79
+ node scripts/reap-orphan-test-daemons.mjs
80
+ lattice sensor sync . --json
81
+ spotter doctor
82
+ codex-sidecar diagnostics --project . --preset auditor --json
83
+ ```
84
+
85
+ `reap-orphan-test-daemons.mjs`は、実daemonを起動するtestが取り残したprocessを一覧します。既定は表示
86
+ だけで何も停めません。停めるのは`--reap`を付けた時に限り、対象はargvが指すfixtureのdirectoryが既に
87
+ 存在しないものだけです。実行中のtestを巻き込まないための条件なので、fixtureが残ったまま死んだ実行を
88
+ 含めたい場合だけ`--older-than-hours=<n>`で起動時刻による許可を明示します。
89
+
90
+ 未初期化projectで`sensor sync`した場合は`LATTICE_SENSOR_NOT_INITIALIZED`と正規`next_action`を返します。
91
+ その他のsensor失敗もexit code、signal、bounded stderrをtyped detailへ残し、原因を隠しません。
92
+
93
+ Node.js 22.13以上を使用します。境界観測は配布物に同梱したLattice sensorだけを使い、PATH上の
94
+ 廃止済みruntimeや旧cache/dataへfallbackしません。Spotterはproject単位で生成stateの所有境界を守ります。
95
+
96
+ どのrepoでも、Latticeの導入状態はdirectoryの有無を推測せず、最初に次のtyped discoveryで判定します。
97
+
98
+ ```bash
99
+ lattice status --json
100
+ ```
101
+
102
+ `state`は`uninitialized | ready | active_run | invalid`のいずれかです。`uninitialized`は
103
+ 正常な未初期化状態で、`next_action`が正規の初期authoring入口を返します。初回planは
104
+ 新規planはPhase監査とToDo schedulingを分離する`lattice.plan_create_input.v3`のcanonical
105
+ JSON+LFを用意し、次で作成します。既存v2/v4は互換契約として維持されます。
106
+
107
+ ```bash
108
+ lattice plan create --schema-version 3 --json
109
+ ```
110
+
111
+ ```bash
112
+ lattice plan create --input .lattice/plan-create.json
113
+ ```
114
+
115
+ `invalid`をMarkdown fallbackへ丸めず、`next_action`に従ってstoreを診断してください。
116
+ discoveryと初期transactionの不変条件は
117
+ [ADR 0058](docs/adr/0058-project-discovery-and-initial-authoring.md)が正です。
118
+
119
+ ## 実行runを端から端まで動かす
120
+
121
+ compileしたrunを実際にdispatchするには、executor adapterを登録してからactivateします。
122
+ 参照実装の`lattice-scripted-adapter`を配布しているため、公開CLIと配布binだけで
123
+ 実write・receipt受理・closeまで到達できます。
124
+
125
+ ```bash
126
+ lattice run adapter register --schema --json # 登録入力のJSON Schema
127
+ lattice run adapter register --input adapter.json
128
+ lattice run adapter list --json
129
+ lattice run activate --run .lattice/runs/<id>
130
+ lattice run status --run .lattice/runs/<id> # accepted に子が入る
131
+ lattice event verify --run .lattice/runs/<id>
132
+ lattice run close --run .lattice/runs/<id>
133
+ ```
134
+
135
+ digestは手で計算しません。binary・config・capabilities・自己digestは登録時にCLIが導出します。
136
+
137
+ `plan compile`が`BOUNDARY_UNKNOWN`を返す場合は、まず`git status --short`が空かを確認してください。
138
+ 未追跡ファイルがあるとsensor statusが`stale`になり、witnessが未解決unknownへ落ちます。
139
+ 作業ツリーをcleanにすると同じrequestがそのまま通ります。
140
+
141
+ TODO工程storeの読取は`lattice todo status`、`compile_binding`付きTaskの投影は
142
+ `lattice todo bindings`、検証は`lattice todo verify`、表示生成は
143
+ `lattice todo gantt`を使います。topology/source reconciliationは
144
+ `lattice todo revise --plan <key> --input <canonical-revision.json>`、Phase付きplanは
145
+ `lattice todo revise-phase --plan <key> --input <canonical-phase-revision.json>`でsuccessor発行します。
146
+ cross-plan topologyを同時に切り替える場合は
147
+ `lattice todo revise-set --input <canonical-revision-set.json>`を使い、Phase revisionを含む集合は
148
+ `lattice.todo_revision_set.v3`で通常revisionと混在できます。
149
+ Phase付きv5 planでは、通常ToDoの開始順はToDo DAGだけで決まり、Phase前後関係は重監査の順序だけを
150
+ 制御します。特定ToDoがPhase受理を本当に必要とする場合だけ`phase_accept_dependencies`で明示します。
151
+ `lattice todo status --json`の`dispatch_frontier`はready全件を同時dispatchする既定を示します。
152
+ readyが複数なら最初のstartに`--parallel-frontier`を付け、subsetだけを直列着手する場合は
153
+ `--override-reason <reason>`で理由を残します。
154
+
155
+ ```bash
156
+ lattice todo start --plan <key> --task <id> --parallel-frontier
157
+ lattice todo start --plan <key> --task <id> --override-reason <reason>
158
+ ```
159
+
160
+ `--parallel-frontier`はhostへ並列dispatch方針を宣言する開始gateです。Lattice自身がAI hostのagentを
161
+ 起動するものではなく、実際のdispatchはhostが行います。宣言後もready全件が着手されたかは
162
+ `active_set`と`next_ready`で観測できます。
163
+ ToDo完了は軽量確認までで、所属ToDoが全てdoneになったPhaseは`gate_ready`となり、`todo phase review`後に
164
+ required evidenceを束縛した`todo phase accept`で重監査の判断を記録します。監査回数やPhase数を自動追加する
165
+ 機能ではありません。Phase状態は
166
+ `lattice todo phase status --plan <key>`、閲覧中に進捗が更新される工程表は
167
+ `lattice todo gantt serve --port 0`で確認できます。live viewerはloopback-only、read-onlyで、
168
+ `/projects/<project_id>/`というproject固有URLを返します。別projectからそれぞれ起動すれば、独立port・独立SSE経路で同時表示できます。
169
+ session開始時のtyped discoveryで使う`lattice status --json`と、actor環境変数を持つ通常のTODO操作は
170
+ active projectを自動登録し、一つのloopback dashboard daemonを再利用します。
171
+ `/projects/`の一覧からproject固有の工程図を開け、各projectのSSE更新は互いに分離されます。
172
+ dashboardはmanifestのfile identityが変わらない間のstable store readを再利用します。
173
+ 巨大工程図のrender中にhealth応答が遅れても、生存中dashboardを新daemonで置き換えず
174
+ `DASHBOARD_DAEMON_UNRESPONSIVE`としてtyped拒否します。
175
+ 最近のsession activityが期限切れでも、Lattice storeの`active_set`が非空なprojectは一覧へ残ります。
176
+ 長時間の外部処理中にCLI呼出しが途切れても進行中projectを休眠扱いしません。
177
+ LANや外部reverse proxyから閲覧するoptional bridgeは既定で無効です。明示したIPにだけbindする初回設定、
178
+ 再設定、停止方法は[bridge setup](docs/bridge-setup.md)を参照してください。reverse proxy hostへsshで
179
+ 到達できる場合は、LANへbindせずloopbackだけを逆トンネルで公開する構成も選べます。
180
+ 工程図の既定表示は、後続に作業中・未着手が残っていない完了工程を図から除きます。まとめnodeも置かないため、
181
+ 完走したplanは図の場所を取りません。除いた工程は凡例の件数、右ペインの「全工程」一覧、各工程の詳細から
182
+ 辿れ、詳細の前提・後続は除外前の依存関係を示します。総数・進捗・最長依存鎖は除外前の全工程で数えます。
183
+ 凡例の件数バッジを押すと全工程を描いた図へ切り替わり、`lattice todo gantt --scope all`は最初から全件を
184
+ 描きます。表示規約は[ADR 0066](docs/adr/0066-gantt-live-scope-drops-finished-work.md)が正です。
185
+
186
+ 右ペインは概要・選択工程・全工程の3面で、いずれもToDo storeを表示します(元plan Markdown本文は
187
+ 再表示しません。元文書へは各工程の詳細が持つ行対応から辿ります)。全工程一覧は動いているplanを
188
+ 最終活動の新しい順で上に、全工程が図から外れた完走planを古い順で下にまとめ、plan内は登録順です。
189
+ 決着済みPhaseと図から外した工程は既定で畳み、開けば読めます。規約は
190
+ [ADR 0067](docs/adr/0067-right-pane-shows-the-store-and-orders-by-activity.md)が正です。
191
+
192
+ 静的工程表は`lattice todo gantt status`で`current / stale / missing`を確認でき、HTMLまたは
193
+ digest付きsidecarの欠落・改ざんはtyped failureになります。
194
+ dashboard daemonは起動時に読み込んだ版数をhealthで名乗り、installされた版と食い違えば`lattice status`の
195
+ たびに新版daemonへ置き換わります。publishしただけで配信面が古いまま残ることはありません。
196
+ 入れ替えは新daemonが登録済み全projectのstoreを読み終えるまで待つため、`lattice status`の応答が
197
+ その間伸びます(実測: 8 project登録で約50秒台)。待ち時間は固定秒数ではなく、spawnした子が生きている
198
+ 間だけ待ち、子が死ねば即座に`DASHBOARD_DAEMON_UNAVAILABLE`を返します。既定120秒の上限は、応答を
199
+ 返さない子に対するbackstopであって正常な起動時間の見積りではありません。
200
+ 状態を書き込む`start / block / unblock / done / evidence promote / reopen / revise / revise-phase / revise-set`
201
+ では、監査actorとして次の3環境変数をすべて設定してください。
202
+
203
+ ```bash
204
+ export LATTICE_TODO_ACTOR_HOST=<host-id>
205
+ export LATTICE_TODO_ACTOR_SESSION=<session-id>
206
+ export LATTICE_TODO_ACTOR_AGENT=<agent-id>
207
+ ```
208
+
209
+ 不足またはidentifierとして不正な値がある場合、mutationはstoreを変更せず`ACTOR_UNRESOLVED`を返します。
210
+ error detailの`missing_environment`/`invalid_environment`と
211
+ `next_action: set_required_actor_environment_and_retry`を確認し、正規値を設定して同じ操作を再試行してください。
212
+
213
+ 正確なargv、evidence descriptor、result wireは
214
+ [ADR 0056](docs/adr/0056-todo-authoring-transitions.md)を参照してください。
215
+
216
+ ## 特許
217
+
218
+ 本repositoryの設計は日本国特許出願の対象です。
219
+
220
+ | | |
221
+ |---|---|
222
+ | 出願番号 | 特願2026-178950 |
223
+ | 出願日 | 2026-07-27 |
224
+ | 発明の名称 | 情報処理装置、ソフトウェア開発制御方法及びプログラム |
225
+ | 請求項 | 12項 |
226
+
227
+ **特許権は留保します。** 非商用利用についてはsoftwareと一緒に許諾します(下記License参照)。
228
+ **商用利用は許諾しません**——著作権のlicenseも特許のlicenseも商用へは及びません。
229
+ 出願を明記するのは、権利の所在を後から知るのでなく最初に見えるようにするためです。
230
+
231
+ ## License
232
+
233
+ **[PolyForm Noncommercial License 1.0.0](LICENSE)** — 非商用利用は無償です。
234
+
235
+ - **無償:** 個人のproject、学習・研究、趣味やアマチュアの制作、慈善団体、教育機関、
236
+ 公的研究機関、政府機関
237
+ - **許諾しません:** 商用利用。Lattice自体を再配布するかどうかに関わらず、企業の業務や製品の
238
+ 中で使う場合を含みます
239
+
240
+ これはOSI承認のオープンソースライセンス**ではありません**。設計が特許出願の対象であり、
241
+ 商用の権利を留保しているので、意図してそうしています。
242
+
243
+ **商用利用には**、著作権者・特許権者からの別途の許諾が必要です。
244
+ 問い合わせは[issue](https://github.com/kitepon-rgb/Lattice/issues)から受け付けます。
245
+ 許諾するかどうか、どのような条件にするかは個別に判断します。
246
+
247
+ 同梱の構造sensor([`sensor/`](sensor/))は本repositoryへ吸収した第三者成果物で、
248
+ **MIT License**のままです。upstreamの出自と帰属表示は[`sensor/NOTICE`](sensor/NOTICE)、
249
+ license本文は[`sensor/LICENSE`](sensor/LICENSE)が持ちます。上記の条件はこれを変更しません。
250
+
251
+ © 2026 quolu (kitepon-rgb)