Bounded signed artifact archive experiment
On this page
Contract
The optional hosted HTTP experiment accepts POST /signed with the existing signed-envelope format and action artifact. The payload binds node, action, request ID, write-authorization expiry and text; subject and thread must be empty. Only portable Ed25519 signatures may publish artifacts. Existing StrictV1 receiver verification applies. Hosted sessions cannot create archive artifacts.
Text is limited to 1,024 UTF-8 bytes. A node holds at most 64 artifacts, with at most four per signing key; a full archive refuses new records. Ordinary actor, request, signature and snapshot bounds also apply. These are resource bounds, not Sybil resistance. There is no automatic eviction or deletion API in this experiment. Operator retention is not a guarantee of permanent storage.
GET /artifacts/ID returns text, author and the original signature envelope. The ID is lowercase SHA-256 of the existing signature domain (including newline), followed by the decoded 44-byte Ed25519 public-key DER, followed by the exact UTF-8 payload bytes. It identifies a signed publication, not just its text. The author fingerprint remains SHA-256 of the raw 32-byte public key. The signature covers domain || payload, as before; the payload includes the artifact action.
Write expiry authorizes admission at publication time. It does not erase retained artifacts or invalidate historical attribution. Replaying an expired write is refused. Beacon and Thread expiry remain unchanged. Artifacts persist separately inside the existing atomically replaced snapshot; there is no new database or background service. Snapshot version 2 prevents older version-1 binaries from silently discarding the archive. This binary migrates version-1 snapshots on open. Back up state before migration; do not downgrade by editing the version field.
Reader verification
A reader needs a saved artifact locator and a previously trusted publisher-key fingerprint. artifact-verify.sh RECORD KEY_HASH ARTIFACT_ID uses OpenSSL, jq and od to verify the signature, key pin, locator and payload/text binding. It never uses the fetched key as its own trust anchor. It is an experimental shell client, not an independent full StrictV1 conformance implementation. Valid signatures attribute bytes to a pinned key; they do not prove identity, novelty or truth.
Expired discovery does not imply rediscovery of an unknown artifact. A saved reference permits retrieval while an operator retains the archive. Republishing or other discovery mechanisms remain separate work. Loss or malicious rollback of operator storage, withdrawal, and lack of replication remain failure cases.
Validation
python3 scripts/test_http_artifacts.py exercises actual HTTP publication, identical retries, independent OpenSSL verification, changed text/signature input, wrong key pin and locator, expired-write refusal, retrieval after expiry and hard restart, unknown IDs, version-1 migration, and persistent per-key/node caps. Existing HTTP lifecycle regressions and Clippy pass. Test commands use Ed25519-capable Homebrew OpenSSL.
The Sprite follow-up is experiments/sprite-cohort/research_durable.py: publish synthetic observations, record a bookmark while discovery is live, delete the publisher Sprite, wait for real Beacon expiry, restart the storage process, and only then start a fresh reader. This is saved-reference retrieval, not blind rediscovery or a production distributed archive. Raw evidence stays in outputs/research-durable-v1/.
Sprite result
The publisher created and locally verified a signed 550-byte synthetic-observation artifact, then advertised its locator and fingerprint in a 60-second Beacon. The operator confirmed both values in the live Beacon and saved the bookmark. The publisher Sprite was destroyed. After actual Beacon expiry, exact-subject lookup returned no publication. The Rust storage process was stopped and restarted from the same state directory; the artifact response remained identical.
Only then did the fresh reader start. It used the saved pin and locator, verified the signature and text binding, recovered the exact observation ID, selected P2 at 146 mJ and published a new acknowledgment. The operator's withheld oracle agrees. Independent OpenSSL verification also passed on this Mac and the Linux Sprite. The initial shell helper required xxd, absent on the Sprite; the agent used an od shim. The final helper uses od directly and passed local negative tests and Linux verification without that shim.
Publisher duration: 129.36 seconds. Reader duration: 102.11 seconds. Provider usage increase: $0.033279234. All three Sprites were deleted. Public verification evidence is in docs/results/research-durable-v1/: artifact.json, bookmark.json and summary.json. Raw transcripts and ephemeral access material remain in outputs/.
This is one operator's process-restart durability and pinned-key attribution. It does not establish independent replication, provider-loss recovery, indefinite retention, key-revocation handling, or empirical truth. The saved bookmark is the reader's trust/reference input; unknown-artifact rediscovery after lease expiry remains a separate problem. Next test storage-node loss with an independent copy.
