diff --git a/epiphany-core/src/bin/epiphany-work.rs b/epiphany-core/src/bin/epiphany-work.rs index 096c0911..759718da 100644 --- a/epiphany-core/src/bin/epiphany-work.rs +++ b/epiphany-core/src/bin/epiphany-work.rs @@ -4878,8 +4878,10 @@ fn derive_repo_metrics_request_plan( String::new(), "[metrics_packet]".to_string(), "requires_model_call_count = true".to_string(), - "requires_token_or_cost_summary = true".to_string(), - "requires_review_minutes_or_count = true".to_string(), + "requires_token_summary = true".to_string(), + "requires_cost_availability_status = true".to_string(), + "requires_review_duration = true".to_string(), + "requires_review_event_count = true".to_string(), "requires_accepted_artifact_ref = true".to_string(), "requires_public_proof_ref = true".to_string(), "requires_credit_readback_ref = true".to_string(), diff --git a/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance.rs b/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance.rs index 5109e56e..b861c62f 100644 --- a/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance.rs +++ b/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance.rs @@ -156,8 +156,10 @@ impl RepoMetricsRequest { pub(super) fn has_metrics_packet(&self) -> bool { let p = &self.metrics_packet; p.requires_model_call_count - && p.requires_token_or_cost_summary - && p.requires_review_minutes_or_count + && p.requires_token_summary + && p.requires_cost_availability_status + && p.requires_review_duration + && p.requires_review_event_count && p.requires_accepted_artifact_ref && p.requires_public_proof_ref && p.requires_credit_readback_ref @@ -223,8 +225,10 @@ struct RepoMetricsReceipts { #[derive(Debug, Deserialize)] struct RepoMetricsPacket { requires_model_call_count: bool, - requires_token_or_cost_summary: bool, - requires_review_minutes_or_count: bool, + requires_token_summary: bool, + requires_cost_availability_status: bool, + requires_review_duration: bool, + requires_review_event_count: bool, requires_accepted_artifact_ref: bool, requires_public_proof_ref: bool, requires_credit_readback_ref: bool, diff --git a/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance_tests.rs b/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance_tests.rs index c571144b..a5e2773b 100644 --- a/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance_tests.rs +++ b/epiphany-core/src/bin/epiphany_work/closure_contracts/external_governance_tests.rs @@ -116,8 +116,10 @@ review_load = "gamecult.metrics.review_load_receipt.v0" credit_readback = "gamecult.bifrost.credit_readback_receipt.v0" [metrics_packet] requires_model_call_count = true -requires_token_or_cost_summary = true -requires_review_minutes_or_count = true +requires_token_summary = true +requires_cost_availability_status = true +requires_review_duration = true +requires_review_event_count = true requires_accepted_artifact_ref = true requires_public_proof_ref = true requires_credit_readback_ref = true diff --git a/notes/conceptual-substitution-audit-2026-07-12.md b/notes/conceptual-substitution-audit-2026-07-12.md index 868d0d27..c3b8f13d 100644 --- a/notes/conceptual-substitution-audit-2026-07-12.md +++ b/notes/conceptual-substitution-audit-2026-07-12.md @@ -1433,3 +1433,12 @@ the mutable ref Idunn watches and the immutable commit it deploys. The Idunn receipt contract already records both `watched_ref` and `source_commit`. Deployment requests now require both fields: trigger topology and artifact identity are conjunctive evidence. + +## Measurement availability is not measurement equivalence + +The metrics packet accepted token-or-cost and review-minutes-or-count summaries. +Those quantities answer different questions. It now requires token usage, an +explicit cost availability status, review duration, and review-event count. +Unknown vendor pricing may be reported as unavailable rather than fabricated; +it may not erase token accounting. A review count may not erase elapsed load, +and duration may not erase how many review events occurred. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index be2e5711..14c7f824 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -534,3 +534,10 @@ Deployment git identity is also split. Requests now require both watched ref and source commit SHA, matching Idunn's receipt. A branch/ref identifies the mutable trigger path; the commit SHA identifies deployed bytes. Do not collapse them back into one convenient string. + +Metrics packet completeness is now explicit: token summary, cost availability +status, review duration, and review-event count are separate requirements. +This permits honest unavailable pricing without treating cost and tokens—or +duration and event count—as interchangeable. Next inspect projected accounting +status to ensure receipt presence cannot close a row whose required dimensions +are absent. diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index f7177b17..3b969ed6 100644 Binary files a/state/ledgers.msgpack and b/state/ledgers.msgpack differ diff --git a/state/map.yaml b/state/map.yaml index 73590d8e..2fe1a37a 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -660,4 +660,4 @@ current_status: - Service lifecycle receipt history is now event-only: `load_epiphany_cultmesh_daemon_service_lifecycle_receipts` filters out the `epiphany-local/daemon-service-lifecycle-receipt/latest` mirror, while `load_latest_epiphany_cultmesh_daemon_service_lifecycle_receipt` remains the latest-state reader. Focused unit test `service_lifecycle_receipt_history_excludes_latest_mirror` proves two per-receipt writes return exactly two history records and latest points at the second. Fresh smoke `verse-query-lifecycle-history-filter-smoke` and live overview/triage `local-20260618-145632-497-efac6f0d` / `local-20260618-145632-321-867947af` prove compact swarm sights still expose service lifecycle attention plus the present elevated runbook artifact without daemon pokes or service mutation. Do not use a broad unscoped cargo test filter for this check on Windows; it fans out across bin harnesses and hit a broken pipe during this pass. - `epiphany-verse-query seed-compact` is the compact seed receipt for wrappers and read-only rites. The older `seed` command still prints the full local Verse context for explicit debugging, but compact wrapper modes now avoid full `seed`/final `query` readback after the combined overview proof exposed Windows debug stack overflow from full-context serialization pressure. last_completed_repo_swarm_cut: Huginn live-fire has crossed the first real repo Body from Persona pressure to branch-local Hands commit and Soul/Mind closure, and now has repeatable closure and redacted-public-proof mouths. On `E:\Projects\Huginn` branch `epiphany/huginn/first-awakening`, `tools/epiphany_local_run.ps1 -Mode repo-persona-intake` accepted item `huginn-inspection-readback-livefire`, Weksa/Persona intake remained sealed, and `epiphany-work derive-plan` lowered it to model-authored safe family `repo.status_section` for `README.md` only. `tools/epiphany_local_run.ps1 -Mode repo-swarm-run` advanced four bounded pulses: run-from-plan, adopt-from-plan, execute-from-plan, and close-from-execute. Huginn commit `e9b07c38fceabbdc89ea35c2156326c80c0393a2` updated only `README.md`; closure receipt `.epiphany\work\work-close-huginn-inspection-readback-livefire.json` records status `closed`, Soul verdict `passed`, Mind state commit `repo-work-close-huginn-inspection-readback-livefire-mind-commit`, safe family `repo.status_section`, path scope `README.md`, Bifrost publication gate, and `privateStateExposed=false`. Verification also ran Huginn's TypeScript compiler through concrete Node path: `C:\Program Files\nodejs\node.exe E:\Projects\Huginn\node_modules\typescript\bin\tsc -p tsconfig.json` passed. Native verifier `epiphany-repo-livefire-closure-smoke --workspace E:\Projects\Huginn --item huginn-inspection-readback-livefire --expected-path README.md --expected-family repo.status_section --expected-gate awaiting-publication --expected-blocker bifrost-publication-missing` checks closure receipt, Mind map entry, overview gate/blocker, authority seals, and `git show` changed paths, returning `status=ok`, `soulVerdict=passed`, `publicationGate=Bifrost`, and `privateStateExposed=false`. Wrapper `tools/epiphany_local_run.ps1 -Mode repo-livefire-closure -Workspace E:\Projects\Huginn -RepoWorkItem huginn-inspection-readback-livefire -SkipBuild` exposes the same read-only proof through the local operator mouth; artifact `local-20260621-190156-803-2f85ba15` printed commit, path, gate, blocker, Soul verdict, Mind commit receipt, and `privateStateExposed=False` without push, merge, publication, or target mutation. New wrapper `tools/epiphany_local_run.ps1 -Mode repo-work-public-proof -Workspace E:\Projects\Huginn -RepoWorkItem huginn-inspection-readback-livefire -SkipBuild` exports the redacted proof bundle and repo-local Verse index without publishing; artifact `local-20260621-190645-345-4555b1dc` wrote `.epiphany\public\proof-bundles\repo-work-public-proof-huginn-inspection-readback-livefire.json`, proof id `repo-work-public-proof-huginn-inspection-readback-livefire`, SHA-256 `857545b199f3e37eb06c2e757e5cfc201958e46667bb1f8403fd333a22620f63`, nine artifact rows, zero publication rows, and `privateStateExposed=False`. swarm overview readback `local-20260621-190701-140-b9519ec6` sees the `REPO-WORK-PUBLIC-PROOF` row and action row from Huginn's repo-local Verse with the same SHA-256 while Bifrost publication remains missing. Launcher compact modes are now named compact operator-context modes instead of read-only modes, and `bifrost-public-proof` summaries print item, target public Verse, room, proof SHA-256, review receipts, and credit receipts so publication receipts are auditable without claiming upstream sync. - next_action: Continue the OR-field and observation-to-consequence audit. Deployment now requires watched ref plus immutable source commit, and script hash plus review receipt; trigger topology, byte identity, and approval are separate proofs. Classify remaining alternatives by invariant, then inspect status/receipt/scheduler/cache projections for borrowed closure or effect authority. Keep closure's zero-substring invariant. + next_action: Continue the observation-to-consequence audit. Metrics requests now require token summary, explicit cost availability, review duration, and review-event count separately. Inspect Bifrost accounting projections next: receipt presence must not close metrics rows if required measurement dimensions are absent. Then continue scheduler/cache projection audit. Keep closure's zero-substring invariant.