From d35e35300a103511bd0841f97871c6aa7f7cee4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rama=20=E2=80=94=20Buttercode=20Systems?= Date: Wed, 11 Nov 2026 12:55:37 +0200 Subject: [PATCH 1/2] Publish historical Habitat proof snapshots in AgentScope --- site/index.html | 4 +- site/proofs-manifest.json | 26 +++++++++++ site/proofs.html | 8 ++++ .../proofs/Diketo/diketo-30feea5-0/proof.json | 46 +++++++++++++++++++ .../greenlight_k53-9dc5a00-0/proof.json | 46 +++++++++++++++++++ 5 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 site/proofs-manifest.json create mode 100644 site/proofs.html create mode 100644 site/proofs/Diketo/diketo-30feea5-0/proof.json create mode 100644 site/proofs/Greenlight-K53/greenlight_k53-9dc5a00-0/proof.json 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..f5239cf --- /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 structural consistency and its embedded SHA-256 content digest.

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" +} From dc3b5503bb366a4edd36b727834756cbc00f9e39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rama=20=E2=80=94=20Buttercode=20Systems?= Date: Wed, 11 Nov 2026 12:56:45 +0200 Subject: [PATCH 2/2] Verify published Habitat proof snapshots in CI --- site/proofs.html | 4 ++-- tests/test_public_proofs.py | 24 ++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 tests/test_public_proofs.py diff --git a/site/proofs.html b/site/proofs.html index f5239cf..57bbc3f 100644 --- a/site/proofs.html +++ b/site/proofs.html @@ -1,8 +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 structural consistency and its embedded SHA-256 content digest.

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…
+:root{--bg:#f7f7f5;--ink:#0b0d10;--mut:#626a73;--line:#dedfdf;--card:#fff;--blue:#315cff;--green:#137a43;--amber:#8a5a12;--red:#a32929}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.6 system-ui,-apple-system,"Segoe UI",sans-serif}.wrap{width:min(920px,calc(100% - 32px));margin:auto}nav{height:72px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}nav a{color:inherit;text-decoration:none;font-weight:700}.mono{font:11px ui-monospace,monospace;letter-spacing:.08em;text-transform:uppercase;color:var(--blue)}h1{font:800 clamp(34px,6vw,56px)/1.05 ui-monospace,monospace;letter-spacing:-.06em;margin:54px 0 14px}.lede{color:var(--mut);max-width:700px}.notice{border:1px solid #e3d4b4;background:#fffaf0;padding:14px 16px;border-radius:9px;color:#604c2a;font-size:13px;margin:26px 0}.list{display:grid;gap:12px;margin:28px 0}.proof{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:20px}.proof h2{font:800 17px ui-monospace,monospace;margin:0 0 5px}.meta{color:var(--mut);font-size:12px}.claim{margin:14px 0}.checks{display:flex;flex-wrap:wrap;gap:7px}.check{border:1px solid var(--line);border-radius:6px;padding:4px 8px;font:10px ui-monospace,monospace}.ok{color:var(--green);border-color:#b8ddc6}.warn{color:var(--amber);border-color:#e5d3ad}.bad{color:var(--red);border-color:#e6bcbc}.proof a{display:inline-block;margin-top:14px;color:var(--blue);font:700 12px ui-monospace,monospace}.empty{padding:20px;border:1px dashed var(--line);color:var(--mut)}footer{border-top:1px solid var(--line);padding:24px 0 40px;color:var(--mut);font-size:12px}a:focus-visible{outline:3px solid var(--blue);outline-offset:3px}@media(max-width:500px){.proof{padding:15px}.checks{gap:5px}}

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/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"