Skip to content

row 68: the breaker reads a plane fault at the far end (stacked on #561) - #778

Draft
MattJackson wants to merge 82 commits into
predevfrom
lane-p2-breaker-plane-fault
Draft

MattJackson wants to merge 82 commits into
predevfrom
lane-p2-breaker-plane-fault

Conversation

@MattJackson

@MattJackson MattJackson commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Row 68: the breaker reads a plane fault at the far end.

Stacked on #561 (p2-breaker-neutral-ts, row 66), which itself carries #502. This branch is #561's head b50da73 plus this row's commits, with origin/predev merged in. The landing order is #502, then #561, then this PR. Once #561 lands, this PR's own diff is the row-68 commits alone.

Spec:

What changes

  • Contract:
    • FAULT_HEALTHY = 4 (WireFault::Healthy): the destination answered and is healthy, whatever the status. It is relayed as a caller's answer is and recorded as a success.
    • Both the plane checker and the transport checker accept it.
    • FaultRow may state it.
    • The transport SDK's Piece::fault lets a framer state its own reading of a piece over its fault table. An example is a bare HTTP answer on a gRPC call, which is read by its HTTP band.
  • kernel-breaker: classify_upstream records HEALTHY as Outcome::Success, labelled healthy. Every other reading keeps 1.5.5's four arms.
  • Far end:
    • FarEnd::judged(token, fault) is new. After the plane answers a FROM_FAR_END piece, the pump hands its reading to the far end, before the verdict acts.
    • A relayed non-success answer (a caller fault, a hard-down, a degraded dispatch, an at-most-once operation) is held unrecorded. The plane's first stated reading of it is the one recorded.
    • When the plane reads the last piece without stating a reading, or the unit drops first, the transport's reading is recorded instead.
    • A success's head and a failure the walk fails over are recorded at once, as before.
    • A passthrough member's hard reading is still the caller's key, so nothing is recorded.
    • Health probes (ARCHITECT ruling on row 68, Part 3 §12: a probe's answer is classified as organic traffic is): a probe's success is recorded at once. Any other probe answer waits for the plane's reading, the same way a relayed organic answer does. The plane's first stated reading is recorded on every cell of the member (Breaker::probed). When the plane states none, or the probe drops first, the transport's reading is recorded.
  • Root: the door's far end (DoorFar) hands the reading on to the walk.
  • Integration fixes from merging predev over breaker: no protocol in kernel; the transport states its fault table, PIECE_END=128 rides the same framer lineage (row 66) #561:
  • Pins: the C header is regenerated from the merged ABI. busbar-transport-grpc is pinned at b6b269d99d, which is 1303273a73 (breaker: no protocol in kernel; the transport states its fault table, PIECE_END=128 rides the same framer lineage (row 66) #561's pin) plus five commits: a bare HTTP status on a call is an answer, and its fault is read by its HTTP band (401/403 hard).

Behaviour

1.5.5-identical. No plane on predev states a fault reading, so every relayed answer is still recorded with the transport's reading, which is 1.5.5's table. The only change is when the record happens: at the answer's last piece rather than its head.

Not in this PR

TAIL_REFUSED_PIECE, ROUTE_SCOPE_LOCAL, wait_member and metric_lanes stay on the a2a lane. They were introduced there, in commits that also carry a2a door changes, and are not part of the plane fault reading.

Proof (M3 prover)

Run at 6ccde92. Only the last commit moved after the main run, and it touched plugin-loader's cfg gates alone.

  • Format and lint: cargo fmt --check is clean. cargo clippy --workspace --all-targets -D warnings is clean, and so is the scoped plugin-loader/connector run. cargo xtask abi-header is green.
  • Tests: cargo test -p busbar-contract -p busbar-kernel-breaker -p busbar-kernel-egress -p busbar-kernel -p busbar gave 5510 passed and 7 failed.
    • The 7 failures are environmental. Six root::serve::framed_tests need the neutral_frame_door example; with cargo build --workspace --examples they pass 8/8. ledger_identity needs a GitHub clone of the oracle engine, and the VM has no credentials.
    • The row-68 cells pass:
      • far_end: 45/45, including the_planes_transient_reading_outranks_the_transports_callers_fault, the_planes_callers_reading_outranks_the_transports_hard_down, a_502_the_plane_reads_healthy_records_success, a_502_with_no_plane_reading_falls_back_to_the_status_table, an_answer_the_plane_never_reads_is_recorded_with_the_transports_reading and a_failed_over_answer_is_recorded_at_once_with_the_transports_reading.
      • door_far_tests::the_planes_fault_reading_reaches_the_breaker_through_the_doors_far_end
      • breaker_unit_tests::six_healthy_502s_in_a_row_do_not_trip_a_cell
      • port::tests::a_healthy_reading_is_a_relayed_success
  • Probe ruling (c3259eb): the RED commit 36349ff alone fails a_probe_answer_the_plane_reads_healthy_records_success (a 502 read HEALTHY: success, the member recovers) and a_probe_answer_the_plane_reads_as_a_fault_records_that_fault (a 400 read TRANSIENT; a 502 read HARD). With the fix, plane_driver passes 117/117, including the existing probe cells and the new a_probe_answer_the_plane_states_no_reading_of_records_the_tables. cargo clippy -p busbar-kernel --all-targets -D warnings and cargo fmt --check are clean.
  • busbar-core-connector and busbar-plugin-loader: 1021 passed and 9 failed. All 9 are artifact preconditions of a scoped run, not logic: the request/response framer door, the busbar_secret_env_plugin cdylib and a tcp plugin cdylib built twice under two feature sets in one target dir.

…(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)
…ne-fault (#489): the plane's fault reading and the transport's share one FAULT_* vocabulary
…where it states one, the transport's otherwise (FarEnd::judged); tests both ways
… fault is recorded once the plane has read it
…t beside the transport's fault byte and fault table)
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.
door_clock's host tables: #502 (via predev) and this branch's e324c7f each added io: null; one is kept.
MattJackson added a commit that referenced this pull request Oct 12, 2026
…plane-dup armed at its measure, gRPC errors trailers-only as predev, the admin OpenAPI text restored

1. `header` in neutral crates (ARCHITECT ruling on #787; Part 2 #83, DoD item 6): the 1.5.5
   credential placement key stays byte-identical, ONE constant in busbar-contract
   (section::PLACEMENT_HEADER_KEY). kind-isolation reads a new `[[shape-word]]` table: a NAMED
   reservation of one spelling (its word, its file, the line its holder names: a `const <holder>:`
   in a .rs file, the object keyed "<holder>" in a .json file), never word-wide. Two rows: the
   contract constant and the config-schema snapshot's `manual-de CredentialPlacement`, each citing
   BUSBAR-1.6.0.md:2284 (#83) and :2020 (DoD 6). A second spelling still counts and a row that
   reserves nothing is RED (`shape-word-unused`); three selftest cases prove both. law0-base is back
   to #778's 25 hits over 4 cells.

2. structure-lint:plane-dup:unledgered ARMED at the measured 94 (Law 9): deleting the engine moved
   pre-existing door code into busbar-plane-a2a, where the scan sees it for the first time. Green at
   94, red above (a new plane-local copy) and below (a drain that did not lower the count). The
   reason and the drain (shared door scaffolding to busbar-plugin-sdk) are in the source; the
   standing red is struck. The plane-root selftest plants against the voice plane, the a2a plane
   being door-only now.

3. gRPC error before any message: 1.5.5 has no a2a plane (the published v1.5.5 binary refuses the
   `agents:` section), so the bytes are predev's, recorded on M3 off #778's subject: GetTask the
   agent refuses is ONE header block (:status 200, content-type: application/grpc, grpc-status: 5,
   grpc-message, grpc-status-details-bin, content-length: 0). The door's gRPC head states the line's
   media type, and the root answers a framed stream that closed before its first body byte whole:
   its head and the framer's closing block in one header block. Root cell
   a_grpc_call_refused_before_any_message_closes_trailers_only_as_predev pins it; the OK cell pins
   content-type: application/grpc.

4. The admin OpenAPI `A2aTrustView` description is predev's text again: the door's fragment is data
   (src/admin_openapi.json, the published bytes), and openapi.json / .gz are byte-identical to
   #778's. Every scan floor and the plane_isomorphism floor name what was deleted with the engine
   and the measures at #778's head (population 947 -> 937, seal-witness 2196 -> 2159, tracing
   977 -> 967, no-deferral 940 -> 929, isomorphism rows 21 -> 4).
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 added a commit that referenced this pull request Oct 12, 2026
Brings predev 561c69a (FLIP-LLM, #464) through #778. Conflicts, resolved in favour of predev's design with this branch's additions carried:
- kernel plane_driver far_end.rs: State keeps both the credential refusal and predev's failover word; the attempt counter is predev's degraded-aware count, stated with the plane's labels.
- plane_driver mod.rs: DriverSteps keeps counterparty and resolved beside predev's affinity, refused_words and attempting.
- plane_driver route.rs: predev's AttemptSteps bound and exhaustion detail; the exhaustion terminal still names BreakerOpen on the refused piece and takes the plane's stated wait.
- busbar serve.rs: predev's seal_live, with the plane's declared metric lanes set inside it; DoorFar keeps stated and member_wait beside predev's walk facts; the door-cells comment keeps naming no plane.
- busbar Cargo.toml and build.rs: door-cells and driver-proofs tables, both emitted.
- main.rs: DoorReach keeps the shared secret resolver; auths is predev's clone.
- secret_source.rs, kernel tests/plane_driver.rs: both sides kept.
- population 939, tracing 969, seal-witness 2177, no-deferral 931: the merged tree's measures.
@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 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).
…eaker-plane-fault

No conflicts. The base's merge of predev brings the http pin at a6e29e36da (this branch's fault
table and predev's IPv4 spelling) and the webrtc transport's port onto the fault ABI. This
branch's grpc pin b6b269d99d contains predev's a5140eee3e, so it stays; the four transport pins
now equal #787's. Layout golden and C header equal the generator's output over the merged types
(this branch's FAULT_HEALTHY over the base's FaultRow / FramePiece.fault, predev's
OnPieceOut.tap_fault). The breaker law0 rows (x plane 0, x transport 1) are ModernCI's measure of
this branch's breaker code inside #787.

This branch has not been deployed

No deployments
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