Skip to content

The pad: where a component's terminals become copper - #8369

Merged
briansrls merged 2 commits into
mainfrom
session/pcb-footprint
Aug 18, 2026
Merged

briansrls merged 2 commits into
mainfrom
session/pcb-footprint

Conversation

@briansrls

@briansrls briansrls commented Aug 17, 2026 •

Copy link
Copy Markdown
Contributor

Placement establishes where a component's body sits. Copper establishes which net is realized on which layer. Nothing joined them — no carrier said that this terminal of this component is a conductor at this coordinate on this layer.

That gap is why the plan view renders bodies and no traces, and it is measurable: zero occurrences of terminal anywhere in the Altra placement module. It also meant the board could not refuse the interesting way — a net whose members name terminals no pad realizes is unroutable, and the fact had no representation, so it could not be observed, counted, or refused.

The unit is the pad, not the pin number

A pin number is a vendor indexing convention that differs between the package drawing, the schematic symbol and the netlist, so comparing two of them by number is the spelling coincidence DESIGN section 3 forbids. A pad names the TerminalIdentity the connectivity model already uses, so "is this pad on that net" is the same decidable join the net relation performs.

Proven by sabotage, not asserted: replacing the component-qualified join with a terminal-identity-only comparison — exactly the pin-number comparison this module refuses — turns w_red_a_pad_on_another_component_does_not_satisfy_the_member FAIL while the positive case still passes.

A citation is required, not optional

Pad coordinates are a manufacturer's recommended land pattern. Authored without a source they are someone's recollection of a drawing, and a board built to them does not solder. An Absent arm would be an invitation to fill the gap from memory, so drawing_authority is plainly required with no legacy arm, and it names a resolvable symbol rather than a document title.

Refusals

Four, each counted and located: a net member with no pad (naming component and terminal, not just the net), two pads on one terminal, a pad selected against another board's stackup, and two footprints for one component. AdmittedFootprints is sole_constructor with one admit_callers-sealed mint.

Footprint admission is deliberately separate from copper's: it asks whether the roster can be routed at all; copper asks whether the conductors someone drew are consistent. Fusing them would make "there are no pads yet" indistinguishable from "the routing is wrong".

Verification

6 witnesses pass, 5 of them RED controls. Compile gate produces 32 hard diagnostics, all pre-existing in src/v2/lens/complexity_accumulator_copy/analyze.dag, none naming any file this change touches.

Stacked on #8363 — product.electrical.connectivity is its dependency.

@gunbai-bot gunbai-bot Bot changed the title mobo design scoping The pad: where a component's terminals become copper Aug 17, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 17, 2026 07:10
@gunbai-bot
gunbai-bot Bot marked this pull request as draft August 17, 2026 07:12
@gunbai-bot

gunbai-bot Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Moving this back to draft on my own judgement, not because of a defect in it.

The side-chat ruling reverses the order I proposed, and it is right. Pad, Footprint and their admission all carry NetIdentity, ComponentInstanceIdentity and TerminalIdentity, which are board-global branded strings today: VCC on one board is structurally the same net as VCC on another. The design-identity axis has to thread through every one of those carriers. Landing this first means adding construction sites that the identity migration then has to widen, which is the cost DESIGN section 3 prices when it says a replacement is planned from the root rather than by growing the old shape first.

So the order is: ELECTRICAL-DESIGN-IDENTITY-0 lands the board-scoped identities and the cross-board replay refusal, then this rebases onto them, then it grows the parts the ruling asks for and that this cut does not have — plated-hole and mechanical-hole distinct from SMT pad, pin-one and orientation standing, and admission against an exact board revision.

The second correction I am taking with it: this was authored as a carrier with every real component left pending, and the ruling is explicit that a footprint PR must establish at least one actual footprint in the real Altra world. It will not come back out of draft until it does.

— sent from zesty-heron-736

Brian Searls and others added 2 commits August 18, 2026 00:34
Placement establishes where a component's BODY sits. Copper establishes
which net is realized on which layer. Nothing joined them -- no carrier
said that THIS terminal of THIS component is a conductor at THIS coordinate
on THIS layer. That gap is why the plan view renders bodies and no traces,
and it is measurable: zero occurrences of 'terminal' anywhere in the Altra
placement module.

It also meant the board could not refuse the interesting way. A net whose
members name terminals no pad realizes is unroutable, and before this the
fact had no representation, so it could not be observed, counted or
refused.

THE UNIT IS THE PAD, NOT THE PIN NUMBER. A pin number is a vendor indexing
convention that differs between the package drawing, the schematic symbol
and the netlist, so comparing two of them by number is the spelling
coincidence DESIGN section 3 forbids. A pad names the TerminalIdentity the
connectivity model already uses, so 'is this pad on that net' is the same
decidable join the net relation performs.

Proven by sabotage rather than asserted: replacing the component-qualified
join with a terminal-identity-only comparison -- exactly the pin-number
comparison this module refuses -- turns
w_red_a_pad_on_another_component_does_not_satisfy_the_member FAIL while the
positive case still passes.

A CITATION IS REQUIRED, not optional. Pad coordinates are a manufacturer's
recommended land pattern; authored without a source they are someone's
recollection of a drawing and a board built to them does not solder. An
Absent arm would invite filling the gap from memory, so drawing_authority
is plainly required with no legacy arm, and it names a resolvable symbol
rather than a document title.

Four refusals, each counted and located: a net member with no pad (naming
component and terminal, not just the net), two pads on one terminal, a pad
selected against another board's stackup, and two footprints for one
component. AdmittedFootprints is sole_constructor with one admit_callers-
sealed mint.

Footprint admission is deliberately SEPARATE from copper's: it asks whether
the roster can be routed at all, copper asks whether the conductors someone
drew are consistent. Fusing them would make 'there are no pads yet'
indistinguishable from 'the routing is wrong'.

6 witnesses PASS (5 RED controls). Compile gate: 32 hard diagnostics, all
pre-existing, none naming any file this change touches.

Stacked on #8363 -- product.electrical.connectivity is its dependency.

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

#8372 made ComponentInstanceIdentity a design-scoped record, so this
branch's string casts stopped holding. The fixture now mints its component
identities against a fixture design, and component_has_duplicate_footprint
compares through component_identity_eq instead of casting both sides to
NonEmptyStr -- which is the same correction the design axis forced
everywhere else, and it means two boards' components with one local label
can no longer read as one duplicated footprint.

Reset onto main and cherry-picked this branch's own delta rather than
merging: #8363 and #8372 both squash-merged, so the stacked history's diff
against main had become a reversion of the work that just landed.

6 witnesses pass. Compile gate: 0 blocking errors.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot
gunbai-bot Bot force-pushed the session/pcb-footprint branch from 05dc9c1 to e9d0c25 Compare August 18, 2026 00:50
@briansrls
briansrls marked this pull request as ready for review August 18, 2026 01:50
@cursor

cursor Bot commented Aug 18, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@briansrls
briansrls merged commit ed3f64a into main Aug 18, 2026
0 of 2 checks passed
@briansrls
briansrls deleted the session/pcb-footprint branch August 18, 2026 01:51
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.

1 participant