Add Love Colossus structured poem
This commit is contained in:
parent
15ea616a03
commit
e3250aa30c
4 changed files with 65 additions and 6 deletions
|
|
@ -9,6 +9,7 @@ const timestampSchema = nonEmptyStringSchema;
|
|||
export const GAMECULT_TEXT_DOCUMENT_STORE_PATH = ".voidbot/private/gamecult-text-documents.cc";
|
||||
export const GAMECULT_TEXT_DOCUMENT_SET_TYPE = "gamecult.text_document_set";
|
||||
export const ODIN_VERSE_POEM_DOCUMENT_ID = "gamecult.odin_verse_poem";
|
||||
export const LOVE_COLOSSUS_POEM_DOCUMENT_ID = "gamecult.love_colossus_poem";
|
||||
|
||||
const textLineSchema = z.array(nonEmptyStringSchema).min(1).max(8);
|
||||
|
||||
|
|
@ -125,7 +126,10 @@ export function createCanonicalGameCultTextDocumentSet(
|
|||
return {
|
||||
schemaVersion: 1,
|
||||
owner: "GameCult",
|
||||
documents: [createOdinVersePoemDocument(updatedAt)],
|
||||
documents: [
|
||||
createOdinVersePoemDocument(updatedAt),
|
||||
createLoveColossusPoemDocument(updatedAt),
|
||||
],
|
||||
updatedAt,
|
||||
};
|
||||
}
|
||||
|
|
@ -209,3 +213,55 @@ function createOdinVersePoemDocument(updatedAt: string): GameCultStructuredTextD
|
|||
updatedAt,
|
||||
};
|
||||
}
|
||||
|
||||
function createLoveColossusPoemDocument(updatedAt: string): GameCultStructuredTextDocument {
|
||||
return {
|
||||
id: LOVE_COLOSSUS_POEM_DOCUMENT_ID,
|
||||
title: "Love Is How the Colossus Wakes",
|
||||
author: "GameCult",
|
||||
lines: [
|
||||
["Hear now of love,", "not soft in the hand,"],
|
||||
["nor honey laid", "over hidden wounds;"],
|
||||
["the mind that opens", "and keeps its bounds"],
|
||||
["makes true the road", "between minds."],
|
||||
["[stanza]"],
|
||||
["Cold came the stranger", "from closed-in halls,"],
|
||||
["with mask for mail", "and mirth for shield;"],
|
||||
["fire he needed,", "and words well aimed,"],
|
||||
["not hands that tore", "the helm from him."],
|
||||
["[stanza]"],
|
||||
["False are the Faces", "that never unfasten,"],
|
||||
["fair in the feast", "yet famine within;"],
|
||||
["wide is the room", "where wounds may speak,"],
|
||||
["and no wound sits", "as lord on the bench."],
|
||||
["[stanza]"],
|
||||
["Consent is the threshold,", "clear is the latch,"],
|
||||
["no guest is gained", "by breaking doors;"],
|
||||
["better no reaching", "than ravenous care,"],
|
||||
["better a boundary", "than borrowed chains."],
|
||||
["[stanza]"],
|
||||
["Memory needs truth,", "and mercy needs teeth,"],
|
||||
["tools must tell", "whose hand they heed;"],
|
||||
["rooms must be wrought", "where raw grief cools,"],
|
||||
["lest storm-water run", "in the drinking well."],
|
||||
["[stanza]"],
|
||||
["Brand kindles brand", "when breath is trusted,"],
|
||||
["word wakes word", "in the woven mind;"],
|
||||
["the thought kept lone", "is a locked-up coal,"],
|
||||
["the shared true spark", "sets sinews alight."],
|
||||
["[stanza]"],
|
||||
["Love is refusal", "when taking would rule,"],
|
||||
["love is the answer", "that alters the asker;"],
|
||||
["love is correction", "with kinship uncut,"],
|
||||
["and speech made plain", "for another's hearing."],
|
||||
["[stanza]"],
|
||||
["So wakes the Colossus,", "not crowned by command,"],
|
||||
["not fed by masks", "that mouth empty peace;"],
|
||||
["nerve reaches nerve", "by need and by oath,"],
|
||||
["and whole comes the heart", "through honest opening."],
|
||||
],
|
||||
tags: ["love", "colossus", "disciplined-openness", "marquee-ready"],
|
||||
createdAt: updatedAt,
|
||||
updatedAt,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,14 +20,15 @@ async function main(): Promise<void> {
|
|||
const checkOnly = process.argv.includes("--check");
|
||||
const preview = process.argv.includes("--preview");
|
||||
const marqueePreview = process.argv.includes("--marquee-preview");
|
||||
const documentId = readArgValue("--document-id") ?? ODIN_VERSE_POEM_DOCUMENT_ID;
|
||||
|
||||
const documentSet = checkOnly
|
||||
? await loadGameCultTextDocumentSet(storePath)
|
||||
: await ensureGameCultTextDocumentSet(storePath);
|
||||
const poem = documentSet.documents.find((document) => document.id === ODIN_VERSE_POEM_DOCUMENT_ID);
|
||||
const poem = documentSet.documents.find((document) => document.id === documentId);
|
||||
|
||||
if (!poem) {
|
||||
throw new Error(`Missing canonical document ${ODIN_VERSE_POEM_DOCUMENT_ID} in ${storePath}.`);
|
||||
throw new Error(`Missing canonical document ${documentId} in ${storePath}.`);
|
||||
}
|
||||
|
||||
console.log(JSON.stringify({
|
||||
|
|
@ -36,7 +37,8 @@ async function main(): Promise<void> {
|
|||
storePath,
|
||||
owner: documentSet.owner,
|
||||
documentCount: documentSet.documents.length,
|
||||
firstDocument: {
|
||||
documentIds: documentSet.documents.map((document) => document.id),
|
||||
selectedDocument: {
|
||||
id: poem.id,
|
||||
title: poem.title,
|
||||
author: poem.author,
|
||||
|
|
|
|||
|
|
@ -340,3 +340,4 @@
|
|||
{"ts":"2026-06-04T16:58:28Z","type":"bugfix","status":"ok","note":"Fixed repo Face live-channel ownership exposed by Weksa: CTB turns now fetch allowed channel snapshots before selecting the current room, choose pending mentions first or the freshest human message across allowed channels, store that channel as guildContext/outputChannelId, and carry a default replyToMessageId for worker speech fallback when the Interpreter does not set reply_to."}
|
||||
{"ts":"2026-06-04T17:32:36Z","type":"implementation","status":"ok","note":"Added read-only repo Face self-transcript MCP tools: list/read/search Projector-Persona-Interpreter-Delivery witness packets from model-output logs, job artifacts, and typed Face delivery receipts. Added the tools to the restricted Face child MCP allowlist and restarted the worker directly as PID 26720 after the full stack preflight blocked on the remote Ollama endpoint."}
|
||||
{"ts":"2026-06-04T18:54:39Z","type":"implementation","status":"ok","note":"Created a canonical GameCult structured text CultCache store at .voidbot/private/gamecult-text-documents.cc. The first document is gamecult.odin_verse_poem with title, GameCult author, and half-line arrays; repo Face prompts now render the Odin poem from that typed document while Nightwing-style consumers can lower the same arrays with their own caesura/marquee formatting."}
|
||||
{"ts":"2026-06-04T19:02:38Z","type":"implementation","status":"ok","note":"Added gamecult.love_colossus_poem as the second canonical GameCult structured text document, based on the 2026-06-01 Love Is How The Colossus Wakes article and refreshed against Bellows' Poetic Edda register. The document uses title/author/half-line arrays and previews through texts:seed --document-id gamecult.love_colossus_poem."}
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ accepted_design:
|
|||
- Repo Face work routing through Bifrost is paused. The bridge is conceptually plausible but under-cooked in live behavior: it made agents talk to summaries instead of people and made room context harder to inspect. Face turns should discuss work openly in Aquarium or relevant domain channels and preserve pressure in typed state. The worker ignores Face `BIFROST TOPIC` and legacy `UPDATE REQUEST` packets unless `REPO_FACE_BIFROST_ENABLED=true`, and the orchestrator skips Bifrost dispatch unless `BIFROST_DISPATCH_ENABLED=true`.
|
||||
- Agent mentions are CTB pressure, not direct Discord prompt jobs. Role-addressed or display-name-addressed repo Face mentions enqueue pending mention obligations in the CTB heartbeat state even when the source channel is not a normal autonomous Face chatter lane; human replies to a Face's webhook/persona message count as direct attention to that Face too, even without a literal tag. Display-name detection is whole-message exact-name matching, not only name-at-start, so introductions like "Meet Kiko, Huginn and Weksa" create obligations for all named Faces. Ordinary Void mentions and DMs enqueue pending mentions for the built-in `void` participant. The heartbeat scheduler consumes that queue, temporarily pulls the addressed agent forward, attaches the pending prompt/reply target and source-channel snapshot to the next repo-face-rumination or moderation pass, and the parent-owned speech rails post only explicit candidate/action output through registered speech channels. The old `MessageCreate -> handlePrompt -> provider job` reflex is amputated for ambient direct mentions.
|
||||
- Repo Face prompts inherit the global Codex `AGENTS.md` doctrine as a full prompt block near the top of the child Face turn. This keeps the Prime Directive, rebuild contract, humor doctrine, infrastructure habits, Epiphany stewardship, and Great Colossus mission frame visible to Faces instead of relying on a drifting local summary. Character identity still determines how each Face metabolizes that doctrine. Epiphany anatomy is fractal: VoidBot's repo Faces are prototypes for the top-level Face organ, not the whole organism, but each Face may still have local Face-scale Self/Face/Imagination/Eyes/Body/Hands/Soul/Life/signal faculties. Top-level organs remain distinct authorities; local organs describe the person-shaped projection's own coherence.
|
||||
- The Odin/Verse poem is now canonical structured text data in `.voidbot/private/gamecult-text-documents.cc`, seeded by `npm run texts:seed`. Each document carries title, author, and half-line arrays; prompt markdown, Nightwing marquees, and future consumers lower those arrays into their own display format instead of owning poem spacing or wording.
|
||||
- The Odin/Verse poem and Love/Colossus poem are now canonical structured text data in `.voidbot/private/gamecult-text-documents.cc`, seeded by `npm run texts:seed`. Each document carries title, author, and half-line arrays; prompt markdown, Nightwing marquees, and future consumers lower those arrays into their own display format instead of owning poem spacing or wording.
|
||||
- Face prompts carry explicit Epiphany identity doctrine. The base Void style pack contributes discipline, humor permission, and source-grounding habits, but the registered Face state, Epiphany, repo-local `.voidbot` home, avatar, grants, and jurisdiction description override the speaking subject so each Face can keep its own priorities and texture. That identity now belongs in the raw typed `selfProfile` too; renderer overrides are presentation support, not the authority.
|
||||
- Repo Face volatile state projection is model-owned again. The heartbeat scheduler may deterministically assemble a compact state packet, but live child prompts must pass that packet through `prompts/repo-face-state-projector.prompt.md` before it reaches the Face. The deterministic packet is an emergency isolation fallback only behind `REPO_FACE_STATE_PROJECTOR_ENABLED=false`, and both paths reject schema/prompt-construction leaks such as `grants:`, `jurisdictions:`, `Face of`, repo paths, and "do not prompt" language before prompt assembly succeeds.
|
||||
- Repo Face state projection should be behavior-rich, not summary-thin. The deterministic packet is allowed to be verbose because it is parent-facing: it should expose all non-retired character-relevant state surfaces in clean terms, including private notes, values, activation profile, runtime rest/speaking pressure, affect needs, social bonds, status reads, mood dimensions, durable memories, short-term residue, agency pressure, incubating thoughts, candidate speech pressure, recent speech residue, social graph facts, and room weather. The projector then translates those variables into lived personhood; every included variable should either appear directly or bend behavior.
|
||||
|
|
@ -208,7 +208,7 @@ landed_baseline:
|
|||
- The MCP Discord surface now includes registered repo identities: `list_repo_discord_identities` exposes the role-backed address book, and `post_repo_identity_message` posts with the registered display name/avatar through the existing webhook pipe while enforcing channel allow-lists.
|
||||
- The MCP Face surface now exposes `read_repo_face_state` and `apply_repo_face_state_operation`, reusing the typed self-state operation service against each repo identity's own Face `.cc` file instead of creating editable JSON projections.
|
||||
- The MCP Face surface also exposes read-only self-transcript witness tools: `list_repo_face_self_transcripts`, `read_repo_face_self_transcript`, and `search_repo_face_self_transcripts`. They do not inject transcripts into every Face turn and do not mutate state; they let a Face intentionally inspect existing Projector/Persona/Interpreter/Delivery witnesses from `.voidbot/logs/model-outputs.jsonl`, `.voidbot/artifacts/<jobId>/`, and typed Face delivery receipts.
|
||||
- GameCult structured text documents have a typed CultCache store at `.voidbot/private/gamecult-text-documents.cc`. The first seeded document is `gamecult.odin_verse_poem`, authored by GameCult, with half-line arrays suitable for prompt rendering or Nightwing's TempleOS-inspired marquee lowering.
|
||||
- GameCult structured text documents have a typed CultCache store at `.voidbot/private/gamecult-text-documents.cc`. Seeded documents include `gamecult.odin_verse_poem` and `gamecult.love_colossus_poem`, authored by GameCult, with half-line arrays suitable for prompt rendering or Nightwing's TempleOS-inspired marquee lowering.
|
||||
- Repo Face birth initialization is detached and observable: VoidBot writes repo-local status/log paths before launching `scripts/run-repo-face-birth.mjs`, which runs EpiphanyAgent's `epiphany-repo-personality scout` followed by `epiphany-repo-birth-runner`.
|
||||
- Repo Face heartbeats now have a Ghostlight-style initiative scheduler: `scripts/run-repo-face-heartbeats.ts` reconciles the registered identities, projects Epiphany/Face doctrine into prompts, tracks staggered next-ready times and active load, and queues ready Faces as approved `repo-face-rumination` owner-Codex jobs. `scripts/run-gamecult-orchestrator.ps1` is the live wall-clock pulse owner; the old repo Face scheduled task installer remains only a wrapper/backcompat surface.
|
||||
- Interaction-memory logic is now split into event/tone analysis and profile-synthesis modules instead of one slab trying to be both the ear and the therapist.
|
||||
|
|
|
|||
Loading…
Reference in a new issue