Repository navigation
build(#277): pin bsv-rs =0.9.0-beta.2, bsv-wallet-toolbox-rs =0.14.0-beta.2 and bsv-tracker =0.9.0-beta.2 together (the beta.2 pin, as published) - #332
Conversation
Move bsv-rs and bsv-tracker to =0.9.0-beta.2 and the toolbox to =0.14.0-beta.2. Registry source commits are b744f4b6, 109e9dd3 and 4cfe31ca. Both locks contain exactly one copy of each crate and each cargo tree -d completes without a duplicate bsv crate. The pin-only workspace build and fuzz check each fail with 28 expected originator signature errors (bsv-rs #329), addressed by the next commit. The with_arc deprecation belongs to toolbox #317 / CLI #322. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Pass existing named originators as Some to WalletInterface and the create_action_offering helper. CLI names stay as before; served mutating doors pass the required request header. The context documents the rule. No production Transaction::verify, certificate binary writer, master constructor, or HTTP substrate constructor exists here. Two test-only Transaction::verify calls now pass None for the uncapped reference default. Name the CLI's classic TAAL endpoint independently of ServicesOptions, use with_classic_arc under its explicit deprecation allowance, and mirror the beta.2 Arcade-only ladder. Test mocks that serve classic ARC say so. The required-header rule and response shapes do not change in this commit. Proof: workspace build and all-target check; fuzz --locked check; 12 broadcaster tests and 9 page-bound tests; root and fuzz fmt --check. The full pin is blocked by published toolbox #404 and #388, not completed. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Encode the toolbox's twelve-byte handle as BRC-100 Base64String through reference_string, shared by createAction and the spend gate. SignAction and abortAction already accept the base64 text unchanged. Remove the UTF-8 recovery and retire its three memory notes. The served deferred-flow test decodes twelve bytes, checks the handle against storage, signs with a caller script, then aborts the signed noSend action by the same reference. No broadcaster is called. Proof: the new served test passes (1/1); workspace build and fuzz check pass --locked; fmt --check passes. Corpus re-recording remains the final pin step and is not performed at this blocked checkpoint (#404, #388). Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Name both published-toolbox blockers before this branch can be reviewed: ordinary refusal classes are erased, and Wallet accepts no trust settings. Document the actual pins and Arcade ladder, the explicit classic URLs, and the old certificate issuance scheme's required re-issue. The certificate migration, typed class mapping, final fixture recording, consumer replay and release proof are outstanding. No ready PR is opened and no corpus bytes are re-recorded around missing library behavior. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
The added Some tokens took two identical verification response tails past the clone window. Share the HMAC/signature boolean response and borrow optional counterparty strings through the existing parser. These are the same argument values, JSON and error conversions as before. Mark the classic endpoint result must_use and quote Base64String in the new test documentation. No ratchet instrument or ceiling changes. Duplicated tokens fall from the base's 32486 to 32475; the initial 32584 measurement and its two new lints remain in the lane evidence. Proof: the 11 served crypto tests and deferred create/sign/abort test; workspace build and fuzz check. The final ratchet is rerun after this commit. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Published toolbox 4cfe31ca still erases ordinary refusals (#404, CLI #330). Every WORDS prefix and both accepting-abort sentences keep beta.1's Display at beta.2: no text match added and no class synthesized. The four not-found doors, INVALID_BEEF and UNSPENDABLE_COIN retain their served classes. Toolbox #264/#245 alone carries WalletReviewActions; map it to 409 CONFLICT by type, including the direct toolbox conversion. Pin #205's callback to its one-wait typed busy. #290's named-change test already checks the class, host prefix and input, not the full sentence. Update the test coins for #295's required derivation metadata and the GorillaPool-default assertions for #317. No production allocator change. Proof: cargo test --locked --lib: 425 passed. Fixture recording follows all code in its separate commit, including #216's overlong-spend row. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Bsv-rs #268/#105 carries type, flat list entries, hex signatures and base64 keyrings. Migrate the six certificate test doors and the MCP parameters; expose the direct keyring and proof verifier fields. Add the explicit, idempotent certificates --reverify command for toolbox #188: counts only, no certificate changed. Its test keeps a valid and an invalid signature. The hermetic certificate scenario signs the BRC-52 bytes, checks the new field-key scheme (#203), decrypts the selective proof, and executes both discovery calls. The local certifier sends x-bsv-auth-identity-key (#269). Public-HTTPS issuance URL validation precludes a loopback issuance endpoint, so this local lifecycle imports the certifier's answer through direct acquire. The exact beta.1 missing-field refusal selects its older scheme only for the differential's base run. Both discover tools pin empty results under CLI #331 (toolbox #388); the known overlay requests stay behind the wall. Add the #216 overlong-spend case, #245/#264 deterministic review race, #312/#357/#359 expiry and #337/#371 remittance witnesses for the final recording. The wire fixture's classic mode is explicit (#317) and its incomplete-ancestry coin meets #295's metadata predicate. No fixture bytes are recorded in this commit. Certificate's 1 MiB, 16 MiB and 72-byte bounds and verify-false are tested; direct acquisition still owes #374's checks. Proof: certificate integration 4 passed; certificate bounds/reverify 2 passed; MCP certificate tools 1 passed; hermetic scenario 6 passed with both discovery calls and no new walled target. Full wire replay follows recording. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
The wire fixture speaks classic ARC: set the mode explicitly beside its URL, so beta.2's Arcade default never reaches the classic stub. Its seeded incomplete-ancestry coin carries the derivation metadata now required by #295, preserving the intended UNSPENDABLE_COIN witness. The new review race reaches WalletReviewActions through the actual gate and toolbox write. Keep the added test setup bounded in helpers and document the two new worlds. The complete 157-row scratch recording replays itself cleanly; comparison with the old corpus stops at 025's beta.2 flat key-linkage shape (bsv-rs #105). The actual corpus is re-recorded in the next commit. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Keep the short-serial refusal only in the BRC spelling probe, not the successful acquisition case, and assert that acquisition returned a certificate before recording its list and proof. Retire the BRC oracle's nested-record exception now that beta.2 flattens certificate entries. Keep the added typed-review witness in its own small test module so the pin does not put another existing test file over the ratchet's bound. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
The one-wait witness checks STORE_BUSY, Retry-After, the host's apply_event prefix and the deadline, without pinning the toolbox's full sentence. Name the certificate test's store identity explicitly to avoid repeating the existing wallet-setup block, and keep its new review module from pushing the parent test file over 800 lines. The unchanged instrument's lexical count is 32457 duplicated tokens versus the base's 32486. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
The differential found the remaining beta.1 assumptions: scenario 13 expected nested linkage, scenario 24 read listOutputs.beef as hex, and scenarios 14/22 supplied remittance text that the beta.2 base64 validator refuses. Read flat linkage and BEEF bytes, retaining the old shapes only for the differential's beta.1 baseline. Derive payment keys from the same base64 prefix and suffix sent to internalize; scenario 12's optional basket recovery now also supplies a valid base64 suffix. No runtime or fixture bytes change in this commit. The failed comparison is retained, with its four failure reasons; the complete runs follow. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
WIRE_RECORD=1 records 157 fixtures after the code. Moved or new rows: - 025-revealCounterpartyKeyLinkage.ok.json: bsv-rs #105: flat key linkage, byte fields and protocolID/keyID. - 027-revealSpecificKeyLinkage.ok.json: bsv-rs #105: flat key linkage, byte fields and protocolID/keyID. - 044-acquireCertificate.brc100Type.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 045-relinquishCertificate.brc100Type.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 046-proveCertificate.brc100Type.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 047-acquireCertificate.direct.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 048-listCertificates.one.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 049-proveCertificate.held.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 050-relinquishCertificate.held.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 051-relinquishCertificate.unknown.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 052-proveCertificate.unknown.json: bsv-rs #268/#105 and toolbox #311/#249/#260/#270: certificate JSON and validated metadata. - 120-createAction.namedChange.json: toolbox #241: named-change words. - 143-createAction.tenByteDeclaration.json: toolbox #216: overlong spend refused, stored unsigned action retained, shorter spend succeeds. - 144-signAction.spendLongerThanDeclared.json: toolbox #216: overlong spend refused, stored unsigned action retained, shorter spend succeeds. - 145-listActions.afterOverlongSpend.json: toolbox #216: overlong spend refused, stored unsigned action retained, shorter spend succeeds. - 146-signAction.shorterThanDeclared.json: toolbox #216: overlong spend refused, stored unsigned action retained, shorter spend succeeds. - 147-createAction.doubleSpendReview.json: toolbox #245/#264, bsv-rs #339: typed double-spend review and stored-state witness. - 148-listActions.afterDoubleSpendReview.json: toolbox #245/#264, bsv-rs #339: typed double-spend review and stored-state witness. - 149-createAction.expiryUnsupported.json: toolbox #312/#359: BRC-177 capability and grammar refusals. - 150-createAction.expiryBatch.json: toolbox #312/#359: BRC-177 capability and grammar refusals. - 151-createAction.expiryNever.json: toolbox #312/#359: BRC-177 capability and grammar refusals. - 152-createAction.expiryDuplicate.json: toolbox #312/#359: BRC-177 capability and grammar refusals. - 153-internalizeAction.missingRemittance.json: toolbox #337/#371: remittance exclusivity before BEEF. - 154-internalizeAction.exclusiveRemittance.json: toolbox #337/#371: remittance exclusivity before BEEF. - 155-acquireCertificate.fieldAtBound.json: bsv-rs #275/#301 and toolbox #374: direct-acquire bound boundary as published. - 156-acquireCertificate.fieldAboveBound.json: bsv-rs #275/#301 and toolbox #374: direct-acquire bound boundary as published. - 157-acquireCertificate.signatureAboveBound.json: bsv-rs #275/#301 and toolbox #374: direct-acquire bound boundary as published. MANIFEST.json records empty discovery with the exact reason "toolbox #388 (CLI #331)" for 053-discoverByIdentityKey.ok.json, 054-discoverByAttributes.ok.json, 137-discoverByIdentityKey.limitAtBound.json, 138-discoverByIdentityKey.limitAboveBound.json, 139-discoverByAttributes.limitAtBound.json and 140-discoverByAttributes.limitAboveBound.json. Those six fixture bodies remain byte-identical: the host bound still refuses above 10000. 086, 094-098, 100, 101 and 106 are byte-identical after the correct base64 translation; 103 retains INVALID_BEEF, offset 176 and the script reason, with no stored invalid action, under CLI #330. The WIRE defect row is now closed at beta.1 rather than claiming the invalid spend was accepted. All other old wire files, the consumers and gate-vector bytes are unchanged. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
The integration linkage assertions now read flat byte arrays and protocolID/keyID. For a cross-pin recording, give both certificate type keys to the same direct acquisition request, so both pins see the same signed symmetric-key certificate without a failed request and a second issuance changing the phase call count. The plain hermetic run still sends only type. Both pins prove, decrypt and verify the same certificate; no differential exclusion or product alias added. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Replace the prior checkpoint wording with the published three-crate pin, retain the ordinary refusal classifier pending CLI #330, and state the empty discovery answers pending CLI #331. Record the explicit stored-signature reverify command and the pre-#203 certificate re-issue requirement. Update BRC shape rows, dependent versions, the 157-row wire census and hermetic discovery walls. The architecture source citations still check. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
The published verifier accepts valid BEEF in either order. Retain the respend witness and its reserved-state/signature checks without asserting the removed ordering restriction. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Preserve the five typed members through SDK, toolbox and anyhow errors. The pinned HttpWalletJson reads the served body back with identical review results; optional members remain absent and competing BEEF keeps the reference byte-object shape. Update the host map and prepare fixture 147 for the final recording. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Deserialize old hex tx and current byte arrays through one read-only serde helper. Plant a beta.1 on_accept row, re-announce it, and prove record_accepted writes its transaction and output to wallet storage; run the byte-array row through the same test. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
…ounds Record the missed crate changelog intake on #277, one comment per crate. Add three final-numbered cases for toolbox #240: encrypted field acquisition, empty keyring disclosure, and the served short-serial refusal. Keep recording until after every fix. Document code-5 review fields in the BRC census. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Supply canonical payment remittance for garbage and truncated BEEF, and require HTTP 400 INVALID_BEEF. Document why the earlier two remittance-only differential rows must disappear in the final recording. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Name the declared unlocking-script length guard with the pin changes it supplies. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Re-read certificate signing and signed-text paths, every numeric JSON field, storage wire, non-exhaustive stream matches, binary certificate bounds, MetaNet shape direction, identity publication and uncapped internalize. Add one finding per named item to PR 332 while preserving every existing body line and the two closing lines. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Build review-result JSON directly from typed results without an unwrap. Keep the planted-row witness in short setup, acceptance and storage assertions. No served value or fixture changes beyond the two findings. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Preserve the toolbox wrapper Display for ordinary SDK errors while retaining the inner typed review carrier. The existing typed-error tests hold all ordinary messages to their previous bytes. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Keep the empty-disclosure certificate out of the field-bound world: the pinned lookup pages two certificates before matching the serial. The dedicated world lets the fixture exercise keyring disclosure rather than an unrelated not-found path. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
WIRE_RECORD=1 cargo test --locked --test wire records after the code. Moved and new rows: - 147-createAction.doubleSpendReview.json: finding 1, #140 host map and bsv-rs #339, HTTP 400/isError/numeric code 5 with the actual typed review evidence and sendWithResults; absent optional members omitted. - 158-acquireCertificate.revealFields.json: finding 3, toolbox #240, an encrypted field and master key for the disclosure witness. - 159-proveCertificate.emptyFields.json: finding 3, toolbox #240, fieldsToReveal [] returns an empty keyring instead of disclosing all fields. - 160-proveCertificate.shortSerial.json: finding 3, toolbox #240/#311, the served 31-byte serial refusal before recovery. MANIFEST.json records each reason. All 156 other existing fixtures, every consumer fixture, and the gate vectors are byte-identical to 3cbc445. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Render the required scoreboard after the fixture recording: 160 wire rows. No other score, floor, consumer fixture or gate vector moves. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Drive the served carrier with HttpWalletJson::new, without adding a host HTTP-client site or widening the rule-28 allowlist. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
Remove the duplicated test listener setup and its similar-name warning by using the existing abortable server helper and awaiting its shutdown. Mark type names in documentation. Preserve the ratchet ceilings and every fixture byte. Co-Authored-By: GPT-6.1 Sol (gpt-6.1-sol) <noreply@openai.com>
|
Toolbox Dependents against this branch (2026-10-28 11:19:24Z, run 40679043409, the first with the |
Pin both workspaces to the published beta.2 stack: bsv-rs
=0.9.0-beta.2, bsv-wallet-toolbox-rs=0.14.0-beta.2(registry4cfe31ca), and bsv-tracker=0.9.0-beta.2. This includes the originator, classic ARC, reference, certificate and wire changes those packages require.The captain's decision on #277 applies: ordinary refusal types wait in #330 (toolbox #404), and discovery trust settings wait in #331 (toolbox #388). The classifier stays. This PR adds no trust config and invents no typed class from text.
#277 checklist and intake findings
cargo tree -d.Some; CLI and engine calls preserve their pre-pin names inSome, documented insrc/context.rs. No empty value is silently converted toNone. Existing status-helper behavior is unchanged. No shippedTransaction::verify, certificateto_binary/signing_hash,MasterCertificate::new,HttpWalletJson/HttpWalletWireconstructor or removed processor API call exists. Two test-only transaction verifications pass the thirdNone(Discovery answers nothing at the beta.2 pin: the CLI's trust settings through the typed config wait for the toolbox's trust filter (toolbox #388) #331). The requested-set ordering, auth text members, removedset_verify_responsesandScriptEvaluationDeclinedhave no new direct CLI caller to migrate.with_classic_arcunder a reasoned deprecation allowance, and constructs successfully with the hermetic stub. The config command reports that CLI-owned URL. Arcade supplies no classic ARC rung. GorillaPool is opt-in at this pin. The three test constructions follow the new options shape. At toolbox 0.14.0-beta.2: ServicesOptions::mainnet() defaults arc_url to the Arcade endpoint, so the CLI's classic branch with ARC_URL unset passes an Arcade URL to with_arc (classic ARC at an Arcade endpoint); the classic default needs its own URL or the default moves to Arcade #322 is hand-closed at the landing with its record.toolbox_words.rsprefix and both accepting-abort strings against the published Display and formatting sites. None of the matched texts changed. No match was widened. INVALID_BEEF and UNSPENDABLE_COIN stay; unknown signAction is 400 ERROR, abortAction 404 NOT_FOUND, proveCertificate 400 ERROR, relinquishCertificate 200/relinquished. The ordinary typed host map waits in Host map by refusal class (the typed migration of toolbox #185) waits for a published toolbox carrying WalletRefusal at the WalletInterface boundary (toolbox #404) #330. Only the actualWalletReviewActions/toolboxReviewActionscarrier maps to 409 CONFLICT; the unit test proves the same untyped sentence does not gain that class. Fixture 147 gets the real carrier by racing a stored competing spend after the host's gate read; 148 observes the resulting state.built, notstale#212/tools/changelog: refuse a fence line in a fragment (the README says a fragment carries no code block; an unclosed fence would render the release headings below it as code) #282 guard cases remain covered by the empty/missing script and vin fixtures; fix: honor proof evidence before aborting or retiring requests #245's stored-input guards preserve the host gate's first word. e2e: relinquishOutput posts the served body; its consumer fixture records a 200 (#119) #309 check order and array limits, tracker_host: word_label's nine labels in one WORD_LABELS constant (#286) #295 change eligibility, Nightly 2026-10-27: two fuzz targets do not build on beta (explorer_bodies after the 0.18.2 probe move; brc29_remittance with two bsv-rs crates in the fuzz crate's graph); no CI job builds the fuzz crate #301 u32 sequence number, server: CORS answers before the bearer, so a browser reaches an AUTH_TOKEN wallet (#138) #307 listActions inclusion/order, A received coin named under the scoped word is offered but never selected while a proven coin covers the action: split and send need a way to spend the named coin (LOW's seat p59) #313 purpose and BRC-100: the door refuses a request with neither Origin nor Originator (400 Origin header required) where the BRC makes originator optional and the reference's validateOriginator accepts an absent one #298 synced metadata were read against the package: only observed moved answers are recorded. Certificate validator texts from arc-callback: on the SEEN, IN_BLOCK and MINED paths a busy store answers 503 after two busy timeouts (10.4 s), past Arcade's 10 s webhook timeout #249/Fix split-key case matching so resolved splits release held coins #260/Record the named-change refusal after the gate offer (#234) #261/fix: store the settling header for later invalidations #270/changelog: use per-change fragments and assemble at release #280/fix(differential): isolate concurrent scratch space and ports (#192) #283/test(wire): report toolbox message-only differences under the gate knob #291/Floors for src/server/error.rs and src/config.rs, the files handlers.rs's code moved to (the second half of #174) #311 are read in the updated certificate rows. The broadcaster config by the owner's word (2026-10-27): Arcade is the default mode, GorillaPool's ARC leaves the ladder, classic ARC only as the hermetic stub's explicit mode; the release gate ran on ARC #300's issuance nonce is library-owned. services: Arcade the default broadcaster through the typed config; main into beta (#300, beta's half) #312/#359 expiry refusals and HANDOFF: 2026-10-28, the beta.2 pin landed as published, the gate 24/24, the deferrals and the lessons #337/#371 remittance exclusivity have new fixtures 149–154.apply_event:prefix, with no verbatim dependency sentence assertion (Wire replay: a refusal's message-text difference prints one TEXT-DIFF line under a knob the toolbox's dependents gate sets, never a failure; status, class, offset, reason and stored state stay strict (the keeper's shape, toolbox #252) #290). The accepting-word/proof matrix, fixture 124, toolbox assess_named and check_scope look an outpoint up without the user_id: in a store with more than one user another user's output counts as held #201's MINED behavior and PR 274's Ok on a template replay without a host workaround. Bsv-rs test: give CLI test trackers mining tips for toolbox verification #240 makes child-first BEEF valid; the respend witness now expects that validity and still checks the replacement and reserved coin state. The tracker 0.10.0: the spend guard on the real coin selection; the MCP companion on rmcp 3.5 #30 recheck and Chain feed: a row that settles after a kept reorg or invalidation keeps the deactivated header's hash, so an invalidation of its new block selects nothing #258 consumer tests remain green.type, DER signature hex and base64 keyrings; list entries are flat. 044–052 and the brc100Type requests are migrated to valid metadata so their intended branch is still exercised. MCP acquisition/proof parameters match, and both MCP discovery tools return the same empty answer as HTTP. Key linkage results are flat byte arrays with protocolID/keyID; integration/e2e and 025/027 agree. listOutputs' BEEF is an array under the BRC field name; the e2e consumer accepts it. The host's stored InternalizeActionArgs follow-up and other serde-persisted sites were checked; no storage rewrite is needed.verifyreturning false. The JSON host has no certificate binary writer to unwrap. No certificate signature is silently repaired.bsv-wallet certificates --reverifyexplicitly invokes the library's stored-certificate audit; it is repeatable and leaves stored rows unchanged. A good/bad signature test runs it twice and gets checked=2/failed=1 both times. We chose an explicit flag so ordinary startup does not gain a scan. The local certifier sendsx-bsv-auth-identity-key(ci: the macOS build on push and the tag's run, Ubuntu alone on a pull request (main) #269); scenario 6 imports its signed BRC-52 certificate, proves one field, decrypts it with the Host routes /tx/{txid} and /chain-feed/status serve a store busy as 500, not 503 STORE_BUSY #203 symmetric key, verifies the signature, discovers and relinquishes it. The published issuance URL guard requires public HTTPS, so the hermetic test imports via direct acquisition and makes no external issuance request. Pre-Host routes /tx/{txid} and /chain-feed/status serve a store busy as 500, not 503 STORE_BUSY #203 toolbox-issued certificates must be re-issued: the old field-encryption scheme is incompatible with the corrected scheme. The owner-reported 46 production certificates, one certifier, 2026-03-29..31, are [D] supplied facts, not a production read by this lane. README and changelog carry the re-issue instruction; the owner decides the production operation.[]with the reason toolbox #388 (CLI Discovery answers nothing at the beta.2 pin: the CLI's trust settings through the typed config wait for the toolbox's trust filter (toolbox #388) #331). The six discovery bodies 053/054/137–140 were already empty and remain byte-identical; their recording manifest names the reason. The host still enforces the 1..=10000 page bound. The three library-owned overlay hosts are explicitly counted/refused by the hermetic proxy, with zero new wall targets or unserved routes.cc438d6records all 157 rows after the product changes; the full strict replay passes after recording. The moved/new files and causes are enumerated below. 086, 094–098, 100, 101 and 106 are byte-identical after the correct base64 adapter; 103 retains INVALID_BEEF, offset 176 and OP_EQUALVERIFY with no stored invalid spend (Host map by refusal class (the typed migration of toolbox #185) waits for a published toolbox carrying WalletRefusal at the WalletInterface boundary (toolbox #404) #330). Every other old wire fixture and all 48 consumer fixtures are byte-identical. Every gate-vector byte is unchanged; 490 rows, 486 expressed and 4 explicitly unexpressed, zero divergences with every one recorded. WIRE's stale 103 defect is closed at the beta.1 landing. No silent divergence was added.Fixture recording (
cc438d6)WIRE_RECORD=1 records 157 fixtures after the code. Moved or new rows:
MANIFEST.json records empty discovery with the exact reason
"toolbox #388 (CLI #331)" for 053-discoverByIdentityKey.ok.json,
054-discoverByAttributes.ok.json, 137-discoverByIdentityKey.limitAtBound.json,
138-discoverByIdentityKey.limitAboveBound.json,
139-discoverByAttributes.limitAtBound.json and
140-discoverByAttributes.limitAboveBound.json. Those six fixture bodies
remain byte-identical: the host bound still refuses above 10000.
086, 094-098, 100, 101 and 106 are byte-identical after the correct base64
translation; 103 retains INVALID_BEEF, offset 176 and the script reason,
with no stored invalid action, under CLI #330. The WIRE defect row is now
closed at beta.1 rather than claiming the invalid spend was accepted.
All other old wire files, the consumers and gate-vector bytes are unchanged.
Proof
All commands use the lane's private target directory and foreground execution. Final published-package proof:
Final ratchet: pedantic 823 (base 825); unwrap 4; large shipped files 10; large test files 3; long functions 86; complexity 19; duplicated tokens 32287 (base 32486); missing docs 148. The tool and recorded ceilings are unchanged.
Cross-pin comparison:
DIFFERENTIAL: 10 differences over 365 calls and 35 commands; both builds pass 24/24. These are the five certificate/discovery changes (#105/#268/#388), two earlier remittance refusals (#371, not a widening of INVALID_BEEF), two linkage changes (#105), and the listOutputs BEEF field/array (#105). The same-binary floor isDIFFERENTIAL: 0 differences over 365 calls and 35 commands. No differential exclusion changed. During the comparison only, the acquisition request includes both old/new type keys so the same signed certificate is exercised on both libraries; the normal beta.2 scenario sends onlytype.Upstream gates (the captain's ruling)
gh workflow run dependents.yml --ref beta -f cli_ref=lane/p1-277-pin-beta2answered HTTP 422,Unexpected inputs provided: ["cli_ref"], and no run was created), so a Dependents run against this exact branch is not possible and is not a condition of this PR. A Dependents run against this branch exists since toolbox #405 landed theircli_refinput: run 40679043409 (11:19Z, at bb9266b, the clone line right) fails the build oncreate_action_offering's fourth argument, the must-spend list of toolbox ci(#352): a hyphenated tag's release object is a prerelease #353 (#399) landed on their beta behind the tag; the published beta.2 takes three, so that run and the plain beta dispatch after the landing are red by construction until the CLI pin that carries ci(#352): a hyphenated tag's release object is a prerelease #353 (A received coin named under the scoped word is offered but never selected while a proven coin covers the action: split and send need a way to spend the named coin (LOW's seat p59) #313's), recorded on The beta.2 pin: bsv-rs 0.9.0-beta.2 and the toolbox's next prerelease together on beta, with every item recorded on #140 after the beta.1 landing #277 and in the toolbox's docs/DEPENDENTS.md as the expected red beside this PR's green CI on the published crates.HashMapwhere bsv-rs's beta carriesIndexMap(#385/#394), before any CLI test (toolbox #406). That is a finding on the toolbox's side at their next bsv-rs pin, outside this PR's pins, and nothing of it is fixed here.Fix round on the cold review
The following lines supplement the earlier landing record. Finding 1 replaces its 409 review-action mapping with the pinned HTTP 400/code-5 carrier and preserves every present member. Finding 2 reads planted beta.1 hex follow-ups without rewriting stored rows. Finding 3 adds the missed changelog intake and toolbox #240 privacy/serial witnesses. Finding 5 restores scenario 08's INVALID_BEEF assertions with valid remittance. Finding 6 names toolbox #216 in changelog.d/277.md. The ordinary classifier and empty discovery remain as published.
Missed changelog intake: bsv-rs #249/#258/#228/#192/#356, both toolbox #240 entries.
Fix-round final proof (bb9266b)
All six cold-review findings are addressed on the existing branch. The exact published pins, ordinary refusal classifier and empty discovery answers are retained. Every fix is an added commit with its model trailer.
Fixture commit bbebcc5 is the single final recording commit: 147 changes to the code-5 carrier, 158/159/160 are new, and MANIFEST records each reason. All 156 other existing fixtures, all 48 consumer fixtures and the gate-vector files are byte-identical to 3cbc445. The scoreboard is rendered to 160 rows.
All Rust checks use 1.98.1 and the private lane target. Evidence and logs are under /Volumes/Lanes/out/bsv-wallet-cli/p1-277-pin-fix. No production wallet was contacted. Every server and listener started by these checks is stopped before the lane's report. The captain's landing record remains the next action for #277 and #322.
For #277 (hand-closed with the landing record, never auto-closed) and #322.
🤖 Generated with Claude Code