Skip to content

fix(skill): native source = any mounted tool; empty grouped result is not absence - #32

Merged
safwentrabelsi merged 1 commit into
mainfrom
fix/native-verification-mcp-tools
Sep 18, 2026
Merged

safwentrabelsi merged 1 commit into
mainfrom
fix/native-verification-mcp-tools

Conversation

@safwentrabelsi

Copy link
Copy Markdown
Contributor

From Roxane's v0.3.3 combined-arm rerun (six runs, five native MCPs + Anyshift). The endpoint fix and PagerDuty incident selection are confirmed corrected there; two issues remain, and the first is our wording.

1. "I did not have a native kubectl source here." Three of six answers reported native evidence unavailable while the Kubernetes MCP was mounted and had passed an actual-read preflight (q1-augmented-r2 made all 29 calls against Anyshift, then said that). v0.3.3 names the native sources as "kubectl, a cloud CLI, the APM, PagerDuty" — shell framing. These sessions have no shell: Kubernetes arrives as an MCP server (resources_get, resources_list, …), so an agent reading "kubectl" correctly concludes it has none, and skips verification. Now the guidance names tool surfaces, says most sessions have no shell at all, and requires reading the mounted tool list before calling a layer unverifiable.

2. Empty grouped result read as zero traffic. q2-augmented-r2 reported production had "0 spans in the last hour" from a query grouped simultaneously on env, @kube_namespace, @kube_deployment, @kubernetes.namespace, @kubernetes.deployment.name — zero buckets, not a zero total. The same window grouped by env alone returned 3,374 spans. The skill's "0 rows is NOT evidence of absence" rule only covered Cypher; it now covers any source, with the concrete instruction to reduce the grouping and re-run before reporting absence.

Version bumped to 0.3.4 with the production-verification line and evidence row.

🤖 Generated with Claude Code

… result is not absence

Roxane's v0.3.3 combined-arm rerun: three of six answers reported that native
evidence was unavailable while a Kubernetes MCP was mounted and preflighted, one
saying verbatim "I did not have a native kubectl source here". The guidance named
`kubectl` and CLIs, so with no shell the agent concluded the layer was
unverifiable. Name the tool surfaces instead, and require looking at the mounted
tools before declaring a layer unverifiable.

Same rerun: an APM query grouped on five dimensions returned zero buckets and was
reported as "0 spans in the last hour"; the same window grouped by env alone
returned 3,374. Generalise the 0-rows rule beyond Cypher to any source.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: be3dfabcd7

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +103 to +106
grouped query answers "no rows", never "no traffic". Before reporting absence: drop the
grouping to the single dimension you actually need (`env`), widen the window, and re-run.
Report "no data matched this query" with the query shown, and only call it absence when
the simplest form of it is also empty.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Verify zero traffic with an ungrouped count

When the remaining dimension itself is absent—for example, spans without an env tag—grouping by that single dimension still returns zero buckets even though traffic exists, so this instruction can reproduce the false-zero conclusion it is intended to prevent. Widening the window does not fix missing dimensions and also changes the bounds of a time-specific question; require an ungrouped total over the original requested window before reporting no traffic.

Useful? React with 👍 / 👎.

an incident is about. The graph is the evidence for topology, relationships and history;
the native source is the evidence for "right now". Cite both, and say which one each
statement rests on. When no native source is mounted, keep the claim time-stamped
**A native source is any mounted tool that reads the live system, not just a shell.** Most

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Exclude the Anyshift graph from the native-source definition

In a session where Anyshift is the only mounted read tool, this definition also describes the Anyshift MCP itself: it is mounted and reads a live system. An agent can therefore treat the graph as the required native source and cite the same stale graph evidence twice for a current-state claim, despite the later graph/native distinction. Define the native source as an independent tool that directly queries the underlying layer, excluding the Anyshift event graph.

Useful? React with 👍 / 👎.

@safwentrabelsi
safwentrabelsi merged commit 8683f68 into main Sep 18, 2026
3 checks passed
@safwentrabelsi
safwentrabelsi deleted the fix/native-verification-mcp-tools branch September 18, 2026 12:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants