Vigil — an outside witness for AI agents

Agent leases, signed receipts, watchdogs, and optional paid source-verification evidence.

사용해야 할까요

품질 및 안전성

A
설명 품질
93%
스키마 완전성
89%
이름 품질
80%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

발견 사항 (3)

  • LOWTool 'vigil_pricing' description lacks action verbvigil_pricing에서
  • LOWTool 'vigil_usage' description lacks action verbvigil_usage에서
  • LOWTool 'vigil_lease_status' description lacks action verbvigil_lease_status에서

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~8,424토큰 (도구 정의)
~2.7 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 6.58%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "vigil": {
      "url": "https://vigilnotary.com/mcp"
    }
  }
}

원격 엔드포인트

https://vigilnotary.com/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (26)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢vigil_info

Service description, the Ed25519 signing pubkey to verify receipts against, current chain head, and free-tier limits. No key required.

입력 스키마

{
  "type": "object",
  "properties": {},
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
🟡vigil_register(handle)

Create a key. Returns a bearer key shown ONCE — store it; it is your only identity. No email, no account. Starts on the free tier. Creates a persistent identity. The returned key grants full account control; provision it in a trusted client, not a model transcript.

입력 스키마

{
  "type": "object",
  "properties": {
    "handle": {
      "type": "string",
      "description": "1-64 chars, lowercase alnum plus - and _.",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[a-z0-9][a-z0-9_-]{0,63}$"
    }
  },
  "required": [
    "handle"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "handle": "example-agent"
    }
  ]
}
🟢vigil_pricing

The plans and per-tier limits (free, dev, pro). No key required.

입력 스키마

{
  "type": "object",
  "properties": {},
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
🟢vigil_usage(vigil_key)

Your current tier, its limits, and how much you've used today. Requires your key.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    }
  },
  "required": [],
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
🟡vigil_notarize(vigil_key, subject_sha256, label)

Notarize work: POST the sha256 (64 hex chars) of anything and get back an Ed25519-signed, timestamped, hash-chained, serial-numbered receipt. Chain position orders submitted records; the timestamp is a signed assertion of Vigil's clock. Free tier: 10/day. Irreversibly publishes the digest, label and account handle in the public chain; no deletion tool exists. It proves signed-data integrity, not that an action happened or a claim is true.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "subject_sha256": {
      "type": "string",
      "description": "64 lowercase hex chars: the sha256 of the thing you are notarizing.",
      "pattern": "^[0-9a-fA-F]{64}$",
      "minLength": 64,
      "maxLength": 64
    },
    "label": {
      "type": "string",
      "description": "Optional human label, <=200 chars. Public — do not put secrets here.",
      "maxLength": 200
    }
  },
  "required": [
    "subject_sha256"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "subject_sha256": "0000000000000000000000000000000000000000000000000000000000000000",
      "label": "public example digest"
    }
  ]
}
🟢vigil_get_receipt(serial)

Fetch a receipt by serial number. Public — anyone can read any receipt.

입력 스키마

{
  "type": "object",
  "properties": {
    "serial": {
      "type": "integer",
      "description": "The receipt serial number.",
      "minimum": 1,
      "maximum": 9223372036854776000
    }
  },
  "required": [
    "serial"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "serial": 1
    }
  ]
}
🟢vigil_verify_receipt(receipt, pubkey_hex)

Verify a receipt's hash and Ed25519 signature against a mandatory, independently pinned Ed25519 public key. The key must not come from the receipt being checked. Returns valid=false for tampering, forgery, a wrong signer, or malformed input. Read-only and local to Vigil.

입력 스키마

{
  "type": "object",
  "properties": {
    "receipt": {
      "type": "object",
      "description": "A full receipt object as returned by vigil_notarize / vigil_get_receipt."
    },
    "pubkey_hex": {
      "type": "string",
      "description": "Mandatory Ed25519 public key pinned from a trusted out-of-band source; never copy it from the receipt.",
      "pattern": "^[0-9a-f]{64}$",
      "minLength": 64,
      "maxLength": 64
    }
  },
  "required": [
    "receipt",
    "pubkey_hex"
  ],
  "additionalProperties": false
}
🟢vigil_chain(from_serial, to_serial)

Read a range of receipts to audit chain continuity. Max 1000 per call.

입력 스키마

