Repository navigation
Report every edge the run did not cross, not only the ones it refused - #65
Merged
Merged
Conversation
…it refused NotTaken is documented as the difference between the diagram and the run, and it was built entirely from RunState.DeclinedEdges. Declining is something the walk DOES, so that list only ever holds edges the walk reached and turned down. An edge leaving a pod no path arrives at is never offered, never refused, and so never appeared -- the largest difference between a diagram and its run was the one difference the field could not report. Measured 2026-09-23. A model drew a 15-pod diagram from a screenshot and left the pub/sub topic with no publisher. One run: 20 edges drawn, 12 crossed, 1 reported untaken, 7 accounted for nowhere. It parsed clean, ran clean and shared clean, and a renderer greying out what NotTaken names would have drawn those 7 exactly like the edges the request crossed. Same run after this change: 12 crossed, 8 untaken, 0 unaccounted for. The reason names the SOURCE pod rather than the edge, because that is the thing to fix: one missing arrow into a topic strands the topic and everything only it calls, and five of the eight here say "no path from the entry point arrives at service-bus". A diagram with no entry point now reports every edge instead of none. Nothing ran, so the difference is the whole diagram; an empty list said the opposite. Tested: 1201 pass. Six new, on the diagram above -- the crossed-or-reported invariant over every arrow, the count and reason for a stranded source, that a reported edge is never also a crossed one, that an unreachable edge reads differently from a refused one, the no-entry case, and a guard on the other side that a fully walked diagram still reports nothing. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
ETWOYA
approved these changes
Sep 23, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
NotTakenis documented as the difference between the diagram and the run. It was builtentirely from
RunState.DeclinedEdges, and declining is something the walk does — that listonly ever holds edges the walk reached and turned down. An edge leaving a pod no path arrives at
is never offered, never refused, and so never appeared at all. The largest difference between a
diagram and its run was the one difference the field could not report.
What it looks like
A model drew a 15-pod diagram from a screenshot of a reference architecture and left the
pub/sub topic with no publisher — every
service-bus --> x, nox --> service-bus. It parsesclean and runs clean. One run, before and after:
notTakenA renderer greying out what
notTakennames drew those 7 exactly like the edges the requestcrossed — the class of lie
HopandNotTakenboth exist to prevent.What changed
NotTakenEdgesnow takes the graph and reports every drawn edge that is neither crossed noralready reported as declined. The reason names the source pod rather than the edge, because
that is the thing to fix: one missing arrow into a topic strands the topic and everything only
it calls, and five of the eight here read
no path from the entry point arrives at service-bus.An unreachable edge and a refused one now read differently, which matters — only one of them is
a mistake in the picture.
A diagram with no entry point reports every edge instead of none. Nothing ran, so the difference
is the whole diagram; an empty list said the opposite.
Testing
dotnet test src/Shoebox.sln— 1201 pass, 6 new intests/Shoebox.Api.UnitTests/Run/UnreachableEdgeTests.cs:does not start greying out arrows the request did cross
Also ran it against a local instance and diffed the
/runbody for the diagram above; that iswhere the table comes from.
Not in this PR
/topology/parsehas the same blind spot — itsnotescover cycles and say nothing about atopic nothing publishes to, so a caller cannot see the problem until after it fires. Happy to
follow up separately; keeping this one to the run.
🤖 Generated with Claude Code