Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/aleafwolf_zr-chatbot-be.json
T

1 line
107 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"repo": "aleafwolf/zr-chatbot-be", "files": {".env.example": {"9ac39581c9ef7609b408a2c40ade22cd3a2fecc4": {"t": 1785746610.5267334, "n": 7056, "h": "453b2766a77e1e91", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# ⚠️ Requires ROLEPLAY_GRAPH_STREAM_ENABLED=true to take effect — the director\n# node lives only in the pre-generation graph; the direct stream path has no\n# director stage. When RESPONSE_DIRECTOR_ENABLED=true but the graph flag is off,\n# the director silently no-ops (a startup warning is emitted).\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# TG5 adds character digest consistency + selective conditional firing — the first\n# plausible reason to set RESPONSE_DIRECTOR_MODEL=deepseek:deepseek-v4-pro.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\n# TG6: CSV of blocks to slim when the director provides a concrete directive.\n# Valid tokens: emotional_render, format_resistance, canon_correction, temporal_premise.\n# Recommended rollout: emotional_render first (unconditional counterpart),\n# then the two conditionals after fired-flag traces look sane.\n# Default empty string = no slimming (R1/R8 style rules retained in intimate scenes).\nRESPONSE_DIRECTOR_SLIM_BLOCKS=\"\"\n# TG3: Per-step deadline in ms (default 15000, range 1000–60000).\n# When exceeded, the director is aborted and the turn proceeds without a\n# [DIRECTOR NOTE] block (fail-open). Set above typical director latency so\n# it only trims pathological tails.\n# RESPONSE_DIRECTOR_DEADLINE_MS=15000\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n# Adds compact five-sense writing guidance on intimate turns. Defaults OFF.\nINTIMATE_SENSORY_GUIDANCE_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "b6e891bd44485082d23cab5269fe41235bd2de6c": {"t": 1785766271.6080015, "n": 7056, "h": "453b2766a77e1e91", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# ⚠️ Requires ROLEPLAY_GRAPH_STREAM_ENABLED=true to take effect — the director\n# node lives only in the pre-generation graph; the direct stream path has no\n# director stage. When RESPONSE_DIRECTOR_ENABLED=true but the graph flag is off,\n# the director silently no-ops (a startup warning is emitted).\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# TG5 adds character digest consistency + selective conditional firing — the first\n# plausible reason to set RESPONSE_DIRECTOR_MODEL=deepseek:deepseek-v4-pro.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\n# TG6: CSV of blocks to slim when the director provides a concrete directive.\n# Valid tokens: emotional_render, format_resistance, canon_correction, temporal_premise.\n# Recommended rollout: emotional_render first (unconditional counterpart),\n# then the two conditionals after fired-flag traces look sane.\n# Default empty string = no slimming (R1/R8 style rules retained in intimate scenes).\nRESPONSE_DIRECTOR_SLIM_BLOCKS=\"\"\n# TG3: Per-step deadline in ms (default 15000, range 1000–60000).\n# When exceeded, the director is aborted and the turn proceeds without a\n# [DIRECTOR NOTE] block (fail-open). Set above typical director latency so\n# it only trims pathological tails.\n# RESPONSE_DIRECTOR_DEADLINE_MS=15000\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n# Adds compact five-sense writing guidance on intimate turns. Defaults OFF.\nINTIMATE_SENSORY_GUIDANCE_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "c3d97668286fb2562ad5f2b0ca0d149fd4c7211a": {"t": 1785766273.874763, "n": 6940, "h": "0b8a24d7d39c8358", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# ⚠️ Requires ROLEPLAY_GRAPH_STREAM_ENABLED=true to take effect — the director\n# node lives only in the pre-generation graph; the direct stream path has no\n# director stage. When RESPONSE_DIRECTOR_ENABLED=true but the graph flag is off,\n# the director silently no-ops (a startup warning is emitted).\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# TG5 adds character digest consistency + selective conditional firing — the first\n# plausible reason to set RESPONSE_DIRECTOR_MODEL=deepseek:deepseek-v4-pro.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\n# TG6: CSV of blocks to slim when the director provides a concrete directive.\n# Valid tokens: emotional_render, format_resistance, canon_correction, temporal_premise.\n# Recommended rollout: emotional_render first (unconditional counterpart),\n# then the two conditionals after fired-flag traces look sane.\n# Default empty string = no slimming (R1/R8 style rules retained in intimate scenes).\nRESPONSE_DIRECTOR_SLIM_BLOCKS=\"\"\n# TG3: Per-step deadline in ms (default 15000, range 1000–60000).\n# When exceeded, the director is aborted and the turn proceeds without a\n# [DIRECTOR NOTE] block (fail-open). Set above typical director latency so\n# it only trims pathological tails.\n# RESPONSE_DIRECTOR_DEADLINE_MS=15000\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "d4db4a76847d681c2de96e59c7dc14f32a324f26": {"t": 1785766275.3207898, "n": 6908, "h": "0f38fa5e0f14583d", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# ⚠️ Requires ROLEPLAY_GRAPH_STREAM_ENABLED=true to take effect — the director\n# node lives only in the pre-generation graph; the direct stream path has no\n# director stage. When RESPONSE_DIRECTOR_ENABLED=true but the graph flag is off,\n# the director silently no-ops (a startup warning is emitted).\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# TG5 adds character digest consistency + selective conditional firing — the first\n# plausible reason to set RESPONSE_DIRECTOR_MODEL=deepseek:deepseek-v4-pro.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\n# TG6: CSV of blocks to slim when the director provides a concrete directive.\n# Valid tokens: emotional_render, format_resistance, canon_correction, temporal_premise.\n# Recommended rollout: emotional_render first (unconditional counterpart),\n# then the two conditionals after fired-flag traces look sane.\n# Default empty string = no slimming.\n# RESPONSE_DIRECTOR_SLIM_BLOCKS=emotional_render\n# TG3: Per-step deadline in ms (default 15000, range 1000–60000).\n# When exceeded, the director is aborted and the turn proceeds without a\n# [DIRECTOR NOTE] block (fail-open). Set above typical director latency so\n# it only trims pathological tails.\n# RESPONSE_DIRECTOR_DEADLINE_MS=15000\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "ba151d1cb6712291ac0dcb657daf862f0ba23844": {"t": 1785766276.948408, "n": 6319, "h": "78693cdd11a9e780", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# TG5 adds character digest consistency + selective conditional firing — the first\n# plausible reason to set RESPONSE_DIRECTOR_MODEL=deepseek:deepseek-v4-pro.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\n# TG6: CSV of blocks to slim when the director provides a concrete directive.\n# Valid tokens: emotional_render, format_resistance, canon_correction, temporal_premise.\n# Recommended rollout: emotional_render first (unconditional counterpart),\n# then the two conditionals after fired-flag traces look sane.\n# Default empty string = no slimming.\n# RESPONSE_DIRECTOR_SLIM_BLOCKS=emotional_render\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "29637be597ad393d71a2d2f8f026774184f720f1": {"t": 1785766278.3857355, "n": 6301, "h": "f1909fd318800889", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# TG5 adds character digest consistency + selective conditional firing — the first\n# plausible reason to set RESPONSE_DIRECTOR_MODEL=deepseek:deepseek-v4-pro.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\n# TG6: CSV of blocks to slim when the director provides a concrete directive.\n# Valid tokens: emotional_render, format_resistance, canon_correction.\n# Recommended rollout: emotional_render first (unconditional counterpart),\n# then the two conditionals after fired-flag traces look sane.\n# Default empty string = no slimming.\n# RESPONSE_DIRECTOR_SLIM_BLOCKS=emotional_render\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "d939bf556aef1a9da606acaedd561bad2eeedc01": {"t": 1785766279.8456664, "n": 5927, "h": "dbbec79f3bd1b068", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# TG5 adds character digest consistency + selective conditional firing — the first\n# plausible reason to set RESPONSE_DIRECTOR_MODEL=deepseek:deepseek-v4-pro.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "ac56d57d52b1f056abf34e9cef04078b66b652e0": {"t": 1785766281.3466914, "n": 5768, "h": "77fea70bba5e3264", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\n# Response Director: per-turn brief that produces a [DIRECTOR NOTE] block.\n# RESPONSE_DIRECTOR_ENABLED=false\n# Defaults to EXTRACTOR_MODEL (flash); override to a pro model via env only.\n# RESPONSE_DIRECTOR_MODEL=EXTRACTOR_MODEL\n# RESPONSE_DIRECTOR_FALLBACK_MODEL=\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "7760bca94405ebbb0db40b3f6c4906b324a418ff": {"t": 1785766282.6672351, "n": 5504, "h": "5664656518f3c8d9", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# Emotional Engine\n# Session-local emotional-axis engine (axis baselines, drift, couplings). When enabled,\n# advances character state after each turn and persists axis state, traces, and band\n# history in session_state. Defaults OFF.\n# REQUIRED (=true) for the emotional-axis eval to capture update-side snapshots — with the\n# engine off, agent_turn rows produce empty emotionalAxis snapshots.\nEMOTIONAL_ENGINE_ENABLED=false\n# Injects an axis-band behavior-grammar block into the prompt based on engine state.\n# Requires EMOTIONAL_ENGINE_ENABLED=true. Defaults OFF. Set =true for the render-side\n# emotional-axis eval (render snapshots / render_* assertions).\nEMOTIONAL_RENDER_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n# Dedicated dataset for the emotional-axis scenario set (npm run eval:emotional-axis:push).\n# Defaults to `emotional-axis-${LANGSMITH_EVAL_DATASET}`.\n# NOTE: the experiment runner reads LANGSMITH_EVAL_DATASET, NOT this var — to run\n# `eval:emotional-axis:langsmith`, point LANGSMITH_EVAL_DATASET at this dataset for the run.\n# LANGSMITH_EMOTIONAL_AXIS_EVAL_DATASET=emotional-axis-zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "b18decb2619a2b45d135704ec54e6af64fb9dde8": {"t": 1785766284.2429974, "n": 4413, "h": "f7e7583f43a0b694", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=deepseek:deepseek-v4-pro\nEXTRACTOR_MODEL=deepseek:deepseek-v4-flash\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-v4-pro\nVALIDATOR_ATTRIBUTION_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nCLASSIFY_TURN_ROUTE_FALLBACK_MODEL=openai:gpt-5-nano\nQUERY_REWRITE_FALLBACK_MODEL=openai:gpt-5-nano\nRECALL_THOUGHT_FALLBACK_MODEL=openai:gpt-5-nano\nRESPONSE_VALIDATOR_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_DEDUP_JUDGE_FALLBACK_MODEL=openai:gpt-5-mini\nPOST_TURN_EXTRACTOR_FALLBACK_MODEL=openai:gpt-5-mini # Also drives session-summary-merger fallover\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=deepseek:deepseek-v4-pro\nSTRUCTMEM_CONSOLIDATION_FALLBACK_MODEL=openai:gpt-5-mini\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=deepseek:deepseek-v4-flash\nMEMORY_RERANK_FALLBACK_MODEL=openai:gpt-5-mini\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\nSTRUCTMEM_CROSS_SESSION_DISTILLATION_FALLBACK_MODEL=openai:gpt-5-mini\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "3efbdd4d9f2707db08affe4d02aa729b9ea74ab1": {"t": 1785766285.470413, "n": 3857, "h": "590a84430de212d0", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=EXTRACTOR_MODEL\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# Roleplay Graph Stream\n# When true, roleplay turns use the graph-backed stream adapter\n# (disabled by default -- the existing direct stream path remains the default).\nROLEPLAY_GRAPH_STREAM_ENABLED=false\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "10960cacef59922cb8c8751eb29b9e940350c9e9": {"t": 1785766286.93365, "n": 3652, "h": "3187820879571798", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only or every_generation (default).\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=EXTRACTOR_MODEL\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "0a09ac849bc01a71075db714d48e4910d5e0417e": {"t": 1785766288.6021173, "n": 3652, "h": "cfb0f53e063e115e", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\n\n# DeepSeek V4 Thinking Marker\n# Generation-only thinking-mode marker for deepseek:deepseek-v4-pro.\n# Allowed values: default, inner_os, no_inner_os. Set to inner_os or no_inner_os to enable.\nDEEPSEEK_V4_THINKING_MODE=default\n# When false, native DeepSeek reasoning thoughts are hidden from the user.\nSHOW_NATIVE_REASONING_EVENTS=false\n# Marker injection scope: first_turn_only (default) or every_generation.\n# Use every_generation if first-turn-only effect diminishes after several turns.\n# DEEPSEEK_V4_THINKING_MARKER_SCOPE=every_generation\n\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=EXTRACTOR_MODEL\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "f311d219b2e8bed22b18ba6e49ceb391f687e512": {"t": 1785766290.3373287, "n": 3108, "h": "8bd2f194bc0fedc9", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Memory Rerank\n# Model binding for the LLM that judges which retrieved context to inject.\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nMEMORY_RERANK_MODEL=EXTRACTOR_MODEL\nMEMORY_RERANK_MAX_CANDIDATES=24\nMEMORY_RERANK_MAX_SELECTED=8\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "84ac18fb0df50eff77af766013096b2457ecb14d": {"t": 1785766291.8011494, "n": 3286, "h": "ce70557d7bcc034a", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\nDEFAULT_SESSION_THINKING=true\nDEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\nCANON_RETRIEVAL_PIPELINE=tier3\nCANON_QUERY_HYDE=0\nUSE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\nANNOTATION_RULES_ALWAYS=0\nREWRITE_CONFIDENCE_THRESHOLD=0.6\nVALIDATOR_STRICT_ATTRIBUTION=0\nVALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\nCANON_LOOKUP_TOOL_ENABLED=1\nEVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\nSTRUCTMEM_MOTIF_PROBE_ENABLED=false\nSTRUCTMEM_MOTIF_PROBE_TOP_K=3\nSTRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\nSTRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Context Retrieval Mode\n# \"eager\" = current behavior (all sources always retrieved).\n# \"hybrid_lazy\" = defer heavy retrievals, gate prompt blocks on context need.\nCONTEXT_RETRIEVAL_MODE=hybrid_lazy\nHYBRID_LAZY_ALLOW_EMERGENCY_CANON_LOOKUP=true\n\n# Hybrid Lazy Lookup Tools\n# Generation-time lookup tools (lookup_structmem, etc.) gated behind this flag.\nGENERATION_LOOKUP_TOOLS_ENABLED=true\nGENERATION_LOOKUP_MAX_STEPS=1\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\nPOST_TURN_JOB_POLL_INTERVAL_MS=5000\nPOST_TURN_JOB_LOCK_TTL_MS=600000\nPOST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "5295d1cd8d70f10653e3a44997200b3e798fdc6d": {"t": 1785766293.1618335, "n": 3325, "h": "6038d635ad97e485", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# DEFAULT_SESSION_THINKING=true\n# DEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\n# CANON_RETRIEVAL_PIPELINE=tier3\n# CANON_QUERY_HYDE=0\n# USE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\n# ANNOTATION_RULES_ALWAYS=0\n# REWRITE_CONFIDENCE_THRESHOLD=0.6\n# VALIDATOR_STRICT_ATTRIBUTION=0\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n# CANON_LOOKUP_TOOL_ENABLED=1\n# EVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\n# STRUCTMEM_MOTIF_PROBE_ENABLED=false\n# STRUCTMEM_MOTIF_PROBE_TOP_K=3\n# STRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\n# STRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Context Retrieval Mode\n# \"eager\" = current behavior (all sources always retrieved).\n# \"hybrid_lazy\" = defer heavy retrievals, gate prompt blocks on context need.\n# CONTEXT_RETRIEVAL_MODE=eager\n# HYBRID_LAZY_ALLOW_EMERGENCY_CANON_LOOKUP=true\n\n# Hybrid Lazy Lookup Tools\n# Generation-time lookup tools (lookup_structmem, etc.) gated behind this flag.\n# GENERATION_LOOKUP_TOOLS_ENABLED=false\n# GENERATION_LOOKUP_MAX_STEPS=1\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\n# POST_TURN_JOB_POLL_INTERVAL_MS=5000\n# POST_TURN_JOB_LOCK_TTL_MS=600000\n# POST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "96822875d00c8efcbf9ba3eb3c746d17c3f6e15a": {"t": 1785766294.7394137, "n": 2901, "h": "cfc54280b3268039", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# DEFAULT_SESSION_THINKING=true\n# DEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\n# CANON_RETRIEVAL_PIPELINE=tier3\n# CANON_QUERY_HYDE=0\n# USE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\n# ANNOTATION_RULES_ALWAYS=0\n# REWRITE_CONFIDENCE_THRESHOLD=0.6\n# VALIDATOR_STRICT_ATTRIBUTION=0\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n# CANON_LOOKUP_TOOL_ENABLED=1\n# EVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# StructMem: Motif Probe\n# Deterministic repeated-relationship-gesture detection and optional StructMem probe.\n# STRUCTMEM_MOTIF_PROBE_ENABLED=false\n# STRUCTMEM_MOTIF_PROBE_TOP_K=3\n# STRUCTMEM_MOTIF_PROBE_MIN_SCORE=0.5\n# STRUCTMEM_MOTIF_INJECT_MODE=synthesis_only\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\n# POST_TURN_JOB_POLL_INTERVAL_MS=5000\n# POST_TURN_JOB_LOCK_TTL_MS=600000\n# POST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "40833319f4a2aa5213e1ee4989006799e5d3b667": {"t": 1785766296.0185773, "n": 2636, "h": "3be9fee07b44b1d2", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# DEFAULT_SESSION_THINKING=true\n# DEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\n# CANON_RETRIEVAL_PIPELINE=tier3\n# CANON_QUERY_HYDE=0\n# USE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\n# ANNOTATION_RULES_ALWAYS=0\n# REWRITE_CONFIDENCE_THRESHOLD=0.6\n# VALIDATOR_STRICT_ATTRIBUTION=0\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n# CANON_LOOKUP_TOOL_ENABLED=1\n# EVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\n# POST_TURN_JOB_POLL_INTERVAL_MS=5000\n# POST_TURN_JOB_LOCK_TTL_MS=600000\n# POST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n\n# Trace metadata (attached to every LangSmith run)\nTRACE_ENVIRONMENT=development\nAPP_VERSION=dev\nGIT_SHA=unknown\nTRACE_PLAYER_HASH_SALT=zuoran-local-trace-salt\n"}, "569986db5af9c1fa7749cf279c8ca390c2f111de": {"t": 1785766297.7609828, "n": 2475, "h": "307b8118f85b3426", "c": "# Database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App Defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# DEFAULT_SESSION_THINKING=true\n# DEFAULT_SESSION_TEMPERATURE=1\n\n# Provider Keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n# TAVILY_API_KEY=tvly-...\n\n# Model Bindings\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Retrieval And Validation\n# Optional override knobs. Leave commented to use the defaults in src/config/env.ts.\n# Enable only when tuning retrieval, debugging rewrites, or running eval/validator experiments.\n# CANON_RETRIEVAL_PIPELINE=tier3\n# CANON_QUERY_HYDE=0\n# USE_REWRITTEN_QUERY_FOR_MEMORY_EMBEDDING=0\n# ANNOTATION_RULES_ALWAYS=0\n# REWRITE_CONFIDENCE_THRESHOLD=0.6\n# VALIDATOR_STRICT_ATTRIBUTION=0\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n# CANON_LOOKUP_TOOL_ENABLED=1\n# EVAL_ENABLE_LLM_JUDGE=0\n\n# StructMem: Events And Entries\nSTRUCTMEM_ENABLED=true\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem: Current-Session Consolidation\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\n# Use EXTRACTOR_MODEL to reuse the extractor binding.\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# StructMem: Cross-Session Retrieval And Writeback\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_RETRIEVAL_TOP_K=4\nSTRUCTMEM_CROSS_SESSION_WRITE_ENABLED=false\nSTRUCTMEM_PROMOTION_TO_IME_ENABLED=false\nSTRUCTMEM_CROSS_SESSION_MIN_CONFIDENCE=0.75\n\n# Background Jobs\n# Optional post-turn worker tuning. Leave commented to use env.ts defaults.\n# Controls polling frequency, worker lock TTL, and failed-job retry count.\n# POST_TURN_JOB_POLL_INTERVAL_MS=5000\n# POST_TURN_JOB_LOCK_TTL_MS=600000\n# POST_TURN_JOB_MAX_ATTEMPTS=3\n\n# LangSmith\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n# LANGSMITH_EVAL_DATASET=zuoran-phase1-eval\n"}, "38bc9f8516186626e40546e9fef6793ddb8e4fac": {"t": 1785766299.1286354, "n": 2216, "h": "f8dc685092473b6f", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# StructMem Phase 1/2.\nSTRUCTMEM_ENABLED=true\n# When StructMem is on, skip duplicate extractor rows in session_memory_chunks (raw turn pairs unchanged).\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\n# When StructMem is on, persist structmem_entries from the extractor JSON instead of mapping memory_candidates (Phase 2).\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# Top-K semantic hits for structmem_entries (same recent-window cutoff as session recall).\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# StructMem Phase 3 current-session consolidation.\nSTRUCTMEM_CONSOLIDATION_ENABLED=false\nSTRUCTMEM_CONSOLIDATION_MODEL=EXTRACTOR_MODEL\nSTRUCTMEM_MIN_UNCONSOLIDATED_TURNS=8\nSTRUCTMEM_MIN_UNCONSOLIDATED_ENTRIES=12\nSTRUCTMEM_SEED_K=5\nSTRUCTMEM_MAX_SEED_EVENTS=5\nSTRUCTMEM_MAX_ENTRIES_PER_EVENT=6\nSTRUCTMEM_MAX_BUFFER_ENTRIES=20\nSTRUCTMEM_MAX_SYNTHESIS_INPUT_TOKENS=5000\nSTRUCTMEM_JOB_MAX_ATTEMPTS=3\n\n# canon_lookup tool (default on; set 0/false/off to disable).\n# CANON_LOOKUP_TOOL_ENABLED=1\n\n# Optional: require LLM attribution judge + stronger rewrite path (default off).\n# VALIDATOR_STRICT_ATTRIBUTION=0\n\n# Optional: model for attribution judge (defaults to EXTRACTOR_MODEL).\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# Optional: default reasoning on for new sessions when POST body omits `thinking`.\n# DEFAULT_SESSION_THINKING=false\n"}, "d14e59b3227a663717db4743525f282786a8d672": {"t": 1785766300.5944521, "n": 1819, "h": "228679231fef7553", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# StructMem Phase 1/2.\nSTRUCTMEM_ENABLED=true\n# When StructMem is on, skip duplicate extractor rows in session_memory_chunks (raw turn pairs unchanged).\nSTRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=true\n# When StructMem is on, persist structmem_entries from the extractor JSON instead of mapping memory_candidates (Phase 2).\nSTRUCTMEM_NATIVE_EXTRACTOR=true\n# Top-K semantic hits for structmem_entries (same recent-window cutoff as session recall).\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# canon_lookup tool (default on; set 0/false/off to disable).\n# CANON_LOOKUP_TOOL_ENABLED=1\n\n# Optional: require LLM attribution judge + stronger rewrite path (default off).\n# VALIDATOR_STRICT_ATTRIBUTION=0\n\n# Optional: model for attribution judge (defaults to EXTRACTOR_MODEL).\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# Optional: default reasoning on for new sessions when POST body omits `thinking`.\n# DEFAULT_SESSION_THINKING=false\n"}, "a0ff0772f6a636f9ea38c26f3e7ce38827dbcbf3": {"t": 1785766302.2899776, "n": 1866, "h": "c4dd9a951f9bb759", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# StructMem Phase 1 (default off until migration + rollout).\n# STRUCTMEM_ENABLED=false\n# When StructMem is on, skip duplicate extractor rows in session_memory_chunks (raw turn pairs unchanged).\n# STRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=false\n# When StructMem is on, persist structmem_entries from the extractor JSON instead of mapping memory_candidates (Phase 2).\n# STRUCTMEM_NATIVE_EXTRACTOR=false\n# Top-K semantic hits for structmem_entries (same recent-window cutoff as session recall).\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# canon_lookup tool (default on; set 0/false/off to disable).\n# CANON_LOOKUP_TOOL_ENABLED=1\n\n# Optional: require LLM attribution judge + stronger rewrite path (default off).\n# VALIDATOR_STRICT_ATTRIBUTION=0\n\n# Optional: model for attribution judge (defaults to EXTRACTOR_MODEL).\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# Optional: default reasoning on for new sessions when POST body omits `thinking`.\n# DEFAULT_SESSION_THINKING=false\n"}, "06c93bf838467757e0bc09da5755b40234ee8ee0": {"t": 1785766303.7937436, "n": 1709, "h": "d3fe7b8e1ac9b439", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# StructMem Phase 1 (default off until migration + rollout).\n# STRUCTMEM_ENABLED=false\n# When StructMem is on, skip duplicate extractor rows in session_memory_chunks (raw turn pairs unchanged).\n# STRUCTMEM_SUPPRESS_EXTRACTOR_SESSION_CHUNKS=false\n# Top-K semantic hits for structmem_entries (same recent-window cutoff as session recall).\n# STRUCTMEM_ENTRY_RETRIEVAL_TOP_K=6\n\n# canon_lookup tool (default on; set 0/false/off to disable).\n# CANON_LOOKUP_TOOL_ENABLED=1\n\n# Optional: require LLM attribution judge + stronger rewrite path (default off).\n# VALIDATOR_STRICT_ATTRIBUTION=0\n\n# Optional: model for attribution judge (defaults to EXTRACTOR_MODEL).\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# Optional: default reasoning on for new sessions when POST body omits `thinking`.\n# DEFAULT_SESSION_THINKING=false\n"}, "fd628e7022ce00718bbd8f802a79585d73c1fc90": {"t": 1785766305.175492, "n": 1343, "h": "4bac94daa8ccc952", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# Tier 4: canon_lookup tool (default on; set 0/false/off to disable).\n# CANON_LOOKUP_TOOL_ENABLED=1\n\n# Optional: require LLM attribution judge + stronger rewrite path (default off).\n# VALIDATOR_STRICT_ATTRIBUTION=0\n\n# Optional: model for attribution judge (defaults to EXTRACTOR_MODEL).\n# VALIDATOR_ATTRIBUTION_JUDGE_MODEL=deepseek:deepseek-chat\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# Optional: default reasoning on for new sessions when POST body omits `thinking`.\n# DEFAULT_SESSION_THINKING=false\n"}, "3fddb999234b0f73aa7d8f6607426bf740ceba38": {"t": 1785766306.4408338, "n": 996, "h": "852d6ec40abef295", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n# Optional: default reasoning on for new sessions when POST body omits `thinking`.\n# DEFAULT_SESSION_THINKING=false\n"}, "0a5d5aab4fa7a02ab09d492017edbd06bd62cedd": {"t": 1785766307.8225589, "n": 880, "h": "364f2f0becea931b", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zuo_ran\n"}, "b5c5748d9bb247158ad161fa4c090f2862eded73": {"t": 1785766309.3037474, "n": 880, "h": "7c0b427830092e0f", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Optional web search (Tavily). If unset, the web_search tool reports unavailable.\n# TAVILY_API_KEY=tvly-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zou_ran\n"}, "105c0a564b06386348192da4613eb217fb70a975": {"t": 1785766310.7205431, "n": 770, "h": "6e95f9af6a730410", "c": "# Shared with scene-ingestor/script-extractor — same zuoran database\nDATABASE_URL=postgres://user:pass@localhost:5432/zuoran\n\n# LLM provider keys\nOPENAI_API_KEY=sk-...\nANTHROPIC_API_KEY=sk-ant-...\nDEEPSEEK_API_KEY=sk-...\n\n# Per-task model bindings (provider:model format)\nGENERATION_MODEL=anthropic:claude-sonnet-4-5\nVALIDATOR_MODEL=anthropic:claude-haiku-4-5\nEXTRACTOR_MODEL=deepseek:deepseek-chat\nEMBEDDING_MODEL=openai:text-embedding-3-small\nEMBEDDING_DIMENSIONS=1536\n\n# LangSmith observability\nLANGSMITH_TRACING=true\nLANGSMITH_API_KEY=lsv2_...\nLANGSMITH_PROJECT=zuoran-chatbot-phase1\nLANGSMITH_ENDPOINT=https://api.smith.langchain.com\n\n# Server\nPORT=4000\nFRONTEND_ORIGIN=http://localhost:5173\n\n# App defaults\nDEFAULT_PLAYER_ID=local_dev\nDEFAULT_CHARACTER_ID=zou_ran\n"}}}}