From abf574d9ba996dd37d194114f13645b25e6cf0b2 Mon Sep 17 00:00:00 2001 From: Eugene Dymo Date: Wed, 22 Jul 2026 12:56:26 +0200 Subject: [PATCH 1/2] chore(proto): drop pre-v1 reserved statements for Requester.billing_ref (RAMP-155) Pre-v1 the wire contract is not frozen and there are no released consumers to protect, so a removed field's number returns to the free pool instead of being reserved. Matches the earlier Transaction{Request,Response} change; `reserved` becomes the tool for field removals once v1.0.0 is tagged. The conformance pin keeps only the design invariant (Requester never regains a caller-written billing_ref field) and no longer freezes the field number. Co-Authored-By: Claude Fable 5 --- conformance/descriptor_invariants_test.go | 24 ++++++++-------------- docs/design-history.md | 3 ++- gen/descriptor.binpb | Bin 539688 -> 539291 bytes gen/go/ramp/v1/ramp.pb.go | 4 ++-- proto/CHANGELOG.md | 7 ++++--- proto/ramp/v1/ramp.proto | 7 ------- 6 files changed, 16 insertions(+), 29 deletions(-) diff --git a/conformance/descriptor_invariants_test.go b/conformance/descriptor_invariants_test.go index 7c66642..ad6f602 100644 --- a/conformance/descriptor_invariants_test.go +++ b/conformance/descriptor_invariants_test.go @@ -297,25 +297,17 @@ func fieldEnum(t *testing.T, md protoreflect.MessageDescriptor, field string) pr } // TestRequesterBillingRefStaysRemoved pins the billing_ref removal at the -// descriptor level: Requester carries no billing_ref field and no field 5, -// and both stay reserved. protoc enforces the reservation only while the two -// `reserved` statements exist in the source; `buf breaking` (which would flag -// deleting them) is non-blocking pre-v1, and the remark-proto guard runs only -// in the docs build. This is the blocking-CI pin: reusing the number under a -// new name, or the name under a new number, fails here. +// descriptor level: Requester carries no caller-written billing_ref field. +// Billing identity is resolved from the verified request signature and the +// account minted at Register, never from a request field — a reappearing +// billing_ref would also collide by name with the authoritative account +// handle (RegisterResponse.billing_ref). The freed field number is NOT +// pinned: pre-v1, removed numbers return to the free pool (no `reserved` +// statements until v1.0.0 is tagged). func TestRequesterBillingRefStaysRemoved(t *testing.T) { md := (&rampv1.Requester{}).ProtoReflect().Descriptor() if fd := md.Fields().ByName("billing_ref"); fd != nil { - t.Errorf("Requester regained a billing_ref field (number %d) — it was removed and its number reserved", fd.Number()) - } - if fd := md.Fields().ByNumber(5); fd != nil { - t.Errorf("Requester field number 5 reused by %q — it must stay reserved", fd.Name()) - } - if !md.ReservedRanges().Has(5) { - t.Error("Requester no longer reserves field number 5 — restore `reserved 5;`") - } - if !md.ReservedNames().Has("billing_ref") { - t.Error(`Requester no longer reserves the name billing_ref — restore 'reserved "billing_ref";'`) + t.Errorf("Requester regained a billing_ref field (number %d) — billing keys on the verified caller identity, never a request field", fd.Number()) } } diff --git a/docs/design-history.md b/docs/design-history.md index ac44036..37c0b98 100644 --- a/docs/design-history.md +++ b/docs/design-history.md @@ -145,7 +145,8 @@ records only the wire-shaping reasoning. > after the Broker cost guard moved to the authenticated agent identity, > nothing read `Requester.billing_ref`, and the caller-written > label collided by name with the authoritative account handle minted at -> `Register`. Field 5 and the name are now `reserved`. The reasoning below +> `Register`. The field was deleted outright — pre-v1, removed field numbers +> return to the free pool rather than being `reserved`. The reasoning below > still stands — it is the same separation (identity = signature, > entitlement = scopes/delegation) taken one step further: billing needs no > request field at all. diff --git a/gen/descriptor.binpb b/gen/descriptor.binpb index 989a21dc82887c2ae359feec74ace71e9548e092..e3c9ee67bb462832a19029284dca65ab2e5798e0 100644 GIT binary patch delta 24913 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 bgiF4(T_Q_RgD-8D$Rcvdm;78mt>6Cv<41B> delta 25308 zcmY*>XN%saxsvQeC}wpwl5?3D5~!SQ8MpK}5xMMrRyFjmkTS-vBx@-@Naz zgCLuTT#T~s2nez?iw1BQ*$og>1Y|YH5|K?70sWqH>lXEXzmn(nIZvH?&bj-o`rzl( z!t1HQ!=1yG;q`{QR%QKn4`tEG%)feMoowLzCiB9pS@$`EJzQFru0EFYLZ7~U`}BL| zx&9R|XBPCys`-Qa*rjYYGqQBY#ZkjQ&&mw{Tz%Z@+@Cp6t-hE&Xu0C9=hCwc*Q^}H zo0zSn?(b94_oY;6>TkUVqFDfQy(0|vTNy$25L-{*xl2KITqU+OOv|48A_z*j3$Z&vj0^KzdGND1Op zyFM>f^c&b`;6GBNN)o+aeDU=+`VCCI)~DY<$n^%-V->IT88EP-e~VPV3J`#c_u8k1 z2a#1315yxtU8wf2`0E=L0|t^^11kE%Fn4Nz`AfeyUV8zG^o)MJU#q~=`$?`BDpLI` z-WY%<{jJZyS5f1a`n>#dMSmETdaa^&KX|g(?e@4`@R5U@l;d%G-C2a3W&b}`B+Ma) zx((Ot93^gQx}iBcCnx3}?j<6{Ww#zDAg5JAjL9Bh34*@xMh$E&D}Y9`R-qxLX{b=njGG$ zrF!EYU16wkjco&iX*G6D8JKEvjHI-IfvF}Zzrfwotz@|k^_v{WN&dH!>Vy7oaWpB5a^Sc;G-zUdny1kOA#M-r#%n{^Y?NB|_|waYE)`PCOxH zfDZE^kZE){N6D2k3YF$0^V~fI59~RTqcljArS9Vo*QjxxRjam0qDZ&`ob@1ogkp2Q zkVj>Y@keUa?#W|0N<)d4uvp4UKqzeJg>f6HqIln6os&SoJVFUASlLp zWR?PgVw?w_cuX(=P2_+1NqwStqQ~?uXzM{`qNjdiX?Hym@)R|54>q3)?@i`E{-h2q zpKL#s+Qwv0jxKdvpqT6lm{}W8T%efjLDr5_#A6{`nOSl{^*hTeZH_D|wmB&CD?Nb* zk}?Y%m7Y|-`va2$$v!i4{i52ySvJ$=pf)hmlT#p-s13~Y6t=V=IA(g@&dg-IDo_BkHSYeA^Y@#q2fK%s(Gy?}4HtiD;izz&lJl?8T~G^i|~Fs(Bk zhQ50Vf9{I9p?ryLXf`Ul#12z7D3*8(%VF7|SV9h4U{avBTETz+v%08!g-ziG#R{9k z4T=?Zq}`xc;mK_vdWwLOW4Km%%$@=OURvdmJp~{%S9xSl0SL`i9;>GaC?3PL-XnU7 zdjSys^|lQj*s$KV!2_oC9@$es7)Q;~AtIYOmYJ0`M)sy9SKZ*93 zL+xc7_y3~)K5v^xwlx$YySGvMSOgb92+TYAh+ou?@^*R@(ITi2LOaRThfE>BYW~Pg z^}D=kj}oL1LWtT)wI>pFzikS^sD1pwTk5#vKAVZUh<(IVE}n*3?νsa;e1JxWLt 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 diff --git a/gen/go/ramp/v1/ramp.pb.go b/gen/go/ramp/v1/ramp.pb.go index d921674..f5ad886 100644 --- a/gen/go/ramp/v1/ramp.pb.go +++ b/gen/go/ramp/v1/ramp.pb.go @@ -9007,7 +9007,7 @@ const file_ramp_v1_ramp_proto_rawDesc = "" + "\x13_estimated_quantityB\x1a\n" + "\x18_license_duration_monthsB\a\n" + "\x05_unitB\v\n" + - "\t_metering\"\xd7\x02\n" + + "\t_metering\"\xc4\x02\n" + "\tRequester\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x16\n" + "\x06domain\x18\x02 \x01(\tR\x06domain\x124\n" + @@ -9020,7 +9020,7 @@ const file_ramp_v1_ramp_proto_rawDesc = "" + "\x03ext\x18\x0f \x01(\v2\x17.google.protobuf.StructR\x03ext\x12!\n" + "\fext_critical\x18Z \x03(\tR\vextCriticalB\a\n" + "\x05_nameB\r\n" + - "\v_delegationJ\x04\b\x05\x10\x06R\vbilling_ref\"\xe9\x04\n" + + "\v_delegation\"\xe9\x04\n" + "\n" + "Delegation\x12)\n" + "\x10principal_domain\x18\x01 \x01(\tR\x0fprincipalDomain\x12!\n" + diff --git a/proto/CHANGELOG.md b/proto/CHANGELOG.md index b8f9e12..31dd870 100644 --- a/proto/CHANGELOG.md +++ b/proto/CHANGELOG.md @@ -50,9 +50,10 @@ two flags (`SKIP_SSRF`, `ALLOW_INSECURE`). See `docs/sdk-parity-matrix.md` for t per-language surface. **`Requester.billing_ref` removed (breaking, pre-1.0).** The caller-written -billing label on `Requester` is gone; field number 5 and the name are -`reserved` so they can never be reused with a different meaning. Nothing read -it: billing and cost attribution key on the verified caller identity and the +billing label on `Requester` is gone; the field is deleted outright with no +`reserved` statement — pre-v1 the number returns to the free pool, and +`reserved` becomes the tool for field removals only once v1.0.0 is tagged. +Nothing read it: billing and cost attribution key on the verified caller identity and the account handle minted at `Register` (`RegisterResponse.billing_ref`), which the Exchange resolves from the request signature — never from anything the caller sends. Dropping the field also removes the name collision between the diff --git a/proto/ramp/v1/ramp.proto b/proto/ramp/v1/ramp.proto index 266a938..43f6362 100644 --- a/proto/ramp/v1/ramp.proto +++ b/proto/ramp/v1/ramp.proto @@ -1435,13 +1435,6 @@ message Requester { // Human-readable name (e.g., "Acme Research Assistant"). optional string name = 4; - // Field 5 was a caller-written billing label. Removed: billing and cost - // attribution key on the verified caller identity and the account minted at - // Register, never on anything the caller writes into the request. Reserved - // so the number and name can never be reused with a different meaning. - reserved 5; - reserved "billing_ref"; - // Entitlement scopes. Declare what the requester can access. // // The Exchange filters its catalog to resources matching these scopes. From c35e5b13090766e9fc4988e825410aedab8c1b9b Mon Sep 17 00:00:00 2001 From: Eugene Dymo Date: Wed, 22 Jul 2026 13:12:07 +0200 Subject: [PATCH 2/2] docs(website): sync changelog mirror with pre-v1 reserved-statement removal reference/changelog.mdx mirrors proto/CHANGELOG.md and still described Requester field 5 as reserved; carry over the updated free-pool wording. Co-Authored-By: Claude Fable 5 --- website/src/content/docs/reference/changelog.mdx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/website/src/content/docs/reference/changelog.mdx b/website/src/content/docs/reference/changelog.mdx index ca2e180..457d64e 100644 --- a/website/src/content/docs/reference/changelog.mdx +++ b/website/src/content/docs/reference/changelog.mdx @@ -33,9 +33,10 @@ in Python; `parseErrorDetail` / `errorDetailFrom` in TS). The SSRF-guarded trans is a single env-driven client governed by two flags (`SKIP_SSRF`, `ALLOW_INSECURE`). **`Requester.billing_ref` removed (breaking, pre-1.0).** The caller-written -billing label on `Requester` is gone; field number 5 and the name are -`reserved` so they can never be reused with a different meaning. Nothing read -it: billing and cost attribution key on the verified caller identity and the +billing label on `Requester` is gone; the field is deleted outright with no +`reserved` statement — pre-v1 the number returns to the free pool, and +`reserved` becomes the tool for field removals only once v1.0.0 is tagged. +Nothing read it: billing and cost attribution key on the verified caller identity and the account handle minted at `Register` (`RegisterResponse.billing_ref`), which the Exchange resolves from the request signature — never from anything the caller sends. Dropping the field also removes the name collision between the