diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 199231a..d0c8686 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -21,4 +21,5 @@ {"note": "Library and consumer boundary, merged from two records, 2026-09-15. Ghostlight Dungeon is a consumer of the Ghostlight library, which serves all GameCult narrative simulation. Session Zero, Vault choice, players, sliders, and starting locations are Dungeon authority and never shape the library. Operator decisions: (1) extract the world kernel into a library crate before any library pass (executed as L0; see the L0 record). (2) The eight titles ship as the library's stock lens set. (3) Each world will carry a typed detail rule (plan step 15 L3, not landed), a function from place to detail level that the library evaluates; consumers choose the rule (Dungeon ByDistance anchored on important subjects, the player first; Delvehold Uniform). It must be typed data, not consumer code, because the deficit it produces is an admission input and journal replay re-runs reduce. WorldScaleIntent per-kind targets remain the ceiling the rule distributes. Lesson: name the owner, library or consumer, before designing a feature; a player-facing flow placed on the kernel quietly makes one consumer's policy library vocabulary.", "status": "accepted", "ts": "2026-09-15T20:55:07+00:00", "type": "architecture"} {"note": "L0 closed, 2026-09-16 (Ghostlight 108b691..ab95d78, gamecult-ops 6aba281..803f2c7; postmortem docs/architecture/ghostlight-library-extraction-postmortem.md). The world kernel is the ghostlight library crate and ghostlight-dungeon consumes it. Belief-changing findings: (1) private constructors do not seal a public type that derives Deserialize, and Dungeon's Eve payloads need those derives, so ruling Q1-9 defines sealing as unforgeable admission: external code may hold a syntactically valid ID, digest or opportunity, and the kernel rejects every one it did not issue, proven by crates/ghostlight/tests/external_admission.rs. (2) compile_fail doc-tests pin names and, on stable rustc, not even error codes; they prove 'does not compile', not privacy. (3) Rejection tests need forgeries shaped like real values: short fake digests passed against kernels comparing only length, a prefix, all but the last character, case-insensitively, or only the hex after the label. (4) Every text scanner written in L0 lost to a short evasion (the minter count, the gamecult-ops wiring test and its fix); treat such checks as tripwires with stated limits, and use a semantic tool for semantic properties. The minter scanner stays as a tripwire (Q1-10 defaulted); Clippy disallowed-methods is the recorded fix.", "status": "accepted", "ts": "2026-09-16T00:27:09+00:00", "type": "architecture"} {"note": "L1 closed, 2026-09-16 (Ghostlight 835ea4d..872ba35 plus Cut 5 docs; postmortem docs/architecture/ghostlight-stock-lenses-postmortem.md). The ghostlight library ships eight stock lenses; lens weights are world data (consumer.v5), required at creation with no library default, replaced by the owner's SetLensWeights in any phase; a set that draws the same as the current one is refused as NoCanonicalChange. Each elaborator session draws its lens replayably from world id and command id and records the lens and its instruction text on the session (controller_work.v16); the lens never enters the command id, which stays the idempotency key. Belief-changing findings: (1) before L1 the elaborator repair loop never worked across sweeps: a deficit session's key moved on any commit (orphan plus repeated inference) and a boundary session was Superseded forever after any commit; resume now reads in-flight rows from the store by what they answer (L1-Q9), and rows ready to submit are excluded because adopting a committed row stalls the deficit (L1-Q10). (2) Concurrent sessions are distinct through a per-sweep in-memory claim set; elaboration has its own permit ceiling separate from the simulation budget. (3) A panicking session task used to kill the runtime elaboration driver silently; it is now an error returned after siblings finish. (4) Agents told to wait for long jobs still ended their turns mid-build until briefs named the mechanism: block inside a tool call. Open for the operator: L1.f1 quarantine handling, L1.f13 seed-lane orphans, L1.f14 row retirement, L1.f16 consumer lens sets.", "status": "accepted", "ts": "2026-09-16T18:08:25+00:00", "type": "architecture"} -{"ts": "2026-09-21T22:53:11+00:00", "type": "architecture", "status": "accepted", "note": "Playtest gate redirected, 2026-09-22 (operator; target docs/architecture/ghostlight-play-agent.md, plan step 16). (1) The controller machinery (cover, grouped cells, action catalogs, Interpreter pass, owner-click dispatch) suits offline generation and simulation, not interactive role-play; on Dungeon's play path one operational play agent replaces it and the library keeps it. (2) Projector -> Persona is unchanged and a Persona never sees structured state; the player's view is rendered by the same Projector. Rejected: Personas reading their own state, the structured-state dump the projector/interpreter sandwich prevents. (3) The agent holds a named kernel authority (declare in Active without answering elaboration demand, whole-world reach, advance time); an actor's act commits only through that actor's affordance; raw ops are the agent's rulings; the agent is Dungeon's detail demand. (4) L2-L4, Session Zero D1-D3, L1.f16/f1/f13/f14 deferred by ruling, not dropped. (5) Source check: inference routes per lane by model name to the SDK sidecar (prefix claude) or CodexConnector, no runtime fallback, no local-model transport; the sidecar is a private msgpack child-process pipe behind InferencePort, not the CultNet connector API."} +{"note": "Playtest gate redirected, 2026-09-22 (operator; target docs/architecture/ghostlight-play-agent.md, plan step 16). (1) The controller machinery (cover, grouped cells, action catalogs, Interpreter pass, owner-click dispatch) suits offline generation and simulation, not interactive role-play; on Dungeon's play path one operational play agent replaces it and the library keeps it. (2) Projector -> Persona is unchanged and a Persona never sees structured state; the player's view is rendered by the same Projector. Rejected: Personas reading their own state, the structured-state dump the projector/interpreter sandwich prevents. (3) The agent holds a named kernel authority (declare in Active without answering elaboration demand, whole-world reach, advance time); an actor's act commits only through that actor's affordance; raw ops are the agent's rulings; the agent is Dungeon's detail demand. (4) L2-L4, Session Zero D1-D3, L1.f16/f1/f13/f14 deferred by ruling, not dropped. (5) Source check: inference routes per lane by model name to the SDK sidecar (prefix claude) or CodexConnector, no runtime fallback, no local-model transport; the sidecar is a private msgpack child-process pipe behind InferencePort, not the CultNet connector API.", "status": "accepted", "ts": "2026-09-21T22:53:11+00:00", "type": "architecture"} +{"ts": "2026-09-23T09:54:03+00:00", "type": "implementation", "status": "ok", "note": "Play agent pass closed 2026-09-23: 17 cuts, ~10 fix batches, 195 findings, Soul verdict \"bar met\". Ghostlight Dungeon now runs on one operational agent through world.play; world.speak and the story card are deleted. Postmortem: docs/architecture/ghostlight-play-agent-postmortem.md. About 150 of 195 findings were introduced by the pass own earlier steps, not inherited. One defect shape recurred five times: a true statement about a narrow mechanism standing in for a false one about the whole path (a committed file exists therefore the client works; git exited zero therefore this is a checkout; cargo printed ok therefore the fixture is live). The Eve client round trip had never been exercised before this pass and no client could ever have created a world. Unproven: seeding past its config check, and any model behind the local inference port. Not built and gating a wider share: fiction-first risk resolution and gestalt agency."} diff --git a/state/ghostlight-state.cultcache.jsonl b/state/ghostlight-state.cultcache.jsonl index 0bb23c3..dc7adc4 100644 --- a/state/ghostlight-state.cultcache.jsonl +++ b/state/ghostlight-state.cultcache.jsonl @@ -23,3 +23,4 @@ {"key": "2026-09-16T002709Z0000-0021-b03ab600d273", "payload": "eyJub3RlIjogIkwwIGNsb3NlZCwgMjAyNi0wOS0xNiAoR2hvc3RsaWdodCAxMDhiNjkxLi5hYjk1ZDc4LCBnYW1lY3VsdC1vcHMgNmFiYTI4MS4uODAzZjJjNzsgcG9zdG1vcnRlbSBkb2NzL2FyY2hpdGVjdHVyZS9naG9zdGxpZ2h0LWxpYnJhcnktZXh0cmFjdGlvbi1wb3N0bW9ydGVtLm1kKS4gVGhlIHdvcmxkIGtlcm5lbCBpcyB0aGUgZ2hvc3RsaWdodCBsaWJyYXJ5IGNyYXRlIGFuZCBnaG9zdGxpZ2h0LWR1bmdlb24gY29uc3VtZXMgaXQuIEJlbGllZi1jaGFuZ2luZyBmaW5kaW5nczogKDEpIHByaXZhdGUgY29uc3RydWN0b3JzIGRvIG5vdCBzZWFsIGEgcHVibGljIHR5cGUgdGhhdCBkZXJpdmVzIERlc2VyaWFsaXplLCBhbmQgRHVuZ2VvbidzIEV2ZSBwYXlsb2FkcyBuZWVkIHRob3NlIGRlcml2ZXMsIHNvIHJ1bGluZyBRMS05IGRlZmluZXMgc2VhbGluZyBhcyB1bmZvcmdlYWJsZSBhZG1pc3Npb246IGV4dGVybmFsIGNvZGUgbWF5IGhvbGQgYSBzeW50YWN0aWNhbGx5IHZhbGlkIElELCBkaWdlc3Qgb3Igb3Bwb3J0dW5pdHksIGFuZCB0aGUga2VybmVsIHJlamVjdHMgZXZlcnkgb25lIGl0IGRpZCBub3QgaXNzdWUsIHByb3ZlbiBieSBjcmF0ZXMvZ2hvc3RsaWdodC90ZXN0cy9leHRlcm5hbF9hZG1pc3Npb24ucnMuICgyKSBjb21waWxlX2ZhaWwgZG9jLXRlc3RzIHBpbiBuYW1lcyBhbmQsIG9uIHN0YWJsZSBydXN0Yywgbm90IGV2ZW4gZXJyb3IgY29kZXM7IHRoZXkgcHJvdmUgJ2RvZXMgbm90IGNvbXBpbGUnLCBub3QgcHJpdmFjeS4gKDMpIFJlamVjdGlvbiB0ZXN0cyBuZWVkIGZvcmdlcmllcyBzaGFwZWQgbGlrZSByZWFsIHZhbHVlczogc2hvcnQgZmFrZSBkaWdlc3RzIHBhc3NlZCBhZ2FpbnN0IGtlcm5lbHMgY29tcGFyaW5nIG9ubHkgbGVuZ3RoLCBhIHByZWZpeCwgYWxsIGJ1dCB0aGUgbGFzdCBjaGFyYWN0ZXIsIGNhc2UtaW5zZW5zaXRpdmVseSwgb3Igb25seSB0aGUgaGV4IGFmdGVyIHRoZSBsYWJlbC4gKDQpIEV2ZXJ5IHRleHQgc2Nhbm5lciB3cml0dGVuIGluIEwwIGxvc3QgdG8gYSBzaG9ydCBldmFzaW9uICh0aGUgbWludGVyIGNvdW50LCB0aGUgZ2FtZWN1bHQtb3BzIHdpcmluZyB0ZXN0IGFuZCBpdHMgZml4KTsgdHJlYXQgc3VjaCBjaGVja3MgYXMgdHJpcHdpcmVzIHdpdGggc3RhdGVkIGxpbWl0cywgYW5kIHVzZSBhIHNlbWFudGljIHRvb2wgZm9yIHNlbWFudGljIHByb3BlcnRpZXMuIFRoZSBtaW50ZXIgc2Nhbm5lciBzdGF5cyBhcyBhIHRyaXB3aXJlIChRMS0xMCBkZWZhdWx0ZWQpOyBDbGlwcHkgZGlzYWxsb3dlZC1tZXRob2RzIGlzIHRoZSByZWNvcmRlZCBmaXguIiwgInN0YXR1cyI6ICJhY2NlcHRlZCIsICJ0cyI6ICIyMDI2LTA5LTE2VDAwOjI3OjA5KzAwOjAwIiwgInR5cGUiOiAiYXJjaGl0ZWN0dXJlIn0=", "stored_at": "2026-09-16T18:10:02.009746+00:00", "type": "ghostlight.evidence_record.v0"} {"key": "2026-09-16T180825Z0000-0022-e4c0c1cf1b28", "payload": "eyJub3RlIjogIkwxIGNsb3NlZCwgMjAyNi0wOS0xNiAoR2hvc3RsaWdodCA4MzVlYTRkLi44NzJiYTM1IHBsdXMgQ3V0IDUgZG9jczsgcG9zdG1vcnRlbSBkb2NzL2FyY2hpdGVjdHVyZS9naG9zdGxpZ2h0LXN0b2NrLWxlbnNlcy1wb3N0bW9ydGVtLm1kKS4gVGhlIGdob3N0bGlnaHQgbGlicmFyeSBzaGlwcyBlaWdodCBzdG9jayBsZW5zZXM7IGxlbnMgd2VpZ2h0cyBhcmUgd29ybGQgZGF0YSAoY29uc3VtZXIudjUpLCByZXF1aXJlZCBhdCBjcmVhdGlvbiB3aXRoIG5vIGxpYnJhcnkgZGVmYXVsdCwgcmVwbGFjZWQgYnkgdGhlIG93bmVyJ3MgU2V0TGVuc1dlaWdodHMgaW4gYW55IHBoYXNlOyBhIHNldCB0aGF0IGRyYXdzIHRoZSBzYW1lIGFzIHRoZSBjdXJyZW50IG9uZSBpcyByZWZ1c2VkIGFzIE5vQ2Fub25pY2FsQ2hhbmdlLiBFYWNoIGVsYWJvcmF0b3Igc2Vzc2lvbiBkcmF3cyBpdHMgbGVucyByZXBsYXlhYmx5IGZyb20gd29ybGQgaWQgYW5kIGNvbW1hbmQgaWQgYW5kIHJlY29yZHMgdGhlIGxlbnMgYW5kIGl0cyBpbnN0cnVjdGlvbiB0ZXh0IG9uIHRoZSBzZXNzaW9uIChjb250cm9sbGVyX3dvcmsudjE2KTsgdGhlIGxlbnMgbmV2ZXIgZW50ZXJzIHRoZSBjb21tYW5kIGlkLCB3aGljaCBzdGF5cyB0aGUgaWRlbXBvdGVuY3kga2V5LiBCZWxpZWYtY2hhbmdpbmcgZmluZGluZ3M6ICgxKSBiZWZvcmUgTDEgdGhlIGVsYWJvcmF0b3IgcmVwYWlyIGxvb3AgbmV2ZXIgd29ya2VkIGFjcm9zcyBzd2VlcHM6IGEgZGVmaWNpdCBzZXNzaW9uJ3Mga2V5IG1vdmVkIG9uIGFueSBjb21taXQgKG9ycGhhbiBwbHVzIHJlcGVhdGVkIGluZmVyZW5jZSkgYW5kIGEgYm91bmRhcnkgc2Vzc2lvbiB3YXMgU3VwZXJzZWRlZCBmb3JldmVyIGFmdGVyIGFueSBjb21taXQ7IHJlc3VtZSBub3cgcmVhZHMgaW4tZmxpZ2h0IHJvd3MgZnJvbSB0aGUgc3RvcmUgYnkgd2hhdCB0aGV5IGFuc3dlciAoTDEtUTkpLCBhbmQgcm93cyByZWFkeSB0byBzdWJtaXQgYXJlIGV4Y2x1ZGVkIGJlY2F1c2UgYWRvcHRpbmcgYSBjb21taXR0ZWQgcm93IHN0YWxscyB0aGUgZGVmaWNpdCAoTDEtUTEwKS4gKDIpIENvbmN1cnJlbnQgc2Vzc2lvbnMgYXJlIGRpc3RpbmN0IHRocm91Z2ggYSBwZXItc3dlZXAgaW4tbWVtb3J5IGNsYWltIHNldDsgZWxhYm9yYXRpb24gaGFzIGl0cyBvd24gcGVybWl0IGNlaWxpbmcgc2VwYXJhdGUgZnJvbSB0aGUgc2ltdWxhdGlvbiBidWRnZXQuICgzKSBBIHBhbmlja2luZyBzZXNzaW9uIHRhc2sgdXNlZCB0byBraWxsIHRoZSBydW50aW1lIGVsYWJvcmF0aW9uIGRyaXZlciBzaWxlbnRseTsgaXQgaXMgbm93IGFuIGVycm9yIHJldHVybmVkIGFmdGVyIHNpYmxpbmdzIGZpbmlzaC4gKDQpIEFnZW50cyB0b2xkIHRvIHdhaXQgZm9yIGxvbmcgam9icyBzdGlsbCBlbmRlZCB0aGVpciB0dXJucyBtaWQtYnVpbGQgdW50aWwgYnJpZWZzIG5hbWVkIHRoZSBtZWNoYW5pc206IGJsb2NrIGluc2lkZSBhIHRvb2wgY2FsbC4gT3BlbiBmb3IgdGhlIG9wZXJhdG9yOiBMMS5mMSBxdWFyYW50aW5lIGhhbmRsaW5nLCBMMS5mMTMgc2VlZC1sYW5lIG9ycGhhbnMsIEwxLmYxNCByb3cgcmV0aXJlbWVudCwgTDEuZjE2IGNvbnN1bWVyIGxlbnMgc2V0cy4iLCAic3RhdHVzIjogImFjY2VwdGVkIiwgInRzIjogIjIwMjYtMDktMTZUMTg6MDg6MjUrMDA6MDAiLCAidHlwZSI6ICJhcmNoaXRlY3R1cmUifQ==", "stored_at": "2026-09-16T18:10:02.019412+00:00", "type": "ghostlight.evidence_record.v0"} {"key": "2026-09-21T225311Z0000-0023-d0f1b1936142", "payload": "eyJub3RlIjogIlBsYXl0ZXN0IGdhdGUgcmVkaXJlY3RlZCwgMjAyNi0wOS0yMiAob3BlcmF0b3I7IHRhcmdldCBkb2NzL2FyY2hpdGVjdHVyZS9naG9zdGxpZ2h0LXBsYXktYWdlbnQubWQsIHBsYW4gc3RlcCAxNikuICgxKSBUaGUgY29udHJvbGxlciBtYWNoaW5lcnkgKGNvdmVyLCBncm91cGVkIGNlbGxzLCBhY3Rpb24gY2F0YWxvZ3MsIEludGVycHJldGVyIHBhc3MsIG93bmVyLWNsaWNrIGRpc3BhdGNoKSBzdWl0cyBvZmZsaW5lIGdlbmVyYXRpb24gYW5kIHNpbXVsYXRpb24sIG5vdCBpbnRlcmFjdGl2ZSByb2xlLXBsYXk7IG9uIER1bmdlb24ncyBwbGF5IHBhdGggb25lIG9wZXJhdGlvbmFsIHBsYXkgYWdlbnQgcmVwbGFjZXMgaXQgYW5kIHRoZSBsaWJyYXJ5IGtlZXBzIGl0LiAoMikgUHJvamVjdG9yIC0+IFBlcnNvbmEgaXMgdW5jaGFuZ2VkIGFuZCBhIFBlcnNvbmEgbmV2ZXIgc2VlcyBzdHJ1Y3R1cmVkIHN0YXRlOyB0aGUgcGxheWVyJ3MgdmlldyBpcyByZW5kZXJlZCBieSB0aGUgc2FtZSBQcm9qZWN0b3IuIFJlamVjdGVkOiBQZXJzb25hcyByZWFkaW5nIHRoZWlyIG93biBzdGF0ZSwgdGhlIHN0cnVjdHVyZWQtc3RhdGUgZHVtcCB0aGUgcHJvamVjdG9yL2ludGVycHJldGVyIHNhbmR3aWNoIHByZXZlbnRzLiAoMykgVGhlIGFnZW50IGhvbGRzIGEgbmFtZWQga2VybmVsIGF1dGhvcml0eSAoZGVjbGFyZSBpbiBBY3RpdmUgd2l0aG91dCBhbnN3ZXJpbmcgZWxhYm9yYXRpb24gZGVtYW5kLCB3aG9sZS13b3JsZCByZWFjaCwgYWR2YW5jZSB0aW1lKTsgYW4gYWN0b3IncyBhY3QgY29tbWl0cyBvbmx5IHRocm91Z2ggdGhhdCBhY3RvcidzIGFmZm9yZGFuY2U7IHJhdyBvcHMgYXJlIHRoZSBhZ2VudCdzIHJ1bGluZ3M7IHRoZSBhZ2VudCBpcyBEdW5nZW9uJ3MgZGV0YWlsIGRlbWFuZC4gKDQpIEwyLUw0LCBTZXNzaW9uIFplcm8gRDEtRDMsIEwxLmYxNi9mMS9mMTMvZjE0IGRlZmVycmVkIGJ5IHJ1bGluZywgbm90IGRyb3BwZWQuICg1KSBTb3VyY2UgY2hlY2s6IGluZmVyZW5jZSByb3V0ZXMgcGVyIGxhbmUgYnkgbW9kZWwgbmFtZSB0byB0aGUgU0RLIHNpZGVjYXIgKHByZWZpeCBjbGF1ZGUpIG9yIENvZGV4Q29ubmVjdG9yLCBubyBydW50aW1lIGZhbGxiYWNrLCBubyBsb2NhbC1tb2RlbCB0cmFuc3BvcnQ7IHRoZSBzaWRlY2FyIGlzIGEgcHJpdmF0ZSBtc2dwYWNrIGNoaWxkLXByb2Nlc3MgcGlwZSBiZWhpbmQgSW5mZXJlbmNlUG9ydCwgbm90IHRoZSBDdWx0TmV0IGNvbm5lY3RvciBBUEkuIiwgInN0YXR1cyI6ICJhY2NlcHRlZCIsICJ0cyI6ICIyMDI2LTA5LTIxVDIyOjUzOjExKzAwOjAwIiwgInR5cGUiOiAiYXJjaGl0ZWN0dXJlIn0=", "stored_at": "2026-09-21T22:53:11.194006+00:00", "type": "ghostlight.evidence_record.v0"} +{"key": "2026-09-23T095403Z0000-0024-dbf9dd7a928d", "payload": "eyJub3RlIjogIlBsYXkgYWdlbnQgcGFzcyBjbG9zZWQgMjAyNi0wOS0yMzogMTcgY3V0cywgfjEwIGZpeCBiYXRjaGVzLCAxOTUgZmluZGluZ3MsIFNvdWwgdmVyZGljdCBcImJhciBtZXRcIi4gR2hvc3RsaWdodCBEdW5nZW9uIG5vdyBydW5zIG9uIG9uZSBvcGVyYXRpb25hbCBhZ2VudCB0aHJvdWdoIHdvcmxkLnBsYXk7IHdvcmxkLnNwZWFrIGFuZCB0aGUgc3RvcnkgY2FyZCBhcmUgZGVsZXRlZC4gUG9zdG1vcnRlbTogZG9jcy9hcmNoaXRlY3R1cmUvZ2hvc3RsaWdodC1wbGF5LWFnZW50LXBvc3Rtb3J0ZW0ubWQuIEFib3V0IDE1MCBvZiAxOTUgZmluZGluZ3Mgd2VyZSBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXNzIG93biBlYXJsaWVyIHN0ZXBzLCBub3QgaW5oZXJpdGVkLiBPbmUgZGVmZWN0IHNoYXBlIHJlY3VycmVkIGZpdmUgdGltZXM6IGEgdHJ1ZSBzdGF0ZW1lbnQgYWJvdXQgYSBuYXJyb3cgbWVjaGFuaXNtIHN0YW5kaW5nIGluIGZvciBhIGZhbHNlIG9uZSBhYm91dCB0aGUgd2hvbGUgcGF0aCAoYSBjb21taXR0ZWQgZmlsZSBleGlzdHMgdGhlcmVmb3JlIHRoZSBjbGllbnQgd29ya3M7IGdpdCBleGl0ZWQgemVybyB0aGVyZWZvcmUgdGhpcyBpcyBhIGNoZWNrb3V0OyBjYXJnbyBwcmludGVkIG9rIHRoZXJlZm9yZSB0aGUgZml4dHVyZSBpcyBsaXZlKS4gVGhlIEV2ZSBjbGllbnQgcm91bmQgdHJpcCBoYWQgbmV2ZXIgYmVlbiBleGVyY2lzZWQgYmVmb3JlIHRoaXMgcGFzcyBhbmQgbm8gY2xpZW50IGNvdWxkIGV2ZXIgaGF2ZSBjcmVhdGVkIGEgd29ybGQuIFVucHJvdmVuOiBzZWVkaW5nIHBhc3QgaXRzIGNvbmZpZyBjaGVjaywgYW5kIGFueSBtb2RlbCBiZWhpbmQgdGhlIGxvY2FsIGluZmVyZW5jZSBwb3J0LiBOb3QgYnVpbHQgYW5kIGdhdGluZyBhIHdpZGVyIHNoYXJlOiBmaWN0aW9uLWZpcnN0IHJpc2sgcmVzb2x1dGlvbiBhbmQgZ2VzdGFsdCBhZ2VuY3kuIiwgInN0YXR1cyI6ICJvayIsICJ0cyI6ICIyMDI2LTA5LTIzVDA5OjU0OjAzKzAwOjAwIiwgInR5cGUiOiAiaW1wbGVtZW50YXRpb24ifQ==", "stored_at": "2026-09-23T09:54:03.400609+00:00", "type": "ghostlight.evidence_record.v0"}