Guard repo work Mind safe families
This commit is contained in:
parent
9b32576a44
commit
2d346bfe72
6 changed files with 565 additions and 14 deletions
|
|
@ -0,0 +1,441 @@
|
|||
use anyhow::Context;
|
||||
use anyhow::Result;
|
||||
use anyhow::anyhow;
|
||||
use chrono::Utc;
|
||||
use serde_json::Value;
|
||||
use serde_json::json;
|
||||
use std::env;
|
||||
use std::fs;
|
||||
use std::path::Path;
|
||||
use std::path::PathBuf;
|
||||
use std::process::Command;
|
||||
|
||||
fn main() -> Result<()> {
|
||||
let args = Args::parse()?;
|
||||
let result = run_smoke(args)?;
|
||||
println!("{}", serde_json::to_string_pretty(&result)?);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
struct Args {
|
||||
root: PathBuf,
|
||||
smoke_root: PathBuf,
|
||||
}
|
||||
|
||||
impl Args {
|
||||
fn parse() -> Result<Self> {
|
||||
let mut root = env::current_dir().context("failed to resolve current directory")?;
|
||||
let mut smoke_root = root.join(".epiphany-smoke");
|
||||
let mut args = env::args().skip(1);
|
||||
while let Some(arg) = args.next() {
|
||||
match arg.as_str() {
|
||||
"--root" => root = take_path(&mut args, "--root")?,
|
||||
"--smoke-root" => smoke_root = take_path(&mut args, "--smoke-root")?,
|
||||
other => return Err(anyhow!("unexpected argument {other:?}")),
|
||||
}
|
||||
}
|
||||
Ok(Self { root, smoke_root })
|
||||
}
|
||||
}
|
||||
|
||||
fn run_smoke(args: Args) -> Result<Value> {
|
||||
let root = args
|
||||
.root
|
||||
.canonicalize()
|
||||
.with_context(|| format!("failed to resolve {}", args.root.display()))?;
|
||||
let manifest = root.join("epiphany-core").join("Cargo.toml");
|
||||
if !manifest.exists() {
|
||||
return Err(anyhow!(
|
||||
"could not find epiphany-core manifest at {}",
|
||||
manifest.display()
|
||||
));
|
||||
}
|
||||
fs::create_dir_all(&args.smoke_root)
|
||||
.with_context(|| format!("failed to create {}", args.smoke_root.display()))?;
|
||||
let stamp = Utc::now().format("%Y%m%d-%H%M%S").to_string();
|
||||
let smoke_dir = args
|
||||
.smoke_root
|
||||
.join(format!("repo-mind-safe-family-guard-{stamp}"));
|
||||
if smoke_dir.exists() {
|
||||
fs::remove_dir_all(&smoke_dir)
|
||||
.with_context(|| format!("failed to clear {}", smoke_dir.display()))?;
|
||||
}
|
||||
fs::create_dir_all(&smoke_dir)
|
||||
.with_context(|| format!("failed to create {}", smoke_dir.display()))?;
|
||||
|
||||
let repo = smoke_dir.join("repo-body");
|
||||
fs::create_dir_all(&repo).with_context(|| format!("failed to create {}", repo.display()))?;
|
||||
git(["init"], &repo)?;
|
||||
git(
|
||||
["config", "user.email", "epiphany-smoke@example.invalid"],
|
||||
&repo,
|
||||
)?;
|
||||
git(["config", "user.name", "Epiphany Smoke"], &repo)?;
|
||||
fs::write(
|
||||
repo.join("README.md"),
|
||||
"# Repo Mind Safe Family Guard Smoke\n\nThis repository proves Mind refuses alien safe-family labels before Hands authority.\n",
|
||||
)
|
||||
.with_context(|| format!("failed to seed {}", repo.join("README.md").display()))?;
|
||||
git(["add", "README.md"], &repo)?;
|
||||
git(
|
||||
[
|
||||
"commit",
|
||||
"-m",
|
||||
"Seed repo mind safe family guard smoke body",
|
||||
],
|
||||
&repo,
|
||||
)?;
|
||||
git(
|
||||
["switch", "-c", "epiphany/repo-mind-safe-family-guard"],
|
||||
&repo,
|
||||
)?;
|
||||
|
||||
let item = "repo-mind-safe-family-guard";
|
||||
let local_verse = repo.join(".epiphany").join("local-verse.ccmp");
|
||||
cargo_json(
|
||||
&manifest,
|
||||
"epiphany-repo",
|
||||
&[
|
||||
"init",
|
||||
"--workspace",
|
||||
path_str(&repo)?,
|
||||
"--epiphany-root",
|
||||
path_str(&root)?,
|
||||
"--swarm-id",
|
||||
"repo-mind-safe-family-guard-smoke",
|
||||
"--topic",
|
||||
"repo-mind-safe-family-guard",
|
||||
],
|
||||
&root,
|
||||
)?;
|
||||
cargo_json(
|
||||
&manifest,
|
||||
"epiphany-swarm",
|
||||
&[
|
||||
"online",
|
||||
"--workspace",
|
||||
path_str(&repo)?,
|
||||
"--epiphany-root",
|
||||
path_str(&root)?,
|
||||
"--runtime-id",
|
||||
"repo-mind-safe-family-guard-smoke",
|
||||
"--local-verse-store",
|
||||
path_str(&local_verse)?,
|
||||
],
|
||||
&root,
|
||||
)?;
|
||||
cargo_json(
|
||||
&manifest,
|
||||
"epiphany-work",
|
||||
&[
|
||||
"accept",
|
||||
"--workspace",
|
||||
path_str(&repo)?,
|
||||
"--from",
|
||||
"persona",
|
||||
"--item",
|
||||
item,
|
||||
"--summary",
|
||||
"Ask Mind to reject a tampered safe-family label before Hands receives authority.",
|
||||
"--candidate-action-ref",
|
||||
"candidate-action://repo-mind-safe-family-guard/tampered-family",
|
||||
"--public-discussion-ref",
|
||||
"epiphany-global/persona-collaboration/repo-mind-safe-family-guard",
|
||||
],
|
||||
&root,
|
||||
)?;
|
||||
let plan = cargo_json(
|
||||
&manifest,
|
||||
"epiphany-work",
|
||||
&[
|
||||
"derive-plan",
|
||||
"--workspace",
|
||||
path_str(&repo)?,
|
||||
"--item",
|
||||
item,
|
||||
"--action-family",
|
||||
"planning-note",
|
||||
"--model-ref",
|
||||
"repo-mind-safe-family-guard-smoke-imagination-v1",
|
||||
"--model-authored",
|
||||
],
|
||||
&root,
|
||||
)?;
|
||||
let run = cargo_json(
|
||||
&manifest,
|
||||
"epiphany-work",
|
||||
&[
|
||||
"run",
|
||||
"--workspace",
|
||||
path_str(&repo)?,
|
||||
"--epiphany-root",
|
||||
path_str(&root)?,
|
||||
"--item",
|
||||
item,
|
||||
"--path",
|
||||
"notes/epiphany-work/repo-mind-safe-family-guard.md",
|
||||
],
|
||||
&root,
|
||||
)?;
|
||||
|
||||
let plan_path = value_at_path(&plan, &["receiptPath"])
|
||||
.and_then(Value::as_str)
|
||||
.ok_or_else(|| anyhow!("plan output had no receiptPath"))?;
|
||||
let mut tampered_plan = read_json(Path::new(plan_path))?;
|
||||
tampered_plan["derivation"]["actionItemReceipt"]["safeActionFamily"] =
|
||||
json!("idunn.service_lifecycle");
|
||||
let tampered_path = smoke_dir.join("tampered-plan.json");
|
||||
write_json(&tampered_path, &tampered_plan)?;
|
||||
|
||||
let adopt_failure = cargo_json_expect_failure(
|
||||
&manifest,
|
||||
"epiphany-work",
|
||||
&[
|
||||
"adopt",
|
||||
"--workspace",
|
||||
path_str(&repo)?,
|
||||
"--epiphany-root",
|
||||
path_str(&root)?,
|
||||
"--item",
|
||||
item,
|
||||
"--run-receipt",
|
||||
value_at_path(&run, &["receiptPath"])
|
||||
.and_then(Value::as_str)
|
||||
.ok_or_else(|| anyhow!("run output had no receiptPath"))?,
|
||||
"--from-plan",
|
||||
path_str(&tampered_path)?,
|
||||
],
|
||||
&root,
|
||||
)?;
|
||||
if !adopt_failure.contains("unsupported repo-work safe family") {
|
||||
return Err(anyhow!(
|
||||
"adopt failure did not name unsupported safe family: {adopt_failure}"
|
||||
));
|
||||
}
|
||||
|
||||
let refusal_path = repo
|
||||
.join(".epiphany")
|
||||
.join("work")
|
||||
.join("work-mind-adopt-repo-mind-safe-family-guard.json");
|
||||
let refusal = read_json(&refusal_path)?;
|
||||
require_eq(
|
||||
&refusal,
|
||||
&["schemaVersion"],
|
||||
"epiphany.repo_work_mind_adoption_decision.v0",
|
||||
)?;
|
||||
require_eq(&refusal, &["status"], "refused-unsupported-safe-family")?;
|
||||
require_eq(
|
||||
&refusal,
|
||||
&["interpretation", "inputSummary", "safeActionFamily"],
|
||||
"idunn.service_lifecycle",
|
||||
)?;
|
||||
require_bool(
|
||||
&refusal,
|
||||
&["interpretation", "classification", "actionItemAccepted"],
|
||||
false,
|
||||
)?;
|
||||
require_bool(
|
||||
&refusal,
|
||||
&["interpretation", "classification", "safeFamilyRecognized"],
|
||||
false,
|
||||
)?;
|
||||
require_text_field(
|
||||
&refusal,
|
||||
&["interpretation", "refusalReasons", "0"],
|
||||
"Unsupported repo-work safe action family idunn.service_lifecycle",
|
||||
)?;
|
||||
require_bool(&refusal, &["authority", "handsAuthorityGranted"], false)?;
|
||||
require_bool(&refusal, &["authority", "durableStateAdmitted"], false)?;
|
||||
require_bool(&refusal, &["authority", "serviceLifecycleAuthority"], false)?;
|
||||
require_bool(&refusal, &["authority", "privateStateExposed"], false)?;
|
||||
require_eq(
|
||||
&refusal,
|
||||
&["authority", "nextGate"],
|
||||
"imagination.replan_with_allowed_safe_family",
|
||||
)?;
|
||||
require_bool(&refusal, &["privateStateExposed"], false)?;
|
||||
let adoption_receipt_path = repo
|
||||
.join(".epiphany")
|
||||
.join("work")
|
||||
.join("work-adopt-repo-mind-safe-family-guard.json");
|
||||
if adoption_receipt_path.exists() {
|
||||
return Err(anyhow!(
|
||||
"adoption receipt was written despite unsupported safe-family refusal: {}",
|
||||
adoption_receipt_path.display()
|
||||
));
|
||||
}
|
||||
|
||||
Ok(json!({
|
||||
"schemaVersion": "epiphany.repo_work_mind_safe_family_guard_smoke.v0",
|
||||
"status": "ok",
|
||||
"smokeDir": smoke_dir,
|
||||
"repo": repo,
|
||||
"item": item,
|
||||
"tamperedSafeActionFamily": "idunn.service_lifecycle",
|
||||
"mindDecisionStatus": refusal["status"],
|
||||
"actionItemAccepted": false,
|
||||
"safeFamilyRecognized": false,
|
||||
"handsAuthorityGranted": false,
|
||||
"durableStateAdmitted": false,
|
||||
"serviceLifecycleAuthority": false,
|
||||
"adoptionReceiptWritten": false,
|
||||
"privateStateExposed": false
|
||||
}))
|
||||
}
|
||||
|
||||
fn cargo_json(manifest_path: &Path, bin_name: &str, args: &[&str], cwd: &Path) -> Result<Value> {
|
||||
let output = Command::new("cargo")
|
||||
.arg("run")
|
||||
.arg("--quiet")
|
||||
.arg("--manifest-path")
|
||||
.arg(manifest_path)
|
||||
.arg("--bin")
|
||||
.arg(bin_name)
|
||||
.arg("--")
|
||||
.args(args)
|
||||
.current_dir(cwd)
|
||||
.output()
|
||||
.with_context(|| format!("failed to spawn cargo run --bin {bin_name}"))?;
|
||||
if !output.status.success() {
|
||||
return Err(anyhow!(
|
||||
"cargo run --bin {bin_name} failed:\nstdout:\n{}\nstderr:\n{}",
|
||||
String::from_utf8_lossy(&output.stdout),
|
||||
String::from_utf8_lossy(&output.stderr)
|
||||
));
|
||||
}
|
||||
serde_json::from_slice(&output.stdout)
|
||||
.with_context(|| format!("{bin_name} returned invalid JSON"))
|
||||
}
|
||||
|
||||
fn cargo_json_expect_failure(
|
||||
manifest_path: &Path,
|
||||
bin_name: &str,
|
||||
args: &[&str],
|
||||
cwd: &Path,
|
||||
) -> Result<String> {
|
||||
let output = Command::new("cargo")
|
||||
.arg("run")
|
||||
.arg("--quiet")
|
||||
.arg("--manifest-path")
|
||||
.arg(manifest_path)
|
||||
.arg("--bin")
|
||||
.arg(bin_name)
|
||||
.arg("--")
|
||||
.args(args)
|
||||
.current_dir(cwd)
|
||||
.output()
|
||||
.with_context(|| format!("failed to spawn cargo run --bin {bin_name}"))?;
|
||||
if output.status.success() {
|
||||
return Err(anyhow!("{bin_name} unexpectedly succeeded"));
|
||||
}
|
||||
Ok(format!(
|
||||
"{}\n{}",
|
||||
String::from_utf8_lossy(&output.stdout),
|
||||
String::from_utf8_lossy(&output.stderr)
|
||||
))
|
||||
}
|
||||
|
||||
fn git<const N: usize>(args: [&str; N], cwd: &Path) -> Result<()> {
|
||||
let output = Command::new("git")
|
||||
.args(args)
|
||||
.current_dir(cwd)
|
||||
.output()
|
||||
.with_context(|| format!("failed to spawn git in {}", cwd.display()))?;
|
||||
if output.status.success() {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(anyhow!(
|
||||
"git failed in {}:\n{}",
|
||||
cwd.display(),
|
||||
String::from_utf8_lossy(&output.stderr)
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
fn read_json(path: &Path) -> Result<Value> {
|
||||
let raw =
|
||||
fs::read_to_string(path).with_context(|| format!("failed to read {}", path.display()))?;
|
||||
serde_json::from_str(&raw).with_context(|| format!("failed to decode {}", path.display()))
|
||||
}
|
||||
|
||||
fn write_json(path: &Path, value: &Value) -> Result<()> {
|
||||
if let Some(parent) = path.parent() {
|
||||
fs::create_dir_all(parent)
|
||||
.with_context(|| format!("failed to create {}", parent.display()))?;
|
||||
}
|
||||
fs::write(path, serde_json::to_vec_pretty(value)?)
|
||||
.with_context(|| format!("failed to write {}", path.display()))
|
||||
}
|
||||
|
||||
fn require_eq(value: &Value, path: &[&str], expected: &str) -> Result<()> {
|
||||
let actual = value_at_path(value, path)
|
||||
.and_then(Value::as_str)
|
||||
.ok_or_else(|| anyhow!("missing string at {}", path.join(".")))?;
|
||||
if actual == expected {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(anyhow!(
|
||||
"expected {} to be {:?}, got {:?}",
|
||||
path.join("."),
|
||||
expected,
|
||||
actual
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
fn require_bool(value: &Value, path: &[&str], expected: bool) -> Result<()> {
|
||||
let actual = value_at_path(value, path)
|
||||
.and_then(Value::as_bool)
|
||||
.ok_or_else(|| anyhow!("missing bool at {}", path.join(".")))?;
|
||||
if actual == expected {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(anyhow!(
|
||||
"expected {} to be {}, got {}",
|
||||
path.join("."),
|
||||
expected,
|
||||
actual
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
fn require_text_field(value: &Value, path: &[&str], needle: &str) -> Result<()> {
|
||||
let actual = value_at_path(value, path)
|
||||
.and_then(Value::as_str)
|
||||
.ok_or_else(|| anyhow!("missing string at {}", path.join(".")))?;
|
||||
if actual.contains(needle) {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(anyhow!(
|
||||
"expected {} to contain {:?}, got {:?}",
|
||||
path.join("."),
|
||||
needle,
|
||||
actual
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
fn value_at_path<'a>(value: &'a Value, path: &[&str]) -> Option<&'a Value> {
|
||||
let mut cursor = value;
|
||||
for segment in path {
|
||||
if let Ok(index) = segment.parse::<usize>() {
|
||||
cursor = cursor.as_array()?.get(index)?;
|
||||
} else {
|
||||
cursor = cursor.get(*segment)?;
|
||||
}
|
||||
}
|
||||
Some(cursor)
|
||||
}
|
||||
|
||||
fn path_str(path: &Path) -> Result<&str> {
|
||||
path.to_str()
|
||||
.ok_or_else(|| anyhow!("path is not valid UTF-8: {}", path.display()))
|
||||
}
|
||||
|
||||
fn take_path(args: &mut impl Iterator<Item = String>, name: &str) -> Result<PathBuf> {
|
||||
Ok(PathBuf::from(
|
||||
args.next()
|
||||
.ok_or_else(|| anyhow!("missing value for {name}"))?,
|
||||
))
|
||||
}
|
||||
|
|
@ -7158,6 +7158,15 @@ fn run_adopt(args: AdoptArgs) -> Result<Value> {
|
|||
.and_then(Value::as_bool)
|
||||
.unwrap_or(false);
|
||||
let evidence_ref_count = adoption_evidence_refs.len();
|
||||
let safe_family_recognized = repo_work_safe_family_is_recognized(action_item_safe_family);
|
||||
let unsupported_plan_family = plan_receipt.is_some() && !safe_family_recognized;
|
||||
let refusal_reasons = if unsupported_plan_family {
|
||||
vec![format!(
|
||||
"Unsupported repo-work safe action family {action_item_safe_family}; Mind refused to convert this plan into branch-local Hands authority."
|
||||
)]
|
||||
} else {
|
||||
Vec::new()
|
||||
};
|
||||
let mind_interpretation = json!({
|
||||
"schemaVersion": "epiphany.repo_work_mind_interpretation.v0",
|
||||
"owner": "Mind",
|
||||
|
|
@ -7176,8 +7185,8 @@ fn run_adopt(args: AdoptArgs) -> Result<Value> {
|
|||
},
|
||||
"classification": {
|
||||
"decisionKind": "branch-local-hands-adoption",
|
||||
"actionItemAccepted": true,
|
||||
"safeFamilyRecognized": action_item_safe_family != "manual-plan",
|
||||
"actionItemAccepted": !unsupported_plan_family,
|
||||
"safeFamilyRecognized": safe_family_recognized,
|
||||
"requestedPathsDeclared": requested_path_count > 0,
|
||||
"evidenceRefsPresent": evidence_ref_count > 0,
|
||||
"durableStateAdmission": "not-admitted",
|
||||
|
|
@ -7196,10 +7205,60 @@ fn run_adopt(args: AdoptArgs) -> Result<Value> {
|
|||
"cross_body_mutation",
|
||||
"private_verse_export"
|
||||
],
|
||||
"refusalReasons": [],
|
||||
"refusalReasons": refusal_reasons,
|
||||
"privateStateExposed": false
|
||||
});
|
||||
let mind_adoption_id = format!("repo-work-mind-adoption-{item_slug}");
|
||||
if unsupported_plan_family {
|
||||
let refusal_decision = json!({
|
||||
"schemaVersion": "epiphany.repo_work_mind_adoption_decision.v0",
|
||||
"createdAt": now,
|
||||
"workspace": workspace,
|
||||
"runtimeId": run_receipt["runtimeId"],
|
||||
"runtimeStore": runtime_store,
|
||||
"decisionId": mind_adoption_id,
|
||||
"item": item,
|
||||
"status": "refused-unsupported-safe-family",
|
||||
"owner": "Mind",
|
||||
"interpreter": "Mind",
|
||||
"router": "Self",
|
||||
"sourcePlanReceiptPath": plan_receipt_path,
|
||||
"sourceRunReceiptPath": run_receipt_path,
|
||||
"adoptedActionItemReceiptId": action_item_receipt_id,
|
||||
"adoptedActionItem": adopted_action_item,
|
||||
"adoptionEvidenceRefs": adoption_evidence_refs,
|
||||
"interpretation": mind_interpretation,
|
||||
"rationale": refusal_reasons.join(" "),
|
||||
"gates": {
|
||||
"selfPresentedActionItem": true,
|
||||
"mindReviewedEvidence": true,
|
||||
"mindInterpretedActionItem": true,
|
||||
"safeFamilyRequired": true,
|
||||
"safeFamilyRecognized": false,
|
||||
"branchLocalOnly": false,
|
||||
"bifrostPublicationRequired": true,
|
||||
"soulClosureRequired": true
|
||||
},
|
||||
"authority": {
|
||||
"durableStateAdmitted": false,
|
||||
"handsAuthorityGranted": false,
|
||||
"publicationAuthorized": false,
|
||||
"mergeAuthorized": false,
|
||||
"serviceLifecycleAuthority": false,
|
||||
"crossRepoMutation": false,
|
||||
"privateStateExposed": false,
|
||||
"nextGate": "imagination.replan_with_allowed_safe_family"
|
||||
},
|
||||
"privateStateExposed": false,
|
||||
"nextSafeMove": "Ask Imagination for an allowed repo-work safe family before Hands authority can be granted."
|
||||
});
|
||||
let mind_adoption_path = artifact_dir.join(format!("work-mind-adopt-{item_slug}.json"));
|
||||
write_json(&mind_adoption_path, &refusal_decision)?;
|
||||
return Err(anyhow!(
|
||||
"Mind refused adoption for unsupported repo-work safe family {action_item_safe_family}; refusal decision written to {}",
|
||||
mind_adoption_path.display()
|
||||
));
|
||||
}
|
||||
let mind_adoption_rationale = args.mind_adoption_rationale.unwrap_or_else(|| {
|
||||
format!(
|
||||
"Mind adopted the selected Imagination action item for branch-local Hands work because Self presented explicit adoption evidence and the safe family remains bounded: {}",
|
||||
|
|
@ -10654,6 +10713,37 @@ fn adopted_action_item_from_plan(plan: &Value) -> Value {
|
|||
})
|
||||
}
|
||||
|
||||
fn repo_work_safe_family_is_recognized(safe_family: &str) -> bool {
|
||||
matches!(
|
||||
safe_family,
|
||||
"repo.append_worklog"
|
||||
| "repo.markdown_planning_note"
|
||||
| "repo.checklist_note"
|
||||
| "repo.markdown_managed_section"
|
||||
| "repo.status_section"
|
||||
| "repo.task_card"
|
||||
| "repo.body_manifest"
|
||||
| "repo.tool_capabilities"
|
||||
| "repo.tool_request"
|
||||
| "repo.eve_surface"
|
||||
| "repo.collaboration_policy"
|
||||
| "repo.collaboration_topic"
|
||||
| "repo.consensus_brief"
|
||||
| "repo.objective_draft"
|
||||
| "repo.adoption_request"
|
||||
| "repo.scheduling_request"
|
||||
| "repo.work_order"
|
||||
| "repo.verification_request"
|
||||
| "repo.publication_request"
|
||||
| "repo.sync_request"
|
||||
| "repo.maintainer_review_request"
|
||||
| "repo.pr_request"
|
||||
| "repo.credit_request"
|
||||
| "repo.artifact_acceptance_request"
|
||||
| "repo.metrics_request"
|
||||
)
|
||||
}
|
||||
|
||||
fn compact_text(text: &str, limit: usize) -> String {
|
||||
let compact = text.split_whitespace().collect::<Vec<_>>().join(" ");
|
||||
if compact.chars().count() <= limit {
|
||||
|
|
|
|||
|
|
@ -1446,12 +1446,20 @@ Build the remaining MVP in this order:
|
|||
artery before granting branch-local Hands authority. `adopt` now writes a
|
||||
separate Mind interpreter decision receipt, embeds an
|
||||
`epiphany.repo_work_mind_interpretation.v0` packet that classifies the action
|
||||
item, requested paths, safe family, allowed Hands transition, and forbidden
|
||||
durable-state/publication/service/private transitions, then cites it from the
|
||||
main adoption receipt. Banter remains banter unless Mind/Interpreter extracts
|
||||
a work candidate. The remaining cut is richer model-authored families and
|
||||
deeper interpreter semantics beyond the first Mind interpretation packet, not
|
||||
basic action-item or adoption receipt shape.
|
||||
item, requested paths, recognized safe family, allowed Hands transition, and
|
||||
forbidden durable-state/publication/service/private transitions, then cites it
|
||||
from the main adoption receipt. The first deeper interpreter guard is now
|
||||
live: if a plan-derived action item presents a safe-family label outside the
|
||||
repo-work allowlist, Mind writes a refused adoption decision and grants no
|
||||
Hands, durable-state, service-lifecycle, publication, cross-body, or
|
||||
private-state authority. Proof
|
||||
`.epiphany-smoke\repo-mind-safe-family-guard-20260620-190811` tampers a
|
||||
planning note into `idunn.service_lifecycle`, receives
|
||||
`refused-unsupported-safe-family`, and writes no adoption receipt. Banter
|
||||
remains banter unless Mind/Interpreter extracts a work candidate. The
|
||||
remaining cut is richer model-authored families and deeper interpreter
|
||||
semantics beyond the first allowlist refusal, not basic action-item or
|
||||
adoption receipt shape.
|
||||
3. **Model-authored safe plan families.** Promote `derive-plan` beyond the
|
||||
deterministic `append-worklog` and `planning-note` reliquaries by letting
|
||||
Imagination author typed plans over allowlisted repo-local families. Shell
|
||||
|
|
@ -1787,7 +1795,17 @@ Required organs before MVP:
|
|||
lifecycle, cross-body, or private-state authority. The main adoption receipt
|
||||
cites that Mind decision, then grants only branch-local Hands authority; the
|
||||
branch-local item still closes through Soul with family assertions and path
|
||||
scope passing.
|
||||
scope passing. The Mind decision now refuses unsupported plan-derived
|
||||
safe-family labels before Hands review can open: smoke
|
||||
`.epiphany-smoke\repo-mind-safe-family-guard-20260620-190811` tampered a valid
|
||||
planning-note action item into `idunn.service_lifecycle` and proved
|
||||
`actionItemAccepted=false`, `safeFamilyRecognized=false`,
|
||||
`refused-unsupported-safe-family`, no adoption receipt, no branch-local Hands
|
||||
authority, no durable-state admission, no service-lifecycle authority, and no
|
||||
private-state exposure. Positive regression smokes
|
||||
`.epiphany-smoke\repo-planning-facets-20260620-190916` and
|
||||
`.epiphany-smoke\closure-model-gate-20260620-190916` prove recognized
|
||||
planning cargo and closure model gates still pass.
|
||||
`repo-eve-surface` now proves branch-local Eve/CultUI surface contract cargo
|
||||
under `.epiphany/eve-surfaces/<item>.toml`, with compact agent TUI and GUI
|
||||
lowering contracts, local/public Verse routing, Odin discovery, Persona/human
|
||||
|
|
@ -1814,8 +1832,8 @@ Required organs before MVP:
|
|||
`.epiphany-smoke\repo-tool-request-family-20260620-174500` proved the request
|
||||
closes through Soul with family assertions and path scope passing.
|
||||
Remaining work is later model-authored action classes that can change more
|
||||
useful repo-owned configuration, plus deeper interpreter semantics after Mind
|
||||
adoption, without arbitrary shell authority.
|
||||
useful repo-owned configuration, plus deeper interpreter semantics after the
|
||||
first Mind safe-family allowlist refusal, without arbitrary shell authority.
|
||||
- Closure depth: `close` now writes a structured
|
||||
`epiphany.repo_work_closure_review.v0` packet for Hands commits, records
|
||||
model-review provenance when supplied, refuses actual-vs-declared path-scope
|
||||
|
|
|
|||
|
|
@ -140,6 +140,7 @@ remembers doctrine; the branch remembers the blade.
|
|||
- 2026-06-20: `repo-artifact-acceptance-request` is now live as accepted-artifact request cargo. `epiphany-work derive-plan --action-family repo-artifact-acceptance-request` writes `.epiphany/artifact-acceptance-requests/<item>.toml` with safe family `repo.artifact_acceptance_request`, status `awaiting-artifact-acceptance-review`, closure/Soul/Mind/public-proof, maintainer-review, and Hands-commit antecedents, artifact/commit/path/review/proof/rationale/redaction packet requirements, and denials for artifact acceptance, credit ledger, GitHub PR, merge, publication, upstream sync, Hands action, cross-body mutation, and private Verse rummaging. Soul closure assertions inspect schema, family, summary, request state, antecedents, receipt contract, artifact packet, authority gates, and private-state seal. Focused smoke `.epiphany-smoke\repo-artifact-acceptance-request-family-20260620-161559` ran init -> online -> accept -> repo-artifact-acceptance-request derive-plan -> tick run/adopt/execute/close; Hands committed only `.epiphany/artifact-acceptance-requests/repo-artifact-acceptance-request-family.toml`, Soul passed with `pathScopeMatched=true`, `familyAssertions.status=passed`, `awaitingArtifactAcceptanceReview=true`, `artifactAcceptanceAuthorized=false`, `creditLedgerAuthorized=false`, `githubPrAuthorized=false`, `mergeAuthorized=false`, `publicationAuthorized=false`, `upstreamSyncAuthorized=false`, `handsActionAuthorized=false`, and `privateStateExposed=false`. Current remaining repo-swarm MVP organs are deeper interpreter/adoption semantics, more useful repo-owned configuration/action families, and Idunn-owned queue-run service lifecycle under explicit operator authority.
|
||||
- 2026-06-20: `repo-metrics-request` is now live as Bifrost/maintainer accounting request cargo. `epiphany-work derive-plan --action-family repo-metrics-request` writes `.epiphany/metrics-requests/<item>.toml` with safe family `repo.metrics_request`, status `awaiting-metrics-review`, closure/Soul/Mind/public-proof, accepted-artifact, and credit-request antecedents, model-call/token-cost/review-load/artifact/proof/credit-readback/redaction packet requirements, and denials for metrics ledger, spend, review-load, credit ledger, GitHub PR, merge, publication, upstream sync, Hands action, cross-body mutation, and private Verse rummaging. Soul closure assertions inspect schema, family, summary, request state, antecedents, receipt contract, metrics packet, authority gates, and private-state seal. Focused smoke `.epiphany-smoke\repo-metrics-request-family-20260620-162919` ran init -> online -> accept -> repo-metrics-request derive-plan -> tick run/adopt/execute/close; Hands committed only `.epiphany/metrics-requests/repo-metrics-request-family.toml`, Soul passed with `pathScopeMatched=true`, `familyAssertions.status=passed`, `awaitingMetricsReview=true`, `metricsLedgerAuthorized=false`, `spendAuthorized=false`, `reviewLoadAuthorized=false`, `creditLedgerAuthorized=false`, `githubPrAuthorized=false`, `mergeAuthorized=false`, `publicationAuthorized=false`, `upstreamSyncAuthorized=false`, `handsActionAuthorized=false`, and `privateStateExposed=false`. Current remaining repo-swarm MVP organs are deeper interpreter/adoption semantics, more useful repo-owned configuration/action families, and Idunn-owned queue-run service lifecycle under explicit operator authority.
|
||||
- 2026-06-20: `derive-plan` action-item receipts now carry richer model-authored planning facets without widening command authority, and `adopt --from-plan` now preserves the chosen Imagination action item in the Mind adoption receipt. New CLI fields `--assumption`, `--constraint`, `--non-goal`, `--open-question`, `--decision-point`, and `--evidence-need` are recorded under `planningFacets` in `epiphany.repo_work_imagination_action_items_receipt.v0`, mirrored into the plan derivation's `actionItemReceipt`, then copied into `epiphany.repo_work_adoption_receipt.v0` as `adoptedActionItem`; deterministic defaults are emitted when a model does not supply them. Focused smoke `.epiphany-smoke\repo-planning-facets-20260620-164958` ran init -> online -> accept -> model-authored `derive-plan --action-family planning-note` with all facet fields -> tick run/adopt/execute/close; the action-item receipt preserved assumptions, constraints, non-goals, open questions, decision points, and evidence needs while `handsAuthorityGranted=false`, `durableStateAdmitted=false`, `handsCommandAuthority=false`, `durableStateAuthority=false`, and `privateStateExposed=false`; the adoption receipt preserved `adoptedActionItem.safeActionFamily=repo.markdown_planning_note`, planning facets, `adoptedActionItem.handsCommandAuthority=false`, `adoptedActionItem.durableStateAuthority=false`, `adoptedActionItem.publicationAuthorized=false`, `authority.handsAuthorityGranted=true`, `authority.durableStateAdmitted=false`, and `privateStateExposed=false`; Soul closure passed with family assertions and path scope matched. Current remaining repo-swarm MVP organs are deeper interpreter/adoption semantics, more useful repo-owned configuration/action families, and Idunn-owned queue-run service lifecycle under explicit operator authority.
|
||||
- 2026-06-20: Mind now has an explicit repo-work safe-family allowlist guard before branch-local Hands authority. `adopt --from-plan` treats unsupported plan-derived safe-family labels as refused interpreter decisions, writes `epiphany.repo_work_mind_adoption_decision.v0` with `status=refused-unsupported-safe-family`, keeps `actionItemAccepted=false` and `safeFamilyRecognized=false`, grants no Hands/durable-state/service/publication/cross-body/private-state authority, and writes no normal adoption receipt. Focused smoke `.epiphany-smoke\repo-mind-safe-family-guard-20260620-190811` tampered a valid planning-note plan into `idunn.service_lifecycle` and proved the refusal path; positive smokes `.epiphany-smoke\repo-planning-facets-20260620-190916` and `.epiphany-smoke\closure-model-gate-20260620-190916` prove recognized planning facets and closure model gates still pass. Current remaining repo-swarm MVP organs are deeper interpreter semantics beyond the allowlist refusal, more useful repo-owned configuration/action families, richer closure depth, and Idunn-owned queue-run service lifecycle under explicit operator authority.
|
||||
- 2026-06-20: `repo-eve-surface` is now live as repo-owned Eve/CultUI surface contract cargo. `epiphany-work derive-plan --action-family repo-eve-surface` writes `.epiphany/eve-surfaces/<item>.toml` with safe family `repo.eve_surface`, compact agent TUI and GUI lowering contracts, local/public Verse routing, Odin discovery, provider-owned surface identity, Persona/human collaboration flags, feedback routing to Imagination, and denials for renderer ownership, rendering/state/publication/service/cross-body authority, private Verse rummaging, and private-state exposure. Soul closure assertions inspect schema, family, summary, surface routing, Verse routing, CultUI contracts, collaboration route, authority seals, and private-state seal. Focused smoke `.epiphany-smoke\repo-eve-surface-family-20260620-165927` ran init -> online -> accept -> repo-eve-surface derive-plan -> tick run/adopt/execute/close; Hands committed only `.epiphany/eve-surfaces/repo-eve-surface-family.toml`, Soul passed with `pathScopeMatched=true`, `familyAssertions.status=passed`, `hasCultUiContracts=true`, `hasVerseRouting=true`, `odinDiscoverable=true`, `feedbackRoutesToImagination=true`, `rendererOwnsTruth=false`, `renderingAuthority=false`, `stateAuthority=false`, `publicationAuthority=false`, `serviceLifecycleAuthority=false`, `crossBodyMutationAuthority=false`, `privateVerseRummaging=false`, and `privateStateExposed=false`. Current remaining repo-swarm MVP organs are deeper interpreter/adoption semantics, more useful repo-owned configuration/action families, and Idunn-owned queue-run service lifecycle under explicit operator authority.
|
||||
- 2026-06-20: `repo-collaboration-policy` is now live as repo-owned collaboration law cargo. `epiphany-work derive-plan --action-family repo-collaboration-policy` writes `.epiphany/collaboration-policy.toml` with safe family `repo.collaboration_policy`, private/local/public Verse boundaries, Odin discovery, Eve connection receipt requirements, Persona/human/peer discussion flags, speech-audit requirement, Imagination feedback routing, Mind/Bifrost gates, and denials for direct Hands/Mind state, publication, merge, service lifecycle, cross-body mutation, private Verse rummaging, and private-state exposure. Soul closure assertions inspect schema, family, summary, provider truth, Verse boundaries, Eve connection, Persona feedback, Imagination route, authority seals, and private-state seal. Focused smoke `.epiphany-smoke\repo-collaboration-policy-family-20260620-172808` ran init -> online -> accept -> repo-collaboration-policy derive-plan -> tick run/adopt/execute/close; Hands committed only `.epiphany/collaboration-policy.toml`, Soul passed with `pathScopeMatched=true`, `familyAssertions.status=passed`, `hasVerseBoundaries=true`, `odinDiscoverable=true`, `hasEveConnectionContract=true`, `feedbackRoutesToImagination=true`, `candidateActionsNonAuthoritative=true`, and `privateStateExposed=false`. Current remaining repo-swarm MVP organs are deeper interpreter semantics, more useful repo-owned configuration/action families, and Idunn-owned queue-run service lifecycle under explicit operator authority.
|
||||
- `service-execution-runbook` makes that next cut repeatable: it generates the exact elevated wrapper command sequence without mutating the service manager, continues after per-step failure to preserve more receipts, runs `service-execution-audit` in `finally`, exits nonzero if any step failed, and seals a typed runbook lifecycle receipt. Run the generated artifact only with explicit operator authority.
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -88,7 +88,7 @@ active_subgoals:
|
|||
- Keep the landed Phase 6 coordinator, limited safe-boundary CRRC automation, and pre-compaction checkpoint intervention ready for the next bridge-equipped dogfood run.
|
||||
- Preserve the Ghostlight-derived heartbeat initiative seam: every lane, including coordinator/Self and Persona, has a organ-state record and competes for heartbeat slots through readiness/reaction timing; initiative heat can raise or cool global, group, arena, role, and agent tempo through typed heartbeat policy; active thinking freezes initiative until completion, so heat never queues a lane already mid-turn; idle winners ruminate instead of inventing project work, and sleep windows distill the accumulated thought pressure into reviewed self-memory or doctrine.
|
||||
- Use `notes/epiphany-swarm-readiness-plan.md` as the live-fire direction gate. The local run path is a compass, not launch clearance: before unattended swarm operation, Epiphany needs typed pause/brake enforcement, one initiative scheduler, completion-gated cooldown, stale active-turn recovery receipts, parent-side Persona speech eligibility, memory lifecycle operations, and CultNet-first operator snapshots/intents/receipts. The local Verse brake document exists, `epiphany-verse-query swarm-brake` can engage/release it, `tools/epiphany_local_run.ps1` refuses live `plan`/`run`/`mvp` modes when the brake is engaged while leaving `status` readable, `epiphany-mvp-coordinator` checks the local Verse brake before app-server startup, and `epiphany-heartbeat-store` guards tick/pump/heat/queue-mention/routine when given `--local-verse-store`. Daemon liveness is now a typed local Verse authority: `epiphany-verse-query daemon-status` writes one daemon status without repainting the table, local Verse seeding preserves existing daemon statuses and swarm brakes, `invoke-tool` refuses when the host daemon is not ready or lacks `submitTypedToolIntent`, and both daemon tool invocation and lifecycle poke fail closed under an engaged matching brake. `epiphany-daemon-supervisor policy` writes durable per-daemon restart policy with command/args/cwd/cooldown/backoff/attempt state plus reconcile cadence and stale-heartbeat threshold; `epiphany-daemon-supervisor reconcile` loads that policy when no override command is supplied, refuses under a matching lifecycle brake, refuses during cooldown/backoff, writes daemon poke intent/receipt, updates daemon status, and updates policy attempt state; `epiphany-daemon-supervisor tick` is an explicit scheduler pulse that scans durable policies, records ready/noop pulses, skips before the configured reconcile interval, marks stale heartbeat status degraded, routes restarts through the same brake/cooldown/poke receipt path, and writes a latest `epiphany.cultmesh.daemon_scheduler_receipt.v0`; `epiphany-daemon-supervisor serve` runs that same pulse on a configurable cadence with bounded `--max-iterations` proof mode or unbounded service mode. `epiphany-daemon-supervisor service-plan`/`install-service` now writes a planned `epiphany.cultmesh.daemon_service_lifecycle_receipt.v0` for the `serve` command, while `service-launch`/`start-service` spawns that `serve` loop through the current executable or `--service-command`, can `--wait-child` for bounded proof, and records command/args/cwd, scheduler id, daemon selector, pid/exit/status, artifact ref, and private-state guard. `service-runbook`, `windows-service-install`/`service-install-plan`, `windows-service-status`, `windows-service-reconcile`, `windows-service-execution-readiness`, and `windows-service-start`/`stop` now record service lifecycle receipts through the same local Verse; the read-only status path has been proved against the real Windows `EventLog` service with receipt `daemon-service-lifecycle-receipt-windows-eventlog-proof-windows-service-status`, status `running`, exit code `0`, and `privateStateExposed=false`; the read-only service-policy reconciliation path has been proved for missing service, real-service drift against `EventLog`, lifecycle-brake refusal, and wrapper/local-Verse receipt `daemon-service-lifecycle-receipt-windows-eventlog-reconcile-proof-windows-service-reconcile`; execution readiness has been proved as a non-mutating `not-elevated` receipt through direct and wrapper paths; start/stop now produce non-mutating `start-planned`/`stop-planned` receipts unless `--execute-control`/`--execute-service-control` is passed, and wrapper `service-start-plan`/`service-stop-plan` proves those receipts against `EventLog`; explicit install/control execution now refuses as `execution-refused-not-elevated` with `executed=false` when the shell lacks Windows administrator authority, and wrapper `service-install-execute`, `service-start-execute`, and `service-stop-execute` prove those refusal receipts without mutation. Service lifecycle actions check the local Verse swarm brake before process launch, artifact writes, service-manager queries, service-policy reconciliation, execution-readiness checks, control planning, elevation-gated execution, or start/stop execution. The local wrapper builds/checks this binary.
|
||||
- Use `notes/epiphany-repo-swarm-mvp-contract.md` as the repo-swarm autonomy authority map. Autonomous branch-local work inside an Epiphany-owned repo Body is in scope and desired; the safety boundary is typed authority, branch containment, interruption, receipts, private-state sealing, and Bifrost-gated publication/merge/escalation, not asking a human before every local edit. Current safe-family cargo includes repo manifest, tool capability manifest, daemon-hosted tool request cargo, Eve/CultUI surface contract, repo collaboration policy, collaboration topics, consensus/objective/adoption/scheduling/work-order/verification/publication/sync/review/PR/credit/artifact/metrics requests, action-item receipts, Mind adoption interpretation/decision receipts, overview/public-proof/Gjallar/Eve readbacks, typed swarm-run stop classification, Idunn non-mutating queue-run lifecycle receipts, and fresh-repo upstream-main proof. Swarm-run stop proofs now include `.epiphany-smoke\fresh-repo-mvp-20260620-180024` for `iteration-limit` / Self / `self.scheduler-iteration-limit` with upstream-main sync and public-proof export, plus `.epiphany-smoke\swarm-stop-classification-20260620-184717` for `queue-empty` / Gjallar / `repo.work.overview`, `dry-run-preview` / Self / `ready-to-run`, `authority-gated` / Bifrost / `awaiting-publication`, and `authority-gated` / Bifrost/GitHub / `awaiting-upstream-sync`; all stop packets are non-mutating, non-elevated, and `privateStateExposed=false`. Native proof `.epiphany-smoke\repo-work-service-lifecycle-20260620-185853` now proves Idunn-owned non-mutating repo-work queue-run service plan/runbook receipts for exact service id `epiphany-repo-work-queue-runner`, receipt-directory readback, runbook SHA-256 `f2ec67c4f8243a3ebc2f9e915b6b9f5ae2ac2d99d2cdb86905b54667adc456f8`, `hostedBody=repo-work`, no service-manager mutation, no launch, no elevation, and `privateStateExposed=false`.
|
||||
- Use `notes/epiphany-repo-swarm-mvp-contract.md` as the repo-swarm autonomy authority map. Autonomous branch-local work inside an Epiphany-owned repo Body is in scope and desired; the safety boundary is typed authority, branch containment, interruption, receipts, private-state sealing, and Bifrost-gated publication/merge/escalation, not asking a human before every local edit. Current safe-family cargo includes repo manifest, tool capability manifest, daemon-hosted tool request cargo, Eve/CultUI surface contract, repo collaboration policy, collaboration topics, consensus/objective/adoption/scheduling/work-order/verification/publication/sync/review/PR/credit/artifact/metrics requests, action-item receipts, Mind adoption interpretation/decision receipts, explicit Mind safe-family refusal guard proof `.epiphany-smoke\repo-mind-safe-family-guard-20260620-190811`, overview/public-proof/Gjallar/Eve readbacks, typed swarm-run stop classification, Idunn non-mutating queue-run lifecycle receipts, and fresh-repo upstream-main proof. Swarm-run stop proofs now include `.epiphany-smoke\fresh-repo-mvp-20260620-180024` for `iteration-limit` / Self / `self.scheduler-iteration-limit` with upstream-main sync and public-proof export, plus `.epiphany-smoke\swarm-stop-classification-20260620-184717` for `queue-empty` / Gjallar / `repo.work.overview`, `dry-run-preview` / Self / `ready-to-run`, `authority-gated` / Bifrost / `awaiting-publication`, and `authority-gated` / Bifrost/GitHub / `awaiting-upstream-sync`; all stop packets are non-mutating, non-elevated, and `privateStateExposed=false`. Native proof `.epiphany-smoke\repo-work-service-lifecycle-20260620-185853` now proves Idunn-owned non-mutating repo-work queue-run service plan/runbook receipts for exact service id `epiphany-repo-work-queue-runner`, receipt-directory readback, runbook SHA-256 `f2ec67c4f8243a3ebc2f9e915b6b9f5ae2ac2d99d2cdb86905b54667adc456f8`, `hostedBody=repo-work`, no service-manager mutation, no launch, no elevation, and `privateStateExposed=false`.
|
||||
- Gjallar/swarm-overview now projects typed repo-work overview history into the compact global sight report, Persona's public Eve surface lowers the same queue for peers, and Self has a first runnable queue surface over it. `epiphany-verse-query gjallar` reads all `epiphany.cultmesh.repo_work_overview.v0` event documents from local Verse, excludes the `latest` mirror, preserves latest scalar fields, emits multi-item `repoWorkOverviewRows`/TUI rows, and publishes bounded priority 35-39 non-mutating `repo-work-overview` action rows with `owner=Gjallar`, `hostedBody=repo-work`, `authorityGate=repo.work.overview`, `mutatesState=false`, `requiresElevatedAuthority=false`, proof-bundle refs, current gate/blocker/next-safe-move, and `privateStateExposed=false`. `epiphany-verse-query eve-surfaces`, `connect-eve`, and globally invokable Persona `eve-connect` tool readbacks expose compact `REPO-WORK-PEER` rows with item, gate, blocker, next safe move, branch, publication/sync state, and private seal for the public Persona surface only. `epiphany-work queue-run` selects current-repo rows at `ready-to-run`, `ready-to-adopt`, or `ready-to-execute`, delegates action to `tick`, refreshes overview after real advancement, and writes `epiphany.repo_work_queue_run_receipt.v0`; wrapper mode `tools/epiphany_local_run.ps1 -Mode repo-work-queue-run` exposes the same surface. Disposable proofs `.epiphany-smoke\gjallar-repo-work-queue-20260620-012027`, `.epiphany-smoke\eve-repo-work-queue-20260620-013322`, `.epiphany-smoke\queue-run-20260620-014314`, and wrapper artifact `local-20260620-014627-174-aada0241` showed two-item queues through sight, public Eve, direct queue-run, and wrapper dry-run without publication, merge, service lifecycle mutation, elevation, cross-repo mutation, or private-state exposure.
|
||||
- Agent memory lifecycle now has a first typed v0 operation surface in `epiphany-core::agent_memory`: `AgentMemoryLifecycleOperation` can revise, retire, crystallize, prune, and merge bounded memory records after role/agent review, and `epiphany-agent-memory-store review-lifecycle|apply-lifecycle` exposes the path at the operator edge. This closes the first explicit lifecycle-operation slice from the swarm-readiness gate; it does not yet make sleep silently mutate identity or project truth.
|
||||
- Persona public speech now has a parent-side eligibility receipt at the Discord/Aquarium mouth edge. `epiphany.persona_speech_audit.v0` records action kind, content fingerprint, opening/topic keys, recent-window counts, repeated opening/topic counts, channel saturation, and allow/block reasons. `epiphany-persona-discord post` blocks repeated public openings before token/webhook work; draft and bubble still emit audit receipts for operator inspection. The compatibility JSON artifact remains for display, but the durable witness is now `epiphany.cultmesh.persona_speech_audit.v0` in CultMesh with latest-key projection through local Verse context. Local MVP Persona bubbles now write that durable witness to `.epiphany-run/cultmesh/local-verse.ccmp`, not a separate mouth-side store. This is posting-edge policy, not a Persona prompt wish.
|
||||
|
|
@ -634,4 +634,5 @@ current_status:
|
|||
- `tools/epiphany_local_run.ps1 -Mode swarm-online-runbook` now emits an explicit Idunn preflight summary before the operator elevation boundary. Its JSON and one-line summary report `preflightStatus`, child artifact present/hash-verified/mismatch/missing counts, aggregate service execution failed/missing check counts, child preflight rows with expected/actual SHA-256s, and private-state exposure. Live proof `local-20260619-025627-410-9724e2f6` generated the non-mutating parent artifact with `preflightStatus=ready-for-elevated-operator`, two child runbooks present, two hashes verified, zero mismatches, zero missing artifacts, eleven failed sealed service checks, zero missing checks, explicit aftercare audits, and `privateStateExposed=false`. The remaining scar is still explicit elevated operator execution followed by complete Idunn audits, not missing parent/child artifact readiness.
|
||||
- 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.
|
||||
next_action: Continue repo-swarm MVP work from the documented Epiphany Online cut order in `notes/epiphany-repo-swarm-mvp-contract.md`. Typed Gjallar repo-work history/queue sight, peer-readable Persona Eve lowering, Self-owned `epiphany-work queue-run`, bounded `epiphany-swarm run`, execute-to-close scheduler handoff through `close-from-execute`, deterministic `derive-plan` families `append-worklog`, `planning-note`, `checklist-note`, `section-note` / `repo.markdown_managed_section`, `task-card` / `repo.task_card`, `repo-status-section` / `repo.status_section`, `repo-manifest` / `repo.body_manifest`, `repo-tool-capabilities` / `repo.tool_capabilities`, `repo-tool-request` / `repo.tool_request`, `repo-eve-surface` / `repo.eve_surface`, `repo-collaboration-policy` / `repo.collaboration_policy`, `repo-collaboration-topic` / `repo.collaboration_topic`, `repo-consensus-brief` / `repo.consensus_brief`, `repo-objective-draft` / `repo.objective_draft`, `repo-adoption-request` / `repo.adoption_request`, `repo-scheduling-request` / `repo.scheduling_request`, `repo-work-order` / `repo.work_order`, `repo-verification-request` / `repo.verification_request`, `repo-publication-request` / `repo.publication_request`, `repo-sync-request` / `repo.sync_request`, `repo-maintainer-review-request` / `repo.maintainer_review_request`, `repo-pr-request` / `repo.pr_request`, `repo-credit-request` / `repo.credit_request`, `repo-artifact-acceptance-request` / `repo.artifact_acceptance_request`, and `repo-metrics-request` / `repo.metrics_request`, typed Imagination action-item receipts over allowlisted safe families, `epiphany.repo_work_mind_interpretation.v0` plus `epiphany.repo_work_mind_adoption_decision.v0` Mind interpreter receipts before branch-local Hands authority, hash-backed local proof bundles with Bifrost/GitHub/credit/PR/upstream-main publication rows, redacted `epiphany-work export-proof` public bundles plus local Verse `epiphany.cultmesh.repo_work_public_proof.v0` Gjallar readback, Bifrost-owned `gamecult.bifrost.public_proof_publication_receipt.v0` closure plus wrapper `bifrost-public-proof` for redacted public proofs, Idunn-hosted non-mutating queue-run lifecycle plan/runbook receipts including native proof `.epiphany-smoke\repo-work-service-lifecycle-20260620-185853`, and the speech-audited `epiphany-work persona-intake` mouth plus wrapper `repo-persona-intake` are live with `privateStateExposed=false`; proofs `.epiphany-smoke\fresh-repo-mvp-20260620-180024` and `.epiphany-smoke\swarm-stop-classification-20260620-184717` show fresh-repo iteration-limit stop classification, empty-queue Gjallar classification, dry-run planning-preview Self classification, Bifrost publication-gate classification, Bifrost/GitHub upstream-sync gate classification, closure, publication receipts, upstream-main sync, public-proof export, and private-state sealing. The contract note now explicitly answers that Epiphany is headed toward a functional repo swarm but is not fully online until the typed artery runs as a living repo organism. The next cut is deeper interpreter semantics beyond the first Mind decision packet, more useful repo-owned config/action families, optional elevated queue-run service install/start execution plus complete aftercare audit under explicit operator authority, or richer closure depth. Preserve Idunn service lifecycle ownership and existing CultMesh/Odin/Eve tool directories; service install/start execution still requires explicit elevated operator authority.
|
||||
last_completed_repo_swarm_cut: Mind adoption now refuses unsupported plan-derived safe-family labels before Hands authority; proof `.epiphany-smoke\repo-mind-safe-family-guard-20260620-190811` tampered `repo.markdown_planning_note` into `idunn.service_lifecycle` and proved `refused-unsupported-safe-family`, no adoption receipt, no Hands/durable-state/service/publication/private-state authority, with recognized planning facets and closure model smokes still passing.
|
||||
next_action: Continue repo-swarm MVP work from the documented Epiphany Online cut order in `notes/epiphany-repo-swarm-mvp-contract.md`. Typed Gjallar repo-work history/queue sight, peer-readable Persona Eve lowering, Self-owned `epiphany-work queue-run`, bounded `epiphany-swarm run`, execute-to-close scheduler handoff through `close-from-execute`, deterministic `derive-plan` families `append-worklog`, `planning-note`, `checklist-note`, `section-note` / `repo.markdown_managed_section`, `task-card` / `repo.task_card`, `repo-status-section` / `repo.status_section`, `repo-manifest` / `repo.body_manifest`, `repo-tool-capabilities` / `repo.tool_capabilities`, `repo-tool-request` / `repo.tool_request`, `repo-eve-surface` / `repo.eve_surface`, `repo-collaboration-policy` / `repo.collaboration_policy`, `repo-collaboration-topic` / `repo.collaboration_topic`, `repo-consensus-brief` / `repo.consensus_brief`, `repo-objective-draft` / `repo.objective_draft`, `repo-adoption-request` / `repo.adoption_request`, `repo-scheduling-request` / `repo.scheduling_request`, `repo-work-order` / `repo.work_order`, `repo-verification-request` / `repo.verification_request`, `repo-publication-request` / `repo.publication_request`, `repo-sync-request` / `repo.sync_request`, `repo-maintainer-review-request` / `repo.maintainer_review_request`, `repo-pr-request` / `repo.pr_request`, `repo-credit-request` / `repo.credit_request`, `repo-artifact-acceptance-request` / `repo.artifact_acceptance_request`, and `repo-metrics-request` / `repo.metrics_request`, typed Imagination action-item receipts over allowlisted safe families, `epiphany.repo_work_mind_interpretation.v0` plus `epiphany.repo_work_mind_adoption_decision.v0` Mind interpreter receipts and explicit safe-family allowlist refusal before branch-local Hands authority, hash-backed local proof bundles with Bifrost/GitHub/credit/PR/upstream-main publication rows, redacted `epiphany-work export-proof` public bundles plus local Verse `epiphany.cultmesh.repo_work_public_proof.v0` Gjallar readback, Bifrost-owned `gamecult.bifrost.public_proof_publication_receipt.v0` closure plus wrapper `bifrost-public-proof` for redacted public proofs, Idunn-hosted non-mutating queue-run lifecycle plan/runbook receipts including native proof `.epiphany-smoke\repo-work-service-lifecycle-20260620-185853`, and the speech-audited `epiphany-work persona-intake` mouth plus wrapper `repo-persona-intake` are live with `privateStateExposed=false`; proofs `.epiphany-smoke\fresh-repo-mvp-20260620-180024`, `.epiphany-smoke\swarm-stop-classification-20260620-184717`, and `.epiphany-smoke\repo-mind-safe-family-guard-20260620-190811` show fresh-repo iteration-limit stop classification, empty-queue Gjallar classification, dry-run planning-preview Self classification, Bifrost publication-gate classification, Bifrost/GitHub upstream-sync gate classification, Mind refusal for unsupported safe-family cargo, closure, publication receipts, upstream-main sync, public-proof export, and private-state sealing. The contract note now explicitly answers that Epiphany is headed toward a functional repo swarm but is not fully online until the typed artery runs as a living repo organism. The next cut is deeper interpreter semantics beyond the safe-family allowlist refusal, more useful repo-owned config/action families, optional elevated queue-run service install/start execution plus complete aftercare audit under explicit operator authority, or richer closure depth. Preserve Idunn service lifecycle ownership and existing CultMesh/Odin/Eve tool directories; service install/start execution still requires explicit elevated operator authority.
|
||||
|
|
|
|||
Reference in a new issue