From 4e1b80c98af43e3126cc1bd35e5119809efd2dff Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Mon, 13 Jul 2026 17:22:59 +0100 Subject: [PATCH] Derive Persona bubble projection status --- .../src/bin/epiphany-persona-discord.rs | 11 +++-------- ...onceptual-substitution-audit-2026-07-12.md | 10 ++++++++++ notes/fresh-workspace-handoff.md | 6 ++++++ .../epiphany.persona-bubble.schema.json | 5 ++++- ...phany.persona_bubble_intent.v0.schema.json | 5 +---- state/ledgers.msgpack | Bin 482527 -> 482804 bytes state/map.yaml | 2 +- tools/epiphany_local_run.ps1 | 1 - 8 files changed, 25 insertions(+), 15 deletions(-) diff --git a/epiphany-core/src/bin/epiphany-persona-discord.rs b/epiphany-core/src/bin/epiphany-persona-discord.rs index 6eb75a1a..66a5de35 100644 --- a/epiphany-core/src/bin/epiphany-persona-discord.rs +++ b/epiphany-core/src/bin/epiphany-persona-discord.rs @@ -47,7 +47,6 @@ fn main() -> Result<()> { let mut content: Option = None; let mut channel_id: Option = None; let mut source = "epiphany/Persona".to_string(); - let mut status = "ready".to_string(); let mut mood = "attentive".to_string(); let mut limit = 8_usize; let mut persona_name: Option = None; @@ -63,7 +62,6 @@ fn main() -> Result<()> { "--content" => content = Some(next_value(&mut args, "--content")?), "--channel-id" => channel_id = Some(next_value(&mut args, "--channel-id")?), "--source" => source = next_value(&mut args, "--source")?, - "--status" => status = next_value(&mut args, "--status")?, "--mood" => mood = next_value(&mut args, "--mood")?, "--limit" => limit = next_value(&mut args, "--limit")?.parse()?, "--persona-name" => persona_name = Some(next_value(&mut args, "--persona-name")?), @@ -99,7 +97,6 @@ fn main() -> Result<()> { &cultmesh_store, &runtime_id, &source, - &status, &mood, )? } @@ -168,7 +165,6 @@ fn run_bubble( cultmesh_store: &Path, runtime_id: &str, source: &str, - status: &str, mood: &str, ) -> Result { ensure_content(content, "Persona bubble")?; @@ -181,7 +177,7 @@ fn run_bubble( None, false, )?; - let payload = bubble_payload(content, source, status, mood); + let payload = bubble_payload(content, source, mood); let path = artifact_dir.join(format!( "Persona-bubble-{}-{}.json", now_stamp(), @@ -753,7 +749,6 @@ console.log(JSON.stringify({ &cultmesh_store, runtime_id, "smoke/Persona", - "ready", "attentive", )?; let blocked = run_post( @@ -937,11 +932,11 @@ fn write_draft( Ok(path) } -fn bubble_payload(content: &str, source: &str, status: &str, mood: &str) -> Value { +fn bubble_payload(content: &str, source: &str, mood: &str) -> Value { serde_json::json!({ "schema_version": BUBBLE_SCHEMA_VERSION, "created_at": now_iso(), - "status": status, + "status": "projected", "source": source, "target": "aquarium", "role_id": "Persona", diff --git a/notes/conceptual-substitution-audit-2026-07-12.md b/notes/conceptual-substitution-audit-2026-07-12.md index 2e1163b7..319f079d 100644 --- a/notes/conceptual-substitution-audit-2026-07-12.md +++ b/notes/conceptual-substitution-audit-2026-07-12.md @@ -1518,3 +1518,13 @@ for repetition pressure. It now records `crossing_recorded` and counts effects; it no longer implies that an outside provider published them. The v0 serialized `sameTargetPostCount` field remains only as a compatibility name and does not own the internal model. + +## Caller presentation text is not bubble readiness + +The Discord Persona bubble CLI accepted arbitrary `--status` text, while the +MVP wrapper supplied `ready`. That let a caller author an Aquarium-visible +lifecycle verdict with no owner or evidence. The option is deleted. Successful +bubble projection derives `status=projected`; the intent schema rejects unknown +fields and the output schema admits only that derived value. Mood and source +remain presentation metadata. A negative CLI check proves `--status ready` is +rejected before artifact creation. diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index ad967267..289cda55 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -587,3 +587,9 @@ posts. Recent speech tracks `crossing_recorded` and transport receipt. The old v0 `sameTargetPostCount` spelling is serialization- only compatibility. Native Other-mouth smoke, 259 library tests, and all-bin compilation pass. + +Persona Aquarium bubbles no longer accept caller-authored readiness. The CLI +has no `--status`; successful writes derive `projected`; the strict intent +schema has no status field; and the output schema permits only `projected`. +Native smoke returns that value and an explicit `--status ready` invocation is +rejected. The 259 library tests and all-bin check pass. diff --git a/schemas/cultnet/epiphany.persona-bubble.schema.json b/schemas/cultnet/epiphany.persona-bubble.schema.json index 70c4f724..95282eb5 100644 --- a/schemas/cultnet/epiphany.persona-bubble.schema.json +++ b/schemas/cultnet/epiphany.persona-bubble.schema.json @@ -13,7 +13,10 @@ "type": "string" }, "status": { - "type": "string" + "type": "string", + "enum": [ + "projected" + ] }, "source": { "type": "string" diff --git a/schemas/cultnet/epiphany.persona_bubble_intent.v0.schema.json b/schemas/cultnet/epiphany.persona_bubble_intent.v0.schema.json index 35d5526a..f230ccfd 100644 --- a/schemas/cultnet/epiphany.persona_bubble_intent.v0.schema.json +++ b/schemas/cultnet/epiphany.persona_bubble_intent.v0.schema.json @@ -4,7 +4,7 @@ "title": "epiphany persona_bubble_intent v0", "description": "Persona bubble intent for Aquarium-visible chat puffs.", "type": "object", - "additionalProperties": true, + "additionalProperties": false, "properties": { "threadId": { "type": "string" @@ -15,9 +15,6 @@ "source": { "type": "string" }, - "status": { - "type": "string" - }, "mood": { "type": "string" } diff --git a/state/ledgers.msgpack b/state/ledgers.msgpack index be16d642ee6e41e024d643769f9a0fc16e6f0c48..c2d7d6feef1706a472cbd4ef7e07373274139447 100644 GIT binary patch delta 265 zcmcb=Q})Yl*$onm+(t%LrWR4h7}#SjZdPV2WMu4ap32ldm5C9EK{PWEvj8zG5VLKc z%Eay!HT~yoHty;7!`N9Fjix6qWs{M-`79u{s5n0_QNgjWG_feNG*=<1G$|=3b^6Ac zY{K=4#R>&Q`B|ySC8;Ua3dxB%IjKboy1KEO3dPA8 zskw;?#U(|V$t4QqnI#$dr9e@zVjTq_y8y(6C`!!(S_L;-Pr)xWJ+UOSELFkT#}jBU j$jZ!ojyxTOJdp78#AtSz=?6Bku}_!2$i~l{nxY2)