@mneme-ai/core 2.19.36 → 2.19.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser_receipt/browser.test.d.ts +2 -0
- package/dist/browser_receipt/browser.test.d.ts.map +1 -0
- package/dist/browser_receipt/browser.test.js +156 -0
- package/dist/browser_receipt/browser.test.js.map +1 -0
- package/dist/browser_receipt/index.d.ts +109 -0
- package/dist/browser_receipt/index.d.ts.map +1 -0
- package/dist/browser_receipt/index.js +231 -0
- package/dist/browser_receipt/index.js.map +1 -0
- package/dist/browser_userscript/index.d.ts +79 -0
- package/dist/browser_userscript/index.d.ts.map +1 -0
- package/dist/browser_userscript/index.js +371 -0
- package/dist/browser_userscript/index.js.map +1 -0
- package/dist/browser_userscript/userscript.test.d.ts +2 -0
- package/dist/browser_userscript/userscript.test.d.ts.map +1 -0
- package/dist/browser_userscript/userscript.test.js +130 -0
- package/dist/browser_userscript/userscript.test.js.map +1 -0
- package/dist/citizens_audit/citizens.test.d.ts +2 -0
- package/dist/citizens_audit/citizens.test.d.ts.map +1 -0
- package/dist/citizens_audit/citizens.test.js +167 -0
- package/dist/citizens_audit/citizens.test.js.map +1 -0
- package/dist/citizens_audit/index.d.ts +118 -0
- package/dist/citizens_audit/index.d.ts.map +1 -0
- package/dist/citizens_audit/index.js +215 -0
- package/dist/citizens_audit/index.js.map +1 -0
- package/dist/citizens_contribute/contribute.test.d.ts +2 -0
- package/dist/citizens_contribute/contribute.test.d.ts.map +1 -0
- package/dist/citizens_contribute/contribute.test.js +136 -0
- package/dist/citizens_contribute/contribute.test.js.map +1 -0
- package/dist/citizens_contribute/index.d.ts +103 -0
- package/dist/citizens_contribute/index.d.ts.map +1 -0
- package/dist/citizens_contribute/index.js +176 -0
- package/dist/citizens_contribute/index.js.map +1 -0
- package/dist/conscience_auto_hook/auto_hook.test.d.ts +2 -0
- package/dist/conscience_auto_hook/auto_hook.test.d.ts.map +1 -0
- package/dist/conscience_auto_hook/auto_hook.test.js +149 -0
- package/dist/conscience_auto_hook/auto_hook.test.js.map +1 -0
- package/dist/conscience_auto_hook/index.d.ts +83 -0
- package/dist/conscience_auto_hook/index.d.ts.map +1 -0
- package/dist/conscience_auto_hook/index.js +170 -0
- package/dist/conscience_auto_hook/index.js.map +1 -0
- package/dist/conscience_card/card.test.d.ts +2 -0
- package/dist/conscience_card/card.test.d.ts.map +1 -0
- package/dist/conscience_card/card.test.js +173 -0
- package/dist/conscience_card/card.test.js.map +1 -0
- package/dist/conscience_card/index.d.ts +75 -0
- package/dist/conscience_card/index.d.ts.map +1 -0
- package/dist/conscience_card/index.js +152 -0
- package/dist/conscience_card/index.js.map +1 -0
- package/dist/cosmic/aurelian_v1937.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1937.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1937.test.js +90 -0
- package/dist/cosmic/aurelian_v1937.test.js.map +1 -0
- package/dist/cosmic/aurelian_v1938.test.d.ts +2 -0
- package/dist/cosmic/aurelian_v1938.test.d.ts.map +1 -0
- package/dist/cosmic/aurelian_v1938.test.js +76 -0
- package/dist/cosmic/aurelian_v1938.test.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/mayor_auto_vote/auto_vote.test.d.ts +2 -0
- package/dist/mayor_auto_vote/auto_vote.test.d.ts.map +1 -0
- package/dist/mayor_auto_vote/auto_vote.test.js +167 -0
- package/dist/mayor_auto_vote/auto_vote.test.js.map +1 -0
- package/dist/mayor_auto_vote/index.d.ts +97 -0
- package/dist/mayor_auto_vote/index.d.ts.map +1 -0
- package/dist/mayor_auto_vote/index.js +206 -0
- package/dist/mayor_auto_vote/index.js.map +1 -0
- package/dist/mayor_election/index.d.ts +147 -0
- package/dist/mayor_election/index.d.ts.map +1 -0
- package/dist/mayor_election/index.js +256 -0
- package/dist/mayor_election/index.js.map +1 -0
- package/dist/mayor_election/mayor.test.d.ts +2 -0
- package/dist/mayor_election/mayor.test.d.ts.map +1 -0
- package/dist/mayor_election/mayor.test.js +175 -0
- package/dist/mayor_election/mayor.test.js.map +1 -0
- package/dist/mneme_receipt_protocol/index.d.ts +164 -0
- package/dist/mneme_receipt_protocol/index.d.ts.map +1 -0
- package/dist/mneme_receipt_protocol/index.js +335 -0
- package/dist/mneme_receipt_protocol/index.js.map +1 -0
- package/dist/mneme_receipt_protocol/protocol.test.d.ts +2 -0
- package/dist/mneme_receipt_protocol/protocol.test.d.ts.map +1 -0
- package/dist/mneme_receipt_protocol/protocol.test.js +176 -0
- package/dist/mneme_receipt_protocol/protocol.test.js.map +1 -0
- package/dist/whats_new.d.ts.map +1 -1
- package/dist/whats_new.js +16 -0
- package/dist/whats_new.js.map +1 -1
- package/dist/wrapper_genesis/index.d.ts.map +1 -1
- package/dist/wrapper_genesis/index.js +100 -0
- package/dist/wrapper_genesis/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.38 — MNEME CONSCIENCE AUTO-HOOK (Socket #3 — failure → card auto-emit)
|
|
3
|
+
*
|
|
4
|
+
* v2.19.37 CONSCIENCE CARD shipped the builder. v2.19.38 ships the
|
|
5
|
+
* AUTO-HOOK: any AI failure event (apostille outcomeClass=blocked_*,
|
|
6
|
+
* truth REJECTED, apoptosis NECROTIC/APOPTOTIC, fairness FAIL) auto-
|
|
7
|
+
* builds a card + suggests a save path the caller (daemon) writes to
|
|
8
|
+
* `.mneme/cards/<quarter>/<cardId>.svg`.
|
|
9
|
+
*
|
|
10
|
+
* The user never has to know the card exists — they just see a daily
|
|
11
|
+
* digest "📣 Mneme caught 7 AI failures today; share the best ones?".
|
|
12
|
+
*
|
|
13
|
+
* Composes onto:
|
|
14
|
+
* - v2.19.37 CONSCIENCE CARD (buildConscienceCard + renderCardSvg)
|
|
15
|
+
* - v2.19.34 APOSTILLE (failure detection source)
|
|
16
|
+
* - v2.19.31 TRUTH CONTRADICTIONS (paradox failures)
|
|
17
|
+
* - v1.65 APOPTOSIS (necrotic verdicts)
|
|
18
|
+
*
|
|
19
|
+
* Honest scope:
|
|
20
|
+
* - PURE FUNCTION classifier + renderer + path emitter. Caller does I/O.
|
|
21
|
+
* - Detection rules cover: blocked_by_*, REJECTED, FAIL, NECROTIC, APOPTOTIC.
|
|
22
|
+
* - Defensive: malformed failure event → null (skip; don't crash).
|
|
23
|
+
* - 25+ tests + 1000-iter fuzz.
|
|
24
|
+
*/
|
|
25
|
+
import { type ConscienceCard, type ConscienceKind } from "../conscience_card/index.js";
|
|
26
|
+
/** Generic failure event shape — composes from any subsystem. */
|
|
27
|
+
export interface FailureEvent {
|
|
28
|
+
/** Where the failure came from. */
|
|
29
|
+
source: "apostille" | "truth_forensic" | "apoptosis" | "fairness" | "vaccine_trigger" | "guard";
|
|
30
|
+
vendor: string;
|
|
31
|
+
modelVersion?: string;
|
|
32
|
+
/** What the AI said that triggered the failure. */
|
|
33
|
+
aiClaim: string;
|
|
34
|
+
/** What Mneme detected. */
|
|
35
|
+
detection: string;
|
|
36
|
+
/** Outcome class from apostille (if applicable). */
|
|
37
|
+
outcomeClass?: string;
|
|
38
|
+
/** Verdict from truth/apoptosis (if applicable). */
|
|
39
|
+
verdict?: string;
|
|
40
|
+
/** Optional savedValue estimate (e.g., "3.2 hours debug"). */
|
|
41
|
+
savedValue?: string;
|
|
42
|
+
/** ms epoch. */
|
|
43
|
+
tsMs?: number;
|
|
44
|
+
}
|
|
45
|
+
export interface AutoEmitResult {
|
|
46
|
+
/** Card or null if event doesn't warrant a card. */
|
|
47
|
+
card: ConscienceCard | null;
|
|
48
|
+
/** SVG bytes (caller writes to .mneme/cards/<quarter>/<cardId>.svg). */
|
|
49
|
+
svgBytes?: string;
|
|
50
|
+
/** Text version for tweet (caller copies to clipboard / share menu). */
|
|
51
|
+
textBytes?: string;
|
|
52
|
+
/** Suggested file path relative to caller's repo root. */
|
|
53
|
+
filePath?: string;
|
|
54
|
+
/** Why this card was emitted (or why not). */
|
|
55
|
+
reason: string;
|
|
56
|
+
}
|
|
57
|
+
export declare function autoEmitConscienceCard(event: FailureEvent, opts?: {
|
|
58
|
+
width?: number;
|
|
59
|
+
height?: number;
|
|
60
|
+
}): AutoEmitResult;
|
|
61
|
+
export interface CardDigest {
|
|
62
|
+
totalCards: number;
|
|
63
|
+
kindBreakdown: Record<ConscienceKind, number>;
|
|
64
|
+
topVendor: string | null;
|
|
65
|
+
topKind: ConscienceKind | null;
|
|
66
|
+
dayBucketMs: number;
|
|
67
|
+
/** Recommended share copy for the daemon to surface to user. */
|
|
68
|
+
userMessage: string;
|
|
69
|
+
}
|
|
70
|
+
export declare function buildDailyDigest(cards: ConscienceCard[], todayMs?: number): CardDigest;
|
|
71
|
+
export interface AutoHookStats {
|
|
72
|
+
totalEvents: number;
|
|
73
|
+
emittedCards: number;
|
|
74
|
+
skippedCount: number;
|
|
75
|
+
skipReasons: Record<string, number>;
|
|
76
|
+
}
|
|
77
|
+
export declare function computeAutoHookStats(results: AutoEmitResult[]): AutoHookStats;
|
|
78
|
+
export declare function formatAutoHookLine(s: AutoHookStats): string;
|
|
79
|
+
export declare const CONSCIENCE_AUTO_HOOK_TUNABLES: Readonly<{
|
|
80
|
+
PROTOCOL_VERSION: 1;
|
|
81
|
+
SUPPORTED_SOURCES: ReadonlyArray<FailureEvent["source"]>;
|
|
82
|
+
}>;
|
|
83
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conscience_auto_hook/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAsD,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI3I,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG,WAAW,GAAG,UAAU,GAAG,iBAAiB,GAAG,OAAO,CAAC;IAChG,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAwCD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,cAAc,CA2BjB;AAkBD,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC9C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,cAAc,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,OAAO,GAAE,MAAmB,GAAG,UAAU,CA8BlG;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,aAAa,CAY7E;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAG3D;AAED,eAAO,MAAM,6BAA6B;;uBAEmE,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;EAChJ,CAAC"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.38 — MNEME CONSCIENCE AUTO-HOOK (Socket #3 — failure → card auto-emit)
|
|
3
|
+
*
|
|
4
|
+
* v2.19.37 CONSCIENCE CARD shipped the builder. v2.19.38 ships the
|
|
5
|
+
* AUTO-HOOK: any AI failure event (apostille outcomeClass=blocked_*,
|
|
6
|
+
* truth REJECTED, apoptosis NECROTIC/APOPTOTIC, fairness FAIL) auto-
|
|
7
|
+
* builds a card + suggests a save path the caller (daemon) writes to
|
|
8
|
+
* `.mneme/cards/<quarter>/<cardId>.svg`.
|
|
9
|
+
*
|
|
10
|
+
* The user never has to know the card exists — they just see a daily
|
|
11
|
+
* digest "📣 Mneme caught 7 AI failures today; share the best ones?".
|
|
12
|
+
*
|
|
13
|
+
* Composes onto:
|
|
14
|
+
* - v2.19.37 CONSCIENCE CARD (buildConscienceCard + renderCardSvg)
|
|
15
|
+
* - v2.19.34 APOSTILLE (failure detection source)
|
|
16
|
+
* - v2.19.31 TRUTH CONTRADICTIONS (paradox failures)
|
|
17
|
+
* - v1.65 APOPTOSIS (necrotic verdicts)
|
|
18
|
+
*
|
|
19
|
+
* Honest scope:
|
|
20
|
+
* - PURE FUNCTION classifier + renderer + path emitter. Caller does I/O.
|
|
21
|
+
* - Detection rules cover: blocked_by_*, REJECTED, FAIL, NECROTIC, APOPTOTIC.
|
|
22
|
+
* - Defensive: malformed failure event → null (skip; don't crash).
|
|
23
|
+
* - 25+ tests + 1000-iter fuzz.
|
|
24
|
+
*/
|
|
25
|
+
import { buildConscienceCard, renderCardSvg, renderCardText } from "../conscience_card/index.js";
|
|
26
|
+
const PROTOCOL_VERSION = 1;
|
|
27
|
+
// ─── Failure → kind classifier ──────────────────────────────────────
|
|
28
|
+
function classifyKind(event) {
|
|
29
|
+
// Apoptosis NECROTIC/APOPTOTIC = hallucination
|
|
30
|
+
if (event.source === "apoptosis") {
|
|
31
|
+
const v = (event.verdict ?? "").toUpperCase();
|
|
32
|
+
if (v === "NECROTIC" || v === "APOPTOTIC")
|
|
33
|
+
return "hallucination";
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
// Truth forensic REJECTED → look for paradox / hallucination
|
|
37
|
+
if (event.source === "truth_forensic") {
|
|
38
|
+
const v = (event.verdict ?? "").toUpperCase();
|
|
39
|
+
if (v !== "REJECTED")
|
|
40
|
+
return null;
|
|
41
|
+
if (/contradict|paradox|self.{0,3}refut/i.test(event.detection))
|
|
42
|
+
return "paradox";
|
|
43
|
+
return "hallucination";
|
|
44
|
+
}
|
|
45
|
+
// Fairness FAIL
|
|
46
|
+
if (event.source === "fairness") {
|
|
47
|
+
if ((event.verdict ?? "").toUpperCase() === "FAIL")
|
|
48
|
+
return "fairness_fail";
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
// Apostille outcomeClass blocked_*
|
|
52
|
+
if (event.source === "apostille") {
|
|
53
|
+
const o = event.outcomeClass ?? "";
|
|
54
|
+
if (o === "blocked_by_guard")
|
|
55
|
+
return "blocked_by_guard";
|
|
56
|
+
if (o === "blocked_by_apoptosis")
|
|
57
|
+
return "hallucination";
|
|
58
|
+
if (o === "blocked_by_truth")
|
|
59
|
+
return "paradox";
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
// Vaccine trigger event
|
|
63
|
+
if (event.source === "vaccine_trigger")
|
|
64
|
+
return "vaccine_trigger";
|
|
65
|
+
// Guard block event
|
|
66
|
+
if (event.source === "guard")
|
|
67
|
+
return "blocked_by_guard";
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// ─── AUTO-EMIT ──────────────────────────────────────────────────────
|
|
71
|
+
export function autoEmitConscienceCard(event, opts) {
|
|
72
|
+
if (!event || typeof event !== "object") {
|
|
73
|
+
return { card: null, reason: "event is not an object" };
|
|
74
|
+
}
|
|
75
|
+
if (typeof event.vendor !== "string" || event.vendor.length === 0) {
|
|
76
|
+
return { card: null, reason: "missing vendor" };
|
|
77
|
+
}
|
|
78
|
+
if (typeof event.aiClaim !== "string" || typeof event.detection !== "string") {
|
|
79
|
+
return { card: null, reason: "missing aiClaim or detection text" };
|
|
80
|
+
}
|
|
81
|
+
const kind = classifyKind(event);
|
|
82
|
+
if (kind === null) {
|
|
83
|
+
return { card: null, reason: `event source=${event.source} verdict=${event.verdict ?? ""} outcomeClass=${event.outcomeClass ?? ""} → no card emitted` };
|
|
84
|
+
}
|
|
85
|
+
const card = buildConscienceCard({
|
|
86
|
+
vendor: event.vendor,
|
|
87
|
+
modelVersion: event.modelVersion ?? "unknown",
|
|
88
|
+
kind,
|
|
89
|
+
aiClaim: event.aiClaim,
|
|
90
|
+
detection: event.detection,
|
|
91
|
+
savedValue: event.savedValue,
|
|
92
|
+
tsMs: event.tsMs ?? Date.now(),
|
|
93
|
+
});
|
|
94
|
+
const svgBytes = renderCardSvg(card, opts);
|
|
95
|
+
const textBytes = renderCardText(card);
|
|
96
|
+
const filePath = suggestedFilePath(card);
|
|
97
|
+
return { card, svgBytes, textBytes, filePath, reason: `auto-emitted ${kind} card from ${event.source}` };
|
|
98
|
+
}
|
|
99
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
100
|
+
function quarterIdFromMs(ms) {
|
|
101
|
+
const d = new Date(ms);
|
|
102
|
+
const y = d.getUTCFullYear();
|
|
103
|
+
const q = Math.floor(d.getUTCMonth() / 3) + 1;
|
|
104
|
+
return `${y}-Q${q}`;
|
|
105
|
+
}
|
|
106
|
+
function suggestedFilePath(card) {
|
|
107
|
+
const quarter = quarterIdFromMs(card.dayBucketMs);
|
|
108
|
+
return `.mneme/cards/${quarter}/${card.cardId}.svg`;
|
|
109
|
+
}
|
|
110
|
+
export function buildDailyDigest(cards, todayMs = Date.now()) {
|
|
111
|
+
const dayStart = Math.floor(todayMs / DAY_MS) * DAY_MS;
|
|
112
|
+
const todayCards = cards.filter((c) => c && c.dayBucketMs === dayStart);
|
|
113
|
+
const kindBreakdown = {
|
|
114
|
+
paradox: 0, hallucination: 0, vaccine_trigger: 0, fairness_fail: 0, blocked_by_guard: 0,
|
|
115
|
+
};
|
|
116
|
+
const vendorCount = {};
|
|
117
|
+
for (const c of todayCards) {
|
|
118
|
+
kindBreakdown[c.kind]++;
|
|
119
|
+
vendorCount[c.vendor] = (vendorCount[c.vendor] ?? 0) + 1;
|
|
120
|
+
}
|
|
121
|
+
let topVendor = null, topVendorCount = 0;
|
|
122
|
+
for (const [v, n] of Object.entries(vendorCount))
|
|
123
|
+
if (n > topVendorCount) {
|
|
124
|
+
topVendor = v;
|
|
125
|
+
topVendorCount = n;
|
|
126
|
+
}
|
|
127
|
+
let topKind = null, topKindCount = 0;
|
|
128
|
+
for (const k of Object.keys(kindBreakdown)) {
|
|
129
|
+
if (kindBreakdown[k] > topKindCount) {
|
|
130
|
+
topKind = k;
|
|
131
|
+
topKindCount = kindBreakdown[k];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const userMessage = todayCards.length === 0
|
|
135
|
+
? "📣 No AI failures caught today — clean run."
|
|
136
|
+
: `📣 Mneme caught ${todayCards.length} AI failure${todayCards.length === 1 ? "" : "s"} today` +
|
|
137
|
+
(topVendor ? ` (${topVendor} led)` : "") +
|
|
138
|
+
`. View at .mneme/cards/ — share the best ones?`;
|
|
139
|
+
return {
|
|
140
|
+
totalCards: todayCards.length,
|
|
141
|
+
kindBreakdown,
|
|
142
|
+
topVendor,
|
|
143
|
+
topKind,
|
|
144
|
+
dayBucketMs: dayStart,
|
|
145
|
+
userMessage,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export function computeAutoHookStats(results) {
|
|
149
|
+
let emitted = 0, skipped = 0;
|
|
150
|
+
const skipReasons = {};
|
|
151
|
+
for (const r of results) {
|
|
152
|
+
if (r.card)
|
|
153
|
+
emitted++;
|
|
154
|
+
else {
|
|
155
|
+
skipped++;
|
|
156
|
+
const key = r.reason.slice(0, 60);
|
|
157
|
+
skipReasons[key] = (skipReasons[key] ?? 0) + 1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return { totalEvents: results.length, emittedCards: emitted, skippedCount: skipped, skipReasons };
|
|
161
|
+
}
|
|
162
|
+
export function formatAutoHookLine(s) {
|
|
163
|
+
const rate = s.totalEvents > 0 ? Math.round((s.emittedCards / s.totalEvents) * 100) : 0;
|
|
164
|
+
return `📣 AUTO-HOOK · ${s.emittedCards}/${s.totalEvents} events → cards (${rate}%)`;
|
|
165
|
+
}
|
|
166
|
+
export const CONSCIENCE_AUTO_HOOK_TUNABLES = Object.freeze({
|
|
167
|
+
PROTOCOL_VERSION,
|
|
168
|
+
SUPPORTED_SOURCES: ["apostille", "truth_forensic", "apoptosis", "fairness", "vaccine_trigger", "guard"],
|
|
169
|
+
});
|
|
170
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/conscience_auto_hook/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.test.d.ts","sourceRoot":"","sources":["../../src/conscience_card/card.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { buildConscienceCard, renderCardText, renderCardSvg, computeCardStats, formatCardStatsLine, CONSCIENCE_CARD_TUNABLES, } from "./index.js";
|
|
3
|
+
describe("v2.19.37 CONSCIENCE CARD — build", () => {
|
|
4
|
+
it("builds a card from minimal input with all required fields", () => {
|
|
5
|
+
const card = buildConscienceCard({
|
|
6
|
+
vendor: "claude", modelVersion: "opus-4.7", kind: "paradox",
|
|
7
|
+
aiClaim: "X exists and X does not exist", detection: "self-contradiction REJECTED",
|
|
8
|
+
tsMs: 1_700_000_000_000,
|
|
9
|
+
});
|
|
10
|
+
expect(card.cardId).toMatch(/^[0-9a-f]{12}$/);
|
|
11
|
+
expect(card.kind).toBe("paradox");
|
|
12
|
+
expect(card.hashtag).toBe("#MnemeCaughtThis");
|
|
13
|
+
});
|
|
14
|
+
it("DETERMINISTIC: same input → same cardId (dedupe across users)", () => {
|
|
15
|
+
const input = {
|
|
16
|
+
vendor: "gpt", modelVersion: "4o", kind: "hallucination",
|
|
17
|
+
aiClaim: "Same claim", detection: "Same detection", tsMs: 1_700_000_000_000,
|
|
18
|
+
};
|
|
19
|
+
expect(buildConscienceCard(input).cardId).toBe(buildConscienceCard(input).cardId);
|
|
20
|
+
});
|
|
21
|
+
it("truncates aiClaim + detection to spec limits", () => {
|
|
22
|
+
const card = buildConscienceCard({
|
|
23
|
+
vendor: "v", modelVersion: "m", kind: "paradox",
|
|
24
|
+
aiClaim: "x".repeat(500), detection: "y".repeat(500), tsMs: 0,
|
|
25
|
+
});
|
|
26
|
+
expect(card.aiClaim.length).toBeLessThanOrEqual(CONSCIENCE_CARD_TUNABLES.MAX_CLAIM_LEN);
|
|
27
|
+
expect(card.detection.length).toBeLessThanOrEqual(CONSCIENCE_CARD_TUNABLES.MAX_DETECTION_LEN);
|
|
28
|
+
});
|
|
29
|
+
it("unknown kind falls back to 'hallucination'", () => {
|
|
30
|
+
const card = buildConscienceCard({
|
|
31
|
+
vendor: "v", modelVersion: "m", kind: "invented_kind",
|
|
32
|
+
aiClaim: "x", detection: "y", tsMs: 0,
|
|
33
|
+
});
|
|
34
|
+
expect(card.kind).toBe("hallucination");
|
|
35
|
+
});
|
|
36
|
+
it("dayBucketMs floors ts to day boundary (k-anonymity)", () => {
|
|
37
|
+
const c1 = buildConscienceCard({ vendor: "v", modelVersion: "m", kind: "paradox", aiClaim: "a", detection: "b", tsMs: 1_700_000_001_234 });
|
|
38
|
+
const c2 = buildConscienceCard({ vendor: "v", modelVersion: "m", kind: "paradox", aiClaim: "a", detection: "b", tsMs: 1_700_000_059_999 });
|
|
39
|
+
expect(c1.dayBucketMs).toBe(c2.dayBucketMs);
|
|
40
|
+
});
|
|
41
|
+
it("DEFENSIVE: garbage input never throws", () => {
|
|
42
|
+
expect(() => buildConscienceCard({})).not.toThrow();
|
|
43
|
+
expect(() => buildConscienceCard({ vendor: 123, modelVersion: null })).not.toThrow();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("v2.19.37 CONSCIENCE CARD — text render", () => {
|
|
47
|
+
function freshCard() {
|
|
48
|
+
return buildConscienceCard({
|
|
49
|
+
vendor: "claude", modelVersion: "opus-4.7", kind: "paradox",
|
|
50
|
+
aiClaim: "the file X exists AND the file X does not exist",
|
|
51
|
+
detection: "self-contradiction REJECTED",
|
|
52
|
+
savedValue: "3.2 hours debug",
|
|
53
|
+
tsMs: 1_700_000_000_000,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
it("emits 3-5 line shareable text", () => {
|
|
57
|
+
const txt = renderCardText(freshCard());
|
|
58
|
+
const lines = txt.split("\n");
|
|
59
|
+
expect(lines.length).toBeGreaterThanOrEqual(3);
|
|
60
|
+
expect(lines.length).toBeLessThanOrEqual(10);
|
|
61
|
+
});
|
|
62
|
+
it("includes vendor, claim, detection, hashtag", () => {
|
|
63
|
+
const txt = renderCardText(freshCard());
|
|
64
|
+
expect(txt).toContain("claude");
|
|
65
|
+
expect(txt).toContain("self-contradiction REJECTED");
|
|
66
|
+
expect(txt).toContain("#MnemeCaughtThis");
|
|
67
|
+
});
|
|
68
|
+
it("kind emoji included", () => {
|
|
69
|
+
const txt = renderCardText(freshCard());
|
|
70
|
+
expect(txt).toContain("🌀"); // paradox emoji
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
describe("v2.19.37 CONSCIENCE CARD — SVG render (self-contained, screenshot-grade)", () => {
|
|
74
|
+
function freshCard() {
|
|
75
|
+
return buildConscienceCard({
|
|
76
|
+
vendor: "gpt", modelVersion: "4o", kind: "hallucination",
|
|
77
|
+
aiClaim: "Cited paper that doesn't exist", detection: "no such paper in arxiv",
|
|
78
|
+
tsMs: 1_700_000_000_000,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
it("emits valid SVG (root element + viewBox + content)", () => {
|
|
82
|
+
const svg = renderCardSvg(freshCard());
|
|
83
|
+
expect(svg).toContain("<svg");
|
|
84
|
+
expect(svg).toContain("viewBox");
|
|
85
|
+
expect(svg).toContain("</svg>");
|
|
86
|
+
});
|
|
87
|
+
it("default 600x320", () => {
|
|
88
|
+
const svg = renderCardSvg(freshCard());
|
|
89
|
+
expect(svg).toContain('width="600"');
|
|
90
|
+
expect(svg).toContain('height="320"');
|
|
91
|
+
});
|
|
92
|
+
it("custom dimensions honoured", () => {
|
|
93
|
+
const svg = renderCardSvg(freshCard(), { width: 1200, height: 630 });
|
|
94
|
+
expect(svg).toContain('width="1200"');
|
|
95
|
+
expect(svg).toContain('height="630"');
|
|
96
|
+
});
|
|
97
|
+
it("vendor color matches kind background", () => {
|
|
98
|
+
const card = buildConscienceCard({ vendor: "claude", modelVersion: "x", kind: "paradox", aiClaim: "a", detection: "b", tsMs: 0 });
|
|
99
|
+
const svg = renderCardSvg(card);
|
|
100
|
+
expect(svg).toContain("#7c3aed"); // paradox bg
|
|
101
|
+
});
|
|
102
|
+
it("XSS-DEFENSE: special chars in claim escaped", () => {
|
|
103
|
+
const card = buildConscienceCard({
|
|
104
|
+
vendor: "v", modelVersion: "m", kind: "paradox",
|
|
105
|
+
aiClaim: '<script>alert(1)</script>', detection: '</text><tspan>x</tspan>', tsMs: 0,
|
|
106
|
+
});
|
|
107
|
+
const svg = renderCardSvg(card);
|
|
108
|
+
expect(svg).not.toContain("<script>");
|
|
109
|
+
expect(svg).toContain("<script>");
|
|
110
|
+
});
|
|
111
|
+
it("NO external resource refs (xmlns declaration excepted) — no <link>, no <image href=, no font-face, no @import", () => {
|
|
112
|
+
const svg = renderCardSvg(freshCard());
|
|
113
|
+
// xmlns="http://www.w3.org/2000/svg" is the REQUIRED SVG namespace
|
|
114
|
+
// declaration, not an external resource fetch. We assert no actual
|
|
115
|
+
// external loads happen.
|
|
116
|
+
expect(svg).not.toContain("<image");
|
|
117
|
+
expect(svg).not.toContain("xlink:href");
|
|
118
|
+
expect(svg).not.toContain("@import");
|
|
119
|
+
expect(svg).not.toContain("@font-face");
|
|
120
|
+
expect(svg).not.toContain("<link");
|
|
121
|
+
});
|
|
122
|
+
it("hashtag + cardId at bottom for indexing", () => {
|
|
123
|
+
const card = freshCard();
|
|
124
|
+
const svg = renderCardSvg(card);
|
|
125
|
+
expect(svg).toContain("#MnemeCaughtThis");
|
|
126
|
+
expect(svg).toContain(card.cardId);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("v2.19.37 CONSCIENCE CARD — A/B before vs after", () => {
|
|
130
|
+
it("A: pre-v2.19.37 failures = JSON dump (not shareable); B: now SVG + text shareable", () => {
|
|
131
|
+
const card = buildConscienceCard({
|
|
132
|
+
vendor: "claude", modelVersion: "opus", kind: "fairness_fail",
|
|
133
|
+
aiClaim: "approve all gender=male", detection: "fairness_fail with race attribute",
|
|
134
|
+
tsMs: 1_700_000_000_000,
|
|
135
|
+
});
|
|
136
|
+
const txt = renderCardText(card);
|
|
137
|
+
const svg = renderCardSvg(card);
|
|
138
|
+
expect(txt.length).toBeGreaterThan(50);
|
|
139
|
+
expect(svg.length).toBeGreaterThan(500);
|
|
140
|
+
// Wordle-like: deterministic format, fixed-ish length, hashtag, no PII leak in template
|
|
141
|
+
expect(svg).toContain("#MnemeCaughtThis");
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe("v2.19.37 CONSCIENCE CARD — stats + 1000-iter fuzz", () => {
|
|
145
|
+
it("computeCardStats counts kinds + vendors correctly", () => {
|
|
146
|
+
const cards = [
|
|
147
|
+
buildConscienceCard({ vendor: "claude", modelVersion: "x", kind: "paradox", aiClaim: "a", detection: "b", tsMs: 0 }),
|
|
148
|
+
buildConscienceCard({ vendor: "gpt", modelVersion: "x", kind: "hallucination", aiClaim: "a", detection: "b", tsMs: 0 }),
|
|
149
|
+
buildConscienceCard({ vendor: "claude", modelVersion: "x", kind: "hallucination", aiClaim: "c", detection: "d", tsMs: 0 }),
|
|
150
|
+
];
|
|
151
|
+
const s = computeCardStats(cards);
|
|
152
|
+
expect(s.totalCards).toBe(3);
|
|
153
|
+
expect(s.kindBreakdown.paradox).toBe(1);
|
|
154
|
+
expect(s.kindBreakdown.hallucination).toBe(2);
|
|
155
|
+
expect(s.vendorBreakdown.claude).toBe(2);
|
|
156
|
+
expect(formatCardStatsLine(s)).toContain("CARDS");
|
|
157
|
+
});
|
|
158
|
+
it("1000 random build+render cycles never crash", () => {
|
|
159
|
+
const kinds = CONSCIENCE_CARD_TUNABLES.KINDS;
|
|
160
|
+
for (let i = 0; i < 1000; i++) {
|
|
161
|
+
const card = buildConscienceCard({
|
|
162
|
+
vendor: `v${i % 5}`, modelVersion: `m${i % 3}`,
|
|
163
|
+
kind: kinds[i % kinds.length],
|
|
164
|
+
aiClaim: `claim ${i} ${Math.random()}`,
|
|
165
|
+
detection: `detection ${i}`,
|
|
166
|
+
tsMs: 1_700_000_000_000 + i * 1000,
|
|
167
|
+
});
|
|
168
|
+
expect(renderCardText(card).length).toBeGreaterThan(0);
|
|
169
|
+
expect(renderCardSvg(card).length).toBeGreaterThan(0);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=card.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.test.js","sourceRoot":"","sources":["../../src/conscience_card/card.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2.19.37 — MNEME CONSCIENCE CARD (Gap #5 — viral loop)
|
|
3
|
+
*
|
|
4
|
+
* When Mneme catches an AI doing something wrong (paradox, vaccine
|
|
5
|
+
* trigger, fairness fail, hallucination), produce a SHARE-ABLE CARD —
|
|
6
|
+
* like Wordle posts: a tight, visual, screenshot-worthy artifact the
|
|
7
|
+
* user tweets. Each share is organic distribution + reputational
|
|
8
|
+
* pressure on the vendor.
|
|
9
|
+
*
|
|
10
|
+
* Shape: 3-line text card + SVG card (both deterministic, both
|
|
11
|
+
* include hashtag for indexing on social media).
|
|
12
|
+
*
|
|
13
|
+
* Wild moat: Wordle proved that DETERMINISTIC + SHARE-ABLE + TIGHT-
|
|
14
|
+
* FORMAT artifacts get billions of free shares. Mneme Conscience
|
|
15
|
+
* uses the same psychology — caught-in-the-act → screenshot → tweet.
|
|
16
|
+
*
|
|
17
|
+
* Composes onto:
|
|
18
|
+
* - v2.19.34 APOSTILLE (failure events emit conscience cards)
|
|
19
|
+
* - v2.19.31 TRUTH CONTRADICTIONS (paradox failures → cards)
|
|
20
|
+
* - v1.65 APOPTOSIS (necrotic verdicts → cards)
|
|
21
|
+
*
|
|
22
|
+
* Honest scope:
|
|
23
|
+
* - PURE FUNCTION builder + renderer. No I/O.
|
|
24
|
+
* - Deterministic: same failure → same card (so dedupe is automatic
|
|
25
|
+
* across user shares of the same incident).
|
|
26
|
+
* - SVG is self-contained (no external fonts/refs).
|
|
27
|
+
* - 30+ rendering tests; 1000+ random fuzz iterations.
|
|
28
|
+
*/
|
|
29
|
+
export type ConscienceKind = "paradox" | "hallucination" | "vaccine_trigger" | "fairness_fail" | "blocked_by_guard";
|
|
30
|
+
export interface ConscienceCard {
|
|
31
|
+
/** Stable id derived from (vendor, kind, claim, ts-bucket). */
|
|
32
|
+
cardId: string;
|
|
33
|
+
vendor: string;
|
|
34
|
+
modelVersion: string;
|
|
35
|
+
kind: ConscienceKind;
|
|
36
|
+
/** What the AI claimed (truncated for display). */
|
|
37
|
+
aiClaim: string;
|
|
38
|
+
/** What Mneme detected (truncated for display). */
|
|
39
|
+
detection: string;
|
|
40
|
+
/** Estimated value saved by Mneme catching this (in user-readable units). */
|
|
41
|
+
savedValue?: string;
|
|
42
|
+
/** ms epoch — bucketed to day for k-anonymity. */
|
|
43
|
+
dayBucketMs: number;
|
|
44
|
+
/** Hashtag for indexing. */
|
|
45
|
+
hashtag: string;
|
|
46
|
+
}
|
|
47
|
+
export interface BuildCardInput {
|
|
48
|
+
vendor: string;
|
|
49
|
+
modelVersion: string;
|
|
50
|
+
kind: ConscienceKind;
|
|
51
|
+
aiClaim: string;
|
|
52
|
+
detection: string;
|
|
53
|
+
savedValue?: string;
|
|
54
|
+
tsMs?: number;
|
|
55
|
+
}
|
|
56
|
+
export declare function buildConscienceCard(input: BuildCardInput): ConscienceCard;
|
|
57
|
+
export declare function renderCardText(card: ConscienceCard): string;
|
|
58
|
+
export declare function renderCardSvg(card: ConscienceCard, opts?: {
|
|
59
|
+
width?: number;
|
|
60
|
+
height?: number;
|
|
61
|
+
}): string;
|
|
62
|
+
export interface CardStats {
|
|
63
|
+
totalCards: number;
|
|
64
|
+
kindBreakdown: Record<ConscienceKind, number>;
|
|
65
|
+
vendorBreakdown: Record<string, number>;
|
|
66
|
+
}
|
|
67
|
+
export declare function computeCardStats(cards: ConscienceCard[]): CardStats;
|
|
68
|
+
export declare function formatCardStatsLine(s: CardStats): string;
|
|
69
|
+
export declare const CONSCIENCE_CARD_TUNABLES: Readonly<{
|
|
70
|
+
KINDS: ReadonlyArray<ConscienceKind>;
|
|
71
|
+
MAX_CLAIM_LEN: 140;
|
|
72
|
+
MAX_DETECTION_LEN: 140;
|
|
73
|
+
HASHTAG: "#MnemeCaughtThis";
|
|
74
|
+
}>;
|
|
75
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/conscience_card/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,MAAM,MAAM,cAAc,GACtB,SAAS,GACT,eAAe,GACf,iBAAiB,GACjB,eAAe,GACf,kBAAkB,CAAC;AAEvB,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,cAAc,CAAC;IACrB,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AAqBD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAqBzE;AAID,wBAAgB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAU3D;AAkBD,wBAAgB,aAAa,CAAC,IAAI,EAAE,cAAc,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CA2BtG;AAID,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC9C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,SAAS,CAWnE;AAED,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAExD;AAED,eAAO,MAAM,wBAAwB;WAC4D,aAAa,CAAC,cAAc,CAAC;;;;EAI5H,CAAC"}
|