Partial

RFC 8654 - Extended Message Support for BGP

Every requirement this repository extracted from RFC 8654, the tests bound to it, and what a reader has verified about them. This summary is enrolled and gated by ./le rfc check.

Overview

Positive

what Ze has

Tested both ways75.0%9 of 12 gated MUSTs

a positive test proves Ze does what the requirement demands and a negative one proves it refuses what the requirement forbids

One polarity plus reason8.3%1 of 12 gated MUSTs

the requirement admits no counter-case, so one polarity plus a recorded reason is the whole proof available for it

One polarity, unexcused0.0%0 of 12 gated MUSTs

one direction is tested, the other is neither tested nor excused, and nothing states which

Partial proof; remaining gap0.0%0 of 12 gated MUSTs

scoped tests exist; the remaining obligation is unmet or unproven, with zero whole-requirement credit

No test at all0.0%0 of 12 gated MUSTs

no test carries the requirement id, whether or not a gap states why

Proven by a recorded break62.5%40 of 64 tagged units, 0 escaped and 2 lapsed

a red was observed once under a recorded procedure, and the unit, the claim and the producer it rested on still hash to what was recorded. The break is not re-run. A test pair is not a proof until one has been observed

Neutral

measures that are neither good news nor bad

Gated MUSTs12of 16 this summary declares

MUST-level requirements the gate HOLDS. A population, not a result: the shares beside it are what says how Ze stands

Out of scope2of 12 gated MUSTs

an obligation that does not bind Ze. A {not-applicable} annotation says it never bound; a {feature-declined} annotation says its condition is an optional feature Ze does not offer, and quotes the RFC sentence that makes it optional. Scope, not coverage: it stays in the denominator every share on this page is taken over

Not applicable16.7%2 of 12 gated MUSTs

a {not-applicable} annotation says the obligation does not bind Ze, so no test is owed for it. It stays in the denominator every share here is taken over

Met below Ze0.0%0 of 12 gated MUSTs

a {lower-layer} annotation says a layer under Ze performs the behavior, on state Ze installs into that layer, and names the producer that installs it. The obligation binds Ze and is met; Ze proves none of it, because its own boundary carries no value the behavior reads

Optional feature declined0.0%0 of 12 gated MUSTs

a {feature-declined} annotation says the obligation is conditional on a feature the RFC makes optional and Ze does not offer, and it quotes the sentence that makes it optional. The condition is false, so nothing is owed and nothing is missing. It stays in the denominator every share here is taken over

The 8 shares marked as a part above are the whole of the 12 gated MUSTs: they add to 100%. Proven by a recorded break is a share of TAGGED UNITS, a different population, so it is not one of them.

How to read the colors

A color names what the measure MEANS, not how well Ze scores on it. Green is a good outcome at any value, red is a bad one, and neither a population nor a scope count is an outcome, so both take no color. The number under the label is what says how far Ze has got.

CardTone hereWhy that color
Gated MUSTs neutral no color: a population is a scale, and a larger one is neither good news nor bad. It is the accounting total
Out of scope neutral no color: an obligation that never bound Ze is neither an achievement nor a failure, and counting it either way would be a claim
Tested both ways ok green at every value: a test pair is the outcome this gate exists to produce, and the share under the label is what says how far Ze has got
One polarity plus reason ok green at every value: where no counter-case exists, one polarity IS the complete answer, and a recorded reason is what the gate demands beside it
One polarity, unexcused ok green at zero, RED above it: half a proof with no reason for the other half
Partial proof; remaining gap ok green at zero, RED above it: a tested clause cannot prove the whole requirement
No test at all ok green at zero, RED above it: a binding obligation nothing exercises is a claim with nothing behind it, whether or not a reason is stated
Not applicable neutral no color: an obligation that never bound Ze is neither an achievement nor a failure, and counting it either way would be a claim
Met below Ze neutral no color: an obligation met below Ze is neither a test Ze wrote nor work Ze owes, and the two green shares above are what says how much Ze proves itself
Optional feature declined neutral no color: an obligation whose condition Ze never meets is neither an achievement nor a failure. The absent FEATURE is disclosed on the RFC's own status row, as an implementation gap a later scope decision can revisit
Proven by a recorded break ok green at every value: an observed break is the outcome the discrimination gate exists to produce. The denominator is TAGGED UNITS, not obligations, so this share is not one of the parts above
Audit verdicts warn RED on the first weak, wrong or unimplemented verdict, amber while a verdict is no longer current or a gated MUST is unjudged, green when every one is judged sound and current

At a glance

FieldValue
Public status Partial
Enrolment Enrolled
Requirements 16
Gated MUST-level 12
Not applicable, so out of scope 2
Declared gaps 0
Declared gaps a test demonstrates 0
Gated with no test 0
Nightly-only evidence 0
Test tags 64
Tagged units 64
Recorded audit verdicts 8
Discrimination records 42
Summary rfc/short/rfc8654.md
Requirement shard rfc/requirements/rfc8654.md
RFC text rfc/full/rfc8654.txt

Enrolment

