MODULE 02 · LESSON 2.4
Understand _args and all system-owned underscore areas
Recognize system arguments, control messages and internal storage names.
Lesson 9 of 86 · FabrCore 2.0
Overview
The public member is Args, not a literal _args property. Ordinary application arguments are public metadata. Documented underscore arguments such as _HarnessLoop configure system behavior; internal names such as _harness_session:{threadId} are framework-owned state. Underscore-prefixed MessageType values are reserved control traffic.
Underscore names do not form one configuration object
There is no public “_args” container to copy into a JSON file. Args is the public dictionary. Some documented keys within it, such as _HarnessLoop, control a framework feature. Other underscore names identify private persisted state or reserved message types. Similar spelling does not make those names interchangeable or supported extension points.
Why reserved traffic is protected
The framework has control operations that ordinary users must not trigger by selecting a channel or message type. Writing _admin into a user message does not turn it into an authorized diagnostic session. Likewise, writing framework-owned state keys can corrupt the assumptions made by lifecycle or session restoration. Application metadata should use clear names such as RequestId and stay outside private namespaces.
Classify reserved and application data
- Use descriptive non-underscore keys for application data, such as RequestId. Set supported _Harness* keys only through their documented configuration contract.
- Use message.IsSystemMessage to distinguish _status, _thinking and _error from ordinary business messages. Let the client render progress/errors appropriately.
- Keep _admin and _agent_administration traffic on their privileged administration paths. Never use them to bypass the normal agent API or edit internal snapshots directly.
public static class SystemMessageTypes
{
public const string Status = "_status"; // Heartbeat while an agent is processing
public const string Thinking = "_thinking"; // Progress/thinking update for user-facing clients
public const string Error = "_error"; // Error notification
public static bool IsSystemMessage(string? messageType)
=> messageType != null && messageType.StartsWith('_');
}
if (message.IsSystemMessage)
{
// Render as progress/control UI, record separately, or skip normal chat handling.
}
Check your instance and message JSON
- Inspect the JSON you have written so far. RequestId should be under the message's Args, and model selection should remain in the instance's Models field.
- For every underscore key you plan to use, find its documented argument definition and owning feature. Remove any key copied from an internal state dump rather than a public configuration example.
- If testing reserved-channel rejection, use a disposable instance and confirm the rejected request does not run a business tool. Use the actual administration API for diagnostic work later in module 13.
The result is a small, intentional configuration surface. Reserved keys are only useful when a documented consumer reads them; they are not shortcuts into privileged behavior.
If the result is different
Arg key casing matters. _HarnessLoop is supported; _harnessloop may be ignored. A prefix is a convention and contract, not permission to manipulate every internal field.
Go deeper
Explore the related documentation.