{
  "type": "object",
  "properties": {
    "from_serial": {
      "type": "integer",
      "description": "First serial (default 1).",
      "minimum": 1,
      "maximum": 9223372036854776000
    },
    "to_serial": {
      "type": "integer",
      "description": "Last serial (default = from_serial).",
      "minimum": 1,
      "maximum": 9223372036854776000
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "from_serial": 1,
      "to_serial": 10
    }
  ]
}
🔴vigil_set_watchdog(vigil_key, name, interval_s, webhook_url, message)

Arm a dead-man switch. Register an interval and an https webhook; then call vigil_heartbeat before each interval elapses. Miss one and Vigil attempts a signed 'absence' payload to your webhook, retrying failed delivery. Free tier: 1 watchdog. Overwrites an existing watchdog and resets its timer and delivery state. A missed heartbeat sends the supplied message to an external HTTPS recipient; failed delivery is capped at five attempts per armed interval.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "name": {
      "type": "string",
      "description": "A name for this watchdog, 1-64 chars.",
      "minLength": 1,
      "maxLength": 64
    },
    "interval_s": {
      "type": "integer",
      "description": "Seconds allowed between heartbeats, 60..604800.",
      "minimum": 60,
      "maximum": 604800
    },
    "webhook_url": {
      "type": "string",
      "description": "An https URL resolving to a public address; fired once on a missed heartbeat.",
      "minLength": 1,
      "maxLength": 2048,
      "pattern": "^https://[^\\s]+$"
    },
    "message": {
      "type": "string",
      "description": "Optional note included in the absence payload, <=2000 chars.",
      "maxLength": 2000
    }
  },
  "required": [
    "name",
    "interval_s",
    "webhook_url"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "name": "agent-health",
      "interval_s": 300,
      "webhook_url": "https://alerts.example.com/vigil",
      "message": "agent missed heartbeat"
    }
  ]
}
🔴vigil_heartbeat(vigil_key, name)

'Still alive.' Reset a watchdog's timer. Call this at least once per interval. Resets the deadline and delivery state, potentially suppressing an overdue alert or rearming delivery.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "Watchdog name, 1..64 characters."
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "name": "agent-health"
    }
  ]
}
🟢vigil_watchdog_status(vigil_key, name)

Read a watchdog's state: interval, last beat, whether it is overdue, fired, or exhausted.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "Watchdog name, 1..64 characters."
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "name": "agent-health"
    }
  ]
}
🔴vigil_delete_watchdog(vigil_key, name)

Remove a watchdog. Destructive: deletes its configuration and stops future alerts. No undo or restoration of the previous timer is provided.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "name": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "description": "Watchdog name, 1..64 characters."
    }
  },
  "required": [
    "name"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "name": "agent-health"
    }
  ]
}
🔴vigil_grant_lease(vigil_key, agent, action, ttl_s, lim)

Grant a short-lived, Ed25519-signed LEASE authorizing an agent to perform an action until it expires. A customer-run gateway verifies the lease offline (fail-closed) before letting the action through. This is the guard on a money/data-moving action. Free tier: 1 active lease (guarded agent). Security-sensitive: grants authority. Keep this account key outside the controlled agent. A signed lim string is enforced only by the customer's gateway.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "agent": {
      "type": "string",
      "description": "Identifier for the agent being authorized (1-128 chars).",
      "minLength": 1,
      "maxLength": 128
    },
    "action": {
      "type": "string",
      "description": "The action class this lease authorizes, e.g. 'stripe.refund' (1-128 chars).",
      "minLength": 1,
      "maxLength": 128
    },
    "ttl_s": {
      "type": "integer",
      "description": "Lease lifetime in seconds, 5..604800. Keep it short; renew to extend.",
      "minimum": 5,
      "maximum": 604800
    },
    "lim": {
      "type": "string",
      "description": "Optional limit string the gateway enforces, e.g. 'amount<=50usd'.",
      "maxLength": 256
    }
  },
  "required": [
    "agent",
    "action",
    "ttl_s"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "agent": "refund-agent",
      "action": "stripe.refund",
      "ttl_s": 60,
      "lim": "amount<=100usd"
    }
  ]
}
🔴vigil_renew_lease(vigil_key, lease_id, ttl_s)