Enrolled: Extended Message capability and framing are implemented in internal/component/bgp. Receive permission follows local advertisement; send permission follows peer advertisement. Tests exercise accumulation, RFC7606 discard and route removal, fatal-error cleanup and replacement-best delivery. These proofs do not establish every incorporated RFC obligation or the exact final route-owner release/admission ordering.

What the public ledger says

Status: Partial

What the ledger says is covered:

Directional Extended Message capability and 65535-byte receive limit after local advertisement.
What the ledger says remains Correction 2026-10-06: the earlier weak classification described incomplete tests, not an absent Extended Message implementation. Native host execution and independent rejudgment now support the repaired directional, accumulation, discard/removal and fatal-error replacement assertions. Exact last-owner release versus outbound advertisement admission remains unproven; the ledger separately reports unaudited obligations and missing discrimination records. This is not a whole-RFC conformance claim.

Coverage

BucketCountWhat it counts
Positive and negative tests 9 one part of the gated population
Annotated (including scoped evidence) 3 one part of the gated population
One polarity only 0 one part of the gated population
No test and no annotation 0 one part of the gated population
Partial proof; remaining gap (subset of annotated; zero whole-requirement credit) 0 an overlay: each of these is also counted by the part it falls in
Evidence that runs nightly only 0 an overlay: each of these is also counted by the part it falls in
Derived from other rows 0 outside the gated population: each asserts nothing and derives its state from the rows it names, which the parts above already count
Gated MUST-level requirements12every gated MUST falls in exactly one bucket above

Positive and negative tests (9): RFC8654-3-1, RFC8654-3-3, RFC8654-4-1, RFC8654-4-2, RFC8654-4-3, RFC8654-6-1, RFC8654-5-1, RFC8654-5-2, RFC8654-5-4

Annotated (including scoped evidence) (3): RFC8654-3-2, RFC8654-5-3, RFC8654-5-5

Requirements

RequirementLevelSectionTests
RFC8654-3-1Peers that wish to use the BGP Extended Message Capability MUST support error handling for BGP UPDATE messages per [RFC7606]. (§3)
MUST 3 - BGP Extended Message Capability
RFC8654-3-2The BGP Extended Message Capability is a new BGP capability [RFC5492] defined with Capability Code 6 (§3)
MUST 3 - BGP Extended Message Capability
positiveunit/verifyTestCapabilityCodeConstants
negativeno testno negative test

{single-polarity}: the capability-code assignment is a single fixed value, so the only falsifiable check is that CodeExtendedMessage encodes as 6; there is no distinct rejection behavior for a negative case to exercise

RFC8654-3-3The BGP Extended Message Capability is a new BGP capability [RFC5492] defined with Capability Code 6 and Capability Length 0. (§3)
MUST 3 - BGP Extended Message Capability
RFC8654-4-1An implementation that advertises the BGP Extended Message Capability MUST be capable of receiving a message with a length up to and including 65,535 octets (§4)
MUST 4 - Operation
positiveunit/verifyTestValidateLengthWithMax
negativeunit/verifyTestValidateLengthWithMax
positiveinterop/nightlycheckExtendedAsymmetricFRR
RFC8654-4-2Applications generating information that might be encapsulated within BGP messages MUST limit the size of their payload to take the maximum message size into account. (§4)
MUST 4 - Operation
RFC8654-4-3The BGP Extended Message Capability applies to all messages except for OPEN and KEEPALIVE messages. (§4)
MUST 4 - Operation
RFC8654-6-1[RFC4271] states "The value of the Length field MUST always be at least 19 and no greater than 4096." This document changes the latter number to 65,535 for all messages except for OPEN and KEEPALIVE messages. Section 6.1 of [RFC4271] specifies raising an error if the length of a message is over 4,096 octets. For all messages except for OPEN and KEEPALIVE messages, if the receiver has advertised the BGP Extended Message Capability, this document raises that limit to 65,535. (§6)
MUST 6 - Changes to RFC 4271
RFC8654-5-1A BGP speaker that has the ability to use BGP Extended Messages but has not advertised the BGP Extended Message Capability, presumably due to configuration, MUST NOT accept a BGP Extended Message. (§5)
MUST NOT 5 - Error Handling
positiveunit/verifyTestValidateLengthWithMax
negativeunit/verifyTestValidateLengthWithMax
negativeinterop/nightlycheckExtendedNeitherRejectFRR
negativeinterop/nightlycheckExtendedRemoteOnlyRejectFRR
RFC8654-5-2A speaker MUST NOT implement a more liberal policy accepting BGP Extended Messages (§5)
MUST NOT 5 - Error Handling
positiveunit/verifyTestValidateLengthWithMax
negativeunit/verifyTestValidateLengthWithMax
RFC8654-5-3However, if a NOTIFICATION is to be sent to a BGP speaker that has not advertised the BGP Extended Message Capability, the size of the message MUST NOT exceed 4,096 octets. (§5)
MUST NOT 5 - Error Handling
positiveno testno positive test
negativeno testno negative test

