Expose exact individuation repair findings
This commit is contained in:
parent
3f7211b9df
commit
fa01658686
7 changed files with 214 additions and 63 deletions
|
|
@ -3828,6 +3828,86 @@ mod tests {
|
|||
));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn complexity_tool_reports_every_individuation_mismatch_for_agent_repair() {
|
||||
let mut campaign = campaign_with_fission_parent();
|
||||
campaign.actors.insert(
|
||||
"actor:orin".into(),
|
||||
crate::domain::ActorState {
|
||||
id: "actor:orin".into(),
|
||||
name: "Orin Weirkeeper".into(),
|
||||
location_id: "room".into(),
|
||||
capabilities: BTreeSet::new(),
|
||||
knowledge: BTreeSet::new(),
|
||||
equipment: BTreeSet::new(),
|
||||
conditions: BTreeSet::new(),
|
||||
obligations: BTreeSet::new(),
|
||||
relationships: BTreeMap::new(),
|
||||
goals: Vec::new(),
|
||||
memories: Vec::new(),
|
||||
},
|
||||
);
|
||||
let mut tool = WorldComplexityTool {
|
||||
campaign: &campaign,
|
||||
parent_gestalt_id: "river-households",
|
||||
operation: WorldComplexityOperation::Individuate,
|
||||
partition_axis: crate::domain::AgencyAxis::Information,
|
||||
workbench: serde_json::json!({"schema":"test.workbench.v1"}),
|
||||
};
|
||||
let context = crate::agent::ModelAgentToolContext {
|
||||
source_receipt_ids: Vec::new(),
|
||||
current_model_receipt: None,
|
||||
};
|
||||
let rejected = crate::agent::ModelAgentTool::invoke(
|
||||
&mut tool,
|
||||
WorldComplexityAction {
|
||||
schema: "ghostlight.world_complexity_action.v1".into(),
|
||||
mutation: WorldComplexityMutationDraft::Individuate {
|
||||
member: crate::domain::GestaltMemberDelta {
|
||||
schema: "ghostlight.gestalt_member_delta.v1".into(),
|
||||
id: "new-weirkeeper".into(),
|
||||
gestalt_id: "river-households".into(),
|
||||
version: 0,
|
||||
name: "Orin Weirkeeper".into(),
|
||||
goals: (0..9).map(|index| format!("goal {index}")).collect(),
|
||||
relationships: BTreeMap::from([(
|
||||
"actor:invented-stranger".into(),
|
||||
"owes a favor".into(),
|
||||
)]),
|
||||
last_location_id: Some("room".into()),
|
||||
capability_additions: BTreeSet::new(),
|
||||
capability_removals: BTreeSet::new(),
|
||||
knowledge_additions: BTreeSet::new(),
|
||||
knowledge_removals: BTreeSet::new(),
|
||||
equipment: BTreeSet::new(),
|
||||
conditions: BTreeSet::new(),
|
||||
obligations: BTreeSet::new(),
|
||||
memories: Vec::new(),
|
||||
materialized_actor_id: None,
|
||||
last_relevant_revision: 0,
|
||||
relevance_lease_until_revision: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
&context,
|
||||
)
|
||||
.await;
|
||||
let crate::agent::ModelAgentToolOutcome::Rejected { finding, .. } = rejected else {
|
||||
panic!("invalid individuation was admitted")
|
||||
};
|
||||
assert!(finding.diagnostic.contains("more than eight goals"));
|
||||
assert!(
|
||||
finding
|
||||
.diagnostic
|
||||
.contains("duplicates an established Actor name")
|
||||
);
|
||||
assert!(
|
||||
finding
|
||||
.diagnostic
|
||||
.contains("unsupported subjects: actor:invented-stranger")
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn complexity_fission_rebases_only_across_unchanged_parent_state() {
|
||||
let frozen = campaign_with_fission_parent();
|
||||
|
|
|
|||
|
|
@ -2213,60 +2213,119 @@ pub fn validate_gestalt_individuation(
|
|||
.agency_profiles
|
||||
.get(&individuation.gestalt_id)
|
||||
.ok_or_else(|| anyhow!("individuation Gestalt has no agency profile"))?;
|
||||
validate_active_gestalt_presence_location(
|
||||
let mut findings = Vec::new();
|
||||
if let Err(error) = validate_active_gestalt_presence_location(
|
||||
campaign,
|
||||
&individuation.gestalt_id,
|
||||
&individuation.location_id,
|
||||
)?;
|
||||
if !campaign.gestalts.contains_key(&individuation.gestalt_id)
|
||||
|| !profile.active_leaf
|
||||
|| !profile.simulation_eligible
|
||||
|| individuation.expected_gestalt_version
|
||||
!= campaign.gestalts[&individuation.gestalt_id].version
|
||||
|| member.schema != "ghostlight.gestalt_member_delta.v1"
|
||||
|| member.gestalt_id != individuation.gestalt_id
|
||||
|| member.version != 0
|
||||
|| member.materialized_actor_id.is_some()
|
||||
|| member.id.trim().is_empty()
|
||||
|| member.id.chars().count() > 80
|
||||
|| member.name.trim().is_empty()
|
||||
|| member.name.chars().count() > 160
|
||||
|| member.goals.len() > 8
|
||||
|| member.memories.len() > 8
|
||||
|| member.obligations.len() > 8
|
||||
|| serde_json::to_vec(member).is_ok_and(|encoded| encoded.len() > 16_384)
|
||||
|| campaign
|
||||
.gestalt_members
|
||||
.contains_key(&crate::domain::canonical_gestalt_member_local_id(
|
||||
&member.id,
|
||||
))
|
||||
|| campaign
|
||||
.actors
|
||||
.contains_key(&crate::domain::gestalt_member_subject_id(&member.id))
|
||||
|| campaign
|
||||
.actors
|
||||
.values()
|
||||
.any(|actor| actor.name.trim().eq_ignore_ascii_case(member.name.trim()))
|
||||
|| campaign.gestalt_members.values().any(|existing| {
|
||||
existing
|
||||
.name
|
||||
.trim()
|
||||
.eq_ignore_ascii_case(member.name.trim())
|
||||
})
|
||||
|| member.relationships.keys().any(|subject_id| {
|
||||
!campaign.actors.contains_key(subject_id)
|
||||
&& !campaign.institutions.contains_key(subject_id)
|
||||
&& !campaign.gestalts.contains_key(subject_id)
|
||||
) {
|
||||
findings.push(error.to_string());
|
||||
}
|
||||
let parent = campaign.gestalts.get(&individuation.gestalt_id);
|
||||
if parent.is_none() {
|
||||
findings.push("parent Gestalt does not exist".to_owned());
|
||||
}
|
||||
if !profile.active_leaf {
|
||||
findings.push("parent Gestalt is not an active leaf".to_owned());
|
||||
}
|
||||
if !profile.simulation_eligible {
|
||||
findings.push("parent Gestalt is not simulation eligible".to_owned());
|
||||
}
|
||||
if parent.is_some_and(|parent| individuation.expected_gestalt_version != parent.version) {
|
||||
findings.push("expected Gestalt version does not match the canonical parent".to_owned());
|
||||
}
|
||||
if member.schema != "ghostlight.gestalt_member_delta.v1" {
|
||||
findings.push("member schema is unsupported".to_owned());
|
||||
}
|
||||
if member.gestalt_id != individuation.gestalt_id {
|
||||
findings.push("member Gestalt id does not match the canonical parent".to_owned());
|
||||
}
|
||||
if member.version != 0 {
|
||||
findings.push("new member version must be zero".to_owned());
|
||||
}
|
||||
if member.materialized_actor_id.is_some() {
|
||||
findings.push("new member cannot claim a materialized Actor id".to_owned());
|
||||
}
|
||||
if member.id.trim().is_empty() {
|
||||
findings.push("member id is empty".to_owned());
|
||||
}
|
||||
if member.id.chars().count() > 80 {
|
||||
findings.push("member id exceeds 80 characters".to_owned());
|
||||
}
|
||||
if member.name.trim().is_empty() {
|
||||
findings.push("member name is empty".to_owned());
|
||||
}
|
||||
if member.name.chars().count() > 160 {
|
||||
findings.push("member name exceeds 160 characters".to_owned());
|
||||
}
|
||||
if member.goals.len() > 8 {
|
||||
findings.push("member has more than eight goals".to_owned());
|
||||
}
|
||||
if member.memories.len() > 8 {
|
||||
findings.push("member has more than eight memories".to_owned());
|
||||
}
|
||||
if member.obligations.len() > 8 {
|
||||
findings.push("member has more than eight obligations".to_owned());
|
||||
}
|
||||
if serde_json::to_vec(member).is_ok_and(|encoded| encoded.len() > 16_384) {
|
||||
findings.push("member delta exceeds 16384 encoded bytes".to_owned());
|
||||
}
|
||||
if campaign
|
||||
.gestalt_members
|
||||
.contains_key(&crate::domain::canonical_gestalt_member_local_id(
|
||||
&member.id,
|
||||
))
|
||||
{
|
||||
findings.push("member id duplicates an established population identity".to_owned());
|
||||
}
|
||||
if campaign
|
||||
.actors
|
||||
.contains_key(&crate::domain::gestalt_member_subject_id(&member.id))
|
||||
{
|
||||
findings.push("member id duplicates an established Actor identity".to_owned());
|
||||
}
|
||||
if campaign
|
||||
.actors
|
||||
.values()
|
||||
.any(|actor| actor.name.trim().eq_ignore_ascii_case(member.name.trim()))
|
||||
{
|
||||
findings.push("member name duplicates an established Actor name".to_owned());
|
||||
}
|
||||
if campaign.gestalt_members.values().any(|existing| {
|
||||
existing
|
||||
.name
|
||||
.trim()
|
||||
.eq_ignore_ascii_case(member.name.trim())
|
||||
}) {
|
||||
findings.push("member name duplicates an established population name".to_owned());
|
||||
}
|
||||
let unsupported_relationships = member
|
||||
.relationships
|
||||
.keys()
|
||||
.filter(|subject_id| {
|
||||
!campaign.actors.contains_key(*subject_id)
|
||||
&& !campaign.institutions.contains_key(*subject_id)
|
||||
&& !campaign.gestalts.contains_key(*subject_id)
|
||||
&& subject_id
|
||||
.strip_prefix("member:")
|
||||
.is_none_or(|member_id| !campaign.gestalt_members.contains_key(member_id))
|
||||
})
|
||||
{
|
||||
return Err(anyhow!(
|
||||
"gestalt individuation exceeds its exact population authority"
|
||||
.cloned()
|
||||
.collect::<Vec<_>>();
|
||||
if !unsupported_relationships.is_empty() {
|
||||
findings.push(format!(
|
||||
"member relationships reference unsupported subjects: {}",
|
||||
unsupported_relationships.join(", ")
|
||||
));
|
||||
}
|
||||
Ok(())
|
||||
if findings.is_empty() {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(anyhow!(
|
||||
"gestalt individuation exceeds its exact population authority: {}",
|
||||
findings.join("; ")
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn validate_strategic_individuation_proposals(
|
||||
|
|
|
|||
|
|
@ -39,17 +39,17 @@ dispatch resume. Tool-internal rejection findings are not yet promoted into
|
|||
later successful compaction, but no executable proposal remains live after a
|
||||
successful round.
|
||||
|
||||
Run 92 at exact source `44c89e3` retained 938 active eligible Gestalts but found
|
||||
no selectable parent. Run 93 at `31125a2` falsified the attempted lineage-scope
|
||||
repair before any model call: those three realm IDs were never profile scope,
|
||||
and adding them would wrongly conflate jurisdiction with occupancy. Canonical
|
||||
topology already owns the answer: Avelune, Veyra, and Bramblewash settlements
|
||||
are contained by their realm-root locations. The current cut leaves profiles
|
||||
unchanged and makes complexity routing walk `Location.container_id` ancestry to
|
||||
exactly one consumer realm target. Review, gate, commit, push, clone immutable
|
||||
Run 93, and begin round 10 without replay. The acceptance launcher retains one
|
||||
35 MiB content-addressed runner per exact source commit and deletes disposable
|
||||
compiler output; do not restore a persistent Cargo target tree.
|
||||
Run 94 at exact source `3f7211b` proved containment-owned routing, completed
|
||||
round 10, and raised actionable subjects from 1,168 to 1,205. Round 11 has 53
|
||||
successful proposals frozen across immutable Runs 94 through 96; only two
|
||||
Hearth individuation dispatches remain failed. Their repeated agent repairs
|
||||
received one generic population-authority diagnostic because the deterministic
|
||||
validator collapsed all mismatch clauses. The current cut keeps that validator
|
||||
as the only authority but reports the complete failed-clause set through the
|
||||
existing tool observation. Gate, commit, push, clone immutable Run 96, and
|
||||
resume only those two dispatches. The acceptance launcher retains one 35 MiB
|
||||
content-addressed runner per exact source commit and deletes disposable compiler
|
||||
output; do not restore a persistent Cargo target tree.
|
||||
|
||||
## Mission and current product shape
|
||||
|
||||
|
|
@ -458,6 +458,12 @@ approved capability.
|
|||
|
||||
## Next action
|
||||
|
||||
Preserve Runs 75 through 96. Push the complete individuation-mismatch feedback
|
||||
cut, then resume Run 96's exact round-11 checkpoint without replaying the 53
|
||||
successful proposals. Continue iterative complexity rounds to 2,400 canonical
|
||||
actionable subjects, followed by ten strategic waves, publications, archive
|
||||
hashes, and unchanged-live-service verification.
|
||||
|
||||
The generic world-consumer boundary is implemented. Session Zero and external
|
||||
producers share one admitted `WorldSeed` transaction; externally authoritative
|
||||
institutions or Gestalts enter through revisioned WorldKernel snapshots; and strategic
|
||||
|
|
@ -1718,9 +1724,10 @@ materializing a `NewsIssue`.
|
|||
bounded round pressure, not a model-call or session count and not an
|
||||
assumption that one mutation yields one subject. Elaborator context now
|
||||
keeps stable identity and mandate in a prefix separate from the bounded
|
||||
dynamic workbench snapshot. Pushed `a017737` gives persistent logical
|
||||
title-by-realm sessions digest-chained agentic compaction; both meaningful
|
||||
Gestalt fission and grounded named-person promotion are available, only
|
||||
dynamic workbench snapshot. Pushed `a017737` gives bounded title-by-realm
|
||||
checkpoint continuity through digest-chained agentic compaction, not a
|
||||
persistent provider thread or complete cognition; both meaningful Gestalt
|
||||
fission and grounded named-person promotion are available, only
|
||||
failed dispatches resume from the exact frozen schedule, WorldKernel alone
|
||||
commits, and canonical complexity is remeasured after each round.
|
||||
|
||||
|
|
|
|||
|
|
@ -1369,7 +1369,10 @@ outside this authority.
|
|||
mailbox. `resolution::validate_gestalt_individuation` is the single local
|
||||
authority for member identity, parent version, exact location, bounds, and
|
||||
relationship targets; strategic action-bound selection and direct kernel
|
||||
admission both reuse it. Direct individuation then follows the ordinary
|
||||
admission both reuse it. It accumulates every failed deterministic clause in
|
||||
one rejection so the generic agent loop can repair the exact bounded draft in
|
||||
its next semantic step; the tool does not add a second judge or relax kernel
|
||||
admission. Direct individuation then follows the ordinary
|
||||
presence path: `apply_individuation` inserts the canonical member delta and
|
||||
promotes it into an Actor, `commit_gestalt_presence` calls
|
||||
`ensure_agency_profiles`, and the new active simulation-eligible actor profile
|
||||
|
|
|
|||
|
|
@ -237,4 +237,5 @@
|
|||
{"note": "Frozen accepted Run 60 copy was typeset as output/pdf/canopy-ledger-run-60-front-page.pdf without newsroom replay or word changes. The one-page 10 x 12.2 inch folio uses embedded Georgia and Times New Roman faces, three columns, warm press stock, and wordless rail/gauge cuts. Region-based PDF extraction resolved all 23 expected source fragments; 144-DPI full-page raster review found no clipping or overlap. PDF SHA-256 6A9D16FD5FA20221FCEEA0B850D2D074D276C18CB283996A49CB4088C0ABCE21; frozen Markdown source remains F98A4684E6EEF43F5EB4BF104248A21DCEA1ECDF1C4E4E14FA405F32C51B8C1C.", "status": "ok", "ts": "2026-08-30T09:58:52+00:00", "type": "verification"}
|
||||
{"note": "Exact pushed bc2ca39 provider Run 61 recomposed Issues 13, 15, 16, 17, and 18 plus a final weekly page over frozen revision-27 facts without world or wave model replay. Issues 13 and 15 selected special_issue; Issues 16-18 and the final selected general_issue with self-contained context. Independent blind review passed distinct recurring journalist voices and issue-shape diversity. Selector caching recorded 12,544 hit tokens; reporter hits remained zero because dynamic cited-dateline enums changed the provider schema. Local v12 removes that cache-key variation while preserving deterministic cited-place admission; 480 library tests and all-target check pass.", "status": "ok", "ts": "2026-08-30T11:41:17+00:00", "type": "acceptance"}
|
||||
{"note": "Run 63 on exact pushed a52d57b completed frozen-fact Issues 17 and 18 with recurring distinct bylines, valid fact-derived datelines, and unchanged live services, then was operator-stopped before final weekly recomposition. Repeated reporter calls still reported zero cache hits: intermittent independent filings can cool between issues, so provider reporter-prefix caching is telemetry rather than a newsroom invariant. Optimize natural append-only agent conversations; do not grow sporadic reporter prompts merely to cross a cache floor.", "status": "ok", "ts": "2026-08-30T12:36:12+00:00", "type": "acceptance"}
|
||||
{"ts": "2026-08-31T22:15:08+00:00", "type": "correction", "status": "ok", "note": "Runs 92 and 93 falsified direct realm-ID profile routing and the attempted lineage-scope repair. Run 92 retained 938 active eligible Gestalts; Run 93 at exact source 31125a2 failed before model calls because no lineage profile had missing realm IDs to restore. Exact campaign topology resolves 930 active Gestalts read-only through Location.container_id ancestry: Avelune 7, Veyra 9, Kharad-Tum 462, Bramblewash 8, Hearthcoil 444, with 8 non-realm and 0 ambiguous. The coherent cut keeps AgencyProfile.location_ids as exact operating places and shares one unique_containing_jurisdiction resolver between scheduler routing and worker admission; focused scheduler and worker regressions plus all-target check pass."}
|
||||
{"note": "Runs 92 and 93 falsified direct realm-ID profile routing and the attempted lineage-scope repair. Run 92 retained 938 active eligible Gestalts; Run 93 at exact source 31125a2 failed before model calls because no lineage profile had missing realm IDs to restore. Exact campaign topology resolves 930 active Gestalts read-only through Location.container_id ancestry: Avelune 7, Veyra 9, Kharad-Tum 462, Bramblewash 8, Hearthcoil 444, with 8 non-realm and 0 ambiguous. The coherent cut keeps AgencyProfile.location_ids as exact operating places and shares one unique_containing_jurisdiction resolver between scheduler routing and worker admission; focused scheduler and worker regressions plus all-target check pass.", "status": "ok", "ts": "2026-08-31T22:15:08+00:00", "type": "correction"}
|
||||
{"ts": "2026-08-31T22:36:52+00:00", "type": "implementation", "status": "ok", "note": "Runs 94-96 proved exact failed-dispatch resume but exposed opaque individuation repair feedback: 53 round-11 proposals remain checkpointed while two Hearth agents repeatedly received only a generic population-authority rejection. resolution::validate_gestalt_individuation remains the single authority and now returns the complete failed-clause set through the existing tool observation; focused regression, 499 library tests, 18 strategic-smoke tests, and all-target check pass."}
|
||||
|
|
|
|||
|
|
@ -239,3 +239,4 @@
|
|||
{"key": "2026-08-30T114117Z0000-0237-0179623bd294", "payload": "eyJub3RlIjogIkV4YWN0IHB1c2hlZCBiYzJjYTM5IHByb3ZpZGVyIFJ1biA2MSByZWNvbXBvc2VkIElzc3VlcyAxMywgMTUsIDE2LCAxNywgYW5kIDE4IHBsdXMgYSBmaW5hbCB3ZWVrbHkgcGFnZSBvdmVyIGZyb3plbiByZXZpc2lvbi0yNyBmYWN0cyB3aXRob3V0IHdvcmxkIG9yIHdhdmUgbW9kZWwgcmVwbGF5LiBJc3N1ZXMgMTMgYW5kIDE1IHNlbGVjdGVkIHNwZWNpYWxfaXNzdWU7IElzc3VlcyAxNi0xOCBhbmQgdGhlIGZpbmFsIHNlbGVjdGVkIGdlbmVyYWxfaXNzdWUgd2l0aCBzZWxmLWNvbnRhaW5lZCBjb250ZXh0LiBJbmRlcGVuZGVudCBibGluZCByZXZpZXcgcGFzc2VkIGRpc3RpbmN0IHJlY3VycmluZyBqb3VybmFsaXN0IHZvaWNlcyBhbmQgaXNzdWUtc2hhcGUgZGl2ZXJzaXR5LiBTZWxlY3RvciBjYWNoaW5nIHJlY29yZGVkIDEyLDU0NCBoaXQgdG9rZW5zOyByZXBvcnRlciBoaXRzIHJlbWFpbmVkIHplcm8gYmVjYXVzZSBkeW5hbWljIGNpdGVkLWRhdGVsaW5lIGVudW1zIGNoYW5nZWQgdGhlIHByb3ZpZGVyIHNjaGVtYS4gTG9jYWwgdjEyIHJlbW92ZXMgdGhhdCBjYWNoZS1rZXkgdmFyaWF0aW9uIHdoaWxlIHByZXNlcnZpbmcgZGV0ZXJtaW5pc3RpYyBjaXRlZC1wbGFjZSBhZG1pc3Npb247IDQ4MCBsaWJyYXJ5IHRlc3RzIGFuZCBhbGwtdGFyZ2V0IGNoZWNrIHBhc3MuIiwgInN0YXR1cyI6ICJvayIsICJ0cyI6ICIyMDI2LTA4LTMwVDExOjQxOjE3KzAwOjAwIiwgInR5cGUiOiAiYWNjZXB0YW5jZSJ9", "stored_at": "2026-08-30T11:41:17.356947+00:00", "type": "ghostlight.evidence_record.v0"}
|
||||
{"key": "2026-08-30T123612Z0000-0238-31251d8e58a1", "payload": "eyJub3RlIjogIlJ1biA2MyBvbiBleGFjdCBwdXNoZWQgYTUyZDU3YiBjb21wbGV0ZWQgZnJvemVuLWZhY3QgSXNzdWVzIDE3IGFuZCAxOCB3aXRoIHJlY3VycmluZyBkaXN0aW5jdCBieWxpbmVzLCB2YWxpZCBmYWN0LWRlcml2ZWQgZGF0ZWxpbmVzLCBhbmQgdW5jaGFuZ2VkIGxpdmUgc2VydmljZXMsIHRoZW4gd2FzIG9wZXJhdG9yLXN0b3BwZWQgYmVmb3JlIGZpbmFsIHdlZWtseSByZWNvbXBvc2l0aW9uLiBSZXBlYXRlZCByZXBvcnRlciBjYWxscyBzdGlsbCByZXBvcnRlZCB6ZXJvIGNhY2hlIGhpdHM6IGludGVybWl0dGVudCBpbmRlcGVuZGVudCBmaWxpbmdzIGNhbiBjb29sIGJldHdlZW4gaXNzdWVzLCBzbyBwcm92aWRlciByZXBvcnRlci1wcmVmaXggY2FjaGluZyBpcyB0ZWxlbWV0cnkgcmF0aGVyIHRoYW4gYSBuZXdzcm9vbSBpbnZhcmlhbnQuIE9wdGltaXplIG5hdHVyYWwgYXBwZW5kLW9ubHkgYWdlbnQgY29udmVyc2F0aW9uczsgZG8gbm90IGdyb3cgc3BvcmFkaWMgcmVwb3J0ZXIgcHJvbXB0cyBtZXJlbHkgdG8gY3Jvc3MgYSBjYWNoZSBmbG9vci4iLCAic3RhdHVzIjogIm9rIiwgInRzIjogIjIwMjYtMDgtMzBUMTI6MzY6MTIrMDA6MDAiLCAidHlwZSI6ICJhY2NlcHRhbmNlIn0=", "stored_at": "2026-08-30T12:36:12.420054+00:00", "type": "ghostlight.evidence_record.v0"}
|
||||
{"key": "2026-08-31T221508Z0000-0239-a09fc305e5a6", "payload": "eyJub3RlIjogIlJ1bnMgOTIgYW5kIDkzIGZhbHNpZmllZCBkaXJlY3QgcmVhbG0tSUQgcHJvZmlsZSByb3V0aW5nIGFuZCB0aGUgYXR0ZW1wdGVkIGxpbmVhZ2Utc2NvcGUgcmVwYWlyLiBSdW4gOTIgcmV0YWluZWQgOTM4IGFjdGl2ZSBlbGlnaWJsZSBHZXN0YWx0czsgUnVuIDkzIGF0IGV4YWN0IHNvdXJjZSAzMTEyNWEyIGZhaWxlZCBiZWZvcmUgbW9kZWwgY2FsbHMgYmVjYXVzZSBubyBsaW5lYWdlIHByb2ZpbGUgaGFkIG1pc3NpbmcgcmVhbG0gSURzIHRvIHJlc3RvcmUuIEV4YWN0IGNhbXBhaWduIHRvcG9sb2d5IHJlc29sdmVzIDkzMCBhY3RpdmUgR2VzdGFsdHMgcmVhZC1vbmx5IHRocm91Z2ggTG9jYXRpb24uY29udGFpbmVyX2lkIGFuY2VzdHJ5OiBBdmVsdW5lIDcsIFZleXJhIDksIEtoYXJhZC1UdW0gNDYyLCBCcmFtYmxld2FzaCA4LCBIZWFydGhjb2lsIDQ0NCwgd2l0aCA4IG5vbi1yZWFsbSBhbmQgMCBhbWJpZ3VvdXMuIFRoZSBjb2hlcmVudCBjdXQga2VlcHMgQWdlbmN5UHJvZmlsZS5sb2NhdGlvbl9pZHMgYXMgZXhhY3Qgb3BlcmF0aW5nIHBsYWNlcyBhbmQgc2hhcmVzIG9uZSB1bmlxdWVfY29udGFpbmluZ19qdXJpc2RpY3Rpb24gcmVzb2x2ZXIgYmV0d2VlbiBzY2hlZHVsZXIgcm91dGluZyBhbmQgd29ya2VyIGFkbWlzc2lvbjsgZm9jdXNlZCBzY2hlZHVsZXIgYW5kIHdvcmtlciByZWdyZXNzaW9ucyBwbHVzIGFsbC10YXJnZXQgY2hlY2sgcGFzcy4iLCAic3RhdHVzIjogIm9rIiwgInRzIjogIjIwMjYtMDgtMzFUMjI6MTU6MDgrMDA6MDAiLCAidHlwZSI6ICJjb3JyZWN0aW9uIn0=", "stored_at": "2026-08-31T22:15:08.840913+00:00", "type": "ghostlight.evidence_record.v0"}
|
||||
{"key": "2026-08-31T223652Z0000-0240-b6c12f73f021", "payload": "eyJub3RlIjogIlJ1bnMgOTQtOTYgcHJvdmVkIGV4YWN0IGZhaWxlZC1kaXNwYXRjaCByZXN1bWUgYnV0IGV4cG9zZWQgb3BhcXVlIGluZGl2aWR1YXRpb24gcmVwYWlyIGZlZWRiYWNrOiA1MyByb3VuZC0xMSBwcm9wb3NhbHMgcmVtYWluIGNoZWNrcG9pbnRlZCB3aGlsZSB0d28gSGVhcnRoIGFnZW50cyByZXBlYXRlZGx5IHJlY2VpdmVkIG9ubHkgYSBnZW5lcmljIHBvcHVsYXRpb24tYXV0aG9yaXR5IHJlamVjdGlvbi4gcmVzb2x1dGlvbjo6dmFsaWRhdGVfZ2VzdGFsdF9pbmRpdmlkdWF0aW9uIHJlbWFpbnMgdGhlIHNpbmdsZSBhdXRob3JpdHkgYW5kIG5vdyByZXR1cm5zIHRoZSBjb21wbGV0ZSBmYWlsZWQtY2xhdXNlIHNldCB0aHJvdWdoIHRoZSBleGlzdGluZyB0b29sIG9ic2VydmF0aW9uOyBmb2N1c2VkIHJlZ3Jlc3Npb24sIDQ5OSBsaWJyYXJ5IHRlc3RzLCAxOCBzdHJhdGVnaWMtc21va2UgdGVzdHMsIGFuZCBhbGwtdGFyZ2V0IGNoZWNrIHBhc3MuIiwgInN0YXR1cyI6ICJvayIsICJ0cyI6ICIyMDI2LTA4LTMxVDIyOjM2OjUyKzAwOjAwIiwgInR5cGUiOiAiaW1wbGVtZW50YXRpb24ifQ==", "stored_at": "2026-08-31T22:36:52.648112+00:00", "type": "ghostlight.evidence_record.v0"}
|
||||
|
|
|
|||
|
|
@ -329,8 +329,8 @@ current_status:
|
|||
provider_acceptance_checkpoint: Exact pushed commit `139b8a6` completed Run 60 under `character-newsroom.v10` without world or per-wave replay. Its acceptance witness and terminal status bind the completed page and exact resume lineage. The independently dispatched blind reviewer, shown only the reader-facing fantasy newspaper, read it as a real left-populist civic broadsheet and did not immediately identify procedural generation, so the narrative reverse-Turing criterion passes. The review's substantive criticism is that the three stories feel like three rewrites of one briefing; accepted Run 60 remains immutable. The run used 96,902 prompt tokens and reported zero cache hits. Its delivered typeset artifact is `output/pdf/canopy-ledger-run-60-front-page.pdf`; frozen-source and visual verification remain accepted. Exact pushed `bc2ca39` then produced frozen-fact newsroom-only Run 61 Issues 13, 15, 16, 17, and 18 without world or wave model replay. Provider output proves `special_issue` convergence in Issues 13 and 15, independent `general_issue` beats in Issues 16 through 18, and assignment-selector cache hits. Blind review of Issues 13, 15, 16, and 17 passes both distinct recurring voices and issue-shape diversity, recognizing Ossan, Mera, Corin, and Lysa's biases plus modest cross-issue evolution. Run 62 exercised v12 without world or wave replay and failed only because two lead articles proposed invalid datelines; recurring reporter calls still recorded zero cache hits. Run 63 used exact pushed v13 `a52d57b`; Issues 17 and 18 completed before root stopped the final weekly recomposition, both repeated bylines again recorded zero cache hits, and live services remained unchanged. Preserve Runs 61 through 63 as stopped or completed immutable evidence. Copy defects remain later deadline-correction work rather than a reason to reopen accepted issue artifacts.
|
||||
implementation_checkpoint: Exact pushed v13 `a52d57b` keeps one stable reporter action schema, places a common stable house charter before recurring identity and dynamic assignment, and projects deterministic `allowed_datelines` from cited records while retaining copy-desk factual authority and deterministic cited-place admission; 480 library tests and the all-target check pass. Run 63 falsifies reporter-cache pursuit as a useful acceptance target for sporadic independent filings. The proposed v14 cache-floor prompt growth was removed. Append-only agent contexts remain the natural cache beneficiary; accepted Run 60 remains immutable. The strategic cut extracts one shared `validate_strategic_individuation_proposals` owner used by resolution validation and by the scheduler before it returns an optional proposal. An invalid optional identity emits a semantic-invalid receipt and produces no individuation instead of aborting the recoverable wave. Focused valid and invalid regressions pass, and exact-source Run 68 exercises the corrected provider path through twelve committed waves; no further validator implementation is pending. The newsroom-only cut adds a navigation-only directory of completed public changes grouped by period and exact source timestamps to new v14 audit citations. The directory derives context from canonical records and gains no fact or world authority. Legacy empty source times are omitted from both rendering and serialization, preserving inherited v13 receipt bytes and digests; new v14 nonempty source times remain rendered and serialized. Exact-source Run 73 proves that compatibility path and final recomposition mechanically. Current source gives the assignment editor bounded full-ledger queries and explicitly asks it to search sideways for opposition and countermoves; Run 73 falsifies the stronger assumption that this access and instruction alone guarantee balanced selection. Exact pushed v15 source `b6787d909bd79b68ed3a4d143b7f6dd438e00fa2` binds accountability, opposition, and counter-narrative pitches to two distinct named parties and selected citations through a typed conflict axis, and preserves canonical ledger order. Run 74 falsifies the stronger v15 assumption: its lone accountability pitch used the same transfer citation for cultivators and a passive Tribunal, while four of five pitches avoided the adversarial axis through lead or consequence functions. Two cited names did not prove two moves. Exact pushed v16 `86fe6ed89d51da26b65ab6a031608075840b1527` binds each adversarial axis to two distinct cited public moves or positions and rejects one record presented as both sides; it adds no event writer, judge, process, dependency, or persistent authority. Formatting, 27 focused newspaper tests, 484 full library tests, and 16 strategic-smoke tests pass.
|
||||
full_world_acceptance_checkpoint: Run 68 at exact source `69c811a2669fc38f19f9199bf57088dc250bfc3e` is mechanically complete at world revision 27 with 12/12 strategic waves, 240 events, 514 public news rows, and a final newspaper. Independent editorial and grounding reviews both fail. Earlier per-wave papers prove the immutable record already contains dramatic completed facts, including an organ breaching the rail capital, a dead pump, and families crossing borders; the final paper failed to make that committed change legible. Preserve Run 68 unchanged. Run 69 at source `84b31e57a462710eb939c4559e0437eb5d6a7a28` failed before any model call when immutable recomposition verification encountered an empty rendered `Source time:` line in inherited v13 per-wave issues. Run 70 at source `ec45952b843e102dc2ebddda3a3bbb4058687175` also failed before any model call because v14 serialization changed the legacy recomposition digest. Exact-source Run 73 `b827d897b9579c2091a67c363d35b8695288ba2f` is terminal complete at `/var/lib/gamecult/ghostlight-dungeon/acceptance/full-world-delvehold-b827d89-73`: world revision 27, 12/12 waves, 240 events, 514 news rows, inherited artifacts byte-identical to Run 68, manifest valid, and archive SHA-256 `090d05f304c8f3d33c9dccd728bffbf3e5dc2969a7aeeffc2f9d7bafe701ac8a`. Exact-source Run 74 `b6787d909bd79b68ed3a4d143b7f6dd438e00fa2` is mechanically complete at `/var/lib/gamecult/ghostlight-dungeon/acceptance/full-world-delvehold-b6787d9-74`: revision 27, 12/12 waves, 240 events, 514 news rows, Run 68 inherited artifacts byte-identical, manifest valid, unchanged live services, and archive SHA-256 `957b11a5d584d27d23bf4d50ed1fbc8d067faf67953b03f80705bfb9587c496d`. Independent editorial review fails: the page has a coherent throughline and sharp prose but no sustained adversarial narrative; opposing decision-makers, motives, responses, and countermoves are largely absent, scandal and public reaction are missing, lived costs remain abstract, and the result reads as polished minutes with conclusions. Its post-press correction notice has two items: `The corridor had begun closing hours earlier` overstates a source that says the prolonged oath-route closure was diverting arrivals six hours before the breach; `no relief or assignment of liability has followed` must narrow to `no tribunal remedy is recorded yet`. Run 75 launched at exact source `86fe6ed89d51da26b65ab6a031608075840b1527` under the superseded 240-cell-only acceptance shape and was stopped cleanly at the operator's scale correction. Preserve `/var/lib/gamecult/ghostlight-dungeon/acceptance/full-world-delvehold-86fe6ed-75` as stopped non-acceptance evidence: preflight, world-region and titled-elaboration checkpoints, a wave-one cell terminal checkpoint, partial pulses 01/02, and two rejected pulse receipts exist. `ghostlight-full-world-run75.service` invocation `86bfe6a3ef504a7d99f579b3d67710ab` is inactive/dead after explicit stop; live services remain unchanged. Do not claim terminal success or failure. Preserve Runs 64 through 75. Mechanical completion of the earlier world is proven, but final newspaper acceptance under the corrected scale target is not.
|
||||
scale_checkpoint: The active 240-cell entitlement is an attention budget, not the world-size claim. The approximately 2,400 potentially acting entities are a target for causally meaningful latent complexity, not a raw population or roster count. Multiresolution Gestalts compress the unresolved population; repeated admitted elaboration must fission them and promote individuals and institutions whose agency, relationships, resources, pressures, or authority can actually participate in consequences, then remeasure the deficit. `WorldScaleIntent` and deterministic `WorldElaborationDemand` derive the 2,400-subject target, deficit, weighted per-realm shares, and bounded mutation budget. Logical title-by-realm sessions compact admitted journals after successful rounds; frozen failure checkpoints retain exact schedules, proposals, failed dispatches, diagnostics, and receipts for resume. Tool-internal rejection findings are not yet carried into later successful compaction, but no executable proposal is orphaned. WorldKernel alone commits and canonical complexity is remeasured after every round. Run 92 retained 938 active eligible Gestalts but no routable parent. Run 93 at exact source `31125a2` falsified the attempted lineage-scope repair before any model call: the three missing realm IDs were never profile scope, and adding them would conflate jurisdiction with occupancy. Exact inspection proves canonical containment resolves 930 active Gestalts across Avelune 7, Veyra 9, Kharad-Tum 462, Bramblewash 8, and Hearthcoil 444, with 8 non-realm subjects and no ambiguity. The shared elaboration owner now derives exactly one consumer jurisdiction by walking `Location.container_id` ancestry from exact profile locations; both scheduler routing and worker admission use that read-only resolver. It never mutates `AgencyProfile.location_ids`, guesses a realm, or creates geography. Exact resource/member assignment, civic fission rebinding, evolved-checkpoint proof, bounded lineage lookup, parallel session compaction, deterministic child-ID reconciliation, and materialized-member affiliation transfer remain preserved. Resolution owns derived cover membership. Nemesis receives an existing cover and assigns bounded causal decision windows among eligible responders; it does not allocate that cover.
|
||||
scale_checkpoint: The active 240-cell entitlement is an attention budget, not the world-size claim. The approximately 2,400 potentially acting entities are a target for causally meaningful latent complexity, not a raw population or roster count. Multiresolution Gestalts compress the unresolved population; repeated admitted elaboration must fission them and promote individuals and institutions whose agency, relationships, resources, pressures, or authority can actually participate in consequences, then remeasure the deficit. `WorldScaleIntent` and deterministic `WorldElaborationDemand` derive the 2,400-subject target, deficit, weighted per-realm shares, and bounded mutation budget. Logical title-by-realm continuity is a bounded digest-chained checkpoint after successful rounds, not a provider thread or complete cognition; frozen failure checkpoints retain exact schedules, proposals, failed dispatches, diagnostics, and receipts for resume. WorldKernel alone commits and canonical complexity is remeasured after every round. Run 94 at exact source `3f7211b` proved canonical containment routing by completing round 10 and raising actionable subjects from 1,168 to 1,205. Round 11 retained 53 successful proposals but two Hearth individuations repeatedly failed because the exact validator collapsed every mismatch into one opaque diagnostic. The current cut preserves that single validator authority while returning its complete mismatch set through the existing agent tool observation, so repair can target the actual rejected fields without replaying admitted proposals. Exact resource/member assignment, civic fission rebinding, evolved-checkpoint proof, bounded lineage lookup, parallel session compaction, deterministic child-ID reconciliation, and materialized-member affiliation transfer remain preserved. Resolution owns derived cover membership. Nemesis receives an existing cover and assigns bounded causal decision windows among eligible responders; it does not allocate that cover.
|
||||
presentation_checkpoint: The historical press-layout and seed-ownership split are complete. `notes/historical-newspaper-layout-grammar.md` remains the durable grammar. Manifest v2 at `output/tex/canopy-ledger-run-61-style-1847-flow-723.manifest.toml` independently binds `style_seed=1847`, `flow_seed=723`, frozen source SHA-256 `8f195140f52a40ba705d6a66987146a1500ae89668e5d82b01d1792eb3afb882`, and the final artifact `output/pdf/canopy-ledger-run-61-style-1847-flow-723.pdf`, SHA-256 `a457f4b1702a7a52480e42fce0039f0dbe677ff32958e98f1c412b346237190c`. An identical seed pair produces byte-identical TeX and PDF; changing only flow preserves the exact style section while materially changing a plausible layout, and changing only style preserves flow topology. Cut-first and cut-midstory templates pass visual inspection; the failed split-card template is deleted. Frozen copy/assets, actual PDF `/BM /Multiply`, and economic-layer advertising authority remain invariant.
|
||||
public_reference_checkpoint: Public architecture reference is complete. Canonical Ghostlight commit `15ea0f0` owns five pages under `docs/public-architecture` covering overview, authority, pipelines, 43 named production stages, and eight titled elaborators. Site commit `ea0b026` publishes exact projections under `F:\Projects\GhostlightDungeon-site\content\Documentation`, adds the sync/check script, explorer and table-of-contents navigation, scoped documentation layout, and homepage Architecture link. Local Quartz build and visual browser QA pass. GitHub Pages workflow `33408004480` succeeded. `https://ghostlight.gamecult.org/Documentation/` and the extensionless `Documentation/Agents-and-model-stages` route are live; the stage page exposes seven tables and 51 rows. Ghostlight remains technical authority; the site repository owns public composition and deployment.
|
||||
next_action: Preserve Runs 75 through 93. Run 92 retained 938 active eligible Gestalts but no routable parent; Run 93 at exact source `31125a2` falsified inherited profile scope before any model call because canonical fission lineage had no realm IDs to restore. Exact topology proves the missing routing: local Avelune, Veyra, and Bramblewash locations are contained by their realm roots. Review, gate, commit, and push the read-only scheduler cut that derives exactly one realm by walking canonical `Location.container_id` ancestry from each profile location without mutating `AgencyProfile.location_ids`; ambiguous or absent realm ancestry remains ineligible. Clone immutable Run 93 and resume complexity round 10 without replaying rounds 1 through 9. Logical title-by-realm sessions remain bounded by agentic compaction and frozen failure checkpoints own executable failed-dispatch resume. Continue until canonical remeasurement reaches 2,400 meaningful actionable subjects, then require ten strategic waves, publications, archive hashes, and unchanged live-service identities. Preserve Resolution cover ownership, Nemesis's bounded causal-window role, the completed public reference, the two-seed press checkpoint, and the economic-layer advertising boundary.
|
||||
next_action: Preserve Runs 75 through 96. Gate, commit, and push the complete deterministic individuation-mismatch feedback cut, then clone immutable Run 96 and resume only its two failed round-11 Hearth dispatches from the exact checkpoint. Do not replay rounds 1 through 10 or the 53 successful round-11 proposals. Continue checkpoint-preserving complexity rounds until canonical remeasurement reaches 2,400 meaningful actionable subjects, then require ten strategic waves, publications, archive hashes, and unchanged live-service identities. Logical title-by-realm continuity remains bounded by agentic compaction; it is not a persistent provider thread. Preserve Resolution cover ownership, Nemesis's bounded causal-window role, the completed public reference, the two-seed press checkpoint, and the economic-layer advertising boundary.
|
||||
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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue