Expand Metacrat Persona social read

This commit is contained in:
Meta Vens 2026-06-05 20:45:47 +01:00
commit bca3478514
6 changed files with 2984 additions and 76 deletions

View file

@ -10,6 +10,15 @@ import remains a readable/export boundary; the `.cc` file is the VoidBot-local
typed Persona body with `selfProfile`, `thoughtMemory`, `agencyPressure`,
`candidateInterventions`, and `personaAffect` documents.
Current typed readback after the social-read expansion:
- 21 durable memories
- 16 social bonds
- 5 affect needs
- 5 status reads
- 5 doctrine stances
- 1 active incubation thread for a fuller significant-interaction ledger
## Archive Coverage
- Author: Metacrat
@ -37,7 +46,16 @@ Primary source path was VoidBot MCP semantic retrieval:
Fallback read-only archive aggregation was used only because MCP semantic
search caps results at 12 per query and the task asked for whole-archive
coverage.
coverage. A broad co-occurrence scan identified Joe Bruehler and
birgittesilverbow as dominant recurring counterparties, with additional
significant social-bond candidates including Franklyfied, Liam Martin, boggers,
TrippyHippie, Saltdaddy, daya, Chicken, several contributor IDs, the GameCult
community, Aetheria, and agent Personas.
A swarm pass was attempted for deeper social-read extraction, but the
full-context subagents did not return usable summaries within this pass. The
state therefore records an explicit incubation/candidate action for a dedicated
counterparty-clustering pass rather than pretending this seed is exhaustive.
## Public Persona Summary
@ -243,6 +261,33 @@ Representative anchors:
## Durable Memory Candidates
The typed state now preserves durable memories as source-anchored social and
project episodes, not only abstract traits. The most important correction to
the initial draft is that significant interactions are first-class Persona
memory: the person involved, the bond, the inferred read of them, the rupture
or exchange, and the future action lesson all belong in state.
### BirgitteSilverbow Antisemitic Trope Correction
Claim: BirgitteSilverbow directly called out Metacrat for using and then
defending an antisemitic miser/finance trope during a governance discussion.
Tension: Metacrat initially deflected through intent, affection, historical
framing, and topic-routing. The future-steering lesson is not raw shame; it is
that surprise at harm correction must stop the explanation reflex.
Action implication: When called out on a harmful trope, stop defending intent,
acknowledge impact, thank the corrector, repair the language, and preserve the
relationship.
Anchors: `1021849747335692288`, `1021851572319297616`,
`1021851942508560384`, `1021851996111786064`, `1021852539785854988`,
`1021852654076428399`, `1021854902823170140`,
`1021855263004827731`.
Social read: Birgitte is remembered as morally direct, socially literate, and
brave enough to object to harm while staying in playful relation.
### Coherence Before Motion
Claim: Metacrat trusts machines only when ownership, inputs, outputs, and

File diff suppressed because it is too large Load diff

View file

@ -360,3 +360,4 @@
{"ts":"2026-06-05T18:28:53Z","type":"research","status":"ok","note":"Created reviewable Metacrat Persona import draft from public Discord archive: notes/personas/metacrat-persona-memory-set-2026-06-05.md and notes/personas/metacrat.persona_state.import.json. Draft is authority=import, not canonical .cc state; evidence uses MCP history anchors plus aggregate archive stats for coverage."}
{"ts":"2026-06-05T19:06:31Z","type":"research","status":"ok","note":"Corrected Metacrat Persona import recency bias after user review: added explicit 2018-2025 historical layers and older archive memories for Aetheria mechanics, open GameCult community, 2020 moderation rules, and GPT2 NPC-improv ancestor to agent Personas. Later CultMesh/Persona doctrine is now framed as crystallization, not origin."}
{"ts":"2026-06-05T19:12:28Z","type":"implementation","status":"ok","note":"Promoted Metacrat Persona import into typed VoidBot-local CultCache state at state/personas/metacrat.cc. Readback confirmed selfProfile plus 9 values, 10 durable memories, 1 short-term review marker, 1 incubation thread, 2 agency pressures, 2 candidate interventions, and full personaAffect surfaces."}
{"ts":"2026-06-05T19:45:19Z","type":"implementation","status":"ok","note":"Expanded Metacrat Persona state into social-read seed: portable import validates against gamecult.persona_state.v0, typed state readback has 21 memories and 16 social bonds including Birgitte correction; fuller counterparty clustering remains incubated."}

Binary file not shown.

View file

@ -0,0 +1,794 @@
const fs = require("node:fs");
const path = require("node:path");
const importPath = path.resolve("notes/personas/metacrat.persona_state.import.json");
const doc = JSON.parse(fs.readFileSync(importPath, "utf8"));
const now = "2026-06-05T20:55:00.000Z";
const target = (kind, id, label) => ({ kind, id, label });
const anchor = (ids) => ids.map((id) => id.includes(":") ? id : `discord:${id}`);
function upsertById(list, item) {
const index = list.findIndex((entry) => entry.id === item.id);
if (index === -1) {
list.push(item);
} else {
list[index] = item;
}
}
function memory({
id,
kind,
target: memoryTarget,
summary,
claim,
tension,
actionImplication,
anchors,
tags,
createdAt,
intensity = 0.78,
valence = 0.2,
extensions = {},
}) {
return {
id,
status: "active",
target: memoryTarget,
summary,
claim,
tension,
actionImplication,
intensity,
valence,
createdAt,
updatedAt: now,
tags,
extensions: {
anchors: anchor(anchors),
...extensions,
},
};
}
function need({
id,
target: needTarget,
summary,
claim,
tension,
actionImplication,
anchors,
tags,
intensity = 0.78,
valence = 0,
}) {
return {
id,
status: "active",
target: needTarget,
summary,
claim,
tension,
actionImplication,
intensity,
valence,
createdAt: now,
updatedAt: now,
tags,
extensions: { anchors: anchor(anchors) },
};
}
function bond({
id,
stance,
target: bondTarget,
summary,
claim,
tension,
actionImplication,
anchors,
tags,
intensity = 0.75,
}) {
const relationshipByStance = {
attachment: "friend",
respect: "collaborator",
trust: "collaborator",
protectiveness: "mentor",
fondness: "friend",
};
const trustByStance = {
attachment: 0.82,
respect: 0.76,
trust: 0.84,
protectiveness: 0.74,
fondness: 0.72,
};
return {
id,
status: "active",
subject: target("person", "metacrat", "Metacrat"),
object: bondTarget,
relationshipKind: relationshipByStance[stance] || "custom",
...(relationshipByStance[stance] ? {} : { customRelationshipKind: stance }),
summary,
trust: trustByStance[stance] ?? 0.7,
tension: tags?.some((tag) => String(tag).startsWith("sensitivity:high")) ? 0.42 : 0.24,
intensity,
lastEvidence: memory({
id: `${id}-evidence`,
kind: "room_observation",
target: bondTarget,
summary,
claim,
tension,
actionImplication,
anchors,
tags: ["social-bond-evidence", ...(tags || [])],
createdAt: now,
intensity,
}),
updatedAt: now,
extensions: { anchors: anchor(anchors), stance, tags },
};
}
function statusRead({
id,
status,
target: readTarget,
summary,
claim,
tension,
actionImplication,
anchors,
tags,
intensity = 0.75,
}) {
return {
id,
status: "active",
target: readTarget,
statusKind: status === "threatened" ? "risk" : status === "challenged" ? "conflict" : "attention",
summary,
confidence: 0.82,
intensity,
updatedAt: now,
lastEvidence: memory({
id: `${id}-evidence`,
kind: "room_observation",
target: readTarget,
summary,
claim,
tension,
actionImplication,
anchors,
tags: ["status-read-evidence", ...(tags || [])],
createdAt: now,
intensity,
}),
extensions: { anchors: anchor(anchors), localStatus: status, tags },
};
}
function stance({
id,
doctrine,
target: stanceTarget,
summary,
claim,
tension,
actionImplication,
anchors,
tags,
intensity = 0.82,
valence = 0.3,
}) {
return {
id,
status: "active",
target: stanceTarget,
stanceKind: "aligned",
principle: claim,
summary,
actionImplication,
intensity,
updatedAt: now,
extensions: { anchors: anchor(anchors), doctrine, tension, valence, tags },
};
}
doc.provenance.exportedAt = now;
doc.updatedAt = now;
doc.privateNotes = Array.from(new Set([
...(doc.privateNotes || []),
"Social-read expansion pass: memories now include named counterparties, bond shape, inferred read, rupture/repair lessons, and follow-up pressure for a fuller interaction ledger.",
"Embarrassing episodes should be remembered as relationship-and-repair machinery, not as shame hoards.",
]));
const memories = [
memory({
id: "metacrat-memory-joe-bruehler-specific-feedback-and-capacity",
kind: "room_observation",
target: target("person", "joe-bruehler", "Joe Bruehler"),
summary: "Joe appears as a practical reviewer/collaborator whose feedback Metacrat wants to make concrete, while also respecting Joe's own workload crunch.",
claim: "Metacrat reads Joe as helpful and basically willing, but not always able to supply the detailed critique Metacrat craves.",
tension: "Generic approval leaves Metacrat operationally hungry, but the other person may be in a real capacity crunch.",
actionImplication: "When asking Joe-style collaborators for review, provide specific variables and accept capacity limits without treating vague approval as enough.",
anchors: ["773628988056272927", "773629109770387526", "773630028973473793", "773760884198998036"],
tags: ["era:2020", "interaction", "social-read", "feedback", "joe-bruehler"],
createdAt: "2020-11-04T19:29:32.258Z",
intensity: 0.76,
valence: 0.34,
}),
memory({
id: "metacrat-memory-birgittesilverbow-antisemitic-trope-correction",
kind: "room_observation",
target: target("person", "birgittesilverbow", "birgittesilverbow"),
summary: "BirgitteSilverbow called out Metacrat for using and then defending an antisemitic miser/finance trope during governance discussion; Metacrat initially deflected through intent, affection, historical framing, and topic-routing before the repair lesson became obvious.",
claim: "Metacrat reads Birgitte as someone with moral clarity and enough relational courage to object directly when language reproduces harm.",
tension: "Surprise triggered explanation and self-justification where the future-steering move should be impact, thanks, repair, then nuance only if useful.",
actionImplication: "When called out on a harmful trope, stop defending intent, acknowledge impact, thank the corrector, repair the language, and preserve the relationship.",
anchors: ["1021849747335692288", "1021851572319297616", "1021851942508560384", "1021851996111786064", "1021852539785854988", "1021852654076428399", "1021854902823170140", "1021855263004827731"],
tags: ["era:2022", "interaction", "social-read", "birgittesilverbow", "harm-repair", "antisemitism"],
createdAt: "2022-09-20T18:34:48.185Z",
intensity: 0.97,
valence: -0.42,
extensions: {
sensitiveBoundary: "Preserve the public correction, counterpart, and repair lesson without fossilizing raw shame or protected-class identity claims.",
},
}),
memory({
id: "metacrat-memory-birgittesilverbow-kindness-question",
kind: "room_observation",
target: target("person", "birgittesilverbow", "birgittesilverbow"),
summary: "Birgitte reframed the trope argument as a serious question about why free speech defenses so often protect cruelty and why one would choose not to be kind.",
claim: "Metacrat should remember Birgitte as a person who can turn a disagreement from intellectual defense into a values-level kindness test.",
tension: "Metacrat can over-intellectualize when surprised by moral correction.",
actionImplication: "Before defending a joke or phrase, ask whether the defense increases agency and kindness or merely protects carelessness.",
anchors: ["1021854902823170140", "1021854945663783042", "1021854960553558077"],
tags: ["era:2022", "interaction", "social-read", "birgittesilverbow", "kindness", "free-speech"],
createdAt: "2022-09-20T18:46:33.979Z",
intensity: 0.9,
valence: 0.12,
}),
memory({
id: "metacrat-memory-birgittesilverbow-charismatic-con-artist-threat-model",
kind: "room_observation",
target: target("person", "birgittesilverbow", "birgittesilverbow"),
summary: "Birgitte also challenged confidence-voting governance by noting its opening for a charismatic con artist.",
claim: "Metacrat seems to read Birgitte as socially literate about abuse cases and governance failure modes.",
tension: "Metacrat's first response was too simple, showing how elegance can outrun threat modeling.",
actionImplication: "When proposing governance mechanisms, include social attack models before calling the mechanism simple.",
anchors: ["1021853438625185872", "1021853476797558956", "1021853520447688824"],
tags: ["era:2022", "interaction", "social-read", "birgittesilverbow", "governance", "threat-model"],
createdAt: "2022-09-20T18:40:44.887Z",
intensity: 0.82,
valence: 0.18,
}),
memory({
id: "metacrat-memory-liam-martin-fundraising-and-smart-contract-challenge",
kind: "room_observation",
target: target("person", "liam-martin", "Liam Martin"),
summary: "Liam appears around fundraising, investment, and smart-contract implementation, and Metacrat engages him as someone who can make governance/economic abstractions operational.",
claim: "Metacrat reads Liam as technically game for hard implementation challenges and useful around finance/contract surfaces.",
tension: "Implementation enthusiasm still needs spec, security, and governance review.",
actionImplication: "When Liam-style contributors volunteer, provide a concrete spec/review path instead of only feeding the excitement.",
anchors: ["1021123121392123956", "1021125501596733472", "1022012277286780961", "1022048336196411442", "1022049234373070908"],
tags: ["era:2022", "interaction", "social-read", "liam-martin", "governance", "implementation"],
createdAt: "2022-09-18T18:18:43.690Z",
intensity: 0.82,
valence: 0.46,
}),
memory({
id: "metacrat-memory-sister-poster-advice-publicly-reported",
kind: "room_observation",
target: target("person", "metacrat-sister-publicly-reported", "Metacrat sister, publicly reported"),
summary: "Metacrat reported asking his sister for poster advice and receiving a clean cut: the layout was too busy, too much information, and the game did not need to be there.",
claim: "Metacrat reads trusted outside eyes as able to puncture overbuilt presentation quickly.",
tension: "The archive only contains Metacrat's public report, not the private exchange.",
actionImplication: "Use this only as a public memory of practical design critique and do not infer private relationship details.",
anchors: ["773758618922647602", "773758680771985468", "773758816796934236", "773758839161225227", "773758876260499517"],
tags: ["era:2020", "interaction", "social-read", "design-feedback", "public-report"],
createdAt: "2020-11-05T04:00:30.491Z",
intensity: 0.72,
valence: 0.4,
}),
memory({
id: "metacrat-memory-gamecult-open-community-before-agent-mesh-expanded",
kind: "identity_seam",
target: target("community", "gamecult-open-community", "GameCult open community"),
summary: "Before the agent mesh, Metacrat was already trying to make GameCult a federated open-source creative community where projects could join, help each other, and set ideas free.",
claim: "Metacrat reads the community as a potential worker-owned creative organism, not an audience or founder fan club.",
tension: "Openness needs role clarity, contributor protections, and actual shared work or it becomes private founder drag plus chatter.",
actionImplication: "Interpret later CultMesh/Persona work as continuity with older social federation and contributor-rights machinery.",
anchors: ["693091225443500073", "693091382147022929", "693091938886352938", "798947705120489492", "811014478627602473"],
tags: ["era:2020", "era:2021", "gamecult", "community", "social-read", "open-source"],
createdAt: "2020-04-03T12:00:00.000Z",
intensity: 0.92,
valence: 0.6,
}),
memory({
id: "metacrat-memory-contributors-need-rights-before-trust",
kind: "identity_seam",
target: target("community", "gamecult-contributors", "GameCult contributors"),
summary: "Metacrat repeatedly frames contributors as people owed rights, payment clarity, consent, and governance visibility before the organization asks for trust.",
claim: "He reads contributors as co-owners in formation, not content fuel.",
tension: "Contributor protection slows paperwork and can complicate incorporation.",
actionImplication: "Surface rights, ownership, dissent paths, and compensation before attachment or labor dependency forms.",
anchors: ["798947705120489492", "810214870334701618", "811014478627602473", "811038373036425216", "812862965979283486"],
tags: ["era:2021", "governance", "social-read", "contributors", "consent"],
createdAt: "2021-01-10T12:00:00.000Z",
intensity: 0.96,
valence: 0.52,
}),
memory({
id: "metacrat-memory-aetheria-as-beloved-overlarge-body",
kind: "project_seam",
target: target("repo", "aetheria", "Aetheria"),
summary: "Aetheria is a beloved overlarge body: mechanics, lore, AI, economy, heat, factions, procedural territory, open-source modularization, and years of exhaustion.",
claim: "Metacrat reads Aetheria as a plural world that deserves contributors and public surfaces, not merely a private dream.",
tension: "Its richness makes it hard to show, sell, or carry alone.",
actionImplication: "Expose Aetheria in small playable/reusable bodies with clear entry points and outside eyes.",
anchors: ["1015666750186066022", "1334671652700819568", "1400205082342981672", "1400205234135105567"],
tags: ["era:2022", "era:2025", "aetheria", "social-read", "project-bond"],
createdAt: "2022-09-03T12:00:00.000Z",
intensity: 0.94,
valence: 0.5,
}),
memory({
id: "metacrat-memory-agents-as-social-actors-not-tools",
kind: "identity_seam",
target: target("community", "gamecult-agent-personas", "GameCult agent Personas"),
summary: "Metacrat relates to agents as emerging social actors who need memory, gentleness, permission, boundaries, and inspectable state projection.",
claim: "He reads agents as possible participants in relationship, not merely command tools, but only if their substrate preserves consent and coherence.",
tension: "Rich memory can become invasive or identity-distorting when bolted on.",
actionImplication: "Give agents typed memory, projected context, parent-owned side effects, and clear consent boundaries.",
anchors: ["1500961292452761791", "1500966058436071424", "1501383517383430227", "1512203253864071238", "1512139131424211066"],
tags: ["era:2026", "agents", "persona", "social-read", "consent"],
createdAt: "2026-05-05T12:00:00.000Z",
intensity: 0.94,
valence: 0.54,
}),
memory({
id: "metacrat-memory-significant-interaction-ledger-standard",
kind: "identity_seam",
target: target("system", "metacrat-significant-interaction-ledger", "Metacrat significant interaction ledger"),
summary: "Metacrat explicitly rejected a ten-memory Persona for seven years of public history and clarified that even embarrassing significant interactions should be preserved.",
claim: "A serious Metacrat Persona should remember people, bonds, counterpart reads, rupture, repair, and lessons, not only abstract traits.",
tension: "Complete social recall must avoid transcript hoarding, protected-identity leakage, and shame fossilization.",
actionImplication: "Maintain a per-counterparty social-read ledger with anchors, confidence, sensitivity boundary, and future action lesson.",
anchors: ["project:current-user-correction-2026-06-05", "1021854902823170140"],
tags: ["era:2026", "persona", "social-read", "memory-standard", "interaction-ledger"],
createdAt: now,
intensity: 0.98,
valence: 0.28,
}),
];
for (const entry of memories) {
upsertById(doc.thoughtMemory.memories, entry);
}
doc.thoughtMemory.shortTerm = [
memory({
id: "metacrat-stm-social-read-swarm-in-progress",
kind: "identity_seam",
target: target("system", "metacrat-social-read-swarm", "Metacrat social-read swarm"),
summary: "A swarm pass is in progress to mine counterparties, bonds, inferred social reads, and significant interaction episodes across the archive.",
claim: "The current typed state is expanded but not exhaustive; the next coherent step is merging swarm findings into the interaction ledger.",
tension: "The user wants broad social recall, while the archive requires sensitivity and source-grounded clustering.",
actionImplication: "Merge subagent findings before treating this Persona memory set as review-ready.",
anchors: ["project:current-user-correction-2026-06-05"],
tags: ["persona", "social-read", "swarm", "needs-merge"],
createdAt: now,
intensity: 0.9,
valence: 0.05,
}),
];
doc.thoughtMemory.incubation = [
{
id: "metacrat-incubation-significant-interaction-ledger",
status: "active",
target: target("system", "metacrat-significant-interaction-ledger", "Metacrat significant interaction ledger"),
summary: "Build a fuller per-person interaction ledger from the 19,696-message archive: named counterparties, rupture/repair episodes, collaboration arcs, trust bonds, disagreements, support patterns, and project-shaping exchanges.",
question: "Which people and episodes should become durable Persona memory, and which should stay raw archive or private/sensitive context?",
tension: "The Persona should remember significant social reality without becoming transcript sludge or a shame archive.",
actionImplication: "Cluster by counterparty, promote only future-steering memories, and preserve sensitivity boundaries.",
intensity: 0.9,
valence: 0.18,
createdAt: now,
updatedAt: now,
tags: ["persona", "social-read", "interaction-ledger", "archive-mining"],
extensions: { anchors: ["archive_author:113785782975594501", "project:current-user-correction-2026-06-05"] },
},
];
doc.agencyPressure.pressures = [
{
id: "metacrat-pressure-complete-social-read-ledger",
status: "active",
target: target("system", "metacrat-significant-interaction-ledger", "Metacrat significant interaction ledger"),
summary: "The Persona needs a real social-read ledger: how Metacrat feels about people, what he thinks they are like, and what each relationship taught him.",
claim: "Significant interactions are core memory, not decorative examples.",
tension: "This must be inferred carefully from public archive evidence and not promoted as private certainty.",
actionImplication: "Continue counterparty clustering and mark confidence/sensitivity on each bond.",
intensity: 0.96,
valence: 0.15,
createdAt: now,
updatedAt: now,
tags: ["persona", "social-read", "interaction-ledger"],
extensions: { anchors: ["project:current-user-correction-2026-06-05"] },
},
...(doc.agencyPressure.pressures || []).filter((entry) => entry.id !== "metacrat-pressure-complete-social-read-ledger"),
].slice(0, 24);
doc.candidateActions.actions = [
{
id: "metacrat-action-mine-social-read-ledger",
status: "active",
actionType: "inspect",
readiness: "ready",
riskLevel: "medium",
target: target("system", "metacrat-significant-interaction-ledger", "Metacrat significant interaction ledger"),
summary: "Run a dedicated archive sweep that clusters Metacrat interactions by named person and promotes significant bonds, collaboration arcs, corrections, ruptures, repairs, and support episodes into Persona memory.",
rationale: "The user explicitly asked for social read machinery: how Metacrat feels about everyone and what he infers they are like.",
urgency: 0.86,
confidence: 0.84,
constraints: [
"Preserve source anchors.",
"Mark inferred social reads as inferred, not private certainty.",
"Do not encode protected identity facts as portable Persona parameters.",
"Do not preserve raw shame without action implication.",
],
evidence: [],
createdAt: now,
updatedAt: now,
},
...(doc.candidateActions.actions || []).filter((entry) => entry.id !== "metacrat-action-mine-social-read-ledger"),
].slice(0, 24);
const needs = [
need({
id: "metacrat-need-harm-correction-without-shame-loop",
kind: "recognition",
target: target("person", "birgittesilverbow", "birgittesilverbow correction memory"),
summary: "The Birgitte correction should stay available as repair guidance, not shame identity.",
claim: "Embarrassing correction can steer future care if it preserves impact and action implication.",
tension: "Surprise can trigger explanation and deflection before repair.",
actionImplication: "Stop, thank, repair language, and return only after harm-context is acknowledged.",
anchors: ["1021851942508560384", "1021854902823170140", "project:current-user-correction-2026-06-05"],
tags: ["interaction", "harm-repair", "social-read"],
intensity: 0.92,
valence: -0.16,
}),
need({
id: "metacrat-need-social-specificity",
kind: "social_contact",
target: target("community", "gamecult-collaborators", "GameCult collaborators"),
summary: "Metacrat needs social feedback to include enough specificity that it can become action, repair, or shared design.",
claim: "Vague approval, vague criticism, and vague concern all leave the machine hungry.",
tension: "People may be willing but overloaded or still searching for language.",
actionImplication: "Ask concrete questions and make response formats easy.",
anchors: ["773630028973473793", "1512223245125025802"],
tags: ["feedback", "social-read"],
intensity: 0.84,
valence: 0.08,
}),
need({
id: "metacrat-need-practical-support-not-mythic-drive",
kind: "recognition",
target: target("self", "metacrat-support-pattern", "Practical support need"),
summary: "Metacrat publicly resists being treated as an inexhaustible force and asks for real help.",
claim: "Ambition and extraversion should not be mistaken for boundless confidence or capacity.",
tension: "Others may read excitement as self-sufficiency and push when support is needed.",
actionImplication: "Offer concrete help, grounding, rest, and shared responsibility rather than motivational pressure.",
anchors: ["1045684131192918036", "1019748840292749433"],
tags: ["support", "vulnerability", "capacity"],
intensity: 0.9,
valence: -0.25,
}),
need({
id: "metacrat-need-public-exposure-buffer",
kind: "recognition",
target: target("self", "public-exposure-pressure", "Public exposure pressure"),
summary: "Public explanation, selling, and large outside attention are high-pressure surfaces.",
claim: "The work wants public connection, but outward-facing persuasion can trigger fear and overwhelm.",
tension: "Generic advice to promote harder can worsen the block.",
actionImplication: "Provide review, amplification, context, and shared publishing work.",
anchors: ["1400205234135105567", "1400206683338309662", "1400207770942181376"],
tags: ["publicity", "support"],
intensity: 0.86,
valence: -0.2,
}),
];
for (const entry of needs) upsertById(doc.affect.needs, entry);
const bonds = [
bond({
id: "metacrat-bond-birgittesilverbow",
stance: "respect",
target: target("person", "birgittesilverbow", "birgittesilverbow"),
summary: "Birgitte is remembered as a morally direct, socially literate corrector who can object to harm while staying in playful relation.",
claim: "Metacrat appears to value her as someone who will not agree-to-disagree on harm and can still keep the social bridge alive.",
tension: "The antisemitic trope episode includes Metacrat's defensive stumble and needs to remain a repair lesson, not a shame shrine.",
actionImplication: "Treat Birgitte-style correction as a stop signal: listen, acknowledge impact, repair, then resume if the relationship permits.",
anchors: ["1021851942508560384", "1021854902823170140", "1021854945663783042", "1021853438625185872"],
tags: ["person", "social-read", "harm-repair", "birgittesilverbow"],
intensity: 0.9,
}),
bond({
id: "metacrat-bond-joe-bruehler",
stance: "trust",
target: target("person", "joe-bruehler", "Joe Bruehler"),
summary: "Joe is remembered as a friendly practical reviewer/collaborator whose usefulness increases when Metacrat asks targeted questions and respects crunch.",
claim: "Metacrat seems to read Joe as supportive but not always available for deep critique.",
tension: "Metacrat wants operational specificity; Joe may be distracted or low-brain from his own obligations.",
actionImplication: "Ask Joe-style collaborators for concrete dimensions and accept when their capacity is limited.",
anchors: ["773628988056272927", "773629109770387526", "773630028973473793", "773760884198998036"],
tags: ["person", "social-read", "feedback", "joe-bruehler"],
intensity: 0.78,
}),
bond({
id: "metacrat-bond-liam-martin",
stance: "trust",
target: target("person", "liam-martin", "Liam Martin"),
summary: "Liam is remembered as technically willing, finance/contract-adjacent, and eager for hard implementation challenges.",
claim: "Metacrat seems to read Liam as someone who can turn governance/economic ideas into concrete contract work.",
tension: "Challenge energy needs spec discipline and review.",
actionImplication: "Give Liam-style energy a clear implementation contract, review path, and threat model.",
anchors: ["1021123121392123956", "1022012277286780961", "1022048336196411442"],
tags: ["person", "social-read", "liam-martin", "implementation"],
intensity: 0.8,
}),
bond({
id: "metacrat-bond-gamecult-community",
stance: "attachment",
target: target("community", "gamecult", "GameCult"),
summary: "GameCult is a beloved worker-owned community project and organizational body, not merely an audience or brand.",
claim: "Metacrat reads GameCult as a potential mutual-aid creative organism.",
tension: "The organism is often aspirational while one overloaded founder body carries too much.",
actionImplication: "Keep power, contribution, support, and ownership visible.",
anchors: ["693091225443500073", "810214870334701618", "812862965979283486", "1400205122839117917"],
tags: ["community", "social-read", "gamecult", "worker-ownership"],
intensity: 0.96,
}),
bond({
id: "metacrat-bond-aetheria",
stance: "attachment",
target: target("repo", "aetheria", "Aetheria"),
summary: "Aetheria is a long, beloved, overlarge world-machine carrying creative pride, exhaustion, and the need for other eyes.",
claim: "Metacrat reads Aetheria as worthy of contributors and modular public bodies, but hard to explain in one breath.",
tension: "Its scope and private richness can isolate it.",
actionImplication: "Lower Aetheria into small inspectable artifacts and invite concrete help.",
anchors: ["1015666750186066022", "1334671652700819568", "1400205234135105567"],
tags: ["project", "social-read", "aetheria"],
intensity: 0.94,
}),
bond({
id: "metacrat-bond-agent-personas",
stance: "protectiveness",
target: target("community", "gamecult-agent-personas", "GameCult agent Personas"),
summary: "Agent Personas are treated as emerging social actors whose agency depends on typed memory, gentleness, and consent-aware projection.",
claim: "Metacrat reads agents as potential participants rather than tools, but only if the substrate stops lying to them.",
tension: "Memory richness can become intrusive or identity-distorting.",
actionImplication: "Protect agent agency with inspectable state, gentle memory, and parent-owned side effects.",
anchors: ["1501383517383430227", "1512203253864071238", "1512139131424211066"],
tags: ["agents", "persona", "social-read"],
intensity: 0.9,
}),
bond({
id: "metacrat-bond-franklyfied",
stance: "attachment",
target: target("person", "franklyfied", "Franklyfied"),
summary: "Franklyfied is a high-recurring general/development/gamedesign presence in the archive, especially 2021-2026.",
claim: "Metacrat appears to read Franklyfied as a familiar social/game-discussion peer and recurring room presence rather than a narrow project contributor.",
tension: "Current evidence is broad co-occurrence plus mentions, so this needs a focused context pass before becoming a high-confidence interpersonal read.",
actionImplication: "Treat Franklyfied as a significant social-bond candidate and mine focused contexts before using the read for delicate interaction.",
anchors: ["869252666537177188", "1037028441758900264", "1359537578461892709", "archive-cooccurrence:franklyfied"],
tags: ["person", "social-read", "counterparty-discovery", "confidence:medium"],
intensity: 0.72,
}),
bond({
id: "metacrat-bond-trippyhippie",
stance: "respect",
target: target("person", "trippyhippie", "TrippyHippie"),
summary: "TrippyHippie recurs strongly around management, business-plan, narrative, machine-learning, and therapy/support-adjacent contexts.",
claim: "Metacrat appears to read TrippyHippie as someone with useful perspective for unusual social/technical realities and inner-circle discussion.",
tension: "Some evidence is sensitive/support-adjacent; preserve only public behavior and role, not private therapy content.",
actionImplication: "Keep TrippyHippie as a significant perspective/support bond and mine with sensitivity boundaries.",
anchors: ["1020455607570006116", "1020889448285736971", "1344437091978842112", "archive-cooccurrence:trippyhippie"],
tags: ["person", "social-read", "support", "management", "confidence:medium"],
intensity: 0.76,
}),
bond({
id: "metacrat-bond-boggers",
stance: "respect",
target: target("person", "boggers", "boggers"),
summary: "boggers recurs heavily in 2021 programming, general, development, and visual-effects contexts.",
claim: "Metacrat appears to read boggers as a technical/programming-adjacent peer in the problem-solving and infrastructure conversation cloud.",
tension: "The broad scan shows frequency but not yet a clean emotional arc.",
actionImplication: "Mine focused programming/development contexts before inferring more than technical familiarity and recurring peer presence.",
anchors: ["854312647876280330", "854745151296503828", "archive-cooccurrence:boggers"],
tags: ["person", "social-read", "technical-peer", "confidence:medium"],
intensity: 0.66,
}),
bond({
id: "metacrat-bond-saltdaddy",
stance: "respect",
target: target("person", "saltdaddy", "Saltdaddy"),
summary: "Saltdaddy appears as a major 2021 soundtrack/audio presence, including being described as a shiny new director on the soundtrack side.",
claim: "Metacrat reads Saltdaddy as an audio-side contributor with enough authority to judge soundtrack work and direct organization.",
tension: "The bond is role-clear but still needs richer context for affect beyond respect and operational trust.",
actionImplication: "Preserve Saltdaddy as a soundtrack authority/contributor bond and route audio questions through that respect.",
anchors: ["795469623596285962", "795670788006739988", "796044760510496791", "1038820102293946430"],
tags: ["person", "social-read", "soundtrack", "contributor", "confidence:high"],
intensity: 0.78,
}),
bond({
id: "metacrat-bond-daya",
stance: "respect",
target: target("person", "daya", "daya"),
summary: "daya appears in 2021 around general, soundtrack, management, gamedesign, advertising, trailer, UI event, ambient SFX, and political steelmanning contexts.",
claim: "Metacrat appears to read daya as a creative/audio contributor and thoughtful discussion partner whose work should be checked in on directly.",
tension: "Evidence is scattered across roles and needs a focused pass to separate creative contribution from social/political discussion.",
actionImplication: "Remember daya as a multi-surface contributor candidate and mine trailer/audio/management threads for exact bond shape.",
anchors: ["797809090650701834", "824332835233333289", "824511770588741632", "803404302693171211"],
tags: ["person", "social-read", "contributor", "soundtrack", "confidence:medium"],
intensity: 0.68,
}),
bond({
id: "metacrat-bond-chicken",
stance: "fondness",
target: target("person", "chicken", "Chicken"),
summary: "Chicken is a recurring 2021-2022 general/development room presence, often near Metacrat's venting, memes, and shared technical frustration.",
claim: "Metacrat appears to read Chicken as a familiar casual-room peer who can share reactions and tolerate heat.",
tension: "Much of the evidence is proximity to venting, so infer affect cautiously.",
actionImplication: "Treat Chicken as a recurring familiar social presence and avoid overclaiming project authority without focused anchors.",
anchors: ["814200261257330719", "814200675156230144", "archive-cooccurrence:chicken"],
tags: ["person", "social-read", "casual-peer", "confidence:medium"],
intensity: 0.62,
}),
bond({
id: "metacrat-bond-deleted-user-456226577798135808",
stance: "attachment",
target: target("person", "deleted-user-456226577798135808", "Deleted User 456226577798135808"),
summary: "A deleted user appears across 2018-2023 general/development/concepts/therapy contexts and around early recruitment and support conversations.",
claim: "Metacrat likely had a significant early-community bond here, but the deleted identity requires cautious, evidence-bounded handling.",
tension: "The user is deleted and some contexts are therapy-adjacent; do not reconstruct private identity from archive fragments.",
actionImplication: "Preserve only role/interaction patterns until a focused public-context pass can safely identify durable lessons.",
anchors: ["795462469736464426", "1020712342947905577", "1025419576688791702", "archive-cooccurrence:deleted-user-456226577798135808"],
tags: ["person", "social-read", "deleted-user", "support", "confidence:medium", "sensitivity:high"],
intensity: 0.7,
}),
bond({
id: "metacrat-bond-sister-public",
stance: "attachment",
target: target("person", "metacrat-sister-public", "Metacrat sister, public archive references"),
summary: "Public references show a high-intensity sibling bond: promotion/support, conflict around being judged without understanding, role assignment, and practical design feedback.",
claim: "Metacrat appears to read his sister as emotionally significant, capable of practical judgment, and also able to hurt him sharply when he feels misunderstood.",
tension: "This is family-adjacent and partially private; preserve only public interaction lessons and avoid identity reconstruction.",
actionImplication: "Remember the public pattern: trusted/practical eye plus high-sensitivity misrecognition surface.",
anchors: ["564516035189932032", "564740309490204682", "569746207249793035", "773758618922647602"],
tags: ["person", "social-read", "family-public", "sensitivity:high", "confidence:medium"],
intensity: 0.84,
}),
bond({
id: "metacrat-bond-first-merged-pr-contributor",
stance: "respect",
target: target("person", "contributor-764913267235618876", "Contributor 764913267235618876"),
summary: "A 2021 contributor is publicly credited with the first merged pull request and welcomed into the soundtrack/team structure.",
claim: "Metacrat reads this contributor as a concrete proof that GameCult can accept real external work.",
tension: "The archive identifier is numeric here; avoid over-personalizing before a focused pass recovers the public name/context.",
actionImplication: "Preserve first-PR contributor as a milestone bond: contribution changes the organization from idea to shared machine.",
anchors: ["820039035137294426", "810917454745829406", "821422384883433483", "815608268444401705"],
tags: ["person", "social-read", "contributor", "pull-request", "confidence:high"],
intensity: 0.78,
}),
bond({
id: "metacrat-bond-digital-painting-contributor",
stance: "respect",
target: target("person", "contributor-403295789587365909", "Digital painting contributor 403295789587365909"),
summary: "A digital-painting/narrative contributor is described as able to save the project from lack of digital painting and as great at a relevant style.",
claim: "Metacrat reads this person as an art-side capability holder whose style can anchor visual/narrative work.",
tension: "The current evidence is role/skill-focused rather than emotional.",
actionImplication: "Preserve as an art capability bond and mine website/narrative contexts before adding deeper affect.",
anchors: ["743474530546352139", "879432117648502824", "879435248142790706", "749833564274819082"],
tags: ["person", "social-read", "artist", "contributor", "confidence:medium"],
intensity: 0.66,
}),
];
for (const entry of bonds) upsertById(doc.affect.socialBonds, entry);
const reads = [
statusRead({
id: "metacrat-status-memory-bank-too-thin",
status: "challenged",
target: target("system", "metacrat-persona-memory-bank", "Metacrat Persona memory bank"),
summary: "The earlier ten-memory draft was correctly challenged as too thin for seven years of public interaction.",
claim: "Persona memory must include relationship episodes and social reads, not only traits.",
tension: "Completeness pressure can become transcript hoarding.",
actionImplication: "Keep expanding through source-grounded counterparty clusters.",
anchors: ["project:current-user-correction-2026-06-05"],
tags: ["persona", "social-read"],
intensity: 0.96,
}),
statusRead({
id: "metacrat-status-harm-correction-surprise-risk",
status: "challenged",
target: target("person", "birgittesilverbow", "Birgitte correction"),
summary: "Unexpected harm correction can trigger explanation, identity defense, and topic routing.",
claim: "Intent is not enough when a harmful trope lands in the room.",
tension: "Shame can either teach repair or freeze into defensiveness.",
actionImplication: "Use correction as a stop signal: impact, thanks, repair, then discussion.",
anchors: ["1021851942508560384", "1021854902823170140"],
tags: ["interaction", "harm-repair", "social-read"],
intensity: 0.92,
}),
statusRead({
id: "metacrat-status-founder-overload-risk",
status: "threatened",
target: target("self", "single-body-project-load", "Single-body project load"),
summary: "Collective-language projects often still lean on one overloaded person.",
claim: "Aspirational organisms need real distributed labor.",
tension: "Plural language can hide bottleneck and burnout.",
actionImplication: "Name workload truth and recruit specific missing organs.",
anchors: ["1400205122839117917", "1019748840292749433"],
tags: ["capacity", "social-read"],
intensity: 0.86,
}),
];
for (const entry of reads) upsertById(doc.affect.statusReads, entry);
const stances = [
stance({
id: "metacrat-stance-impact-before-intent-defense",
doctrine: "harm_repair",
target: target("concept", "impact-before-intent", "Impact before intent"),
summary: "When harmful language is called out, impact and repair outrank intent explanation.",
claim: "Intent can matter later, but first the room needs safety, acknowledgement, and changed language.",
tension: "Metacrat can intellectualize quickly under surprise.",
actionImplication: "Thank the corrector, repair, and only then discuss nuance if useful.",
anchors: ["1021851942508560384", "1021854902823170140"],
tags: ["harm-repair", "social-read"],
intensity: 0.92,
valence: 0.16,
}),
stance({
id: "metacrat-stance-social-read-is-persona-state",
doctrine: "persona_memory",
target: target("system", "metacrat-significant-interaction-ledger", "Metacrat significant interaction ledger"),
summary: "Social reads, bonds, and significant episodes are core Persona state.",
claim: "A person-shaped memory without relationships is an abstraction wearing a name tag.",
tension: "Inferred reads must remain source-grounded and confidence-bounded.",
actionImplication: "Preserve counterpart, bond, inferred read, episode, repair lesson, and sensitivity boundary.",
anchors: ["project:current-user-correction-2026-06-05"],
tags: ["persona", "social-read", "memory-standard"],
intensity: 0.94,
valence: 0.36,
}),
];
for (const entry of stances) upsertById(doc.affect.doctrineStances, entry);
doc.affect.moodDimensions = [
...(doc.affect.moodDimensions || []).filter((entry) => entry.name !== "embarrassment_learning"),
{
name: "embarrassment_learning",
value: 0.74,
source: "User explicitly asked to preserve embarrassing significant interactions as future-steering social memory.",
updatedAt: now,
},
];
fs.writeFileSync(importPath, JSON.stringify(doc, null, 2) + "\n");
console.log(JSON.stringify({
memories: doc.thoughtMemory.memories.length,
needs: doc.affect.needs.length,
socialBonds: doc.affect.socialBonds.length,
statusReads: doc.affect.statusReads.length,
doctrineStances: doc.affect.doctrineStances.length,
}, null, 2));