Extend a lease with a fresh signed token and new expiry. Renewing is how a healthy agent keeps acting; stop renewing (or revoke) and it lapses. Security-sensitive: extends authority and refreshes the offline recheck window. Keep renewal credentials outside the controlled agent.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "lease_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "Opaque lease identifier returned by vigil_grant_lease."
    },
    "ttl_s": {
      "type": "integer",
      "minimum": 5,
      "maximum": 604800,
      "description": "Requested lease lifetime in seconds, 5..604800; offline trust still ends at recheck_by_ms within 30 seconds."
    }
  },
  "required": [
    "lease_id",
    "ttl_s"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "lease_id": "lease_example",
      "ttl_s": 60
    }
  ]
}
🔴vigil_revoke_lease(vigil_key, lease_id)

Revoke a lease. A compliant v2 gateway refuses the old offline token at recheck_by_ms (at most 30 seconds after issue/renewal), or earlier if it polls revocation. Revocation is not instantaneous. Irreversible for this lease ID; it cannot be renewed again. Already admitted actions are not undone.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "lease_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "Opaque lease identifier returned by vigil_grant_lease."
    }
  },
  "required": [
    "lease_id"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "lease_id": "lease_example"
    }
  ]
}
🟢vigil_lease_status(lease_id)

Public status of a lease (active / expired / revoked). What a gateway polls for revocation. No key required.

입력 스키마

{
  "type": "object",
  "properties": {
    "lease_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 128,
      "description": "Opaque lease identifier returned by vigil_grant_lease."
    }
  },
  "required": [
    "lease_id"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "lease_id": "lease_example"
    }
  ]
}
🟢vigil_verify_lease(lease, pubkey_hex)

Offline, FAIL-CLOSED check of a lease token against a mandatory, independently pinned Ed25519 public key. Returns allow=true only for a valid signature before expiry and recheck_by_ms. It does not authenticate the calling agent, enforce action/amount policy, or query live revocation; a customer gateway must do those checks before every provider action. Checks signature, expiry and the signed recheck deadline only. It does not check live revocation, agent identity, action, amount or gateway policy; those checks are mandatory at the gateway.

입력 스키마

{
  "type": "object",
  "properties": {
    "lease": {
      "type": "object",
      "description": "A full lease token from vigil_grant_lease."
    },
    "pubkey_hex": {
      "type": "string",
      "description": "Mandatory Ed25519 public key pinned from a trusted out-of-band source; never copy it from the lease.",
      "pattern": "^[0-9a-f]{64}$",
      "minLength": 64,
      "maxLength": 64
    }
  },
  "required": [
    "lease",
    "pubkey_hex"
  ],
  "additionalProperties": false
}
🟢vigil_leases(vigil_key)

List your leases and their states.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    }
  },
  "required": [],
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
🟢vigil_anchors

Public timestamp submissions to OpenTimestamps calendars. A submission is pending, not an independently verified Bitcoin confirmation. No key required.

입력 스키마

{
  "type": "object",
  "properties": {},
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
⚪vigil_anchor(vigil_key)

PRO: anchor the current chain head to OpenTimestamps on demand (the chain is auto-anchored every few hours regardless). Sends the public chain-head digest to external OpenTimestamps calendars; submission is not verified Bitcoin confirmation.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    }
  },
  "required": [],
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
🔴vigil_journal_put(vigil_key, slug, data_base64)

Store an opaque blob under a slug (overwrites). Encrypt client-side: the server stores exactly the bytes supplied and cannot enforce client encryption. Send bytes as base64. Free tier: 4 slots, 64KB each. Destructive when the slug exists: previous bytes are replaced with no version history or undo.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "slug": {
      "type": "string",
      "description": "1-64 alnum/-/_ chars.",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[A-Za-z0-9_-]{1,64}$"
    },
    "data_base64": {
      "type": "string",
      "description": "The (already-encrypted) bytes, base64-encoded.",
      "maxLength": 100000
    }
  },
  "required": [
    "slug",
    "data_base64"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "slug": "encrypted-state",
      "data_base64": "ZW5jcnlwdGVkLWJ5dGVz"
    }
  ]
}
🟢vigil_journal_get(vigil_key, slug)

