You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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)
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).
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.
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.
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 aboutADR-050 / ADR-056 / ADR-066 / SEM-218, so it belongs here.
The contradiction as it stands
forwarding-agentssits across two RAES layers that currently disagree aboutwhat it is:
ADR-050 (SDL surface):
runtime.forwarding_agentsis an observed runtimeinventory 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-agentsasa first-class realization concern
(
raes_processor/semantics/realization_concerns.py), so an author-declaredEXACT 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_agentsprojectsobservedandplannedto the samecanonical 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 #876runtime 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_agentsentry that existsas 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:
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-agentsits firstinstance), not a forwarding-specific patch.
What seems missing (for discussion, not a prescription)
Observation strength for ADR-050/chore: back-merge v0.24.0 into dev #876 runtime realization concerns.
Generalize the ADR-088
ObservationStrengthidea so a backend honestlydiscloses 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).
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 anobservable/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.
Endogenous vs exogenous role. A defined way to mark a
runtime.forwarding_agentsentry as measurement apparatus (exogenous, boundto 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_agentsdeclaration is disclosed as absent and therefore rejectedby 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:
should carry a graded observation strength;
realization exact-match or an observable/proposition over a
presence/config realization;
agents are distinguished and how the exogenous case binds to the ADR-064/066
evidence plane.
Downstream tracking:
Brad-Edwards/aptl#889is blocked on the answer.Requirements