System settings inventory
This reference teaches the kernel-level catch-all behind
system(action="settings", input={}). System owns a genuine adjustable
LingTai setting only when no other concrete ToolPlugin owns it. SHOW returns
exactly key, current, default, configurable, and comment; it never
sets, resets, writes, refreshes, or mutates process environment. A row with
configurable: true says only that an authorized external procedure below
exists. It does not authorize the caller to perform that procedure.
SHOW resolves one complete fresh snapshot. A malformed/unreadable init.json,
active preset, System owner document, or risky-action gate document makes the
whole inventory unavailable—there are no partial rows and
no exception details. Sensitive rows replace both current and default with
<redacted> before JSON serialization.
Root and manifest inputs
The canonical source is the real init.json reader: JSONC parse, active-preset
materialization, provider inheritance, schema validation, and path resolution.
No environment peers are invented for these fields. An active preset replaces
the authored manifest.llm block, but its llm.context_limit remains
preset-local for fit/authorization checks and is removed before effective init
materialization; the System runtime-policy row reports the separate
environment/v2/default result. Psyche owns configurable prompt pairs through
its separate closed owner document; System neither resolves nor projects them.
Derived system/manifest.resolved.json is never authority.
| Key | Default and accepted value | Invalid behavior | Redaction | Application timing |
|---|---|---|---|---|
env_file |
absent; UTF-8 dotenv path | Missing file loads nothing; an invalid init.json path value fails the canonical read |
full | Boot or System refresh; editing the dotenv needs refresh |
venv_path |
absent, so launcher-managed resolution applies; venv-root path | An unusable configured root fails launcher validation | full | Full relaunch only |
agent_name |
null; string or null boot seed |
Wrong type fails init validation | none | Creation/full relaunch only; immutable for an existing identity, so configurable is false |
language |
en; string |
Wrong type fails init validation | none | System refresh |
disable |
[]; list[str] |
A non-list or any non-string entry fails init validation; entries are interpreted by capability composition without coercion or dropping | none | Capability rebuild during System refresh |
admin |
{}; object |
Wrong type fails validation | full authorization map | System refresh |
time_awareness |
true; boolean |
Wrong type fails validation | none | System refresh |
timezone_awareness |
true; boolean |
Wrong type fails validation | none | System refresh |
preset.active / preset.default |
absent outside a preset block; non-empty strings and members of allowed |
Missing/non-string/non-member values fail preset validation | full path/reference | Authorized preset workflow plus System refresh |
preset.allowed |
absent outside a preset block; non-empty list[str] when preset is present |
Empty, non-list, or invalid entries fail preset validation | full path/reference list | Authorized preset workflow plus System refresh |
summarize_notification_threshold |
3000; non-negative integer, 0 disables the threshold hint |
Negative or wrong type fails validation | none | System refresh |
The seven ordinary runtime-policy rows are not init/preset rows. They resolve
from valid LINGTAI_<FIELD> environment values, then a valid closed-v2
settings/system.json field, then the fixed runtime default. Each row's
comment points here directly; the System entry keeps only legacy aliases:
| Key | Fixed default | Accepted environment / v2 value | Application timing |
|---|---|---|---|
context_limit |
272000 conservative service window |
positive integer; v2 also accepts null for no configured limit |
boot and System refresh before rebuilding LLM/session state |
snapshot_interval |
null (off) |
finite positive seconds; environment off / v2 null disables |
boot and System refresh; enabling initializes the snapshot port first |
max_rpm |
60 |
integer >= 0; 0 disables the request gate |
boot and System refresh before rebuilding the LLM service |
max_aed_attempts |
3 |
integer >= 1 |
boot and System refresh |
aed_timeout |
360.0 seconds |
finite positive number | boot and System refresh |
streaming |
true (on; explicit OFF retained) |
canonical boolean words in the environment / JSON boolean in v2 | boot and System refresh, including the live SessionManager flag |
activeness |
balanced |
non-blank environment string / non-blank string or null in v2 |
boot and System refresh; compatibility posture only |
The corresponding environment names are LINGTAI_CONTEXT_LIMIT,
LINGTAI_SNAPSHOT_INTERVAL, LINGTAI_MAX_RPM, LINGTAI_MAX_AED_ATTEMPTS,
LINGTAI_AED_TIMEOUT, LINGTAI_STREAMING, and LINGTAI_ACTIVENESS.
Legacy manifest.context_limit, snapshot_interval, max_rpm,
max_aed_attempts, aed_timeout, streaming, and activeness are
recognized-and-ignored compatibility data. SHOW never reports them as current
truth and an active preset cannot override these runtime-policy rows. The row
comment points directly to this document shape and authorized procedure; the
System router does not own another copy of this policy.
Runtime-policy v2 document shape
The same settings/system.json file may be a closed v2 document naming any
subset of the seven ordinary runtime-policy fields above plus cache_miss_budget
(positive integer; see "Cache-miss budget" below) and notification_max_chars
(positive integer; Core still clamps it to 2048–10000 and
LINGTAI_NOTIFICATION_MAX_CHARS still wins), and auto_molt_idle_seconds
(positive finite seconds, default 7200), for example:
{"schema_version": 2, "context_limit": 200000, "auto_molt_idle_seconds": 7200}
The inactivity duration resolves live on each eligible heartbeat as valid env > valid v2 file > 7200 seconds; a file edit needs no refresh. A persisted env-file edit still needs refresh. The continuous IDLE/ASLEEP and strict current-context
100000 gate are unchanged; this changes cadence, not cache-hit guarantees.
Booleans never stand in for numbers, NaN/Infinity are rejected, and an
unknown, duplicate, or invalid key rejects the whole document so nothing is
applied partially. An absent key and an explicit null are different: absent
falls through to the fixed default, null is the configured value. The
kernel-fixed context-pressure thresholds (0.85 / 1.0 / 3 rounds / 0.75) and the
legacy molt_* fields are not settings: naming them makes the document
invalid. The seven ordinary runtime-policy fields are resolved at CLI boot, before
the first LLM service is built, and once on every refresh, so the service,
AgentConfig, and the session streaming flag always agree; init.json and
system/manifest.resolved.json are never rewritten to reflect it. Enabling
snapshot_interval by refresh on a running agent initializes the snapshot
repository first; if that fails, snapshots stay off for the process and
snapshot_initialize_failed is logged.
After explicit owner/human authorization, edit the intended environment value
at its launcher owner or the corresponding v2 field with Shell, preserving
unrelated fields. Follow refresh-precheck before applying a change at the
boot/refresh timing in the table, then query System settings again. An
invalid owner document applies no partial subset; this does not authorize
repair, runtime refresh or configuration writes by itself. Cache-budget live
resolution is separate and described below.
Cache-miss budget
Default-only row illustration (query SHOW for the actual current value):
{"key":"cache_miss_budget","current":2000000,"default":2000000,"configurable":true,"comment":"system-manual/reference/settings-inventory#cache-miss-budget"}
current resolves from a valid live LINGTAI_CACHE_MISS_BUDGET, then a live
valid settings/system.json (the v1-only document below, or the v2
cache_miss_budget field above), then the fixed 2,000,000 default. The
environment value is a positive base-10 integer string; the owner-file value
is a positive JSON integer (a boolean is not an integer here). Invalid
environment input falls through. A missing owner file selects the default; a
present unreadable, malformed, duplicate-key, wrong-version, or otherwise
invalid owner document makes SHOW return the fixed whole-inventory unavailable
failure unless a valid environment value bypasses it. The runtime consumer
retains its existing safe-default fallback on missing, unreadable, malformed
or invalid owner JSON; this is distinct from SHOW failing the whole inventory.
The reader never creates or rewrites the owner file. configurable: true
means an authorized owner procedure exists outside SHOW; SHOW itself never
writes, resets, or removes anything. This advisory budget is public, not
sensitive, and is not redacted.
The v1-only document shape (for an agent that only ever needs this one setting) is:
{"schema_version": 1, "cache_miss_budget": 2000000}
Both values must be JSON integers (not booleans), the version must be 1,
the budget must be positive, and no other or duplicate keys are accepted.
Authorized change procedure: after explicit owner/human authorization, set
LINGTAI_CACHE_MISS_BUDGET in the launcher or the agent's configured
env_file (an env_file edit needs refresh before the running agent sees
it), or use the existing Shell capability to write one of the two
document shapes above to settings/system.json (remove the file through the
same capability to return to the default), then call
system(action="settings", input={}) again and verify current. If the
environment source still wins, change or remove it at its launcher/env_file
owner instead of editing the lower-precedence file repeatedly. Direct
process-env and unshadowed file changes apply on the next metadata snapshot;
an env_file edit still needs refresh. Threshold changes and refreshes do
not reset cumulative token_usage.session.cache_miss_tokens; only molt does.
The threshold is advisory and never blocks a request. This path is unrelated
to .notification/system.json. Legacy init.json manifest.cache_miss_budget
is ignored and has no runtime effect.
manifest.summarize_notification_threshold remains System-owned: it controls
cross-cutting Agent/ToolExecutor result hints, not the Context ToolPlugin's
public summarize action. Conversely, manifest.pseudo_agent_subscriptions
belongs to the concrete Email ToolPlugin because CLI composition hands it
directly to PosixFilesystemMailAdapter, which resolves the subscription
paths. It is intentionally absent from System SHOW. The Email-owner inventory
uses the generic sensitive-value seam to fully redact both current and default path lists;
System neither duplicates that row nor exposes the paths.
Authorized change procedure: after explicit owner/human authorization, edit
the exact init.json field with the existing Shell capability. For a
preset-owned LLM/context value, edit the authorized preset outside SHOW or use
the existing system(action="refresh", input={"preset": ...}) workflow; never
edit the derived resolved manifest or widen preset.allowed as a shortcut.
Run the refresh precheck, refresh/relaunch at the timing above, then call SHOW
again. Psyche-owned prompt/file pairs are changed only through the procedure in
psyche-manual; changing or removing a pointer never changes or deletes the
referenced file. Existing identity changes use
system(action="name_set"|"name_nickname"); editing manifest.agent_name is
not a supported rename procedure.
LLM and provider inputs
Every effective manifest.llm axis is System-owned because no LLM ToolPlugin
exists. Selected-factory rows are classified by registered factory identity
across the four families openai, anthropic, codex, and claude-code. Precedence is active preset over authored init for the whole block.
The credential path is the exception inside the materialized block: a named
non-empty api_key_env value wins inline api_key. Initial boot uses only
those two authored sources through resolve_env_checked; it does not consult
an invented {PROVIDER}_API_KEY fallback. No secret, alias value, header, auth
path, endpoint pool, or credential-bearing URL is ever projected.
| Key | Default and accepted value | Invalid behavior | Projection | Timing |
|---|---|---|---|---|
llm.provider |
no default; required string naming one of the four registered families openai, anthropic, codex, claude-code |
Missing/wrong type fails init. A removed provider name (deepseek, zhipu/glm, mimo, minimax, openrouter, grok, qwen, kimi, gemini, kimi-code/kimi_code, custom, claude_code, codex-pool/codex_pool) fails init and preset validation with a pointer to openai/anthropic or an external pool; any other unknown name fails adapter construction |
literal | LLM rebuild on refresh |
llm.model |
no default; required string | Missing/wrong type fails init/provider construction | literal | LLM rebuild on refresh |
llm.api_key |
no universal default; string/null plus the credential precedence above | Missing required credentials fail initial adapter construction; a missing named alias uses an authored inline key when present and otherwise remains absent | <redacted> |
LLM rebuild on refresh |
llm.api_key_env |
absent; environment-variable name | Wrong type, or alias without inline key and without env_file, fails canonical validation |
<redacted> |
Resolved at boot/refresh |
llm.base_url |
provider-owned when omitted (the official OpenAI, Anthropic, or Codex endpoint; claude-code ignores it); string/null — point openai/anthropic at any compatible endpoint |
Provider validation owns unsupported endpoints | <redacted> because URLs may embed credentials |
LLM rebuild on refresh |
llm.wire_api |
Selected-route truth, not one universal default. openai: omitted, legacy auto, and chat_completions report chat_completions; responses reports responses (always stateless full-history replay). codex ignores the generic selector and always reports forced responses. anthropic and claude-code report null current/default |
Unknown values fail init validation; a non-auto value on any provider other than openai fails init validation |
selected-factory effective selector and omitted default | Adapter rebuild on refresh |
llm.inject_reasoning_fallback |
Selected-factory truth. openai forwards an authored boolean; omission/null consults LINGTAI_INJECT_REASONING_FALLBACK, whose invalid/unset default is true. anthropic, codex, and claude-code ignore the axis and report null current/default |
Wrong init type fails canonical validation | selected-factory boolean/default or null | Adapter construction on refresh |
llm.prompt_cache_namespace |
openai forwards an authored string and otherwise uses null (the auto-derived key then namespaces by endpoint). anthropic, codex, and claude-code ignore the axis and report null current/default |
Wrong init type fails canonical validation | selected-factory namespace/default only, never prompt/cache content | Adapter rebuild on refresh |
llm.service_tier |
openai and codex share one normalizer: absent is null; authored fast is reported as fast and sent as the standard wire priority; auto, default, flex, and priority are reported and sent verbatim. anthropic and claude-code do not forward it and report null current/default |
Wrong type or any other value fails init and preset validation (every provider) | selected-factory canonical authored value | Adapter rebuild on refresh |
llm.thinking |
Accepted on every family: none, minimal, low, medium, high, xhigh, max. The selected-route default comes from canonical build_agent_config hydration with thinking omitted: the default sentinel for openai (no reasoning field is sent) and codex (the adapter sends explicit xhigh), legacy high for anthropic and claude-code. Sent verbatim as Responses reasoning.effort / Chat Completions reasoning_effort; anthropic maps it to a thinking budget and claude-code to --effort |
Any other value fails init/preset validation | literal hydrated effort only | Session rebuild on refresh |
llm.codex_session_anchor |
derived from the resolved agent init.json path for Codex |
Explicit value is an internal/testing escape, not an authorized production setting | <redacted> |
Adapter rebuild; configurable is false |
llm.codex_auth_path |
provider-owned legacy auth path when absent; path-like override | Missing/unreadable/invalid auth fails the request/provider path closed | <redacted> |
Adapter rebuild/request-owned reread |
llm.codex_base_urls |
absent means single base_url; string or list accepted by the Codex adapter |
Invalid/empty entries follow the adapter's pool validation/fallback | <redacted> |
Adapter rebuild; selection rotates only at the documented molt boundary |
llm.default_headers |
{} user headers; JSON object in normal use |
Non-object values are not forwarded as user headers; provider construction owns final validation | <redacted> including names and values |
Adapter rebuild on refresh |
Authorized change procedure: after explicit owner/human authorization, update
the selected preset (when active) or init.json, keep credentials in the
supported private env/file source, run the refresh precheck, refresh, and SHOW
again. Never print a before/after credential, header, prompt, token, auth path,
or endpoint-pool value. SHOW never edits a preset, credential file, header map,
or process environment.
Kernel environment controls
These are genuine kernel/LLM settings without another ToolPlugin owner. Direct
process-environment changes apply at the canonical read point; an env_file
edit first needs System refresh. Missing/invalid values fall back exactly as
shown. LINGTAI_CODEX_WS is a compatibility alias under the single
llm.codex_transport row: a non-empty canonical
LINGTAI_CODEX_TRANSPORT always decides first.
| Key (environment) | Default; accepted values; invalid behavior | Current read/application timing | Projection |
|---|---|---|---|
nudge.enabled (LINGTAI_NUDGE_ENABLED) |
on; on/off, true/false, 1/0; invalid → on |
Every Nudge operation | literal boolean |
nudge.repeat_interval_seconds (LINGTAI_NUDGE_REPEAT_INTERVAL) |
86400; positive duration with s/m/h/d; invalid → 24h |
Every Nudge operation | numeric seconds |
nudge.folder_size_gb (LINGTAI_NUDGE_FOLDER_SIZE_GB) |
5; positive finite decimal GB; invalid → 5 |
Every folder-size evaluation | number |
lifecycle.active_stuck_threshold_seconds (LINGTAI_ACTIVE_STUCK_THRESHOLD_S) |
600; finite numeric seconds floored to 30; parse failure or non-finite value → 600 |
Each ACTIVE watchdog evaluation | number |
lifecycle.agent_alive_threshold_seconds (LINGTAI_AGENT_ALIVE_THRESHOLD_SEC) |
10; positive finite seconds; invalid → 10 |
Kernel import/start (restart required); SHOW reports the imported effective constant | number |
lifecycle.auto_molt_idle_seconds (LINGTAI_AUTO_MOLT_IDLE_SECONDS) |
7200; positive finite seconds; valid env > valid v2 auto_molt_idle_seconds > default (no disable value) |
Each inactive, unnotified heartbeat; System-file edits are live, env-file edits need refresh | number |
prompt.tool_prose_section_enabled (LINGTAI_TOOL_PROSE_SECTION_ENABLED) |
off; 1/true/yes/on; everything else off |
Every prompt rebuild/provider payload | boolean |
prompt.system_prompt_pressure_ratio (LINGTAI_SYSTEM_PROMPT_PRESSURE_RATIO) |
0.4; finite 0 < value < 1; invalid → 0.4 |
Every metadata snapshot | number |
session_stats.refresh_seconds (LINGTAI_SESSION_STATS_REFRESH_SECONDS) |
5; positive finite seconds; invalid → 5 |
Every Agent Record throttle check | number |
session_stats.daemon_limit (LINGTAI_SESSION_STATS_DAEMON_LIMIT) |
1000; positive integer; invalid → 1000 |
Every Agent Record daemon aggregation | integer |
security.risky_action_gate (LINGTAI_RISKY_ACTION_GATE) |
off unless truthy env or .security/gate_config.json exists; 1/true/yes/on; other env values off |
Every gate-config load; malformed present document fails the guarded path and SHOW closed | enabled boolean only; never policy paths/lists |
logging.console_debug (LINGTAI_VERBOSE) |
off; exactly 1 enables boot DEBUG console logging; other values off |
Agent boot/full relaunch | boolean |
runtime.tool_batch_memory_relief (LINGTAI_DAEMON_MEMORY_RELIEF) |
off; exactly 1 after surrounding whitespace enables the existing best-effort macOS relief hook; every other value, unsupported platform/symbol, or relief failure is an off/no-op result |
Read after every global ToolExecutor batch, including ordinary main-agent and daemon paths; no restart for a direct process-environment change |
boolean only; no allocator detail |
llm.codex_tui_dir (LINGTAI_TUI_DIR) |
env path wins; when unset, ~/.lingtai-tui is expanded with the current user home. Runtime accepts any path string and applies only Path.expanduser (relative paths remain relative; an explicit empty string denotes . rather than the default) |
Resolved lazily through resolve_codex_tui_dir only when SHOW/provider construction asks for it; module import and static declaration construction perform no home lookup. Change the launcher or env_file and fully relaunch before verification |
<redacted> for both current and default |
llm.codex_transport (LINGTAI_CODEX_TRANSPORT, alias LINGTAI_CODEX_WS) |
REST; canonical websocket/ws or rest/http/https; alias truthy enables WS only when canonical is empty; invalid → REST |
Adapter/session construction | literal rest/websocket |
llm.codex_ws_epoch_reset_turns (LINGTAI_CODEX_WS_EPOCH_RESET_TURNS) |
0; non-negative integer; invalid → 0 |
Session construction | integer |
llm.codex_responses_trace (LINGTAI_CODEX_RESPONSES_TRACE) |
off; 1/true/yes/on; other values off |
Each trace-path decision | boolean |
llm.codex_responses_trace_path (LINGTAI_CODEX_RESPONSES_TRACE_PATH) |
trace default when enabled; local path | Each trace-path decision; unused while trace is off; write failure disables/fails the diagnostic path | <redacted> |
llm.read_timeout_seconds (LINGTAI_LLM_READ_TIMEOUT) |
300; positive finite seconds; invalid → 300 |
Each OpenAI-compatible/Anthropic HTTP timeout build | number |
Authorized environment procedure: after explicit deployment-owner approval,
change the launcher environment or the agent's configured env_file; do not
mutate os.environ through a tool. Refresh when the source is env_file, and
restart only where the table says import/boot/session construction. Call SHOW
again and verify the effective value. Changing a threshold never grants access,
cleans files, resets counters, or authorizes a risky operation.
For LINGTAI_TUI_DIR, use that launcher procedure and a full relaunch. The
kernel does not create or validate the directory eagerly: an unexpandable ~
can fail adapter construction, while a missing directory or unreadable/invalid
codex-auth.json fails the later Codex account or
request path closed. Never print the resolved directory or credential paths;
SHOW fully redacts the env-selected and fallback paths.
Explicit non-settings and exclusions
These classifications are tested against the canonical schemas/registry so future fields cannot vanish silently:
- Concrete ToolPlugin owners stay out of System: Shell; Daemon;
Notification; Vision; Web; Task Card; Plugin/Psyche;
Skills; unified Pad memory; MCP, curated addons, and their config/session
paths. Psyche owns the live Pad prompt inputs at root
pad/pad_fileand the four configurable system-prompt inputs insettings/psyche.json.manifest.capabilities,manifest.plugins, and rootaddons/mcptherefore are not System rows. Oldlingtai/lingtai_filestrings remain accepted one-way memory migration inputs, not live settings sources. - Inert/compatibility init inputs are not settings sources:
manifest.context_limit,manifest.snapshot_interval,manifest.max_rpm,manifest.max_aed_attempts,manifest.aed_timeout,manifest.streaming,manifest.activeness,manifest.llm.codex_thread_salt, and nested initmanifest.llm.context_limit,manifest.max_turns, context-serialization template fields, retired molt/stamina fields, retired prompt fields, and the retiredmanifest.soulblock of the removed Soul subsystem. - Retired LLM keys are recognized-and-ignored, never rows:
manifest.llm.compact_threshold,manifest.llm.codex_auth_pool_path, and the per-vendor wire-routing keys retired with the four-family collapse —manifest.llm.api_compat,manifest.llm.reasoning_effort_vocab, andmanifest.llm.use_responses_api(thinkingis sent verbatim andwire_apialone selects theopenaiwire). - Kernel-fixed context-pressure thresholds, the hidden idle-sleep timeout, and fixed tool-loop safety limits are code policy rather than settings.
Do not infer product ownership from a registry source-path cell: the concrete ToolPlugin rule and System catch-all rule above are authoritative.
Concrete ToolPlugin environment exclusions
These registered production variables belong to concrete tools/integrations, not System:
LINGTAI_CLAUDE_INTERACTIVE_FIFOLINGTAI_CLAUDE_MANAGED_ROOTLINGTAI_CLOUD_MAIL_CONFIGLINGTAI_DAEMON_MANAGER_POOL_SIZELINGTAI_DAEMON_MAX_TURNSLINGTAI_DAEMON_SYSTEM_PROMPT_BUDGET_CHARSLINGTAI_FEISHU_CONFIGLINGTAI_IMAP_CONFIGLINGTAI_NOTIFICATION_DELAY_MAX_SECONDSLINGTAI_NOTIFICATION_MAX_CHARSLINGTAI_PUFFO_V0_REGISTRYLINGTAI_SHELLLINGTAI_TASKCARD_POLL_INTERVALLINGTAI_TELEGRAM_CONFIGLINGTAI_TOOL_TIMEOUT_MAX_SECONDSLINGTAI_WEB_ENGINELINGTAI_WEB_MAX_CHARSLINGTAI_WECHAT_CONFIGLINGTAI_WHATSAPP_CONFIGLINGTAI_WHATSAPP_SESSION_DIR
Injected or handoff environment exclusions
These values describe one launcher/process edge, descriptor, or run identity, not an adjustable kernel policy:
LINGTAI_AGENT_DIRLINGTAI_DAEMON_CAPSULE_FDLINGTAI_DAEMON_CAPSULE_HANDLELINGTAI_DAEMON_COMPLETION_FILELINGTAI_DAEMON_MANAGER_TOKENLINGTAI_DAEMON_RUN_IDLINGTAI_DAEMON_RUN_DIRLINGTAI_DERIVED_AVATAR_EXECUTIONLINGTAI_DRIVER_AUTHORITY_FDLINGTAI_MCP_NAMELINGTAI_REFRESH_ENV_OVERWRITELINGTAI_RUNTIME_PYTHONLINGTAI_RUNTIME_VENV
Test-only environment exclusions
LINGTAI_AVATAR_BOOT_WAIT_SECONDSLINGTAI_DAEMON_SUPERVISOR_TEST_FAKE_LLMLINGTAI_DAEMON_SUPERVISOR_TEST_FAKE_LLM_FINISHLINGTAI_DAEMON_SUPERVISOR_TEST_FAKE_LLM_SCENARIOLINGTAI_DAEMON_SUPERVISOR_TEST_FAKE_LLM_SLEEPLINGTAI_FAKE_APP_SERVER_MODELINGTAI_FAKE_CLI_REPORTLINGTAI_TEST_CONFIGLINGTAI_TEST_FAKE_CLAUDE_SIGNAL_RECORD