Skip to content

breaker: no protocol in kernel; the transport states its fault table, PIECE_END=128 rides the same framer lineage (row 66) - #561

Closed
MattJackson wants to merge 54 commits into
predevfrom
p2-breaker-neutral-ts
Closed

MattJackson wants to merge 54 commits into
predevfrom
p2-breaker-neutral-ts

Conversation

@MattJackson

Copy link
Copy Markdown
Collaborator

Row 66, "breaker: no protocol in kernel". The kernel's breaker no longer classifies from status bands or numberings. It reads the fault the transport states (and, since #489, the plane's), and adds one fact of its own: that no answer came.

Spec: docs/design/BUSBAR-1.6.0.md Part 0 (l.115-120: a transport may name only itself; l.3962: no transport names another), Part 2 #36 (busbar-kernel-breaker: trip, cooldown and fast-fail per pool and destination; the kernel names no protocol), Part 3 (the route pump: the breaker is the kernel walk's, and the breaker service classifies).

What changes

  • Transport fault ABI (busbar-contract):
    • FramePiece::fault takes the spare byte, so the piece size is unchanged.
    • FaultRow and TransportTail::fault_rows are appended to the tail. A tail that predates them reads its fault table as absent (TRANSPORT_TAIL_FROZEN).
    • check_fault_rows and check_fault_cover: a claim that states status rows must state fault rows, or the load is refused. Both have RED arms.
    • The layout golden and the C header are regenerated.
  • kernel-breaker:
    • classify.rs is Reading{NoAnswer, Answered(Option<WireFault>)} -> Disposition. HTTP_OVERLOADED/529, the gRPC status table, the HTTP bands, the context-length gate and the warn-once diagnostics are gone.
    • port.rs UpstreamStatus is {reading, retry_after}.
    • The crate names no plane, no header and no vendor. The kernel-breaker x plane row in kind-isolation is struck.
    • normalize.rs stays, marked NOT A BREAKER INPUT: only the retiring engines import it.
  • Walk and root: the far-end walk records from the reading. The root adapter reads Answered(fault), and reads NoAnswer only when there is neither a class nor a fault.
  • PIECE_END=128 (the PIECE-END lane's p2-piece-end, c52ba30, merged in whole): the stream's end is said, never an empty piece. check_framer rules, sdk_hyper Piece::end, connector Got.end.
  • Transports: one lineage carries the fault table and PIECE_END. Each repo's branch is p2-breaker-neutral-ts-pin = dev + p2-piece-end-b, repinned to busbar 2add33a:
  • The neutral frame door fixture states its fault table (claim 0, 1..=9 FAULT_CALLER), so it trips nothing, exactly as before.

Behaviour

1.5.5-identical. The http framer's fault table maps exactly onto the old bands:

  • 401/403: hard
  • 408/429 and 5xx (529 included): transient
  • other 4xx: caller
  • off-table: none, which reads as caller
  • no answer: network, which is transient

Proof (Latchkey, large)

  • Tests, unfiltered: kernel 3001, kernel-breaker 27, kernel-egress 128, contract 1250, connector 250, plugin-loader 701, busbar 845. The tcp/http/ws/grpc plugin cdylibs are built for the both-ways tests.
  • Lint: clippy -D warnings on the workspace with all targets, and fmt.
  • Kind-isolation: equal to predev. deps has the same 4 findings and test-deps the same 5, compared finding by finding; vocab has 0.
  • Oracle, strict against golden/1.5.5, 54 cells (route.529, route.failover, cooldown, crosscut.traps, billing, ledger, teller, concurrency):
  • Autobahn ws suite, strict: pass.

…(the breaker names no plane), so its row is struck
…e's spare byte, a per-claim fault table appended to the transport tail); the bands leave the breaker
…Row, TransportTail::fault_rows); fault-table validators and their RED arms
… arm at the walk: no reading records nothing)
…e fault table checks sit beside the upgrade/session lines at bind
…7bc8bf640d, grpc #7 7df33d19e2, ws #14 e00327bdc0)
…(four dependency edges leave; nothing re-resolved)
… byte of one built before it was named) reads as none; every stated reading round-trips
…door) on predev #480; its door is field 2

(cherry picked from commit 6340713)
…mpty text and binary pieces are messages (WIP, header regen pending)
…ect echoes empty messages in kind and never the end
Conflicts: Cargo.toml and Cargo.lock keep this branch's busbar-transport-tcp pin b3047ce874, which contains #502's eb334dd6e9 plus the tail's fault table; the neutral frame door fixture keeps this branch's FaultRow and FAULT_CALLER imports.
MattJackson added a commit that referenced this pull request Oct 12, 2026
… lane-p3-flip-a2a

- crates/busbar-kernel/tests/plane_driver.rs: both sides appended cells at the file's end; this
  branch's refused-piece cells and #778's unpresentable-credential cells are both kept.