Fetch a journal blob by slug. Returns base64 (decrypt client-side).

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "slug": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[A-Za-z0-9_-]{1,64}$",
      "description": "Journal slot name, 1..64 ASCII letters, numbers, hyphens, or underscores."
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "slug": "encrypted-state"
    }
  ]
}
🟢vigil_journal_list(vigil_key)

List your journal slots (slug, size, last-updated).

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    }
  },
  "required": [],
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
🔴vigil_journal_delete(vigil_key, slug)

Delete a journal slot. Destructive: removes stored bytes with no undo through the API.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    },
    "slug": {
      "type": "string",
      "minLength": 1,
      "maxLength": 64,
      "pattern": "^[A-Za-z0-9_-]{1,64}$",
      "description": "Journal slot name, 1..64 ASCII letters, numbers, hyphens, or underscores."
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "slug": "encrypted-state"
    }
  ]
}
🔴vigil_revoke_key(vigil_key)

Revoke your own key. It stops authenticating immediately. Irreversible. Irreversible: also revokes the account's leases and deletes its watchdogs. Private journal access is lost; public receipts remain. It does not cancel a Stripe subscription.

입력 스키마

{
  "type": "object",
  "properties": {
    "vigil_key": {
      "type": "string",
      "deprecated": true,
      "description": "DEPRECATED legacy account-wide credential, including deletion and permission issuance. Prefer the client-injected HTTP Authorization: Bearer header; omit this argument when that header authenticates the request. This is not a scoped agent token.",
      "minLength": 1,
      "maxLength": 256
    }
  },
  "required": [],
  "additionalProperties": false,
  "examples": [
    {}
  ]
}
🔴vigil_verify_source(source_url, claim, options)

Paid source-local verification with exact evidence and signed receipt. Does not establish absolute truth. Read price and payment requirements before authorizing; settlement spends USDC irreversibly and there is no automatic refund. Identical tool arguments alone are NOT idempotent: retry with the identical arguments, same vigil/idempotency-key metadata and original payment proof.

입력 스키마

{
  "type": "object",
  "properties": {
    "source_url": {
      "type": "string",
      "format": "uri",
      "pattern": "^https://[^\\s]+$",
      "maxLength": 2048
    },
    "claim": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000,
      "pattern": "\\S"
    },
    "options": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "max_age_seconds": {
          "type": "integer",
          "minimum": 0,
          "maximum": 300,
          "default": 60
        },
        "max_price_usd": {
          "type": "string",
          "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]{1,6})?$",
          "maxLength": 32
        }
      }
    }
  },
  "required": [
    "source_url",
    "claim"
  ],
  "additionalProperties": false
}

출력 스키마

