Skip to content

Guided tour

FabrCore 2.0 · Release and package availability

These guides track the current 2.0 source. Stable 2.0.0 publication is pending; package commands show the release target. Until it is published, follow the source quick start or use a matching available prerelease set. Release migration · Runtime modes

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

  1. Use descriptive non-underscore keys for application data, such as RequestId. Set supported _Harness* keys only through their documented configuration contract.
  2. Use message.IsSystemMessage to distinguish _status, _thinking and _error from ordinary business messages. Let the client render progress/errors appropriately.
  3. 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.
System Message Types · reference snippet
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('_');
}
System Message Types · reference snippet
if (message.IsSystemMessage)
{
    // Render as progress/control UI, record separately, or skip normal chat handling.
}

Check your instance and message JSON

  1. 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.
  2. 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.
  3. 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.