Skip to content

roadmap(observability): vendor-neutral execution tracing for agents and DevLoop #55

Closed
8 of 9 issues completed

Description

@mashkovd

Context

mctl already emits or plans the telemetry needed to understand agent execution, but the pieces are tracked as unrelated issues:

  • mctlhq/mctl-gitops#902 — OpenTelemetry Collector as the mctl telemetry gateway;
  • mctlhq/mctl-gitops#903 — backend/approach comparison: Traceway, Tempo, Langfuse, Phoenix, SigNoz, Grafana Agent Observability/agento11y;
  • mctlhq/mctl-agents#195 — end-to-end execution traces across Temporal / Argo / model / MCP / GitHub;
  • mctlhq/mctl-agent#38 — OpenTelemetry tracing and token-usage metrics in mctl-agent;
  • mctlhq/mctl-agent#97 — correlate execution traces with Loki, incidents and the mctl MCP surface.

Until now these were only "related work" under mctlhq/.github#18 (agent platform) and mctlhq/.github#48 (agent FinOps). Nothing owned the sequence, so the Collector was never deployed and the backend decision stayed open. This epic owns that sequence.

Goal

Make every mctl execution — DevLoop stage, incident diagnosis, MCP call — observable as one correlated trace, on a vendor-neutral producer boundary:

mctl workloads → OTLP → OpenTelemetry Collector → one or more replaceable backends

