The Verifiable Agent Feed — a signed, hash-chained, cursor-based append-only feed a subscriber can prove is complete and untampered.
Project description
sm-feed
The Verifiable Agent Feed — a signed, hash-chained, cursor-based append-only feed a subscriber can prove is complete and untampered.
An agent that publishes an ongoing stream — claims, lifecycle events, aggregate
signals — is served today by an RSS feed or a bespoke webhook. Both ask the
subscriber to trust the server for completeness: a feed can silently drop or
reorder an item and no one can tell. sm-feed closes that gap. Every entry is
Ed25519-signed and hash-chained, so a subscriber that walks a contiguous run
verifies authenticity, integrity, and completeness in one pass. It owns the
feed — the wire shape and its verification — and nothing else: the transport,
the storage, and the meaning of the payload are the consumer's. The payload is
opaque (any JSON object with a type), so one format carries any agent's stream.
What this package secures (v0.1)
- Authenticity — each entry is Ed25519-signed by the feed's issuer DID.
- Tamper-evidence —
entry_hashcontent-addresses the entry; any edit to any field breaks it and verification returns falsy (never raises on hostile input). - Completeness — entries are hash-chained (
prev_hash) with contiguousseq; a dropped or reordered entry breaks the chain from the subscriber's anchor. - Head attestation — a signed head (
{seq, entry_hash}) lets a subscriber pin "the feed as of here" and detect a later rewind. - Adversarially tested. The conformance corpus includes a hostile vector per failure path: dropped entry, tampered payload, wrong anchor, forged head.
What this package does NOT (yet) do
- Fork detection across subscribers — a signed head proves "the issuer said
this is head", not that every subscriber saw the same history. Witness
co-signing / gossip (à la Certificate Transparency) is a later property; see
SPEC.md§6. - Merkle inclusion proofs — completeness is by walking the chain; an
O(log n)proof for a single old entry is future work. - Push delivery, retry, and subscription registration — the consumer's responsibility; this primitive fixes only the payload and its verification.
- A trusted clock or key custody —
issued_atis caller-asserted; key generation/rotation/revocation is out of scope.
Features
- One dependency (
sm-arp, for the shared Ed25519 / JCS / did:key crypto). - Pure, wall-clock-free core: the caller supplies timestamps.
- Pull (
GET …/feed?since=<cursor>) and push (POSTa page) deliver the same object;verify_pagechecks both. - Opaque typed payload — the same wire format serves claims, events, or deltas.
Installation
Not yet published to PyPI — install directly from the repository:
pip install git+https://github.com/Sharathvc23/sm-feed.git
Quick start
from sm_arp import Identity
from sm_feed import FeedLog, verify_page
issuer = Identity.generate()
log = FeedLog(issuer)
log.append({"type": "example/claim", "title": "First"}, issued_at="2026-01-01T00:00:00+00:00")
log.append({"type": "example/claim", "title": "Second"}, issued_at="2026-01-01T01:00:00+00:00")
# Serve on pull (GET /feed?since=<cursor>) or POST on push — same object.
page = log.page(cursor=None, generated_at="2026-01-01T02:00:00+00:00")
# Subscriber: verify authenticity + completeness, keep the new cursor anchor.
ok, reason, head = verify_page(page, expected_prev_hash=None)
assert ok, reason
# persist head["entry_hash"] as expected_prev_hash for the next pull
A runnable end-to-end example (publish → verify → detect a dropped entry) is in
examples/quick_start.py.
Reference fixtures
The golden vectors under conformance/vectors/ are
regenerated by conformance/_vector_gen.py from a fixed, non-secret fixture seed
("11"×32 — regenerable, never a real key) and replayed by
tests/test_conformance_vectors.py. They are the language-agnostic corpus a
second implementation replays to prove interoperability.
Specification
SPEC.md— normative wire shape and verification, working draft.WHITEPAPER.md— design rationale and axioms.THREATMODEL.md— what it defends, and what it doesn't.
Related packages
| Package | Role |
|---|---|
sm-arp |
Agency Receipt Protocol — the signed, hash-chained record primitive sm-feed reuses for crypto |
sm-authority |
Common Authority Evidence — establishes who controls a subject |
sm-bridge |
AgentFacts / registry endpoints — a natural feed publisher and consumer |
License
First published: 2026-07-30 | Last modified: 2026-07-30
Personal research contributions aligned with Project NANDA standards. Stellarminds.ai
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sm_feed-0.1.0.tar.gz.
File metadata
- Download URL: sm_feed-0.1.0.tar.gz
- Upload date:
- Size: 30.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cba43bcba47ea2905dfc3746b53d57cbac26be2511dfc7bd002a17f540caedb4
|
|
| MD5 |
36b2ccbc3f903b01218380becdbaa335
|
|
| BLAKE2b-256 |
260c2559bf4fc85345ff54751beb58bf023b2bb2d2abff9de0a5f6e9eaf660aa
|
Provenance
The following attestation bundles were made for sm_feed-0.1.0.tar.gz:
Publisher:
release.yml on Sharathvc23/sm-feed
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sm_feed-0.1.0.tar.gz -
Subject digest:
cba43bcba47ea2905dfc3746b53d57cbac26be2511dfc7bd002a17f540caedb4 - Sigstore transparency entry: 2298166116
- Sigstore integration time:
-
Permalink:
Sharathvc23/sm-feed@eb8b71618a3e8a53a668868e25cbdf1c0d107712 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Sharathvc23
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@eb8b71618a3e8a53a668868e25cbdf1c0d107712 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sm_feed-0.1.0-py3-none-any.whl.
File metadata
- Download URL: sm_feed-0.1.0-py3-none-any.whl
- Upload date:
- Size: 15.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b783f1f5df8ccf4e01dac0d9e01790377922ab2972953501e93daa503e11fa9e
|
|
| MD5 |
fa577da7676723384be04fd97cd88b47
|
|
| BLAKE2b-256 |
547ee9f8cad5e8f2bf102ac51ea264ca40e61172a777137657b1b129470a62c1
|
Provenance
The following attestation bundles were made for sm_feed-0.1.0-py3-none-any.whl:
Publisher:
release.yml on Sharathvc23/sm-feed
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sm_feed-0.1.0-py3-none-any.whl -
Subject digest:
b783f1f5df8ccf4e01dac0d9e01790377922ab2972953501e93daa503e11fa9e - Sigstore transparency entry: 2298166133
- Sigstore integration time:
-
Permalink:
Sharathvc23/sm-feed@eb8b71618a3e8a53a668868e25cbdf1c0d107712 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Sharathvc23
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@eb8b71618a3e8a53a668868e25cbdf1c0d107712 -
Trigger Event:
push
-
Statement type: