WhatToChange: recommended-changes/2026-09-21-docs-and-cors/ What-to-Change.md What-to-Change-To.md How-to-implement-the-changes.md What was actually done: - Markdown, HTML, and PDF for standards, architecture, API, and the operator guide. - README points at scripts/build-docs.sh. - VERAE_MCP_CORS=1 enables CORS and JSON responses on the Streamable HTTP app. What was not done: - (none)
1.3 KiB
1.3 KiB
Architecture
Flow
- An MCP client calls
stamp,verify, orhash_report. RoutingLedgersendsscope=globaltoGlobalLedgerand every other scope toFileLedger.FileLedgerkeeps an idempotent JSON list. The same digest, org, and scope returns the existing receipt.GlobalClientposts the digest to VeraeTime and, when the body has no certificate yet, polls/api/status/{jobId}.verifywithwant_scope=globalposts{ "certificate": "<id>" }to/api/verify. Otherwise it checks the local file first, then VeraeTime.
Modules
| Module | Role |
|---|---|
server.py |
MCP tools and process entry |
ledger.py |
Receipt model, memory ledger, file ledger, router |
global_client.py |
VeraeTime HTTPS client; blocking I/O runs in a worker thread |
nats_ledger.py |
Optional leaf locald client |
Idempotency
Local stamps are idempotent per digest + org + scope. Global stamps send restamp: false and wait: true. VeraeTime may return the same certificate for the same digest. This server does not cache global receipts in the local file.
What this process is not
It does not replace verae-timestamp / locald. It does not write JetStream. It does not store document bytes. Memory ledger exists for tests and for mcp dev when a caller injects it. main() always builds RoutingLedger.