From dfe0926041b83d69a4b02451cdab706572522ae3 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sat, 29 Aug 2026 08:25:46 +0200 Subject: [PATCH] Budget grounding reconciliation by agent actions --- crates/ghostlight-dungeon/src/newspaper.rs | 83 ++++++++++++++++++++-- crates/ghostlight-dungeon/src/registry.rs | 2 +- notes/fresh-workspace-handoff.md | 20 ++++-- notes/ghostlight-current-system-map.md | 36 ++++++---- state/evidence.jsonl | 4 +- state/ghostlight-state.cultcache.jsonl | 2 + state/map.yaml | 6 +- 7 files changed, 125 insertions(+), 28 deletions(-) diff --git a/crates/ghostlight-dungeon/src/newspaper.rs b/crates/ghostlight-dungeon/src/newspaper.rs index 9291577..e6a0df9 100644 --- a/crates/ghostlight-dungeon/src/newspaper.rs +++ b/crates/ghostlight-dungeon/src/newspaper.rs @@ -20,7 +20,7 @@ use std::{ const MAX_FRONT_PAGE_ARTICLES: usize = 6; const MAX_SOURCE_NEWS_ITEMS: usize = 32; -const MAX_GROUNDING_RECONCILIATION_STEPS: usize = 2; +const MAX_GROUNDING_RECONCILIATION_STEPS: usize = 3; const EDITION_LABEL: &str = "Current Edition"; const ALLOWED_SECTIONS: [&str; 6] = [ "Front Page", @@ -1775,8 +1775,11 @@ mod tests { const ACCEPTED_PAGE: &str = r#"{"articles":[{"section":"Front Page","headline":"Court Sells the Crown's Seal, Then the Treasurer","deck":"A gambling debt reaches the throne room and leaves one official carrying the blame.","byline":"By the political editor","dateline":"Room","citations":["1"],"paragraphs":["The Thorn Court has admitted that its royal seal was pawned to cover a dragon's gambling debt, a confession that turns private embarrassment into a public question of custody.","The treasurer who delivered that admission in open court was dismissed soon afterward. The court has explained the firing; it has not made the seal any less pawned."]}]}"#; const TWO_ARTICLE_PAGE: &str = r#"{"articles":[{"section":"Front Page","headline":"Court Sells the Crown's Seal, Then the Treasurer","deck":"A gambling debt reaches the throne room and leaves one official carrying the blame.","byline":"By the political editor","dateline":"Room","citations":["1"],"paragraphs":["The Thorn Court has admitted that its royal seal was pawned to cover a dragon's gambling debt, a confession that turns private embarrassment into a public question of custody.","The treasurer who delivered that admission in open court was dismissed soon afterward. The court has explained the firing; it has not made the seal any less pawned."]},{"section":"Dispatches","headline":"West Gate to Close at Moonrise","deck":"Masons will replace a cracked hinge after the palace bell keeper's warning.","byline":"Staff report","dateline":"Yard","citations":["2"],"paragraphs":["Officials warn the west gate is unsafe, and the palace bell keeper says it will close at moonrise while masons replace the cracked hinge.","Travellers using the gate have been told when it will close, though no reopening hour was included in the announcement."]}]}"#; + const EMPTY_REPAIR_ACTION: &str = + r#"{"tool":"submit_edits","replacements":[],"delete_finding_refs":[]}"#; const REPAIR_DECK_ACTION: &str = r#"{"tool":"submit_edits","replacements":[{"finding_ref":0,"replacement":"The court's admission leaves one official carrying the blame for the pawned seal."}],"delete_finding_refs":[]}"#; const SECOND_REPAIR_DECK_ACTION: &str = r#"{"tool":"submit_edits","replacements":[{"finding_ref":0,"replacement":"the dismissed treasurer named in the public record"}],"delete_finding_refs":[]}"#; + const THIRD_REPAIR_DECK_ACTION: &str = r#"{"tool":"submit_edits","replacements":[{"finding_ref":0,"replacement":"identified as the dismissed treasurer"}],"delete_finding_refs":[]}"#; const DELETE_SECOND_ARTICLE_ACTION: &str = r#"{"tool":"submit_edits","replacements":[],"delete_finding_refs":[0]}"#; const ACCEPTING_COPY_DESK: &str = r#"{"accepted":true,"assessment":"The copy is fully supported by its cited public source and reads as attributed court reporting.","findings":[]}"#; @@ -2272,11 +2275,81 @@ mod tests { assert!(requests[4].lived_stream.contains("\"finding_ref\":0")); } + #[tokio::test] + async fn grounding_agent_can_correct_admission_then_copy_desk_within_three_actions() { + const REJECTED: &str = r#"{"accepted":false,"assessment":"The deck overstates where the admitted debt reached.","findings":[{"article_index":0,"category":"unsupported_fact","claim_or_phrase":"A gambling debt reaches the throne room and leaves one official carrying the blame.","reason":"The cited source records the pawned seal and dismissal but does not locate the debt in the throne room."}]}"#; + const REJECTED_AFTER_REPAIR: &str = r#"{"accepted":false,"assessment":"The revised deck still overstates blame.","findings":[{"article_index":0,"category":"unsupported_fact","claim_or_phrase":"one official carrying the blame","reason":"The cited source records dismissal but does not establish how blame was allocated."}]}"#; + let campaign = campaign_with_news(); + let model = ScriptedNewspaperModel::new([ + ACCEPTED_PAGE, + REJECTED, + EMPTY_REPAIR_ACTION, + REPAIR_DECK_ACTION, + REJECTED_AFTER_REPAIR, + SECOND_REPAIR_DECK_ACTION, + ACCEPTING_COPY_DESK, + ]); + let composition = compose_world_newspaper( + &model, + &campaign, + "The Underdeep Clarion", + "A skeptical court broadsheet with dry restraint.", + 4, + ) + .await + .unwrap(); + + assert_eq!(composition.model_receipts.len(), 7); + assert!(composition.grounding.accepted); + let requests = model.requests(); + assert_eq!( + requests + .iter() + .filter(|request| request.stage == "newspaper_editor") + .count(), + 1 + ); + assert_eq!( + requests + .iter() + .filter(|request| { + request.stage == "newspaper_grounding_reconciliation_agent_action" + }) + .count(), + 3 + ); + assert_eq!( + composition + .model_receipts + .iter() + .filter(|receipt| receipt.stage + == "newspaper_grounding_reconciliation_agent_action" + && receipt.validation_result == "semantic_invalid") + .count(), + 2 + ); + assert!(requests[3].lived_stream.contains("was not admitted")); + assert!( + requests[5] + .lived_stream + .contains("revised deck still overstates blame") + ); + let final_copy_desk = composition.model_receipts.last().unwrap(); + assert_eq!(final_copy_desk.stage, "newspaper_copy_desk"); + assert_eq!(final_copy_desk.validation_result, "valid"); + assert!(composition.model_receipts[..6].iter().all(|receipt| { + final_copy_desk + .source_receipt_ids + .contains(&receipt.storage_key().to_owned()) + })); + } + #[tokio::test] async fn terminal_copy_desk_rejection_carries_every_completed_receipt() { const REJECTED: &str = r#"{"accepted":false,"assessment":"The deck overstates where the admitted debt reached.","findings":[{"article_index":0,"category":"unsupported_fact","claim_or_phrase":"A gambling debt reaches the throne room and leaves one official carrying the blame.","reason":"The cited source records the pawned seal and dismissal but does not locate the debt in the throne room."}]}"#; const REJECTED_AFTER_REPAIR: &str = r#"{"accepted":false,"assessment":"The revised deck still overstates blame.","findings":[{"article_index":0,"category":"unsupported_fact","claim_or_phrase":"one official carrying the blame","reason":"The cited source records dismissal but does not establish how blame was allocated."}]}"#; const REJECTED_AFTER_SECOND_REPAIR: &str = r#"{"accepted":false,"assessment":"The second revision still overstates the record.","findings":[{"article_index":0,"category":"unsupported_fact","claim_or_phrase":"named in the public record","reason":"The source records a dismissal but does not say the treasurer was named in the record."}]}"#; + const REJECTED_AFTER_THIRD_REPAIR: &str = r#"{"accepted":false,"assessment":"The third revision still overstates identification.","findings":[{"article_index":0,"category":"unsupported_fact","claim_or_phrase":"identified as the dismissed treasurer","reason":"The source records a dismissal but does not establish that the deck's subject was identified in this way."}]}"#; let campaign = campaign_with_news(); let model = ScriptedNewspaperModel::new([ ACCEPTED_PAGE, @@ -2285,6 +2358,8 @@ mod tests { REJECTED_AFTER_REPAIR, SECOND_REPAIR_DECK_ACTION, REJECTED_AFTER_SECOND_REPAIR, + THIRD_REPAIR_DECK_ACTION, + REJECTED_AFTER_THIRD_REPAIR, ]); let error = compose_world_newspaper( &model, @@ -2299,15 +2374,15 @@ mod tests { .downcast_ref::() .expect("terminal editorial rejection must retain its receipts"); - assert!(failure.message.contains("exhausted 2 semantic steps")); - assert_eq!(failure.model_receipts.len(), 6); + assert!(failure.message.contains("exhausted 3 semantic steps")); + assert_eq!(failure.model_receipts.len(), 8); assert_eq!( failure .model_receipts .iter() .filter(|receipt| receipt.validation_result == "semantic_invalid") .count(), - 2 + 3 ); for rejected in failure .model_receipts diff --git a/crates/ghostlight-dungeon/src/registry.rs b/crates/ghostlight-dungeon/src/registry.rs index 255303b..b9ac3b6 100644 --- a/crates/ghostlight-dungeon/src/registry.rs +++ b/crates/ghostlight-dungeon/src/registry.rs @@ -1670,7 +1670,7 @@ mod tests { let failure = error .downcast_ref::() .expect("registry must preserve the typed terminal editorial failure"); - assert_eq!(failure.model_receipts.len(), 6); + assert_eq!(failure.model_receipts.len(), 8); let stored_after_rejection = runtime.store.keys("persona_stage_receipt.v1").unwrap(); let newly_observed_failure_receipts = failure .model_receipts diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 6a345ae..4379977 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -1083,18 +1083,30 @@ gives the second action an explicit refreshed `finding_catalog`; it never reruns the editor. Gates pass 15/15 newspaper tests, 469/469 library tests, 13/13 strategic-smoke binary tests, and `git diff --check`. +Exact-source run 45 at +`1d898489daeb34fc9f53e6c6bddf00738fc66364` resumed revision 27 without +world or successful-publication replay. Issues 13 and 14 remained preserved. +Action one was rejected locally before the copy desk. Action two was admitted +and rechecked, and the copy desk returned four fresh findings, but the +two-action ceiling left no action to answer them. Issues 15 through 18 and the +final digest remain absent. The bounded protocol needs three total actions: the +initial action, at most one local-admission correction, and at most one fresh +copy-desk correction. A rejection after action three is terminal; the same +workbench state and receipts persist, and the editor never reruns. The exact +mixed-path regression and full gates pass: 16/16 newspaper tests, 470/470 +library tests, 13/13 strategic-smoke binary tests, and `git diff --check`. + Pushed `af749de` routes a provider timeout through the shared model transport's existing one same-request retry and records attempt telemetry. Run 36 crossed that boundary; timeout retry is not its active blocker. -1. Commit and push the verified two-action reconciliation and refreshed- - `finding_catalog` cut. -2. Resume from run 44's preserved Issue 13 and Issue 14 boundary at revision 27 +1. Commit and push the verified three-action reconciliation cut. +2. Launch exact-source run 46 from immutable run 45's preserved Issue 13 and Issue 14 boundary at revision 27 to compose Issues 15 through 18 plus the final digest. Preserve every completed wave checkpoint and canonical world state; do not replay mechanics or successful publications. Require the resulting unedited publications and final digest to pass fresh independent editorial and provenance review before - claiming acceptance. Preserve runs 38/39/40/42, the run-41 root and committed + claiming acceptance. Preserve runs 38/39/40/42/43/44/45, the run-41 root and committed world lineage, stopped run 23, exact acceptance conditions, and unchanged live daemons. 3. Have the game-side adapter lower its authored hierarchy into the published diff --git a/notes/ghostlight-current-system-map.md b/notes/ghostlight-current-system-map.md index fb72a92..f74f481 100644 --- a/notes/ghostlight-current-system-map.md +++ b/notes/ghostlight-current-system-map.md @@ -1315,24 +1315,30 @@ surviving article selection and order, sections, bylines, and all unaffected text remain frozen. If the lead is deleted, owner code promotes the next article to the front page. The agent cannot request a new simulation or source packet, submit a replacement `EditorialPageDraft`, or act as a second editor. The same -copy desk rechecks the complete repaired page. The worker permits at most two -actions in one agent run: an initial repair and exactly one corrective action -after a rejected tool observation. On the first rejection, the same workbench -retains the repaired draft and current verdict, republishes the dynamic action -schema, and exposes a freshly numbered finding catalog derived by the same -helper used for the initial catalog. The harness includes the first action and -copy-desk receipts in the second action's causal source chain. Acceptance ends -the run immediately; an inadmissible repair, an empty surviving page, or a page -rejected after the second action returns no edition. Thus the editor owns +copy desk rechecks the complete repaired page. The worker permits at most three +actions in one agent run: the initial repair and two bounded corrections. The +intended full path can spend one correction on deterministic admission and one +on a fresh copy-desk verdict; every rejected action consumes the same total +budget rather than opening a separate retry owner for either boundary. After +the first or second rejection, the same workbench retains the current private +draft and verdict, republishes the dynamic action schema, and exposes a freshly +numbered finding catalog derived by the same helper used for the initial +catalog. The harness includes every prior action receipt and any copy-desk tool +receipts in the next action's causal source chain; a local admission rejection +correctly contributes no nonexistent tool receipt. Acceptance ends the run +immediately. An inadmissible repair, an empty surviving page, or a page rejected +after the third action returns no edition. Thus the editor owns initial copy, the reconciler owns only this bounded repair session, the copy desk owns grounding judgment, and none owns source facts or world state. Focused tests cover order-independent same-target phrase repair, exact same-desk -repair with source identity preserved, bounded article deletion with survivor recheck, and -one corrective response to the copy desk's current finding catalog. A terminal -regression proves that a second rejection exhausts the two-action budget and -retains all six editor, copy-desk, and action receipts, including both rejected -action dispositions. The library and strategic-binary test suites pass. The typed -issue retains exact event IDs, channels, +repair with source identity preserved, bounded article deletion with survivor +recheck, and one corrective response to the copy desk's current finding catalog. +A mixed-path regression proves local empty-repair rejection, admitted repair and +copy-desk rejection, then third-action acceptance with seven receipts and final +copy-desk ancestry over every prior completed receipt. A terminal regression +proves that three admitted but rejected repairs exhaust the three-action budget +and retain all eight editor, copy-desk, and action receipts, including all three +rejected action dispositions. The typed issue retains exact event IDs, channels, reliability, source revision, and model receipts as audit data. Its internal issue time is derived from the latest cited publication record without exposing that clock to editorial inference. Terminally rejected attempts semantically diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 871e85a..87b0929 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -210,4 +210,6 @@ {"note": "Exact-source run43 at fb8f4670679446f7f825bf733a4b8b9ea524d2b7 resumed run41 revision27 with recovery start wave13 and no mechanics replay. Issue13 recomposition succeeded, Issue14 remained preserved, and Issue15 failed presentation-only because the grounding agent retyped expected_phrase outside the exact frozen copy-desk finding set; Issues16-18 and the final digest were not reached. The copy desk is the finding-identity owner. Reconciliation should select a typed finding reference and propose only a bounded edit; deterministic admission resolves the reference, validates and atomically applies the complete set. Review/verify/commit/push, then resume from preserved Issues13/14 without mechanics or publication replay. Plan commit 4916638 separately admits persistent editorial publication Personas and is not part of this repair.", "status": "ok", "ts": "2026-08-29T05:27:13+00:00", "type": "correction"} {"note": "Grounding repair finding identity now has one owner in the uncommitted typed-reference cut. GroundingFindingRef is page-local; one shared deterministic resolver derives article, field, paragraph, phrase, and span for both verdict validation and edit application. Agent actions contain only finding_ref plus replacement or delete_finding_refs, with no compatibility path for retyped phrases; the registry fixture is updated. Gates pass 14/14 newspaper tests, 468/468 library tests, 13/13 strategic-smoke binary tests, and git diff --check. Pending-design steering is retired. Next action is commit/push then resume from run43 preserved Issues13/14 at revision27 without world or successful-publication replay. Operator priority: earn one good Canopy Ledger first; multiple publication Personas later; TeX/layout and engraved-cut production only after editorial acceptance.", "status": "ok", "ts": "2026-08-29T05:36:38+00:00", "type": "verification"} {"note": "Exact-source run44 at 35f56f0e5e670025e1cfb031cba8d5a4ca9587d4 resumed revision27 without replaying world mechanics or successful publications. Issues13/14 remained preserved. Typed finding references were admitted and the first reconciliation action ran; the deterministic copy desk returned a second exact finding set, then MAX_STEPS=1 stopped the agent before it could react. Issues15-18 and the final digest remain absent. Typed-reference ownership is provider-proved; session depth is now the active boundary. Next cut permits exactly one further corrective action in the same reconciliation workbench state and receipt chain, for two actions total, with no editor rerun; then verify/commit/push and resume from run44. Preserve one-good-Canopy-Ledger first, multi-publication Personas later, and layout/engraved cuts only after editorial acceptance.", "status": "ok", "ts": "2026-08-29T05:55:06+00:00", "type": "correction"} -{"ts": "2026-08-29T06:00:38+00:00", "type": "verification", "status": "ok", "note": "The two-action grounding reconciliation cut is implemented and locally verified. One reconciliation session permits exactly two total corrective actions, preserves the same workbench state and receipt chain, and supplies an explicit refreshed finding_catalog to the second action; it does not rerun the editor or preserve a compatibility path. Gates pass 15/15 newspaper tests, 469/469 library tests, 13/13 strategic-smoke binary tests, and git diff --check. Implementation-pending steering is retired. Next action is commit/push, then resume from immutable run44 preserved Issues13/14 at revision27 without world or successful-publication replay. One good Canopy Ledger remains first; publication Personas later; layout and engraved cuts after editorial acceptance."} +{"note": "The two-action grounding reconciliation cut is implemented and locally verified. One reconciliation session permits exactly two total corrective actions, preserves the same workbench state and receipt chain, and supplies an explicit refreshed finding_catalog to the second action; it does not rerun the editor or preserve a compatibility path. Gates pass 15/15 newspaper tests, 469/469 library tests, 13/13 strategic-smoke binary tests, and git diff --check. Implementation-pending steering is retired. Next action is commit/push, then resume from immutable run44 preserved Issues13/14 at revision27 without world or successful-publication replay. One good Canopy Ledger remains first; publication Personas later; layout and engraved cuts after editorial acceptance.", "status": "ok", "ts": "2026-08-29T06:00:38+00:00", "type": "verification"} +{"note": "Exact-source run45 at 1d898489daeb34fc9f53e6c6bddf00738fc66364 resumed revision27 without world or successful-publication replay. Issues13/14 remained preserved. Reconciliation action1 was rejected locally before the copy desk; action2 was admitted and rechecked, then the deterministic copy desk returned four fresh findings, but the two-action ceiling left no response action. Issues15-18 and the final digest remain absent. The bounded protocol now requires exactly three total actions: initial, at most one local-admission correction, and at most one fresh copy-desk correction in the same workbench state and receipt chain; a rejection after action3 is terminal and the editor never reruns. Verify/commit/push, then resume from immutable run45. Keep one good Canopy Ledger first, publication Personas later, and layout/engraved cuts after editorial acceptance.", "status": "ok", "ts": "2026-08-29T06:15:49+00:00", "type": "correction"} +{"ts": "2026-08-29T06:25:26+00:00", "type": "verification", "status": "ok", "note": "The exact three-action mixed-path reconciliation cut is implemented and verified. It permits the initial action, at most one local-admission correction, and at most one fresh copy-desk correction in one workbench state and receipt chain; rejection after action three is terminal and the editor never reruns. The exact regression and full gates pass: 16/16 newspaper tests, 470/470 library tests, 13/13 strategic-smoke binary tests, and git diff --check. Pending verification steering is retired. Next action is commit/push, then exact-source run46 from immutable run45 preserved Issues13/14 at revision27 with no world or successful-publication replay. One good Canopy Ledger remains first; publication Personas later; layout and engraved cuts after editorial acceptance."} diff --git a/state/ghostlight-state.cultcache.jsonl b/state/ghostlight-state.cultcache.jsonl index cdc6df9..6d7a7d5 100644 --- a/state/ghostlight-state.cultcache.jsonl +++ b/state/ghostlight-state.cultcache.jsonl @@ -212,3 +212,5 @@ {"key": "2026-08-29T053638Z0000-0210-2125540c4833", "payload": "eyJub3RlIjogIkdyb3VuZGluZyByZXBhaXIgZmluZGluZyBpZGVudGl0eSBub3cgaGFzIG9uZSBvd25lciBpbiB0aGUgdW5jb21taXR0ZWQgdHlwZWQtcmVmZXJlbmNlIGN1dC4gR3JvdW5kaW5nRmluZGluZ1JlZiBpcyBwYWdlLWxvY2FsOyBvbmUgc2hhcmVkIGRldGVybWluaXN0aWMgcmVzb2x2ZXIgZGVyaXZlcyBhcnRpY2xlLCBmaWVsZCwgcGFyYWdyYXBoLCBwaHJhc2UsIGFuZCBzcGFuIGZvciBib3RoIHZlcmRpY3QgdmFsaWRhdGlvbiBhbmQgZWRpdCBhcHBsaWNhdGlvbi4gQWdlbnQgYWN0aW9ucyBjb250YWluIG9ubHkgZmluZGluZ19yZWYgcGx1cyByZXBsYWNlbWVudCBvciBkZWxldGVfZmluZGluZ19yZWZzLCB3aXRoIG5vIGNvbXBhdGliaWxpdHkgcGF0aCBmb3IgcmV0eXBlZCBwaHJhc2VzOyB0aGUgcmVnaXN0cnkgZml4dHVyZSBpcyB1cGRhdGVkLiBHYXRlcyBwYXNzIDE0LzE0IG5ld3NwYXBlciB0ZXN0cywgNDY4LzQ2OCBsaWJyYXJ5IHRlc3RzLCAxMy8xMyBzdHJhdGVnaWMtc21va2UgYmluYXJ5IHRlc3RzLCBhbmQgZ2l0IGRpZmYgLS1jaGVjay4gUGVuZGluZy1kZXNpZ24gc3RlZXJpbmcgaXMgcmV0aXJlZC4gTmV4dCBhY3Rpb24gaXMgY29tbWl0L3B1c2ggdGhlbiByZXN1bWUgZnJvbSBydW40MyBwcmVzZXJ2ZWQgSXNzdWVzMTMvMTQgYXQgcmV2aXNpb24yNyB3aXRob3V0IHdvcmxkIG9yIHN1Y2Nlc3NmdWwtcHVibGljYXRpb24gcmVwbGF5LiBPcGVyYXRvciBwcmlvcml0eTogZWFybiBvbmUgZ29vZCBDYW5vcHkgTGVkZ2VyIGZpcnN0OyBtdWx0aXBsZSBwdWJsaWNhdGlvbiBQZXJzb25hcyBsYXRlcjsgVGVYL2xheW91dCBhbmQgZW5ncmF2ZWQtY3V0IHByb2R1Y3Rpb24gb25seSBhZnRlciBlZGl0b3JpYWwgYWNjZXB0YW5jZS4iLCAic3RhdHVzIjogIm9rIiwgInRzIjogIjIwMjYtMDgtMjlUMDU6MzY6MzgrMDA6MDAiLCAidHlwZSI6ICJ2ZXJpZmljYXRpb24ifQ==", "stored_at": "2026-08-29T05:36:38.999213+00:00", "type": "ghostlight.evidence_record.v0"} {"key": "2026-08-29T055506Z0000-0211-3abfd4e2244b", "payload": "eyJub3RlIjogIkV4YWN0LXNvdXJjZSBydW40NCBhdCAzNWY1NmYwZTVlNjcwMDI1ZTFjZmIwMzFjYmE4ZDVhNGNhOTU4N2Q0IHJlc3VtZWQgcmV2aXNpb24yNyB3aXRob3V0IHJlcGxheWluZyB3b3JsZCBtZWNoYW5pY3Mgb3Igc3VjY2Vzc2Z1bCBwdWJsaWNhdGlvbnMuIElzc3VlczEzLzE0IHJlbWFpbmVkIHByZXNlcnZlZC4gVHlwZWQgZmluZGluZyByZWZlcmVuY2VzIHdlcmUgYWRtaXR0ZWQgYW5kIHRoZSBmaXJzdCByZWNvbmNpbGlhdGlvbiBhY3Rpb24gcmFuOyB0aGUgZGV0ZXJtaW5pc3RpYyBjb3B5IGRlc2sgcmV0dXJuZWQgYSBzZWNvbmQgZXhhY3QgZmluZGluZyBzZXQsIHRoZW4gTUFYX1NURVBTPTEgc3RvcHBlZCB0aGUgYWdlbnQgYmVmb3JlIGl0IGNvdWxkIHJlYWN0LiBJc3N1ZXMxNS0xOCBhbmQgdGhlIGZpbmFsIGRpZ2VzdCByZW1haW4gYWJzZW50LiBUeXBlZC1yZWZlcmVuY2Ugb3duZXJzaGlwIGlzIHByb3ZpZGVyLXByb3ZlZDsgc2Vzc2lvbiBkZXB0aCBpcyBub3cgdGhlIGFjdGl2ZSBib3VuZGFyeS4gTmV4dCBjdXQgcGVybWl0cyBleGFjdGx5IG9uZSBmdXJ0aGVyIGNvcnJlY3RpdmUgYWN0aW9uIGluIHRoZSBzYW1lIHJlY29uY2lsaWF0aW9uIHdvcmtiZW5jaCBzdGF0ZSBhbmQgcmVjZWlwdCBjaGFpbiwgZm9yIHR3byBhY3Rpb25zIHRvdGFsLCB3aXRoIG5vIGVkaXRvciByZXJ1bjsgdGhlbiB2ZXJpZnkvY29tbWl0L3B1c2ggYW5kIHJlc3VtZSBmcm9tIHJ1bjQ0LiBQcmVzZXJ2ZSBvbmUtZ29vZC1DYW5vcHktTGVkZ2VyIGZpcnN0LCBtdWx0aS1wdWJsaWNhdGlvbiBQZXJzb25hcyBsYXRlciwgYW5kIGxheW91dC9lbmdyYXZlZCBjdXRzIG9ubHkgYWZ0ZXIgZWRpdG9yaWFsIGFjY2VwdGFuY2UuIiwgInN0YXR1cyI6ICJvayIsICJ0cyI6ICIyMDI2LTA4LTI5VDA1OjU1OjA2KzAwOjAwIiwgInR5cGUiOiAiY29ycmVjdGlvbiJ9", "stored_at": "2026-08-29T05:55:06.957623+00:00", "type": "ghostlight.evidence_record.v0"} {"key": "2026-08-29T060038Z0000-0212-bad914a562bc", "payload": "eyJub3RlIjogIlRoZSB0d28tYWN0aW9uIGdyb3VuZGluZyByZWNvbmNpbGlhdGlvbiBjdXQgaXMgaW1wbGVtZW50ZWQgYW5kIGxvY2FsbHkgdmVyaWZpZWQuIE9uZSByZWNvbmNpbGlhdGlvbiBzZXNzaW9uIHBlcm1pdHMgZXhhY3RseSB0d28gdG90YWwgY29ycmVjdGl2ZSBhY3Rpb25zLCBwcmVzZXJ2ZXMgdGhlIHNhbWUgd29ya2JlbmNoIHN0YXRlIGFuZCByZWNlaXB0IGNoYWluLCBhbmQgc3VwcGxpZXMgYW4gZXhwbGljaXQgcmVmcmVzaGVkIGZpbmRpbmdfY2F0YWxvZyB0byB0aGUgc2Vjb25kIGFjdGlvbjsgaXQgZG9lcyBub3QgcmVydW4gdGhlIGVkaXRvciBvciBwcmVzZXJ2ZSBhIGNvbXBhdGliaWxpdHkgcGF0aC4gR2F0ZXMgcGFzcyAxNS8xNSBuZXdzcGFwZXIgdGVzdHMsIDQ2OS80NjkgbGlicmFyeSB0ZXN0cywgMTMvMTMgc3RyYXRlZ2ljLXNtb2tlIGJpbmFyeSB0ZXN0cywgYW5kIGdpdCBkaWZmIC0tY2hlY2suIEltcGxlbWVudGF0aW9uLXBlbmRpbmcgc3RlZXJpbmcgaXMgcmV0aXJlZC4gTmV4dCBhY3Rpb24gaXMgY29tbWl0L3B1c2gsIHRoZW4gcmVzdW1lIGZyb20gaW1tdXRhYmxlIHJ1bjQ0IHByZXNlcnZlZCBJc3N1ZXMxMy8xNCBhdCByZXZpc2lvbjI3IHdpdGhvdXQgd29ybGQgb3Igc3VjY2Vzc2Z1bC1wdWJsaWNhdGlvbiByZXBsYXkuIE9uZSBnb29kIENhbm9weSBMZWRnZXIgcmVtYWlucyBmaXJzdDsgcHVibGljYXRpb24gUGVyc29uYXMgbGF0ZXI7IGxheW91dCBhbmQgZW5ncmF2ZWQgY3V0cyBhZnRlciBlZGl0b3JpYWwgYWNjZXB0YW5jZS4iLCAic3RhdHVzIjogIm9rIiwgInRzIjogIjIwMjYtMDgtMjlUMDY6MDA6MzgrMDA6MDAiLCAidHlwZSI6ICJ2ZXJpZmljYXRpb24ifQ==", "stored_at": "2026-08-29T06:00:38.081686+00:00", "type": "ghostlight.evidence_record.v0"} +{"key": "2026-08-29T061549Z0000-0213-c145b473c763", "payload": "eyJub3RlIjogIkV4YWN0LXNvdXJjZSBydW40NSBhdCAxZDg5ODQ4OWRhZWIzNGZjOWY1M2U2YzZiZGRmMDA3MzhmYzY2MzY0IHJlc3VtZWQgcmV2aXNpb24yNyB3aXRob3V0IHdvcmxkIG9yIHN1Y2Nlc3NmdWwtcHVibGljYXRpb24gcmVwbGF5LiBJc3N1ZXMxMy8xNCByZW1haW5lZCBwcmVzZXJ2ZWQuIFJlY29uY2lsaWF0aW9uIGFjdGlvbjEgd2FzIHJlamVjdGVkIGxvY2FsbHkgYmVmb3JlIHRoZSBjb3B5IGRlc2s7IGFjdGlvbjIgd2FzIGFkbWl0dGVkIGFuZCByZWNoZWNrZWQsIHRoZW4gdGhlIGRldGVybWluaXN0aWMgY29weSBkZXNrIHJldHVybmVkIGZvdXIgZnJlc2ggZmluZGluZ3MsIGJ1dCB0aGUgdHdvLWFjdGlvbiBjZWlsaW5nIGxlZnQgbm8gcmVzcG9uc2UgYWN0aW9uLiBJc3N1ZXMxNS0xOCBhbmQgdGhlIGZpbmFsIGRpZ2VzdCByZW1haW4gYWJzZW50LiBUaGUgYm91bmRlZCBwcm90b2NvbCBub3cgcmVxdWlyZXMgZXhhY3RseSB0aHJlZSB0b3RhbCBhY3Rpb25zOiBpbml0aWFsLCBhdCBtb3N0IG9uZSBsb2NhbC1hZG1pc3Npb24gY29ycmVjdGlvbiwgYW5kIGF0IG1vc3Qgb25lIGZyZXNoIGNvcHktZGVzayBjb3JyZWN0aW9uIGluIHRoZSBzYW1lIHdvcmtiZW5jaCBzdGF0ZSBhbmQgcmVjZWlwdCBjaGFpbjsgYSByZWplY3Rpb24gYWZ0ZXIgYWN0aW9uMyBpcyB0ZXJtaW5hbCBhbmQgdGhlIGVkaXRvciBuZXZlciByZXJ1bnMuIFZlcmlmeS9jb21taXQvcHVzaCwgdGhlbiByZXN1bWUgZnJvbSBpbW11dGFibGUgcnVuNDUuIEtlZXAgb25lIGdvb2QgQ2Fub3B5IExlZGdlciBmaXJzdCwgcHVibGljYXRpb24gUGVyc29uYXMgbGF0ZXIsIGFuZCBsYXlvdXQvZW5ncmF2ZWQgY3V0cyBhZnRlciBlZGl0b3JpYWwgYWNjZXB0YW5jZS4iLCAic3RhdHVzIjogIm9rIiwgInRzIjogIjIwMjYtMDgtMjlUMDY6MTU6NDkrMDA6MDAiLCAidHlwZSI6ICJjb3JyZWN0aW9uIn0=", "stored_at": "2026-08-29T06:15:49.916086+00:00", "type": "ghostlight.evidence_record.v0"} +{"key": "2026-08-29T062526Z0000-0214-688704de1feb", "payload": "eyJub3RlIjogIlRoZSBleGFjdCB0aHJlZS1hY3Rpb24gbWl4ZWQtcGF0aCByZWNvbmNpbGlhdGlvbiBjdXQgaXMgaW1wbGVtZW50ZWQgYW5kIHZlcmlmaWVkLiBJdCBwZXJtaXRzIHRoZSBpbml0aWFsIGFjdGlvbiwgYXQgbW9zdCBvbmUgbG9jYWwtYWRtaXNzaW9uIGNvcnJlY3Rpb24sIGFuZCBhdCBtb3N0IG9uZSBmcmVzaCBjb3B5LWRlc2sgY29ycmVjdGlvbiBpbiBvbmUgd29ya2JlbmNoIHN0YXRlIGFuZCByZWNlaXB0IGNoYWluOyByZWplY3Rpb24gYWZ0ZXIgYWN0aW9uIHRocmVlIGlzIHRlcm1pbmFsIGFuZCB0aGUgZWRpdG9yIG5ldmVyIHJlcnVucy4gVGhlIGV4YWN0IHJlZ3Jlc3Npb24gYW5kIGZ1bGwgZ2F0ZXMgcGFzczogMTYvMTYgbmV3c3BhcGVyIHRlc3RzLCA0NzAvNDcwIGxpYnJhcnkgdGVzdHMsIDEzLzEzIHN0cmF0ZWdpYy1zbW9rZSBiaW5hcnkgdGVzdHMsIGFuZCBnaXQgZGlmZiAtLWNoZWNrLiBQZW5kaW5nIHZlcmlmaWNhdGlvbiBzdGVlcmluZyBpcyByZXRpcmVkLiBOZXh0IGFjdGlvbiBpcyBjb21taXQvcHVzaCwgdGhlbiBleGFjdC1zb3VyY2UgcnVuNDYgZnJvbSBpbW11dGFibGUgcnVuNDUgcHJlc2VydmVkIElzc3VlczEzLzE0IGF0IHJldmlzaW9uMjcgd2l0aCBubyB3b3JsZCBvciBzdWNjZXNzZnVsLXB1YmxpY2F0aW9uIHJlcGxheS4gT25lIGdvb2QgQ2Fub3B5IExlZGdlciByZW1haW5zIGZpcnN0OyBwdWJsaWNhdGlvbiBQZXJzb25hcyBsYXRlcjsgbGF5b3V0IGFuZCBlbmdyYXZlZCBjdXRzIGFmdGVyIGVkaXRvcmlhbCBhY2NlcHRhbmNlLiIsICJzdGF0dXMiOiAib2siLCAidHMiOiAiMjAyNi0wOC0yOVQwNjoyNToyNiswMDowMCIsICJ0eXBlIjogInZlcmlmaWNhdGlvbiJ9", "stored_at": "2026-08-29T06:25:26.234774+00:00", "type": "ghostlight.evidence_record.v0"} diff --git a/state/map.yaml b/state/map.yaml index 2472ec3..2c37a65 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -326,7 +326,7 @@ data_flow: current_status: summary: Ghostlight's generic consumer boundary admits sparse WorldSeeds, runs the hundreds-class parallel cell machinery used by Dungeon, and projects grounded newspapers from committed public events. Local acceptance proves 1,000 subjects across 200 cells and two-wave durable named-person emergence. Exact-source provider run 38 at `596e50679244b5d42b4cfdf70d723f815751b8ff` resumed the preserved world at revision 8 without replaying compilation or four committed locality elaborations, recovered 51 of 52 strategic-wave cells on pulse three and the final cell on pulse four, then committed all six waves through revision 14. Pushed commit `3a69306f3004e4af2cd57bba612a6ad8d1b8132f` implements the mapped clock-consequence owner and is verified locally: world clocks own declared consequence text and exact observable scope; a bounded agent may propose legacy scope binding, while `WorldKernel` alone admits it and materializes stable threshold-crossing events and public news through the common mutation path. Binding, emitted-event ancestry, mutation receipts, and the next newspaper boundary persist atomically. Exact-source run 39 resumed run 38 without replaying its six committed waves, bound clock consequences, committed six new waves through revision 21, and emitted Issues 7 through 12 plus a final digest. This completes the mechanical provider acceptance path; all inherited wave 1-6 checkpoint hashes match run 38 exactly and live services were unchanged. Independent blind editorial review returns FAIL: only Issue 7 approaches spicy, while Issues 8-12 are dominated by plans, filings, inspections, warnings, and abstract relationship deltas without betrayal, scandal, public reaction, sustained reversal, or material lived cost. The defect belongs upstream in causal follow-through and outcome ownership, not in newsroom spice prompting. Independent grounding review also returns FAIL: Issue 9 inflates a planned expedited agenda into completion, while Issue 8 assigns unsupported feminine pronouns to Sela Venn and Eryn Tal. Other grounding mechanics pass: 208/208 citations resolve, no future events appear, no replay occurred, the player remained unchanged, all 116/116 manifest entries verify, the archive is exact, and root independently confirmed the live service PIDs and invocation IDs remained unchanged. Editorial and grounding acceptance are terminally failed for run 39. Eight titled elaborators use the generic agent harness under deterministic weighted scheduling, bounded parallelism, and Luna/Terra/Sol routing. Workers remain proposal-only; deterministic admission binds exact frozen schedules, dispatch, receipts, conflicts, and semantic verification, and `WorldKernel` alone owns atomic CultCache persistence. Destination reconciliation is a private transactional workbench, provider schema compatibility is lowered once at the shared model-connector boundary, and durable elaboration and strategic-pulse checkpoints bind to their canonical mutation proofs. The generic ModelAgent harness remains consumer-neutral transport. Provider run 23 remains stopped; earlier failed runs and checkpoint archives remain immutable provenance. The live daemons remain outside the acceptance body. Dungeon play remains regression pressure, the Delvehold game-side adapter remains unimplemented, and unpublished Mars and Kalsa destination previews remain unapproved. - provider_acceptance_checkpoint: Exact-source run 44 at `35f56f0e5e670025e1cfb031cba8d5a4ca9587d4` resumed revision 27 without replaying world mechanics or successful publications. Issues 13 and 14 remained preserved. Typed finding references were admitted and the first grounding reconciliation action ran; the deterministic copy desk returned a second exact finding set, but the reconciliation session's one-action limit stopped the agent before it could react. Issues 15 through 18 and the final digest remain absent. Canonical world state and all wave checkpoints remain unchanged. Run 41's remote root is `/var/lib/gamecult/ghostlight-dungeon/acceptance/elven-realms-autonomous-46810c3-41`; runs 38, 39, 40, 42, and 43 remain preserved. Run 39's independent FAIL remains historical acceptance evidence, and overall acceptance is still incomplete. - implementation_checkpoint: Pushed `35f56f0` owns typed grounding finding references and run 44 provider-proved that admission path. The current uncommitted cut permits exactly two total corrective actions in one reconciliation session, preserves the same workbench state and receipt chain, and gives the second action an explicit refreshed `finding_catalog`; it does not rerun the editor or retain a compatibility path. Gates pass 15/15 newspaper tests, 469/469 library tests, 13/13 strategic-smoke binary tests, and `git diff --check`. Plan commit `4916638` separately admits persistent political/editorial publication Personas; that later architecture is not part of this acceptance repair. - next_action: Commit and push the verified two-action reconciliation and refreshed-finding-catalog cut, then resume missing newspaper composition from immutable run 44's preserved Issue 13 and Issue 14 boundary at revision 27 without replaying world mechanics or successful publications. Earn independent editorial and provenance acceptance for one good Canopy Ledger publication before implementing multiple publication Personas; defer TeX/layout and engraved-cut production until editorial acceptance. Require Issues 15 through 18 and the final digest to pass fresh independent review before claiming acceptance. Preserve runs 38/39/40/42/43, the run-41 root and committed world lineage, stopped run 23, exact acceptance conditions, and unchanged live daemons. + provider_acceptance_checkpoint: Exact-source run 45 at `1d898489daeb34fc9f53e6c6bddf00738fc66364` resumed revision 27 without replaying world mechanics or successful publications. Issues 13 and 14 remained preserved. Reconciliation action one was rejected locally before the copy desk; action two was admitted and rechecked, and the deterministic copy desk returned four fresh findings, but the two-action ceiling left no action to answer them. Issues 15 through 18 and the final digest remain absent. Canonical world state and all wave checkpoints remain unchanged. Run 41's remote root is `/var/lib/gamecult/ghostlight-dungeon/acceptance/elven-realms-autonomous-46810c3-41`; runs 38, 39, 40, 42, 43, and 44 remain preserved. Run 39's independent FAIL remains historical acceptance evidence, and overall acceptance is still incomplete. + implementation_checkpoint: Pushed `1d89848` owns two-action reconciliation with a refreshed finding catalog in one workbench state and receipt chain; run 45 provider-proved both local admission correction and fresh copy-desk feedback. The current uncommitted cut implements exactly three total actions: the initial action, at most one local-admission correction, and at most one fresh copy-desk correction. A rejection after the third action is terminal. The same workbench and receipt chain persist throughout, and the editor does not rerun. The exact mixed-path regression and full gates pass: 16/16 newspaper tests, 470/470 library tests, 13/13 strategic-smoke binary tests, and `git diff --check`. Plan commit `4916638` separately admits persistent political/editorial publication Personas; that later architecture is not part of this acceptance repair. + next_action: Commit and push the verified three-action reconciliation cut, then launch exact-source run 46 from immutable run 45's preserved Issue 13 and Issue 14 boundary at revision 27 without replaying world mechanics or successful publications. Earn independent editorial and provenance acceptance for one good Canopy Ledger publication before implementing multiple publication Personas; defer TeX/layout and engraved-cut production until editorial acceptance. Require Issues 15 through 18 and the final digest to pass fresh independent review before claiming acceptance. Preserve runs 38/39/40/42/43/44/45, the run-41 root and committed world lineage, stopped run 23, exact acceptance conditions, and unchanged live daemons. gestalt_population: Gestalt Personas own shared population baselines; persistent member deltas own named individuality; WorldKernel materialization and approval-gated fission preserve lineage and identity. Materialisation/folding changes only representation and the exact member delta, advances resolution epoch, and retires the old cover; it has no Gestalt-wide effect authority. Selected actionable member exceptions are mandatory Projector perspective owners, so aggregation cannot silently erase their decision. Presence projection is limited to nearby active leaves and exact-location dormant members, includes reciprocal player relationship evidence, and may propose an earned cast without committing it. Simulation cells are derived covers only.