diff --git a/site/index.html b/site/index.html index c323f51..ed656d2 100644 --- a/site/index.html +++ b/site/index.html @@ -32,6 +32,7 @@ @@ -41,7 +42,8 @@

open source · stdlib-only · MIT

Your agents worked all night. Know if anything went wrong.

AgentScope turns scheduled agent activity into one quiet morning screen. No orchestration. No trace maze. Just the failures, drift and missing work that deserve your attention.

-
Open the live demo ↗Get the source
+
Open the live demo ↗Get the source + Inspect proof snapshots

Python 3.11+ · zero runtime dependencies · self-hosted · MIT

diff --git a/site/proofs-manifest.json b/site/proofs-manifest.json new file mode 100644 index 0000000..6ca7bb3 --- /dev/null +++ b/site/proofs-manifest.json @@ -0,0 +1,26 @@ +{ + "base_url": "", + "generated": "2026-10-21", + "status": "published-historical-snapshots", + "note": "Historical Habitat proof exports. Browser checks validate structure and content hash only; unsigned bundles do not establish publisher identity or external truth.", + "projects": { + "Greenlight-K53": [ + { + "run_id": "greenlight_k53-9dc5a00-0", + "proof_url": "/proofs/Greenlight-K53/greenlight_k53-9dc5a00-0/proof.json", + "claim": "Deployed commit 9dc5a00: fix: refresh K53 database cache when online", + "content_sha256": "faaa6dfb4453224294a8b8a3e192acc2b1d96f41d08f260919c19fcf732b45b2", + "source": "historical Habitat export" + } + ], + "Diketo": [ + { + "run_id": "diketo-30feea5-0", + "proof_url": "/proofs/Diketo/diketo-30feea5-0/proof.json", + "claim": "Deployed commit 30feea5: Add files via upload", + "content_sha256": "10c0bd36495d6cc4fb93da55c5d33e315170cc23a7f6bb476c3875bd6094f6ed", + "source": "historical Habitat export" + } + ] + } +} diff --git a/site/proofs.html b/site/proofs.html new file mode 100644 index 0000000..57bbc3f --- /dev/null +++ b/site/proofs.html @@ -0,0 +1,8 @@ +Evidence proofs — AgentScope

Habitat · portable evidence

Proof snapshots.

Historical Habitat proof exports copied into AgentScope. Each bundle is checked in your browser for its embedded SHA-256 content digest and claim/action consistency.

Important: a matching content hash detects changes to the exported bundle, but does not authenticate who published it. These are historical records, not live status. An unsigned proof does not independently establish that the claimed work happened in the outside world.
Loading proof index…
+ \ No newline at end of file diff --git a/site/proofs/Diketo/diketo-30feea5-0/proof.json b/site/proofs/Diketo/diketo-30feea5-0/proof.json new file mode 100644 index 0000000..643f5ed --- /dev/null +++ b/site/proofs/Diketo/diketo-30feea5-0/proof.json @@ -0,0 +1,46 @@ +{ + "proof_version": "1", + "generated_at": "2026-09-24T22:25:10.769186+00:00", + "claim": { + "id": "claim-diketo-30feea5-0", + "habitat_id": "hermes-local", + "job_id": "hermes-job", + "claim": "Deployed commit 30feea5: Add files via upload", + "action": "run_job", + "expected_status": "ok", + "created_at": "2026-09-24T22:25:10.759897+00:00", + "verified_at": "2026-09-24T22:25:10.767097+00:00", + "status": "verified", + "evidence": { + "source": "habitat_trusted_ledger", + "action_id": "act-diketo-30feea5-0", + "action": "run_job", + "status": "ok", + "timestamp": "2026-09-24T22:25:10.759897+00:00", + "run_id": "diketo-30feea5-0", + "details": { + "source": "hermes_hmac_adapter" + } + }, + "run_id": "diketo-30feea5-0" + }, + "ledger": { + "integrity": "intact", + "actions": [ + { + "id": "act-diketo-30feea5-0", + "habitat_id": "hermes-local", + "job_id": "hermes-job", + "timestamp": "2026-09-24T22:25:10.759897+00:00", + "actor": "agent", + "action": "run_job", + "status": "ok", + "details": { + "source": "hermes_hmac_adapter" + }, + "run_id": "diketo-30feea5-0" + } + ] + }, + "content_sha256": "10c0bd36495d6cc4fb93da55c5d33e315170cc23a7f6bb476c3875bd6094f6ed" +} diff --git a/site/proofs/Greenlight-K53/greenlight_k53-9dc5a00-0/proof.json b/site/proofs/Greenlight-K53/greenlight_k53-9dc5a00-0/proof.json new file mode 100644 index 0000000..049ee0f --- /dev/null +++ b/site/proofs/Greenlight-K53/greenlight_k53-9dc5a00-0/proof.json @@ -0,0 +1,46 @@ +{ + "proof_version": "1", + "generated_at": "2026-09-24T22:25:06.994797+00:00", + "claim": { + "id": "claim-greenlight_k53-9dc5a00-0", + "habitat_id": "hermes-local", + "job_id": "hermes-job", + "claim": "Deployed commit 9dc5a00: fix: refresh K53 database cache when online", + "action": "run_job", + "expected_status": "ok", + "created_at": "2026-09-24T22:25:06.985061+00:00", + "verified_at": "2026-09-24T22:25:06.992541+00:00", + "status": "verified", + "evidence": { + "source": "habitat_trusted_ledger", + "action_id": "act-greenlight_k53-9dc5a00-0", + "action": "run_job", + "status": "ok", + "timestamp": "2026-09-24T22:25:06.985061+00:00", + "run_id": "greenlight_k53-9dc5a00-0", + "details": { + "source": "hermes_hmac_adapter" + } + }, + "run_id": "greenlight_k53-9dc5a00-0" + }, + "ledger": { + "integrity": "intact", + "actions": [ + { + "id": "act-greenlight_k53-9dc5a00-0", + "habitat_id": "hermes-local", + "job_id": "hermes-job", + "timestamp": "2026-09-24T22:25:06.985061+00:00", + "actor": "agent", + "action": "run_job", + "status": "ok", + "details": { + "source": "hermes_hmac_adapter" + }, + "run_id": "greenlight_k53-9dc5a00-0" + } + ] + }, + "content_sha256": "faaa6dfb4453224294a8b8a3e192acc2b1d96f41d08f260919c19fcf732b45b2" +} diff --git a/tests/test_public_proofs.py b/tests/test_public_proofs.py new file mode 100644 index 0000000..5bfb7ab --- /dev/null +++ b/tests/test_public_proofs.py @@ -0,0 +1,24 @@ +import json +from pathlib import Path + +from habitat.proof_verify import verify_file + + +ROOT = Path(__file__).resolve().parents[1] + + +def test_published_habitat_proof_snapshots_verify_and_match_source_exports(): + manifest = json.loads((ROOT / "site" / "proofs-manifest.json").read_text(encoding="utf-8")) + for project, entries in manifest["projects"].items(): + for entry in entries: + relative = entry["proof_url"].lstrip("/") + published = ROOT / "site" / relative + source = ROOT / "web" / "public" / relative + assert published.is_file(), f"missing published proof: {published}" + assert source.is_file(), f"missing source proof: {source}" + assert published.read_bytes() == source.read_bytes() + result = verify_file(published) + assert result["valid"], result["errors"] + assert result["assurance"]["publisher_trust"] == "not-assessed" + assert result["assurance"]["external_truth"] == "not-established" + assert result["assurance"]["signature"] == "absent"