Project reviewed Modeling launch authority

This commit is contained in:
Meta Vens 2026-07-12 12:32:56 +01:00
commit 3e29458aa8
5 changed files with 177 additions and 1 deletions

View file

@ -15075,6 +15075,17 @@ fn run_tick(args: TickArgs) -> Result<Value> {
status = "would-advance".to_string();
reason = "typed Modeling request is ready for the existing worker runtime"
.to_string();
advanced_result = json!({
"schemaVersion": "epiphany.repo_work_modeling_launch_projection.v0",
"status": "launch-ready",
"routeId": route.route_id,
"generation": route.generation,
"requestId": request.request_id,
"jobId": job_id,
"preflightRequired": true,
"lifecycleOwner": "Idunn",
"privateStateExposed": false
});
next_safe_move =
"Rerun without --dry-run to launch the repo-work Modeling worker."
.to_string();
@ -17273,6 +17284,151 @@ mod authority_tests {
assert!(advance_repo_work_modeling_route(&store, &request1, &route1, &review).is_err());
Ok(())
}
#[test]
fn public_revision_mouth_routes_scheduler_to_generation_one() -> Result<()> {
let temp = tempfile::tempdir()?;
let workspace = temp.path().join("repo");
fs::create_dir_all(&workspace)?;
let git = Command::new("git")
.arg("init")
.arg("--quiet")
.arg(&workspace)
.status()?;
assert!(git.success());
let artifact_dir = workspace.join(".epiphany").join("work");
fs::create_dir_all(&artifact_dir)?;
let store = workspace.join("runtime.msgpack");
initialize_runtime_spine(
&store,
RuntimeSpineInitOptions {
runtime_id: "process-retry-smoke".to_string(),
display_name: "Process Retry Smoke".to_string(),
created_at: "2026-07-12T00:00:00Z".to_string(),
},
)?;
let soul = SoulVerdictReceipt {
schema_version: SOUL_VERDICT_RECEIPT_SCHEMA_VERSION.to_string(),
receipt_id: "process-retry-soul".to_string(),
source_result_id: "process-retry-result".to_string(),
source_job_id: "process-retry-job".to_string(),
verdict: "passed".to_string(),
summary: "Verified consequence.".to_string(),
evidence_ids: vec!["commit-abc".to_string()],
risks: Vec::new(),
emitted_at: "2026-07-12T00:00:00Z".to_string(),
contract: "test".to_string(),
};
put_soul_verdict_receipt(&store, &soul)?;
let request0 = RepoWorkModelingRequest {
schema_version: REPO_WORK_MODELING_REQUEST_SCHEMA_VERSION.to_string(),
request_id: "repo-work-close-process-retry-modeling-request-g0".to_string(),
item: "process-retry".to_string(),
requester: "self".to_string(),
soul_verdict_receipt_id: soul.receipt_id.clone(),
commit_sha: "abc123".to_string(),
changed_paths: vec!["README.md".to_string()],
instruction: "Model generation zero.".to_string(),
requested_at: "2026-07-12T00:00:01Z".to_string(),
private_state_exposed: false,
contract: "test".to_string(),
};
let route0 = RepoWorkModelingRoute {
schema_version: REPO_WORK_MODELING_ROUTE_SCHEMA_VERSION.to_string(),
route_id: "repo-work-modeling-route-process-retry".to_string(),
item: request0.item.clone(),
generation: 0,
request_id: request0.request_id.clone(),
previous_finding_receipt_id: String::new(),
authority_owner: "soul".to_string(),
authority_witness_id: soul.receipt_id.clone(),
updated_at: "2026-07-12T00:00:01Z".to_string(),
private_state_exposed: false,
contract: "test".to_string(),
};
commit_initial_repo_work_modeling_route(&store, &request0, &route0)?;
let finding0 = RepoWorkModelingFinding {
schema_version: REPO_WORK_MODELING_FINDING_SCHEMA_VERSION.to_string(),
receipt_id: format!("{}-finding", request0.request_id),
item: request0.item.clone(),
model_ref: "runtime-generation-zero".to_string(),
soul_verdict_receipt_id: soul.receipt_id.clone(),
verdict: "needs-work".to_string(),
finding: "Reviewed context is required.".to_string(),
summary: "Generation zero incomplete.".to_string(),
changed_paths: request0.changed_paths.clone(),
commit_sha: request0.commit_sha.clone(),
emitted_at: "2026-07-12T00:00:02Z".to_string(),
private_state_exposed: false,
contract: "test".to_string(),
request_id: request0.request_id.clone(),
};
put_repo_work_modeling_finding(&store, &finding0)?;
write_json(
&artifact_dir.join("work-accept-process-retry.json"),
&json!({
"schemaVersion": "epiphany.repo_work_accept.v0",
"status": "accepted",
"item": "process-retry",
"privateStateExposed": false
}),
)?;
write_json(
&artifact_dir.join("work-close-process-retry.json"),
&json!({
"schemaVersion": "epiphany.repo_work_closure_receipt.v0",
"status": "awaiting-modeling",
"item": "process-retry",
"runtimeStore": store,
"privateStateExposed": false
}),
)?;
let revised = run_revise_modeling(ReviseModelingArgs {
workspace: workspace.clone(),
item: "process-retry".to_string(),
runtime_store: Some(store.clone()),
rationale: "The operator reviewed the missing context.".to_string(),
review_ref: "review://process-retry/g1".to_string(),
})?;
assert_eq!(revised["generation"], 1);
assert_eq!(
revised["requestId"],
"repo-work-close-process-retry-modeling-request-g1"
);
let tick = run_tick(TickArgs {
workspace: workspace.clone(),
epiphany_root: env::current_dir()?,
item: Some("process-retry".to_string()),
local_verse_store: None,
artifact_dir: Some(artifact_dir),
runtime_store: Some(store.clone()),
cooldown_seconds: 0,
active_timeout_seconds: 900,
dry_run: true,
})?;
let tick_receipt = read_json(Path::new(tick["receiptPath"].as_str().unwrap()))?;
assert_eq!(tick_receipt["action"], "launch-modeling");
assert_eq!(tick_receipt["advancedResult"]["generation"], 1);
assert_eq!(
tick_receipt["advancedResult"]["requestId"],
"repo-work-close-process-retry-modeling-request-g1"
);
assert_eq!(
tick_receipt["advancedResult"]["jobId"],
"repo-work-modeling-process-retry-g1"
);
assert_eq!(tick_receipt["advancedResult"]["preflightRequired"], true);
assert_eq!(tick_receipt["advancedResult"]["lifecycleOwner"], "Idunn");
assert_eq!(
runtime_repo_work_modeling_route(&store, &route0.route_id)?
.expect("current route")
.generation,
1
);
Ok(())
}
}
fn adopted_action_item_from_plan(plan: &Value) -> Value {

View file

@ -305,6 +305,15 @@ handoff and ownership without provider/network variance. The remaining smoke
boundary is process composition through `epiphany-work revise-modeling`, the
scheduler's consumer preflight, and Idunn's child lifecycle receipt.
Scheduler dry-run is now an authority projection rather than a vague promise.
When a current typed Modeling request has no finding or job, its
`advancedResult` names the current route, generation, request, generation-bound
job id, required preflight, and Idunn lifecycle ownership without opening a job
or spawning a process. A disposable authority test drives the production
revision mouth and scheduler and proves generation one is selected. The final
process proof must compare this projection with a real preflighted Idunn launch
receipt; it must not add a fake production runtime mode.
## Current Cut Line
Keep:

View file

@ -2150,6 +2150,17 @@ What remains is process composition, not another state abstraction: drive this
same chain through the public `revise-modeling` command and scheduler so the
generation-one launch carries a passing consumer preflight into an Idunn-owned
lifecycle receipt.
The public-command/scheduler selection half is now deterministic too.
`public_revision_mouth_routes_scheduler_to_generation_one` builds a disposable
repo and runtime store, invokes the production `run_revise_modeling` mouth over
a non-passing generation-zero finding, then pulses the production scheduler in
dry-run mode. The scheduler's launch projection now names route id, generation,
request id, generation-scoped job id, `preflightRequired=true`, and
`lifecycleOwner=Idunn`; the proof requires generation one throughout and the
typed route remains on generation one. The remaining proof is deliberately
physical: run the same fixture non-dry with built consumer/supervisor binaries
and verify the Idunn lifecycle receipt carries the projected request plus
passing schema preflight fingerprints.
## Immediate Re-entry Instruction

Binary file not shown.

View file

@ -659,4 +659,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`. Gjallar 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: Add the process-composition half of the native generation-one repo-work Modeling smoke. Reuse the now-proven deterministic runtime generation chain, but exercise the public Mind-reviewed revise-modeling mouth and scheduler launch so generation one carries a passing consumer schema preflight into an Idunn-owned lifecycle receipt; verify the receipt selects the generation-one request and preserve the existing canonical proof that generation zero cannot close or regain authority.
next_action: Run and seal the physical half of the native generation-one repo-work Modeling smoke. The deterministic public revise-modeling and scheduler projection now prove route/request/job selection for generation one. Pulse the same disposable fixture non-dry with built consumer and supervisor binaries, verify the Idunn lifecycle receipt carries generation one's request plus passing executable/schema fingerprints, then compare it to the dry-run projection without adding a fake production runtime mode.