From 16b4a2fc8bd686b5b5608fae32dfbed0f19297aa Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sun, 12 Jul 2026 20:08:49 +0100 Subject: [PATCH] Split public proof requests from Bifrost receipts --- epiphany-core/src/bin/epiphany-verse-query.rs | 105 +++++------------- notes/epiphany-current-algorithmic-map.md | 8 ++ notes/fresh-workspace-handoff.md | 4 + state/ledgers.msgpack | Bin 430606 -> 431003 bytes state/map.yaml | 2 +- tools/epiphany_local_run.ps1 | 16 +-- 6 files changed, 44 insertions(+), 91 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-verse-query.rs b/epiphany-core/src/bin/epiphany-verse-query.rs index 4c9a7660..28ad62b2 100644 --- a/epiphany-core/src/bin/epiphany-verse-query.rs +++ b/epiphany-core/src/bin/epiphany-verse-query.rs @@ -11,7 +11,6 @@ use epiphany_core::epiphany_cultmesh_bifrost_body_change_publication_receipt_for use epiphany_core::epiphany_cultmesh_bifrost_collaboration_feedback; use epiphany_core::epiphany_cultmesh_bifrost_github_publication_receipt_for_publication; use epiphany_core::epiphany_cultmesh_bifrost_metrics_receipt_for_map_entry; -use epiphany_core::epiphany_cultmesh_bifrost_public_proof_publication_receipt_for_proof; use epiphany_core::epiphany_cultmesh_daemon_poke_intent_from_status; use epiphany_core::epiphany_cultmesh_daemon_poke_receipt_for_intent; use epiphany_core::epiphany_cultmesh_daemon_tool_invocation_intent_from_capability; @@ -66,7 +65,6 @@ use epiphany_core::write_epiphany_cultmesh_bifrost_body_change_publication_recei use epiphany_core::write_epiphany_cultmesh_bifrost_collaboration_feedback; use epiphany_core::write_epiphany_cultmesh_bifrost_github_publication_receipt; use epiphany_core::write_epiphany_cultmesh_bifrost_metrics_receipt; -use epiphany_core::write_epiphany_cultmesh_bifrost_public_proof_publication_receipt; use epiphany_core::write_epiphany_cultmesh_daemon_poke_intent; use epiphany_core::write_epiphany_cultmesh_daemon_poke_receipt; use epiphany_core::write_epiphany_cultmesh_daemon_restart_policy; @@ -111,7 +109,6 @@ use epiphany_core::EpiphanyLocalVerseContext; use epiphany_core::EpiphanyServiceExecutionAuditCheck; use epiphany_core::EPIPHANY_CULTMESH_DAEMON_RESTART_POLICY_SCHEMA_VERSION; use epiphany_core::EPIPHANY_CULTMESH_DAEMON_SERVICE_LIFECYCLE_RECEIPT_SCHEMA_VERSION; -use epiphany_core::EPIPHANY_CULTMESH_GLOBAL_VERSE_ID; use epiphany_core::EPIPHANY_CULTMESH_INTERNAL_VERSE_ID; use epiphany_core::EPIPHANY_CULTMESH_WORK_LOOP_TELEMETRY_SCHEMA_VERSION; use serde::Serialize; @@ -977,6 +974,18 @@ fn run_cli() -> Result<()> { ); } "bifrost-public-proof" | "publish-public-proof" | "public-proof-publication" => { + if args.ledger_entry_id.is_some() + || args.review_receipts.is_some() + || args.credit_receipt_ids.is_some() + || args.public_room_id.is_some() + || args.publication_url.is_some() + || args.receipt_id.is_some() + || args.receipt_status.is_some() + { + anyhow::bail!( + "bifrost-public-proof selects a pending public proof only; Bifrost owns ledger, review, credit, destination, publication, and receipt result fields" + ); + } seed_epiphany_local_verse_context( &args.store, args.runtime_id.clone(), @@ -996,91 +1005,33 @@ fn run_cli() -> Result<()> { latest_public_proof .context("bifrost-public-proof requires a repo work public proof in local Verse or --public-proof-id")? }; - let ledger_entry_id = args - .ledger_entry_id - .clone() - .context("bifrost-public-proof requires --ledger-entry-id")?; - let review_receipts = required_list( - &args.review_receipts, - "bifrost-public-proof requires --review-receipt", - )?; - let credit_receipts = required_list( - &args.credit_receipt_ids, - "bifrost-public-proof requires --credit-receipt", - )?; - let public_room_id = args - .public_room_id - .clone() - .unwrap_or_else(|| "epiphany-global/repo-work/public-proofs".to_string()); - let publication_url = args.publication_url.clone().unwrap_or_else(|| { - format!( - "cultmesh://{public_room_id}/{}", - selected_public_proof.public_proof_id - ) - }); - let receipt_id = args.receipt_id.clone().unwrap_or_else(|| { - format!( - "bifrost-public-proof-publication-{}", - selected_public_proof.public_proof_id - ) - }); - let receipt_status = args - .receipt_status - .clone() - .unwrap_or_else(|| "published-to-public-verse".to_string()); - let receipt = epiphany_cultmesh_bifrost_public_proof_publication_receipt_for_proof( - receipt_id, - &selected_public_proof, - receipt_status, - EPIPHANY_CULTMESH_GLOBAL_VERSE_ID, - public_room_id, - ledger_entry_id, - credit_receipts, - review_receipts, - publication_url, - ); - let written = write_epiphany_cultmesh_bifrost_public_proof_publication_receipt( - &args.store, - args.runtime_id.clone(), - receipt, - )?; - let latest = load_latest_epiphany_cultmesh_bifrost_public_proof_publication_receipt( - &args.store, - args.runtime_id.clone(), - )?; - if latest.as_ref().map(|receipt| receipt.receipt_id.as_str()) - != Some(written.receipt_id.as_str()) - { - anyhow::bail!( - "local Verse query lost Bifrost public proof publication receipt after write" - ); - } println!( "{}", serde_json::to_string_pretty(&json!({ "schemaVersion": "epiphany.local_verse_bifrost_public_proof_publication.v0", - "status": "ok", + "status": "pending-bifrost", "store": args.store, "runtimeId": args.runtime_id, - "receiptId": written.receipt_id, - "publicProofId": written.public_proof_id, - "publicProofRef": written.public_proof_ref, - "publicProofSha256": written.public_proof_sha256, - "item": written.item, - "sourceWorkspace": written.source_workspace, - "sourceBranch": written.source_branch, - "targetPublicVerseId": written.target_public_verse_id, - "publicRoomId": written.public_room_id, - "publicationUrl": written.publication_url, - "ledgerEntryId": written.bifrost_ledger_entry_id, - "creditReceiptIds": written.credit_receipt_ids, - "reviewReceiptIds": written.reviewer_ids, + "receiptId": null, + "publicProofId": selected_public_proof.public_proof_id, + "publicProofRef": selected_public_proof.public_proof_ref, + "publicProofSha256": selected_public_proof.public_proof_sha256, + "item": selected_public_proof.item, + "sourceWorkspace": selected_public_proof.workspace, + "sourceBranch": selected_public_proof.branch, + "targetPublicVerseId": null, + "publicRoomId": null, + "publicationUrl": null, + "ledgerEntryId": null, + "creditReceiptIds": [], + "reviewReceiptIds": [], + "responseOwner": "Bifrost", "commands": { "swarmOverview": WRAPPER_OVERVIEW_COMMAND, "bifrostLedger": WRAPPER_BIFROST_LEDGER_COMMAND, "bifrostPublicProof": "epiphany-verse-query bifrost-public-proof --public-proof-id --ledger-entry-id --review-receipt --credit-receipt " }, - "privateStateExposed": written.private_state_exposed, + "privateStateExposed": false, }))? ); } diff --git a/notes/epiphany-current-algorithmic-map.md b/notes/epiphany-current-algorithmic-map.md index 5edb78b1..75c4db51 100644 --- a/notes/epiphany-current-algorithmic-map.md +++ b/notes/epiphany-current-algorithmic-map.md @@ -54,6 +54,14 @@ - Forbidden writers: Persona cannot pass or synthesize Imagination response fields. - Negative proof: the full consumer-request/provider-accept/Persona-feedback chain persists no consensus receipt until Imagination answers. +## Public-proof submission boundary (2026-07-12) + +- Request source: an existing redacted `repo_work_public_proof` document is the complete pending publication cargo. +- Consumer command: `bifrost-public-proof` selects that proof and reports `pending-bifrost`; it writes no new receipt. +- Bifrost owner: ledger attribution, review and credit receipt binding, public destination, publication URL, publication status, and final receipt. +- Forbidden writers: the caller-facing command rejects all Bifrost result fields and leaves publication coordinates null. +- Negative check: absence of a pending proof fails without writing a publication receipt; response-shaped fields are rejected before mutation. + This is the source-grounded map of the live machine. Historical route and bridge anatomy belongs in git history and evidence ledgers, not here. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index c39a1ec4..9aa3e08a 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -24,6 +24,10 @@ Single poke, batch poke, and swarm triage now write only `epiphany.cultmesh.daem `collaboration-feedback` now writes only bounded Persona feedback after verifying the cited Eve provider receipt exists. It returns `pending-imagination`, leaves consensus receipt/packet/adoption gate null, and rejects caller-supplied consensus receipt id/status, participant ids, or packet reference. The new narrow `epiphany-eve-provider accept` executable owns Eve connection acceptance: it loads the pending intent, verifies the provider cluster owns the target, and writes the connection receipt. Physical proof ran consumer request -> provider acceptance -> Persona feedback and showed no persisted Imagination consensus receipt; counterfeit consensus status was rejected. +## 2026-07-12 public-proof submission / Bifrost publication split + +`bifrost-public-proof` and its wrapper now select an already persisted redacted repo-work public proof and report `pending-bifrost`. They do not construct or write `gamecult.bifrost.public_proof_publication_receipt`. Caller-supplied ledger attribution, reviewers, credit receipts, public room/destination, publication URL, receipt id, and receipt status are rejected as Bifrost-owned result fields. Output publication and receipt coordinates remain null. The current canonical `state/local-verse.ccmp` contains no repo-work public proof fixture, so the physical negative proof covered refusal before any receipt mutation plus rejection of counterfeit result fields; full behavior remains covered by typed public-proof storage tests and compilation. Next split artifact acceptance and metrics the same way or move their receipt writers into a narrow Bifrost provider executable. + This is the re-entry rite for `E:\Projects\EpiphanyAgent`: the waking chant for the local machine-spirit before it touches the forge. diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index eaf7fbc8874a4337f17d9d16fb10b2b45971506d..5a6d06d49a7dd1ec6988f1c05c64e3e399aa30f5 100644 GIT binary patch delta 328 zcmXYsze)o^5XRk0yu!{#Fr*mJGKnA-K?MbZ+9-P?(J@N_e`uU?4k(A6}Ezv zC|LLgzJ@-DIG3dOn1A2=n3=tFo?km3n`~{kzqfn-y^=mnKeyPJvA?@2xvvsNYGRAj zCar!|NqYNGA3dh)Y*>#ETitDTapts&;L1!Z(Rbe39735DDg25`c) zMi0Uk1ve6moj^d1A_l;z3Q?I6c$8d3lrSgtsCL$q!J&~f?`MjLA@*S6Rm4CLvIta; zS`F0WRRgTwf7%;dVgu!o4%t~8xX70qWDcc{kSo+O4B!+;G`~UMSwIt)&ooqFOB2!O SsA7Na262hvI@HIr^xz*rW_LXR delta 57 zcmbQeT&i!0)CNh$=>ZeiSlFVDF|bW|y;+&Dkdg6k^HiqxsZ5MO45FEVm<5Pgw@+na HtLz5=J)#o* diff --git a/state/map.yaml b/state/map.yaml index 5f9d5bc1..f18d4de6 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -70,7 +70,7 @@ data_flow: - move historical proof to git, commits, smoke artifacts, or distilled evidence rather than plan prose active_subgoals: - - Use `notes/conceptual-substitution-audit-2026-07-12.md` as the current authority-corrosion audit. Diagnostics no longer manufacture missing truth. Bifrost publication, daemon tools, Eve connection, daemon poke, and Persona collaboration feedback are requester-only. The generic daemon-status writer is deleted; cluster-daemon owns heartbeat creation. `epiphany-eve-provider` is the narrow provider-side connection receipt writer. Persona feedback requires that real provider receipt, reports `pending-imagination`, and cannot author consensus participants, packet, status, receipt, or adoption gate. Next cut public-proof publication, artifact acceptance, metrics, and audit remaining response writers. + - Use `notes/conceptual-substitution-audit-2026-07-12.md` as the current authority-corrosion audit. Diagnostics no longer manufacture missing truth. Bifrost body-change/public-proof submission, daemon tools, Eve connection, daemon poke, and Persona collaboration feedback are requester-only. The public-proof command selects an existing redacted proof, reports `pending-bifrost`, rejects ledger/review/credit/destination/publication/receipt results, and cannot write the publication receipt. Generic daemon-status is deleted; cluster-daemon owns heartbeat creation. `epiphany-eve-provider` owns connection acceptance. Next cut artifact acceptance, metrics, and audit remaining response writers. - `swarm-overview` is an Epiphany-local, renderer-neutral diagnostic projection over provider-owned typed state. It owns no lifecycle, discovery, composition, or mutation authority. Epiphany publishes clean provider-owned Eve surfaces; Odin may discover them; downstream lowerers and compositors remain outside Epiphany's concern. - Idunn owns daemon survival and service lifecycle physiology. Codex/operator sessions may inspect, generate runbooks, and route explicit operator authority, but keeping daemons alive belongs to Idunn-owned service lifecycle receipts, scheduler policy, audits, and aftercare. Do not let Self, diagnostic projections, or ad hoc wrapper summaries become a second daemon-keeper. Global tool readbacks for Self `service-health`, `service-policy-directory`, and `swarm-online-runbook` state `lifecycleOwner=Idunn` and `hostedBody=Epiphany` without service mutation or private-state exposure. - Use `notes/epiphany-cultmesh-dreaming-roadmap.md` as the design authority for distributed Epiphany dreaming. Public dreams are separately authored typed documents distributed through CultMesh/CultNet; private state remains local and cannot be shared by flipping a visibility flag. Foreign dreams are external thought weather until a reviewed local adoption receipt digests them into memory, planning, doctrine, or governance. diff --git a/tools/epiphany_local_run.ps1 b/tools/epiphany_local_run.ps1 index a7770c63..770c209e 100644 --- a/tools/epiphany_local_run.ps1 +++ b/tools/epiphany_local_run.ps1 @@ -1011,24 +1011,14 @@ if ($Mode -eq "bifrost-public-proof") { } $publicProofId = $latestProof } - $publicationUrl = $BifrostPublicProofPublicationUrl - if ($publicationUrl -eq "") { - $publicationUrl = "cultmesh://$BifrostPublicProofRoomId/$publicProofId" - } Invoke-Checked ` - -Label "publish redacted repo proof through Bifrost" ` + -Label "submit redacted repo proof to Bifrost" ` -FilePath $verseQueryExe ` -Arguments @( "bifrost-public-proof", "--store", $repoLocalVerseStore, "--runtime-id", $RepoWorkRuntimeId, - "--public-proof-id", $publicProofId, - "--receipt-id", $BifrostPublicProofPublicationReceiptId, - "--ledger-entry-id", $BifrostLedgerEntryId, - "--review-receipt", $BifrostPublicProofReviewReceipt, - "--credit-receipt", $BifrostPublicProofCreditReceipt, - "--public-room-id", $BifrostPublicProofRoomId, - "--publication-url", $publicationUrl + "--public-proof-id", $publicProofId ) ` -WorkingDirectory $Root ` -StdoutPath $resultPath ` @@ -2823,7 +2813,7 @@ if ($resultPath -ne "" -and (Test-Path -LiteralPath $resultPath)) { if ($null -ne $result.reviewReceiptIds -and $result.reviewReceiptIds.Count -gt 0) { $reviewReceipts = ($result.reviewReceiptIds -join ",") } - Write-Host "Bifrost public proof: status=$($result.status), item=$($result.item), proof=$($result.publicProofId), receipt=$($result.receiptId), publicVerse=$($result.targetPublicVerseId), room=$($result.publicRoomId), sha256=$($result.publicProofSha256), ledger=$($result.ledgerEntryId), credit=$creditReceipts, review=$reviewReceipts, public=$($result.publicationUrl), privateStateExposed=$($result.privateStateExposed)" + Write-Host "Bifrost public proof request: status=$($result.status), item=$($result.item), proof=$($result.publicProofId), sha256=$($result.publicProofSha256), responseOwner=$($result.responseOwner), privateStateExposed=$($result.privateStateExposed)" } elseif ($Mode -eq "bifrost-artifact-acceptance") { $changedPaths = "none" if ($null -ne $result.changedPaths -and $result.changedPaths.Count -gt 0) {