{"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"}}}}