net.external

the net may extend onto an unread sheet (read-gap marker)

What it is

net.external(net) yields one row for each net that the read flagged as possibly continuing past what it covered. Such a net is joined by a name-based mechanism (a global label, a power symbol), and its other ends may live in files or sheets that the read never opened. It is a read-gap marker, not a topology fact.

Take a net that spans ten sheets of a fully-read design. It carries no net.external marking, because “which sheets does this net touch” is derivable topology. net.external marks only nets where the read itself may be incomplete.

For hardware engineers

A row here means what the tool sees on this net is not proof of what the board has on it. There may be more pins, more sources, more loads on a sheet the read did not reach. Some rules would fire on incomplete connectivity, such as a decoupling-cap-missing or crystal-load check. Such a rule suppresses itself on an external net rather than report a violation it cannot stand behind. During a review you query it to see where the read is admitting a gap.

For software engineers

Absence of a connection on an external net is not evidence of no connection. The read may not have covered the far end, just as a partial index cannot prove a symbol is unreferenced. Rules use it as a negative guard, firing only where the read is known-complete. The relation is a projection over Nets() filtered on the external net attribute (netgraph.AttrExternal), so rows are 1:1 with flagged nets, and an empty result means the read is complete and the guard is a no-op.

Go projector

netExternalFacts in stdlib/relations/facts.go walks Model.Nets() and emits a row for each net whose Attributes[netgraph.AttrExternal] is "true". The netgraph solver (internal/netgraph/irout.go) stamps the attribute on a by-name net whose other ends may sit in unread files. It clears the attribute once a complete read resolves the net, and the net becomes global instead. One row per external net; empty when the read is complete.

Datalog

List every net the read flagged as a possible read gap:

net.external(?n) => ?n

Use it as a caveat filter to find single-connection nets that are genuinely single-pin, excluding the ones that only look isolated because the read did not cover their far end:

net.pin_count(?n, 1), not net.external(?n) => ?n