{not-applicable}: ze never generates a NOTIFICATION near 4096 octets -- notification.go:191 sizes it as 19 + 2 + len(Data) and the Administrative Shutdown Communication is truncated to 128 octets (internal/component/bgp/message/notification.go:311-313), so there is no over-4096 NOTIFICATION code path to cap

RFC8654-5-4Similarly, any speaker that treats an improper BGP Extended Message as a fatal error MUST follow the error-handling procedures of [RFC4271]. (§5)
MUST 5 - Error Handling
RFC8654-5-5Future protocol specifications MUST describe how to handle peers that can only accommodate 4,096 octet messages. (§5)
MUST 5 - Error Handling
positiveno testno positive test
negativeno testno negative test

{not-applicable}: this obligation binds the author of a specification that defines a new BGP message type to state its extended-message eligibility; it is not a runtime behavior ze implements

RFC8654-4-4A BGP speaker that is capable of receiving BGP Extended Messages SHOULD advertise the BGP Extended Message Capability to its peers using BGP Capabilities Advertisement [RFC5492]. (§4)
SHOULD 4 - Operation
positiveno testno positive test
negativeno testno negative test
RFC8654-4-5When propagating that UPDATE onward to a neighbor that has not advertised the BGP Extended Message Capability, the speaker SHOULD try to reduce the outgoing message size by removing attributes eligible under the "attribute discard" approach of [RFC7606]. (§4)
SHOULD 4 - Operation
positiveno testno positive test
negativeno testno negative test
RFC8654-5-6BGP protocol developers and implementers are conservative in their application and use of BGP Extended Messages (§5)
RECOMMENDED 5 - Error Handling
positiveno testno positive test
negativeno testno negative test
RFC8654-4-6A BGP speaker MAY send BGP Extended Messages to a peer only if the BGP Extended Message Capability was received from that peer (§4)
MAY 4 - Operation
positiveinterop/nightlycheckExtendedAsymmetricFRR
negativeinterop/nightlycheckExtendedSendDeniedFRR

Gaps and untested MUSTs

RequirementStateReason
RFC8654-5-3 However, if a NOTIFICATION is to be sent to a BGP speaker that has not advertised the BGP Extended Message Capability, the size of the message MUST NOT exceed 4,096 octets. (§5) no test no test carries this requirement id; annotated {not-applicable}: ze never generates a NOTIFICATION near 4096 octets -- notification.go:191 sizes it as 19 + 2 + len(Data) and the Administrative Shutdown Communication is truncated to 128 octets (internal/component/bgp/message/notification.go:311-313), so there is no over-4096 NOTIFICATION code path to cap
RFC8654-5-5 Future protocol specifications MUST describe how to handle peers that can only accommodate 4,096 octet messages. (§5) no test no test carries this requirement id; annotated {not-applicable}: this obligation binds the author of a specification that defines a new BGP message type to state its extended-message eligibility; it is not a runtime behavior ze implements

Proof state

A tagged unit reads unproven where no discrimination record exists for it: nothing in this tree has been observed to break it, so the claim its tag makes is unproven.

RFC8654-3-1

Peers that wish to use the BGP Extended Message Capability MUST support error handling for BGP UPDATE messages per [RFC7606]. (§3)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Re-judged 2026-10-12 (independent auditor) after owner-approved lint-only edits in 96ec49327b and 4e731b2d96; the row text is unchanged and each changed unit was re-read diff by diff. The units build attribute blocks with slices.Concat instead of append onto fatalLengthAnnouncement().PathAttributes; the bytes are identical and a fresh slice removes any aliasing. No assertion changed. Verdict stands. Independent whole-composition rejudgment, 2026-10-09, after the direct change to TestRFC8654TreatAsWithdrawRemovesInstalledRoutes. RFC 8654 Section 3, rfc/full/rfc8654.txt:109-110: 'Peers that wish to use the BGP Extended Message Capability MUST support error handling for BGP UPDATE messages per [RFC7606].' This retains the prior composed receive-error-handling judgment, not a substitution of one ORIGIN case for all RFC 7606 obligations. Read the covering extended-message and forward-handle architecture documents, the unqualified summary row and derived ledger, the prior canonical composition, all eight distinct tagged test functions (fourteen tag carriers), the common classification/enforcement/synthesis producers, and the relevant RIB publication producers. No partial, gap or single-polarity annotation narrows this row. Obligation: RFC 7606 Section 2 requires actual removal of every contained route from Adj-RIB-In, not suppression of the malformed UPDATE; Section 7.1 says 'An UPDATE message with a malformed ORIGIN attribute SHALL be handled using the approach of treat-as-withdraw.' The changed test first installs both prefixes from an exactly 4097-octet UPDATE into real source storage and Loc-RIB and observes downstream announcements. It changes only ORIGIN to 3, then requires both routes absent from actual storage and Loc-RIB and both withdrawals on recipient TCP while retaining the source peer storage. Recovery reuses the same 4097-octet buffer, changing ORIGIN to 1 and MED to 17: both stored routes must contain those exact values, both prefixes must reach recipient TCP with each exact attribute, both actual Loc-RIB publications must carry Best.Metric 17, and both final selected paths must have Metric 17. Same Session identity, Established state and no source NOTIFICATION remain mandatory. Initial ORIGIN 0/MED 0 cannot satisfy the recovery assertions. Isolation/discrimination: the invalid frame is a clone differing only in ORIGIN; suppression of withdrawal, partial removal, session reset, lost recovery, stale attributes or stale selected metric fails a concrete assertion. The optional Forward handle is not an RFC obligation: rib_structured.go::handleReceivedStructured inserts routes before per-prefix election; rib_aigp.go::reselectAIGPRoutes elects stored routes with nil forward; rib_bestchange.go::checkRouteBestChange maps MED to Path.Metric; locrib/manager.go::insert does not dispatch an identical Path. This establishes a source-permitted nil-forward interleaving, not a runtime trace of that interleaving. The new oracle observes the selected-path contract without weakening the required route/wire outcomes. Whole composition retained: the structural validator pair requires exact None versus TreatAsWithdraw/COMMUNITY/Section 4; the session carrier distinguishes 1100-route withdrawal from unlocatable-section reset with exact NOTIFICATION 3/1 and zero dispatch; valid/malformed ATOMIC_AGGREGATE and AGGREGATOR controls require actual discard and continued delivery through both readers; duplicate recognized/unrecognized attributes require exact keep-first output, while duplicate MP attributes require reset and no additional dispatch; the two-family installed-route carrier requires primary and extra-family removal/recipient withdrawal, an unrelated survivor and same-session recovery. These compose with the previously reviewed clause-specific RFC 7606 controls, typed-family and ADD-PATH handling, original-message ordinary/coalesced standard/extended validation, diagnostic wire/NLRI controls, and late-first-AS/late-tunnel empty-MP versus reachable-NLRI matrices. The latter retain exact reset/Idle/connection closure/zero dispatch for errors without reachable NLRI, exact withdrawals without reset for reachable counterparts, valid-input acceptance and diagnostic silence, and exact original header-inclusive diagnostic hex. ATTR_SET and empty-MP corrections remain RFC-backed, not weakened expectations. Runtime evidence: job-rfc8654-recovery-causal-oracle-native-records-ffdb06d6.log records both renewed polarities using session_validation.go::applyRFC7606 replaced by a panic; both named broken runs fail at initial route installation. discriminate_observe.go::observationRunner.requireCleanGreen first requires the unbroken selected unit to pass and then proves producer coverage, so each successful record also establishes a clean selected-unit baseline. The halt proves dependence on applyRFC7606 only; it does not selectively discriminate recovery attributes, metric publication, withdrawal semantics, or the whole sentence. Prior accepted runtime observations remain the canonical note's late-first-AS, corrected admission and late-tunnel jobs; they are not newly rerun here. Implemented-and-tested: the composed error-action, dispatch, installed-route, wire, selected-path and diagnostic assertions above. Implemented-but-unverified by this renewal: fresh full-reactor race20 acceptance and selective recovery-semantic mutation discrimination; neither is claimed complete. No absent error-handling feature or newly unproven clause within the previously accepted receive composition was identified by this scoped rejudgment. Exact final route-owner release versus outbound admission remains the separately disclosed ownership proof gap, not established by this test or verdict; parent/child specifications, publication and remaining runtime acceptance stay open. This is not a whole-RFC conformance claim and does not absorb unrelated deterministic-audit findings or owner-approved persist retirement.

PolarityTestKind and tierProof state
negative TestRFC7606AttributeLengthConflictTreatAsWithdraw unit/verify revert, producer-changed (the producer's behavior changed since the break was applied to it)
negative TestRFC8654ExtendedTwoFamilyWithdrawalRecovery unit/verify revert, verified
negative TestRFC8654TreatAsWithdrawRemovesInstalledRoutes unit/verify revert, verified
negative TestRFC8654ExtendedAttributeDiscard unit/verify revert, verified
negative TestRFC8654ExtendedDuplicateAttributes unit/verify revert, verified
negative TestRFC8654ExtendedDuplicateMPResets unit/verify revert, verified
negative TestRFC8654ExtendedMessageSessionUsesRFC7606ErrorHandling unit/verify revert, verified
positive TestRFC7606MPReachNLRIConsistentWithAFISAFIAccepted unit/verify revert, producer-changed (the producer's behavior changed since the break was applied to it)
positive TestRFC8654ExtendedTwoFamilyWithdrawalRecovery unit/verify revert, verified
positive TestRFC8654TreatAsWithdrawRemovesInstalledRoutes unit/verify revert, verified
positive TestRFC8654ExtendedAttributeDiscard unit/verify revert, verified
positive TestRFC8654ExtendedDuplicateAttributes unit/verify revert, verified
positive TestRFC8654ExtendedDuplicateMPResets unit/verify revert, verified
positive TestRFC8654ExtendedMessageSessionUsesRFC7606ErrorHandling unit/verify revert, verified

RFC8654-3-2

The BGP Extended Message Capability is a new BGP capability [RFC5492] defined with Capability Code 6 (§3)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Code 6 is the whole obligation; row single-polarity positive (a fixed code has no refusal form). TestRFC8654ExtendedMessageWireIsCode6Length0 reads the octet WriteTo puts at a non-zero offset (06), Code()==6, and Parse(06 00) yields *ExtendedMessage: a code drift in WriteTo or in Parse's dispatch goes red. The old TestCapabilityCodeConstants tag (constant only) is supplementary. Judge 2026-09-30.

PolarityTestKind and tierProof state
positive TestCapabilityCodeConstants unit/verify unproven
positive TestRFC8654ExtendedMessageWireIsCode6Length0 unit/verify revert, verified

RFC8654-3-3

The BGP Extended Message Capability is a new BGP capability [RFC5492] defined with Capability Code 6 and Capability Length 0. (§3)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Positive: WriteTo writes exactly 06 00 with Len 2 and nothing beyond, Parse(06 00) accepted. Negative: TestRFC8654ExtendedMessageNonZeroLengthRefused sends code 6 with length 1 and 4 and requires ErrInvalidLength and no capability. Judge break: parseZeroLengthCapability accepting a non-zero length (len>8 guard) turned the negative red. Single-polarity marker removal is correct: a refusal path exists.

PolarityTestKind and tierProof state
negative TestRFC8654ExtendedMessageNonZeroLengthRefused unit/verify revert, verified
positive TestCapabilityRoundTrip unit/verify unproven
positive TestRFC8654ExtendedMessageWireIsCode6Length0 unit/verify revert, verified

RFC8654-4-1

An implementation that advertises the BGP Extended Message Capability MUST be capable of receiving a message with a length up to and including 65,535 octets (§4)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
negative TestValidateLengthWithMax unit/verify unproven
positive TestValidateLengthWithMax unit/verify unproven
positive TestRFC8654ReceiveLimitFollowsLocalOPEN unit/verify revert, verified
positive checkExtendedAsymmetricFRR interop/nightly revert, verified

RFC8654-4-2

Applications generating information that might be encapsulated within BGP messages MUST limit the size of their payload to take the maximum message size into account. (§4)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Non-compliant: an UPDATE on the wire larger than the negotiated maximum. TestSendUpdateWithSplitBoundsAnOversizePayload drives Peer.sendUpdateWithSplit with an over-4096 payload to a non-extended peer and asserts every wire frame length <= 4096 with the NLRI preserved; TestSendUpdateWithSplitTracksTheNegotiatedMaximum asserts the bound is 65535 when negotiated; BuildUnicastWithMaxSize refuses an oversize build (ErrUpdateTooLarge). Both polarities.

PolarityTestKind and tierProof state
negative TestBuildUnicast_MaxSize_TooLarge unit/verify unproven
negative TestSendPluginRoutesBoundsAnOversizeGroup unit/verify unproven
negative TestSendUpdateWithSplitBoundsAnOversizePayload unit/verify unproven
positive TestSplitUpdate_VPNChunksFitMaxMessageSize unit/verify revert, verified
positive TestBuildUnicast_MaxSize_Fits unit/verify unproven
positive TestSendPluginRoutesLeavesAFittingGroupWhole unit/verify unproven
positive TestSendPluginRoutesTracksTheNegotiatedMaximum unit/verify unproven
positive TestSendUpdateWithSplitLeavesAFittingPayloadWhole unit/verify unproven
positive TestSendUpdateWithSplitTracksTheNegotiatedMaximum unit/verify unproven

RFC8654-4-3

The BGP Extended Message Capability applies to all messages except for OPEN and KEEPALIVE messages. (§4)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Prior independent judgment retained after scope comparison, not gratuitously re-audited. The complete Section 4 exception sentence and tagged units are unchanged: TestMaxMessageLength, TestValidateLengthWithMax, and TestRFC8654AdvertisementDoesNotExtendControlBounds. The directional test file gained an import and sibling accumulation unit; its control-bound unit is unchanged in the scoped diff. OPEN 4097 and KEEPALIVE 20 still require exact NOTIFICATION 1/2 in both readers, while valid controls and all supported type maxima are pinned. No new foreign execution or canonical fingerprint computation is claimed. The parent stamping tool must compute current unit/file hashes.

PolarityTestKind and tierProof state
negative TestValidateLengthWithMax unit/verify unproven
negative TestRFC8654AdvertisementDoesNotExtendControlBounds unit/verify revert, verified
positive TestMaxMessageLength unit/verify unproven

RFC8654-6-1

[RFC4271] states "The value of the Length field MUST always be at least 19 and no greater than 4096." This document changes the latter number to 65,535 for all messages except for OPEN and KEEPALIVE messages. Section 6.1 of [RFC4271] specifies raising an error if the length of a message is over 4,096 octets. For all messages except for OPEN and KEEPALIVE messages, if the receiver has advertised the BGP Extended Message Capability, this document raises that limit to 65,535. (§6)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Both Section 6 paragraphs are retained: common header minimum, the raised maximum only after local capability advertisement, and OPEN/KEEPALIVE exceptions; header controls assert per-type limits, invalid lengths, OPEN refusal above 4096 and KEEPALIVE refusal at 20, while capability tests distinguish receive and send permission for all four advertisement combinations; ReceiveLimitFollowsLocalOPEN exchanges actual OPENs and drives both readers at 4096, 4097 and 65535, requiring exact complete dispatched payloads or NOTIFICATION 1/2 with erroneous Length and no dispatch; AnnouncementAccumulation uses individually standard-sized inputs to isolate batching capacity and asserts exact consumer batches beyond 4096 through 65535, overflow/KEEPALIVE flushing and standard-sized batching without local advertisement; current source uses the directional receive permission for buffers and header admission, and existing TestValidateLengthWithMax binding omissions are standing metadata debt rather than a new source or semantic gap

PolarityTestKind and tierProof state
negative TestValidateLengthWithMax unit/verify unproven
negative TestRFC8654LengthBoundsPerTypeAndCapability unit/verify revert, verified
negative TestRFC8654AnnouncementAccumulation unit/verify revert, verified
negative TestRFC8654ReceiveLimitFollowsLocalOPEN unit/verify revert, verified
negative TestRFC8654ExtendedMessageDirections unit/verify revert, verified
positive TestValidateLengthWithMax unit/verify unproven
positive TestRFC8654LengthBoundsPerTypeAndCapability unit/verify revert, verified
positive TestRFC8654AnnouncementAccumulation unit/verify revert, verified
positive TestRFC8654ReceiveLimitFollowsLocalOPEN unit/verify revert, verified
positive TestRFC8654ExtendedMessageDirections unit/verify revert, verified

RFC8654-5-1

A BGP speaker that has the ability to use BGP Extended Messages but has not advertised the BGP Extended Message Capability, presumably due to configuration, MUST NOT accept a BGP Extended Message. (§5)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Re-judged 2026-10-18 (independent auditor) after 5252a8d5f7 changed the cited producer negotiateWith. RFC 8654 Section 5 (rfc/full/rfc8654.txt): "A BGP speaker that has the ability to use BGP Extended Messages but has not advertised the BGP Extended Message Capability, presumably due to configuration, MUST NOT accept a BGP Extended Message." The only change to negotiateWith is one added call, s.retainAdvertisedLLGR(localCaps), under writeMu after the Role scan: it writes Session.localLLGR alone and reads nothing the extended-message path uses. Negotiate is still computed under mu before writeMu, s.extendedMessage is still set from negotiated.ExtendedMessageRecv, and writeBuf.Resize still follows ExtendedMessageSend, so the receive admission the tests pin is unchanged. Every tagged unit is byte-identical to the earlier judgement: TestRFC8654ReceiveLimitFollowsLocalOPEN exchanges actual OPENs for all four local/peer combinations at Length 4096, 4097 and 65535, requiring rejection with NOTIFICATION 1/2 carrying the offending Length and zero dispatch when Ze did not advertise the capability, with local-only advertisement as the accepting control; TestValidateLengthWithMax pins the header bound both ways; the FRR carriers checkExtendedNeitherRejectFRR and checkExtendedRemoteOnlyRejectFRR require a real oversized FRR UPDATE refused with the exact NOTIFICATION. Their current execution is parent-owned and not inferred here. Verdict stands.

PolarityTestKind and tierProof state
negative TestValidateLengthWithMax unit/verify unproven
negative TestRFC8654ReceiveLimitFollowsLocalOPEN unit/verify revert, verified
negative checkExtendedNeitherRejectFRR interop/nightly revert, verified
negative checkExtendedRemoteOnlyRejectFRR interop/nightly revert, verified
positive TestValidateLengthWithMax unit/verify unproven
positive TestRFC8654ReceiveLimitFollowsLocalOPEN unit/verify revert, verified

RFC8654-5-2

A speaker MUST NOT implement a more liberal policy accepting BGP Extended Messages (§5)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
negative TestValidateLengthWithMax unit/verify unproven
positive TestValidateLengthWithMax unit/verify unproven

RFC8654-5-3

However, if a NOTIFICATION is to be sent to a BGP speaker that has not advertised the BGP Extended Message Capability, the size of the message MUST NOT exceed 4,096 octets. (§5)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC8654-5-3, so no unit is bound to it.

RFC8654-5-4

Similarly, any speaker that treats an improper BGP Extended Message as a fatal error MUST follow the error-handling procedures of [RFC4271]. (§5)

Audit verdict: enforced (the tests do what the requirement demands), fresh. Re-judged 2026-10-19 (independent auditor, after e30abc5e48). RFC 8654 Section 5: "Similarly, any speaker that treats an improper BGP Extended Message as a fatal error MUST follow the error-handling procedures of [RFC4271]." e30abc5e48 rewrites departure recovery (oweDeparture owes only keys whose adj-out entry the departed source owns through a non-current session; departedOwner decides it) and, with owner approval recorded in the commit (2026-10-18), narrows TestRFC8654FatalLengthReelectsAlternateBest: it no longer requires the alternate to be re-advertised after the fatal header, and instead requires, before the fatal event, that the recipient already holds the alternate's own AS_PATH and NEXT_HOP 192.0.2.3, and after it that nothing carrying the alternate's AS_PATH is re-sent, the route with no survivor is withdrawn, the surviving prefix is never withdrawn, Loc-RIB shows exactly one ChangeUpdate and the alternate's stored attributes are exact. This matches RFC 4271 behaviour: the recipient's last UPDATE for that prefix already advertises the alternate, so re-election changes nothing it must be told. Independent overlay mutant (HEAD baseline for foreign dirty files, tags ze_core ze_bgp): disabling the departedOwner test in oweDeparture (owe every key) turned the unit red at the new assertion ("Should be zero, but was 1"); baseline green. So the narrowed claim is discriminated by the deciding logic, beyond the recorded readAndProcessCoalesced halt (reach only). The other tagged units (NOTIFICATION 1/2 with Length 0x1001 then EOF, resource release, valid-4096 retention) were not touched by the commit. Verdict holds over the narrowed claim; the re-advertisement of a changed best to a recipient that does not already hold it is no longer asserted by this row's tests.

PolarityTestKind and tierProof state
negative TestValidateLengthWithMax unit/verify unproven
negative TestRFC8654LengthBoundsPerTypeAndCapability unit/verify revert, verified
negative TestRFC8654OverLengthUpdateFollowsRFC4271ErrorHandling unit/verify revert, verified
negative TestRFC8654ValidLengthRetainsInstalledRoutes unit/verify revert, verified
positive TestValidateLengthWithMax unit/verify unproven
positive TestRFC8654FatalLengthReleasesInstalledRoutes unit/verify revert, verified
positive TestRFC8654FatalLengthReelectsAlternateBest unit/verify revert, verified

RFC8654-5-5

Future protocol specifications MUST describe how to handle peers that can only accommodate 4,096 octet messages. (§5)

Audit verdict: not audited: no reader has judged these tests

No test carries RFC8654-5-5, so no unit is bound to it.

RFC8654-4-6

A BGP speaker MAY send BGP Extended Messages to a peer only if the BGP Extended Message Capability was received from that peer (§4)

Audit verdict: not audited: no reader has judged these tests

PolarityTestKind and tierProof state
negative TestRFC8654SendLimitFollowsPeerOPEN unit/verify revert, verified
negative checkExtendedSendDeniedFRR interop/nightly revert, verified
positive TestRFC8654SendLimitFollowsPeerOPEN unit/verify revert, verified
positive checkExtendedAsymmetricFRR interop/nightly revert, verified

Extraction sign-off

FieldValue
Reviewer ze-work agent, spec-rfcgate-6 phase 5, rfc8654
Signed off 2026-08-31
Register prose
Source rfc/full/rfc8654.txt
Source fingerprint b14e6e2fbf6eafd8
Record rfc/extraction/rfc8654.json
Mapped sentences 9
Declined as scope 5
Relocated to a spec, which Ze OWES 0
Unclassified 0

Sections

SectionNameSitesDispositionReason
front not stated 1 skipped (front-matter) Title block, Abstract, Status of This Memo, Copyright Notice and Table of Contents. The Abstract restates section 1. Its one site is the IETF Trust Legal Provisions sentence, excluded below.
1 Introduction 0 walked Introduction. Indicative prose: RFC 4271 mandates 4,096 octets, new AFIs, SAFIs and capabilities need more, and this document raises the limit to 65,535 octets for every message except OPEN and KEEPALIVE. No sentence directs a speaker.
1.1 Requirements Language 0 walked Requirements Language. The BCP 14 key-words paragraph, which states that the key words bind when, and only when, they appear in all capitals. It tells a reader how to read the other sections and binds no speaker, which is why the derivation excludes it from the site inventory. It is also what makes the lowercase modals in sections 4 and 8 non-normative in this document.
2 BGP Extended Message 0 walked BGP Extended Message. Definitions only: a message over 4,096 octets is a BGP Extended Message, extended messages have a maximum size of 65,535 octets, and the smallest message is a 19-octet KEEPALIVE. Stated indicatively, so under section 1.1 it carries no RFC 2119 level. The 65,535 and 19 octet bounds are carried normatively by site 6:1, which maps RFC8654-6-1, and by the Wire Formats and Constants tables of rfc/short/rfc8654.md.
3 BGP Extended Message Capability 1 walked BGP Extended Message Capability. Its one capitalised site is the RFC 7606 error-handling prerequisite, mapped below to RFC8654-3-1. The rest is value assignment and description: Capability Code 6, Capability Length 0, how a speaker advertises it with RFC 5492, and what advertising conveys. Those are indicative, so the two wire-value obligations the summary declares from them are the unsourced ids below.
4 Operation 5 walked Operation. Two capitalised MUST-level sites, mapped below to RFC8654-4-1 and RFC8654-4-2. Its three remaining sites carry lowercase modals that section 1.1 gives no normative level, and each is excluded below. The section's other directives are the SHOULD to advertise the capability, the SHOULD to try attribute discard when propagating to a peer that did not advertise it, the MAY that permits sending an extended message only to a peer the capability was received from, and the scoping sentence that the capability applies to all messages except OPEN and KEEPALIVE; the summary declares those as the unsourced ids below. The sentence stating that a listener which has not advertised the capability will generate a NOTIFICATION with Bad Message Length is written in the indicative future and cites RFC 4271 Section 6.1 for the subcode, so the site scan cannot see it; rfc/short/rfc8654.md carries it in its Errors list and in the Error Handling table.
5 Error Handling 5 walked Error Handling. The document's densest normative section: five capitalised MUST-level sites, all mapped below to RFC8654-5-1 through RFC8654-5-5. Its one advisory, the RECOMMENDED that developers and implementers are conservative in their use of extended messages, is the unsourced id below. The sentence stating that UPDATE error handling per RFC 4271 Section 6.3 is unchanged is indicative and adds no obligation.
6 Changes to RFC 4271 1 walked Changes to RFC 4271. Its one site quotes the RFC 4271 Length-field MUST and states the change to 65,535, mapped below to RFC8654-6-1. Its second paragraph restates the same change against RFC 4271 Section 6.1 in the indicative and adds no separate obligation.
7 IANA Considerations 0 skipped (iana) IANA Considerations. Records the allocation of value 6, "BGP Extended Message", in the "Capability Codes" registry. Binds IANA, not a speaker; the wire value itself is RFC8654-3-2.
8 Security Considerations 1 walked Security Considerations. States that the extension does not change BGP's underlying security issues, that buffering 65,535-octet messages increases exposure to resource exhaustion, and lists three consequences of reducing an outgoing message for a peer that does not support extended messages. Its one site is the RFC 7606 eligibility criterion for attribute discard, excluded below. No countermeasure is directed at a speaker.
9 References heading 0 skipped (references) References heading.
9.1 not stated 0 skipped (references) Normative References: RFC 2119, RFC 4271, RFC 5492, RFC 7606, RFC 8174.
9.2 Informative References: RFC 4272, RFC 7752, RFC 8205 0 skipped (references) Informative References: RFC 4272, RFC 7752, RFC 8205.

Excluded sentences

SiteExcluded kindReasonQuote
front:1 not-a-requirement
never bound Ze
the sentence states a fact or describes another document, and directs no implementation
Boilerplate the extractor did not strip: the IETF Trust Legal Provisions paragraph of the Copyright Notice. It states a licensing condition on code extracted from the document text and directs no protocol behavior at a BGP speaker. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
4:3 cross-document
never bound Ze
the obligation belongs to another document that this one only cites
The obligation belongs to RFC 4271 Section 9.2, which the sentence cites as its authority. RFC 8654 raises the Length ceiling only for a neighbor that advertised the capability, so for a neighbor that did not, RFC 4271's own 4,096-octet limit is what forbids the send. The modal is lowercase, which section 1.1 gives no RFC 2119 level in this document. If the message is still too big, then it must not be sent to the neighbor ([RFC4271], Section 9.2).
4:4 cross-document
never bound Ze
the obligation belongs to another document that this one only cites
The obligation belongs to RFC 4271 Section 9.1.3, which the sentence cites: withdrawing a route that can no longer be advertised is the Update-Send Process's own rule, not a new one this document states. The modal is lowercase, which section 1.1 gives no RFC 2119 level in this document. Additionally, if the NLRI was previously advertised to that peer, it must be withdrawn from service ([RFC4271], Section 9.1.3).
4:5 binds-another-role
never bound Ze
the obligation is addressed to a role Ze never acts as
Presumed wrong until justified: Ze rarely implements one side of a protocol, so the reason beside this row must name the role, show Ze never acts as it, and cite the producer that would.
The role is the AS operator, not a BGP speaker. The paragraph's own next sentences name that role: a consistent view is guaranteed only if all the iBGP speakers advertise the capability, and if that is not the case "the operator should consider whether or not" to advertise it to external peers. It is a deployment judgement about which speakers are configured to advertise, and no code path in a speaker can carry it. The role is the AS operator, so no producer could act as it. Ze CONSUMES the operator's decision: the capability is negotiated per session in the reactor (`internal/component/bgp/reactor`), which advertises what it is configured to and decides no AS-wide policy. If an Autonomous System (AS) has multiple internal BGP speakers and also has multiple external BGP neighbors, care must be taken to ensure a consistent view within the AS in order to present a consistent external view.
8:1 cross-document
never bound Ze
the obligation belongs to another document that this one only cites
Eligibility for attribute discard is defined by RFC 7606, which the sentence cites. This sentence restates that criterion inside a security note about the consequence of discarding, and its modal is lowercase, which section 1.1 gives no RFC 2119 level in this document. The attributes eligible under the "attribute discard" approach must have no effect on route selection or installation [RFC7606].

Superseded

No document obsoletes RFC 8654, so its obligations are stated where they were written.