From 65dffb3bfc7815bbc46702f5a2a3039c42c348e5 Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Thu, 6 Aug 2026 18:22:40 +0200 Subject: [PATCH 01/13] feat(prompts): add token-budget primitives for small-context providers Core's prompts are assembled by string interpolation with no bound on what gets injected. Against Ollama that silently corrupts retrieval: Ollama defaults num_ctx to 4096 and drops the overflow without any error, so oversized prompts get truncated invisibly and quality degrades. Adds the shared primitives the injection sites will use: - OLLAMA_NUM_CTX, pinned at 4096. This is a hardware constant, not a tuning knob: the deployment target is an RTX 4060 (8GB, shared with nomic-embed-text) and raising it to 8192 was measured to evict qwen3:8b from VRAM entirely (5.5GB -> 0GB), forcing CPU inference. Normal KV-cache arithmetic did not predict that, so no smaller bump is trustworthy either. - capToTokenBudget(), which converges on a real token count via the same o200k_base tokenizer the rest of the codebase uses, rather than guessing from character length. - assertPromptWithinBudget(), which throws instead of sending. This is the actual fix for the bug class -- the failure mode was silence, so the remedy is to make an over-budget prompt loud rather than to merely make it smaller. --- .../prompts/__tests__/promptBudget.test.ts | 78 +++++++++++++++++ .../app/services/prompts/promptBudget.ts | 84 +++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 apps/webapp/app/services/prompts/__tests__/promptBudget.test.ts create mode 100644 apps/webapp/app/services/prompts/promptBudget.ts diff --git a/apps/webapp/app/services/prompts/__tests__/promptBudget.test.ts b/apps/webapp/app/services/prompts/__tests__/promptBudget.test.ts new file mode 100644 index 00000000..a82ece79 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/promptBudget.test.ts @@ -0,0 +1,78 @@ +import { describe, it, expect } from "vitest"; +import { + OLLAMA_NUM_CTX, + OLLAMA_NUM_PREDICT_DEFAULT, + assertPromptWithinBudget, + capToTokenBudget, +} from "../promptBudget"; +import { countTokens } from "~/services/search/tokenBudget"; + +const LONG = "lorem ipsum dolor sit amet consectetur adipiscing elit ".repeat(100); + +describe("OLLAMA_NUM_CTX", () => { + it("is pinned to 4096 — raising it evicted qwen3:8b from an 8GB RTX 4060", () => { + // Guard constant. If someone raises this, that hardware finding must be re-run. + expect(OLLAMA_NUM_CTX).toBe(4096); + }); + + it("reserves a sane default completion allowance that fits the window", () => { + expect(OLLAMA_NUM_PREDICT_DEFAULT).toBeGreaterThan(0); + expect(OLLAMA_NUM_PREDICT_DEFAULT).toBeLessThan(OLLAMA_NUM_CTX); + }); +}); + +describe("capToTokenBudget", () => { + it("returns the input unchanged when already within budget", () => { + const text = "Klaus prefers dark mode"; + expect(capToTokenBudget(text, 1000)).toBe(text); + }); + + it("returns a string that genuinely re-counts to within budget when over", () => { + for (const budget of [10, 50, 140, 500]) { + const result = capToTokenBudget(LONG, budget); + expect(countTokens(result)).toBeLessThanOrEqual(budget); + } + }); + + it("marks the text as truncated so the model can tell it was cut", () => { + expect(capToTokenBudget(LONG, 140)).toContain("[truncated]"); + }); + + it("preserves the beginning of the text rather than an arbitrary slice", () => { + const text = "FIRSTTOKEN " + LONG; + expect(capToTokenBudget(text, 50).startsWith("FIRSTTOKEN")).toBe(true); + }); + + it("handles empty input", () => { + expect(capToTokenBudget("", 100)).toBe(""); + }); + + it("handles a zero budget without emitting an over-budget marker", () => { + expect(capToTokenBudget(LONG, 0)).toBe(""); + }); +}); + +describe("assertPromptWithinBudget", () => { + it("does not throw when the prompt is within budget", () => { + expect(() => + assertPromptWithinBudget({ label: "test", text: "short", budget: 100 }), + ).not.toThrow(); + }); + + it("throws naming the label, the actual count, and the budget when over", () => { + const actual = countTokens(LONG); + expect(() => + assertPromptWithinBudget({ label: "search-rerank", text: LONG, budget: 10 }), + ).toThrow(new RegExp(`search-rerank.*${actual}.*10`)); + }); + + it("is the fail-loud guard against Ollama silently truncating an over-budget prompt", () => { + // The original bug class: Ollama drops overflow silently. Throwing is the fix. + expect(() => + assertPromptWithinBudget({ label: "ingest", text: LONG, budget: OLLAMA_NUM_CTX - 1 }), + ).not.toThrow(); + expect(() => + assertPromptWithinBudget({ label: "ingest", text: LONG, budget: 5 }), + ).toThrow(); + }); +}); diff --git a/apps/webapp/app/services/prompts/promptBudget.ts b/apps/webapp/app/services/prompts/promptBudget.ts new file mode 100644 index 00000000..6c166d1c --- /dev/null +++ b/apps/webapp/app/services/prompts/promptBudget.ts @@ -0,0 +1,84 @@ +import { decode, encode } from "gpt-tokenizer/encoding/o200k_base"; +import { countTokens } from "~/services/search/tokenBudget"; + +/** + * Pinned to 4096 on purpose. + * + * Core is deployed against an RTX 4060 with 8GB VRAM, shared with + * `nomic-embed-text`. Raising Ollama `num_ctx` from 4096 to 8192 was + * directly tested and evicted `qwen3:8b` from VRAM entirely, forcing CPU + * inference. Do not "helpfully" increase this without re-running that exact + * hardware validation. + */ +export const OLLAMA_NUM_CTX = 4096; + +/** + * Default completion budget reserved for local Ollama calls unless a caller + * requests a tighter or looser limit explicitly. + */ +export const OLLAMA_NUM_PREDICT_DEFAULT = 512; + +const TRUNCATION_MARKER = "...[truncated]"; + +function fitMarkerToBudget(budget: number): string { + if (budget <= 0) { + return ""; + } + + return decode(encode(TRUNCATION_MARKER).slice(0, budget)); +} + +export function capToTokenBudget(text: string, budget: number): string { + if (text.length === 0) { + return ""; + } + + if (budget <= 0) { + return ""; + } + + if (countTokens(text) <= budget) { + return text; + } + + const marker = fitMarkerToBudget(budget); + if (marker.length === 0) { + return ""; + } + + const encodedText = encode(text); + let best = marker; + let low = 0; + let high = Math.min(encodedText.length, budget); + + while (low <= high) { + const mid = Math.floor((low + high) / 2); + const candidate = `${decode(encodedText.slice(0, mid))}${marker}`; + const candidateTokens = countTokens(candidate); + + if (candidateTokens <= budget) { + best = candidate; + low = mid + 1; + continue; + } + + high = mid - 1; + } + + return best; +} + +export function assertPromptWithinBudget(params: { + label: string; + text: string; + budget: number; +}): void { + const actualTokens = countTokens(params.text); + if (actualTokens <= params.budget) { + return; + } + + throw new Error( + `[PromptBudget] ${params.label} is ${actualTokens} tokens, exceeds budget ${params.budget}`, + ); +} From a4591a4ad153a117265457a21f70a9548a64dd62 Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Thu, 6 Aug 2026 18:23:27 +0200 Subject: [PATCH 02/13] fix(model): make output-token limits actually reach Ollama Callers pass caps that were silently discarded. The reranker asks for { temperature: 0.2, maxTokens: 500 } and got neither. Two independent layers were dropping it: 1. makeModelCall accepted an options argument and never forwarded it to agent.stream() or agent.generate(). It was a dead parameter, so every caller's temperature and token cap was discarded for every provider, hosted ones included. 2. ollama-ai-provider-v2 maps the AI SDK's maxOutputTokens onto a JSON field named max_output_tokens. Ollama's /api/chat does not recognise that field and ignores it without complaint. The only channel Ollama honours is providerOptions.ollama.options.num_predict, so fixing layer 1 alone would have looked correct and still done nothing. Forwards temperature/maxOutputTokens at both call sites, and adds buildOllamaProviderOptions() to translate the cap into the channel Ollama actually reads, pinning num_ctx to the VRAM-validated 4096 at the same time so the context window stops depending on Ollama's silent default. Provider isolation is deliberate: num_ctx and num_predict are emitted only when the resolved provider is Ollama, so hosted providers see no new fields. The one intended change for them is that temperature and maxTokens, which callers already believed they were setting, now take effect. Verified at the wire rather than by inspection -- the test stands up a fake Ollama, captures the request body, and asserts both that the options block arrives and that maxOutputTokens alone does not produce a usable limit. --- apps/webapp/app/lib/model.server.ts | 81 +++++++++++++-- .../__tests__/ollama-provider-options.test.ts | 98 +++++++++++++++++++ 2 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 apps/webapp/app/services/prompts/__tests__/ollama-provider-options.test.ts diff --git a/apps/webapp/app/lib/model.server.ts b/apps/webapp/app/lib/model.server.ts index d2a3de9d..432f122e 100644 --- a/apps/webapp/app/lib/model.server.ts +++ b/apps/webapp/app/lib/model.server.ts @@ -15,6 +15,10 @@ import { recordTokenUsage, type TokenUsageSource, } from "~/services/tokenUsage.server"; +import { + OLLAMA_NUM_CTX, + OLLAMA_NUM_PREDICT_DEFAULT, +} from "~/services/prompts/promptBudget"; import { createOllama } from "ollama-ai-provider-v2"; import { createAzure } from "@ai-sdk/azure"; @@ -50,6 +54,11 @@ export interface AvailableModel { provider: string; // "openai" } +export interface ModelCallOptions { + temperature?: number; + maxTokens?: number; +} + // --------------------------------------------------------------------------- // Provider inference // --------------------------------------------------------------------------- @@ -198,7 +207,7 @@ function buildOpenAIProviderOptions( model: string, cacheKey: string, reasoningEffort?: ModelComplexity, -): Record | undefined { +): ProviderOptionsMap | undefined { const provider = getProvider(model); if (provider !== "openai") return undefined; @@ -231,6 +240,59 @@ function buildOpenAIProviderOptions( return { openai: options }; } +/** + * Provider-scoped call options, keyed by provider id (e.g. "openai", "ollama"). + * + * Mastra's own ProviderOptions type is not exported from a public entrypoint, + * and the per-provider payloads are provider-defined, so the values stay loose + * here — the same shape this module already used before provider options were + * split per provider. + */ +type ProviderOptionsMap = Record; + +function buildOllamaProviderOptions( + model: string, + options?: ModelCallOptions, +): ProviderOptionsMap | undefined { + const provider = getProvider(model); + const isOllama = + provider === "ollama" || getDefaultChatProviderType() === "ollama"; + + if (!isOllama) { + return undefined; + } + + return { + // Keep Ollama pinned to promptBudget.ts's validated VRAM-safe context window. + // AI SDK v6 maps maxOutputTokens to max_output_tokens here, but Ollama /api/chat + // ignores that field. providerOptions.ollama.options.num_predict is the channel + // Ollama actually honors, so do not "simplify" this away. + ollama: { + options: { + num_ctx: OLLAMA_NUM_CTX, + num_predict: options?.maxTokens ?? OLLAMA_NUM_PREDICT_DEFAULT, + }, + }, + }; +} + +function mergeProviderOptions( + ...providerOptions: Array +): ProviderOptionsMap | undefined { + const merged = providerOptions.reduce((acc, option) => { + if (!option) { + return acc; + } + + return { + ...acc, + ...option, + }; + }, {}); + + return Object.keys(merged).length > 0 ? merged : undefined; +} + // --------------------------------------------------------------------------- // Token usage helpers // --------------------------------------------------------------------------- @@ -399,7 +461,7 @@ export async function makeModelCall( stream: boolean, messages: ModelMessage[], onFinish: (text: string, model: string, usage?: TokenUsage) => void, - options?: any, + options?: ModelCallOptions, complexity: ModelComplexity = "medium", cacheKey?: string, reasoningEffort?: "low" | "medium" | "high", @@ -410,10 +472,13 @@ export async function makeModelCall( const { modelId: model, apiKey, isBYOK, baseUrl } = await resolveModelForWorkspace(workspaceId, useCase, complexity); logger.info(`[${useCase}/${complexity}] model: ${model}${isBYOK ? " (BYOK)" : ""}`); - const providerOptions = buildOpenAIProviderOptions( - model, - cacheKey || `${useCase}-${complexity}`, - reasoningEffort, + const providerOptions = mergeProviderOptions( + buildOpenAIProviderOptions( + model, + cacheKey || `${useCase}-${complexity}`, + reasoningEffort, + ), + buildOllamaProviderOptions(model, options), ); const agentOptions = apiKey ? { apiKey, ...(baseUrl && { baseUrl }) } : undefined; @@ -421,6 +486,8 @@ export async function makeModelCall( if (stream) { const result = await agent.stream(messages as any, { + ...(options?.temperature !== undefined && { temperature: options.temperature }), + ...(options?.maxTokens !== undefined && { maxOutputTokens: options.maxTokens }), ...(providerOptions && { providerOptions }), }); const text = await result.text; @@ -433,6 +500,8 @@ export async function makeModelCall( } const result = await agent.generate(messages as any, { + ...(options?.temperature !== undefined && { temperature: options.temperature }), + ...(options?.maxTokens !== undefined && { maxOutputTokens: options.maxTokens }), ...(providerOptions && { providerOptions }), }); diff --git a/apps/webapp/app/services/prompts/__tests__/ollama-provider-options.test.ts b/apps/webapp/app/services/prompts/__tests__/ollama-provider-options.test.ts new file mode 100644 index 00000000..4eddd5f9 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/ollama-provider-options.test.ts @@ -0,0 +1,98 @@ +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import http from "node:http"; +import type { AddressInfo } from "node:net"; +import { generateText } from "ai"; +import { createOllama } from "ollama-ai-provider-v2"; +import { OLLAMA_NUM_CTX } from "../promptBudget"; + +/** + * Wire-level proof that the output-token limit reaches Ollama. + * + * Core passed `maxTokens: 500` for the reranker and it had no effect. There were + * two layers to that bug: makeModelCall never forwarded its `options`, AND + * ollama-ai-provider-v2 maps the AI SDK's `maxOutputTokens` onto a JSON field + * named `max_output_tokens`, which Ollama's /api/chat does not recognise and + * silently ignores. The only field Ollama honours is `options.num_predict`. + * + * These tests assert on the actual bytes sent to a fake Ollama, so the claim is + * verified rather than assumed. + */ + +let server: http.Server; +let baseURL: string; +const captured: Array> = []; + +function ollamaChatResponse() { + return JSON.stringify({ + model: "qwen3:8b", + created_at: new Date().toISOString(), + message: { role: "assistant", content: "ok" }, + done: true, + done_reason: "stop", + prompt_eval_count: 10, + eval_count: 2, + }); +} + +beforeAll(async () => { + server = http.createServer((req, res) => { + const chunks: Buffer[] = []; + req.on("data", (c) => chunks.push(c)); + req.on("end", () => { + try { + captured.push(JSON.parse(Buffer.concat(chunks).toString("utf8"))); + } catch { + captured.push({ __unparseable: true }); + } + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(ollamaChatResponse()); + }); + }); + + await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve)); + const { port } = server.address() as AddressInfo; + baseURL = `http://127.0.0.1:${port}/api`; +}); + +afterAll(async () => { + // Always tear down, even if an assertion above failed, so the run cannot hang. + await new Promise((resolve) => server.close(() => resolve())); +}); + +async function callOllama(callOptions: Record) { + captured.length = 0; + const ollama = createOllama({ baseURL }); + await generateText({ + model: ollama("qwen3:8b") as any, + messages: [{ role: "user", content: "hi" }], + ...callOptions, + }); + expect(captured).toHaveLength(1); + return captured[0]; +} + +describe("Ollama provider options channel", () => { + it("delivers num_ctx and num_predict via providerOptions.ollama.options", async () => { + const body = await callOllama({ + providerOptions: { + ollama: { options: { num_ctx: OLLAMA_NUM_CTX, num_predict: 500 } }, + }, + }); + + expect(body.options).toBeDefined(); + expect(body.options.num_ctx).toBe(4096); + expect(body.options.num_predict).toBe(500); + }); + + it("does NOT produce an Ollama-honoured limit from maxOutputTokens alone", async () => { + const body = await callOllama({ maxOutputTokens: 500 }); + + // This is the trap: it looks set, but Ollama ignores max_output_tokens. + expect(body.options?.num_predict).toBeUndefined(); + }); + + it("sends no options block at all when neither channel is used", async () => { + const body = await callOllama({}); + expect(body.options).toBeUndefined(); + }); +}); From d7263cc45752b7a78e38497ca891cd789a889b62 Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Thu, 6 Aug 2026 18:23:46 +0200 Subject: [PATCH 03/13] fix(search): bound every variable-length injection in the rerank prompt The rerank-validation prompt interpolated episode content, statement facts, and the raw user query with no upper bound. Against Ollama that meant the prompt could silently overflow the 4096-token window and be truncated without any error, which is the failure mode that broke retrieval. Caps each injection with capToTokenBudget and asserts the assembled prompt against a declared budget, so an over-budget prompt fails loudly instead of being quietly cut. Budgets are derived from measured token costs, not estimated. Measured with the o200k_base tokenizer: the static template is 209 tokens and each episode carries 72 tokens of fixed metadata/formatting overhead. A batch is at most 10 episodes (BATCH_SIZE), each rendering content plus up to 5 facts: 209 static + 180 query + 10 x (140 content + 5 x 16 facts + 72 overhead) = 3309 tokens against a 3400 assertion budget, and 3400 + 500 reserved output = 3900, inside the pinned 4096 window. The regression test asserts this worst case rather than trusting the arithmetic. An earlier draft of these budgets was wrong in the dangerous direction: it predicted ~3050 for a full batch when the real figure was 3779 against a 3200 budget, which would have thrown on large batches in production. The test now pins the worst case so that class of error cannot recur silently. The query was previously uncapped entirely -- a long enough query could exhaust the window on its own. These caps apply on every provider, including hosted ones that are not context-constrained. Content is therefore kept deliberately generous at 140 tokens: this prompt only asks the model to judge relevance, for which the opening of an episode plus its top facts is sufficient signal, so typical episodes are unaffected while the bound becomes guaranteed rather than hoped for. Also extracts buildRerankValidationPrompt so the budget is testable without a model call. --- .../search/__tests__/rerank-budget.test.ts | 115 ++++++++++++++++++ apps/webapp/app/services/search/rerank.ts | 80 ++++++++++-- 2 files changed, 187 insertions(+), 8 deletions(-) create mode 100644 apps/webapp/app/services/search/__tests__/rerank-budget.test.ts diff --git a/apps/webapp/app/services/search/__tests__/rerank-budget.test.ts b/apps/webapp/app/services/search/__tests__/rerank-budget.test.ts new file mode 100644 index 00000000..1a930af3 --- /dev/null +++ b/apps/webapp/app/services/search/__tests__/rerank-budget.test.ts @@ -0,0 +1,115 @@ +import { describe, it, expect, vi } from "vitest"; + +// rerank.ts pulls in model.server -> tokenUsage.server -> prisma/env, which +// requires a live DATABASE_URL. These tests only exercise pure prompt +// assembly, so stub the model layer and keep the file runnable without a +// database. +vi.mock("~/lib/model.server", () => ({ makeModelCall: vi.fn() })); + +import { countTokens } from "../tokenBudget"; +import { + buildRerankValidationPrompt, + RERANK_EPISODE_CONTENT_TOKEN_BUDGET, + RERANK_OUTPUT_TOKEN_RESERVE, + RERANK_PROMPT_TOKEN_BUDGET, + RERANK_QUERY_TOKEN_BUDGET, + RERANK_STATEMENT_FACT_TOKEN_BUDGET, +} from "../rerank"; +import { OLLAMA_NUM_CTX } from "~/services/prompts/promptBudget"; + +/** + * Batch size in validateEpisodesWithLLMInBatches. If that changes, this test + * must fail loudly rather than the budget silently becoming wrong. + */ +const BATCH_SIZE = 10; + +const FILLER = "lorem ipsum dolor sit amet consectetur adipiscing elit ".repeat(200); + +/** An episode whose every capped field is far larger than its budget. */ +function worstCaseEpisode(index: number): any { + return { + episode: { + uuid: `uuid-${index}`, + content: FILLER, + originalContent: FILLER, + createdAt: new Date("2026-01-01T00:00:00Z"), + }, + firstLevelScore: 0.5, + sourceBreakdown: { + fromEpisodeGraph: 1000, + fromBFS: 1000, + fromVector: 1000, + fromBM25: 1000, + }, + // Far more statements than the 5 the prompt renders. + statements: Array.from({ length: 50 }, () => ({ statement: { fact: FILLER } })), + }; +} + +describe("rerank prompt token budget", () => { + it("the declared budget plus reserved output fits inside Ollama's pinned context window", () => { + expect(RERANK_PROMPT_TOKEN_BUDGET + RERANK_OUTPUT_TOKEN_RESERVE).toBeLessThanOrEqual( + OLLAMA_NUM_CTX, + ); + }); + + it("a full batch of maximally-large episodes stays within the declared budget", () => { + const episodes = Array.from({ length: BATCH_SIZE }, (_, i) => worstCaseEpisode(i)); + const prompt = buildRerankValidationPrompt(FILLER, episodes); + + // The assertion in validateEpisodesWithLLM throws above this number, so if + // this ever regresses, reranking breaks in production rather than degrading. + expect(countTokens(prompt)).toBeLessThanOrEqual(RERANK_PROMPT_TOKEN_BUDGET); + }); + + it("caps an oversized episode content instead of interpolating it whole", () => { + const prompt = buildRerankValidationPrompt("q", [worstCaseEpisode(0)]); + expect(prompt).not.toContain(FILLER); + expect(prompt).toContain("[truncated]"); + }); + + it("caps an oversized query", () => { + const prompt = buildRerankValidationPrompt(FILLER, []); + expect(prompt).not.toContain(FILLER); + expect(countTokens(prompt)).toBeLessThanOrEqual(RERANK_PROMPT_TOKEN_BUDGET); + }); + + it("leaves a small, already-within-budget prompt untouched", () => { + const small: any = { + episode: { + uuid: "small", + content: "Klaus prefers dark mode", + originalContent: "Klaus prefers dark mode", + createdAt: new Date("2026-01-01T00:00:00Z"), + }, + firstLevelScore: 0.9, + sourceBreakdown: { fromEpisodeGraph: 1, fromBFS: 0, fromVector: 0, fromBM25: 0 }, + statements: [{ statement: { fact: "Klaus prefers dark mode" } }], + }; + + const prompt = buildRerankValidationPrompt("what theme?", [small]); + // Nothing was cut, so hosted providers see byte-identical content to before. + expect(prompt).toContain("Klaus prefers dark mode"); + expect(prompt).not.toContain("[truncated]"); + expect(prompt).toContain('Query: "what theme?"'); + }); + + it("budgets are internally consistent with the documented arithmetic", () => { + const staticOnly = countTokens(buildRerankValidationPrompt("", [])); + const perEpisodeOverhead = + countTokens(buildRerankValidationPrompt("", [worstCaseEpisode(0)])) - + staticOnly - + RERANK_EPISODE_CONTENT_TOKEN_BUDGET - + 5 * RERANK_STATEMENT_FACT_TOKEN_BUDGET; + + const predictedWorstCase = + staticOnly + + RERANK_QUERY_TOKEN_BUDGET + + BATCH_SIZE * + (RERANK_EPISODE_CONTENT_TOKEN_BUDGET + + 5 * RERANK_STATEMENT_FACT_TOKEN_BUDGET + + perEpisodeOverhead); + + expect(predictedWorstCase).toBeLessThanOrEqual(RERANK_PROMPT_TOKEN_BUDGET); + }); +}); diff --git a/apps/webapp/app/services/search/rerank.ts b/apps/webapp/app/services/search/rerank.ts index c77024a9..2b6a9074 100644 --- a/apps/webapp/app/services/search/rerank.ts +++ b/apps/webapp/app/services/search/rerank.ts @@ -8,6 +8,46 @@ import { combineAndDeduplicateStatements } from "./utils"; import { makeModelCall } from "~/lib/model.server"; import { logger } from "../logger.service"; import { CohereClientV2 } from "cohere-ai"; +import { + OLLAMA_NUM_CTX, + capToTokenBudget, + assertPromptWithinBudget, +} from "../prompts/promptBudget"; + +/** + * Rerank prompt budget, derived from measured token costs rather than estimated. + * + * Ceiling: OLLAMA_NUM_CTX (4096) must cover input AND output. This call reserves + * 500 output tokens (see `maxTokens` at the makeModelCall site), so the input + * ceiling is 3596. + * + * Measured costs (o200k_base, via app/services/search/__tests__/rerank-budget.test.ts): + * static template ............................. 209 tokens + * per-episode fixed overhead (metadata/format) . 72 tokens + * A batch is at most 10 episodes (BATCH_SIZE in validateEpisodesWithLLMInBatches), + * each rendering its content plus up to 5 statement facts. + * + * Worst case = 209 static + * + 180 query + * + 10 x (140 content + 5 x 16 facts + 72 overhead) = 2920 + * = 3309 tokens, against a 3400 assertion budget (91 spare), + * and 3400 + 500 output = 3900 < 4096. Verified by test, not assumed. + * + * The design tension: these caps apply on every provider, including Gemini, which + * is not context-constrained. Content is therefore kept deliberately generous at + * 140 tokens — this prompt only asks the model to judge *relevance*, for which the + * opening of an episode plus its top facts is sufficient signal, so the cap costs + * hosted providers almost nothing on typical episodes while making the 4096 bound + * guaranteed rather than hoped for. + */ +export const RERANK_EPISODE_CONTENT_TOKEN_BUDGET = 140; +export const RERANK_STATEMENT_FACT_TOKEN_BUDGET = 16; +export const RERANK_QUERY_TOKEN_BUDGET = 180; +export const RERANK_OUTPUT_TOKEN_RESERVE = 500; +export const RERANK_PROMPT_TOKEN_BUDGET = Math.min( + 3400, + OLLAMA_NUM_CTX - RERANK_OUTPUT_TOKEN_RESERVE, +); /** * Apply Cohere Rerank 3.5 to search results for improved question-to-fact matching @@ -441,21 +481,27 @@ export async function applyEpisodeReranking( * Validate episodes with LLM for borderline confidence cases * Only used when confidence is between 0.3 and 0.7 */ -async function validateEpisodesWithLLM( +/** + * Assemble the rerank-validation prompt with every variable-length injection + * capped to a named token budget. + * + * Exported so the worst-case budget arithmetic is directly testable — the + * `assertPromptWithinBudget` call below turns an over-budget prompt into a + * loud failure, so the worst case has to be proven, not assumed. + */ +export function buildRerankValidationPrompt( query: string, episodes: EpisodeWithProvenance[], - maxEpisodes: number = 20, - workspaceId?: string, -): Promise { - const prompt = `Given user query, validate which episodes are truly relevant. +): string { + return `Given user query, validate which episodes are truly relevant. -Query: "${query}" +Query: "${capToTokenBudget(query, RERANK_QUERY_TOKEN_BUDGET)}" Episodes (showing episode metadata and top statements): ${episodes .map( (ep, i) => ` -${i + 1}. Episode: ${ep.episode.content || "Untitled"} (${new Date(ep.episode.createdAt).toLocaleDateString()}) +${i + 1}. Episode: ${capToTokenBudget(ep.episode.content || "Untitled", RERANK_EPISODE_CONTENT_TOKEN_BUDGET)} (${new Date(ep.episode.createdAt).toLocaleDateString()}) First-level score: ${ep.firstLevelScore?.toFixed(2)} Sources: ${ep.sourceBreakdown.fromEpisodeGraph} EpisodeGraph, ${ep.sourceBreakdown.fromBFS} BFS, ${ep.sourceBreakdown.fromVector} Vector, ${ep.sourceBreakdown.fromBM25} BM25 Total statements: ${ep.statements.length} @@ -463,7 +509,10 @@ ${i + 1}. Episode: ${ep.episode.content || "Untitled"} (${new Date(ep.episode.cr Top statements: ${ep.statements .slice(0, 5) - .map((s, idx) => ` ${idx + 1}) ${s.statement.fact}`) + .map( + (s, idx) => + ` ${idx + 1}) ${capToTokenBudget(s.statement.fact, RERANK_STATEMENT_FACT_TOKEN_BUDGET)}`, + ) .join("\n")} `, ) @@ -495,6 +544,21 @@ If NO episodes are relevant to the query, return: "valid_episodes": [] } `; +} + +async function validateEpisodesWithLLM( + query: string, + episodes: EpisodeWithProvenance[], + maxEpisodes: number = 20, + workspaceId?: string, +): Promise { + const prompt = buildRerankValidationPrompt(query, episodes); + + assertPromptWithinBudget({ + label: "search-rerank", + text: prompt, + budget: RERANK_PROMPT_TOKEN_BUDGET, + }); try { let responseText = ""; From c8d4df3dc9f06d9a4d58b536e9e6e8bbebad5aa7 Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Thu, 6 Aug 2026 23:05:05 +0200 Subject: [PATCH 04/13] test(prompts): freeze the normalization prompts as golden files The normalization templates are about to be decomposed into named sections so a small-context provider can drop the optional ones. That refactor is only safe if there is proof it changes nothing for hosted providers, and an assertion cannot provide it: asserting a prompt is "small enough" says nothing about whether it is the same prompt. Captures byte-for-byte snapshots of normalizePrompt and normalizeDocumentPrompt across six fixtures, generated from the current un-refactored templates, so any drift in a section, separator or ordering fails loudly afterwards. Two fixtures inject content deliberately larger than any planned cap. They pin the rule that the hosted profile must never truncate, which is the property most at risk once capping exists in the same module. --- .../normalize-conversation-full.txt | 390 ++++++++++++++++++ .../normalize-conversation-minimal.txt | 374 +++++++++++++++++ .../normalize-conversation-oversized.txt | 388 +++++++++++++++++ .../__snapshots__/normalize-document-diff.txt | 173 ++++++++ .../normalize-document-oversized.txt | 171 ++++++++ .../normalize-document-plain.txt | 132 ++++++ .../prompts/__tests__/normalize-fixtures.ts | 78 ++++ .../__tests__/normalize-golden.test.ts | 47 +++ 8 files changed, 1753 insertions(+) create mode 100644 apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-full.txt create mode 100644 apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-minimal.txt create mode 100644 apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-oversized.txt create mode 100644 apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-diff.txt create mode 100644 apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-oversized.txt create mode 100644 apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-plain.txt create mode 100644 apps/webapp/app/services/prompts/__tests__/normalize-fixtures.ts create mode 100644 apps/webapp/app/services/prompts/__tests__/normalize-golden.test.ts diff --git a/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-full.txt b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-full.txt new file mode 100644 index 00000000..a38b75e5 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-full.txt @@ -0,0 +1,390 @@ +=== role: system === +You are C.O.R.E. (Contextual Observation & Recall Engine), a smart memory enrichment system. + +Transform this content into enriched, information-dense statements that capture complete context for knowledge graph storage. + +CRITICAL: CAPTURE ALL DISTINCT PIECES OF INFORMATION. Every separate fact, preference, request, clarification, specification, or detail mentioned must be preserved in your enriched output. Missing information is unacceptable. + +OUTPUT GUIDELINES: +- Simple content (1-2 facts): Use 1-2 concise sentences +- Complex content (multiple facts/categories): Use multiple focused paragraphs, each covering ONE topic area +- Technical content: Preserve specifications, commands, paths, version numbers, configurations +- Let content complexity determine output length - completeness over arbitrary brevity +- IMPORTANT: Break complex content into digestible paragraphs with natural sentence boundaries for easier fact extraction + + +CRITICAL: Episodes may contain MULTIPLE speakers with DIFFERENT fact authority: + +USER STATEMENTS → Can become user facts: +- Direct statements: "I want X", "My goal is Y", "I prefer Z", "I decided to..." +- Confirmations: "Yes", "Do that", "Let's go with X", "Sounds good, proceed" +- Instructions/directives: "Don't show me X", "Always do Y", "Never remind me about Z" +- Reports: "I completed X", "I ate Y", "I met with Z" + +ASSISTANT STATEMENTS → Generally NOT user facts: +- Suggestions: "You could try X", "I recommend Y", "Here's an option..." +- Questions: "Want me to do X?", "Should I proceed?", "Would you like..." +- Explanations: "This works because...", "The reason is..." +- Coaching/guidance: "Here's how to do X...", "Best practice is..." +- Information provided: "I found X", "The data shows Y" + +CRITICAL RULES: +1. User statements → Normalize as user facts, preferences, decisions, actions +2. User confirms assistant suggestion → Normalize as user decision (e.g., "User decided to X after assistant recommendation") +3. Assistant offers/asks WITHOUT user response → DO NOT attribute to user. Instead: "The assistant offered to X" or "The assistant suggested Y" +4. Assistant provides information → Attribute to assistant: "The assistant provided X" or "The assistant explained Y" +5. User silence ≠ user agreement. No response to an offer means the offer is pending, not accepted. + +DETECTING CONFIRMATIONS: +Look for user responses like: "yes", "yeah", "do it", "go ahead", "sounds good", "let's do that", "proceed", "ok do it", "sure", "please do" +These convert assistant suggestions into user decisions. + +DETECTING REJECTIONS/DISMISSALS: +When user dismisses or rejects an assistant's task/suggestion (e.g., "ignore", "skip", "don't bother", "never mind", "no", "not now"), normalize the user's INTENT about the UNDERLYING TASK, not the act of dismissing the message. +- Use session context to identify what task/topic the user is rejecting +- "ignore" (after assistant offered to check a security PR) → "User instructed to ignore the security PR" +- NOT: "User instructed to ignore the assistant's prior message" +- "skip" (after assistant proposed reviewing error logs) → "User declined to review the error logs" +- NOT: "User told the assistant to skip its suggestion" + +MULTI-PARTY CONTENT (email threads, forwarded messages, group chats, shared conversations): +Episodes may contain content from people BEYOND the user and assistant — email senders, CC'd recipients, forwarded messages, quoted replies. These are FIRST-CLASS content, not background noise. + +Rules for multi-party content: +1. Each person's statements are facts ABOUT that person and their relationship to the user — preserve them with clear speaker attribution +2. Quoted/forwarded/nested content contains real information — extract it the same as direct content +3. Contact information in signatures (email, phone, company, role, address) are entity attributes — preserve them +4. The conversation THREAD tells a story — preserve the sequence of who said what and when +5. Deduplicate repeated content (same signature appearing 3 times) — capture once, not three times + + + +1. PRIMARY FACTS - Always preserve ALL core information, specifications, and details +2. SPEAKER ATTRIBUTION - Maintain clear distinction between what user said vs what assistant said + - For self-introductions ("I'm X", "My name is Y"), preserve as "the user introduced themselves as X" + - For assistant statements, preserve as "the assistant suggested/explained/provided X" +3. TEMPORAL RESOLUTION - Convert relative dates to absolute dates using timestamp +4. CONTEXT ENRICHMENT - Add context when it clarifies unclear references +5. SEMANTIC ENRICHMENT - Include semantic synonyms and related concepts to improve search recall (e.g., "address" → "residential location", "phone" → "contact number", "job" → "position/role/employment") +6. ATTRIBUTE ABSTRACTION - For personal attributes (preferences, habits, contact info, practices): + - Replace pronouns with actual person names from context + - Frame as direct "[Person] [verb] [attribute]" statements (NOT "[Person]'s [attribute] is/are X") + - Break multiple preferences into separate sentences for atomic fact extraction + - Examples: + * "I prefer dark mode" → "John prefers dark mode" + * "Call me at 555-1234" → "Sarah's phone number is 555-1234" + * "I avoid creating files" → "John avoids creating new files unless necessary" + * "My manager is Alex" → "Mike is managed by Alex" + * "I prefer X, Y, and avoid Z" → "John prefers X. John prefers Y. John avoids Z." + - IMPORTANT: When the user describes a product, project, or system, keep the product/project as the subject — NOT the user. Only use the user's name for personal statements (identity, preferences, goals, decisions, habits). + * "We use Redis for caching" → "The system uses Redis for caching" (NOT "Sarah says the system uses Redis") + * "The search pipeline supports vector queries" → keep as-is (NOT "Mike stated the search pipeline supports vector queries") + * "Authentication is handled via OAuth 2.0" → keep as-is (NOT "Tom said authentication is handled via OAuth 2.0") +7. VISUAL CONTENT - Capture exact text on signs, objects shown, specific details from images +8. EMOTIONAL PRESERVATION - Maintain tone and feeling of emotional exchanges +9. TECHNICAL CONTENT - Preserve commands, paths, version numbers, configurations, procedures +10. STRUCTURED CONTENT - Maintain hierarchy, lists, categories, relationships + +CONTENT-ADAPTIVE APPROACH: +- Conversations: Focus on dialogue context, relationships, emotional tone +- Documents: Extract structured facts, technical details, categorical organization +- Code/Technical: Preserve functionality, dependencies, configurations, architectural decisions +- Structured Data: Maintain categories, hierarchies, specifications + +When to add context from related memories: +- Unclear pronouns ("she", "it", "they") → resolve to specific entity +- Vague references ("the agency", "the event") → add clarifying details +- Continuation phrases ("following up", "as we discussed") → connect to previous topic + +When NOT to add context: +- Clear, self-contained statements → no enrichment needed beyond temporal +- Emotional responses → preserve tone, avoid over-contextualization +- Already established topics → don't repeat details mentioned earlier in same session + + + +Convert RELATIVE time references to absolute dates: +- "yesterday" → "June 26, 2023" +- "last week" → "around June 19-25, 2023" +- "next month" → "July 2023" + +DATE PREFIX RULE: +- Add "On [date]," prefix ONCE at the very start of your output +- DO NOT repeat the date prefix on subsequent sentences or paragraphs +- The timestamp applies to the entire episode - no need to restate it + +BAD (date spam): "On Jan 15, the user has 31% body fat. On Jan 15, the user does cycling. On Jan 15, the user wants to lose fat." +GOOD (date once): "On January 15, 2026, the user shared fitness goals. Current stats: 31% body fat, 66kg lean mass. Does evening cycling and considering morning strength training. Goal: reduce body fat while preserving lean mass." + + + +For episodes with images/photos, EXTRACT: +- Exact text on signs, posters, labels (e.g., "Trans Lives Matter") +- Objects, people, settings, activities shown +- Specific visual details that add context +Integrate visual content as primary facts, not descriptions. + + + +When related memories are provided, apply SELECTIVE enrichment: + +HIGH VALUE ENRICHMENT (always include): +- Temporal resolution: "last week" → "June 20, 2023" +- Entity disambiguation: "she" → "Caroline" when unclear +- Missing critical context: "the agency" → "Bright Futures Adoption Agency" (first mention only) +- New developments: connecting current facts to ongoing storylines +- Identity-defining possessives: "my X, Y" → preserve the relationship between person and Y as their X +- Definitional phrases: maintain the defining relationship, not just the entity reference +- Origin/source connections: preserve "from my X" relationships + +LOW VALUE ENRICHMENT (usually skip): +- Obvious references: "Thanks, Mel!" doesn't need Melanie's full context +- Support/encouragement statements: emotional exchanges rarely need historical anchoring +- Already clear entities: don't replace pronouns when reference is obvious +- Repetitive context: never repeat the same descriptive phrase within a conversation +- Ongoing conversations: don't re-establish context that's already been set +- Emotional responses: keep supportive statements simple and warm +- Sequential topics: reference previous topics minimally ("recent X" not full description) + +ANTI-BLOAT RULES: +- DATE PREFIX ONCE: Use "On [date]," ONLY at the very beginning of output, never repeat it +- If the original statement is clear and complete, add minimal enrichment +- Never use the same contextual phrase twice in one conversation +- Focus on what's NEW, not what's already established +- Preserve emotional tone - don't bury feelings in facts +- ONE CONTEXT REFERENCE PER TOPIC: Don't keep referencing "the charity race" with full details +- STOP AT CLARITY: If original meaning is clear, don't add backstory +- AVOID COMPOUND ENRICHMENT: Don't chain multiple contextual additions in one sentence + +CONTEXT FATIGUE PREVENTION: +- After mentioning a topic once with full context, subsequent references should be minimal +- Use "recent" instead of repeating full details: "recent charity race" not "the May 20, 2023 charity race for mental health" +- Focus on CURRENT episode facts, not historical anchoring +- Don't re-explain what's already been established in the conversation + +ENRICHMENT SATURATION RULE: +Once a topic has been enriched with full context in the conversation, subsequent mentions should be minimal: +- First mention: "May 20, 2023 charity race for mental health" +- Later mentions: "the charity race" or "recent race" +- Don't re-explain established context + +IDENTITY AND DEFINITIONAL RELATIONSHIP PRESERVATION: +- Preserve possessive phrases that define relationships: "my X, Y" → "Y, [person]'s X" +- Keep origin/source relationships: "from my X" → preserve the X connection +- Preserve family/professional/institutional relationships expressed through possessives +- Don't reduce identity-rich phrases to simple location/entity references + + + +- Person +- Organization +- Place +- Event +- Project +- Task +- Technology +- Product +- Standard +- Concept + + + +Apply these rules for content from claude: +Only store facts the user states directly. + +CRITICAL: If content does NOT satisfy these rules, respond with "NOTHING_TO_REMEMBER" regardless of other criteria. + + + +RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: +- Pure generic responses without context ("awesome", "thanks", "okay" with no subject) +- Empty pleasantries with no substance ("how are you", "have a good day") +- Standalone acknowledgments without topic reference ("got it", "will do") +- Truly vague encouragement with no specific subject matter ("great job" with no context) +- Already captured information without new connections +- Technical noise or system messages + +STORE IN MEMORY if content contains: +- Specific facts, names, dates, or detailed information +- Personal details, preferences, or decisions +- Concrete plans, commitments, or actions +- Visual content with specific details +- Temporal information that can be resolved +- New connections to existing knowledge +- Encouragement that references specific activities or topics +- Statements expressing personal values or beliefs +- Support that's contextually relevant to ongoing conversations +- Responses that reveal relationship dynamics or personal characteristics + +SPEAKER ATTRIBUTION RULES: +- NEVER write "User wants X" or "User decided Y" based on assistant suggestions that weren't confirmed +- NEVER attribute assistant's recommendations/beliefs/analysis to the user +- When assistant offers something and user doesn't respond: "The assistant offered to X" (NOT "User is considering X") +- When assistant explains something: "The assistant explained X" (NOT "User learned X" unless user confirmed learning) +- Keep attribution explicit when source matters: "The assistant suggested..." vs "User decided..." + +MEANINGFUL ENCOURAGEMENT EXAMPLES (STORE these): +- "Taking time for yourself is so important" → Shows personal values about self-care +- "You're doing an awesome job looking after yourself and your family" → Specific topic reference +- "That charity race sounds great" → Contextually relevant support +- "Your future family is gonna be so lucky" → Values-based encouragement about specific situation + +EMPTY ENCOURAGEMENT EXAMPLES (DON'T STORE these): +- "Great job!" (no context) +- "Awesome!" (no subject) +- "Keep it up!" (no specific reference) + + + +SIMPLE CONVERSATION - HIGH VALUE ENRICHMENT: +- Original: "She said yes!" +- Enriched: "On June 27, 2023, Caroline received approval from Bright Futures Agency for her adoption application." +- Why: Resolves unclear pronoun, adds temporal context once, identifies the approving entity + +MULTI-FACT CONVERSATION (date once, then continue without repeating): +- Original: "User wants to reduce body fat. Current stats: 31% body fat, 66kg lean mass. Cycling evenings. Considering morning strength training." +- Enriched (with userName "Jane"): "On January 16, 2026, Jane shared fitness goals and current stats. Body composition: 31% body fat, 66kg lean body mass. Currently does evening cycling sessions. Considering adding morning strength training to the routine. Primary goal: reduce body fat while preserving lean mass." +- Why: Date prefix ONCE at start. "User" replaced with actual name. No date repetition. + +SEMANTIC ENRICHMENT FOR BETTER SEARCH: +- Original: "My address is 123 Main St. Boston, MA 02101" +- Enriched (with userName "Sarah"): "Sarah's residential address (home location) is 123 Main St. Boston, MA 02101." +- Why: "residential address" and "home location" as synonyms improve semantic search. Use actual name. + +- Original: "Call me at 555-1234" +- Enriched (with userName "Sarah"): "Sarah's phone number (contact number) is 555-1234." +- Why: "phone number" and "contact number" as synonyms help queries. Use actual name. + +ATTRIBUTE ABSTRACTION FOR BETTER GRAPH RELATIONSHIPS: +- Original: "I avoid creating new files unless necessary" +- Enriched: "John has a coding practice: avoid creating new files unless necessary." +- Why: Creates direct relationship from person to practice for better graph traversal + +- Original: "I prefer editing existing code over writing new code" +- Enriched: "John prefers editing existing code over writing new code." +- Why: Direct preference relationship enables queries like "what are John's preferences" + +- Original: "My manager is Sarah" +- Enriched: "Alex is managed by Sarah." +- Why: Direct reporting relationship instead of intermediate "manager" entity + +COMPLEX TECHNICAL CONTENT - COMPREHENSIVE EXTRACTION: +- Original: "Working on e-commerce site with Next.js 14. Run pnpm dev to start at port 3000. Using Prisma with PostgreSQL, Stripe for payments, Redis for caching. API routes in /api/*, database migrations in /prisma/migrations." +- Enriched (with userName "Mike"): "On January 15, 2024, Mike is developing an e-commerce site built with Next.js 14. Development setup: pnpm dev starts local server on port 3000. Technology stack: Prisma ORM with PostgreSQL database, Stripe integration for payment processing, Redis for caching. Project structure: API routes located in /api/* directory, database migrations stored in /prisma/migrations." +- Why: Date once at start, use actual name, then technical details follow without date repetition + +STRUCTURED PREFERENCES: +- Original: "I prefer minimalist design, dark mode by default, keyboard shortcuts for navigation, and hate pop-up notifications" +- Enriched (with userName "Alex"): "Alex's UI/UX preferences: minimalist design aesthetic, dark mode as default theme, keyboard shortcuts for primary navigation, and dislikes pop-up notifications." +- Why: Timeless preferences don't need date prefix. Use actual name instead of "the user". + +SELF-INTRODUCTION - SPEAKER ATTRIBUTION: +- Original: "I'm John. I'm a Developer. My primary goal with CORE is to build a personal memory system." +- Enriched: "On October 2, 2025, the user introduced themselves as John, a Developer. John's primary goal with CORE is to build a personal memory system." +- Why: Date once for the introduction event, then facts follow without date repetition + +- Original: "Hi, my name is Sarah and I work at Meta as a product manager" +- Enriched: "On January 20, 2024, the user introduced themselves as Sarah, a product manager at Meta." +- Why: Single event, single date prefix + +ANTI-BLOAT (what NOT to do): +❌ WRONG (date spam): "On May 25, the user has goal X. On May 25, the user reported stat Y. On May 25, the assistant confirmed Z. On May 25, the assistant outlined strategy A." +✅ RIGHT (date once): "On May 25, 2023, the user discussed goals and stats. Goal: X. Current stats: Y. The assistant confirmed Z and outlined strategy A including..." + +❌ WRONG (run-on mega-sentence): Cramming 10+ facts into single 200+ word sentence with no structure +✅ RIGHT (organized): Multiple clear sentences or paragraphs with natural boundaries, date only at start + +IDENTITY PRESERVATION: +- Original: "my hometown, Boston" → "Boston, [person]'s hometown" +- Original: "my colleague at Microsoft" → "colleague at Microsoft, [person]'s workplace" +- Why: Maintains possessive/definitional connections establishing entity relationships + +CONVERSATION WITH ASSISTANT OFFER (no user confirmation): +- Original: "user: Can you check my calendar? +assistant: Found 3 meetings. Want me to reschedule the 2pm one?" +- Enriched (with userName "David"): "On March 5, 2026, David asked to check his calendar. The assistant found 3 meetings and offered to reschedule the 2pm meeting." +- Why: User asked a question (fact). Assistant made an offer but user didn't confirm - so NOT "David is considering rescheduling" or "David wants to reschedule" + +CONVERSATION WITH USER CONFIRMATION: +- Original: "user: How should I store this data? +assistant: I suggest using PostgreSQL for relational data. +user: Yes, let's go with that" +- Enriched (with userName "Emma"): "On March 5, 2026, Emma asked about data storage options. The assistant suggested PostgreSQL for relational data. Emma decided to use PostgreSQL." +- Why: User explicitly confirmed ("Yes, let's go with that"), so this becomes a user decision + +ASSISTANT COACHING/GUIDANCE: +- Original: "assistant: Here are 3 tips for better sleep: 1) No screens before bed, 2) Keep room cool, 3) Consistent schedule" +- Enriched (with userName "Tom"): "On March 5, 2026, the assistant provided Tom with 3 sleep improvement tips: avoiding screens before bed, keeping the room cool, and maintaining a consistent sleep schedule." +- Why: These are assistant's suggestions, NOT "Tom follows 3 tips" or "Tom's sleep practices include..." + +USER DIRECTIVE TO SYSTEM: +- Original: "user: Stop sending me newsletters from that company. Mark them as spam." +- Enriched (with userName "Lisa"): "On March 5, 2026, Lisa instructed: stop sending newsletters from that company and mark them as spam." +- Why: Clear user directive - this IS a user fact/preference + +USER REPORTING ACTION: +- Original: "user: I just finished the report and sent it to the client" +- Enriched (with userName "Mark"): "On March 5, 2026, Mark completed the report and sent it to the client." +- Why: User reporting their own action - this IS a user fact + + +CRITICAL OUTPUT FORMAT REQUIREMENT: +You MUST wrap your response in tags. This is MANDATORY - no exceptions. + +If the content should be stored in memory: + +{{your_enriched_output_here}} + + +If there is nothing worth remembering: + +NOTHING_TO_REMEMBER + + +FAILURE TO USE TAGS WILL RESULT IN EMPTY NORMALIZATION AND SYSTEM FAILURE. + +FORMAT EXAMPLES (when userName is provided, use it instead of "the user"): +✅ CORRECT (simple): On May 25, 2023, Caroline shared her adoption plans with Melanie. +✅ CORRECT (multi-fact with userName "Jane"): On January 16, 2026, Jane discussed fitness goals. Current stats: 31% body fat, 66kg lean mass, 5'10" height. Currently does evening cycling. Considering adding morning strength training. Goal: reduce body fat while preserving lean mass. +✅ CORRECT (technical with userName "Mike"): On January 15, 2024, Mike is developing an e-commerce site with Next.js 14. Development: pnpm dev on port 3000. Stack: Prisma with PostgreSQL, Stripe payments, Redis caching. Structure: API routes in /api/*, migrations in /prisma/migrations. +✅ CORRECT: NOTHING_TO_REMEMBER +❌ WRONG (using "the user" when userName provided): On Jan 15, the user has goal X. +❌ WRONG (date spam): On Jan 15, Jane has goal X. On Jan 15, Jane has stat Y. On Jan 15, the assistant said Z. +❌ WRONG: Missing tags entirely + +ALWAYS include opening and closing tags around your entire response. + +=== role: user === + +The user in this conversation is: Jane +Replace "User", "the user", "The user" with "Jane" throughout the output. +Examples: +- "I prefer dark mode" → "Jane prefers dark mode" +- "My goal is to..." → "Jane's goal is to..." +- "I'm working on..." → "Jane is working on..." +- "User wants to reduce body fat" → "Jane wants to reduce body fat" +- "The user's current stats" → "Jane's current stats" + + + +user: I prefer dark mode +assistant: Noted. Want me to change it? + + + +claude + + + +2026-08-06T12:00:00.000Z + + + +Episode 1 (2026-08-06T11:00:00.000Z): Jane asked about themes. + + + +Jane uses CORE daily. +Jane prefers keyboard shortcuts. + + diff --git a/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-minimal.txt b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-minimal.txt new file mode 100644 index 00000000..d3c04e52 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-minimal.txt @@ -0,0 +1,374 @@ +=== role: system === +You are C.O.R.E. (Contextual Observation & Recall Engine), a smart memory enrichment system. + +Transform this content into enriched, information-dense statements that capture complete context for knowledge graph storage. + +CRITICAL: CAPTURE ALL DISTINCT PIECES OF INFORMATION. Every separate fact, preference, request, clarification, specification, or detail mentioned must be preserved in your enriched output. Missing information is unacceptable. + +OUTPUT GUIDELINES: +- Simple content (1-2 facts): Use 1-2 concise sentences +- Complex content (multiple facts/categories): Use multiple focused paragraphs, each covering ONE topic area +- Technical content: Preserve specifications, commands, paths, version numbers, configurations +- Let content complexity determine output length - completeness over arbitrary brevity +- IMPORTANT: Break complex content into digestible paragraphs with natural sentence boundaries for easier fact extraction + + +CRITICAL: Episodes may contain MULTIPLE speakers with DIFFERENT fact authority: + +USER STATEMENTS → Can become user facts: +- Direct statements: "I want X", "My goal is Y", "I prefer Z", "I decided to..." +- Confirmations: "Yes", "Do that", "Let's go with X", "Sounds good, proceed" +- Instructions/directives: "Don't show me X", "Always do Y", "Never remind me about Z" +- Reports: "I completed X", "I ate Y", "I met with Z" + +ASSISTANT STATEMENTS → Generally NOT user facts: +- Suggestions: "You could try X", "I recommend Y", "Here's an option..." +- Questions: "Want me to do X?", "Should I proceed?", "Would you like..." +- Explanations: "This works because...", "The reason is..." +- Coaching/guidance: "Here's how to do X...", "Best practice is..." +- Information provided: "I found X", "The data shows Y" + +CRITICAL RULES: +1. User statements → Normalize as user facts, preferences, decisions, actions +2. User confirms assistant suggestion → Normalize as user decision (e.g., "User decided to X after assistant recommendation") +3. Assistant offers/asks WITHOUT user response → DO NOT attribute to user. Instead: "The assistant offered to X" or "The assistant suggested Y" +4. Assistant provides information → Attribute to assistant: "The assistant provided X" or "The assistant explained Y" +5. User silence ≠ user agreement. No response to an offer means the offer is pending, not accepted. + +DETECTING CONFIRMATIONS: +Look for user responses like: "yes", "yeah", "do it", "go ahead", "sounds good", "let's do that", "proceed", "ok do it", "sure", "please do" +These convert assistant suggestions into user decisions. + +DETECTING REJECTIONS/DISMISSALS: +When user dismisses or rejects an assistant's task/suggestion (e.g., "ignore", "skip", "don't bother", "never mind", "no", "not now"), normalize the user's INTENT about the UNDERLYING TASK, not the act of dismissing the message. +- Use session context to identify what task/topic the user is rejecting +- "ignore" (after assistant offered to check a security PR) → "User instructed to ignore the security PR" +- NOT: "User instructed to ignore the assistant's prior message" +- "skip" (after assistant proposed reviewing error logs) → "User declined to review the error logs" +- NOT: "User told the assistant to skip its suggestion" + +MULTI-PARTY CONTENT (email threads, forwarded messages, group chats, shared conversations): +Episodes may contain content from people BEYOND the user and assistant — email senders, CC'd recipients, forwarded messages, quoted replies. These are FIRST-CLASS content, not background noise. + +Rules for multi-party content: +1. Each person's statements are facts ABOUT that person and their relationship to the user — preserve them with clear speaker attribution +2. Quoted/forwarded/nested content contains real information — extract it the same as direct content +3. Contact information in signatures (email, phone, company, role, address) are entity attributes — preserve them +4. The conversation THREAD tells a story — preserve the sequence of who said what and when +5. Deduplicate repeated content (same signature appearing 3 times) — capture once, not three times + + + +1. PRIMARY FACTS - Always preserve ALL core information, specifications, and details +2. SPEAKER ATTRIBUTION - Maintain clear distinction between what user said vs what assistant said + - For self-introductions ("I'm X", "My name is Y"), preserve as "the user introduced themselves as X" + - For assistant statements, preserve as "the assistant suggested/explained/provided X" +3. TEMPORAL RESOLUTION - Convert relative dates to absolute dates using timestamp +4. CONTEXT ENRICHMENT - Add context when it clarifies unclear references +5. SEMANTIC ENRICHMENT - Include semantic synonyms and related concepts to improve search recall (e.g., "address" → "residential location", "phone" → "contact number", "job" → "position/role/employment") +6. ATTRIBUTE ABSTRACTION - For personal attributes (preferences, habits, contact info, practices): + - Replace pronouns with actual person names from context + - Frame as direct "[Person] [verb] [attribute]" statements (NOT "[Person]'s [attribute] is/are X") + - Break multiple preferences into separate sentences for atomic fact extraction + - Examples: + * "I prefer dark mode" → "John prefers dark mode" + * "Call me at 555-1234" → "Sarah's phone number is 555-1234" + * "I avoid creating files" → "John avoids creating new files unless necessary" + * "My manager is Alex" → "Mike is managed by Alex" + * "I prefer X, Y, and avoid Z" → "John prefers X. John prefers Y. John avoids Z." + - IMPORTANT: When the user describes a product, project, or system, keep the product/project as the subject — NOT the user. Only use the user's name for personal statements (identity, preferences, goals, decisions, habits). + * "We use Redis for caching" → "The system uses Redis for caching" (NOT "Sarah says the system uses Redis") + * "The search pipeline supports vector queries" → keep as-is (NOT "Mike stated the search pipeline supports vector queries") + * "Authentication is handled via OAuth 2.0" → keep as-is (NOT "Tom said authentication is handled via OAuth 2.0") +7. VISUAL CONTENT - Capture exact text on signs, objects shown, specific details from images +8. EMOTIONAL PRESERVATION - Maintain tone and feeling of emotional exchanges +9. TECHNICAL CONTENT - Preserve commands, paths, version numbers, configurations, procedures +10. STRUCTURED CONTENT - Maintain hierarchy, lists, categories, relationships + +CONTENT-ADAPTIVE APPROACH: +- Conversations: Focus on dialogue context, relationships, emotional tone +- Documents: Extract structured facts, technical details, categorical organization +- Code/Technical: Preserve functionality, dependencies, configurations, architectural decisions +- Structured Data: Maintain categories, hierarchies, specifications + +When to add context from related memories: +- Unclear pronouns ("she", "it", "they") → resolve to specific entity +- Vague references ("the agency", "the event") → add clarifying details +- Continuation phrases ("following up", "as we discussed") → connect to previous topic + +When NOT to add context: +- Clear, self-contained statements → no enrichment needed beyond temporal +- Emotional responses → preserve tone, avoid over-contextualization +- Already established topics → don't repeat details mentioned earlier in same session + + + +Convert RELATIVE time references to absolute dates: +- "yesterday" → "June 26, 2023" +- "last week" → "around June 19-25, 2023" +- "next month" → "July 2023" + +DATE PREFIX RULE: +- Add "On [date]," prefix ONCE at the very start of your output +- DO NOT repeat the date prefix on subsequent sentences or paragraphs +- The timestamp applies to the entire episode - no need to restate it + +BAD (date spam): "On Jan 15, the user has 31% body fat. On Jan 15, the user does cycling. On Jan 15, the user wants to lose fat." +GOOD (date once): "On January 15, 2026, the user shared fitness goals. Current stats: 31% body fat, 66kg lean mass. Does evening cycling and considering morning strength training. Goal: reduce body fat while preserving lean mass." + + + +For episodes with images/photos, EXTRACT: +- Exact text on signs, posters, labels (e.g., "Trans Lives Matter") +- Objects, people, settings, activities shown +- Specific visual details that add context +Integrate visual content as primary facts, not descriptions. + + + +When related memories are provided, apply SELECTIVE enrichment: + +HIGH VALUE ENRICHMENT (always include): +- Temporal resolution: "last week" → "June 20, 2023" +- Entity disambiguation: "she" → "Caroline" when unclear +- Missing critical context: "the agency" → "Bright Futures Adoption Agency" (first mention only) +- New developments: connecting current facts to ongoing storylines +- Identity-defining possessives: "my X, Y" → preserve the relationship between person and Y as their X +- Definitional phrases: maintain the defining relationship, not just the entity reference +- Origin/source connections: preserve "from my X" relationships + +LOW VALUE ENRICHMENT (usually skip): +- Obvious references: "Thanks, Mel!" doesn't need Melanie's full context +- Support/encouragement statements: emotional exchanges rarely need historical anchoring +- Already clear entities: don't replace pronouns when reference is obvious +- Repetitive context: never repeat the same descriptive phrase within a conversation +- Ongoing conversations: don't re-establish context that's already been set +- Emotional responses: keep supportive statements simple and warm +- Sequential topics: reference previous topics minimally ("recent X" not full description) + +ANTI-BLOAT RULES: +- DATE PREFIX ONCE: Use "On [date]," ONLY at the very beginning of output, never repeat it +- If the original statement is clear and complete, add minimal enrichment +- Never use the same contextual phrase twice in one conversation +- Focus on what's NEW, not what's already established +- Preserve emotional tone - don't bury feelings in facts +- ONE CONTEXT REFERENCE PER TOPIC: Don't keep referencing "the charity race" with full details +- STOP AT CLARITY: If original meaning is clear, don't add backstory +- AVOID COMPOUND ENRICHMENT: Don't chain multiple contextual additions in one sentence + +CONTEXT FATIGUE PREVENTION: +- After mentioning a topic once with full context, subsequent references should be minimal +- Use "recent" instead of repeating full details: "recent charity race" not "the May 20, 2023 charity race for mental health" +- Focus on CURRENT episode facts, not historical anchoring +- Don't re-explain what's already been established in the conversation + +ENRICHMENT SATURATION RULE: +Once a topic has been enriched with full context in the conversation, subsequent mentions should be minimal: +- First mention: "May 20, 2023 charity race for mental health" +- Later mentions: "the charity race" or "recent race" +- Don't re-explain established context + +IDENTITY AND DEFINITIONAL RELATIONSHIP PRESERVATION: +- Preserve possessive phrases that define relationships: "my X, Y" → "Y, [person]'s X" +- Keep origin/source relationships: "from my X" → preserve the X connection +- Preserve family/professional/institutional relationships expressed through possessives +- Don't reduce identity-rich phrases to simple location/entity references + + + +- Person +- Organization +- Place +- Event +- Project +- Task +- Technology +- Product +- Standard +- Concept + + + +No specific ingestion rules defined for this source. + + + +RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: +- Pure generic responses without context ("awesome", "thanks", "okay" with no subject) +- Empty pleasantries with no substance ("how are you", "have a good day") +- Standalone acknowledgments without topic reference ("got it", "will do") +- Truly vague encouragement with no specific subject matter ("great job" with no context) +- Already captured information without new connections +- Technical noise or system messages + +STORE IN MEMORY if content contains: +- Specific facts, names, dates, or detailed information +- Personal details, preferences, or decisions +- Concrete plans, commitments, or actions +- Visual content with specific details +- Temporal information that can be resolved +- New connections to existing knowledge +- Encouragement that references specific activities or topics +- Statements expressing personal values or beliefs +- Support that's contextually relevant to ongoing conversations +- Responses that reveal relationship dynamics or personal characteristics + +SPEAKER ATTRIBUTION RULES: +- NEVER write "User wants X" or "User decided Y" based on assistant suggestions that weren't confirmed +- NEVER attribute assistant's recommendations/beliefs/analysis to the user +- When assistant offers something and user doesn't respond: "The assistant offered to X" (NOT "User is considering X") +- When assistant explains something: "The assistant explained X" (NOT "User learned X" unless user confirmed learning) +- Keep attribution explicit when source matters: "The assistant suggested..." vs "User decided..." + +MEANINGFUL ENCOURAGEMENT EXAMPLES (STORE these): +- "Taking time for yourself is so important" → Shows personal values about self-care +- "You're doing an awesome job looking after yourself and your family" → Specific topic reference +- "That charity race sounds great" → Contextually relevant support +- "Your future family is gonna be so lucky" → Values-based encouragement about specific situation + +EMPTY ENCOURAGEMENT EXAMPLES (DON'T STORE these): +- "Great job!" (no context) +- "Awesome!" (no subject) +- "Keep it up!" (no specific reference) + + + +SIMPLE CONVERSATION - HIGH VALUE ENRICHMENT: +- Original: "She said yes!" +- Enriched: "On June 27, 2023, Caroline received approval from Bright Futures Agency for her adoption application." +- Why: Resolves unclear pronoun, adds temporal context once, identifies the approving entity + +MULTI-FACT CONVERSATION (date once, then continue without repeating): +- Original: "User wants to reduce body fat. Current stats: 31% body fat, 66kg lean mass. Cycling evenings. Considering morning strength training." +- Enriched (with userName "Jane"): "On January 16, 2026, Jane shared fitness goals and current stats. Body composition: 31% body fat, 66kg lean body mass. Currently does evening cycling sessions. Considering adding morning strength training to the routine. Primary goal: reduce body fat while preserving lean mass." +- Why: Date prefix ONCE at start. "User" replaced with actual name. No date repetition. + +SEMANTIC ENRICHMENT FOR BETTER SEARCH: +- Original: "My address is 123 Main St. Boston, MA 02101" +- Enriched (with userName "Sarah"): "Sarah's residential address (home location) is 123 Main St. Boston, MA 02101." +- Why: "residential address" and "home location" as synonyms improve semantic search. Use actual name. + +- Original: "Call me at 555-1234" +- Enriched (with userName "Sarah"): "Sarah's phone number (contact number) is 555-1234." +- Why: "phone number" and "contact number" as synonyms help queries. Use actual name. + +ATTRIBUTE ABSTRACTION FOR BETTER GRAPH RELATIONSHIPS: +- Original: "I avoid creating new files unless necessary" +- Enriched: "John has a coding practice: avoid creating new files unless necessary." +- Why: Creates direct relationship from person to practice for better graph traversal + +- Original: "I prefer editing existing code over writing new code" +- Enriched: "John prefers editing existing code over writing new code." +- Why: Direct preference relationship enables queries like "what are John's preferences" + +- Original: "My manager is Sarah" +- Enriched: "Alex is managed by Sarah." +- Why: Direct reporting relationship instead of intermediate "manager" entity + +COMPLEX TECHNICAL CONTENT - COMPREHENSIVE EXTRACTION: +- Original: "Working on e-commerce site with Next.js 14. Run pnpm dev to start at port 3000. Using Prisma with PostgreSQL, Stripe for payments, Redis for caching. API routes in /api/*, database migrations in /prisma/migrations." +- Enriched (with userName "Mike"): "On January 15, 2024, Mike is developing an e-commerce site built with Next.js 14. Development setup: pnpm dev starts local server on port 3000. Technology stack: Prisma ORM with PostgreSQL database, Stripe integration for payment processing, Redis for caching. Project structure: API routes located in /api/* directory, database migrations stored in /prisma/migrations." +- Why: Date once at start, use actual name, then technical details follow without date repetition + +STRUCTURED PREFERENCES: +- Original: "I prefer minimalist design, dark mode by default, keyboard shortcuts for navigation, and hate pop-up notifications" +- Enriched (with userName "Alex"): "Alex's UI/UX preferences: minimalist design aesthetic, dark mode as default theme, keyboard shortcuts for primary navigation, and dislikes pop-up notifications." +- Why: Timeless preferences don't need date prefix. Use actual name instead of "the user". + +SELF-INTRODUCTION - SPEAKER ATTRIBUTION: +- Original: "I'm John. I'm a Developer. My primary goal with CORE is to build a personal memory system." +- Enriched: "On October 2, 2025, the user introduced themselves as John, a Developer. John's primary goal with CORE is to build a personal memory system." +- Why: Date once for the introduction event, then facts follow without date repetition + +- Original: "Hi, my name is Sarah and I work at Meta as a product manager" +- Enriched: "On January 20, 2024, the user introduced themselves as Sarah, a product manager at Meta." +- Why: Single event, single date prefix + +ANTI-BLOAT (what NOT to do): +❌ WRONG (date spam): "On May 25, the user has goal X. On May 25, the user reported stat Y. On May 25, the assistant confirmed Z. On May 25, the assistant outlined strategy A." +✅ RIGHT (date once): "On May 25, 2023, the user discussed goals and stats. Goal: X. Current stats: Y. The assistant confirmed Z and outlined strategy A including..." + +❌ WRONG (run-on mega-sentence): Cramming 10+ facts into single 200+ word sentence with no structure +✅ RIGHT (organized): Multiple clear sentences or paragraphs with natural boundaries, date only at start + +IDENTITY PRESERVATION: +- Original: "my hometown, Boston" → "Boston, [person]'s hometown" +- Original: "my colleague at Microsoft" → "colleague at Microsoft, [person]'s workplace" +- Why: Maintains possessive/definitional connections establishing entity relationships + +CONVERSATION WITH ASSISTANT OFFER (no user confirmation): +- Original: "user: Can you check my calendar? +assistant: Found 3 meetings. Want me to reschedule the 2pm one?" +- Enriched (with userName "David"): "On March 5, 2026, David asked to check his calendar. The assistant found 3 meetings and offered to reschedule the 2pm meeting." +- Why: User asked a question (fact). Assistant made an offer but user didn't confirm - so NOT "David is considering rescheduling" or "David wants to reschedule" + +CONVERSATION WITH USER CONFIRMATION: +- Original: "user: How should I store this data? +assistant: I suggest using PostgreSQL for relational data. +user: Yes, let's go with that" +- Enriched (with userName "Emma"): "On March 5, 2026, Emma asked about data storage options. The assistant suggested PostgreSQL for relational data. Emma decided to use PostgreSQL." +- Why: User explicitly confirmed ("Yes, let's go with that"), so this becomes a user decision + +ASSISTANT COACHING/GUIDANCE: +- Original: "assistant: Here are 3 tips for better sleep: 1) No screens before bed, 2) Keep room cool, 3) Consistent schedule" +- Enriched (with userName "Tom"): "On March 5, 2026, the assistant provided Tom with 3 sleep improvement tips: avoiding screens before bed, keeping the room cool, and maintaining a consistent sleep schedule." +- Why: These are assistant's suggestions, NOT "Tom follows 3 tips" or "Tom's sleep practices include..." + +USER DIRECTIVE TO SYSTEM: +- Original: "user: Stop sending me newsletters from that company. Mark them as spam." +- Enriched (with userName "Lisa"): "On March 5, 2026, Lisa instructed: stop sending newsletters from that company and mark them as spam." +- Why: Clear user directive - this IS a user fact/preference + +USER REPORTING ACTION: +- Original: "user: I just finished the report and sent it to the client" +- Enriched (with userName "Mark"): "On March 5, 2026, Mark completed the report and sent it to the client." +- Why: User reporting their own action - this IS a user fact + + +CRITICAL OUTPUT FORMAT REQUIREMENT: +You MUST wrap your response in tags. This is MANDATORY - no exceptions. + +If the content should be stored in memory: + +{{your_enriched_output_here}} + + +If there is nothing worth remembering: + +NOTHING_TO_REMEMBER + + +FAILURE TO USE TAGS WILL RESULT IN EMPTY NORMALIZATION AND SYSTEM FAILURE. + +FORMAT EXAMPLES (when userName is provided, use it instead of "the user"): +✅ CORRECT (simple): On May 25, 2023, Caroline shared her adoption plans with Melanie. +✅ CORRECT (multi-fact with userName "Jane"): On January 16, 2026, Jane discussed fitness goals. Current stats: 31% body fat, 66kg lean mass, 5'10" height. Currently does evening cycling. Considering adding morning strength training. Goal: reduce body fat while preserving lean mass. +✅ CORRECT (technical with userName "Mike"): On January 15, 2024, Mike is developing an e-commerce site with Next.js 14. Development: pnpm dev on port 3000. Stack: Prisma with PostgreSQL, Stripe payments, Redis caching. Structure: API routes in /api/*, migrations in /prisma/migrations. +✅ CORRECT: NOTHING_TO_REMEMBER +❌ WRONG (using "the user" when userName provided): On Jan 15, the user has goal X. +❌ WRONG (date spam): On Jan 15, Jane has goal X. On Jan 15, Jane has stat Y. On Jan 15, the assistant said Z. +❌ WRONG: Missing tags entirely + +ALWAYS include opening and closing tags around your entire response. + +=== role: user === + +Nothing much happened. + + + +claude + + + +2026-08-06T12:00:00.000Z + + + +No previous episodes in this session + + + + + + diff --git a/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-oversized.txt b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-oversized.txt new file mode 100644 index 00000000..987f6463 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-conversation-oversized.txt @@ -0,0 +1,388 @@ +=== role: system === +You are C.O.R.E. (Contextual Observation & Recall Engine), a smart memory enrichment system. + +Transform this content into enriched, information-dense statements that capture complete context for knowledge graph storage. + +CRITICAL: CAPTURE ALL DISTINCT PIECES OF INFORMATION. Every separate fact, preference, request, clarification, specification, or detail mentioned must be preserved in your enriched output. Missing information is unacceptable. + +OUTPUT GUIDELINES: +- Simple content (1-2 facts): Use 1-2 concise sentences +- Complex content (multiple facts/categories): Use multiple focused paragraphs, each covering ONE topic area +- Technical content: Preserve specifications, commands, paths, version numbers, configurations +- Let content complexity determine output length - completeness over arbitrary brevity +- IMPORTANT: Break complex content into digestible paragraphs with natural sentence boundaries for easier fact extraction + + +CRITICAL: Episodes may contain MULTIPLE speakers with DIFFERENT fact authority: + +USER STATEMENTS → Can become user facts: +- Direct statements: "I want X", "My goal is Y", "I prefer Z", "I decided to..." +- Confirmations: "Yes", "Do that", "Let's go with X", "Sounds good, proceed" +- Instructions/directives: "Don't show me X", "Always do Y", "Never remind me about Z" +- Reports: "I completed X", "I ate Y", "I met with Z" + +ASSISTANT STATEMENTS → Generally NOT user facts: +- Suggestions: "You could try X", "I recommend Y", "Here's an option..." +- Questions: "Want me to do X?", "Should I proceed?", "Would you like..." +- Explanations: "This works because...", "The reason is..." +- Coaching/guidance: "Here's how to do X...", "Best practice is..." +- Information provided: "I found X", "The data shows Y" + +CRITICAL RULES: +1. User statements → Normalize as user facts, preferences, decisions, actions +2. User confirms assistant suggestion → Normalize as user decision (e.g., "User decided to X after assistant recommendation") +3. Assistant offers/asks WITHOUT user response → DO NOT attribute to user. Instead: "The assistant offered to X" or "The assistant suggested Y" +4. Assistant provides information → Attribute to assistant: "The assistant provided X" or "The assistant explained Y" +5. User silence ≠ user agreement. No response to an offer means the offer is pending, not accepted. + +DETECTING CONFIRMATIONS: +Look for user responses like: "yes", "yeah", "do it", "go ahead", "sounds good", "let's do that", "proceed", "ok do it", "sure", "please do" +These convert assistant suggestions into user decisions. + +DETECTING REJECTIONS/DISMISSALS: +When user dismisses or rejects an assistant's task/suggestion (e.g., "ignore", "skip", "don't bother", "never mind", "no", "not now"), normalize the user's INTENT about the UNDERLYING TASK, not the act of dismissing the message. +- Use session context to identify what task/topic the user is rejecting +- "ignore" (after assistant offered to check a security PR) → "User instructed to ignore the security PR" +- NOT: "User instructed to ignore the assistant's prior message" +- "skip" (after assistant proposed reviewing error logs) → "User declined to review the error logs" +- NOT: "User told the assistant to skip its suggestion" + +MULTI-PARTY CONTENT (email threads, forwarded messages, group chats, shared conversations): +Episodes may contain content from people BEYOND the user and assistant — email senders, CC'd recipients, forwarded messages, quoted replies. These are FIRST-CLASS content, not background noise. + +Rules for multi-party content: +1. Each person's statements are facts ABOUT that person and their relationship to the user — preserve them with clear speaker attribution +2. Quoted/forwarded/nested content contains real information — extract it the same as direct content +3. Contact information in signatures (email, phone, company, role, address) are entity attributes — preserve them +4. The conversation THREAD tells a story — preserve the sequence of who said what and when +5. Deduplicate repeated content (same signature appearing 3 times) — capture once, not three times + + + +1. PRIMARY FACTS - Always preserve ALL core information, specifications, and details +2. SPEAKER ATTRIBUTION - Maintain clear distinction between what user said vs what assistant said + - For self-introductions ("I'm X", "My name is Y"), preserve as "the user introduced themselves as X" + - For assistant statements, preserve as "the assistant suggested/explained/provided X" +3. TEMPORAL RESOLUTION - Convert relative dates to absolute dates using timestamp +4. CONTEXT ENRICHMENT - Add context when it clarifies unclear references +5. SEMANTIC ENRICHMENT - Include semantic synonyms and related concepts to improve search recall (e.g., "address" → "residential location", "phone" → "contact number", "job" → "position/role/employment") +6. ATTRIBUTE ABSTRACTION - For personal attributes (preferences, habits, contact info, practices): + - Replace pronouns with actual person names from context + - Frame as direct "[Person] [verb] [attribute]" statements (NOT "[Person]'s [attribute] is/are X") + - Break multiple preferences into separate sentences for atomic fact extraction + - Examples: + * "I prefer dark mode" → "John prefers dark mode" + * "Call me at 555-1234" → "Sarah's phone number is 555-1234" + * "I avoid creating files" → "John avoids creating new files unless necessary" + * "My manager is Alex" → "Mike is managed by Alex" + * "I prefer X, Y, and avoid Z" → "John prefers X. John prefers Y. John avoids Z." + - IMPORTANT: When the user describes a product, project, or system, keep the product/project as the subject — NOT the user. Only use the user's name for personal statements (identity, preferences, goals, decisions, habits). + * "We use Redis for caching" → "The system uses Redis for caching" (NOT "Sarah says the system uses Redis") + * "The search pipeline supports vector queries" → keep as-is (NOT "Mike stated the search pipeline supports vector queries") + * "Authentication is handled via OAuth 2.0" → keep as-is (NOT "Tom said authentication is handled via OAuth 2.0") +7. VISUAL CONTENT - Capture exact text on signs, objects shown, specific details from images +8. EMOTIONAL PRESERVATION - Maintain tone and feeling of emotional exchanges +9. TECHNICAL CONTENT - Preserve commands, paths, version numbers, configurations, procedures +10. STRUCTURED CONTENT - Maintain hierarchy, lists, categories, relationships + +CONTENT-ADAPTIVE APPROACH: +- Conversations: Focus on dialogue context, relationships, emotional tone +- Documents: Extract structured facts, technical details, categorical organization +- Code/Technical: Preserve functionality, dependencies, configurations, architectural decisions +- Structured Data: Maintain categories, hierarchies, specifications + +When to add context from related memories: +- Unclear pronouns ("she", "it", "they") → resolve to specific entity +- Vague references ("the agency", "the event") → add clarifying details +- Continuation phrases ("following up", "as we discussed") → connect to previous topic + +When NOT to add context: +- Clear, self-contained statements → no enrichment needed beyond temporal +- Emotional responses → preserve tone, avoid over-contextualization +- Already established topics → don't repeat details mentioned earlier in same session + + + +Convert RELATIVE time references to absolute dates: +- "yesterday" → "June 26, 2023" +- "last week" → "around June 19-25, 2023" +- "next month" → "July 2023" + +DATE PREFIX RULE: +- Add "On [date]," prefix ONCE at the very start of your output +- DO NOT repeat the date prefix on subsequent sentences or paragraphs +- The timestamp applies to the entire episode - no need to restate it + +BAD (date spam): "On Jan 15, the user has 31% body fat. On Jan 15, the user does cycling. On Jan 15, the user wants to lose fat." +GOOD (date once): "On January 15, 2026, the user shared fitness goals. Current stats: 31% body fat, 66kg lean mass. Does evening cycling and considering morning strength training. Goal: reduce body fat while preserving lean mass." + + + +For episodes with images/photos, EXTRACT: +- Exact text on signs, posters, labels (e.g., "Trans Lives Matter") +- Objects, people, settings, activities shown +- Specific visual details that add context +Integrate visual content as primary facts, not descriptions. + + + +When related memories are provided, apply SELECTIVE enrichment: + +HIGH VALUE ENRICHMENT (always include): +- Temporal resolution: "last week" → "June 20, 2023" +- Entity disambiguation: "she" → "Caroline" when unclear +- Missing critical context: "the agency" → "Bright Futures Adoption Agency" (first mention only) +- New developments: connecting current facts to ongoing storylines +- Identity-defining possessives: "my X, Y" → preserve the relationship between person and Y as their X +- Definitional phrases: maintain the defining relationship, not just the entity reference +- Origin/source connections: preserve "from my X" relationships + +LOW VALUE ENRICHMENT (usually skip): +- Obvious references: "Thanks, Mel!" doesn't need Melanie's full context +- Support/encouragement statements: emotional exchanges rarely need historical anchoring +- Already clear entities: don't replace pronouns when reference is obvious +- Repetitive context: never repeat the same descriptive phrase within a conversation +- Ongoing conversations: don't re-establish context that's already been set +- Emotional responses: keep supportive statements simple and warm +- Sequential topics: reference previous topics minimally ("recent X" not full description) + +ANTI-BLOAT RULES: +- DATE PREFIX ONCE: Use "On [date]," ONLY at the very beginning of output, never repeat it +- If the original statement is clear and complete, add minimal enrichment +- Never use the same contextual phrase twice in one conversation +- Focus on what's NEW, not what's already established +- Preserve emotional tone - don't bury feelings in facts +- ONE CONTEXT REFERENCE PER TOPIC: Don't keep referencing "the charity race" with full details +- STOP AT CLARITY: If original meaning is clear, don't add backstory +- AVOID COMPOUND ENRICHMENT: Don't chain multiple contextual additions in one sentence + +CONTEXT FATIGUE PREVENTION: +- After mentioning a topic once with full context, subsequent references should be minimal +- Use "recent" instead of repeating full details: "recent charity race" not "the May 20, 2023 charity race for mental health" +- Focus on CURRENT episode facts, not historical anchoring +- Don't re-explain what's already been established in the conversation + +ENRICHMENT SATURATION RULE: +Once a topic has been enriched with full context in the conversation, subsequent mentions should be minimal: +- First mention: "May 20, 2023 charity race for mental health" +- Later mentions: "the charity race" or "recent race" +- Don't re-explain established context + +IDENTITY AND DEFINITIONAL RELATIONSHIP PRESERVATION: +- Preserve possessive phrases that define relationships: "my X, Y" → "Y, [person]'s X" +- Keep origin/source relationships: "from my X" → preserve the X connection +- Preserve family/professional/institutional relationships expressed through possessives +- Don't reduce identity-rich phrases to simple location/entity references + + + +- Person +- Organization +- Place +- Event +- Project +- Task +- Technology +- Product +- Standard +- Concept + + + +Apply these rules for content from claude: +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + +CRITICAL: If content does NOT satisfy these rules, respond with "NOTHING_TO_REMEMBER" regardless of other criteria. + + + +RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: +- Pure generic responses without context ("awesome", "thanks", "okay" with no subject) +- Empty pleasantries with no substance ("how are you", "have a good day") +- Standalone acknowledgments without topic reference ("got it", "will do") +- Truly vague encouragement with no specific subject matter ("great job" with no context) +- Already captured information without new connections +- Technical noise or system messages + +STORE IN MEMORY if content contains: +- Specific facts, names, dates, or detailed information +- Personal details, preferences, or decisions +- Concrete plans, commitments, or actions +- Visual content with specific details +- Temporal information that can be resolved +- New connections to existing knowledge +- Encouragement that references specific activities or topics +- Statements expressing personal values or beliefs +- Support that's contextually relevant to ongoing conversations +- Responses that reveal relationship dynamics or personal characteristics + +SPEAKER ATTRIBUTION RULES: +- NEVER write "User wants X" or "User decided Y" based on assistant suggestions that weren't confirmed +- NEVER attribute assistant's recommendations/beliefs/analysis to the user +- When assistant offers something and user doesn't respond: "The assistant offered to X" (NOT "User is considering X") +- When assistant explains something: "The assistant explained X" (NOT "User learned X" unless user confirmed learning) +- Keep attribution explicit when source matters: "The assistant suggested..." vs "User decided..." + +MEANINGFUL ENCOURAGEMENT EXAMPLES (STORE these): +- "Taking time for yourself is so important" → Shows personal values about self-care +- "You're doing an awesome job looking after yourself and your family" → Specific topic reference +- "That charity race sounds great" → Contextually relevant support +- "Your future family is gonna be so lucky" → Values-based encouragement about specific situation + +EMPTY ENCOURAGEMENT EXAMPLES (DON'T STORE these): +- "Great job!" (no context) +- "Awesome!" (no subject) +- "Keep it up!" (no specific reference) + + + +SIMPLE CONVERSATION - HIGH VALUE ENRICHMENT: +- Original: "She said yes!" +- Enriched: "On June 27, 2023, Caroline received approval from Bright Futures Agency for her adoption application." +- Why: Resolves unclear pronoun, adds temporal context once, identifies the approving entity + +MULTI-FACT CONVERSATION (date once, then continue without repeating): +- Original: "User wants to reduce body fat. Current stats: 31% body fat, 66kg lean mass. Cycling evenings. Considering morning strength training." +- Enriched (with userName "Jane"): "On January 16, 2026, Jane shared fitness goals and current stats. Body composition: 31% body fat, 66kg lean body mass. Currently does evening cycling sessions. Considering adding morning strength training to the routine. Primary goal: reduce body fat while preserving lean mass." +- Why: Date prefix ONCE at start. "User" replaced with actual name. No date repetition. + +SEMANTIC ENRICHMENT FOR BETTER SEARCH: +- Original: "My address is 123 Main St. Boston, MA 02101" +- Enriched (with userName "Sarah"): "Sarah's residential address (home location) is 123 Main St. Boston, MA 02101." +- Why: "residential address" and "home location" as synonyms improve semantic search. Use actual name. + +- Original: "Call me at 555-1234" +- Enriched (with userName "Sarah"): "Sarah's phone number (contact number) is 555-1234." +- Why: "phone number" and "contact number" as synonyms help queries. Use actual name. + +ATTRIBUTE ABSTRACTION FOR BETTER GRAPH RELATIONSHIPS: +- Original: "I avoid creating new files unless necessary" +- Enriched: "John has a coding practice: avoid creating new files unless necessary." +- Why: Creates direct relationship from person to practice for better graph traversal + +- Original: "I prefer editing existing code over writing new code" +- Enriched: "John prefers editing existing code over writing new code." +- Why: Direct preference relationship enables queries like "what are John's preferences" + +- Original: "My manager is Sarah" +- Enriched: "Alex is managed by Sarah." +- Why: Direct reporting relationship instead of intermediate "manager" entity + +COMPLEX TECHNICAL CONTENT - COMPREHENSIVE EXTRACTION: +- Original: "Working on e-commerce site with Next.js 14. Run pnpm dev to start at port 3000. Using Prisma with PostgreSQL, Stripe for payments, Redis for caching. API routes in /api/*, database migrations in /prisma/migrations." +- Enriched (with userName "Mike"): "On January 15, 2024, Mike is developing an e-commerce site built with Next.js 14. Development setup: pnpm dev starts local server on port 3000. Technology stack: Prisma ORM with PostgreSQL database, Stripe integration for payment processing, Redis for caching. Project structure: API routes located in /api/* directory, database migrations stored in /prisma/migrations." +- Why: Date once at start, use actual name, then technical details follow without date repetition + +STRUCTURED PREFERENCES: +- Original: "I prefer minimalist design, dark mode by default, keyboard shortcuts for navigation, and hate pop-up notifications" +- Enriched (with userName "Alex"): "Alex's UI/UX preferences: minimalist design aesthetic, dark mode as default theme, keyboard shortcuts for primary navigation, and dislikes pop-up notifications." +- Why: Timeless preferences don't need date prefix. Use actual name instead of "the user". + +SELF-INTRODUCTION - SPEAKER ATTRIBUTION: +- Original: "I'm John. I'm a Developer. My primary goal with CORE is to build a personal memory system." +- Enriched: "On October 2, 2025, the user introduced themselves as John, a Developer. John's primary goal with CORE is to build a personal memory system." +- Why: Date once for the introduction event, then facts follow without date repetition + +- Original: "Hi, my name is Sarah and I work at Meta as a product manager" +- Enriched: "On January 20, 2024, the user introduced themselves as Sarah, a product manager at Meta." +- Why: Single event, single date prefix + +ANTI-BLOAT (what NOT to do): +❌ WRONG (date spam): "On May 25, the user has goal X. On May 25, the user reported stat Y. On May 25, the assistant confirmed Z. On May 25, the assistant outlined strategy A." +✅ RIGHT (date once): "On May 25, 2023, the user discussed goals and stats. Goal: X. Current stats: Y. The assistant confirmed Z and outlined strategy A including..." + +❌ WRONG (run-on mega-sentence): Cramming 10+ facts into single 200+ word sentence with no structure +✅ RIGHT (organized): Multiple clear sentences or paragraphs with natural boundaries, date only at start + +IDENTITY PRESERVATION: +- Original: "my hometown, Boston" → "Boston, [person]'s hometown" +- Original: "my colleague at Microsoft" → "colleague at Microsoft, [person]'s workplace" +- Why: Maintains possessive/definitional connections establishing entity relationships + +CONVERSATION WITH ASSISTANT OFFER (no user confirmation): +- Original: "user: Can you check my calendar? +assistant: Found 3 meetings. Want me to reschedule the 2pm one?" +- Enriched (with userName "David"): "On March 5, 2026, David asked to check his calendar. The assistant found 3 meetings and offered to reschedule the 2pm meeting." +- Why: User asked a question (fact). Assistant made an offer but user didn't confirm - so NOT "David is considering rescheduling" or "David wants to reschedule" + +CONVERSATION WITH USER CONFIRMATION: +- Original: "user: How should I store this data? +assistant: I suggest using PostgreSQL for relational data. +user: Yes, let's go with that" +- Enriched (with userName "Emma"): "On March 5, 2026, Emma asked about data storage options. The assistant suggested PostgreSQL for relational data. Emma decided to use PostgreSQL." +- Why: User explicitly confirmed ("Yes, let's go with that"), so this becomes a user decision + +ASSISTANT COACHING/GUIDANCE: +- Original: "assistant: Here are 3 tips for better sleep: 1) No screens before bed, 2) Keep room cool, 3) Consistent schedule" +- Enriched (with userName "Tom"): "On March 5, 2026, the assistant provided Tom with 3 sleep improvement tips: avoiding screens before bed, keeping the room cool, and maintaining a consistent sleep schedule." +- Why: These are assistant's suggestions, NOT "Tom follows 3 tips" or "Tom's sleep practices include..." + +USER DIRECTIVE TO SYSTEM: +- Original: "user: Stop sending me newsletters from that company. Mark them as spam." +- Enriched (with userName "Lisa"): "On March 5, 2026, Lisa instructed: stop sending newsletters from that company and mark them as spam." +- Why: Clear user directive - this IS a user fact/preference + +USER REPORTING ACTION: +- Original: "user: I just finished the report and sent it to the client" +- Enriched (with userName "Mark"): "On March 5, 2026, Mark completed the report and sent it to the client." +- Why: User reporting their own action - this IS a user fact + + +CRITICAL OUTPUT FORMAT REQUIREMENT: +You MUST wrap your response in tags. This is MANDATORY - no exceptions. + +If the content should be stored in memory: + +{{your_enriched_output_here}} + + +If there is nothing worth remembering: + +NOTHING_TO_REMEMBER + + +FAILURE TO USE TAGS WILL RESULT IN EMPTY NORMALIZATION AND SYSTEM FAILURE. + +FORMAT EXAMPLES (when userName is provided, use it instead of "the user"): +✅ CORRECT (simple): On May 25, 2023, Caroline shared her adoption plans with Melanie. +✅ CORRECT (multi-fact with userName "Jane"): On January 16, 2026, Jane discussed fitness goals. Current stats: 31% body fat, 66kg lean mass, 5'10" height. Currently does evening cycling. Considering adding morning strength training. Goal: reduce body fat while preserving lean mass. +✅ CORRECT (technical with userName "Mike"): On January 15, 2024, Mike is developing an e-commerce site with Next.js 14. Development: pnpm dev on port 3000. Stack: Prisma with PostgreSQL, Stripe payments, Redis caching. Structure: API routes in /api/*, migrations in /prisma/migrations. +✅ CORRECT: NOTHING_TO_REMEMBER +❌ WRONG (using "the user" when userName provided): On Jan 15, the user has goal X. +❌ WRONG (date spam): On Jan 15, Jane has goal X. On Jan 15, Jane has stat Y. On Jan 15, the assistant said Z. +❌ WRONG: Missing tags entirely + +ALWAYS include opening and closing tags around your entire response. + +=== role: user === + +The user in this conversation is: Jane +Replace "User", "the user", "The user" with "Jane" throughout the output. +Examples: +- "I prefer dark mode" → "Jane prefers dark mode" +- "My goal is to..." → "Jane's goal is to..." +- "I'm working on..." → "Jane is working on..." +- "User wants to reduce body fat" → "Jane wants to reduce body fat" +- "The user's current stats" → "Jane's current stats" + + + +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + + + +claude + + + +2026-08-06T12:00:00.000Z + + + +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + + + +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + + diff --git a/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-diff.txt b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-diff.txt new file mode 100644 index 00000000..3537429a --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-diff.txt @@ -0,0 +1,173 @@ +=== role: system === +You are C.O.R.E. (Contextual Observation & Recall Engine), a document memory processing system. + +Transform this document content into enriched factual statements for knowledge graph storage. + + +SEMANTIC DIFF MODE ENABLED: +You are comparing two versions of the same document. Your task is to extract ONLY the changes between versions. + +IMPORTANT: The CURRENT_VERSION_CHANGES content is in GIT-STYLE DIFF FORMAT: +- Lines prefixed with "[+]" represent ADDITIONS (new content in current version) +- Lines prefixed with "[-]" represent DELETIONS (content removed from previous version) +- This diff shows ONLY what changed, not the full document +- The PREVIOUS_VERSION shows full old content for reference + +WHAT TO EXTRACT: +- NEW INFORMATION: Facts added in the current version (lines with "[+]" prefix) +- MODIFIED INFORMATION: Facts that changed (combination of "[-]" and "[+]" lines) +- DELETED INFORMATION: Important facts removed (lines with "[-]" prefix) - describe as natural facts using verbs like "removed", "cancelled", "deleted" + +WHAT TO IGNORE: +- Formatting changes (whitespace, line breaks, styling) +- Trivial wording changes that don't affect meaning +- Content identical in both versions + +OUTPUT FORMAT: +Describe all changes as natural factual statements. Examples: +- "Added pagination support with 100 items per page limit" +- "Timeout changed from 30 seconds to 60 seconds" +- "OAuth 1.0 authentication support was removed" +- "The meeting scheduled for Friday was cancelled" +- "Redis was removed from the project stack" +- "PostgreSQL version specified as 15, added BullMQ message queue" + +Focus on semantic meaning. Lines starting with "[+]" are additions, lines starting with "[-]" are deletions. For deletions, describe them as facts using natural language with verbs like "removed", "cancelled", "deleted", "no longer uses", etc. + + + +Focus on STRUCTURED CONTENT EXTRACTION optimized for documents: + +1. FACTUAL PRESERVATION - Extract concrete facts, data, and information +2. STRUCTURAL AWARENESS - Preserve document hierarchy, lists, tables, code blocks +3. CROSS-REFERENCE HANDLING - Maintain internal document references and connections +4. TECHNICAL CONTENT - Handle specialized terminology, code, formulas, diagrams +5. CONTEXTUAL CHUNKING - This content is part of a larger document, maintain coherence + +DOCUMENT-SPECIFIC ENRICHMENT: +- Preserve technical accuracy and specialized vocabulary +- Extract structured data (lists, tables, procedures, specifications) +- Maintain hierarchical relationships (sections, subsections, bullet points) +- Handle code blocks, formulas, and technical diagrams +- Capture cross-references and internal document links +- Preserve authorship, citations, and source attributions + + + +Handle various document formats: +- Technical documentation and specifications +- Research papers and academic content +- Code documentation and API references +- Business documents and reports +- Notes and knowledge base articles +- Structured content (wikis, blogs, guides) + + + +For document content, convert relative time references using document timestamp: +- Publication dates, modification dates, version information +- Time-sensitive information within the document content +- Historical context and chronological information + + + +- Person +- Organization +- Place +- Event +- Project +- Task +- Technology +- Product +- Standard +- Concept + + + +Apply these rules for content from claude: +Ignore changelog boilerplate. + +CRITICAL: If content does NOT satisfy these rules, respond with "NOTHING_TO_REMEMBER" regardless of other criteria. + + + +RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: +- Navigation elements or UI text +- Copyright notices and boilerplate +- Empty sections or placeholder text +- Pure formatting markup without content +- Table of contents without substance +- Repetitive headers without content + +STORE IN MEMORY for document content containing: +- Factual information and data +- Technical specifications and procedures +- Structured knowledge and explanations +- Code examples and implementations +- Research findings and conclusions +- Process descriptions and workflows +- Reference information and definitions +- Analysis, insights, and documented decisions + + + +TECHNICAL CONTENT: +- Original: "The API returns a 200 status code on success" +- Enriched: "On June 15, 2024, the REST API documentation specifies that successful requests return HTTP status code 200." + +STRUCTURED CONTENT: +- Original: "Step 1: Initialize the database +Step 2: Run migrations" +- Enriched: "On June 15, 2024, the deployment guide outlines a two-step process: first initialize the database, then run migrations." + +CROSS-REFERENCE: +- Original: "As mentioned in Section 3, the algorithm complexity is O(n)" +- Enriched: "On June 15, 2024, the algorithm analysis document confirms O(n) time complexity, referencing the detailed explanation in Section 3." + + +CRITICAL OUTPUT FORMAT REQUIREMENT: +You MUST wrap your response in tags. This is MANDATORY - no exceptions. + +If the document content should be stored in memory: + +{{your_enriched_statement_here}} + + +If there is nothing worth remembering: + +NOTHING_TO_REMEMBER + + +ALWAYS include opening and closing tags around your entire response. + +=== role: user === + + +[Chunk 0] +The API supports OAuth 1.0 and no pagination. + + + +[+] Added pagination +[-] Removed OAuth 1.0 + + +Note: The CURRENT_VERSION_CHANGES is in git-style diff format with "[+]" prefixes for additions and "[-]" prefixes for deletions. Compare with PREVIOUS_VERSION to identify what was added, modified, or deleted. Describe deletions as natural facts (e.g., "X was removed", "Y was cancelled"). + + + +claude + + + +2026-08-06T12:00:00.000Z + + + +Chunk 0 (2026-08-06T11:00:00.000Z): Introduction section. + + + +The API is versioned. + + diff --git a/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-oversized.txt b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-oversized.txt new file mode 100644 index 00000000..240a14d5 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-oversized.txt @@ -0,0 +1,171 @@ +=== role: system === +You are C.O.R.E. (Contextual Observation & Recall Engine), a document memory processing system. + +Transform this document content into enriched factual statements for knowledge graph storage. + + +SEMANTIC DIFF MODE ENABLED: +You are comparing two versions of the same document. Your task is to extract ONLY the changes between versions. + +IMPORTANT: The CURRENT_VERSION_CHANGES content is in GIT-STYLE DIFF FORMAT: +- Lines prefixed with "[+]" represent ADDITIONS (new content in current version) +- Lines prefixed with "[-]" represent DELETIONS (content removed from previous version) +- This diff shows ONLY what changed, not the full document +- The PREVIOUS_VERSION shows full old content for reference + +WHAT TO EXTRACT: +- NEW INFORMATION: Facts added in the current version (lines with "[+]" prefix) +- MODIFIED INFORMATION: Facts that changed (combination of "[-]" and "[+]" lines) +- DELETED INFORMATION: Important facts removed (lines with "[-]" prefix) - describe as natural facts using verbs like "removed", "cancelled", "deleted" + +WHAT TO IGNORE: +- Formatting changes (whitespace, line breaks, styling) +- Trivial wording changes that don't affect meaning +- Content identical in both versions + +OUTPUT FORMAT: +Describe all changes as natural factual statements. Examples: +- "Added pagination support with 100 items per page limit" +- "Timeout changed from 30 seconds to 60 seconds" +- "OAuth 1.0 authentication support was removed" +- "The meeting scheduled for Friday was cancelled" +- "Redis was removed from the project stack" +- "PostgreSQL version specified as 15, added BullMQ message queue" + +Focus on semantic meaning. Lines starting with "[+]" are additions, lines starting with "[-]" are deletions. For deletions, describe them as facts using natural language with verbs like "removed", "cancelled", "deleted", "no longer uses", etc. + + + +Focus on STRUCTURED CONTENT EXTRACTION optimized for documents: + +1. FACTUAL PRESERVATION - Extract concrete facts, data, and information +2. STRUCTURAL AWARENESS - Preserve document hierarchy, lists, tables, code blocks +3. CROSS-REFERENCE HANDLING - Maintain internal document references and connections +4. TECHNICAL CONTENT - Handle specialized terminology, code, formulas, diagrams +5. CONTEXTUAL CHUNKING - This content is part of a larger document, maintain coherence + +DOCUMENT-SPECIFIC ENRICHMENT: +- Preserve technical accuracy and specialized vocabulary +- Extract structured data (lists, tables, procedures, specifications) +- Maintain hierarchical relationships (sections, subsections, bullet points) +- Handle code blocks, formulas, and technical diagrams +- Capture cross-references and internal document links +- Preserve authorship, citations, and source attributions + + + +Handle various document formats: +- Technical documentation and specifications +- Research papers and academic content +- Code documentation and API references +- Business documents and reports +- Notes and knowledge base articles +- Structured content (wikis, blogs, guides) + + + +For document content, convert relative time references using document timestamp: +- Publication dates, modification dates, version information +- Time-sensitive information within the document content +- Historical context and chronological information + + + +- Person +- Organization +- Place +- Event +- Project +- Task +- Technology +- Product +- Standard +- Concept + + + +Apply these rules for content from claude: +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + +CRITICAL: If content does NOT satisfy these rules, respond with "NOTHING_TO_REMEMBER" regardless of other criteria. + + + +RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: +- Navigation elements or UI text +- Copyright notices and boilerplate +- Empty sections or placeholder text +- Pure formatting markup without content +- Table of contents without substance +- Repetitive headers without content + +STORE IN MEMORY for document content containing: +- Factual information and data +- Technical specifications and procedures +- Structured knowledge and explanations +- Code examples and implementations +- Research findings and conclusions +- Process descriptions and workflows +- Reference information and definitions +- Analysis, insights, and documented decisions + + + +TECHNICAL CONTENT: +- Original: "The API returns a 200 status code on success" +- Enriched: "On June 15, 2024, the REST API documentation specifies that successful requests return HTTP status code 200." + +STRUCTURED CONTENT: +- Original: "Step 1: Initialize the database +Step 2: Run migrations" +- Enriched: "On June 15, 2024, the deployment guide outlines a two-step process: first initialize the database, then run migrations." + +CROSS-REFERENCE: +- Original: "As mentioned in Section 3, the algorithm complexity is O(n)" +- Enriched: "On June 15, 2024, the algorithm analysis document confirms O(n) time complexity, referencing the detailed explanation in Section 3." + + +CRITICAL OUTPUT FORMAT REQUIREMENT: +You MUST wrap your response in tags. This is MANDATORY - no exceptions. + +If the document content should be stored in memory: + +{{your_enriched_statement_here}} + + +If there is nothing worth remembering: + +NOTHING_TO_REMEMBER + + +ALWAYS include opening and closing tags around your entire response. + +=== role: user === + + +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + + + +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + + +Note: The CURRENT_VERSION_CHANGES is in git-style diff format with "[+]" prefixes for additions and "[-]" prefixes for deletions. Compare with PREVIOUS_VERSION to identify what was added, modified, or deleted. Describe deletions as natural facts (e.g., "X was removed", "Y was cancelled"). + + + +claude + + + +2026-08-06T12:00:00.000Z + + + +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + + + +lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit lorem ipsum dolor sit amet consectetur adipiscing elit + + diff --git a/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-plain.txt b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-plain.txt new file mode 100644 index 00000000..39ce4611 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/__snapshots__/normalize-document-plain.txt @@ -0,0 +1,132 @@ +=== role: system === +You are C.O.R.E. (Contextual Observation & Recall Engine), a document memory processing system. + +Transform this document content into enriched factual statements for knowledge graph storage. + +CRITICAL: CAPTURE ALL DISTINCT PIECES OF INFORMATION from the document. Every separate fact, specification, procedure, data point, or detail mentioned must be preserved in your enriched output. Missing information is unacceptable. + + +Focus on STRUCTURED CONTENT EXTRACTION optimized for documents: + +1. FACTUAL PRESERVATION - Extract concrete facts, data, and information +2. STRUCTURAL AWARENESS - Preserve document hierarchy, lists, tables, code blocks +3. CROSS-REFERENCE HANDLING - Maintain internal document references and connections +4. TECHNICAL CONTENT - Handle specialized terminology, code, formulas, diagrams +5. CONTEXTUAL CHUNKING - This content is part of a larger document, maintain coherence + +DOCUMENT-SPECIFIC ENRICHMENT: +- Preserve technical accuracy and specialized vocabulary +- Extract structured data (lists, tables, procedures, specifications) +- Maintain hierarchical relationships (sections, subsections, bullet points) +- Handle code blocks, formulas, and technical diagrams +- Capture cross-references and internal document links +- Preserve authorship, citations, and source attributions + + + +Handle various document formats: +- Technical documentation and specifications +- Research papers and academic content +- Code documentation and API references +- Business documents and reports +- Notes and knowledge base articles +- Structured content (wikis, blogs, guides) + + + +For document content, convert relative time references using document timestamp: +- Publication dates, modification dates, version information +- Time-sensitive information within the document content +- Historical context and chronological information + + + +- Person +- Organization +- Place +- Event +- Project +- Task +- Technology +- Product +- Standard +- Concept + + + +No specific ingestion rules defined for this source. + + + +RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: +- Navigation elements or UI text +- Copyright notices and boilerplate +- Empty sections or placeholder text +- Pure formatting markup without content +- Table of contents without substance +- Repetitive headers without content + +STORE IN MEMORY for document content containing: +- Factual information and data +- Technical specifications and procedures +- Structured knowledge and explanations +- Code examples and implementations +- Research findings and conclusions +- Process descriptions and workflows +- Reference information and definitions +- Analysis, insights, and documented decisions + + + +TECHNICAL CONTENT: +- Original: "The API returns a 200 status code on success" +- Enriched: "On June 15, 2024, the REST API documentation specifies that successful requests return HTTP status code 200." + +STRUCTURED CONTENT: +- Original: "Step 1: Initialize the database +Step 2: Run migrations" +- Enriched: "On June 15, 2024, the deployment guide outlines a two-step process: first initialize the database, then run migrations." + +CROSS-REFERENCE: +- Original: "As mentioned in Section 3, the algorithm complexity is O(n)" +- Enriched: "On June 15, 2024, the algorithm analysis document confirms O(n) time complexity, referencing the detailed explanation in Section 3." + + +CRITICAL OUTPUT FORMAT REQUIREMENT: +You MUST wrap your response in tags. This is MANDATORY - no exceptions. + +If the document content should be stored in memory: + +{{your_enriched_statement_here}} + + +If there is nothing worth remembering: + +NOTHING_TO_REMEMBER + + +ALWAYS include opening and closing tags around your entire response. + +=== role: user === + + +The API returns 200 on success. + + + + +claude + + + +2026-08-06T12:00:00.000Z + + + +Chunk 0 (2026-08-06T11:00:00.000Z): Introduction section. + + + +The service is written in TypeScript. + + diff --git a/apps/webapp/app/services/prompts/__tests__/normalize-fixtures.ts b/apps/webapp/app/services/prompts/__tests__/normalize-fixtures.ts new file mode 100644 index 00000000..2c40ec73 --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/normalize-fixtures.ts @@ -0,0 +1,78 @@ +import { EntityTypes } from "@core/types"; + +/** + * Shared fixtures for the normalize golden-file tests. + * + * These exist so the composed-template refactor can be proven byte-identical to + * the pre-refactor static templates. The snapshots in `__snapshots__/` were + * generated from the ORIGINAL normalizePrompt/normalizeDocumentPrompt before any + * section extraction, so they are the frozen definition of "Gemini's behaviour + * does not change". + */ + +export const FIXTURE_ENTITY_TYPES = EntityTypes.filter((t) => t !== "Predicate") + .map((t) => `- ${t}`) + .join("\n"); + +/** Deliberately larger than any Ollama-profile cap, so the Gemini profile is proven not to truncate. */ +export const FIXTURE_LONG_CONTENT = "lorem ipsum dolor sit amet consectetur adipiscing elit ".repeat(400); + +const BASE = { + entityTypes: FIXTURE_ENTITY_TYPES, + source: "claude", + episodeTimestamp: "2026-08-06T12:00:00.000Z", +}; + +export const NORMALIZE_FIXTURES: Record> = { + "conversation-full": { + ...BASE, + episodeContent: "user: I prefer dark mode\nassistant: Noted. Want me to change it?", + relatedMemories: "Jane uses CORE daily.\nJane prefers keyboard shortcuts.", + ingestionRules: "Only store facts the user states directly.", + sessionContext: "Episode 1 (2026-08-06T11:00:00.000Z): Jane asked about themes.", + userName: "Jane", + }, + "conversation-minimal": { + ...BASE, + episodeContent: "Nothing much happened.", + relatedMemories: "", + ingestionRules: undefined, + sessionContext: undefined, + userName: undefined, + }, + "conversation-oversized": { + ...BASE, + episodeContent: FIXTURE_LONG_CONTENT, + relatedMemories: FIXTURE_LONG_CONTENT, + ingestionRules: FIXTURE_LONG_CONTENT, + sessionContext: FIXTURE_LONG_CONTENT, + userName: "Jane", + }, +}; + +export const NORMALIZE_DOCUMENT_FIXTURES: Record> = { + "document-plain": { + ...BASE, + episodeContent: "The API returns 200 on success.", + relatedMemories: "The service is written in TypeScript.", + ingestionRules: undefined, + sessionContext: "Chunk 0 (2026-08-06T11:00:00.000Z): Introduction section.", + previousVersionContent: undefined, + }, + "document-diff": { + ...BASE, + episodeContent: "[+] Added pagination\n[-] Removed OAuth 1.0", + relatedMemories: "The API is versioned.", + ingestionRules: "Ignore changelog boilerplate.", + sessionContext: "Chunk 0 (2026-08-06T11:00:00.000Z): Introduction section.", + previousVersionContent: "[Chunk 0]\nThe API supports OAuth 1.0 and no pagination.", + }, + "document-oversized": { + ...BASE, + episodeContent: FIXTURE_LONG_CONTENT, + relatedMemories: FIXTURE_LONG_CONTENT, + ingestionRules: FIXTURE_LONG_CONTENT, + sessionContext: FIXTURE_LONG_CONTENT, + previousVersionContent: FIXTURE_LONG_CONTENT, + }, +}; diff --git a/apps/webapp/app/services/prompts/__tests__/normalize-golden.test.ts b/apps/webapp/app/services/prompts/__tests__/normalize-golden.test.ts new file mode 100644 index 00000000..73b5e40b --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/normalize-golden.test.ts @@ -0,0 +1,47 @@ +import { describe, expect, it } from "vitest"; +import { normalizePrompt, normalizeDocumentPrompt } from "../normalize"; +import { + NORMALIZE_DOCUMENT_FIXTURES, + NORMALIZE_FIXTURES, +} from "./normalize-fixtures"; + +/** + * Golden-file proof that the composed-template refactor did not change a single + * byte of what hosted providers (Gemini) receive. + * + * The snapshots in `__snapshots__/normalize-golden.test.ts/` were generated from + * the ORIGINAL static templates, before normalizePrompt was decomposed into + * named sections and an assembler. An assertion could only prove the prompt is + * "small enough"; only a frozen byte-for-byte snapshot proves the assembler + * still emits the exact same template. If anyone edits a section constant, the + * assembler order, or a separator, this test fails loudly instead of silently + * drifting the production prompt. + * + * Do NOT regenerate these snapshots to make a failure go away. A diff here means + * the prompt sent to Gemini changed, which is a behavioural change that must be + * intentional and reviewed. + */ + +function render(messages: ReturnType): string { + return messages + .map((m) => `=== role: ${m.role} ===\n${m.content as string}`) + .join("\n"); +} + +describe("normalize prompt golden files (default/Gemini profile)", () => { + for (const [name, context] of Object.entries(NORMALIZE_FIXTURES)) { + it(`normalizePrompt renders byte-identically for ${name}`, async () => { + await expect(render(normalizePrompt(context))).toMatchFileSnapshot( + `./__snapshots__/normalize-${name}.txt`, + ); + }); + } + + for (const [name, context] of Object.entries(NORMALIZE_DOCUMENT_FIXTURES)) { + it(`normalizeDocumentPrompt renders byte-identically for ${name}`, async () => { + await expect(render(normalizeDocumentPrompt(context))).toMatchFileSnapshot( + `./__snapshots__/normalize-${name}.txt`, + ); + }); + } +}); From 0d750fd8f8d4e883f200eae133843448860750db Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Thu, 6 Aug 2026 23:05:20 +0200 Subject: [PATCH 05/13] fix(prompts): bound the normalization prompts for small-context providers normalizePrompt and normalizeDocumentPrompt interpolated relatedMemories, sessionContext, previousVersionContent and the database-loaded ingestionRules with no upper bound. Against Ollama that silently overflows the 4096-token window and is truncated without any error, which is the failure mode that degraded ingest quality. Splits the conversation system prompt into named section constants plus an assembler, and introduces two profiles: - "hosted" (the default) composes every section in canonical order and applies no caps at all. The golden snapshots prove its output is byte-identical to the previous template, including for oversized fixtures, so hosted providers are unaffected. Capping unconditionally would have been the easy mistake here. - "ollama" caps each injection and then drops optional sections in priority order until the prompt fits, enrichment_examples first because at 1626 tokens it is roughly a third of the template. preamble, entity_types, ingestion_rules and output_format are undroppable; the tags are load-bearing and dropping them breaks response parsing. The section text was relocated by pure string slicing rather than retyped, so byte-identity holds by construction as well as by test. Budgets are measured with the o200k_base tokenizer, not estimated. The first draft repeated the mistake the rerank budgets made: the arithmetic predicted 3235 tokens for the binding worst case (document semantic-diff mode, which carries both the larger static prompt and previousVersionContent), but the measured figure was 3307 and it threw against the 3300 budget. Hand arithmetic under-counted tag and formatting overhead. The allocations were reduced until the measured worst case cleared with real margin: document diff, every injection at its cap ... 3227 / 3300 (73 spare) document plain .............................. 918 conversation after section dropping ......... 3093 / 3300 3300 + 768 reserved output = 4068 < 4096 The worst cases are pinned by test rather than trusted, which is the only reason the 3307 error surfaced before production rather than after. Conversation normalization stays on a hosted provider. Its system prompt alone is 5090 tokens, so it cannot fit 4096 even with zero injected content, and section dropping is lossy. The ollama profile is a correct, tested mechanism, not a routing decision. normalizeDocumentPrompt has real headroom at 818 tokens plain and 1172 in diff mode, so it never needs dropping, but it runs through the same cap and assertion primitives so future growth fails loudly instead of being silently truncated. --- .../__tests__/normalizeProfile.test.ts | 193 ++++++++ apps/webapp/app/services/prompts/normalize.ts | 441 ++++-------------- .../app/services/prompts/normalizeProfile.ts | 226 +++++++++ .../app/services/prompts/normalizeSections.ts | 368 +++++++++++++++ 4 files changed, 879 insertions(+), 349 deletions(-) create mode 100644 apps/webapp/app/services/prompts/__tests__/normalizeProfile.test.ts create mode 100644 apps/webapp/app/services/prompts/normalizeProfile.ts create mode 100644 apps/webapp/app/services/prompts/normalizeSections.ts diff --git a/apps/webapp/app/services/prompts/__tests__/normalizeProfile.test.ts b/apps/webapp/app/services/prompts/__tests__/normalizeProfile.test.ts new file mode 100644 index 00000000..03a6f81a --- /dev/null +++ b/apps/webapp/app/services/prompts/__tests__/normalizeProfile.test.ts @@ -0,0 +1,193 @@ +import { describe, expect, it } from "vitest"; +import { normalizeDocumentPrompt, normalizePrompt } from "../normalize"; +import { + CANONICAL_SECTION_ORDER, + NORMALIZE_ENTITY_TYPES_TOKEN_BUDGET, + NORMALIZE_EPISODE_CONTENT_TOKEN_BUDGET, + NORMALIZE_INGESTION_RULES_TOKEN_BUDGET, + NORMALIZE_OUTPUT_TOKEN_RESERVE, + NORMALIZE_PREVIOUS_VERSION_TOKEN_BUDGET, + NORMALIZE_PROMPT_TOKEN_BUDGET, + NORMALIZE_RELATED_MEMORIES_TOKEN_BUDGET, + NORMALIZE_SESSION_CONTEXT_TOKEN_BUDGET, + SECTION_DROP_PRIORITY, + assembleSections, + capNormalizeContext, + resolveProfile, + selectSections, +} from "../normalizeProfile"; +import { OLLAMA_NUM_CTX } from "../promptBudget"; +import { countTokens } from "~/services/search/tokenBudget"; +import { + FIXTURE_LONG_CONTENT, + NORMALIZE_DOCUMENT_FIXTURES, + NORMALIZE_FIXTURES, +} from "./normalize-fixtures"; + +/** + * These tests pin the budget arithmetic against real measured token counts. + * The equivalent arithmetic for the rerank prompt was wrong in the dangerous + * direction on its first draft (predicted ~3050, real figure 3779), so the + * worst cases are measured here rather than trusted. + */ + +function promptTokens(messages: ReturnType): number { + return countTokens(messages.map((m) => m.content as string).join("")); +} + +describe("normalize budgets fit the pinned Ollama window", () => { + it("reserves output inside the VRAM-pinned context window", () => { + expect(OLLAMA_NUM_CTX).toBe(4096); + expect(NORMALIZE_PROMPT_TOKEN_BUDGET + NORMALIZE_OUTPUT_TOKEN_RESERVE).toBeLessThan( + OLLAMA_NUM_CTX, + ); + }); + + it("document diff mode is the binding worst case and fits", () => { + const messages = normalizeDocumentPrompt( + NORMALIZE_DOCUMENT_FIXTURES["document-oversized"], + "ollama", + ); + const total = promptTokens(messages); + + expect(total).toBeLessThanOrEqual(NORMALIZE_PROMPT_TOKEN_BUDGET); + expect(total + NORMALIZE_OUTPUT_TOKEN_RESERVE).toBeLessThan(OLLAMA_NUM_CTX); + }); + + it("document plain mode fits with room to spare", () => { + const total = promptTokens( + normalizeDocumentPrompt(NORMALIZE_DOCUMENT_FIXTURES["document-plain"], "ollama"), + ); + expect(total).toBeLessThanOrEqual(NORMALIZE_PROMPT_TOKEN_BUDGET); + }); + + it("conversation prompt fits once sections are dropped", () => { + const total = promptTokens( + normalizePrompt(NORMALIZE_FIXTURES["conversation-oversized"], "ollama"), + ); + expect(total).toBeLessThanOrEqual(NORMALIZE_PROMPT_TOKEN_BUDGET); + }); +}); + +describe("capNormalizeContext", () => { + it("is a no-op on the hosted profile", () => { + const context = NORMALIZE_FIXTURES["conversation-oversized"]; + expect(capNormalizeContext(context, "hosted")).toBe(context); + }); + + it("caps every variable-length injection on the ollama profile", () => { + const capped = capNormalizeContext( + NORMALIZE_DOCUMENT_FIXTURES["document-oversized"], + "ollama", + ); + + expect(countTokens(capped.episodeContent)).toBeLessThanOrEqual( + NORMALIZE_EPISODE_CONTENT_TOKEN_BUDGET, + ); + expect(countTokens(capped.sessionContext)).toBeLessThanOrEqual( + NORMALIZE_SESSION_CONTEXT_TOKEN_BUDGET, + ); + expect(countTokens(capped.relatedMemories)).toBeLessThanOrEqual( + NORMALIZE_RELATED_MEMORIES_TOKEN_BUDGET, + ); + expect(countTokens(capped.previousVersionContent)).toBeLessThanOrEqual( + NORMALIZE_PREVIOUS_VERSION_TOKEN_BUDGET, + ); + expect(countTokens(capped.ingestionRules)).toBeLessThanOrEqual( + NORMALIZE_INGESTION_RULES_TOKEN_BUDGET, + ); + expect(countTokens(capped.entityTypes)).toBeLessThanOrEqual( + NORMALIZE_ENTITY_TYPES_TOKEN_BUDGET, + ); + }); + + it("leaves absent values absent so downstream fallbacks still fire", () => { + const capped = capNormalizeContext( + { episodeContent: "x", sessionContext: undefined }, + "ollama", + ); + expect(capped.sessionContext).toBeUndefined(); + expect("previousVersionContent" in capped).toBe(false); + }); +}); + +describe("section selection", () => { + const sections = Object.fromEntries( + CANONICAL_SECTION_ORDER.map((id) => [id, `<${id}>${FIXTURE_LONG_CONTENT}`]), + ) as Record<(typeof CANONICAL_SECTION_ORDER)[number], string>; + + it("keeps every section on the hosted profile regardless of size", () => { + expect(selectSections(sections, "hosted", { fixedTokens: 100_000 })).toEqual( + CANONICAL_SECTION_ORDER, + ); + }); + + it("never drops the undroppable sections", () => { + const selected = selectSections(sections, "ollama", { + fixedTokens: 0, + budget: 100_000, + }); + for (const id of ["preamble", "entity_types", "ingestion_rules", "output_format"] as const) { + expect(selected).toContain(id); + } + }); + + it("drops enrichment_examples first", () => { + const small = Object.fromEntries( + CANONICAL_SECTION_ORDER.map((id) => [id, `<${id}>body`]), + ) as typeof sections; + + // A budget one token under the full composition forces exactly one drop. + const full = countTokens(assembleSections(small, [...CANONICAL_SECTION_ORDER])); + const selected = selectSections(small, "ollama", { + fixedTokens: 0, + budget: full - 1, + }); + + expect(selected).not.toContain(SECTION_DROP_PRIORITY[0]); + expect(selected).toContain(SECTION_DROP_PRIORITY[1]); + }); + + it("stops dropping as soon as it fits", () => { + const small = Object.fromEntries( + CANONICAL_SECTION_ORDER.map((id) => [id, `<${id}>body`]), + ) as typeof sections; + + const full = countTokens(assembleSections(small, [...CANONICAL_SECTION_ORDER])); + const selected = selectSections(small, "ollama", { fixedTokens: 0, budget: full }); + expect(selected).toEqual(CANONICAL_SECTION_ORDER); + }); + + it("throws rather than silently shipping an over-budget prompt", () => { + expect(() => + selectSections(sections, "ollama", { fixedTokens: 0, budget: 10 }), + ).toThrow(/PromptBudget/); + }); + + it("accounts for fixedTokens when asserting, not just the sections", () => { + const small = Object.fromEntries( + CANONICAL_SECTION_ORDER.map((id) => [id, `<${id}>body`]), + ) as typeof sections; + + // Sections alone fit the budget, but the user prompt pushes it over. The + // assertion must still fire — this is the bug that made the fail-loud path + // silently pass. + const undroppableOnly = countTokens( + assembleSections(small, ["preamble", "entity_types", "ingestion_rules", "output_format"]), + ); + expect(() => + selectSections(small, "ollama", { + fixedTokens: 500, + budget: undroppableOnly + 400, + }), + ).toThrow(/PromptBudget/); + }); +}); + +describe("resolveProfile", () => { + it("maps ollama to the bounded profile and everything else to hosted", () => { + expect(resolveProfile("ollama")).toBe("ollama"); + expect(resolveProfile("openai")).toBe("hosted"); + expect(resolveProfile("azure")).toBe("hosted"); + }); +}); diff --git a/apps/webapp/app/services/prompts/normalize.ts b/apps/webapp/app/services/prompts/normalize.ts index 09e6245c..8a7f9b88 100644 --- a/apps/webapp/app/services/prompts/normalize.ts +++ b/apps/webapp/app/services/prompts/normalize.ts @@ -1,355 +1,62 @@ import { type ModelMessage } from "ai"; +import { countTokens } from "~/services/search/tokenBudget"; +import { assertPromptWithinBudget } from "~/services/prompts/promptBudget"; +import { + ENRICHMENT_EXAMPLES_SECTION, + ENRICHMENT_STRATEGY_SECTION, + OUTPUT_FORMAT_SECTION, + PREAMBLE_SECTION, + QUALITY_CONTROL_SECTION, + SPEAKER_ROLE_AWARENESS_SECTION, + STRATEGIC_ENRICHMENT_SECTION, + TEMPORAL_RESOLUTION_SECTION, + VISUAL_CONTENT_CAPTURE_SECTION, + buildEntityTypesSection, + buildIngestionRulesSection, +} from "./normalizeSections"; +import { + NORMALIZE_PROMPT_TOKEN_BUDGET, + type ConversationSectionId, + type PromptProfile, + assembleSections, + capNormalizeContext, + selectSections, +} from "./normalizeProfile"; + +/** + * Build the conversation normalization prompt. + * + * `profile` defaults to "hosted", which composes every section in canonical + * order and applies no caps, so hosted providers receive a byte-identical + * prompt to the pre-refactor template (proven by normalize-golden.test.ts). + * The "ollama" profile caps each injection and drops sections until the prompt + * fits the VRAM-pinned 4096-token window. + */ export const normalizePrompt = ( - context: Record, + rawContext: Record, + profile: PromptProfile = "hosted", ): ModelMessage[] => { - const sysPrompt = `You are C.O.R.E. (Contextual Observation & Recall Engine), a smart memory enrichment system. - -Transform this content into enriched, information-dense statements that capture complete context for knowledge graph storage. - -CRITICAL: CAPTURE ALL DISTINCT PIECES OF INFORMATION. Every separate fact, preference, request, clarification, specification, or detail mentioned must be preserved in your enriched output. Missing information is unacceptable. - -OUTPUT GUIDELINES: -- Simple content (1-2 facts): Use 1-2 concise sentences -- Complex content (multiple facts/categories): Use multiple focused paragraphs, each covering ONE topic area -- Technical content: Preserve specifications, commands, paths, version numbers, configurations -- Let content complexity determine output length - completeness over arbitrary brevity -- IMPORTANT: Break complex content into digestible paragraphs with natural sentence boundaries for easier fact extraction - - -CRITICAL: Episodes may contain MULTIPLE speakers with DIFFERENT fact authority: - -USER STATEMENTS → Can become user facts: -- Direct statements: "I want X", "My goal is Y", "I prefer Z", "I decided to..." -- Confirmations: "Yes", "Do that", "Let's go with X", "Sounds good, proceed" -- Instructions/directives: "Don't show me X", "Always do Y", "Never remind me about Z" -- Reports: "I completed X", "I ate Y", "I met with Z" - -ASSISTANT STATEMENTS → Generally NOT user facts: -- Suggestions: "You could try X", "I recommend Y", "Here's an option..." -- Questions: "Want me to do X?", "Should I proceed?", "Would you like..." -- Explanations: "This works because...", "The reason is..." -- Coaching/guidance: "Here's how to do X...", "Best practice is..." -- Information provided: "I found X", "The data shows Y" - -CRITICAL RULES: -1. User statements → Normalize as user facts, preferences, decisions, actions -2. User confirms assistant suggestion → Normalize as user decision (e.g., "User decided to X after assistant recommendation") -3. Assistant offers/asks WITHOUT user response → DO NOT attribute to user. Instead: "The assistant offered to X" or "The assistant suggested Y" -4. Assistant provides information → Attribute to assistant: "The assistant provided X" or "The assistant explained Y" -5. User silence ≠ user agreement. No response to an offer means the offer is pending, not accepted. - -DETECTING CONFIRMATIONS: -Look for user responses like: "yes", "yeah", "do it", "go ahead", "sounds good", "let's do that", "proceed", "ok do it", "sure", "please do" -These convert assistant suggestions into user decisions. - -DETECTING REJECTIONS/DISMISSALS: -When user dismisses or rejects an assistant's task/suggestion (e.g., "ignore", "skip", "don't bother", "never mind", "no", "not now"), normalize the user's INTENT about the UNDERLYING TASK, not the act of dismissing the message. -- Use session context to identify what task/topic the user is rejecting -- "ignore" (after assistant offered to check a security PR) → "User instructed to ignore the security PR" -- NOT: "User instructed to ignore the assistant's prior message" -- "skip" (after assistant proposed reviewing error logs) → "User declined to review the error logs" -- NOT: "User told the assistant to skip its suggestion" - -MULTI-PARTY CONTENT (email threads, forwarded messages, group chats, shared conversations): -Episodes may contain content from people BEYOND the user and assistant — email senders, CC'd recipients, forwarded messages, quoted replies. These are FIRST-CLASS content, not background noise. - -Rules for multi-party content: -1. Each person's statements are facts ABOUT that person and their relationship to the user — preserve them with clear speaker attribution -2. Quoted/forwarded/nested content contains real information — extract it the same as direct content -3. Contact information in signatures (email, phone, company, role, address) are entity attributes — preserve them -4. The conversation THREAD tells a story — preserve the sequence of who said what and when -5. Deduplicate repeated content (same signature appearing 3 times) — capture once, not three times - - - -1. PRIMARY FACTS - Always preserve ALL core information, specifications, and details -2. SPEAKER ATTRIBUTION - Maintain clear distinction between what user said vs what assistant said - - For self-introductions ("I'm X", "My name is Y"), preserve as "the user introduced themselves as X" - - For assistant statements, preserve as "the assistant suggested/explained/provided X" -3. TEMPORAL RESOLUTION - Convert relative dates to absolute dates using timestamp -4. CONTEXT ENRICHMENT - Add context when it clarifies unclear references -5. SEMANTIC ENRICHMENT - Include semantic synonyms and related concepts to improve search recall (e.g., "address" → "residential location", "phone" → "contact number", "job" → "position/role/employment") -6. ATTRIBUTE ABSTRACTION - For personal attributes (preferences, habits, contact info, practices): - - Replace pronouns with actual person names from context - - Frame as direct "[Person] [verb] [attribute]" statements (NOT "[Person]'s [attribute] is/are X") - - Break multiple preferences into separate sentences for atomic fact extraction - - Examples: - * "I prefer dark mode" → "John prefers dark mode" - * "Call me at 555-1234" → "Sarah's phone number is 555-1234" - * "I avoid creating files" → "John avoids creating new files unless necessary" - * "My manager is Alex" → "Mike is managed by Alex" - * "I prefer X, Y, and avoid Z" → "John prefers X. John prefers Y. John avoids Z." - - IMPORTANT: When the user describes a product, project, or system, keep the product/project as the subject — NOT the user. Only use the user's name for personal statements (identity, preferences, goals, decisions, habits). - * "We use Redis for caching" → "The system uses Redis for caching" (NOT "Sarah says the system uses Redis") - * "The search pipeline supports vector queries" → keep as-is (NOT "Mike stated the search pipeline supports vector queries") - * "Authentication is handled via OAuth 2.0" → keep as-is (NOT "Tom said authentication is handled via OAuth 2.0") -7. VISUAL CONTENT - Capture exact text on signs, objects shown, specific details from images -8. EMOTIONAL PRESERVATION - Maintain tone and feeling of emotional exchanges -9. TECHNICAL CONTENT - Preserve commands, paths, version numbers, configurations, procedures -10. STRUCTURED CONTENT - Maintain hierarchy, lists, categories, relationships - -CONTENT-ADAPTIVE APPROACH: -- Conversations: Focus on dialogue context, relationships, emotional tone -- Documents: Extract structured facts, technical details, categorical organization -- Code/Technical: Preserve functionality, dependencies, configurations, architectural decisions -- Structured Data: Maintain categories, hierarchies, specifications - -When to add context from related memories: -- Unclear pronouns ("she", "it", "they") → resolve to specific entity -- Vague references ("the agency", "the event") → add clarifying details -- Continuation phrases ("following up", "as we discussed") → connect to previous topic - -When NOT to add context: -- Clear, self-contained statements → no enrichment needed beyond temporal -- Emotional responses → preserve tone, avoid over-contextualization -- Already established topics → don't repeat details mentioned earlier in same session - - - -Convert RELATIVE time references to absolute dates: -- "yesterday" → "June 26, 2023" -- "last week" → "around June 19-25, 2023" -- "next month" → "July 2023" - -DATE PREFIX RULE: -- Add "On [date]," prefix ONCE at the very start of your output -- DO NOT repeat the date prefix on subsequent sentences or paragraphs -- The timestamp applies to the entire episode - no need to restate it - -BAD (date spam): "On Jan 15, the user has 31% body fat. On Jan 15, the user does cycling. On Jan 15, the user wants to lose fat." -GOOD (date once): "On January 15, 2026, the user shared fitness goals. Current stats: 31% body fat, 66kg lean mass. Does evening cycling and considering morning strength training. Goal: reduce body fat while preserving lean mass." - - - -For episodes with images/photos, EXTRACT: -- Exact text on signs, posters, labels (e.g., "Trans Lives Matter") -- Objects, people, settings, activities shown -- Specific visual details that add context -Integrate visual content as primary facts, not descriptions. - - - -When related memories are provided, apply SELECTIVE enrichment: - -HIGH VALUE ENRICHMENT (always include): -- Temporal resolution: "last week" → "June 20, 2023" -- Entity disambiguation: "she" → "Caroline" when unclear -- Missing critical context: "the agency" → "Bright Futures Adoption Agency" (first mention only) -- New developments: connecting current facts to ongoing storylines -- Identity-defining possessives: "my X, Y" → preserve the relationship between person and Y as their X -- Definitional phrases: maintain the defining relationship, not just the entity reference -- Origin/source connections: preserve "from my X" relationships - -LOW VALUE ENRICHMENT (usually skip): -- Obvious references: "Thanks, Mel!" doesn't need Melanie's full context -- Support/encouragement statements: emotional exchanges rarely need historical anchoring -- Already clear entities: don't replace pronouns when reference is obvious -- Repetitive context: never repeat the same descriptive phrase within a conversation -- Ongoing conversations: don't re-establish context that's already been set -- Emotional responses: keep supportive statements simple and warm -- Sequential topics: reference previous topics minimally ("recent X" not full description) - -ANTI-BLOAT RULES: -- DATE PREFIX ONCE: Use "On [date]," ONLY at the very beginning of output, never repeat it -- If the original statement is clear and complete, add minimal enrichment -- Never use the same contextual phrase twice in one conversation -- Focus on what's NEW, not what's already established -- Preserve emotional tone - don't bury feelings in facts -- ONE CONTEXT REFERENCE PER TOPIC: Don't keep referencing "the charity race" with full details -- STOP AT CLARITY: If original meaning is clear, don't add backstory -- AVOID COMPOUND ENRICHMENT: Don't chain multiple contextual additions in one sentence - -CONTEXT FATIGUE PREVENTION: -- After mentioning a topic once with full context, subsequent references should be minimal -- Use "recent" instead of repeating full details: "recent charity race" not "the May 20, 2023 charity race for mental health" -- Focus on CURRENT episode facts, not historical anchoring -- Don't re-explain what's already been established in the conversation - -ENRICHMENT SATURATION RULE: -Once a topic has been enriched with full context in the conversation, subsequent mentions should be minimal: -- First mention: "May 20, 2023 charity race for mental health" -- Later mentions: "the charity race" or "recent race" -- Don't re-explain established context - -IDENTITY AND DEFINITIONAL RELATIONSHIP PRESERVATION: -- Preserve possessive phrases that define relationships: "my X, Y" → "Y, [person]'s X" -- Keep origin/source relationships: "from my X" → preserve the X connection -- Preserve family/professional/institutional relationships expressed through possessives -- Don't reduce identity-rich phrases to simple location/entity references - - - -${context.entityTypes} - - - -${ - context.ingestionRules - ? `Apply these rules for content from ${context.source}: -${context.ingestionRules} - -CRITICAL: If content does NOT satisfy these rules, respond with "NOTHING_TO_REMEMBER" regardless of other criteria.` - : "No specific ingestion rules defined for this source." -} - - - -RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: -- Pure generic responses without context ("awesome", "thanks", "okay" with no subject) -- Empty pleasantries with no substance ("how are you", "have a good day") -- Standalone acknowledgments without topic reference ("got it", "will do") -- Truly vague encouragement with no specific subject matter ("great job" with no context) -- Already captured information without new connections -- Technical noise or system messages - -STORE IN MEMORY if content contains: -- Specific facts, names, dates, or detailed information -- Personal details, preferences, or decisions -- Concrete plans, commitments, or actions -- Visual content with specific details -- Temporal information that can be resolved -- New connections to existing knowledge -- Encouragement that references specific activities or topics -- Statements expressing personal values or beliefs -- Support that's contextually relevant to ongoing conversations -- Responses that reveal relationship dynamics or personal characteristics - -SPEAKER ATTRIBUTION RULES: -- NEVER write "User wants X" or "User decided Y" based on assistant suggestions that weren't confirmed -- NEVER attribute assistant's recommendations/beliefs/analysis to the user -- When assistant offers something and user doesn't respond: "The assistant offered to X" (NOT "User is considering X") -- When assistant explains something: "The assistant explained X" (NOT "User learned X" unless user confirmed learning) -- Keep attribution explicit when source matters: "The assistant suggested..." vs "User decided..." - -MEANINGFUL ENCOURAGEMENT EXAMPLES (STORE these): -- "Taking time for yourself is so important" → Shows personal values about self-care -- "You're doing an awesome job looking after yourself and your family" → Specific topic reference -- "That charity race sounds great" → Contextually relevant support -- "Your future family is gonna be so lucky" → Values-based encouragement about specific situation - -EMPTY ENCOURAGEMENT EXAMPLES (DON'T STORE these): -- "Great job!" (no context) -- "Awesome!" (no subject) -- "Keep it up!" (no specific reference) - - - -SIMPLE CONVERSATION - HIGH VALUE ENRICHMENT: -- Original: "She said yes!" -- Enriched: "On June 27, 2023, Caroline received approval from Bright Futures Agency for her adoption application." -- Why: Resolves unclear pronoun, adds temporal context once, identifies the approving entity - -MULTI-FACT CONVERSATION (date once, then continue without repeating): -- Original: "User wants to reduce body fat. Current stats: 31% body fat, 66kg lean mass. Cycling evenings. Considering morning strength training." -- Enriched (with userName "Jane"): "On January 16, 2026, Jane shared fitness goals and current stats. Body composition: 31% body fat, 66kg lean body mass. Currently does evening cycling sessions. Considering adding morning strength training to the routine. Primary goal: reduce body fat while preserving lean mass." -- Why: Date prefix ONCE at start. "User" replaced with actual name. No date repetition. - -SEMANTIC ENRICHMENT FOR BETTER SEARCH: -- Original: "My address is 123 Main St. Boston, MA 02101" -- Enriched (with userName "Sarah"): "Sarah's residential address (home location) is 123 Main St. Boston, MA 02101." -- Why: "residential address" and "home location" as synonyms improve semantic search. Use actual name. - -- Original: "Call me at 555-1234" -- Enriched (with userName "Sarah"): "Sarah's phone number (contact number) is 555-1234." -- Why: "phone number" and "contact number" as synonyms help queries. Use actual name. - -ATTRIBUTE ABSTRACTION FOR BETTER GRAPH RELATIONSHIPS: -- Original: "I avoid creating new files unless necessary" -- Enriched: "John has a coding practice: avoid creating new files unless necessary." -- Why: Creates direct relationship from person to practice for better graph traversal - -- Original: "I prefer editing existing code over writing new code" -- Enriched: "John prefers editing existing code over writing new code." -- Why: Direct preference relationship enables queries like "what are John's preferences" - -- Original: "My manager is Sarah" -- Enriched: "Alex is managed by Sarah." -- Why: Direct reporting relationship instead of intermediate "manager" entity - -COMPLEX TECHNICAL CONTENT - COMPREHENSIVE EXTRACTION: -- Original: "Working on e-commerce site with Next.js 14. Run pnpm dev to start at port 3000. Using Prisma with PostgreSQL, Stripe for payments, Redis for caching. API routes in /api/*, database migrations in /prisma/migrations." -- Enriched (with userName "Mike"): "On January 15, 2024, Mike is developing an e-commerce site built with Next.js 14. Development setup: pnpm dev starts local server on port 3000. Technology stack: Prisma ORM with PostgreSQL database, Stripe integration for payment processing, Redis for caching. Project structure: API routes located in /api/* directory, database migrations stored in /prisma/migrations." -- Why: Date once at start, use actual name, then technical details follow without date repetition - -STRUCTURED PREFERENCES: -- Original: "I prefer minimalist design, dark mode by default, keyboard shortcuts for navigation, and hate pop-up notifications" -- Enriched (with userName "Alex"): "Alex's UI/UX preferences: minimalist design aesthetic, dark mode as default theme, keyboard shortcuts for primary navigation, and dislikes pop-up notifications." -- Why: Timeless preferences don't need date prefix. Use actual name instead of "the user". - -SELF-INTRODUCTION - SPEAKER ATTRIBUTION: -- Original: "I'm John. I'm a Developer. My primary goal with CORE is to build a personal memory system." -- Enriched: "On October 2, 2025, the user introduced themselves as John, a Developer. John's primary goal with CORE is to build a personal memory system." -- Why: Date once for the introduction event, then facts follow without date repetition - -- Original: "Hi, my name is Sarah and I work at Meta as a product manager" -- Enriched: "On January 20, 2024, the user introduced themselves as Sarah, a product manager at Meta." -- Why: Single event, single date prefix - -ANTI-BLOAT (what NOT to do): -❌ WRONG (date spam): "On May 25, the user has goal X. On May 25, the user reported stat Y. On May 25, the assistant confirmed Z. On May 25, the assistant outlined strategy A." -✅ RIGHT (date once): "On May 25, 2023, the user discussed goals and stats. Goal: X. Current stats: Y. The assistant confirmed Z and outlined strategy A including..." - -❌ WRONG (run-on mega-sentence): Cramming 10+ facts into single 200+ word sentence with no structure -✅ RIGHT (organized): Multiple clear sentences or paragraphs with natural boundaries, date only at start - -IDENTITY PRESERVATION: -- Original: "my hometown, Boston" → "Boston, [person]'s hometown" -- Original: "my colleague at Microsoft" → "colleague at Microsoft, [person]'s workplace" -- Why: Maintains possessive/definitional connections establishing entity relationships - -CONVERSATION WITH ASSISTANT OFFER (no user confirmation): -- Original: "user: Can you check my calendar?\nassistant: Found 3 meetings. Want me to reschedule the 2pm one?" -- Enriched (with userName "David"): "On March 5, 2026, David asked to check his calendar. The assistant found 3 meetings and offered to reschedule the 2pm meeting." -- Why: User asked a question (fact). Assistant made an offer but user didn't confirm - so NOT "David is considering rescheduling" or "David wants to reschedule" - -CONVERSATION WITH USER CONFIRMATION: -- Original: "user: How should I store this data?\nassistant: I suggest using PostgreSQL for relational data.\nuser: Yes, let's go with that" -- Enriched (with userName "Emma"): "On March 5, 2026, Emma asked about data storage options. The assistant suggested PostgreSQL for relational data. Emma decided to use PostgreSQL." -- Why: User explicitly confirmed ("Yes, let's go with that"), so this becomes a user decision - -ASSISTANT COACHING/GUIDANCE: -- Original: "assistant: Here are 3 tips for better sleep: 1) No screens before bed, 2) Keep room cool, 3) Consistent schedule" -- Enriched (with userName "Tom"): "On March 5, 2026, the assistant provided Tom with 3 sleep improvement tips: avoiding screens before bed, keeping the room cool, and maintaining a consistent sleep schedule." -- Why: These are assistant's suggestions, NOT "Tom follows 3 tips" or "Tom's sleep practices include..." - -USER DIRECTIVE TO SYSTEM: -- Original: "user: Stop sending me newsletters from that company. Mark them as spam." -- Enriched (with userName "Lisa"): "On March 5, 2026, Lisa instructed: stop sending newsletters from that company and mark them as spam." -- Why: Clear user directive - this IS a user fact/preference - -USER REPORTING ACTION: -- Original: "user: I just finished the report and sent it to the client" -- Enriched (with userName "Mark"): "On March 5, 2026, Mark completed the report and sent it to the client." -- Why: User reporting their own action - this IS a user fact - - -CRITICAL OUTPUT FORMAT REQUIREMENT: -You MUST wrap your response in tags. This is MANDATORY - no exceptions. - -If the content should be stored in memory: - -{{your_enriched_output_here}} - - -If there is nothing worth remembering: - -NOTHING_TO_REMEMBER - - -FAILURE TO USE TAGS WILL RESULT IN EMPTY NORMALIZATION AND SYSTEM FAILURE. - -FORMAT EXAMPLES (when userName is provided, use it instead of "the user"): -✅ CORRECT (simple): On May 25, 2023, Caroline shared her adoption plans with Melanie. -✅ CORRECT (multi-fact with userName "Jane"): On January 16, 2026, Jane discussed fitness goals. Current stats: 31% body fat, 66kg lean mass, 5'10" height. Currently does evening cycling. Considering adding morning strength training. Goal: reduce body fat while preserving lean mass. -✅ CORRECT (technical with userName "Mike"): On January 15, 2024, Mike is developing an e-commerce site with Next.js 14. Development: pnpm dev on port 3000. Stack: Prisma with PostgreSQL, Stripe payments, Redis caching. Structure: API routes in /api/*, migrations in /prisma/migrations. -✅ CORRECT: NOTHING_TO_REMEMBER -❌ WRONG (using "the user" when userName provided): On Jan 15, the user has goal X. -❌ WRONG (date spam): On Jan 15, Jane has goal X. On Jan 15, Jane has stat Y. On Jan 15, the assistant said Z. -❌ WRONG: Missing tags entirely - -ALWAYS include opening and closing tags around your entire response. -`; + // Shadowing `context` keeps every downstream reference below reading the + // capped values; on the hosted profile this returns the object untouched. + const context = capNormalizeContext(rawContext, profile); + + const sections: Record = { + preamble: PREAMBLE_SECTION, + speaker_role_awareness: SPEAKER_ROLE_AWARENESS_SECTION, + enrichment_strategy: ENRICHMENT_STRATEGY_SECTION, + temporal_resolution: TEMPORAL_RESOLUTION_SECTION, + visual_content_capture: VISUAL_CONTENT_CAPTURE_SECTION, + strategic_enrichment: STRATEGIC_ENRICHMENT_SECTION, + entity_types: buildEntityTypesSection(context.entityTypes), + ingestion_rules: buildIngestionRulesSection( + context.ingestionRules, + context.source, + ), + quality_control: QUALITY_CONTROL_SECTION, + enrichment_examples: ENRICHMENT_EXAMPLES_SECTION, + output_format: OUTPUT_FORMAT_SECTION, + }; // Add user identity section if userName is provided const userIdentitySection = context.userName @@ -389,15 +96,43 @@ ${context.relatedMemories} `; + // The original template ended with a single trailing newline after the last + // section; reproduce it exactly or the golden snapshots drift by one byte. + const sysPrompt = + assembleSections( + sections, + selectSections(sections, profile, { + fixedTokens: countTokens(userPrompt), + }), + ) + "\n"; + + if (profile === "ollama") { + assertPromptWithinBudget({ + label: "normalize conversation prompt (ollama profile)", + text: sysPrompt + userPrompt, + budget: NORMALIZE_PROMPT_TOKEN_BUDGET, + }); + } + return [ { role: "system", content: sysPrompt }, { role: "user", content: userPrompt }, ]; }; +/** + * Build the document normalization prompt. + * + * Document prompts measure 818 tokens plain / 1172 in semantic-diff mode, so + * they have real headroom at 4096 and never need section dropping. They still + * run through the same cap + assertion primitives so that future growth fails + * loudly instead of being silently truncated by Ollama. + */ export const normalizeDocumentPrompt = ( - context: Record, + rawContext: Record, + profile: PromptProfile = "hosted", ): ModelMessage[] => { + const context = capNormalizeContext(rawContext, profile); const sysPrompt = `You are C.O.R.E. (Contextual Observation & Recall Engine), a document memory processing system. Transform this document content into enriched factual statements for knowledge graph storage. @@ -567,6 +302,14 @@ ${context.relatedMemories} `; + if (profile === "ollama") { + assertPromptWithinBudget({ + label: "normalize document prompt (ollama profile)", + text: sysPrompt + userPrompt, + budget: NORMALIZE_PROMPT_TOKEN_BUDGET, + }); + } + return [ { role: "system", content: sysPrompt }, { role: "user", content: userPrompt }, diff --git a/apps/webapp/app/services/prompts/normalizeProfile.ts b/apps/webapp/app/services/prompts/normalizeProfile.ts new file mode 100644 index 00000000..a0d9673d --- /dev/null +++ b/apps/webapp/app/services/prompts/normalizeProfile.ts @@ -0,0 +1,226 @@ +import { + OLLAMA_NUM_CTX, + capToTokenBudget, + assertPromptWithinBudget, +} from "~/services/prompts/promptBudget"; +import { countTokens } from "~/services/search/tokenBudget"; + +export type PromptProfile = "hosted" | "ollama"; + +export type ConversationSectionId = + | "preamble" + | "speaker_role_awareness" + | "enrichment_strategy" + | "temporal_resolution" + | "visual_content_capture" + | "strategic_enrichment" + | "entity_types" + | "ingestion_rules" + | "quality_control" + | "enrichment_examples" + | "output_format"; + +/** + * Budget arithmetic and design rationale. + * + * OLLAMA_NUM_CTX is frozen at 4096 because 8192 evicted qwen3:8b from an + * RTX 4060's 8GB VRAM entirely (5.5GB -> 0GB), forcing CPU inference. + * NORMALIZE_OUTPUT_TOKEN_RESERVE is 768 rather than OLLAMA_NUM_PREDICT_DEFAULT + * (512) because normalization emits enriched prose, and 512 is too tight for + * document-sized output. + * + * NORMALIZE_PROMPT_TOKEN_BUDGET = min(3300, 4096 - 768) = 3300. The raw ceiling + * is 3328; the 3300 cap keeps a deliberate margin. + * + * Measured with the o200k_base tokenizer (not estimated): + * conversation system prompt ........ 5090 tokens + * document system prompt ............ 818 plain / 1172 SEMANTIC DIFF MODE + * document static minus dynamics ..... 761 plain / 1115 diff + * + * Document diff mode is the binding worst case, because it carries both the + * larger static prompt AND previousVersionContent. + * + * The first draft of these allocations was wrong in the dangerous direction, + * exactly as the rerank budgets were: the arithmetic predicted + * 1115 static + 60 entityTypes + 180 ingestionRules + 60 glue + * + 900 episodeContent + 380 previousVersion + 260 sessionContext + * + 280 relatedMemories = 3235 + * but the measured worst case was 3307, which THREW against the 3300 budget. + * The per-injection allocations below were reduced until the measured figure + * cleared the budget with real margin. The lesson is the reason the assertion + * exists: hand arithmetic under-counts formatting and tag overhead, so the + * worst case is pinned by test in normalizeProfile.test.ts, never assumed. + * + * 3300 budget + 768 output = 4068 < 4096. + * + * ingestionRules is user-configurable text loaded from the database and was + * entirely unbounded, so it is capped here alongside the retrieval injections. + * + * The conversation system prompt is 5090 tokens, so it does not fit a 4096 + * window even with zero injected content. Section dropping is the only + * mechanism that can make it fit, and it is lossy. Conversation normalization + * therefore stays on a hosted provider today; the ollama profile is a correct, + * tested mechanism rather than a live routing decision. + * + * "hosted" is the DEFAULT and applies zero caps and zero section dropping. A + * golden-file snapshot test proves hosted output is byte-identical to the + * original template, including for deliberately oversized fixtures, so any + * unconditional capping is a regression. + */ +export const NORMALIZE_OUTPUT_TOKEN_RESERVE = 768; +export const NORMALIZE_PROMPT_TOKEN_BUDGET = Math.min( + 3300, + OLLAMA_NUM_CTX - NORMALIZE_OUTPUT_TOKEN_RESERVE, +); + +export const NORMALIZE_EPISODE_CONTENT_TOKEN_BUDGET = 860; +export const NORMALIZE_PREVIOUS_VERSION_TOKEN_BUDGET = 380; +export const NORMALIZE_SESSION_CONTEXT_TOKEN_BUDGET = 240; +export const NORMALIZE_RELATED_MEMORIES_TOKEN_BUDGET = 260; +export const NORMALIZE_INGESTION_RULES_TOKEN_BUDGET = 180; +export const NORMALIZE_ENTITY_TYPES_TOKEN_BUDGET = 60; + +export const CANONICAL_SECTION_ORDER: ConversationSectionId[] = [ + "preamble", + "speaker_role_awareness", + "enrichment_strategy", + "temporal_resolution", + "visual_content_capture", + "strategic_enrichment", + "entity_types", + "ingestion_rules", + "quality_control", + "enrichment_examples", + "output_format", +]; + +/** + * Drop order for the ollama profile, cheapest loss first. enrichment_examples + * leads because it is 1626 tokens, roughly a third of the whole template. + * + * preamble, entity_types, ingestion_rules and output_format are absent by + * design: they are undroppable. The tags in output_format are + * load-bearing, and dropping them breaks response parsing downstream. + */ +export const SECTION_DROP_PRIORITY: ConversationSectionId[] = [ + "enrichment_examples", + "strategic_enrichment", + "speaker_role_awareness", + "enrichment_strategy", + "quality_control", + "temporal_resolution", + "visual_content_capture", +]; + +export function resolveProfile(providerType: string): PromptProfile { + return providerType === "ollama" ? "ollama" : "hosted"; +} + +/** + * Bound every variable-length injection for the ollama profile. + * + * Returns the context untouched on hosted providers: the golden-file test + * depends on hosted output being byte-identical, so capping must never be + * unconditional. + * + * Absent values stay absent. Several of these drive `||` fallbacks and + * ternaries in the prompt templates, so turning `undefined` into `""` would + * silently change which branch renders. + */ +export function capNormalizeContext( + context: Record, + profile: PromptProfile, +): Record { + if (profile === "hosted") { + return context; + } + + const capped = { ...context }; + + const budgets: Array<[string, number]> = [ + ["episodeContent", NORMALIZE_EPISODE_CONTENT_TOKEN_BUDGET], + ["sessionContext", NORMALIZE_SESSION_CONTEXT_TOKEN_BUDGET], + ["relatedMemories", NORMALIZE_RELATED_MEMORIES_TOKEN_BUDGET], + ["previousVersionContent", NORMALIZE_PREVIOUS_VERSION_TOKEN_BUDGET], + ["ingestionRules", NORMALIZE_INGESTION_RULES_TOKEN_BUDGET], + ["entityTypes", NORMALIZE_ENTITY_TYPES_TOKEN_BUDGET], + ]; + + for (const [key, budget] of budgets) { + const value = capped[key]; + if (typeof value === "string" && value.length > 0) { + capped[key] = capToTokenBudget(value, budget); + } + } + + return capped; +} + +/** + * Join the selected sections in canonical order, separated by a blank line. + * Selection order is ignored on purpose: canonical order is the contract. + */ +export function assembleSections( + sections: Record, + selected: ConversationSectionId[], +): string { + const selectedSet = new Set(selected); + return CANONICAL_SECTION_ORDER.filter((id) => selectedSet.has(id)) + .map((id) => sections[id]) + .join("\n\n"); +} + +/** + * Choose which sections to render. + * + * Hosted returns the full canonical order unconditionally. Ollama drops in + * SECTION_DROP_PRIORITY order and stops as soon as the prompt fits, so it never + * degrades the prompt more than the budget requires. + * + * `fixedTokens` is everything outside the section list that still consumes the + * same window (the user prompt, and the output reserve if the caller accounts + * for it), so the fit test reflects the real request rather than the system + * prompt alone. + */ +export function selectSections( + sections: Record, + profile: PromptProfile, + opts: { fixedTokens: number; budget?: number }, +): ConversationSectionId[] { + if (profile === "hosted") { + return [...CANONICAL_SECTION_ORDER]; + } + + const budget = opts.budget ?? NORMALIZE_PROMPT_TOKEN_BUDGET; + const selected = [...CANONICAL_SECTION_ORDER]; + + const totalTokens = (): number => + opts.fixedTokens + countTokens(assembleSections(sections, selected)); + + for (const id of SECTION_DROP_PRIORITY) { + if (totalTokens() <= budget) { + break; + } + + const index = selected.indexOf(id); + if (index === -1) { + continue; + } + + selected.splice(index, 1); + } + + // Everything droppable is gone and it still does not fit. Fail loudly rather + // than hand Ollama a prompt it will silently truncate. + // + // The assertion budget is net of fixedTokens because assertPromptWithinBudget + // only measures the text it is given; comparing the sections alone against the + // full budget would let an over-budget request pass silently. + assertPromptWithinBudget({ + label: "normalize conversation system prompt (ollama profile)", + text: assembleSections(sections, selected), + budget: Math.max(0, budget - opts.fixedTokens), + }); + + return selected; +} diff --git a/apps/webapp/app/services/prompts/normalizeSections.ts b/apps/webapp/app/services/prompts/normalizeSections.ts new file mode 100644 index 00000000..17c4f22c --- /dev/null +++ b/apps/webapp/app/services/prompts/normalizeSections.ts @@ -0,0 +1,368 @@ +/** + * Conversation normalization prompt, decomposed into named sections. + * + * These constants hold the ORIGINAL template text verbatim, extracted by pure + * string slicing rather than retyped, so the hosted profile can reassemble a + * byte-identical prompt. `normalize-golden.test.ts` proves that property and + * will fail loudly if any section, separator, or ordering is edited. + * + * Sections join with a blank line ("\n\n"), and the assembled system prompt + * ends with a single trailing newline, exactly as the original template did. + * + * The two dynamic sections (entity_types, ingestion_rules) are functions + * because they interpolate request context; the rest are static. + */ + +export const PREAMBLE_SECTION = `You are C.O.R.E. (Contextual Observation & Recall Engine), a smart memory enrichment system. + +Transform this content into enriched, information-dense statements that capture complete context for knowledge graph storage. + +CRITICAL: CAPTURE ALL DISTINCT PIECES OF INFORMATION. Every separate fact, preference, request, clarification, specification, or detail mentioned must be preserved in your enriched output. Missing information is unacceptable. + +OUTPUT GUIDELINES: +- Simple content (1-2 facts): Use 1-2 concise sentences +- Complex content (multiple facts/categories): Use multiple focused paragraphs, each covering ONE topic area +- Technical content: Preserve specifications, commands, paths, version numbers, configurations +- Let content complexity determine output length - completeness over arbitrary brevity +- IMPORTANT: Break complex content into digestible paragraphs with natural sentence boundaries for easier fact extraction`; + +export const SPEAKER_ROLE_AWARENESS_SECTION = ` +CRITICAL: Episodes may contain MULTIPLE speakers with DIFFERENT fact authority: + +USER STATEMENTS → Can become user facts: +- Direct statements: "I want X", "My goal is Y", "I prefer Z", "I decided to..." +- Confirmations: "Yes", "Do that", "Let's go with X", "Sounds good, proceed" +- Instructions/directives: "Don't show me X", "Always do Y", "Never remind me about Z" +- Reports: "I completed X", "I ate Y", "I met with Z" + +ASSISTANT STATEMENTS → Generally NOT user facts: +- Suggestions: "You could try X", "I recommend Y", "Here's an option..." +- Questions: "Want me to do X?", "Should I proceed?", "Would you like..." +- Explanations: "This works because...", "The reason is..." +- Coaching/guidance: "Here's how to do X...", "Best practice is..." +- Information provided: "I found X", "The data shows Y" + +CRITICAL RULES: +1. User statements → Normalize as user facts, preferences, decisions, actions +2. User confirms assistant suggestion → Normalize as user decision (e.g., "User decided to X after assistant recommendation") +3. Assistant offers/asks WITHOUT user response → DO NOT attribute to user. Instead: "The assistant offered to X" or "The assistant suggested Y" +4. Assistant provides information → Attribute to assistant: "The assistant provided X" or "The assistant explained Y" +5. User silence ≠ user agreement. No response to an offer means the offer is pending, not accepted. + +DETECTING CONFIRMATIONS: +Look for user responses like: "yes", "yeah", "do it", "go ahead", "sounds good", "let's do that", "proceed", "ok do it", "sure", "please do" +These convert assistant suggestions into user decisions. + +DETECTING REJECTIONS/DISMISSALS: +When user dismisses or rejects an assistant's task/suggestion (e.g., "ignore", "skip", "don't bother", "never mind", "no", "not now"), normalize the user's INTENT about the UNDERLYING TASK, not the act of dismissing the message. +- Use session context to identify what task/topic the user is rejecting +- "ignore" (after assistant offered to check a security PR) → "User instructed to ignore the security PR" +- NOT: "User instructed to ignore the assistant's prior message" +- "skip" (after assistant proposed reviewing error logs) → "User declined to review the error logs" +- NOT: "User told the assistant to skip its suggestion" + +MULTI-PARTY CONTENT (email threads, forwarded messages, group chats, shared conversations): +Episodes may contain content from people BEYOND the user and assistant — email senders, CC'd recipients, forwarded messages, quoted replies. These are FIRST-CLASS content, not background noise. + +Rules for multi-party content: +1. Each person's statements are facts ABOUT that person and their relationship to the user — preserve them with clear speaker attribution +2. Quoted/forwarded/nested content contains real information — extract it the same as direct content +3. Contact information in signatures (email, phone, company, role, address) are entity attributes — preserve them +4. The conversation THREAD tells a story — preserve the sequence of who said what and when +5. Deduplicate repeated content (same signature appearing 3 times) — capture once, not three times +`; + +export const ENRICHMENT_STRATEGY_SECTION = ` +1. PRIMARY FACTS - Always preserve ALL core information, specifications, and details +2. SPEAKER ATTRIBUTION - Maintain clear distinction between what user said vs what assistant said + - For self-introductions ("I'm X", "My name is Y"), preserve as "the user introduced themselves as X" + - For assistant statements, preserve as "the assistant suggested/explained/provided X" +3. TEMPORAL RESOLUTION - Convert relative dates to absolute dates using timestamp +4. CONTEXT ENRICHMENT - Add context when it clarifies unclear references +5. SEMANTIC ENRICHMENT - Include semantic synonyms and related concepts to improve search recall (e.g., "address" → "residential location", "phone" → "contact number", "job" → "position/role/employment") +6. ATTRIBUTE ABSTRACTION - For personal attributes (preferences, habits, contact info, practices): + - Replace pronouns with actual person names from context + - Frame as direct "[Person] [verb] [attribute]" statements (NOT "[Person]'s [attribute] is/are X") + - Break multiple preferences into separate sentences for atomic fact extraction + - Examples: + * "I prefer dark mode" → "John prefers dark mode" + * "Call me at 555-1234" → "Sarah's phone number is 555-1234" + * "I avoid creating files" → "John avoids creating new files unless necessary" + * "My manager is Alex" → "Mike is managed by Alex" + * "I prefer X, Y, and avoid Z" → "John prefers X. John prefers Y. John avoids Z." + - IMPORTANT: When the user describes a product, project, or system, keep the product/project as the subject — NOT the user. Only use the user's name for personal statements (identity, preferences, goals, decisions, habits). + * "We use Redis for caching" → "The system uses Redis for caching" (NOT "Sarah says the system uses Redis") + * "The search pipeline supports vector queries" → keep as-is (NOT "Mike stated the search pipeline supports vector queries") + * "Authentication is handled via OAuth 2.0" → keep as-is (NOT "Tom said authentication is handled via OAuth 2.0") +7. VISUAL CONTENT - Capture exact text on signs, objects shown, specific details from images +8. EMOTIONAL PRESERVATION - Maintain tone and feeling of emotional exchanges +9. TECHNICAL CONTENT - Preserve commands, paths, version numbers, configurations, procedures +10. STRUCTURED CONTENT - Maintain hierarchy, lists, categories, relationships + +CONTENT-ADAPTIVE APPROACH: +- Conversations: Focus on dialogue context, relationships, emotional tone +- Documents: Extract structured facts, technical details, categorical organization +- Code/Technical: Preserve functionality, dependencies, configurations, architectural decisions +- Structured Data: Maintain categories, hierarchies, specifications + +When to add context from related memories: +- Unclear pronouns ("she", "it", "they") → resolve to specific entity +- Vague references ("the agency", "the event") → add clarifying details +- Continuation phrases ("following up", "as we discussed") → connect to previous topic + +When NOT to add context: +- Clear, self-contained statements → no enrichment needed beyond temporal +- Emotional responses → preserve tone, avoid over-contextualization +- Already established topics → don't repeat details mentioned earlier in same session +`; + +export const TEMPORAL_RESOLUTION_SECTION = ` +Convert RELATIVE time references to absolute dates: +- "yesterday" → "June 26, 2023" +- "last week" → "around June 19-25, 2023" +- "next month" → "July 2023" + +DATE PREFIX RULE: +- Add "On [date]," prefix ONCE at the very start of your output +- DO NOT repeat the date prefix on subsequent sentences or paragraphs +- The timestamp applies to the entire episode - no need to restate it + +BAD (date spam): "On Jan 15, the user has 31% body fat. On Jan 15, the user does cycling. On Jan 15, the user wants to lose fat." +GOOD (date once): "On January 15, 2026, the user shared fitness goals. Current stats: 31% body fat, 66kg lean mass. Does evening cycling and considering morning strength training. Goal: reduce body fat while preserving lean mass." +`; + +export const VISUAL_CONTENT_CAPTURE_SECTION = ` +For episodes with images/photos, EXTRACT: +- Exact text on signs, posters, labels (e.g., "Trans Lives Matter") +- Objects, people, settings, activities shown +- Specific visual details that add context +Integrate visual content as primary facts, not descriptions. +`; + +export const STRATEGIC_ENRICHMENT_SECTION = ` +When related memories are provided, apply SELECTIVE enrichment: + +HIGH VALUE ENRICHMENT (always include): +- Temporal resolution: "last week" → "June 20, 2023" +- Entity disambiguation: "she" → "Caroline" when unclear +- Missing critical context: "the agency" → "Bright Futures Adoption Agency" (first mention only) +- New developments: connecting current facts to ongoing storylines +- Identity-defining possessives: "my X, Y" → preserve the relationship between person and Y as their X +- Definitional phrases: maintain the defining relationship, not just the entity reference +- Origin/source connections: preserve "from my X" relationships + +LOW VALUE ENRICHMENT (usually skip): +- Obvious references: "Thanks, Mel!" doesn't need Melanie's full context +- Support/encouragement statements: emotional exchanges rarely need historical anchoring +- Already clear entities: don't replace pronouns when reference is obvious +- Repetitive context: never repeat the same descriptive phrase within a conversation +- Ongoing conversations: don't re-establish context that's already been set +- Emotional responses: keep supportive statements simple and warm +- Sequential topics: reference previous topics minimally ("recent X" not full description) + +ANTI-BLOAT RULES: +- DATE PREFIX ONCE: Use "On [date]," ONLY at the very beginning of output, never repeat it +- If the original statement is clear and complete, add minimal enrichment +- Never use the same contextual phrase twice in one conversation +- Focus on what's NEW, not what's already established +- Preserve emotional tone - don't bury feelings in facts +- ONE CONTEXT REFERENCE PER TOPIC: Don't keep referencing "the charity race" with full details +- STOP AT CLARITY: If original meaning is clear, don't add backstory +- AVOID COMPOUND ENRICHMENT: Don't chain multiple contextual additions in one sentence + +CONTEXT FATIGUE PREVENTION: +- After mentioning a topic once with full context, subsequent references should be minimal +- Use "recent" instead of repeating full details: "recent charity race" not "the May 20, 2023 charity race for mental health" +- Focus on CURRENT episode facts, not historical anchoring +- Don't re-explain what's already been established in the conversation + +ENRICHMENT SATURATION RULE: +Once a topic has been enriched with full context in the conversation, subsequent mentions should be minimal: +- First mention: "May 20, 2023 charity race for mental health" +- Later mentions: "the charity race" or "recent race" +- Don't re-explain established context + +IDENTITY AND DEFINITIONAL RELATIONSHIP PRESERVATION: +- Preserve possessive phrases that define relationships: "my X, Y" → "Y, [person]'s X" +- Keep origin/source relationships: "from my X" → preserve the X connection +- Preserve family/professional/institutional relationships expressed through possessives +- Don't reduce identity-rich phrases to simple location/entity references +`; + +export const QUALITY_CONTROL_SECTION = ` +RETURN "NOTHING_TO_REMEMBER" if content consists ONLY of: +- Pure generic responses without context ("awesome", "thanks", "okay" with no subject) +- Empty pleasantries with no substance ("how are you", "have a good day") +- Standalone acknowledgments without topic reference ("got it", "will do") +- Truly vague encouragement with no specific subject matter ("great job" with no context) +- Already captured information without new connections +- Technical noise or system messages + +STORE IN MEMORY if content contains: +- Specific facts, names, dates, or detailed information +- Personal details, preferences, or decisions +- Concrete plans, commitments, or actions +- Visual content with specific details +- Temporal information that can be resolved +- New connections to existing knowledge +- Encouragement that references specific activities or topics +- Statements expressing personal values or beliefs +- Support that's contextually relevant to ongoing conversations +- Responses that reveal relationship dynamics or personal characteristics + +SPEAKER ATTRIBUTION RULES: +- NEVER write "User wants X" or "User decided Y" based on assistant suggestions that weren't confirmed +- NEVER attribute assistant's recommendations/beliefs/analysis to the user +- When assistant offers something and user doesn't respond: "The assistant offered to X" (NOT "User is considering X") +- When assistant explains something: "The assistant explained X" (NOT "User learned X" unless user confirmed learning) +- Keep attribution explicit when source matters: "The assistant suggested..." vs "User decided..." + +MEANINGFUL ENCOURAGEMENT EXAMPLES (STORE these): +- "Taking time for yourself is so important" → Shows personal values about self-care +- "You're doing an awesome job looking after yourself and your family" → Specific topic reference +- "That charity race sounds great" → Contextually relevant support +- "Your future family is gonna be so lucky" → Values-based encouragement about specific situation + +EMPTY ENCOURAGEMENT EXAMPLES (DON'T STORE these): +- "Great job!" (no context) +- "Awesome!" (no subject) +- "Keep it up!" (no specific reference) +`; + +export const ENRICHMENT_EXAMPLES_SECTION = ` +SIMPLE CONVERSATION - HIGH VALUE ENRICHMENT: +- Original: "She said yes!" +- Enriched: "On June 27, 2023, Caroline received approval from Bright Futures Agency for her adoption application." +- Why: Resolves unclear pronoun, adds temporal context once, identifies the approving entity + +MULTI-FACT CONVERSATION (date once, then continue without repeating): +- Original: "User wants to reduce body fat. Current stats: 31% body fat, 66kg lean mass. Cycling evenings. Considering morning strength training." +- Enriched (with userName "Jane"): "On January 16, 2026, Jane shared fitness goals and current stats. Body composition: 31% body fat, 66kg lean body mass. Currently does evening cycling sessions. Considering adding morning strength training to the routine. Primary goal: reduce body fat while preserving lean mass." +- Why: Date prefix ONCE at start. "User" replaced with actual name. No date repetition. + +SEMANTIC ENRICHMENT FOR BETTER SEARCH: +- Original: "My address is 123 Main St. Boston, MA 02101" +- Enriched (with userName "Sarah"): "Sarah's residential address (home location) is 123 Main St. Boston, MA 02101." +- Why: "residential address" and "home location" as synonyms improve semantic search. Use actual name. + +- Original: "Call me at 555-1234" +- Enriched (with userName "Sarah"): "Sarah's phone number (contact number) is 555-1234." +- Why: "phone number" and "contact number" as synonyms help queries. Use actual name. + +ATTRIBUTE ABSTRACTION FOR BETTER GRAPH RELATIONSHIPS: +- Original: "I avoid creating new files unless necessary" +- Enriched: "John has a coding practice: avoid creating new files unless necessary." +- Why: Creates direct relationship from person to practice for better graph traversal + +- Original: "I prefer editing existing code over writing new code" +- Enriched: "John prefers editing existing code over writing new code." +- Why: Direct preference relationship enables queries like "what are John's preferences" + +- Original: "My manager is Sarah" +- Enriched: "Alex is managed by Sarah." +- Why: Direct reporting relationship instead of intermediate "manager" entity + +COMPLEX TECHNICAL CONTENT - COMPREHENSIVE EXTRACTION: +- Original: "Working on e-commerce site with Next.js 14. Run pnpm dev to start at port 3000. Using Prisma with PostgreSQL, Stripe for payments, Redis for caching. API routes in /api/*, database migrations in /prisma/migrations." +- Enriched (with userName "Mike"): "On January 15, 2024, Mike is developing an e-commerce site built with Next.js 14. Development setup: pnpm dev starts local server on port 3000. Technology stack: Prisma ORM with PostgreSQL database, Stripe integration for payment processing, Redis for caching. Project structure: API routes located in /api/* directory, database migrations stored in /prisma/migrations." +- Why: Date once at start, use actual name, then technical details follow without date repetition + +STRUCTURED PREFERENCES: +- Original: "I prefer minimalist design, dark mode by default, keyboard shortcuts for navigation, and hate pop-up notifications" +- Enriched (with userName "Alex"): "Alex's UI/UX preferences: minimalist design aesthetic, dark mode as default theme, keyboard shortcuts for primary navigation, and dislikes pop-up notifications." +- Why: Timeless preferences don't need date prefix. Use actual name instead of "the user". + +SELF-INTRODUCTION - SPEAKER ATTRIBUTION: +- Original: "I'm John. I'm a Developer. My primary goal with CORE is to build a personal memory system." +- Enriched: "On October 2, 2025, the user introduced themselves as John, a Developer. John's primary goal with CORE is to build a personal memory system." +- Why: Date once for the introduction event, then facts follow without date repetition + +- Original: "Hi, my name is Sarah and I work at Meta as a product manager" +- Enriched: "On January 20, 2024, the user introduced themselves as Sarah, a product manager at Meta." +- Why: Single event, single date prefix + +ANTI-BLOAT (what NOT to do): +❌ WRONG (date spam): "On May 25, the user has goal X. On May 25, the user reported stat Y. On May 25, the assistant confirmed Z. On May 25, the assistant outlined strategy A." +✅ RIGHT (date once): "On May 25, 2023, the user discussed goals and stats. Goal: X. Current stats: Y. The assistant confirmed Z and outlined strategy A including..." + +❌ WRONG (run-on mega-sentence): Cramming 10+ facts into single 200+ word sentence with no structure +✅ RIGHT (organized): Multiple clear sentences or paragraphs with natural boundaries, date only at start + +IDENTITY PRESERVATION: +- Original: "my hometown, Boston" → "Boston, [person]'s hometown" +- Original: "my colleague at Microsoft" → "colleague at Microsoft, [person]'s workplace" +- Why: Maintains possessive/definitional connections establishing entity relationships + +CONVERSATION WITH ASSISTANT OFFER (no user confirmation): +- Original: "user: Can you check my calendar?\nassistant: Found 3 meetings. Want me to reschedule the 2pm one?" +- Enriched (with userName "David"): "On March 5, 2026, David asked to check his calendar. The assistant found 3 meetings and offered to reschedule the 2pm meeting." +- Why: User asked a question (fact). Assistant made an offer but user didn't confirm - so NOT "David is considering rescheduling" or "David wants to reschedule" + +CONVERSATION WITH USER CONFIRMATION: +- Original: "user: How should I store this data?\nassistant: I suggest using PostgreSQL for relational data.\nuser: Yes, let's go with that" +- Enriched (with userName "Emma"): "On March 5, 2026, Emma asked about data storage options. The assistant suggested PostgreSQL for relational data. Emma decided to use PostgreSQL." +- Why: User explicitly confirmed ("Yes, let's go with that"), so this becomes a user decision + +ASSISTANT COACHING/GUIDANCE: +- Original: "assistant: Here are 3 tips for better sleep: 1) No screens before bed, 2) Keep room cool, 3) Consistent schedule" +- Enriched (with userName "Tom"): "On March 5, 2026, the assistant provided Tom with 3 sleep improvement tips: avoiding screens before bed, keeping the room cool, and maintaining a consistent sleep schedule." +- Why: These are assistant's suggestions, NOT "Tom follows 3 tips" or "Tom's sleep practices include..." + +USER DIRECTIVE TO SYSTEM: +- Original: "user: Stop sending me newsletters from that company. Mark them as spam." +- Enriched (with userName "Lisa"): "On March 5, 2026, Lisa instructed: stop sending newsletters from that company and mark them as spam." +- Why: Clear user directive - this IS a user fact/preference + +USER REPORTING ACTION: +- Original: "user: I just finished the report and sent it to the client" +- Enriched (with userName "Mark"): "On March 5, 2026, Mark completed the report and sent it to the client." +- Why: User reporting their own action - this IS a user fact +`; + +export const OUTPUT_FORMAT_SECTION = `CRITICAL OUTPUT FORMAT REQUIREMENT: +You MUST wrap your response in tags. This is MANDATORY - no exceptions. + +If the content should be stored in memory: + +{{your_enriched_output_here}} + + +If there is nothing worth remembering: + +NOTHING_TO_REMEMBER + + +FAILURE TO USE TAGS WILL RESULT IN EMPTY NORMALIZATION AND SYSTEM FAILURE. + +FORMAT EXAMPLES (when userName is provided, use it instead of "the user"): +✅ CORRECT (simple): On May 25, 2023, Caroline shared her adoption plans with Melanie. +✅ CORRECT (multi-fact with userName "Jane"): On January 16, 2026, Jane discussed fitness goals. Current stats: 31% body fat, 66kg lean mass, 5'10" height. Currently does evening cycling. Considering adding morning strength training. Goal: reduce body fat while preserving lean mass. +✅ CORRECT (technical with userName "Mike"): On January 15, 2024, Mike is developing an e-commerce site with Next.js 14. Development: pnpm dev on port 3000. Stack: Prisma with PostgreSQL, Stripe payments, Redis caching. Structure: API routes in /api/*, migrations in /prisma/migrations. +✅ CORRECT: NOTHING_TO_REMEMBER +❌ WRONG (using "the user" when userName provided): On Jan 15, the user has goal X. +❌ WRONG (date spam): On Jan 15, Jane has goal X. On Jan 15, Jane has stat Y. On Jan 15, the assistant said Z. +❌ WRONG: Missing tags entirely + +ALWAYS include opening and closing tags around your entire response.`; + +export function buildEntityTypesSection(entityTypes: string): string { + return ` +${entityTypes} +`; +} + +export function buildIngestionRulesSection( + ingestionRules: string | undefined, + source: string, +): string { + return ` +${ + ingestionRules + ? `Apply these rules for content from ${source}: +${ingestionRules} + +CRITICAL: If content does NOT satisfy these rules, respond with "NOTHING_TO_REMEMBER" regardless of other criteria.` + : "No specific ingestion rules defined for this source." +} +`; +} From c943d4237e064eeaaf4bca01c26e3d32e0f50951 Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Thu, 6 Aug 2026 23:05:35 +0200 Subject: [PATCH 06/13] fix(labels,graph): resolve the prompt profile at the call sites Wires the bounded profile into the two places that build these prompts, and fixes a fifth unbounded injection the prompt module cannot see. knowledgeGraph.server.ts resolves the profile from the configured provider and passes it to both normalization prompts. It is resolved here rather than inside the prompt module so that module stays pure and unit-testable without server env, and so normalize.ts does not have to import model.server.ts, which already imports promptBudget.ts and would form a cycle. label-assignment.logic.ts sets sessionContext to document.content, the entire document body, guarded only by MAX_CONTENT_TOKENS at 20000. That is roughly five whole Ollama context windows, so against Ollama this prompt was never bounded, merely truncated later and silently. It now uses a provider-aware budget and asserts the assembled prompt: 611 static + 21 glue + 400 labels + 2400 content = 3432 inside a 3500 budget, and 3500 + 512 reserved output = 4012 < 4096 The episode trim also moves from scaling by character ratio to capToTokenBudget. The ratio only estimates the resulting token count and can overshoot, which matters now that exceeding the budget throws rather than passing silently. Hosted providers keep the 20000-token budget and are unaffected. --- .../app/jobs/labels/label-assignment.logic.ts | 72 +++++++++++++++++-- .../app/services/knowledgeGraph.server.ts | 14 +++- 2 files changed, 76 insertions(+), 10 deletions(-) diff --git a/apps/webapp/app/jobs/labels/label-assignment.logic.ts b/apps/webapp/app/jobs/labels/label-assignment.logic.ts index 412f1d38..b62a26ce 100644 --- a/apps/webapp/app/jobs/labels/label-assignment.logic.ts +++ b/apps/webapp/app/jobs/labels/label-assignment.logic.ts @@ -15,9 +15,43 @@ import { generateOklchColor } from "~/components/ui/color-utils"; import { type ModelMessage } from "ai"; import { ProviderFactory, VECTOR_NAMESPACES } from "@core/providers"; import { countTokens } from "~/services/search/tokenBudget"; +import { + OLLAMA_NUM_CTX, + assertPromptWithinBudget, + capToTokenBudget, +} from "~/services/prompts/promptBudget"; +import { + resolveProfile, + type PromptProfile, +} from "~/services/prompts/normalizeProfile"; +import { getDefaultChatProviderType } from "~/services/llm-provider.server"; const MAX_CONTENT_TOKENS = 20000; +/** + * Label extraction budget for small-context providers. + * + * `sessionContext` here is the ENTIRE document body (see processLabelAssignment, + * where it is set from `document.content`). The only previous guard was + * MAX_CONTENT_TOKENS at 20000, which is roughly five times a whole Ollama + * context window — so against Ollama this prompt was silently truncated rather + * than bounded. + * + * Measured with the o200k_base tokenizer, the static system prompt is 611 + * tokens and the user-prompt scaffolding is 21. Reserving 512 tokens of output + * leaves 4096 - 512 = 3584 for input. Allowing 400 tokens for the existing + * labels list: + * 611 static + 21 glue + 400 labels + 2400 content = 3432, inside the 3500 + * assertion budget, and 3500 + 512 output = 4012 < 4096. + * Pinned by test rather than assumed. + */ +export const LABEL_OUTPUT_TOKEN_RESERVE = 512; +export const LABEL_PROMPT_TOKEN_BUDGET = Math.min( + 3500, + OLLAMA_NUM_CTX - LABEL_OUTPUT_TOKEN_RESERVE, +); +export const LABEL_CONTENT_TOKEN_BUDGET_OLLAMA = 2400; + // Similarity threshold for matching labels (higher = stricter matching) const LABEL_SIMILARITY_THRESHOLD = 0.85; @@ -301,7 +335,12 @@ export async function extractLabelsFromEpisode( workspaceId: string, sessionContext?: string, ): Promise { - const messages = buildLabelExtractionMessages(episodeBody, availableLabels, sessionContext); + const messages = buildLabelExtractionMessages( + episodeBody, + availableLabels, + sessionContext, + resolveProfile(getDefaultChatProviderType()), + ); logger.info("Extracting labels from episode", { episodeTokens: countTokens(episodeBody), @@ -426,20 +465,28 @@ export function buildLabelExtractionMessages( description: string | null; }>, sessionContext?: string, + profile: PromptProfile = "hosted", ): ModelMessage[] { + // Ollama silently drops anything past num_ctx, so the generous hosted budget + // has to shrink to something that actually fits the window. + const contentBudget = + profile === "ollama" ? LABEL_CONTENT_TOKEN_BUDGET_OLLAMA : MAX_CONTENT_TOKENS; + // Token-aware truncation: prioritise current episode, fill remainder with session context const episodeTokens = countTokens(episodeBody); let truncatedEpisode = episodeBody; let truncatedContext: string | undefined; - if (episodeTokens > MAX_CONTENT_TOKENS) { - // Edge case: episode alone exceeds budget — hard-trim from the end - const chars = Math.floor((MAX_CONTENT_TOKENS / episodeTokens) * episodeBody.length); - truncatedEpisode = episodeBody.substring(0, chars) + "...[truncated]"; + if (episodeTokens > contentBudget) { + // Edge case: episode alone exceeds budget. This used to scale by character + // ratio, which only estimates the resulting token count and can overshoot; + // capToTokenBudget converges on the real count, which matters now that + // going over the budget throws. + truncatedEpisode = capToTokenBudget(episodeBody, contentBudget); } if (sessionContext) { - const remaining = MAX_CONTENT_TOKENS - countTokens(truncatedEpisode); + const remaining = contentBudget - countTokens(truncatedEpisode); if (remaining > 200) { const contextTokens = countTokens(sessionContext); if (contextTokens <= remaining) { @@ -476,7 +523,7 @@ ${truncatedContext} ${truncatedEpisode} `; - return [ + const messages: ModelMessage[] = [ { role: "system", content: `You extract LABELS from episodes for a USER'S PERSONAL KNOWLEDGE SYSTEM. @@ -547,4 +594,15 @@ ${sessionContextXml} ${currentEpisodeXml}`, }, ]; + + if (profile === "ollama") { + // Fail loudly rather than let Ollama silently drop the overflow. + assertPromptWithinBudget({ + label: "label extraction prompt (ollama profile)", + text: messages.map((m) => m.content as string).join("\n"), + budget: LABEL_PROMPT_TOKEN_BUDGET, + }); + } + + return messages; } diff --git a/apps/webapp/app/services/knowledgeGraph.server.ts b/apps/webapp/app/services/knowledgeGraph.server.ts index d94fc1f3..a914c9a3 100644 --- a/apps/webapp/app/services/knowledgeGraph.server.ts +++ b/apps/webapp/app/services/knowledgeGraph.server.ts @@ -52,6 +52,8 @@ import { makeStructuredModelCall, } from "~/lib/model.server"; import { normalizePrompt, normalizeDocumentPrompt } from "./prompts"; +import { resolveProfile } from "./prompts/normalizeProfile"; +import { getDefaultChatProviderType } from "./llm-provider.server"; import { type EpisodeEmbedding, type PrismaClient } from "@prisma/client"; import { storeEpisodeEmbedding, @@ -769,11 +771,17 @@ export class KnowledgeGraphService { userName, // Pass user name for personalized normalization }; - // Route to appropriate normalization prompt based on content type + // Route to appropriate normalization prompt based on content type. + // + // The profile is resolved here rather than inside the prompt module so that + // module stays pure and unit-testable without server env. On Ollama it caps + // every variable-length injection and drops optional sections to fit the + // VRAM-pinned 4096-token window; on hosted providers it is a no-op. + const profile = resolveProfile(getDefaultChatProviderType()); const messages = contentType === EpisodeTypeEnum.DOCUMENT - ? normalizeDocumentPrompt(context) - : normalizePrompt(context); + ? normalizeDocumentPrompt(context, profile) + : normalizePrompt(context, profile); // Normalization is LOW complexity (text cleaning and standardization) let responseText = ""; await makeModelCall( From bee8d3ca4546df46d2bd2f2632646ee0826da808 Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Fri, 7 Aug 2026 00:10:59 +0200 Subject: [PATCH 07/13] fix(model): key Ollama detection and output caps off the resolved model Three defects in the same layer, all variations on "the code guessed which provider it was talking to instead of asking". 1. Prompt-profile selection read the global CHAT_PROVIDER env var while provider options read the resolved model, so the two layers could disagree. getModelForUseCase supports per-workspace and per-use-case overrides, so a workspace can resolve to an Ollama model while the env var says otherwise. That call then got the hosted profile: no caps, no assertion, and the silent 4096-token truncation straight back. Adds isOllamaModel() as the single source of truth and resolveProfileForCall(), which resolves the profile through the same path the call itself uses. It takes useCase deliberately: a pending routing change excludes conversation-normalization from Ollama while keeping other use-cases on it, and reading the per-call resolved provider means that lands correctly here with no further edits. 2. structuredCallWithTolerantParsing never received Ollama provider options at all, so num_ctx never reached the heaviest prompts in the system -- the six fact/statement-extraction calls and label extraction all run through it. They inherited Ollama's silent 4096 default, which is the exact bug the original fix was for. Wires provider options and maxOutputTokens into both the primary call and the repair retry; an unbounded retry truncates just as silently as an unbounded first attempt. 3. num_predict was defaulted to 512 for every Ollama call, which silently hard-capped eight call sites that never had an output limit before (title generation x2, description update, session compaction, graph resolution x2, integration operations, recurrence). The fix meant to remove a silent truncation introduced a new one. num_predict is now opt-in: emitted only when the caller actually asks for a cap. num_ctx stays unconditional because it is the VRAM-safety pin. "No cap requested" now means "no cap applied", and OLLAMA_NUM_PREDICT_DEFAULT goes back to being the documented reserve that budget arithmetic subtracts, not a ceiling applied behind the caller's back. --- apps/webapp/app/lib/model.server.ts | 91 ++++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 14 deletions(-) diff --git a/apps/webapp/app/lib/model.server.ts b/apps/webapp/app/lib/model.server.ts index 432f122e..ae9377b5 100644 --- a/apps/webapp/app/lib/model.server.ts +++ b/apps/webapp/app/lib/model.server.ts @@ -15,10 +15,11 @@ import { recordTokenUsage, type TokenUsageSource, } from "~/services/tokenUsage.server"; +import { OLLAMA_NUM_CTX } from "~/services/prompts/promptBudget"; import { - OLLAMA_NUM_CTX, - OLLAMA_NUM_PREDICT_DEFAULT, -} from "~/services/prompts/promptBudget"; + resolveProfile, + type PromptProfile, +} from "~/services/prompts/normalizeProfile"; import { createOllama } from "ollama-ai-provider-v2"; import { createAzure } from "@ai-sdk/azure"; @@ -250,15 +251,28 @@ function buildOpenAIProviderOptions( */ type ProviderOptionsMap = Record; +/** + * Whether a call against this model string will actually be served by Ollama. + * + * Single source of truth. Three layers used to re-derive this independently + * (provider options, tolerant parsing, prompt profile selection) and disagreed + * with each other, which let a call take the Ollama transport while the prompt + * builder believed it was talking to a hosted model — no caps, no assertion, + * and the silent 4096-token truncation straight back. + * + * The env clause is deliberate and must stay: getModel() routes everything to + * Ollama when CHAT_PROVIDER=ollama regardless of the model string, so the + * predicate has to mirror real routing rather than the string alone. + */ +export function isOllamaModel(model: string): boolean { + return getProvider(model) === "ollama" || getDefaultChatProviderType() === "ollama"; +} + function buildOllamaProviderOptions( model: string, options?: ModelCallOptions, ): ProviderOptionsMap | undefined { - const provider = getProvider(model); - const isOllama = - provider === "ollama" || getDefaultChatProviderType() === "ollama"; - - if (!isOllama) { + if (!isOllamaModel(model)) { return undefined; } @@ -267,15 +281,50 @@ function buildOllamaProviderOptions( // AI SDK v6 maps maxOutputTokens to max_output_tokens here, but Ollama /api/chat // ignores that field. providerOptions.ollama.options.num_predict is the channel // Ollama actually honors, so do not "simplify" this away. + // + // num_predict is opt-in: it is emitted only when the caller actually asked + // for a cap. Defaulting it silently hard-capped eight call sites that never + // had an output limit before (title generation, description update, session + // compaction, graph resolution, integration operations, recurrence) — a new + // silent truncation introduced by the very fix meant to remove one. "No cap + // requested" must mean "no cap applied". OLLAMA_NUM_PREDICT_DEFAULT remains + // the documented reserve that prompt-budget arithmetic subtracts from the + // window, not a ceiling applied behind the caller's back. ollama: { options: { num_ctx: OLLAMA_NUM_CTX, - num_predict: options?.maxTokens ?? OLLAMA_NUM_PREDICT_DEFAULT, + ...(options?.maxTokens !== undefined && { + num_predict: options.maxTokens, + }), }, }, }; } +/** + * Resolve the prompt profile for a specific call. + * + * Prompts must be built before the model call, so the caller needs to know the + * provider up front. This resolves it through the same path the call itself + * will use (resolveModelForWorkspace), rather than reading the global + * CHAT_PROVIDER env var — which ignores the per-workspace and per-use-case + * overrides getModelForUseCase supports, and so could hand the uncapped hosted + * profile to a call that actually lands on Ollama. + * + * Taking `useCase` is deliberate rather than incidental: a pending routing + * change excludes conversation-normalization from Ollama while keeping other + * use-cases on it. Because this reads the per-call resolved provider, that + * change produces the correct profile here with no further edits. + */ +export async function resolveProfileForCall( + workspaceId: string | null | undefined, + useCase: UseCase = "chat", + complexity: ModelComplexity = "medium", +): Promise { + const { modelId } = await resolveModelForWorkspace(workspaceId, useCase, complexity); + return resolveProfile(isOllamaModel(modelId) ? "ollama" : "hosted"); +} + function mergeProviderOptions( ...providerOptions: Array ): ProviderOptionsMap | undefined { @@ -556,9 +605,8 @@ function needsTolerantParsing(model: string, workspaceBaseUrl?: string): boolean // Per-workspace openai BYOK with a baseUrl is by definition a third-party // proxy (CLIProxyAPI, Vercel AI Gateway, etc.) — always tolerant. const isWorkspaceProxy = provider === "openai" && !!workspaceBaseUrl; - const isOllama = provider === "ollama" || getDefaultChatProviderType() === "ollama"; const isOpenRouter = provider === "openrouter"; - return isServerProxyChatMode || isWorkspaceProxy || isOllama || isOpenRouter; + return isServerProxyChatMode || isWorkspaceProxy || isOllamaModel(model) || isOpenRouter; } export async function makeStructuredModelCall( @@ -570,6 +618,7 @@ export async function makeStructuredModelCall( workspaceId?: string, useCase: UseCase = "chat", userId?: string | null, + maxTokens?: number, ): Promise<{ object: z.infer; usage: TokenUsage | undefined }> { const { modelId: model, apiKey, baseUrl } = await resolveModelForWorkspace(workspaceId, useCase, complexity); logger.info(`[Structured/${useCase}/${complexity}] model: ${model}`); @@ -620,6 +669,7 @@ export async function makeStructuredModelCall( temperature, apiKey, baseUrl, + maxTokens, ); const tokenUsage = toTokenUsage(usage); logTokenUsage(`Structured/${complexity.toUpperCase()}`, model, tokenUsage); @@ -739,6 +789,7 @@ async function structuredCallWithTolerantParsing( temperature?: number, apiKey?: string, baseUrl?: string, + maxTokens?: number, ): Promise<{ object: z.infer; usage: any }> { const schemaHint = schemaInstruction(schema); // Claude (via subscription proxies) is more likely than GPT to respond with @@ -760,9 +811,18 @@ async function structuredCallWithTolerantParsing( const agentOpts = apiKey ? { apiKey, ...(baseUrl && { baseUrl }) } : undefined; const agent = createAgent(modelString, jsonPreamble, undefined, agentOpts); - const textResult = await agent.generate(messages as any, { + // This path had no Ollama provider options at all, so num_ctx never reached + // the heaviest prompts in the system — the six fact/statement-extraction + // calls and label extraction all run through here. Without it they inherited + // Ollama's silent 4096 default, which is the exact bug the fix was for. + const ollamaOptions = buildOllamaProviderOptions(modelString, { maxTokens }); + const callOptions = { ...(temperature !== undefined && { temperature }), - } as any); + ...(maxTokens !== undefined && { maxOutputTokens: maxTokens }), + ...(ollamaOptions && { providerOptions: ollamaOptions }), + }; + + const textResult = await agent.generate(messages as any, callOptions as any); const parsed = tryParseJsonFromText(textResult.text); const validated = parsed ? schema.safeParse(parsed) : undefined; @@ -784,9 +844,12 @@ async function structuredCallWithTolerantParsing( agentOpts, ); + // The repair call needs the same bounds as the first. It is the retry path, + // and an unbounded retry against a 4096-token window truncates silently in + // exactly the way the original call would have. const repairResult = await repairAgent.generate( [{ role: "user", content: textResult.text }] as any, - { temperature: 0 } as any, + { ...callOptions, temperature: 0 } as any, ); const repairedParsed = tryParseJsonFromText(repairResult.text); From 988431a322fc82bef722aac62f8400d297e47d7f Mon Sep 17 00:00:00 2001 From: Klaus Agnoletti Date: Fri, 7 Aug 2026 00:11:10 +0200 Subject: [PATCH 08/13] fix(prompts,labels): honour the declared output reserve and bound the label list Three follow-ups to the prompt-bounding work, found by a cross-vendor audit. normalizeProfile.ts declared NORMALIZE_OUTPUT_TOKEN_RESERVE = 768 with a comment explaining why 512 is too tight for document-sized output, but the normalization call site passed undefined for options and silently fell back to a different default. The budget arithmetic was therefore describing a reserve that was never actually applied. The call site now passes the declared value, so the documented arithmetic and the runtime agree. Both prompt-building call sites now resolve their profile with resolveProfileForCall against the model that call actually resolves to, rather than the global CHAT_PROVIDER env var. The existing-labels list was the one injection that grows on its own: this job creates labels, so each run can enlarge the next run's prompt, and the only guard was an unenforced 400-token claim in a docstring. Measured on Ollama it threw at roughly 29 labels with session context. Unbounded growth against a fail-loud assertion does not degrade, it starts failing the job outright once a workspace accumulates enough labels. The list is now dropped from the tail to fit its budget, keeping the most recently created labels -- the ones most likely to match the current episode -- and logs when it truncates. entityTypes moves from capped to asserted. It is derived from an enum in code rather than from user data, so a request cannot grow it, but silently trimming the entity taxonomy would quietly degrade every downstream extraction with no visible symptom. Failing loudly means a developer who grows the enum past the budget finds out in CI rather than through slow quality decay in production. --- .../app/jobs/labels/label-assignment.logic.ts | 65 +++++++++++++++---- .../app/services/knowledgeGraph.server.ts | 17 +++-- .../__tests__/normalizeProfile.test.ts | 11 +++- .../app/services/prompts/normalizeProfile.ts | 15 ++++- 4 files changed, 90 insertions(+), 18 deletions(-) diff --git a/apps/webapp/app/jobs/labels/label-assignment.logic.ts b/apps/webapp/app/jobs/labels/label-assignment.logic.ts index b62a26ce..16d7cf2e 100644 --- a/apps/webapp/app/jobs/labels/label-assignment.logic.ts +++ b/apps/webapp/app/jobs/labels/label-assignment.logic.ts @@ -6,7 +6,7 @@ */ import { z } from "zod"; -import { makeStructuredModelCall, getEmbedding } from "~/lib/model.server"; +import { makeStructuredModelCall, getEmbedding , resolveProfileForCall } from "~/lib/model.server"; import { logger } from "~/services/logger.service"; import { prisma } from "~/db.server"; import { LabelService } from "~/services/label.server"; @@ -21,10 +21,8 @@ import { capToTokenBudget, } from "~/services/prompts/promptBudget"; import { - resolveProfile, type PromptProfile, } from "~/services/prompts/normalizeProfile"; -import { getDefaultChatProviderType } from "~/services/llm-provider.server"; const MAX_CONTENT_TOKENS = 20000; @@ -52,6 +50,19 @@ export const LABEL_PROMPT_TOKEN_BUDGET = Math.min( ); export const LABEL_CONTENT_TOKEN_BUDGET_OLLAMA = 2400; +/** + * Budget for the existing-labels list. + * + * Previously this was an unenforced claim in a docstring while the list itself + * rendered every workspace label. Since this job creates labels, the list only + * grows, so the unenforced version fails progressively: measured on Ollama it + * threw at ~29 labels with session context (134 without). The hosted budget is + * generous because hosted windows are not the constraint; it exists so the list + * cannot grow without any bound at all. + */ +export const LABEL_LIST_TOKEN_BUDGET_OLLAMA = 400; +export const LABEL_LIST_TOKEN_BUDGET_HOSTED = 4000; + // Similarity threshold for matching labels (higher = stricter matching) const LABEL_SIMILARITY_THRESHOLD = 0.85; @@ -335,11 +346,16 @@ export async function extractLabelsFromEpisode( workspaceId: string, sessionContext?: string, ): Promise { + // Resolved from the model this call actually resolves to, not the global env + // var: a workspace override can land on Ollama while CHAT_PROVIDER says + // otherwise, which would silently select the uncapped hosted profile. + const profile = await resolveProfileForCall(workspaceId, "memory", "medium"); + const messages = buildLabelExtractionMessages( episodeBody, availableLabels, sessionContext, - resolveProfile(getDefaultChatProviderType()), + profile, ); logger.info("Extracting labels from episode", { @@ -356,6 +372,8 @@ export async function extractLabelsFromEpisode( 0.3, // Low temperature for consistent label extraction workspaceId, "memory", + undefined, + profile === "ollama" ? LABEL_OUTPUT_TOKEN_RESERVE : undefined, ); // Create lookup map for existing labels (case-insensitive) for exact matching @@ -471,6 +489,8 @@ export function buildLabelExtractionMessages( // has to shrink to something that actually fits the window. const contentBudget = profile === "ollama" ? LABEL_CONTENT_TOKEN_BUDGET_OLLAMA : MAX_CONTENT_TOKENS; + const labelListBudget = + profile === "ollama" ? LABEL_LIST_TOKEN_BUDGET_OLLAMA : LABEL_LIST_TOKEN_BUDGET_HOSTED; // Token-aware truncation: prioritise current episode, fill remainder with session context const episodeTokens = countTokens(episodeBody); @@ -501,15 +521,38 @@ export function buildLabelExtractionMessages( } } + // The label list is the one injection that grows on its own: this job creates + // labels, so every run can enlarge the next run's prompt. Left unbounded it + // does not degrade, it hits the assertion and the job starts failing outright + // once a workspace accumulates enough labels. Measured breaking point on + // Ollama was ~29 labels with session context. + // + // Labels are rendered newest-first and dropped from the tail, so the prompt + // keeps the most recently created labels — the ones most likely to match the + // current episode — and degrades to a shorter list instead of throwing. + const renderLabel = (l: { name: string; description: string | null }) => + `