変更履歴とバージョン管理
ObjectOS のバージョン管理の方法、リリース間で何が変わるか、どのバージョンがサポートされるか。
バージョン管理の方針
ObjectOS のバージョンは セマンティックバージョニング の形式 MAJOR.MINOR.PATCH を取ります。ただし表に記載の例外が 1 つあります。v17 系では、マイナーでも破壊的な変更が入ることがあります。
| バージョンの上がり方 | 意味 | すること |
|---|---|---|
パッチ(14.7.0 → 14.7.1) | バグ修正。動作の変更なし | そのまま更新します。アプリの変更は不要です |
マイナー(17.4 → 17.5) | 新機能。v17 系では破壊的な修正も含みます。17.x のどのリリースノートにも同じ言葉で書かれています。「影響範囲ではなく、バージョン番号の上でのマイナー」です | 更新の前に、そのリリースのアップグレードチェックリストとバージョン別の手順を読んでください |
メジャー(13 → 14) | リリースノートに記載された破壊的な変更 | アップグレードの前に移行ガイドを読んでください |
すべての @objectstack/* パッケージは、同期したバージョン番号で一緒にリリースされます。個別ではなく、マトリクスとしてテストされています。
互換性マトリクス
| コンポーネント | 互換性のルール |
|---|---|
| ObjectOS イメージ ↔ コンパイル済みの成果物 | 同じマイナーバージョン。14.7.x のイメージは 14.7.x の成果物を実行します。14.7 の成果物は、14.0 のイメージにない機能を使っている場合があります。プロトコルハンドシェイク(PROTOCOL_VERSION、12.0 以降)が、互換性のないパッケージをインストール時に拒否します。 |
| ObjectOS ↔ CLI | 同じマイナーバージョンを推奨します。npm i -g で入れた CLI は、自身のバージョンに固定したスキャフォールドを書き出します。 |
| ObjectOS ↔ データベースドライバー | ドライバーはイメージのビルドで固定されます。Postgres 13 以上 / MongoDB 5 以上 / Turso(現行のもの)であることを確認してください。 |
| Node.js | 22 以上。17.0 以降に公開されたすべての @objectstack/* パッケージで engines.node は >=22.0.0 です。Node 20 は 2026-04-30 にサポートが終了しました。 |
サポート期間
サポートは固定の日付ではなく、現在のメジャーを基準に定義されます。
| ブランチ | 状態 |
|---|---|
| 現在のメジャー(現時点では 17.x) | 活発に開発中。新機能と修正 |
| 1 つ前のメジャー(現時点では 16.x) | セキュリティ修正のみ |
| それより古いメジャー | サポート対象外 |
重大なセキュリティ修正は、現在のメジャーと 1 つ前のメジャーにバックポートされます。それ以外はすべて main に入ります。特定のメジャーに関する日付は、そのメジャーのリリースノートとともに公開されます。
リリースノート
リリースされた ObjectOS のバージョンと CHANGELOG のエントリーは、次の場所で公開されています。
- npm:
@objectstack/runtime - GitHub:github.com/objectstack-ai/objectstack/releases
- ソースの CHANGELOG:
CHANGELOG.md - 詳しいリリースノート:リリースごとに 1 ページで、アップグレードチェックリスト付き。objectstack.ai/docs/releases にあります。v17 系は v17 です。
通知を受け取るには、GitHub で github.com/objectstack-ai/objectstack → Releases を watch してください。
最近の主な変更
以下の 17.x のマイナーは、どれも稼働中のデプロイの動作を変えます。各アップグレードチェックリストのうちオペレーターが行う部分は、アップグレードとロールバック → バージョン別の手順にあります。
17.7
@objectstack 17.7.0(2026-10-06 リリース)は、v17 系の現在のリリースです。資格情報を、それまで作られていたコピーから取り除き、見えない行を存在しない行と同じように応答させます。詳細なノート:objectstack.ai/docs/releases/v17/17-7。
警告: アップグレードの後、すべてのフローのシークレットと JWT 署名鍵をローテーションし、プライベートな共有リンクを発行し直してください。アップグレード前に作られたコピーは監査証跡に残ります。17.7 で設定したシークレットはそれより前のリリースでは読めないので、ロールバックの計画ではその点を考慮してください。アップグレードとロールバック → 17.7を参照してください。
変わったこと:
- 資格情報がコピーに乗って移動しなくなりました(セキュリティ)。フローの受信
secretとhttpノードのsigningSecretは書き込み専用のストアに移り、監査証跡は資格情報のフィールドを記録しなくなり、資格情報のフィールドはすべての書き込みレスポンス、レコードイベント、Webhook の本文、フローのトリガーレコードでマスクされます。 - 公開フォームは明示的なスイッチでのみ開きます(破壊的)。フォームが匿名で提供されるのは、その
sharingがallowAnonymousとpublicLinkに加えてenabled: trueを設定している場合だけです。後の 2 つだけを設定したフォームは404 FORM_NOT_FOUNDを返します。ビューを参照してください。 - 読めない行は存在しません。呼び出し元が読めない行に対する ID 指定の更新や削除は
404 RECORD_NOT_FOUNDを返し、フィルター指定の更新や削除は読める行だけに作用します。 - 読み書きは宣言されたフィールドだけを返します。廃止されたフィールドの残りなど、どのメタデータも宣言していない列は返されなくなりました。変換のためには
os migrate unmapped-columnsがそれを読みます。CLIを参照してください。 - アプリのコードは、保存されたメタデータにメタデータ API 経由でのみアクセスします。フック、アクション、ジョブのコードは
sys_metadataを直接読み書きしなくなり、それに書き込むフローのノードは拒否されます。 - 日付、時刻、数値は言語に従います。4 つの書式設定は廃止され、そのいずれかを指定する設定の書き込みは
400を返します。ローカリゼーションを参照してください。 - インメモリエンジンは起動時のストアではなくなりました。また、外部のサインインが、メールアドレスが未検証のローカルアカウントに自動でリンクすることはなくなりました。
- Console(Studio):objectui のピンを 5 回更新しました。最初の更新で、17.6 の既知の Console の問題 4 件を修正しています。
17.6
@objectstack 17.6.0(2026-10-02 リリース)は、どの入口でも同じ方法でアクセスを判定します。権限セットを持たない呼び出し元は何も得られず、フィールドレベルセキュリティはすべてのクエリに届きます。詳細なノート:objectstack.ai/docs/releases/v17/17-6。
変わったこと:
- 権限セットが 1 つも解決されない呼び出し元は、すべてのオブジェクトで拒否されます(破壊的、セキュリティ)。以前は、どのセットも付与していないすべてのオブジェクトに入ることができました。アプリが宣言した匿名エンドポイント(
authRequired: false)はオブジェクトを読み書きできなくなり、匿名の呼び出し元に権限セットを付与するサポート対象の経路はありません。公開フォームは引き続き動作します。 - フィールドレベルセキュリティがすべてのクエリの入口に届きます。フィールド間の比較、アクティビティストリーム、監査証跡、承認のスナップショット、分析が対象です。監査証跡とアクティビティストリームは、管理者を含むシステム以外の閲覧者に、その閲覧者が読めるレコードについての行だけを表示します。17.7 の
view_all_audit_log機能(プラットフォーム管理者が既定で持つ)により、削除とサインアウトの証跡は管理者に戻ります。監査ログを参照してください。 - パッケージのフローがその名前を取ります。パッケージのフローと同じ名前でデプロイに保存されたフローは実行されなくなり、オン/オフの切り替えはパッケージのフローだけを切り替えます。フローを参照してください。
- 保存されたメタデータの本文は、コピーされる場所ではどこでも秘匿化されます。保存済みのコピーには
os migrate audit-metadata-bodies --applyを実行してください。/api/v1/metaのデータソースのメタデータにはmanage_platform_settingsが必要です。 - 共有ルールとビューの「is empty」は
''と[]にも一致します。テキストと複数値のフィールドが対象です。 - 日付はどの入口でも 1 つのルールに従います。
datetimeは 1000 年から 9999 年までの年を表し、インポートは日付のセルを ISO 8601、エクスポート自身の形式、年が先の形式でのみ読みます。 - 共有選択リスト。新しい
picklistメタデータ種別で、フィールドから名前で参照でき、他のパッケージが拡張できます。
17.5
@objectstack 17.5.0(2026-09-29 リリース)は、いくつかの既定値を安全側に変えます。スケジュールされた処理はデプロイが求めるまでオフになり、行レベルセキュリティ、分析、レコードの書き込みは守れないものを拒否します。詳細なノート:objectstack.ai/docs/releases/v17/17-5。
警告: アップグレードして何もしないデプロイでは、スケジュールされたフローもパッケージの cron ジョブも実行されません。また walled のデプロイには、
OS_PLATFORM_OWNER_EMAILで指定するまでプラットフォーム管理者がいません。アップグレードとロールバック → 17.5を参照してください。
変わったこと:
- スケジュールされた処理は、デプロイがオンにするまでオフです(破壊的)。
OS_AUTOMATION_SCHEDULED_WORK_ENABLEDが、時刻でトリガーされるすべてのフローとパッケージの cron ジョブを制御します。環境変数を参照してください。 - walled のデプロイは、プラットフォーム管理者の地位を
OS_PLATFORM_OWNER_EMAILからのみ取ります(破壊的)。admin_full_accessの付与ではもう与えられません。 - 保存済みレポートの仕組みは削除されました(破壊的)。
/api/v1/reportsとスケジュールされたレポート配信が対象で、後継はありません。reportメタデータ種別、データセット、分析は変わりません。REST APIを参照してください。 - 行レベルセキュリティは、適用できない述語では閉じる側に失敗します。また
checkのないポリシーは、挿入と更新をそのusingに従わせるようになりました。 - 分析は、オブジェクトを読める呼び出し元にだけ応答します。それ以外は
/dataと同じく403で拒否されます。 - ディシジョンは最初に一致した分岐を取ります。
mode: 'inclusive'は真になるすべての分岐を実行します。Studio から保存されたディシジョンは、アップグレード時に新しい意味になります。フローを参照してください。 - 書き込まれる値は宣言された型に従います。
dateはYYYY-MM-DD、datetimeは ISO 8601、数値は JSON での表記です。それ以外は400 VALIDATION_FAILEDになります。 - 入力規則はルックアップを 1 段たどって読めます。また CEL に
current_user.can(object, verb)が加わりました。入力規則と CELを参照してください。 - ページサイズを宣言していないビューは、25 行ではなく 50 行を表示します。
17.4
@objectstack 17.4.0(2026-09-09 リリース)は、すべての期間のキーを単位付きの名前に変え、目立たない書き込み経路を 2 つ塞ぎます。詳細なノート:objectstack.ai/docs/releases/v17/17-4。
変わったこと:
- 読み取り専用のフィールドは、更新だけでなくシステム以外による作成でも取り除かれます。
droppedFieldsで報告されます。初期値はシステムとして投入してください。入力規則を参照してください。 - すべての期間のキーは名前に単位を持ちます(破壊的)。
timeoutはtimeoutMsに、refreshIntervalはrefreshIntervalSecondsになる、などです。エイリアスはありません。古い表記はパース時にキーの名前を示して拒否されます。 - セッションの
positionsがセキュリティの軸です。ポジションで絞り込まれた Console のゲートは、そのポジションを持つ人に対して応答するようになりました。 - フローは理由を付けて拒否できます。
outcome: 'refused'とレコードごとのmessageを持つendノードです。フローを参照してください。 - 分析の日付範囲は閉じた語彙です。宣言されたプリセットか
[start, end]のペアで、それ以外は400になります。 - 複数組織のランタイムはオープンソースです。
@objectstack/organizationsは公開パッケージです。
17.3
@objectstack 17.3.0(2026-09-04 リリース)は、v17 系で最大のリリースです。詳細なノート:objectstack.ai/docs/releases/v17/17-3。
変わったこと:
- オープンなセルフ登録は宣言が必要です(破壊的)。オーディエンスの態勢を宣言していないアプリは招待制で、保留中の招待がないサインアップは
403 SELF_REGISTRATION_CLOSEDで拒否されます(新規インストールの最初のアカウントは対象外です)。 - 共有の付与はテナントのスコープを持ちます。17.3 より前に書き込まれた
sys_record_shareの行には、オペレーターが実行するバックフィルが必要です。アップグレードとロールバック → 17.3を参照してください。 - 権限ストアの障害ははっきりと失敗します(
503)。機能を持たないユーザーとして解決されることはなくなりました。 - 自動採番は組織ごとに一意です。既存の重複は新しいインデックスを妨げるので、先に
os migrate duplicatesを実行してください。 - 複合のメタデータアドレス指定は廃止されました。
/api/v1/meta/:type/:section/:nameは404 ROUTE_NOT_FOUNDを返します。REST APIを参照してください。 - フローのオン/オフの切り替えには
manage_metadataが必要です。 - SDK:
client.projects.*はclient.environments.*になりました。エイリアスはありません。
17.2
@objectstack 17.2.0(2026-08-23 リリース)は、誰も評価しなかった条件を宣言した書き込みが、条件付きの書き込みとして扱われないようにします。詳細なノート:objectstack.ai/docs/releases/v17/17-2。
変わったこと:
- ID 指定の書き込みが述語を落とさなくなりました(破壊的)。
whereがid以外も指定している ID 指定の更新や削除は、multi: trueを宣言しない限り拒否されます。またdata.idとwhere.idが一致しないものは400 UPDATE_ID_MISMATCHを返します。 http_request_errors_totalは廃止されました。これをキーにしたパネルはゼロのままになります。http_requests_total{status=~"5.."}を使ってください。- 外部データソースのルートには機能の権限が必要です。
manage_platform_settingsかmanage_metadataです。 os g agentは廃止されました。代わりにスキルを作成してください。
17.1
@objectstack 17.1.0(2026-08-20 リリース)は v17 系の最初のマイナーでした。17.0 が作成できる範囲をはっきりさせたのに対し、17.1 はランタイムの応答をはっきりさせます。アクセスを取り消すと約束したフラグは実際に取り消し、失敗した読み取りは空の結果として返されなくなり、ディスパッチされなかったフローは失敗した実行として報告されなくなり、読めるはずのなかった資格情報は返されなくなります。詳細なノート:objectstack.ai/docs/releases/v17/17-1。
警告: 17.1.0 は、影響範囲ではなくバージョン番号の上でのマイナーです。そのセキュリティ修正のいくつかは、既存のデプロイで誰が読み書きできるかを変えますが、気づくきっかけになる移行の手順はありません。更新する前に、詳細なノートにある 17.1.0 のアップグレードチェックリストを確認してください。
変わったこと:
- 権限セットやポジションを無効化すると、実際にアクセスの付与が止まるようになりました(セキュリティ)。どちらのオブジェクトにも、アクセスが止まると約束するダイアログ付きの Deactivate アクションがありますが、その列を読むものはありませんでした。
active: falseで投入したポジションは引き続き権限セットを付与し、active: falseで投入した権限セットは引き続きプラットフォーム管理者の態勢を返していました。共有ルールはその境界を通らない別の経路でユーザーに届いていたため、無効化されたポジションとレコードを共有するルールは共有を続けていました。それらの共有は次の調整で取り消されます。active列がないか NULL の行は影響を受けません。このスイッチを効果がないと思って使っていたデプロイでは、これは稼働中のデータに対する実際の取り消しになるので、先に無効化された行を監査してください。権限セットを参照してください。 - 出荷される管理者セットは、
*ワイルドカードでのエクスポートを付与しなくなりました(破壊的)。admin_full_access、organization_admin、そこから派生したorganization_admin_no_bypassはobjects['*'].allowExport: trueを持っており、17.0 のエクスポートの軸を拒否できないものにしていました。アプリケーションがあるオブジェクトを誰もエクスポートできないと宣言しても、プラットフォームはエクスポートしていました。エクスポートは現在、アプリ自身の権限セットでオブジェクトごとに付与します。自動の代替は意図的に用意していません。読み取りは変わりません。これは一括での持ち出しだけを狭めるものです。 - 部分的なフィールドのマスキング。
FieldSchemaはmaskingRuleを宣言します。閉じたプリセットの列挙phone/id_card/bank_account/email/nameに加え、{ keepHead, keepTail }という逃げ道があります。ルールを宣言したフィールドは、システム以外のすべての呼び出し元に、マスクされているが判別できる形(138****5678)で返され、フィールドのrequiredPermissionsがマスク解除のゲートになります。マスキングは単一のランタイムの経路を通るので、API の呼び出し元、ブラウザのユーザー、CSV/XLSX のエクスポートルートはすべて同じ値を見ます。マスクされた呼び出し元は、そのフィールドでフィルター、並べ替え、グループ化、集計ができません。フィールドレベルセキュリティを参照してください。 - ObjectOS が公開していないオープンランタイムの機能が 2 つあります。17.1 で、レコード閲覧の監査(
sys_audit_logのreadアクション)と、レコードを読める人がその承認リクエストを見られる読み取り専用の階層が追加されました。どちらもコンストラクターのオプション(AuditPluginのreadAudit、承認サービスのrecordReaderVisibleObjects)でのみ有効になり、ObjectOS のランタイムはそれを設定しないので、ObjectOS のデプロイではどちらも使えません。 - フローの 3 つの入口すべてが、1 つの正直なステータス表で応答します。拒否されたディスパッチは失敗した実行として報告されなくなりました。見つからない場合は
404、409FLOW_DISABLED、422FLOW_NO_START_NODE、そして実際に実行されて拒否された場合は400FLOW_FAILEDです。オートメーションのtriggerルート、アクションの入口、宣言されたtype: 'flow'のエンドポイントは、3 つの個別のコピーではなく 1 つの共有の定義を読むようになり、outputMappingは失敗には適用されなくなりました。呼び出し元は内側のsuccessフラグではなく、HTTP ステータスで分岐してください。フローを参照してください。 error.codeはどの入口でも閉じた語彙です。プラットフォームの標準セット外のコードを投げてもerror.codeには届かず、新しい任意のdeclaredCodeに入ります。アプリケーション独自の表記は、プラットフォームの語彙を広げずに残ります。- 失敗した読み取りは空の読み取りとして扱われなくなりました。メタデータプロトコル、積み上げ集計のインデックス、カスケード削除とレジストリの検査にわたって、繰り返し起きていた種類の問題を塞ぎました。以前は失敗した読み取りと、正当に何も見つからなかった読み取りを区別できず、upsert の事前読み込みはすべての更新を挿入に変え、「これを削除すると何が壊れるか」には「何も」と答えていました。
catchは 1 つも削除していません。それぞれをエラーの種類で判別するので、プロビジョニングされていないテーブルは無害なまま、それ以外はすべて表面化します。 - 作成時のゲートがランタイムの公開の入口に届きます。
os build/os validateだけが実行していたルールが、ランタイムの書き込みも判定するようになったので、CLI が拒否するものを Studio やメタデータ API が通すことはできません。アップグレード後にos build/os validateを再実行してください。いくつかの新しい拒否によって、17.0 で問題なくビルドできたスタックが失敗することがあります。未知のトップレベルのスタックキー、ターゲットが宣言されたページでないダッシュボードヘッダーのmodalアクション、数式フィールドを指定したかフィールドを指定していないリストビューのsortなどです。 - Console(Studio):objectui のピンを 2 回更新しました。ダッシュボードのコンポーネントのキーの付け直し、アクションの構造化された
confirmオブジェクトの廃止、メトリクスウィジェットのI18nLabel、サブパスにマウントされた Console 向けにホストが行うsubmitBehavior.urlのリダイレクトが入っています。
17.0
@objectstack 17.0.0(2026-08-14 リリース)は、真実を語るリリースです。16.0 が宣言されたメタデータを正直にしたように、17.0 はその周りの部分に同じことをします。詳細なノート:objectstack.ai/docs/releases/v17/17-0。変わったこと:
- Node.js 22 が下限です(破壊的)。公開されている 50 のマニフェストすべてで、
engines.nodeが>=18.0.0から>=22.0.0になりました。CI、リリースパイプライン、出荷されるすべての Docker イメージはすでに 22 で動いていたので、約束が実態に合いました。Node 22 以上では何も変わりません。CI で Node のバージョンを固定している場合は、22 に固定してください。 - 一括エクスポートは独立した特権です(破壊的)。
allowExportが未設定の場合、以前は「読み取りを継承する」という意味でしたが、現在は拒否を意味します。またviewAllRecords/modifyAllRecordsもそれを与えなくなりました。パッケージが出荷するセットはアップグレード時に投入し直されるので、admin_full_accessとorganization_adminは引き続きエクスポートできますが、環境で作成したセットはそうではありません。ユーザーがエクスポートするカスタムセットにはallowExport: trueを追加してください。権限セットを参照してください。 - ファイルは列の中の blob ではなく、レコードです。メディアフィールド(
file/image/avatar/video/audio)は不透明なsys_fileの ID を格納し、{ url, name, size, … }オブジェクトは読み取り(展開)の形になります。プラットフォームがバイトを持つので、accept/maxSizeはブラウザ側のヒントではなく、宣言できてサーバーで強制されるものになります。変換はos migrate files-to-referencesが行います。フィールドの型を参照してください。 - GraphQL は削除されました(破壊的)。最初からスキーマだけでした。サービスが割り当てられていなかったため、ハンドラーは常に 501 を返していました。現在
/graphqlは 404 を返します。影響しないもの:外部データソースのプロトコルとしてのgraphql。これは ObjectOS が提供する API ではなく、他者の API です。 - 条件のない共有ルールは何も共有せず、無効化された RLS ポリシーは無効です(破壊的、セキュリティ)。条件なしで保存されたルールは、以前はそのオブジェクトのすべてのレコードとして評価されていました。また
enabled: falseでオフにした RLS ポリシーは、OR 分岐の付与を加え続けていました。どちらも閉じる側に失敗するようになりました。レコードアクセスを参照してください。 - 承認リクエストは参加者に表示されます(セキュリティ)。
getRequest/listRequests/countRequestsは表示ルールのうちテナントの半分しか適用していなかったため、認証済みのユーザーなら誰でも、自分のテナントのどのリクエストでも、ペイロードのスナップショット、判断の履歴、添付ファイルを読めました。 - 承認者を動的にルーティングできます。承認ノードに、
expression承認者(current.*/trigger.*/vars.*に対する CEL)、ノードレベルのonEmptyApproversポリシー、作成者が宣言する判断の出力(実行を<nodeId>.<key>のフロー変数として再開する)が加わりました。承認を参照してください。 - 壊れたデータソースは起動時にはっきりと失敗します。オブジェクトが結び付いたデータソースは接続できなければ起動が失敗し、
objectql.init()は応答しないデータドライバーでは起動を拒否し、ドライバーが応答しなくなると/api/v1/readyは 503 を返します。以前は、そのような起動は問題なく始まり、ゼロで終了し、その後で結び付いたオブジェクトのすべての読み書きが失敗していました。 enable.apiMethodsは 6 つの基本操作に縮小されました(破壊的)。作成できる列挙はget、list、create、update、delete、bulkだけです。8 つの従来の値は導出される実効操作です。保存されたものは、置き換え先を示す警告とともにパース時に取り除かれます。- 使われていないメタデータの掃除は続きます(破壊的)。
object.enable.trashとenable.mru、tool.requiresConfirmation、agent.tools[]、agent.knowledge、SkillSchema.permissions、レポートのaria/performance、flow.active、そしてパースはされるが無視されていた多数のキーが削除されました。どれも黙って取り除かれるのではなく、アップグレードの処方を示してパース時に拒否されます。ソースを書き換えるにはos migrate meta --from 16を実行してください。 - 作成できる範囲は閉じています。作成できるすべてのメタデータ型は、
create()だけでなくパースの経路でも、未知のキーを名前付きの処方とともに拒否するようになりました。タイプミスは、黙って効かない設定ではなく、位置の分かるエラーになります。
16.0
@objectstack 16.0.0 は開発者向けの範囲を収束させ、宣言されたメタデータを正直にします。呼び出し元の組織を表す公認の名前を 1 つにし、本物の複数承認者のガバナンス、実際に発火する時刻相対のオートメーション、そして黙って無視されていたメタデータを作成時のはっきりしたエラーに変えるプラットフォーム全体の掃除を入れました。詳細なノート:objectstack.ai/docs/releases。変わったこと:
- フック/アクションの
ctxからtenantIdエイリアスを削除(16.0、破壊的)。すべての*.hook.ts/*.action.tsの本体で、呼び出し元の組織はctx.user.organizationId/ctx.session.organizationIdとして読んでください(値は変わりません。システムの書き込みではctx.userはundefinedです)。ドライバー層のテナンシーの軸(ExecutionContext.tenantId)は別の概念で、変わりません。 - 承認:定足数、グループごとの承認(会签)、メタデータ駆動の受信箱。承認ステップは M-of-N の定足数(
minApprovals)と、各グループから 1 人の承認者を求めるステップをサポートします。開始時のスナップショットに対して集計し、不在時の代理を適用します。1 件の却下は引き続き拒否権を持ち、しきい値は範囲内に収められるので、設定ミスで行き詰まることはありません。判断には添付ファイルを付けられ、進捗(「2 of 3 · finance pending」)はサーバー側で計算されます。承認 / 却下 / 再割り当て / 差し戻し / 情報要求 / 催促 / 取り下げ / 再提出は、sys_approval_requestのtype:'api'アクションとして宣言されています。承認の受信箱は、手書きのボタンではなく汎用のアクションランタイムでそれらを表示します。 - 時刻相対のオートメーション。フローの開始ノードは
timeRelative(offsetDays: [60, 30, 7]かwithinDays)を宣言できます。毎日のスイープが一致するレコードごとにフローを 1 回起動するので、「契約終了の 60 日前に知らせる」がようやくそのまま動きます。たまたま編集したときにしか発火しない日付の等値条件は、もう必要ありません。 - フィルター付きの積み上げ集計。
summaryOperations.filterにより、親の合計は一致する子の行だけを集計し、子が述語の範囲に出入りすると再集計します。 - 厳密なダッシュボードウィジェット(16.0、破壊的)。
DashboardWidgetSchemaは.strict()です。宣言されていないキー(タイプミスや、削除されたインライン分析のキー)は、黙って何も表示しないのではなく、キーの名前を示してデータセットの形(dataset+dimensions+values)を指すパースエラーになります。 - MCP:stdio に ID、エージェントにリンター。stdio の自動起動は独自の
OS_MCP_STDIO_ENABLEDスイッチ(既定はオフ)に移り、OS_MCP_STDIO_API_KEY=osk_...のプリンシパルが必要です。閉じる側に失敗し、HTTP と同じ認可のチェーンで解決されます(RLS/FLS/テナントを適用し、systemのバイパスはありません)。新しいvalidate_expressionツールで、エージェントは数式を保存する前に実際のオブジェクトのスキーマに対して検査できます。 - 強制するか削除するかの掃除(16.0、破壊的)。宣言されているが強制されていなかったメタデータは、はっきりとエラーになりました。使われていないフィールド/オブジェクト/エージェントのプロパティは、案内付きで削除または廃止扱いになり、フックのイベントは 18 から 8 に統合され、入力規則から評価されることのなかった
'delete'イベントが外れ、Webhook のundelete/apiトリガーは削除され、未知のrequires機能トークンは作成時に拒否されます(aiStudio/aiSeatのエイリアスはなくなりました。ケバブケースのai-studio/ai-seatを使ってください)。 - エンジンが所有するシステムの行は、汎用データ API からは読み取り専用です(ADR-0103)。ジョブ、通知、承認ランタイムの行、共有の行、監査証跡、シークレットなどは
get/listに限定され、閉じる側に失敗するガードが/dataを通じたユーザーコンテキストの書き込みを拒否します。正当にユーザーの書き込みを受け付けるサードパーティのsystemオブジェクトは、userActionsを宣言する必要があります。 - 日付のロジックが嘘をつかなくなりました。
record.due_date == today()が一致するようになりました(日時の等値比較は、フィールドのオペランドを変換するように書き換えられます)。一方、数式での日付の算術(end - start + 1、today() + 30)は、daysBetween/daysFromNow/addDays/addMonthsを示すビルド時のエラーになります。それらの式はいずれにせよ、ランタイムでは常にnullになって失敗していました。 - ユーザーの一括インポートは既定で
passwordPolicy: 'auto'になりました。届けられる経路(実在のメールアドレスと設定済みのメールサービス、または電話番号と SMS の招待経路)がある行は招待され、届けられない行だけが 1 回限りの一時パスワード(must_change_password)を受け取ります。従来の ID のみの動作にするには、明示的にpasswordPolicy: 'none'を渡してください。行ごとの結果はrows[].deliveryにあります。
14.x
ObjectOS One とバンドルされたサーバーは @objectstack 14.7.0 で出荷されました。ランタイムの起動の契約は変わりません(createStandaloneStack は同じ成果物、環境、データベースの設定を受け取ります)が、13.0 と 14.0 はどちらも認可の語彙に破壊的な変更を入れているので、12.x 以前から更新する場合は、先に権限のメタデータを見直してください。詳細なノート:objectstack.ai/docs/releases。14.x で変わったこと:
- ADR-0090 の語彙の収束が完了(14.0、破壊的)。
book.audienceは{ permissionSet }で制御します(以前は{ profile })。PortalSchema.profiles→positions、RLSUserContextSchema.role→positions(文字列の配列)、sys_record_share.recipient_type: 'role'→'position'。 - オブジェクトの機能フラグが強制されます(14.0、ほぼ破壊的)。
enable.*フラグは、パースされるだけで使われないものから実際のゲートになりました。activitiesとfeedsはオプトアウトです(既定はtrue。feeds: falseはコメントを 403FEEDS_DISABLEDで拒否します)。trackHistoryは履歴タブを動かし、filesはオプトインです(enable: { files: true }までは 403FILES_DISABLED)。 - メンバーの基本権限から削除が外れました(14.2、破壊的)。
member_defaultはレコードの削除を付与しなくなりました。ポジションで配布する権限セットを通じて、オブジェクトごとに付与し直してください。 - 管理者によるユーザー管理と電話認証(14.3)。ユーザーの直接作成(
POST /api/v1/auth/admin/create-user、強制ローテーション付きの 1 回限りのパスワード)、一括インポート(行/CSV/XLSX、ドライラン、upsert)、@objectstack/plugin-sms(Aliyun / Twilio)による SMS OTP でのオプトインの電話サインイン、sms通知チャネルが入りました。 - データのライフサイクルの契約(14.4、ADR-0057)。オブジェクトは
lifecycle(クラス、保持期間、ローテーション、アーカイブ)を宣言します。既定で有効な LifecycleService がプラットフォームのデータを削除、ローテーション、アーカイブします(sys_activityは 14 日、sys_audit_logはホットで 90 日)。OS_LIFECYCLE_DISABLED=1で無効にし、lifecycle.retention_overridesで調整します。14.5 では、プラグインごとのretentionDays/retentionSweepMsオプション(JobRunRetention、NotificationRetention)をライフサイクルの宣言に置き換えて削除し、ライフサイクルのクラスを持つシステムのデータを専用のテレメトリーデータソース(OS_TELEMETRY_DB)に分けました。os db cleanは SQLite の領域を回収します。 - 有効期間付きの付与と委任(14.4、ADR-0091)。ポジションと権限セットの割り当ては
valid_from/valid_untilの期間をサポートします(閉じる側に失敗し、バックグラウンドジョブはありません)。またdelegatableのポジションでは、保持者が期間を区切って自分で委任できます(30 日以内、理由が必須、管理者のスコープは不可)。 - MCP のスコープの上限(14.5、ADR-0090 D10)。OAuth で接続したエージェントは
effective_permission = scope_ceiling ∩ user_grants(data:read/data:write/actions:execute)のもとで動き、閉じる側に失敗します。 - セキュリティ修正(14.4〜14.5)。FLS のキーはオブジェクトで修飾する必要があります(修飾のないキーは黙って何にも一致していませんでした。現在は自動修正付きのリントで拒否されます)。設定と共有リンクのルートは、なりすまし可能な
x-user-idのようなヘッダーを信頼しなくなりました。分析のクエリは呼び出し元の読み取りフィルターのスコープに限定されます。
13.x:権限モデル v2
@objectstack 13.0 は認可を再構成しました(ADR-0090)。破壊的な変更:
- ロールとプロファイルはポジションに収束。
sys_role*テーブル、RoleSchema/defineRole、メタデータ種別role/profile、ExecutionContext.roles[]はなくなりました。ポジションはフラットで、階層は事業単位のツリーに移りました。共有の受け手は名前が変わりました(role→position、role_and_subordinates→unit_and_subordinates)。 - カスタムオブジェクトの既定は非公開。所有者を持つオブジェクトで
sharingModelを明示していないものは非公開になりました。read/read_write/fullの OWD エイリアスは削除されました。以前の動作に戻すにはsharingModel: 'public_read_write'を宣言してください。 - RBAC のリンクテーブルへの書き込みを制限。
sys_user_position、sys_position_permission_set、sys_user_permission_set、sys_permission_setへの書き込みには、テナント管理者か委任管理者のスコープが必要です。
新機能:everyone / guest のオーディエンスのアンカー、委任管理(PermissionSet.adminScope)、層ごとの帰属を示す explain() エンジン、os compile のアクセスマトリクスのスナップショットゲート、MCP クライアント向けのセルフサービスの OAuth 2.1、作成時のセキュリティリント(validateSecurityPosture)、操作ごとの Object.requiredPermissions のマップ、パッケージの名前空間プレフィックスの強制。一度も強制されなかったスキーマ(コンプライアンス / マスキング / グローバル RLS の設定)はそのまま削除されました。
12.x
@objectstack 12.0 は API の既定の態勢を強化しました。
- 匿名のデータアクセスは既定で拒否(破壊的)。
api.requireAuthの既定はtrueになり、匿名の/data/*リクエストは 401 になります。公開データのデプロイはapi: { requireAuth: false }で明示的にオプトアウトする必要があります(起動時に警告が出ます)。共有リンク、公開フォーム、/auth、/healthは影響を受けません。 - プロトコルハンドシェイクの強制。
PROTOCOL_VERSIONとcheckProtocolCompat()が、互換性のないパッケージをインストール時に拒否します。 - 適応的なレコード表示。レコードはフィールドの複雑さから、ページかモーダル/ドロワーかの表示を導きます。
FormField.spanはレスポンシブになり('auto'/'full')、関連リストに'primary'タブへの昇格が加わりました。 - パッケージが出荷する権限。パッケージは既定の権限セットを宣言でき、それは出所の追跡付きで起動時に実体化されます。
- ビルド時のリント。
lint-view-refs、validateListViewMode、validateFormLayout、破壊的な操作の RBAC マッピングが、コンパイルを制御します。
10.x
10.x 系は @objectstack 10.0 〜 10.2 で出荷されました。破壊的な変更はすべて複数組織のテナンシー層に入ったので、単一テナントの ObjectOS のデプロイは、設定を変えずに 9.x から更新できました。変わったこと:
- 行レベルの組織のスコープ設定を独自のプラグインに分離(10.0、破壊的)。
organization_idの自動付与、組織ごとのシードの再生、既定の組織のブートストラップは、@objectstack/plugin-securityからオプトインの@objectstack/plugin-org-scopingに移りました。単一組織のデプロイは軽くなり(すべてのクエリで取り除くワイルドカードの RLS がありません)、OS_MULTI_TENANT=trueは引き続きplugin-securityより前にこのプラグインを自動登録するので、CLI で動かすプロジェクトはコードの変更が不要です。ADR-0002 では、テナントは物理的な分離(1 つの Environment = 1 つのデータベース)であり、organization_idは 1 つのデータベース内での論理的なスコープ設定なので、独自のプラグインに値します。 - 個人のワークスペースの自動作成を廃止(10.0、破壊的)。
plugin-securityは、新しいユーザーごとに「<User>'s Workspace」組織を作成しなくなりました。ユーザーは招待を受け入れるか、最初の組織を明示的に作成します(Slack / Linear / GitHub Orgs のモデル)。最初に登録したユーザー(プラットフォーム管理者に自動昇格)は、セッションが RLS を解決できるように、マルチテナントのモードでは引き続きDefault Organizationを 1 つ受け取ります。単一テナントのデプロイは組織を作成しません。 recordフォームフィールド型(ADR-0014)。Record<string, X>のプロパティ(オブジェクトのfieldsマップなど)は、生の JSON として漏れ出るのではなく、Studio で第一級のフォームフィールドとして編集できるようになりました。またオブジェクトのプレビューペインは実際のObjectGridレンダラーをマウントします。プレビューしたものがそのまま出荷されます。IEmbedderによる差し替え可能な埋め込み。新しい埋め込みのプロトコルと@objectstack/embedder-openaiが加わりました。ナレッジ / RAG のアダプターはIEmbedderを使うようになり、名前からplugin-プレフィックスが外れました。- 公開フォーム。
/f/:slugで提供される匿名の Web-to-Lead / Web-to-Case フォーム、統合された FormPage(公開の/f/:slugと内部の/forms/:name)、type: 'form'アクションのバリアント、ObjectSchemaのdefaultDetailFormが入りました。 - クラウドの ID の分離。
os cloud loginはos loginと別になり、クラウドのコントロールプレーンは非公開のリポジトリに移り(OSS のランタイムが軽くなりました)、objectstack initは再びビルドと起動ができるプロジェクトをスキャフォールドします。
9.x
9.x 系は、10.0 への切り替えの前に @objectstack 9.0 〜 9.11 で動いていました。ランタイムの起動の契約は 8.0 から変わりません(createStandaloneStack は引き続き同じ成果物、環境、データベースの設定を受け取ります)。そのため 8.0 のデプロイは設定を変えずに更新できます。変わったのは作成者向けの範囲です。
- 分析のデータセットが唯一の作成の場(9.0、破壊的)。ダッシュボードのウィジェット、レポート、リストのチャートは、セマンティックな
dataset(defineDataset(...))に結び付き、ディメンションとメジャーを名前で選びます。古いインラインのクエリフィールド(ウィジェットのobject/valueField/aggregate、レポートのobjectName/columns/groupingsDown、リストのチャートのxAxisField/yAxisFields)は削除されました。移行:インラインのクエリをdefineDatasetに移し、名前で参照してください。ChartTypeSchemaからも、基本の型としてしか描画されなかった 8 つのバリアント型が外れました(stacked-bar→bar、spline→line、bubble→scatter、…)。 - ビルド時の検証の厳格化(9.6〜9.7)。
os compileは、修飾のないフィールド参照(record.amountではなくamount)、未知の CEL 関数、誤ったフロー値の埋め込み構文で失敗するようになり、それぞれに「もしかして」のヒントが付きます。以前は「ビルドできたが黙って間違っていた」スタックが、はっきりと失敗するようになります。アップグレード後にos compileを再実行し、指摘されたものを修正してください。 - 数値フィールドの数式が混在した算術を計算します(9.7)。
record.amount / 100とrecord.price * 2は、黙ってnullになるのではなく評価されるようになりました。/ 100.0という浮動小数点リテラルの回避策は不要になりました。 - オブジェクトレベルの REST の制御が強制されます(ADR-0049)。オブジェクトの
apiEnabled: falseは REST からそのオブジェクトを外し、apiMethodsのホワイトリストは到達できる操作を制限します。以前はパースされるだけで強制されていませんでした。 - メタデータとしてのパッケージのドキュメントと
bookナビゲーション(9.3〜9.6)。src/docs/*.mdはdocメタデータとして登録されます。book要素(ADR-0046)は、所属を導出するナビゲーションの背骨を宣言し、オーディエンスによる制御付きでGET /api/v1/meta/book/:name/treeから提供されます。 os package install(9.3)。カタログ ID かインラインのエアギャップ用成果物から、稼働中のランタイムにパッケージをインストールします。認証には--email/--passwordを使います。- 承認(9.3)。修正のための差し戻し(
maxRevisions、既定は 3)、ジョブを使った SLA の自動エスカレーション、リストの検索/ページネーション、セッション不要の 2 か国語の承認/却下の確認リンクが入りました。 - 受信 Webhook のフロートリガー(9.3)。
type: 'api'のフローは、HMAC で検証されるPOST /api/v1/automation/hooks/:flowName/:hookIdエンドポイントをマウントし、べき等でキューを使った取り込みを行います。 - 通知の保持が既定で有効(9.5)。通知の履歴は 90 日で自動的に削除されます。履歴をずっと残すには、メッセージングの
retentionDays: 0を設定してください。 - CLI に AI プロバイダーの SDK を同梱(9.0)。OpenAI 互換のプロバイダー(DeepSeek、DashScope、SiliconFlow、OpenRouter、Cloudflare)が、グローバルにインストールした CLI でそのまま動きます。
フローの作成に関する動作の変更が 1 つあります。create_record ノードの outputVariable は作成されたレコードのオブジェクトを持つようになりました(以前は ID だけでした)。ID を期待していた {var} の参照は {var.id} に更新してください。
8.0.x
ObjectOS One とバンドルされたサーバーは @objectstack 8.0.1 で出荷されました。
- Streamable HTTP での MCP。すべてのデプロイが、ネットワークから到達できる Model Context Protocol サーバーとして動けます。
OS_MCP_SERVER_ENABLED=trueでオプトインし、エンドポイントは閉じる側に失敗する認証付きで/api/v1/mcpに提供されます(匿名のリクエストは拒否されます)。プラグインの名前は@objectstack/plugin-mcp-server→@objectstack/mcpに変わりました。 - セルフサービスの API キー。
POST /api/v1/keysは 1 回だけ表示されるsys_api_keyを発行します。REST のデータとメタデータの API(/api/v1/data、/api/v1/meta)は、MCP と同じ検証器で API キーを認証するようになり、キーの所有者の権限とレコードレベルセキュリティのもとで動きます。 - フィールドレベルの条件付きルール。
visibleWhen、readonlyWhen、requiredWhenは、フォームの UI だけでなく ObjectQL によってサーバー側で強制されます。 - 再利用できる RLS の読み取りフィルター。
security.getReadFilter(object, context)はレコードアクセスの読み取りスコープを公開します。分析のデータセット、ダッシュボード、レポートはそれにつながり、スコープを適用できないときは閉じる側に失敗します。 - スタンドアロンのホストスタック。ランタイムは単一テナントの
createStandaloneStackホストを出荷します。7.x の、クラウドに接続しホスト名でルーティングするcreateObjectOSStackのラッパーは削除されました。別に公開されたアプリを動かすデプロイは、それ以降その成果物を URL で指定します。現在それを行う変数と、それを行わない廃止された表記については、環境変数を参照してください。
5.0:project → environment の名前変更(出荷済み)
以前 Project と呼ばれていたランタイムの概念は、全体を通して Environment に名前が変わりました。影響を受けるもの:
- CLI のフラグ:
--environment/-e - HTTP のパス:
/api/v1/environments/:environmentId/... - ヘッダー:
X-Environment-Id - 環境変数:
OS_ENVIRONMENT_ID(OS_PROJECT_IDは当時、非推奨のエイリアスとして残されていましたが、現在は読まれません) - データベースの列:
environment_id - JSON スキーマ:
EnvironmentArtifact
アップグレード
機械的な手順はアップグレードとロールバックを、通過するすべてのリリースについてはそのバージョン別の手順を参照してください。事前の確認:
- 現在のバージョンから目標のバージョンまでの、すべてのマイナーの CHANGELOG のエントリーを読みます。
os diff <old-artifact> <new-artifact>を実行して、スキーマの破壊的な変更を洗い出します。- 目標のバージョンに対して
os doctorを実行します。 - フリート全体を更新する前に、カナリアのインスタンスを 1 つ立ち上げます。
- イメージのタグと成果物のバージョンの両方について、ロールバックの計画を用意します(この 2 つは別々に更新されます)。
リグレッションの報告
パッチやマイナーで、以前は動いていたものが壊れた場合は、更新前と更新後のバージョンを添えて github.com/objectstack-ai/objectstack/issues にバグを登録してください。リグレッションは最優先の種類のバグとして扱います。