Webhook 提供予定

変化を、起きた瞬間に知る。

承認・配信のイベントを、発生と同時にお使いのエンドポイントへ届けます。署名付き・再送あり・順序保証。本ページに記載するのは確定済みの設計であり、提供済みの機能ではありません。

まだ実装されていません。 現在の untactit に Webhook 送信はありません。それでも設計を公開するのは、評価中のチームから連携の形を聞かれることが多く、曖昧な答えより確定した答えのほうが役に立つからです。以下の仕様は確定しています。イベント 7 種、HMAC 署名、at-least-once 送信。untactit の導入にこれが必要な場合は、その旨をお知らせください。それが優先順位を上げる方法です。

現時点での代替手段

いま、できること。

監査ログはすでにすべての状態変化を記録しており、実行者・アクション・期間で照会できます。定期的にポーリングすれば同じ情報を得られます。違いはレイテンシーと、受け手側のコードが少し増えることだけです。

夜間のコンプライアンス同期やダッシュボードの更新など、大半のワークフローには、それで本当に十分です。Webhook が意味を持つのは、秒単位で反応する必要があるときです。

監査ログとエクスポート

確定済みイベント(7 種)

asset.proposed
編集者が承認を申請した
asset.approved
承認者が承認し、アセットが有効になった
asset.rejected
コメント付きで差し戻された
deployment.completed
全ターゲットで確認完了
deployment.failed
1 つ以上のターゲットが拒否した
drift.detected
ローカルコピーが承認済みの内容から乖離した
member.role_changed
管理者がロールを付与または取り消した

確定済みの設計

署名付きで、リプレイにも安全。

すべてのリクエストには X-Untactit-Signature (生のリクエストボディの HMAC-SHA256)と、タイムスタンプが付与されます。必ず両方を検証してください。署名は untactit からの送信であることを証明し、タイムスタンプは古いリクエストのリプレイを防ぎます。

  • 5 分より古いタイムスタンプは拒否
  • 署名の比較は定数時間で行います。次の演算子は使用しないでください: ==
  • エンドポイントはワークスペースあたり最大 5 件
verify.py
import hmac, hashlib, time

def verify(body: bytes, sig: str, ts: str, secret: str) -> bool:
    if abs(time.time() - int(ts)) > 300:      # 5 min
        return False
    expected = hmac.new(
        secret.encode(), ts.encode() + b"." + body,
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(expected, sig)

送信の保証 提供予定

At-least-once

2xx が返るまで再送を続けるため、同じイベントが 2 回届くことがあります。重複排除には idを使ってください。再送は指数バックオフで間隔を広げながら、最大 24 時間続きます。

ワークスペース単位で順序保証

A sequence フィールドは単調増加します。48215 の後に 48213 を受信した場合、それは遅延した再送であり、破棄して構いません。

48 時間で無効化

2 日間連続で失敗し続けたエンドポイントは無効化され、ワークスペースの管理者へメールで通知されます。1 回の試行あたりのタイムアウトは 10 秒です。

エージェントが何で動いているのか。推測は、もう終わり。

ワークスペースをひとつ接続するだけで、チームで動いているスキル・ルール・メモリの全体が見えます。所要はおよそ10分です。

無料で始める 相談する

クレジットカードは不要です。いまお使いのツールのままで動きます。