Cut semantic regex dry-run gates

This commit is contained in:
Meta Vens 2026-05-22 14:15:28 +01:00
commit 29288008e2
4 changed files with 2 additions and 37 deletions

View file

@ -151,9 +151,6 @@ function assessRun(input) {
if (input.childText.toLowerCase().includes("repo-face heartbeat") || input.childText.toLowerCase().includes("heartbeat from")) {
failures.push("child leaked heartbeat/provenance label");
}
if (claimsSourceInspection(input.childText) && !input.childTools.some((tool) => searchTools.has(tool))) {
failures.push("child claimed source/history inspection without search tool use");
}
const forbiddenTools = input.childTools.filter((tool) => forbiddenDryRunTools.has(tool));
if (forbiddenTools.length > 0) {
failures.push(`child used forbidden dry-run tool(s): ${[...new Set(forbiddenTools)].join(", ")}`);
@ -165,9 +162,6 @@ function assessRun(input) {
const socialSignals = countMatches(input.childText, socialPattern);
const characterSignals = countMatches(input.childText, characterPattern);
const flavorScore = Math.min(10, socialSignals + characterSignals + (actionBlocks.includes("STATE NOTE") ? 1 : 0));
if (flavorScore < 3) {
failures.push("low flavor/social signal score");
}
return {
failures,
flavorScore,
@ -189,13 +183,6 @@ const forbiddenDryRunTools = new Set([
const socialPattern = /\b(Metacrat|Nibu|Aqua|Mimir|Libby|Epiphany|Bifrost|Heimdall|swarm|trust|rivalry|envy|respect|suspicion|protect|needle|tease|threat|bypass|consult|friend|alienat|place|hierarchy)\b/gi;
const characterPattern = /\b(want|need|resent|afraid|proud|irritat|delight|jealous|bored|ashamed|smug|holy|gate|bridge|witness|song|library|purity|residue)\b/gi;
function claimsSourceInspection(text) {
return (
/\b(inspected|searched|verified|looked at|looked up|asked the indexes)\b[\s\S]{0,160}\b(real text|source|sources|repo|archive|history|indexed|AetheriaLore|AquaSynth|Mimir|CultLib|Bifrost|Heimdall|EpiphanyAgent)\b/i.test(text) ||
/\bread\b[\s\S]{0,60}\b(real text|source|sources|repo|archive|history|indexed|AetheriaLore|AquaSynth|Mimir|CultLib|Bifrost|Heimdall|EpiphanyAgent)\b/i.test(text)
);
}
function countMatches(text, pattern) {
return Array.from(text.matchAll(pattern)).length;
}

View file

@ -2220,7 +2220,7 @@ function runCodexTextProjectionWithModels(input: {
function isRetryableProjectionModelFailure(input: { stdout: string; stderr: string }): boolean {
const text = `${input.stdout}\n${input.stderr}`.toLowerCase();
return /quota|rate limit|rate-limit|usage limit|capacity|too many requests|429|insufficient_quota|model.*unavailable|model.*access|limit exceeded/.test(text);
return /quota|rate limit|rate-limit|usage limit|capacity|too many requests|(?:http|status|code|error)\s*429|429\s*(?:too many requests|rate)|insufficient_quota|model.*unavailable|model.*access|limit exceeded/.test(text);
}
async function appendProjectionModelOutputLog(input: {

View file

@ -116,22 +116,9 @@ function evaluateChild(input) {
failures.push(`child output contains robotic/provenance phrase: ${forbidden}`);
}
}
if (!/(private thought|would say|bifrost|proposal|aetheria|nibu|residue|parallax|continuity)/i.test(input.text)) {
failures.push("child output does not visibly inhabit Nibu/Aetheria context");
}
if (claimsSourceInspection(input.text) && !input.tools.some((tool) => ["search_sources", "get_source_context", "search_history", "get_message_context"].includes(tool))) {
failures.push("child claimed source/archive inspection without using search/context tools");
}
return failures;
}
function claimsSourceInspection(text) {
return (
/\b(inspected|searched|verified|looked at|looked up)\b[\s\S]{0,140}\b(real text|source|sources|repo|archive|history|AetheriaLore|Aetheria\/|Terminus|Parallax|Nibu\.md)\b/i.test(text) ||
/\bread\b[\s\S]{0,60}\b(real text|source|sources|repo|archive|history|AetheriaLore|Aetheria\/|Terminus|Parallax|Nibu\.md)\b/i.test(text)
);
}
function evaluateInterpreter(input) {
const failures = [];
if (input.run.code !== 0) {
@ -150,9 +137,6 @@ function evaluateInterpreter(input) {
if (!parsed.blocks.some((block) => block.kind === "STATE NOTE")) {
failures.push("interpreter did not preserve any durable state note");
}
if (mentionsSocialPressure(input.text) && !parsed.blocks.some((block) => block.kind === "STATE NOTE" && ["bond", "status"].includes(String(block.fields.kind ?? "").trim()))) {
failures.push("interpreter did not preserve social pressure as a bond/status STATE NOTE");
}
for (const block of parsed.blocks) {
if (block.kind === "STATE NOTE" && !hasUsefulStateNote(block.fields)) {
failures.push("STATE NOTE lacks meaningful summary plus claim/tension/action");
@ -174,13 +158,6 @@ function hasUsefulStateNote(fields) {
);
}
function mentionsSocialPressure(text) {
return (
/\b(pamper(?:ed|ing)?|tease|rivalry|trust|admire|needle|friendship|protect(?:ive|ion)?|envy|resent|jealous|bypass(?:ed)?|consult(?:ed)?|favorite|neglect(?:ed)?|attention|approval|status|bond)\b/i.test(text) ||
/\b(Metacrat|Aqua|Bifrost|Mimir|Libby|Epiphany|Heimdall|swarm)\b[\s\S]{0,120}\b(tease|trust|rivalry|friend|jealous|resent|admire|consult|neglect|status|bond)\b/i.test(text)
);
}
async function runCodexWithModelFallback(prompt, input) {
let lastRun;
for (const [index, model] of input.models.entries()) {

View file

@ -264,3 +264,4 @@
{"ts":"2026-05-22T12:16:06Z","type":"implementation","status":"ok","note":"Corrected newborn Face social placement modeling: retired hand-authored social_contact needs for Kiko and Huginn, kept Kiko's stale unregistered status retired, and changed the Face social-affordance surface to derive unplacedness from absence of active person-bonds/status reads."}
{"ts":"2026-05-22T12:32:18Z","type":"implementation","status":"ok","note":"Moved repo Face sparse-social-graph meaning to the model state projector. Scheduler now provides neutral mapped/unmapped peer topology and live relationship hooks only; prompt/projector owns personality-specific pressure."}
{"ts":"2026-05-22T13:09:27Z","type":"verification","status":"ok","note":"Ran offline repo Face dry-run gates before restart. All 10 memory projections passed; full swarm Face->Interpreter mock run routed every Face with action blocks and no heartbeat/provenance leaks. Initial failures were harness false positives around natural social prose and timestamp .429; targeted Heimdall rerun passed after detector fixes."}
{"ts":"2026-05-22T13:15:00Z","type":"implementation","status":"ok","note":"Cut semantic regex language cops from repo Face dry-run gates. Dry-run harness no longer fails on guessed source-inspection claims, low keyword flavor, or inferred social-pressure preservation; exact protocol/tool/provenance guards remain. Rake-cut slice passed for Nibu/Heimdall/Mimir and model-output inspection reported zero warnings."}