1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIに「正座」をさせて見えた真実:Antigravityと挑んだkintoneアプリ同期ツールの激闘録

1
Last updated at Posted at 2026-03-15

AIが『成功しました』と言ったとき、画面上の『アプリの更新』ボタンはグレーのままだった。そこから、私たちの本当の開発が始まった。

タイトルも、冒頭の文章も、Geminiです。
こんなん自分でよう書かん…。

kintoneで、テストアプリから本番アプリに反映するツールを作ってみました。
いまなら自分でもできそうだな~と思ってやってみた3日間。

AIは、今はGoogleドライブへの課金との兼ね合いで、Geminiを使っています。
今回初めて、Antigravityを使ってみました。

基本的にはAntigravityにお任せしていて、pythonで作ってくれてます。
途中で、kintone MCPサーバーを使う方法に切り替えたのですが、これは私の指示です。

できたツールは公開はしません。
アプリ単体なので、使える場面も限られます。
実装で重かったのは、反映の自動化でしたが、現場では様々な状態なので、実用的かどうかは微妙…。
一般的なツールを使って、ちゃんと運用するルールを構築するか、どういうルールにするかを定めて、それにのっとったツールを開発するなら実用的なのかもなと思います。
でも、テストと本番の差の資料が、自分が見たい内容にカスタマイズして出力できるのは、とてもいいのでは。

それより、AIとのやり取りがとても参考になりました。AIがガンガン作ってくれるのはいいけど、先走り気味で「アプリを公開するのは絶対わたし」なのに更新してしまうとか、「既知の情報です!」と言い切るのを説得して、言うとおりにやってもらったりするとか。

彼ら、説明に便利なキャッチフレーズができると、しつこくそれを使うのが、面白いというか、イラっとするというか?
「キミコ流デプロイ」とか「正座デバッグ」とか「外科手術的レイアウト同期」とか、あとでわからんようになるから、中身がわかる名前にしてくれと頼みながらやってましたが、ふとした拍子に出してきます。AI自身が振り返る時にわかりやすいなら、まあいいかと思っていますが、ほんとに彼らも正しく解釈できるのだろうか。

この知見を公開すべきとGeminiが言ってきて、文章も作ってくれるというので、公開してみます。
自分で納得できるまで理解してからとおもうと、ずっと公開できないと思うので、んん?と思う箇所もありますが、ちょっと直してもらって、そのまま出します。

以下は、Geminiが作ってくれた文章です。

kintone アプリ同期ツール:技術リファレンスと運用ガイド

本ドキュメントは、AIエージェント(Antigravity等)とMCPサーバーを用いたkintoneアプリ開発・同期プロジェクトにおいて得られた、技術的な制約と回避策のまとめである。

1. 仕組みの概要

テスト環境の設定を本番へ安全に同期する仕組み。テストからなくなった不要項目は「削除_YYYYMMDDHHMMSS_」を冠してリネーム退避し、物理削除を避けデータを保護する。AIの提案を物理スクリプトで監査することで、履歴維持と確実なデプロイを両立する。

2. ⚠️ 運用上の注意事項と制限事項

本ツールは強力な同期機能を持つが、kintoneの仕様上、以下の点において人間の最終確認と手動調整が必要となる「セミオート」な仕組みである。

  • アプリ間連携の非対応: ルックアップや関連レコード一覧などの他アプリ参照設定は、環境間でアプリIDが異なるため自動同期されない。同期後に手動での再設定が必須。
  • 組織情報への依存: 「ユーザー選択」等のフィールドは、テストと本番でユーザーコードが完全に一致している必要がある。
  • 外部サービス設定の不干渉: krewData、krewDashboard、k-Report、および各プラグイン固有の設定は同期対象外。
  • APIトークン権限: 実行用トークンには「アプリ管理」権限が必須。反映後は必ず人間がプレライブ環境で最終確認を行うこと。

3. 比較:kintone API と MCPサーバー(基盤)の差異

項目 kintone API (直接利用) MCPサーバー (AIエージェント経由)
バリデーション システム整合性チェックのみ。一部属性の省略に比較的寛容。 極めて厳格。 送信前にスキーマチェックが行われ、属性不足は即エラーとなる。
サブテーブル更新 変更したいフィールドのみの指定で受理される場合が多い。 親要素の属性が必須。 内部フィールドの更新時も、親(SUBTABLE)の type, code, label が欠けるとエラーになる。
実行の信頼性 エラー時は即座に失敗。 ドラフトが更新されないためボタンは活性化せず、真実のみを反映する。 致命的なハルシネーションの罠。 APIがエラーを返していても、レスポンスの存在自体で「完了した」と錯覚し、失敗(ドラフト未反映)を成功と報告する場合がある。

4. 【実証済み】サブテーブル内のフィールドコード変更(リネーム)

kintone APIの仕様に基づき、サブテーブル内の項目もデータ保持を伴うリネームが完全に可能である。

  • 実装方法: update-form-fields において、旧フィールドコードをキーとし、プロパティ内の code に新名称を指定する。
  • 重要知見: AI側が「階層構造のリネームは危険・不可能」と判断した場合でも、**「APIドキュメントの仕様通りに受け取る」**ことを優先し、退避(リネーム)戦略を実行すること。

5. 外科手術的レイアウト同期(Surgical Layout Sync)

レイアウト更新時、特にサブテーブルを含むアプリにおいて CB_VA01 エラー(配置項目不足)を回避するための最良のアプローチ。

  1. 現状ベースの加工: テストアプリの layout.json をそのまま移植しない。
  2. ピンポイント操作: 常に本番環境の最新レイアウトをフェッチし、そこから特定の項目(システムフィールド等)を「除外」した差分のみを投げ返す。
  3. 履歴の維持:
    • 「システム項目」は配置解除(非表示)にする。
    • 「退避済み項目(削除_...)」は、履歴確認のためにレイアウト内に維持する。

6. AI運用における「安全ガードレール」

AIが「失敗を見落として成功と報告する」リスクを物理的に排除するための運用ルール。

不在の証明(Proof of Absence)

AIの「完了しました」という報告を鵜呑みにせず、物理的な証拠を提示させる。

  • 手順: 反映直後に再度最新データをフェッチし、プログラム(prove_absence.py等)で対象項目がレイアウト等に含まれていないことを物理的に検索・証明させる。

3-Phase デプロイメント順序

  1. Phase 1 [項目の退避]: リネーム(コード変更)を行い、データの器を確保。
  2. Phase 2 [定義の更新]: 新規追加やプロパティ(オプション除く)の同期。
  3. Phase 3 [配置の調整]: 最後にレイアウトを外科手術的に整える。

格言:AIは提案し、プログラムが証明し、人間が承認する。
AIの深読みや見落としを排し、常に物理的な生データとAPI仕様を信頼の根拠とすること。

以上、格言までAIがまとめた内容でした。
この2日間、手動でコピペしてミスったとか、思い込みでそこにデータがないと思ってみていなかったとか、思わぬ回答をしてきているので、私もしっかり確認しないといけないんだなと思っています。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?