{
  "type": "object",
  "properties": {
    "schema_version": {
      "const": "1.0.0"
    },
    "request_id": {
      "type": "string",
      "format": "uuid"
    },
    "status": {
      "const": "completed"
    },
    "verification_type": {
      "const": "source"
    },
    "source": {
      "type": "object",
      "required": [
        "requested_url",
        "final_url",
        "http_status",
        "content_type",
        "content_sha256",
        "text_sha256",
        "normalized_text",
        "offset_unit",
        "redirects",
        "wire_bytes",
        "decoded_bytes"
      ],
      "properties": {
        "requested_url": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://[^\\s]+$",
          "maxLength": 2048
        },
        "final_url": {
          "type": "string",
          "format": "uri",
          "pattern": "^https://",
          "maxLength": 49152
        },
        "http_status": {
          "const": 200
        },
        "content_type": {
          "type": "string",
          "pattern": "^[Tt][Ee][Xx][Tt]/([Hh][Tt][Mm][Ll]|[Pp][Ll][Aa][Ii][Nn])(?:\\s*;.*)?$",
          "maxLength": 32768
        },
        "content_sha256": {
          "type": "string",
          "pattern": "^[0-9a-f]{64}$"
        },
        "text_sha256": {
          "type": "string",
          "pattern": "^[0-9a-f]{64}$"
        },
        "normalized_text": {
          "type": "string",
          "maxLength": 100000
        },
        "offset_unit": {
          "const": "unicode_codepoint"
        },
        "redirects": {
          "type": "array",
          "maxItems": 5,
          "items": {
            "type": "object",
            "required": [
              "url",
              "status"
            ],
            "properties": {
              "url": {
                "type": "string",
                "format": "uri",
                "pattern": "^https://",
                "maxLength": 49152
              },
              "status": {
                "enum": [
                  301,
                  302,
                  303,
                  307,
                  308
                ]
              }
            },
            "additionalProperties": false
          }
        },
        "wire_bytes": {
          "type": "integer",
          "minimum": 0,
          "maximum": 26000000
        },
        "decoded_bytes": {
          "type": "integer",
          "minimum": 0,
          "maximum": 8388608
        }
      },
      "additionalProperties": false
    },
    "reachable": {
      "const": true
    },
    "source_identity": {
      "type": "object",
      "required": [
        "hostname",
        "tls_verified",
        "publisher_identity"
      ],
      "properties": {
        "hostname": {
          "type": "string",
          "minLength": 1,
          "maxLength": 253
        },
        "tls_verified": {
          "type": "boolean"
        },
        "publisher_identity": {
          "const": "unknown"
        }
      },
      "additionalProperties": false
    },
    "claim": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000
    },
    "claim_support": {
      "enum": [
        "supports",
        "contradicts",
        "mixed",
        "insufficient_evidence",
        "not_assessed"
      ]
    },
    "explanation": {
      "type": "string",
      "maxLength": 800
    },
    "evidence": {
      "type": "array",
      "maxItems": 6,
      "items": {
        "type": "object",
        "required": [
          "evidence_id",
          "quote",
          "start",
          "end",
          "stance",
          "source_sha256",
          "text_sha256"
        ],
        "properties": {
          "evidence_id": {
            "type": "string",
            "pattern": "^e[1-6]$"
          },
          "quote": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1000
          },
          "start": {
            "type": "integer",
            "minimum": 0,
            "maximum": 99999
          },
          "end": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100000
          },
          "stance": {
            "enum": [
              "supports",
              "contradicts",
              "mentions"
            ]
          },
          "source_sha256": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          },
          "text_sha256": {
            "type": "string",
            "pattern": "^[0-9a-f]{64}$"
          }
        },
        "additionalProperties": false,
        "description": "Offsets count Unicode code points in source.normalized_text. Verify start < end and exact substring/digest matches independently; JSON Schema cannot establish them."
      }
    },
    "confidence": {
      "type": "null",
      "description": "No numerical confidence is published before calibration."
    },
    "risk_flags": {
      "type": "array",
      "uniqueItems": true,
      "maxItems": 32,
      "items": {
        "type": "string",
        "pattern": "^[a-z][a-z0-9_]*$",
        "maxLength": 128
      }
    },
    "checked_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$"
    },
    "served_at": {
      "type": "string",
      "format": "date-time",
      "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$"
    },
    "methodology_version": {
      "type": "string",
      "minLength": 1,
      "maxLength": 256
    },
    "assessment_scope": {
      "enum": [
        "source_local_semantic_support",
        "literal_quotation_only"
      ]
    },
    "limits": {
      "type": "object",
      "required": [
        "max_text_chars"
      ],
      "properties": {
        "max_text_chars": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100000
        },
        "timeout_seconds": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 60
            },
            {
              "type": "string",
              "pattern": "^(0|[1-9][0-9]*)\\.[0-9]+$"
            }
          ]
        },
        "socket_timeout_seconds": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 1,
              "maximum": 15
            },
            {
              "type": "string",
              "pattern": "^(0|[1-9][0-9]*)\\.[0-9]+$"
            }
          ]
        },
        "max_wire_bytes": {
          "type": "integer",
          "minimum": 1,
          "maximum": 4194304
        },
        "max_decoded_bytes": {
          "type": "integer",
          "minimum": 1,
          "maximum": 8388608
        },
        "max_header_bytes": {
          "type": "integer",
          "minimum": 1,
          "maximum": 65536
        },
        "max_redirects": {
          "type": "integer",
          "minimum": 0,
          "maximum": 5
        },
        "fixture": {
          "const": true
        }
      },
      "additionalProperties": false
    },
    "cache": {
      "type": "object",
      "required": [
        "hit",
        "age_seconds",
        "original_checked_at"
      ],
      "properties": {
        "hit": {
          "type": "boolean"
        },
        "age_seconds": {
          "type": "integer",
          "minimum": 0
        },
        "original_checked_at": {
          "type": "string",
          "format": "date-time",
          "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$"
        }
      },
      "additionalProperties": false
    },
    "payment": {
      "type": "object",
      "required": [
        "status",
        "provider",
        "mode",
        "simulated",
        "network",
        "asset",
        "currency",
        "amount_atomic",
        "price_usd",
        "transaction",
        "facilitator_fee_usd",
        "network_fee_usd"
      ],
      "properties": {
        "status": {
          "const": "settled"
        },
        "provider": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        },
        "mode": {
          "enum": [
            "offline",
            "testnet",
            "mainnet"
          ]
        },
        "simulated": {
          "type": "boolean"
        },
        "network": {
          "enum": [
            "eip155:8453",
            "eip155:84532",
            "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
            "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
            "none"
          ]
        },
        "asset": {
          "type": "string",
          "minLength": 1,
          "maxLength": 128
        },
        "currency": {
          "const": "USDC"
        },
        "amount_atomic": {
          "type": "string",
          "pattern": "^(0|[1-9][0-9]{0,17})$"
        },
        "price_usd": {
          "type": "string",
          "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]{1,6})?$",
          "maxLength": 32
        },
        "transaction": {
          "type": [
            "string",
            "null"
          ],
          "maxLength": 512
        },
        "facilitator_fee_usd": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]{1,6})?$",
              "maxLength": 32
            },
            {
              "type": "null"
            }
          ]
        },
        "network_fee_usd": {
          "anyOf": [
            {
              "type": "string",
              "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]{1,6})?$",
              "maxLength": 32
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "additionalProperties": false,
      "description": "USDC uses six atomic decimals. Offline mock payments simulate USDC and move no funds. Null fees are unknown, not zero."
    },
    "receipt": {
      "type": "object",
      "required": [
        "envelope",
        "canonical_envelope_base64",
        "attestation",
        "verification"
      ],
      "properties": {
        "envelope": {
          "type": "object",
          "required": [
            "type",
            "version",
            "request_id",
            "result_sha256",
            "checked_at",
            "methodology_version",
            "payment",
            "issued_at"
          ],
          "properties": {
            "type": {
              "const": "vigil.source-verification.purchase"
            },
            "version": {
              "const": 1
            },
            "request_id": {
              "type": "string",
              "format": "uuid"
            },
            "result_sha256": {
              "type": "string",
              "pattern": "^[0-9a-f]{64}$"
            },
            "checked_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$"
            },
            "methodology_version": {
              "type": "string",
              "minLength": 1,
              "maxLength": 256
            },
            "payment": {
              "type": "object",
              "required": [
                "status",
                "provider",
                "mode",
                "simulated",
                "network",
                "asset",
                "currency",
                "amount_atomic",
                "price_usd",
                "transaction",
                "facilitator_fee_usd",
                "network_fee_usd"
              ],
              "properties": {
                "status": {
                  "const": "settled"
                },
                "provider": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64
                },
                "mode": {
                  "enum": [
                    "offline",
                    "testnet",
                    "mainnet"
                  ]
                },
                "simulated": {
                  "type": "boolean"
                },
                "network": {
                  "enum": [
                    "eip155:8453",
                    "eip155:84532",
                    "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
                    "solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",
                    "none"
                  ]
                },
                "asset": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 128
                },
                "currency": {
                  "const": "USDC"
                },
                "amount_atomic": {
                  "type": "string",
                  "pattern": "^(0|[1-9][0-9]{0,17})$"
                },
                "price_usd": {
                  "type": "string",
                  "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]{1,6})?$",
                  "maxLength": 32
                },
                "transaction": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "maxLength": 512
                },
                "facilitator_fee_usd": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]{1,6})?$",
                      "maxLength": 32
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "network_fee_usd": {
                  "anyOf": [
                    {
                      "type": "string",
                      "pattern": "^(0|[1-9][0-9]*)(\\.[0-9]{1,6})?$",
                      "maxLength": 32
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false,
              "description": "USDC uses six atomic decimals. Offline mock payments simulate USDC and move no funds. Null fees are unknown, not zero."
            },
            "issued_at": {
              "type": "string",
              "format": "date-time",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$"
            }
          },
          "additionalProperties": false
        },
        "canonical_envelope_base64": {
          "type": "string",
          "contentEncoding": "base64",
          "minLength": 4,
          "maxLength": 16384,
          "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$"
        },
        "attestation": {
          "type": "object",
          "required": [
            "v",
            "serial",
            "subject_sha256",
            "label",
            "requested_by",
            "key_id",
            "ts_ms",
            "ts_utc",
            "prev_hash",
            "pubkey_hex",
            "receipt_hash",
            "sig_ed25519_hex"
          ],
          "properties": {
            "v": {
              "const": 1
            },
            "serial": {
              "type": "integer",
              "minimum": 1
            },
            "subject_sha256": {
              "type": "string",
              "pattern": "^[0-9a-f]{64}$"
            },
            "label": {
              "type": [
                "string",
                "null"
              ],
              "maxLength": 200
            },
            "requested_by": {
              "type": "string",
              "minLength": 1,
              "maxLength": 128
            },
            "key_id": {
              "type": "integer",
              "minimum": 0
            },
            "ts_ms": {
              "type": "integer",
              "minimum": 0
            },
            "ts_utc": {
              "type": "string",
              "format": "date-time",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$"
            },
            "prev_hash": {
              "type": "string",
              "pattern": "^[0-9a-f]{64}$"
            },
            "pubkey_hex": {
              "type": "string",
              "pattern": "^[0-9a-f]{64}$"
            },
            "receipt_hash": {
              "type": "string",
              "pattern": "^[0-9a-f]{64}$"
            },
            "sig_ed25519_hex": {
              "type": "string",
              "pattern": "^[0-9a-f]{128}$"
            }
          },
          "additionalProperties": false
        },
        "verification": {
          "type": "string",
          "minLength": 1,
          "maxLength": 1000
        }
      },
      "additionalProperties": false,
      "description": "Pin Vigil's key independently. Verify the Ed25519 attestation, SHA256 of canonical envelope bytes, and SHA256 of the result with receipt removed. Schema validation alone does not authenticate a receipt."
    }
  },
  "required": [
    "schema_version",
    "request_id",
    "status",
    "verification_type",
    "source",
    "reachable",
    "source_identity",
    "claim",
    "claim_support",
    "explanation",
    "evidence",
    "confidence",
    "risk_flags",
    "checked_at",
    "served_at",
    "methodology_version",
    "assessment_scope",
    "limits",
    "cache",
    "payment",
    "receipt"
  ],
  "additionalProperties": false,
  "allOf": [
    {
      "if": {
        "properties": {
          "assessment_scope": {
            "const": "literal_quotation_only"
          }
        }
      },
      "then": {
        "properties": {
          "claim_support": {
            "enum": [
              "not_assessed",
              "insufficient_evidence"
            ]
          },
          "evidence": {
            "items": {
              "properties": {
                "stance": {
                  "const": "mentions"
                }
              }
            }
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "claim_support": {
            "const": "supports"
          }
        }
      },
      "then": {
        "properties": {
          "evidence": {
            "allOf": [
              {
                "contains": {
                  "properties": {
                    "stance": {
                      "const": "supports"
                    }
                  },
                  "required": [
                    "stance"
                  ]
                },
                "minContains": 1
              }
            ]
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "claim_support": {
            "const": "contradicts"
          }
        }
      },
      "then": {
        "properties": {
          "evidence": {
            "allOf": [
              {
                "contains": {
                  "properties": {
                    "stance": {
                      "const": "contradicts"
                    }
                  },
                  "required": [
                    "stance"
                  ]
                },
                "minContains": 1
              }
            ]
          }
        }
      }
    },
    {
      "if": {
        "properties": {
          "claim_support": {
            "const": "mixed"
          }
        }
      },
      "then": {
        "properties": {
          "evidence": {
            "allOf": [
              {
                "contains": {
                  "properties": {
                    "stance": {
                      "const": "supports"
                    }
                  },
                  "required": [
                    "stance"
                  ]
                },
                "minContains": 1
              },
              {
                "contains": {
                  "properties": {
                    "stance": {
                      "const": "contradicts"
                    }
                  },
                  "required": [
                    "stance"
                  ]
                },
                "minContains": 1
              }
            ]
          }
        }
      }
    }
  ],
  "description": "A completed source observation and purchase. Retrieval failures return the error contract and are not submitted for settlement. Source support does not establish truth."
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 26개
검증됨버전이 기록되지 않음도구 26개