Watch this log yourself
A log is only as honest as the people who check it. Anyone can run a monitor against AI Source of Truth with no account and no token. A monitor keeps the last checkpoint it saw, fetches the new one, and proves the new tree extends the old one. If the log rewrote history, showed two trees to two people, or a publisher's key changed without notice, a monitor catches it.
What a monitor checks
Log signature
The latest checkpoint (/log/checkpoint) is signed by a log key in the published policy (/log/policy). Pin the key with vkey: so a policy that swaps it is an alert too.
Witness quorum
The policy's quorum of independent witnesses cosigned the checkpoint. A new checkpoint without them is a note; it becomes an alert when no checkpoint has met the quorum for 2 days.
Consistency over time
The new checkpoint extends the one the last run stored. The monitor builds the RFC 6962 consistency proof itself from the tiles, so it trusts no proof the registry computed. A smaller tree, two roots at one size, or a failed proof fails the run with both checkpoints as evidence.
Publisher events
For each publisher you name, every new key.rotated, key.recovered, key.revoked, key.delay_set, domain.set, identity.verified event on /v1/events is an alert, with the key that authorized it.
The registry witness
Every cosignature the registry's witness issues is logged at /witness/cosignatures. Each new row is checked (leaf hash, entry, the witness signature), and two rows for one log and size with different roots are an alert.
An alert fails the job and opens one issue labeled aisot-monitor, or comments on the open one. A check that could not run fails the job too. The job summary holds the full result.
aisourceoftruth/monitor@v1
The action holds no secret of ours and reads public URLs only. uses: aisourceoftruth/monitor@v1, source packages/monitor (monitor.mjs, no dependencies; action.yml). Node 24 on the runner (actions/setup-node); the ML-DSA-44 log signature is checked where the policy lists that key.
name: aisot log monitor
on:
schedule:
- cron: "17 * * * *" # every hour
workflow_dispatch:
permissions:
contents: read
issues: write # for the alert issue
concurrency:
group: aisot-monitor # never run two monitors on one state at once
jobs:
monitor:
runs-on: ubuntu-latest
steps:
- uses: actions/setup-node@v4
with:
node-version: 24
- uses: aisourceoftruth/monitor@v1
with:
publishers: acme, my-publisher # optional: whose key events to watch
Not published yet: the operator mirrors packages/monitor to the standalone aisourceoftruth/monitor repo, which does not exist yet, so uses: aisourceoftruth/monitor@v1 does not resolve today. Until then the log's own hourly run below is the only monitor, and anyone can check the same things by hand from the tiles and the policy on this page.
node monitor.mjs --origin https://aisourceoftruth.com --publishers acme --state state.json --json| INPUT | DEFAULT | MEANING |
|---|---|---|
| origin | https://aisourceoftruth.com | Registry to watch. |
| policy | <origin>/log/policy | Policy (C2SP tlog-policy) URL or file path. |
| vkey | none | Pin the log's Ed25519 vkey; a policy that drops it is an alert. |
| publishers | none | Publisher ids whose key, domain and identity events to watch. |
| state-mode | cache | Where the state lives between runs: cache (the Actions cache) or file (a file in your repo). |
| state-path | .aisot-monitor/state.json | Path of the state file. |
| cache-key | aisot-monitor | Cache key prefix; one per monitored origin. |
| commit-state | false | With state-mode file: commit and push the state after each run (needs contents: write). |
| file-issue | true | Open or comment on one issue labeled aisot-monitor when a check fails (needs issues: write). |
| same-operator | false | Only for the registry's own operator: marks the run as not independent. |
| assess | none | A list file of registry dependencies (by convention aisot.depends). When set, the run is the dependency gate instead of the log checks. |
| fail-on | do_not_rely | With assess: the verdict that fails the run, do_not_rely or check. |
| assess-output | aisot-assess.json | With assess: the JSON file of every assess receipt. |
| github-token | the job token | Token for the issue. |
Read the log as tiles
What a verifier requires
# C2SP tlog-policy (https://c2sp.org/tlog-policy) for the AI Source of Truth log. # A checkpoint is valid when the log key below signed it and the quorum co-signed it. # Only independent witnesses are listed. A witness run by the registry's operator never counts. log aisourceoftruth.com/log+3b162de5+ASW799lCqbFOP7rojZjZlbDqBarpu1gimAMGcPaf2t8r https://aisourceoftruth.com # No independent witness co-signs this log yet. The target quorum is 2. quorum none
Live from /log/policy. A same-owner witness is never listed in it.
| MONITOR | OPERATOR | CHECKS | CADENCE | COUNTS |
|---|---|---|---|---|
| .github/workflows/log-monitor.yml (the registry repo) | PromptReports LLC (same operator) | log signature, quorum, consistency, the witness cosignature log | hourly | SAME OPERATOR · NOT COUNTED |
Run one and tell us, and we will list it here. We list monitors; we do not vouch for them. A monitor the registry's operator runs is marked and never counts as independent.