Skip to content

Realization semantics for runtime.forwarding_agents (ADR-050): what does 'realized' mean for a non-executable inventory concern, and how are divergent/exogenous agent postures expressed? #1043

Description

@Brad-Edwards

Question

What does it mean to realize a runtime.forwarding_agents (ADR-050) concern,
and how should the SDL express an agent's realized posture — including
deliberately-divergent or misconfigured postures — so that both endogenous
(system-under-test) and exogenous (measurement-instrumentation) agents are
honestly expressible and testable?

This is a design question, not a bug report. It surfaced from a downstream
consumer (Brad-Edwards/aptl#889) but is an ecosystem-semantics question about
ADR-050 / ADR-056 / ADR-066 / SEM-218, so it belongs here.

The contradiction as it stands

forwarding-agents sits across two RAES layers that currently disagree about
what it is:

  • ADR-050 (SDL surface): runtime.forwarding_agents is an observed runtime
    inventory that is explicitly "targetable but not executable." Its
    Non-Goals exclude "implementing log shipping, IOC ingestion, rule generation,
    reload execution,"
    and its Risks warn that "treating a transform's presence
    as proof of execution would overclaim what the SDL can validate."
    So
    declaring an agent asserts the node has an agent of this shape/config, not
    that shipping runs.

  • SEM-218 (realization gate): the processor registers forwarding-agents as
    a first-class realization concern
    (raes_processor/semantics/realization_concerns.py), so an author-declared
    EXACT forwarding agent goes through the non-approximation gate
    (explicitness-and-realization.md, invariants I1/I2): a backend must
    "realize R exactly as declared or reject" — no silent approximation.

  • The undefined middle: for a surface ADR-050 calls non-executable
    inventory
    , SEM-218 demands the backend disclose a realized value — but
    nothing defines what evidence discharges "realized" for it.
    project_forwarding_agents projects observed and planned to the same
    canonical shape (no gradation), and unlike ADR-088 service-materialization —
    which carries an ObservationStrength (DAEMON_OBSERVED / GUEST_OBSERVED,
    raes_backend_protocols/service_materialization.py) — the six ADR-050/chore: back-merge v0.24.0 into dev #876
    runtime concerns carry no observation-strength disclosure at all. So a
    backend has no honest, graded way to say how it corroborated a declared
    agent, and is forced into a binary exact-match it cannot ground.

The expressivity we actually need

The realization-honesty question is inseparable from an expressivity question,
because the same concern must carry both exogenous and endogenous agents,
and (per the guardrail against overclaiming) neither can be faked:

1. Exogenous instrumentation (measurement apparatus). A scenario may have to
insert logging purely to collect the data an experiment needs, even though the
instrumentation is exogenous to the phenomenon under study. The author needs to
say: the agent is present, what it collects, and where its output goes —
abstractly (e.g. "to the evidence pack"), not a concrete host path. This is part
of the experimental data-collection apparatus. ADR-066 (scenario-native
observability vs authored evidence-requirement plane) and ADR-064
(capture-spec / evidence-record / derived-measure) clearly own adjacent
concerns, but it is not clear how a runtime.forwarding_agents entry that exists
as measurement apparatus binds to the evidence plane, nor how its realization
is disclosed without implying it is a scenario variable.

2. Endogenous posture (system-under-test). A scenario may deliberately
contain agents in any combination of postures, because the posture itself is
the independent/dependent variable:

  • present and correctly forwarding;
  • present but not forwarding;
  • present but misconfigured (configured differently from peers);
  • forwarding to a different destination than peers;
  • forwarding to multiple destinations.

These must all be appropriately expressible and honestly corroborable: a
"present but not forwarding" agent is a legitimate realized scenario state the
backend must be able to disclose as realized-as-declared, not rejected as an
unrealized approximation. The experiment then tests the posture (e.g. "does the
SOC detect that the DB agent stopped shipping?"), which looks like an
observable/proposition question (ADR-079 truth semantics / ADR-054 observable
lifecycle) rather than a realization exact-match question.

3. This generalizes. The same reasoning applies to an EDR sensor, or any
runtime agent with a configured/behavioral posture — not just log forwarders. A
resolution should be a general pattern (or make forwarding-agents its first
instance), not a forwarding-specific patch.

What seems missing (for discussion, not a prescription)

  1. Observation strength for ADR-050/chore: back-merge v0.24.0 into dev #876 runtime realization concerns.
    Generalize the ADR-088 ObservationStrength idea so a backend honestly
    discloses how strongly it corroborated a declared agent — e.g.
    presence/image-attested (agent baked into a digest-locked source image),
    configuration-observed, behavior-observed — and the SEM-218 gate compares
    declared-vs-observed at the disclosed strength. An author who declares
    "forwarding to X" as EXACT then requires a backend that can observe
    forwarding; a backend that can only attest presence must say so (and either
    satisfies a presence-level declaration or is honestly rejected for a
    behavior-level one).

  2. Separation of realized presence/config from realized behavioral
    posture
    .
    Is "is it actually forwarding / to where / correctly" a
    realization concern (SEM-218 exact-match on forwarding-agents), or an
    observable/proposition (ADR-079/ADR-054) layered over a
    presence/config realization? The latter seems to resolve the ADR-050 tension
    cleanly (realization attests the declared agent inventory exists; propositions
    test its behavior), and makes the divergent/misconfigured cases first-class —
    but this should be decided in the ADRs, not inferred by a backend.

  3. Endogenous vs exogenous role. A defined way to mark a
    runtime.forwarding_agents entry as measurement apparatus (exogenous, bound
    to the ADR-064/066 evidence plane, not a scenario variable) vs system-under-
    test (endogenous, whose posture is an observable / variation factor per
    ADR-084). Today the same model carries both with no role marker.

Concrete downstream impact

The current reference-backend/#876 behavior is that any EXACT
forwarding_agents declaration is disclosed as absent and therefore rejected
by the non-approximation gate — on the premise that a backend never materializes
a forwarding agent. That premise does not hold for a backend that materializes
the agent as a digest-locked image sidecar or as an installed unit on a
dynamically-composed node; those agents are realized, and the gate rejects a
node the backend honestly stood up. This blocks a clean realization of any
scenario that declares forwarding agents (e.g. the TechVault operational
scenario: two image-backed Wazuh log-forwarder sidecars plus one dynamically
composed MISP→Suricata content-sync agent).

We would rather resolve this at the semantic/ADR layer than have each backend
invent its own answer to "what does realizing a non-executable inventory concern
mean," which would fragment realization honesty across backends.

Ask

Guidance (and, if warranted, an ADR-050/ADR-056 amendment or a new realization
ADR) on:

  • what "realized" means for a non-executable inventory concern, and whether it
    should carry a graded observation strength;
  • whether behavioral posture (forwarding / not / where / correctness) is a
    realization exact-match or an observable/proposition over a
    presence/config realization;
  • how endogenous (system-under-test) and exogenous (measurement-apparatus)
    agents are distinguished and how the exogenous case binds to the ADR-064/066
    evidence plane.

Downstream tracking: Brad-Edwards/aptl#889 is blocked on the answer.

Requirements

  • SEM-218

Metadata

Metadata

Assignees

No one assigned

    Labels

    in-progressAn agent is actively working this issue via /implementquestionFurther information is requested

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions