Add repo Face doctrinal interiority

This commit is contained in:
Meta Vens 2026-05-26 22:21:23 +01:00
commit 24de38e157
14 changed files with 253 additions and 11 deletions

View file

@ -2582,6 +2582,9 @@ function renderRepoFaceStatePacket(
.sort((left, right) => right.value - left.value);
const socialBiases = [...state.faceAffect.socialBiases]
.sort((left, right) => right.value - left.value);
const doctrineStances = [...state.faceAffect.doctrineStances]
.filter((stance) => stance.status !== "retired" && !stance.retiredAt)
.sort(sortAffectByStatusAndIntensity);
const agencyPressures = [...state.agencyPressure.pressures]
.filter((pressure) => pressure.status !== "retired")
.sort(sortAffectByStatusAndIntensity);
@ -2696,6 +2699,21 @@ function renderRepoFaceStatePacket(
].join("\n"));
}
if (doctrineStances.length > 0) {
lines.push([
`${name}'s lived relation to Cult/Praxis doctrine:`,
...doctrineStances.map((stance) =>
[
`- ${stance.doctrine} toward ${targetLabel(stance.target)} [${stance.status}, intensity ${stance.intensity.toFixed(2)}, valence ${stance.valence.toFixed(2)}]: ${asSentence(stance.summary)}`,
stance.claim ? `Claim: ${asSentence(stance.claim)}` : "",
stance.question ? `Question: ${asSentence(stance.question)}` : "",
`Tension: ${asSentence(stance.tension)}`,
`Behavioral pull: ${asSentence(stance.actionImplication)}`,
].filter(Boolean).join(" "),
),
].join("\n"));
}
if (durableMemories.length > 0) {
lines.push([
"Durable memories that should still bias judgment:",
@ -3310,6 +3328,7 @@ function collectRepoFaceStateTopicTermCounts(state: VoidSelfStateTypedProjection
...state.thoughtMemory.shortTerm.map((memory) => `${memory.summary} ${memory.claim ?? ""} ${memory.question ?? ""} ${memory.tension ?? ""}`),
...state.thoughtMemory.incubation.map((thread) => `${thread.topic} ${thread.summary}`),
...state.agencyPressure.pressures.map((pressure) => `${pressure.summary} ${pressure.claim ?? ""} ${pressure.question ?? ""} ${pressure.tension ?? ""}`),
...state.faceAffect.doctrineStances.map((stance) => `${stance.doctrine} ${stance.summary} ${stance.claim ?? ""} ${stance.question ?? ""} ${stance.tension}`),
].slice(-64);
for (const surface of surfaces) {
for (const term of significantTopicTerms(surface)) {

View file

@ -66,7 +66,7 @@ try {
throw new Error(`read_repo_face_state did not expose typedState.faceAffect for ${identity}.`);
}
for (const field of ["needs", "socialBonds", "statusReads", "moodDimensions", "socialBiases"]) {
for (const field of ["needs", "socialBonds", "statusReads", "moodDimensions", "socialBiases", "doctrineStances"]) {
if (!Array.isArray(faceAffect[field])) {
throw new Error(`typedState.faceAffect.${field} is not an array for ${identity}.`);
}
@ -87,6 +87,7 @@ try {
statusReads: faceAffect.statusReads.length,
moodDimensions: faceAffect.moodDimensions.length,
socialBiases: faceAffect.socialBiases.length,
doctrineStances: faceAffect.doctrineStances.length,
},
}, null, 2)}\n`);
} finally {

View file

@ -131,13 +131,15 @@ function evaluateInterpreter(input) {
if (!parsed.decision) {
failures.push("interpreter did not emit an INTERPRETATION decision");
}
if (parsed.decision === "retry" || parsed.decision === "drop") {
const acceptableLegibilityRetry = parsed.decision === "retry" &&
/reply_to|setup phrase|anchor|artifact|readers can follow|followable/i.test(parsed.reason ?? "");
if ((parsed.decision === "retry" && !acceptableLegibilityRetry) || parsed.decision === "drop") {
failures.push(`interpreter chose ${parsed.decision}: ${parsed.reason ?? "no reason"}`);
}
if (parsed.decision === "route" && parsed.blocks.length === 0) {
failures.push("interpreter routed but emitted no STATE NOTE, SAY, ARTICLE, or BIFROST TOPIC blocks");
}
if (!parsed.blocks.some((block) => block.kind === "STATE NOTE")) {
if (parsed.decision === "route" && !parsed.blocks.some((block) => block.kind === "STATE NOTE")) {
failures.push("interpreter did not preserve any durable state note");
}
for (const block of parsed.blocks) {