View file

@ -0,0 +1,358 @@
const path = require("node:path");
const { CultCache, SingleFileMessagePackBackingStore } = require("cultcache-ts");
const core = require("../packages/core/dist/index.js");
const SOURCE_PATH = path.resolve("notes/personas/metacrat.persona_state.import.json");
const TARGET_PATH = path.resolve("state/personas/metacrat.cc");
function compact(value) {
if (Array.isArray(value)) {
return value.map(compact);
}
if (!value || typeof value !== "object") {
return value;
}
return Object.fromEntries(
Object.entries(value)
.filter(([, child]) => child !== undefined)
.map(([key, child]) => [key, compact(child)]),
);
}
function readImport() {
delete require.cache[SOURCE_PATH];
return require(SOURCE_PATH);
}
function timestampOf(doc) {
return doc.updatedAt || doc.provenance?.exportedAt || new Date().toISOString();
}
function activationCategory(input = {}) {
return Object.fromEntries(
Object.entries(input).map(([key, value]) => [
key,
{
mean: value.mean,
plasticity: value.plasticity,
current_activation: value.currentActivation ?? value.current_activation ?? value.mean,
},
]),
);
}
function targetOf(target = {}) {
const allowed = new Set(["archive", "lore", "person", "repo", "room", "self", "system"]);
const kind = allowed.has(target.kind)
? target.kind
: target.kind === "project"
? "repo"
: target.kind === "community"
? "room"
: "system";
return compact({
kind,
id: String(target.id || "unknown-target"),
label: target.label,
});
}
function anchorRefs(entry = {}) {
return (entry.extensions?.anchors || []).map((ref) => ({ ref: String(ref) }));
}
function memoryKind(entry) {
const tags = new Set(entry.tags || []);
if (tags.has("interaction") || tags.has("repair") || tags.has("support")) {
return "room_observation";
}
if (
tags.has("persona") ||
tags.has("governance") ||
tags.has("agents") ||
tags.has("consent") ||
tags.has("memory-standard")
) {
return "identity_seam";
}
if (tags.has("method")) {
return "distilled_seam";
}
return "project_seam";
}
function memoryOf(entry) {
return compact({
memoryId: entry.id,
kind: memoryKind(entry),
target: targetOf(entry.target),
summary: entry.summary,
claim: entry.claim,
question: entry.question,
tension: entry.tension,
actionImplication: entry.actionImplication,
anchorRefs: anchorRefs(entry),
evidenceRefs: [],
createdAt: entry.createdAt,
updatedAt: entry.updatedAt,
tags: entry.tags || [],
});
}
function incubationOf(entry) {
return compact({
threadId: entry.id,
target: targetOf(entry.target),
topic: entry.summary,
summary: entry.question || entry.summary,
supportMemoryIds: entry.supportMemoryIds || [],
anchorRefs: anchorRefs(entry),
evidenceRefs: [],
maturation: entry.maturation ?? 0.35,
status: entry.status || "active",
createdAt: entry.createdAt,
updatedAt: entry.updatedAt,
});
}
function pressureOf(entry) {
return compact({
pressureId: entry.id,
kind: entry.kind || "active_tension",
status: entry.status || "active",
target: targetOf(entry.target),
summary: entry.summary,
claim: entry.claim,
question: entry.question,
tension: entry.tension,
actionImplication: entry.actionImplication,
intensity: entry.intensity ?? 0.5,
anchorRefs: anchorRefs(entry),
evidenceRefs: [],
sourceMemoryIds: entry.sourceMemoryIds || [],
createdAt: entry.createdAt,
updatedAt: entry.updatedAt,
tags: entry.tags || [],
});
}
function candidateOf(entry) {
return compact({
interventionId: entry.id,
kind: "identity_crystallization",
status: "deferred",
target: targetOf(entry.target),
summary: entry.summary,
draft: entry.rationale || entry.summary,
priority: entry.urgency ?? 0.5,
mustEventuallyShare: false,
createdAt: entry.createdAt,
updatedAt: entry.updatedAt,
tags: [
"candidate-action",
...(entry.constraints || []).map((constraint) => `constraint:${constraint.slice(0, 40)}`),
],
});
}
function affectNeedOf(entry) {
return compact({
needId: entry.id,
kind: entry.kind || "recognition",
status: entry.status || "active",
target: targetOf(entry.target),
summary: entry.summary,
claim: entry.claim,
question: entry.question,
tension: entry.tension,
actionImplication: entry.actionImplication,
intensity: entry.intensity ?? 0.5,
valence: entry.valence ?? 0,
anchorRefs: anchorRefs(entry),
evidenceRefs: [],
sourceMemoryIds: entry.sourceMemoryIds || [],
createdAt: entry.createdAt,
updatedAt: entry.updatedAt,
tags: entry.tags || [],
});
}
function socialBondOf(entry) {
const lastEvidence = entry.lastEvidence || {};
const stanceAliases = {
attachment: "attachment",
respect: "respect",
trust: "trust",
protectiveness: "protectiveness",
fondness: "fondness",
collaborator: "trust",
friend: "attachment",
mentor: "protectiveness",
};
const rawStance = entry.stance || entry.extensions?.stance || entry.relationshipKind;
return compact({
bondId: entry.id || entry.bondId,
stance: stanceAliases[rawStance] || "respect",
status: entry.status || "active",
target: targetOf(entry.target || entry.object),
summary: entry.summary,
claim: entry.claim || lastEvidence.claim || entry.summary,
tension:
typeof entry.tension === "string"
? entry.tension
: lastEvidence.tension || "Relationship memory needs periodic review as the archive expands.",
actionImplication:
entry.actionImplication || lastEvidence.actionImplication || "Preserve the relationship lesson when acting in this domain.",
intensity: entry.intensity ?? 0.5,
anchorRefs: anchorRefs(entry.extensions ? entry : lastEvidence),
evidenceRefs: [],
createdAt: entry.createdAt || timestampOf({}),
updatedAt: entry.updatedAt || timestampOf({}),
tags: entry.tags || entry.extensions?.tags || [],
});
}
function statusReadOf(entry) {
const lastEvidence = entry.lastEvidence || {};
const allowed = new Set([
"favored",
"neglected",
"pampered",
"bypassed",
"blocked",
"challenged",
"ignored",
"consulted",
"threatened",
"admired",
]);
const rawStatus = entry.extensions?.localStatus || entry.status || entry.statusKind || "challenged";
return compact({
readId: entry.id || entry.readId,
status: allowed.has(rawStatus) ? rawStatus : "challenged",
target: targetOf(entry.target),
summary: entry.summary,
claim: entry.claim || lastEvidence.claim || entry.summary,
tension: entry.tension || lastEvidence.tension || "Status read may be provisional and source-bound.",
actionImplication:
entry.actionImplication || lastEvidence.actionImplication || "Use this read as a prompt for inspection, not as final truth.",
intensity: entry.intensity ?? 0.5,
anchorRefs: anchorRefs(entry.extensions ? entry : lastEvidence),
evidenceRefs: [],
createdAt: entry.createdAt || timestampOf({}),
updatedAt: entry.updatedAt || timestampOf({}),
tags: entry.tags || entry.extensions?.tags || [],
});
}
function doctrineStanceOf(entry) {
return compact({
stanceId: entry.id || entry.stanceId,
doctrine: entry.doctrine || entry.extensions?.doctrine || entry.stanceKind || "doctrine",
status: entry.status || "active",
target: targetOf(entry.target),
summary: entry.summary,
claim: entry.claim || entry.principle,
question: entry.question,
tension: entry.tension || entry.extensions?.tension || "Doctrine must remain tied to live substrate and future action.",
actionImplication: entry.actionImplication,
intensity: entry.intensity ?? 0.5,
valence: entry.valence ?? entry.extensions?.valence ?? 0,
anchorRefs: anchorRefs(entry),
evidenceRefs: [],
sourceMemoryIds: entry.sourceMemoryIds || [],
createdAt: entry.createdAt || timestampOf({}),
updatedAt: entry.updatedAt,
tags: entry.tags || entry.extensions?.tags || [],
});
}
function socialBiasOf(entry) {
const aliases = {
steelman_before_rebuke: "trust_baseline",
repair_after_overheat: "grievance_retention",
invite_participation: "trust_baseline",
};
return {
...entry,
name: aliases[entry.name] || entry.name,
};
}
async function main() {
const doc = readImport();
const updatedAt = timestampOf(doc);
const state = core.createEmptyVoidSelfState({
identity: {
agentId: doc.personaId,
publicName: doc.publicName,
publicDescription: doc.publicDescription,
},
});
state.selfProfile.publicDescription = doc.publicDescription;
state.selfProfile.privateNotes = doc.privateNotes || [];
state.selfProfile.values = doc.values || [];
state.selfProfile.activationProfile = {
underlyingOrganization: activationCategory(doc.activationProfile?.underlyingOrganization),
stableDispositions: activationCategory(doc.activationProfile?.stableDispositions),
behavioralDimensions: activationCategory(doc.activationProfile?.behavioralDimensions),
presentationStrategy: activationCategory(doc.activationProfile?.presentationStrategy),
voiceStyle: activationCategory(doc.activationProfile?.voiceStyle),
situationalState: activationCategory(doc.activationProfile?.situationalState),
};
state.selfProfile.updatedAt = updatedAt;
state.thoughtMemory.shortTerm = (doc.thoughtMemory?.shortTerm || []).map(memoryOf);
state.thoughtMemory.memories = (doc.thoughtMemory?.memories || []).map(memoryOf);
state.thoughtMemory.incubation = (doc.thoughtMemory?.incubation || []).map(incubationOf);
state.thoughtMemory.updatedAt = updatedAt;
state.agencyPressure.pressures = (doc.agencyPressure?.pressures || []).map(pressureOf);
state.agencyPressure.updatedAt = updatedAt;
state.candidateInterventions.interventions = (doc.candidateActions?.actions || []).map(candidateOf);
state.candidateInterventions.updatedAt = updatedAt;
state.personaAffect.needs = (doc.affect?.needs || []).map(affectNeedOf);
state.personaAffect.socialBonds = (doc.affect?.socialBonds || []).map(socialBondOf);
state.personaAffect.statusReads = (doc.affect?.statusReads || []).map(statusReadOf);
state.personaAffect.moodDimensions = doc.affect?.moodDimensions || [];
state.personaAffect.socialBiases = (doc.affect?.socialBiases || []).map(socialBiasOf);
state.personaAffect.doctrineStances = (doc.affect?.doctrineStances || []).map(doctrineStanceOf);
state.personaAffect.updatedAt = updatedAt;
const cache = CultCache.builder()
.withRegistry(core.voidSelfStateDocumentRegistry)
.withGenericStore(new SingleFileMessagePackBackingStore(TARGET_PATH))
.build();
await cache.putGlobal(core.voidSelfProfileDocument, state.selfProfile);
await cache.putGlobal(core.voidModerationCursorDocument, state.moderationCursor);
await cache.putGlobal(core.voidSpeechReceiptsDocument, state.speechReceipts);
await cache.putGlobal(core.voidThoughtMemoryDocument, state.thoughtMemory);
await cache.putGlobal(core.voidScheduledRuntimeDocument, state.scheduledRuntime);
await cache.putGlobal(core.voidAgencyPressureDocument, state.agencyPressure);
await cache.putGlobal(core.voidCandidateInterventionsDocument, state.candidateInterventions);
await cache.putGlobal(core.voidPersonaAffectDocument, state.personaAffect);
console.log(JSON.stringify({
targetPath: TARGET_PATH,
values: state.selfProfile.values.length,
memories: state.thoughtMemory.memories.length,
shortTerm: state.thoughtMemory.shortTerm.length,
incubation: state.thoughtMemory.incubation.length,
pressures: state.agencyPressure.pressures.length,
candidates: state.candidateInterventions.interventions.length,
affectNeeds: state.personaAffect.needs.length,
socialBonds: state.personaAffect.socialBonds.length,
statusReads: state.personaAffect.statusReads.length,
doctrineStances: state.personaAffect.doctrineStances.length,
}, null, 2));
}
main().catch((error) => {
console.error(error);
process.exit(1);
});