Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions conformance.toml
Original file line number Diff line number Diff line change
Expand Up @@ -150,12 +150,12 @@ status = "textual-only"
since = "0.9.0"
note = "Drain snapshot semantic and timeout-input validation already implemented as part of the proposal 0010 impl PR (v0.9.0); no additional module-level work needed."

# Spec v0.23.0-v0.26.0 batch (proposals 0031, 0032, 0033, 0034). All
# four have impl work landing across the v0.10.0 release cycle; status
# stays `not-yet` until the release PR flips them to `implemented`
# with `since = "0.10.0"`. The pinned spec submodule advances ahead
# of the impl status because newer fixtures need to be visible to
# the conformance harness as each PR lands.
# Spec v0.23.0-v0.26.1 batch (proposals 0031, 0032, 0033, 0034, 0035).
# All five have impl work landing across the v0.10.0 release cycle;
# status stays `not-yet` until the release PR flips them to
# `implemented` with `since = "0.10.0"`. The pinned spec submodule
# advances ahead of the impl status because newer fixtures need to be
# visible to the conformance harness as each PR lands.
[proposals."0031"]
status = "not-yet"

Expand All @@ -167,3 +167,6 @@ status = "not-yet"

[proposals."0034"]
status = "not-yet"

[proposals."0035"]
status = "not-yet"
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Specification = "https://github.com/LunarCommand/openarmature-spec"
openarmature = "openarmature.cli:main"

[tool.openarmature]
spec_version = "0.26.0"
spec_version = "0.26.1"

[dependency-groups]
dev = [
Expand Down
4 changes: 2 additions & 2 deletions src/openarmature/AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# OpenArmature — Agent documentation

*This is the agent guide bundled with the openarmature Python package, version 0.9.0 (spec v0.26.0). For the full docs site see [openarmature.ai](https://openarmature.ai). For the canonical spec text see [openarmature.org/capabilities](https://openarmature.org/capabilities/). For project-specific conventions for the code you're editing, see the host project's `AGENTS.md` or `CLAUDE.md`.*
*This is the agent guide bundled with the openarmature Python package, version 0.9.0 (spec v0.26.1). For the full docs site see [openarmature.ai](https://openarmature.ai). For the canonical spec text see [openarmature.org/capabilities](https://openarmature.org/capabilities/). For project-specific conventions for the code you're editing, see the host project's `AGENTS.md` or `CLAUDE.md`.*

## TL;DR

Expand All @@ -10,7 +10,7 @@ OpenArmature is a workflow framework for LLM pipelines and tool-calling agents

## Capability contracts

_Sourced from openarmature-spec v0.26.0. Each entry below reproduces §1 (Purpose) and §2 (Concepts) of the capability's `spec.md`. For the full spec text (execution model, error semantics, determinism, observer hooks, etc.) see the linked docs site._
_Sourced from openarmature-spec v0.26.1. Each entry below reproduces §1 (Purpose) and §2 (Concepts) of the capability's `spec.md`. For the full spec text (execution model, error semantics, determinism, observer hooks, etc.) see the linked docs site._

### Capability: `graph-engine`

Expand Down
2 changes: 1 addition & 1 deletion src/openarmature/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@
"""

__version__ = "0.9.0"
__spec_version__ = "0.26.0"
__spec_version__ = "0.26.1"
21 changes: 18 additions & 3 deletions src/openarmature/observability/langfuse/observer.py
Original file line number Diff line number Diff line change
Expand Up @@ -328,8 +328,18 @@ def _handle_completed(self, event: NodeEvent) -> None:
inv_state.detached_traces.pop(event.namespace, None)

def _open_trace(self, invocation_id: str, correlation_id: str | None, event: NodeEvent) -> None:
# ``entry_node`` and the trace name MUST identify the outer-graph
# entry, not whichever node fired first. Subgraph wrappers do not
# emit their own events — when the outer entry is a SubgraphNode
# the first event the observer sees comes from inside the
# subgraph (with ``event.namespace = (wrapper, inner)`` and
# ``event.node_name = inner``). Using ``event.namespace[0]``
# walks back to the outermost prefix component, which IS the
# outer entry by construction (the graph engine fires inner
# events under the wrapper's namespace).
entry_node = event.namespace[0] if event.namespace else event.node_name
metadata: dict[str, Any] = {
"entry_node": event.node_name,
"entry_node": entry_node,
"spec_version": self.spec_version,
}
if correlation_id is not None:
Expand All @@ -338,7 +348,7 @@ def _open_trace(self, invocation_id: str, correlation_id: str | None, event: Nod
# precedence; entry-node name is the spec-recommended fallback.
# The caller-supplied path lands in proposal 0034 (PR 4) — for
# now only the fallback is wired.
trace_name = event.node_name
trace_name = entry_node
self.client.trace(id=invocation_id, name=trace_name, metadata=metadata)
Comment thread
chris-colinsky marked this conversation as resolved.
self._inv_states[invocation_id] = _InvState(trace_id=invocation_id)

Expand Down Expand Up @@ -559,8 +569,13 @@ def _open_detached_subgraph_trace(
# metadata immediately — the array-form preserves §8.5's
# "string array, one entry per detached child" shape so
# later detached siblings under the same parent can append.
#
# Note: `subgraph_name` is intentionally NOT on this link
# observation. Per §5.3 + §8.5, in detached mode the wrapper
# role migrates to the detached trace's dispatch observation;
# the main trace's link observation IS the SubgraphNode span
# (no wrapper role) and so does not carry `subgraph_name`.
link_metadata: dict[str, Any] = {
"subgraph_name": prefix[-1],
"detached_child_trace_ids": [detached_trace_id],
}
Comment thread
chris-colinsky marked this conversation as resolved.
if correlation_id is not None:
Expand Down
13 changes: 13 additions & 0 deletions tests/conformance/test_fixture_parsing.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,19 @@ def _id(case: tuple[str, Path]) -> str:
"observability/024-langfuse-prompt-linkage": (
"Langfuse shape models live in the dedicated test_observability_langfuse harness"
),
# Proposal 0035 (spec v0.26.1) Langfuse graph-topology fixtures
# (031/032/033) introduce a ``langfuse_traces:`` (plural) expected
# shape for detached / multi-trace cases. Same deferral rationale as
# 022-024 — Langfuse shape models live in the dedicated harness.
"observability/031-langfuse-subgraph-span-hierarchy": (
"Langfuse shape models live in the dedicated test_observability_langfuse harness"
),
"observability/032-langfuse-fan-out-per-instance-spans": (
"Langfuse shape models live in the dedicated test_observability_langfuse harness"
),
"observability/033-langfuse-detached-trace-mode": (
"Langfuse shape models live in the dedicated test_observability_langfuse harness"
),
# proposal 0034 caller-supplied invocation metadata fixtures (PR 4).
"observability/027-langfuse-caller-supplied-metadata": "Caller-metadata harness lands in PR 4 (0034)",
"observability/028-caller-metadata-namespace-rejection": "Caller-metadata harness lands in PR 4 (0034)",
Expand Down
Loading
Loading