- qa/kind-isolation.toml: #778 recorded the admin surface's test edges with the retiring engines as
  [[dep]] rows; the two A2A rows are struck (busbar-a2a is deleted). The [[law0]] rows take this
  tree's measure: busbar x plane 769, busbar x transport 184, core-admin x plane 50, kernel x plane
  1149. The standing `cleanliness -> legacy` finding is struck (#778's row records it).
- Scan floors re-armed at this tree's measure, each naming what FLIP-A2A deleted, against #778's
  measure at e846df4: population 948 -> 938, tracing 978 -> 968, seal-witness 2199 -> 2162,
  no-deferral 941 -> 930.
- Cargo.lock without busbar-a2a; the C header regenerated (`cargo xtask abi-header --write`), unchanged.
Conflict: crates/busbar-core-connector/src/tests/support.rs. The test framer keeps both knobs: this branch's scripted messages (PIECE_END) and predev's piece cap; the scripted arm runs first, else the frame is cut at the cap.
Conflict: docs/design/1.6.0-TODO.md. Predev's 2026-10-12 stock take replaces the PATH section; this branch's note (kernel breaker.rs and normalize.rs leave with D2, ARCHITECT breaker ruling Q2) is carried into its D2 sentence.
@MattJackson
MattJackson marked this pull request as ready for review October 12, 2026 21:51
@MattJackson
MattJackson marked this pull request as draft October 13, 2026 11:56
@MattJackson

Copy link
Copy Markdown
Collaborator Author

Marked draft: every change here is carried by #787 (verified: head/patches contained). Draft removes it from ModernCI's blocked-by set (ModernCI #292/#308) so #787 is judged on its own. It shows as merged once #787 lands.

MattJackson added a commit that referenced this pull request Oct 13, 2026
…; the breaker never reads it (ARCHITECT ruling on #787)

Predev's FLIP-LLM model egress runs 1.5.5's 429 rate-limit ladder and 4xx client-fault count on the numbered status; #561/#778 (row 66) had the port carry the fault reading in its place. Per the ruling (option a; the ABI carries the number beside the class, FrameMeta status_code, BUSBAR-1.6.0.md l.4036-4053) the egress port carries both:
- busbar-kernel-egress ports::UpstreamStatus gains code: Option<WireStatus> beside fault;
- the far end fills both (wire_code: predev's reserved-numbering rule), and a held relayed answer keeps its code beside the plane's reading;
- the kernel breaker still classifies from the fault reading alone; only root/model_egress.rs judge reads code;
- root adapters test the_breakers_classification_never_moves_with_the_number_beside_the_fault_reading pins row 66: a fixed class and fault reading classify the same whatever code says, in either reserved numbering or none.
MattJackson added a commit that referenced this pull request Oct 13, 2026
…es with no reading

#795 (on predev) wrote busbar-transport-webrtc against the transport ABI before row 66 (#561/#778), which appended TransportTail::fault_rows / fault_rows_len and gave FramePiece's spare byte to fault. The door's TAIL states no status rows, so it states the empty fault table (null, 0), as busbar-transport-stdio's carrier does; its pieces and the conformance test's host piece carry fault: 0 (FAULT_NONE) where _reserved was. No transport ABI version constant is declared in the crate.
MattJackson added a commit that referenced this pull request Oct 13, 2026
…D, never an empty piece

Row 66's contract (#561, busbar-contract abi/transport/mod.rs:58-64, PIECE_END at :451-456, check_framer at check.rs:256-265): a stream's frames end with their own empty piece carrying PIECE_END and PIECE_END_OF_FRAME; an EMPTY piece without it is an empty message. #795's door turned Event::ChannelClose (framing.rs) into an empty piece with PIECE_END_OF_FRAME, which the host now reads as an empty binary message, never the channel's end.
- framing::Piece states end; ChannelClose's piece sets it, every other piece does not;
- door::piece_flags states an end as PIECE_END | PIECE_END_OF_FRAME and nothing else; every other piece keeps its bits;
- src/tests/door_tests.rs: a closed channel's piece is the end by flag (never text, fields, failed or continued, which check_framer refuses beside an end), an empty binary or text message is a frame and not the end, and messages and field blocks keep their bits.
MattJackson added a commit that referenced this pull request Oct 14, 2026
…erged with predev (460be4d77d)

Drains: busbar x instance:secret 25 -> 22, busbar x plane 772 -> 770, busbar-kernel x plane 1100 -> 1099, busbar-kernel x transport 266 -> 220, busbar-kernel-breaker x plane 2 -> 0, busbar-kernel-breaker x transport 134 -> 1 (the #561/#778 breaker work this branch stacks on, row 66, and FLIP-A2A).

busbar-plugin-loader x instance:secret 21 -> 23 is a correction of the merge figure, not a rise: predev's -2 (#532, 40a4080) removed two `extern "C"` ABI strings (host_log_sink and its doc line) that this branch's scanner fix had already stopped counting, so the two drains overlap by those two; 23 is this branch's own pre-merge measure, and no hit was added.
Conflicts:
- Cargo.toml, Cargo.lock: busbar-transport-http pinned at a6e29e36da, the http dev commit that
  carries both sides: this branch's fault-table pin 2d1dbfdabf (the dev pin that drains tokio and
  hyper-util) and predev's a715d1ab57 (an IPv4 spelling is sent as the address it names). It is
  the pin #787 already carries over the same two. grpc 1303273a73, ws 2ec0786eba and tcp
  b3047ce874 each contain predev's pin (a5140eee3e, f8ba71d259, eb334dd6e9), so they stay.

The transport ABI over predev's new code:
- busbar-transport-webrtc (new on predev): its tail states no fault table (fault_rows null, as
  the byte-stream carrier's), its pieces name the fault byte where the padding was, and a closed
  data channel is the stream's END by flag (PIECE_END | PIECE_END_OF_FRAME), never an empty
  message; door_tests prove both. The connector datagram test builds its piece over a zeroed
  base. Same port #787 carries.
- Layout golden and C header: the textual merge equals the generator's output over the merged
  types (predev's OnPieceOut.tap_fault and this branch's FaultRow / TransportTail.fault_rows /
  FramePiece.fault are disjoint; 287 of 291 structures pinned).

qa/kind-isolation.toml law0: busbar-kernel-breaker x plane 2 -> 0 and x transport 134 -> 1, the
measure ModernCI took of this same breaker code in #787 (60dd171, 460be4d77d).
@MattJackson

Copy link
Copy Markdown
Collaborator Author

Closed: every commit of this PR is patch-identical to content that landed on predev in the wave-1 integration (predev 179abf2, lane-integration-w1b). Nothing remains to merge.

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