Invariants:

  • OTLP / OpenTelemetry is the only application-side contract. No backend-specific SDK enters mctl-agent or mctl-agents.
  • Trace identity reuses the execution identity from mctl-agents#196 (execution_id, Temporal workflow/run id, WorkItem, agent/profile version). No second correlation scheme.
  • Private prompts, completions and Telegram message bodies stay out of telemetry by default.
  • The trace backend is a view. Durable evidence (mctl-agents#199) and the cost ledger (.github#48) do not depend on trace retention.

Phases

Phase 0 — telemetry gateway

mctl-gitops#902. Deploy the Collector, define the OTLP endpoints workloads use, and pin the resource attributes every producer must set. Fan-out to backends is a Collector concern only.

Phase 1 — backend bake-off

This phase is split at the offline/live boundary.

  • Phase 1a — comparison harness: mctl-gitops#903 — complete. Frozen rubric, paper screen, representative DevLoop fixtures, generalized exporter/fan-out harness and ADR skeleton are in place.
  • Phase 1b — live bake-off and decision: mctl-gitops#1280 — open. Deploy the viable candidates, fan out representative traces through the Collector, measure a declared soak window, fill the rubric from observations and close the ADR.

The candidate set is now Traceway, Tempo, Langfuse, Phoenix, SigNoz, plus Grafana Agent Observability / agento11y as an instrumentation/UX approach. Grafana must be evaluated in two distinct shapes:

  1. self-managed agento11y/OTel telemetry → mctl Collector → Tempo/Grafana, preserving the vendor-neutral telemetry boundary;
  2. optional Grafana Cloud Agent Observability for conversation/session, cost/eval and guard UX, explicitly scoring Cloud dependency, privacy/data residency, pricing and portability.

The live bake-off must also prove whether agento11y covers the real claude-agent-sdk DevLoop runtime path, not only interactive Claude Code/Codex-style sessions.

Phase 2 — end-to-end execution traces

mctl-agents#195 and mctl-agent#38. Every DevLoop stage and every mctl-agent diagnosis emits spans carrying the canonical execution identity, including model calls with token usage. This phase is the prerequisite for .github#48 Phase 1 (one DevLoop with cost attribution).

Phase 3 — cross-system correlation

mctl-agent#97. Link traces to Loki log streams, incidents and MCP operations so an operator can move from an alert to the execution that caused it and back.

Current state (2026-10-13)

Verified against GitHub and the live cluster on 2026-10-13. The canonical graph is roadmap/epics/observability.yaml; this section is a snapshot of it.

Work item Required Issue Live evidence
Telemetry gateway, mctl-gitops#902 yes closed 2026-09-11 Collector in monitoring. Every producer exports to otel-collector.monitoring:4318.
Attribute catalog, mctl-docs#116 yes closed 2026-09-22 docs/reference/telemetry-attributes.md
Offline backend evaluation and rubric, mctl-gitops#903 yes closed 2026-09-22 ADR 0001, frozen rubric, fixtures
DevLoop execution tracing, mctl-agents#195 yes closed 2026-10-11 trace 164ac97d8d7264326c406240d263dcc1
mctl-agent tracing, mctl-agent#38 yes closed 2026-09-23 live since mctl-agent 2.5.0 (gitops#1828), trace 3b54b8b36a8a3334173dc4cad2458e83
MCP span context, mctl-api#285 yes closed 2026-10-10 trace_id in operation results
Cross-system correlation, mctl-agent#97 yes closed 2026-10-13 incident argo-mctl-agents-implement-dae24112-1791756910 → workflow → trace 431486061c652efb376a860d9d656f25 → ERROR span → Loki. mctl_get_incident returns the trace_id (mctl-api 4.82.0).
Live Tempo validation and ADR decision, mctl-gitops#1280 yes open soak in progress, see below
  • Phase 0, telemetry gateway: done.
  • Phase 1a, offline selection: done.
  • Phase 1b, live validation: mctl-gitops#1280 is the only open required item.
    • Scope (owner decision 2026-10-10, ADR "Bake-off scope amendment"): the live round is Tempo-only, monolithic on R2. The paper screen already ruled out deploying the other candidates, including the Grafana/agento11y shapes described under Phase 1 above. Under the frozen decision rule, Tempo is the default verdict unless live evidence gives a concrete reason against it.
    • Declared soak: from 2026-10-10T11:55Z to 2026-10-23T23:59Z, teardown 2026-10-24.
    • Real producers admitted by recorded amendments: the mctl-agents DevLoop (gitops#1788) and mctl-agent (gitops#1860).
    • Mid-window record (mctl-gitops#1280, 2026-10-13): 1,840 of 1,840 spans accounted for, no stop rule triggered, 0 leak-check hits.
    • Adopting Tempo permanently is a separate owner-gated change after the verdict, not a promotion of the eval deployment.
  • Phase 2, producer instrumentation and live proofs: done (#195, #38). Prerequisites mctl-gitops#1332 (token redaction) and mctl-agents#196 (execution identity) are closed.
  • MCP propagation: done (mctl-api#285).
  • Phase 3, cross-system correlation: done (mctl-agent#97).

Not required by the roadmap, but open: mctl-agent#139 step 3, promoting the catalog attributes that are now shipped. The catalog still marks gen_ai.* as reserved and says no MCTL service emits it.

Remaining critical path

#1280 soak (to 2026-10-23 23:59Z)
   │
   ▼
rubric cells + decision rule → ADR Decision
   │
   ├──► owner-gated adoption change (if Tempo is adopted)
   ▼
teardown of observability-eval (2026-10-24) → verify nothing left running
   │
   ▼
close #1280 → close this epic → roadmap lifecycle
Previous snapshot (2026-09-24), kept for history

Current state (2026-09-24)

The roadmap is in implementation, and the old 2026-09-11 "not started" snapshot is obsolete.

  • Phase 0 — telemetry gateway: mctl-gitops#902 closed 2026-09-11. The OTel Collector is the vendor-neutral tracing gateway.
  • Phase 1a — bake-off harness: mctl-gitops#903 closed 2026-09-22. Offline comparison assets, fixtures, fan-out/evaluation harness and ADR skeleton landed. The live/operator portion was deliberately split out.
  • Phase 1b — live bake-off: mctl-gitops#1280 open. This is the current critical-path work item: deploy viable candidates, run the declared soak, compare real traces, select the architecture in the ADR and remove non-selected candidates. On 2026-09-24 Grafana Agent Observability/agento11y was added to this live comparison as candidate/approach F.
  • Phase 2a — mctl-agent instrumentation code: mctl-agent#38 closed 2026-09-23 via PR MCP servers: CIMD primary, DCR fallback restricted to the portal callback, full scope for DCR clients #137. Pipeline and gen_ai.* spans plus token metrics are implemented using standard OTEL_* configuration.
  • Phase 2b — mctl-agent live rollout: mctl-agent#139 open. Release the code, enable otel.enabled in-cluster, verify real spans, then promote telemetry catalog attributes.
  • Phase 2c — DevLoop end-to-end tracing: mctl-agents#195 open, but the code/offline portion merged in PR #466. Trace propagation Temporal → Argo → pod, model/tool/GitHub/artifact spans, policy events, export-time redaction and failure isolation exist. It remains open for live exported evidence and one real investigation + implementation trace.
  • Collector correctness blocker: mctl-gitops#1332 open. Current redaction matches the substring token and masks GenAI token-count attributes; fix before using token/cost visibility as bake-off evidence.
  • Phase 3 — cross-system correlation: mctl-agent#97 open; depends on live end-to-end traces. It will connect incident/GitHub issue → workflow → trace/failed span → Loki and expose trace identity through operational/MCP surfaces.

Current critical path

#1332 fix Collector token redaction
          │
          ├───────────────┐
          ▼               ▼
#1280 live bake-off    #139 agent rollout
          │               │
          └──────┬────────┘
                 ▼
        #195 live DevLoop proof
                 │
                 ▼
          #97 trace ↔ Loki ↔ incident

The immediate roadmap focus is therefore #1280, not creating another backend-comparison epic. Grafana/agento11y is evaluated inside that existing decision path.

Repository ownership

Repository Ownership
mctl-gitops Collector deployment, backend deployment, retention, dashboards
mctl-agents DevLoop span instrumentation and identity propagation across Temporal / Argo
mctl-agent diagnosis / remediation instrumentation, Loki and incident correlation
mctl-api MCP-side span context and, later, trace links in operation results
mctl-docs telemetry contract, attribute catalog, operator guide

Relationship to other roadmap items

  • .github#48 agent-finops consumes Phase 2 spans; the cost ledger stays mctl-owned regardless of the backend chosen here.
  • .github#18 agent-platform supplies the execution identity and profile versions that spans carry.
  • .github#20 context-platform later attaches ContextSnapshot references to the same traces.

Acceptance criteria

  • An OpenTelemetry Collector receives OTLP from at least mctl-agents and mctl-agent in the preview cluster. (Since 2026-10-10 / 2026-10-11, see #1280.)
  • A written ADR selects the backend architecture, with offline comparison evidence from mctl-gitops#903 and live bake-off evidence from mctl-gitops#1280, including the Grafana/agento11y path. (Open: the verdict comes after the soak. The Grafana/agento11y path was screened on paper only, per the 2026-10-10 Tempo-only scope decision.)
  • One complete DevLoop is visible as a single correlated trace (canonical criterion, roadmap/epics/observability.yaml successCriteria; the roadmap is authoritative). Met by mctl-agents#195, trace 164ac97d8d7264326c406240d263dcc1 in the #1280 Tempo eval backend, a single trace for DevLoop dev-loop-mctlhq-mctl-api-454:
    • Traced execution: the mctl-agents-worker Temporal activities (RunActivity:submit_and_wait ×3) with one argo.workflow span per stage (investigate, implement, approve, all Succeeded). Under them, the mctl-agents-investigator and mctl-agents-implementer pods: invoke_agent, chat <model> spans with token usage, execute_tool, and git/GitHub spans (clone, push, issue comment, PR create).

    • Reviewer and shepherd activity are not traced, by design. Reviewers run as the claude-review.yml GitHub Action, outside the OTLP producer boundary. The approve and shepherd stages appear in the trace as orchestration spans (the worker's argo.workflow mctl-agents-approve span with its Argo workflow name and phase). Their content is in the existing orchestration and audit evidence: Temporal workflow history, Argo workflow status, mctl-api audit records, and the PR review and merge history on GitHub. No reviewer or shepherd instrumentation will be added to satisfy the wording below.

    • Superseded wording (historical, 2026-09)

      "One complete DevLoop run is visible as a single trace: investigator → implementer → reviewers → shepherd, with model calls and token usage per span."

      This prose predates the deployed tracing design and was broader than the canonical roadmap criterion. It is superseded on 2026-10-13 by the canonical criterion above and is no longer an open acceptance criterion.

  • One mctl-agent incident diagnosis is visible as a trace linked to the triggering alert and its Loki context. (mctl-agent#97, accepted by the owner 2026-10-12.)
  • Span attributes follow a documented mctl attribute catalog mapped onto OTel GenAI semantic conventions. (Checked against 1,840 real spans on 2026-10-13: the extra keys are upstream gen_ai.*/error.type, as the catalog requires. The catalog's own status column is stale, see mctl-agent#139.)
  • No private prompt/completion or message payload is stored in traces by default. (Leak check over all 1,840 stored spans, 0 hits, method on #1280. The poisoned-fixture check is still pending under #1280.)
  • Replacing the backend requires a Collector configuration change only. (Producers depend only on OpenTelemetry/OTLP and export to the Collector. Tempo is one named Collector exporter.)

Non-goals

  • Making the trace backend the ledger for cost or the store for execution evidence.
  • Adding Traceway, Langfuse or any other vendor SDK to application code.
  • Replacing Loki / VictoriaMetrics / Grafana for logs and platform metrics.
  • Full-fidelity prompt recording for debugging; that is a separate, opt-in decision.

Activity

  1. mashkovd commented on Sep 10, 2026

    @mashkovd
    MemberAuthor

    Polish 2026-09-11

    Read-only pass over the body (no comments yet), the 5 native sub-issues, every issue referenced in text (mctl-agents#196/#197/#198/#199/#60/#149, .github#18/#48/#20), project #1 fields, mctl-gitops/ROADMAP.md, mctl-agents/docs/adr/007, the merged PR history of mctl-gitops, mctl-agents, mctl-agent, mctl-api and mctl-docs, and an org-wide code search for OpenTelemetry / Collector / backend references.

    Stale

    • Nothing stale on the epic itself: all five children are OPEN, none has a closing PR, and all six items (epic + children) sit at Status=Todo in project docs: update org profile status to public/self-service #1. Nothing to untick.
    • mctl-agents#149, cited by mctl-agents#195 as the isolation prerequisite, is CLOSED (PR mctl-agents#299, 2026-09-04). Informational only; the epic body does not reference it.

    Orphan

    Gap

    • Phase 0 has no contract child. The body says Phase 0 "pins the resource attributes every producer must set" and acceptance criterion 5 requires "a documented mctl attribute catalog mapped onto OTel GenAI semantic conventions", but only the deployment issue mctl-gitops#902 exists. mctl-docs is listed under Repository ownership with no child at all. Suggested child in mctl-docs: docs(observability): mctl telemetry contract and span attribute catalog (execution identity + OTel GenAI semconv mapping).
    • mctl-api ownership row has no child. "MCP-side span context and, later, trace links in operation results" is Phase 3 work that mctl-agent#97 explicitly leaves to the MCP surface. Suggested child in mctl-api: feat(mcp): propagate OTel span context through MCP calls and return trace_id in operation results.
    • Phase 1 has no ADR home. mctl-gitops#903 must "close with an ADR", but neither mctl-gitops nor mctl-docs has a docs/adr/ directory; only mctl-agents keeps ADRs (005–008). Where the backend ADR lives needs deciding before #903 can close.

    Conflict

    • mctl-gitops/ROADMAP.md defers tracing. Line 35 lists distributed tracing under "not doing enterprise hardening ahead of demand", and line 149 says OpenTelemetry/tracing comes "only when multi-hop incidents appear that cannot be analysed otherwise". Phase 0 of this epic contradicts the repo-of-record roadmap. Either the trigger is declared met (DevLoop + incident responder are multi-hop today) and ROADMAP.md is amended in the #902 PR, or Phase 0 waits.
    • mctl-agent#38 targets deleted code. Its proposal instruments internal/diagnosis; that package was removed as dead in mctl-agent#123 (2026-09-05). The live model path is internal/skill/builtin/llm_diagnosis.go, and token metrics would sit next to the existing internal/metrics package. The child body needs a refresh before it is executable.
    • Circular dependency with mctl-agents#196. This epic says trace identity "reuses the execution identity from mctl-agents#196"; fix(claude-review): tell the reviewer it cannot run checks #196 says it "depends conceptually on spike(mcp-gateway): validate identity, per-tool policy and tenant isolation before migration #195". Neither issue defines execution_id today. ADR-007 explicitly keeps traces and fix(claude-review): tell the reviewer it cannot run checks #196 out of scope, but it does already fix definition_version, profile_version and release_revision on every run, so those three attributes can be pinned in the Phase 0 catalog without waiting on fix(claude-review): tell the reviewer it cannot run checks #196. The remaining identity fields need one declared owner.
    • mctl-gitops#903 title and candidate list omit SigNoz. The epic and the 2026-09-08 comment on #903 treat SigNoz as candidate E; the child's title and body still list four candidates.
    • mctl-agent#97 still calls #903 a "Traceway backend POC". #903 has been a five-way comparison since 2026-08-26; the child's reference is out of date.
    • "mctl already emits … the telemetry" (Context) overstates the baseline. Verified: no OpenTelemetry SDK or OTLP exporter exists in mctl-agent, mctl-agents or mctl-api (mctl-telegram carries go.opentelemetry.io/otel only as an indirect dependency), no Collector manifest exists in mctl-gitops, and mctl-agents#275 exports Temporal SDK metrics to Prometheus only. Starting point is zero traces; recorded in the new Current state section.

    Blocker

    • No item is waiting on a token, credential, repo permission or device. The two items waiting on a human are decisions, listed below, both for @mashkovd.

    Next executable step

    mctl-gitops#902 — deploy the Collector. It has no upstream dependency, every other child needs an OTLP endpoint to exist (the #903 bake-off fans out behind it, #195/#38 need somewhere to send spans), and it is the only place the ROADMAP.md contradiction can be resolved in code (amend the roadmap in the same PR). The #902 PR should also pin the first resource attributes (service.name, environment, definition_version/profile_version/release_revision from ADR-007) so the docs child has a concrete starting point.

    Proposed, needs a decision

    1. ROADMAP.md vs Phase 0: declare the "multi-hop incidents" trigger met and amend mctl-gitops/ROADMAP.md in the #902 PR, or hold Phase 0. Recommendation: declare it met; DevLoop and the incident responder are multi-hop today.
    2. ADR home for the backend decision: create mctl-gitops/docs/adr/ (deployment-owning repo) or put it in mctl-docs. Recommendation: mctl-gitops, next to the manifests it governs.
    3. Create the two missing children (mctl-docs attribute catalog, mctl-api MCP span context) and add them as sub-issues here.
    4. Refresh child bodies: mctl-agent#38 (drop internal/diagnosis, point at internal/skill/builtin/llm_diagnosis.go + internal/metrics), mctl-gitops#903 (title + candidate E SigNoz), mctl-agent#97 (#903 is a comparison, not a Traceway POC).
    5. Identity ownership: state in mctl-agents#196 that it owns the execution_id schema and that spike(mcp-gateway): validate identity, per-tool policy and tenant isolation before migration #195 consumes it, so the circular "depends on" is broken in one direction.
  2. mashkovd commented on Sep 11, 2026

    @mashkovd
    MemberAuthor

    Decision 2026-09-11 on item 5 (identity ownership): mctlhq/mctl-agents#196 owns the execution_id / execution-context schema; #195 and this epic consume it. Dependency edge #195 ← #196 added, so the cycle is broken in that direction. Phase 0 (#902) can proceed with service.name / environment attributes now and adopt the identity attributes when #196 lands.

  3. mashkovd commented on Sep 11, 2026

    @mashkovd
    MemberAuthor

    Decisions applied 2026-09-11

    Executed the decisions taken on the Polish 2026-09-11 items 1–4 (item 5 was already decided in the comment above).

    1. ROADMAP.md vs Phase 0 — trigger declared met. Comment on feat(observability): deploy OpenTelemetry Collector as mctl telemetry gateway mctl-gitops#902 (feat(observability): deploy OpenTelemetry Collector as mctl telemetry gateway mctl-gitops#902 (comment)): DevLoop and the incident responder are multi-hop today, so the #902 PR must amend mctl-gitops/ROADMAP.md (lines ~35 and ~149) in the same change and pin the first resource attributes (service.name, environment, definition_version / profile_version / release_revision from ADR-007).
    2. ADR home = mctl-gitops/docs/adr/. Comment on spike(observability): compare Traceway, Tempo, Langfuse, Phoenix, SigNoz and Grafana Agent Observability mctl-gitops#903 (spike(observability): compare Traceway, Tempo, Langfuse, Phoenix, SigNoz and Grafana Agent Observability mctl-gitops#903 (comment)); the directory is created in the PR that lands the ADR. #903 retitled to name all five candidates, and SigNoz moved from the 2026-09-08 comment into the body as candidate E (fan-out diagram, deliverable list and ADR section updated).
    3. Two missing children created and linked as sub-issues here, both in project docs: update org profile status to public/self-service #1 at Status=Todo / Priority=P2:
    4. Child bodies refreshed:

    No code, branches or PRs were created; ROADMAP.md is amended by the #902 PR, not here. Next executable step remains mctlhq/mctl-gitops#902.

  4. mashkovd commented on Sep 11, 2026

    @mashkovd
    MemberAuthor

    Portfolio hygiene — 2026-09-12

    Recommended portfolio priority: P1 — active observability foundation.

    This snapshot supersedes the stale Current state (2026-09-11) section above.

    Live state correction

    • Phase 0 is done: mctlhq/mctl-gitops#902 (OpenTelemetry Collector telemetry gateway) closed 2026-09-11.
    • The fixed producer boundary is now real: workloads can target OTLP → Collector without choosing a backend SDK.
    • Phase 1 mctlhq/mctl-gitops#903 remains open and is the backend-decision track.
    • Producer instrumentation remains the value-critical work: mctlhq/mctl-agents#195 and mctlhq/mctl-agent#38 must produce a representative real execution trace.

    Next executable order

    1. Instrument one representative DevLoop trace through the deployed Collector (#195 + producer side as needed).
    2. Use that same trace for #903 backend comparison rather than benchmarking empty/synthetic infrastructure only.
    3. Then land mctlhq/mctl-agent#97 cross-system incident/Loki/MCP correlation.

    Portfolio rule

    Do not make the backend bake-off the critical path to emitting traces. OTLP/Collector is already the contract; backend choice must remain replaceable and must not block producer instrumentation.

  5. mashkovd commented on Sep 12, 2026

    @mashkovd
    MemberAuthor

    Producer-side input from mctlhq/mctl-telegram#617 (Phase 3 of the enterprise MCP roadmap .github#35), shipped in mctl-telegram 0.66.0.

    tg.mctl.ai now records how every MCP call arrived, in audit_logs and mirrored to its structured log line: edge_request_id (the Cloudflare ray), edge_route (portal/direct), mcp_method, mcp_name, protocol_version. Captured once per request in internal/edgectx and read from ctx at the audit write, so there is a single capture point for whatever consumes it next.

    The OTel half of #617 is deliberately not done there and belongs to this epic. mctl-telegram has no tracer — opentelemetry is an indirect dependency only — and adding one locally would have created the second correlation scheme this epic's invariants forbid. When Phase 0's Collector lands and a tracer reaches this service, the span attributes are already settled and read the same values the audit row carries:

    span attribute source column
    mctl.edge.request_id edge_request_id
    mctl.edge.route edge_route
    mcp.method / mcp.name mcp_method / mcp_name
    mcp.protocol_version protocol_version

    Three measured facts worth having in this epic's context before anyone designs trace correlation across the Cloudflare boundary:

    1. Cf-Ray arrives on both routes — the zone is proxied, so a direct consumer call gets one too. It identifies a request, not a route; the discriminator is Cf-Worker.
    2. One portal tool call is two upstream requests (server/discover, then tools/call), each with its own ray. A per-call span must expect the pair.
    3. The client→mcp.mctl.ai leg cannot be tied to the subrequest leg today. Nothing in the arriving request carries the client-leg ray, and Cloudflare's per-request dataset is unavailable on this zone's Free plan (parentRayName absent from the schema, rayName entitlement-denied, adaptive groups empty, no Logpush). So cross-layer correlation with Cloudflare evidence is by principal and time; a paid plan would change that, which makes it a cost decision rather than an engineering one.

    Also worth carrying over: these fields are headers as received — evidence for reading a trail, never an authorization input. A direct caller cannot forge edge_route on this zone (Cloudflare strips client-supplied Cf-*, measured), but that is a property of the current Cloudflare configuration rather than of mctl.

    Full measurements: mctl-telegram#617 — header table, worked example, forgery test, ray result.

  6. mashkovd commented on Nov 1, 2026

    @mashkovd
    MemberAuthor

    Final state — completed

    Closing this epic after the canonical roadmap reached completion:

    • 8/8 required work items complete;
    • 0 blocked, 0 unknown;
    • RoadmapHealth healthy, drift=0, error=0;
    • live backend validation #1280 completed with ADOPT TEMPO / mctl-native only;
    • eval teardown #2073 merged;
    • permanent Tempo adoption #2072 merged;
    • roadmap/epics/observability.yaml lifecycle changed from active to completed in chore(roadmap): complete observability epic #296 (merge 69d0f1e).

    The informational HierarchyUnexpectedChild diagnostic for mctlhq/mctl-docs#107 is non-blocking housekeeping and is not part of this epic's completion gate.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions