Repository navigation
A subgraph is just a Graph — SubgraphBinding → GraphImplementation (0.4.0) #9
Description
Activity
✅
GraphImplementationCONFIRMED — Boris, 2026-10-07: "YES GraphImplementation. Decided. already."So the naming half is settled and needs no further argument. Recording it here because the body
said "Decided" on my reasoning and now says it on yours.And the answer to "what is
about?"It is one of three attributes on a
CoherenceFinding, which is astrsubclass — so findings
print, compare, sort andjoinexactly as the plain strings they used to be:f = CoherenceFinding("orphan is unreachable", check="check_reachable", about="orphan") str(f) # 'orphan is unreachable' <- byte-identical to the old plain string f.check # 'check_reachable' <- which rule produced it f.about # 'orphan' <- WHAT the finding is about f.blocking # True <- a defect, vs a `NOT CHECKED` stated gap
aboutexists so a caller can branch on structure instead of regexing the sentence — a UI
highlighting the offending node doesnodes[f.about]rather than parsing English.Its value space is exactly four kinds, and
test_every_finding_names_something_the_caller_can_look_up
enforces that every non-empty one resolves to something the caller holds:"normalize" a node / join / decision name "propose->cite" source->target, for a finding about an edge "trim_only" a strategy name "" the whole design — e.g. "no edge reaches END"⭐ Which is exactly the bug this issue has to fix
A child's findings propagate to the parent unchanged, so their
aboutis relative to the
CHILD:parent.coherence_check(strategy) # -> [... about="orphan" ...] # # `orphan` is a node in the CHILD; the caller holds the PARENT. # nodes["orphan"] -> KeyError. # And two children each having an `orphan` produce findings spelled IDENTICALLY.
So
abouthas to carry a path across a nesting boundary —"extract/orphan"— which changes
what the field means. That is why it rides along with this rename instead of landing on its own,
and whytest_about_names_something_the_caller_can_look_upcurrently covers only a flat design.Fuller writeup:
docs/open-questions.md§3.- added 4 commits that reference this issue
on Oct 7, 2026
From ChatGPT's nested-graph handoff, reconciled against the code.
GraphImplementationis 0 hits in this repo and its sandbox is gone, so its "62 focused tests passed" is unreproducible. This is a spec to implement, not a draft to review.Why the rename is right, and the reason is stronger than preference
There is no subgraph type today —
SubgraphBinding(graph: GraphSpec, strategy: StrategySpec)is already a graph paired with its strategy. And "subgraph" is wrong, not merely unfashionable: a subgraph of G is a subset of G's vertices and edges. A child here is a separate graph whose result substitutes for one node. Nested is accurate.Decided
GraphImplementation, notGraphStepImplementation:(Graph Step)(Implementation)misreads as the special composed-step node type we are deliberately not building, and every key inbindingsis already a step, so the position says it.Implementationunion alias. The handoff proposes one; nothing needs it.subgraphflag andcheck_subgraphstoo — a half-renamed vocabulary is worse than either end.In scope, carried over from Copilot on #8
abouton a propagated child finding is relative to the child, so afterparent.coherence_check(s)it names nothing the caller holds and collides with the same name in a second child. Precision and usability are both real; reconciling them meansaboutcarrying a path across the boundary. The invariant is currently narrowed in prose at both sites andtest_about_names_something_the_caller_can_look_uponly covers a flat design.Must not change
_port_typestill refuses a multi-port boundary; parent and child still declare identicalstate_type/deps_typeand share the same runtime objects; recursion is still rejected (nowchecks.check_recursion). All verified. A rename must not quietly relax any of them.