diff --git a/src/queue-intelligence.ts b/src/queue-intelligence.ts index b2b28b2959..fd639c5181 100644 --- a/src/queue-intelligence.ts +++ b/src/queue-intelligence.ts @@ -44,6 +44,10 @@ export const FORBIDDEN_PUBLIC_COMMENT_WORDS = [ "wallet", "hotkey", "raw trust score", + "trust score", + "coldkey", + "seed phrase", + "mnemonic", "payout", "reward estimate", "estimated rewards", @@ -52,7 +56,14 @@ export const FORBIDDEN_PUBLIC_COMMENT_WORDS = [ "reward", "farming", "private reviewability", + "reviewability internals", + "reviewability", + "private scoreability", + "scoreability", + "score preview", + "estimated score", "public score estimate", + "score estimate", "private rankings", "private ranking", "rankings", diff --git a/src/services/ai-summaries.ts b/src/services/ai-summaries.ts index 1b476232c3..db8b0221fd 100644 --- a/src/services/ai-summaries.ts +++ b/src/services/ai-summaries.ts @@ -8,10 +8,10 @@ const PR_INTELLIGENCE_MARKER = ""; type AiSummaryVisibility = "private" | "public"; const PRIVATE_CONTEXT_PATTERN = - /\b(wallets?|hotkeys?|coldkeys?|seed phrases?|mnemonics?|raw trust scores?|trust scores?|private reviewability|private scoreability|public score estimates?)\b/gi; + /\b(wallets?|hotkeys?|coldkeys?|seed phrases?|mnemonics?|raw trust scores?|trust scores?|scoreability|reviewability(?: internals?)?|private reviewability|private scoreability|public score estimates?)\b/gi; const PRIVATE_OUTCOME_PATTERN = /\b(payouts?|farming|rewards?|reward estimates?|reward optimization)\b/gi; const PUBLIC_FORBIDDEN_TEXT_PATTERN = - /\b(wallets?|hotkeys?|coldkeys?|seed phrases?|mnemonics?|raw trust scores?|trust scores?|estimated scores?|score estimates?|public score estimates?|estimated rewards?|rewards?|reward estimates?|payouts?|farming|private reviewability|private scoreability|private rankings?|rankings?|reward optimization)\b/i; + /\b(wallets?|hotkeys?|coldkeys?|seed phrases?|mnemonics?|raw trust scores?|trust scores?|estimated scores?|score estimates?|scoreability|score preview|public score estimates?|estimated rewards?|rewards?|reward estimates?|payouts?|farming|reviewability(?: internals?)?|private reviewability|private scoreability|private rankings?|rankings?|reward optimization)\b/i; export type AiSummaryResult = | { status: "disabled"; reason: string } @@ -55,7 +55,7 @@ export async function summarizeAgentBundleWithAi(env: Env, bundle: AgentRunBundl role: "system", content: visibility === "public" - ? "Summarize deterministic Gittensory signals for a public GitHub comment. Do not mention rewards, rankings, payouts, wallets, hotkeys, raw trust scores, or private reviewability." + ? "Summarize deterministic Gittensory signals for a public GitHub comment. Do not mention rewards, rankings, payouts, wallets, hotkeys, raw trust scores, scoreability, or reviewability." : "Summarize deterministic Gittensory signals for an authenticated MCP/API user. Be concise and preserve scoreability blockers and next actions.", }, { role: "user", content: prompt }, @@ -175,7 +175,8 @@ function sanitizeAiText(value: string, visibility: AiSummaryVisibility): string function containsPublicForbiddenText(value: string): boolean { // Route every public AI output through the canonical public/private sanitizer (issue #151). // `sanitizePublicComment` throws on any forbidden public term (wallet, hotkey, raw trust score, - // payout, reward language, farming, private reviewability, public score estimate, or ranking language). + // scoreability/reviewability terms, payout, reward language, farming, public score estimate, + // or ranking language). try { sanitizePublicComment(value); } catch { @@ -327,7 +328,7 @@ export async function rewritePublicPrIntelligenceComment( bundle: args.bundle, fallbackText: args.deterministicBody, instructions: - "Rewrite this deterministic Gittensory PR signal bundle as a short, friendly public GitHub comment with 3-5 bullet points. Only restate the facts provided. Never mention rewards, rankings, payouts, wallets, hotkeys, raw or estimated trust scores, score estimates, farming, or private reviewability, and never claim a guaranteed outcome.", + "Rewrite this deterministic Gittensory PR signal bundle as a short, friendly public GitHub comment with 3-5 bullet points. Only restate the facts provided. Never mention rewards, rankings, payouts, wallets, hotkeys, raw or estimated trust scores, score estimates, scoreability, reviewability, or farming, and never claim a guaranteed outcome.", actor: args.actor, route: args.route, }); diff --git a/test/unit/ai-summaries.test.ts b/test/unit/ai-summaries.test.ts index 04c9d3bea2..a48c270b1b 100644 --- a/test/unit/ai-summaries.test.ts +++ b/test/unit/ai-summaries.test.ts @@ -10,7 +10,7 @@ import { FORBIDDEN_PUBLIC_COMMENT_WORDS } from "../../src/queue-intelligence"; import { createTestEnv } from "../helpers/d1"; const PUBLIC_FORBIDDEN_TEXT = - /\b(wallets?|hotkeys?|raw trust scores?|trust scores?|payouts?|estimated rewards?|rewards?|reward estimates?|farming|private reviewability|private scoreability|private rankings?|rankings?|public score estimates?)\b/i; + /\b(wallets?|hotkeys?|raw trust scores?|trust scores?|payouts?|estimated rewards?|rewards?|reward estimates?|farming|scoreability|reviewability(?: internals?)?|private reviewability|private scoreability|private rankings?|rankings?|public score estimates?)\b/i; type AiRunRequest = { messages: Array<{ role: string; content: string }> }; describe("Workers AI summaries", () => { @@ -152,6 +152,9 @@ describe("Workers AI summaries", () => { "rewards", "reward", "farming", + "scoreability", + "reviewability", + "reviewability internals", "private reviewability", "private scoreability", "public score estimate", @@ -350,12 +353,14 @@ describe("optional deterministic-summary rewrite layer", () => { } }); - it("rejects reward and ranking variants in public AI rewrites", async () => { + it("rejects reward, ranking, scoreability, and reviewability variants in public AI rewrites", async () => { const unsafeOutputs = [ "The estimated reward is high.", "Rewards look likely for this PR.", + "This PR may improve contributor rewards and scoreability.", "The private ranking looks strong.", "This ranking should improve.", + "Reviewability internals look healthy.", ]; for (const output of unsafeOutputs) {