From a4b0e080a32ebaaba4e2e52718e5110fed2b443f Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Wed, 16 Sep 2026 21:39:00 -0700 Subject: [PATCH] Record memo-multipush-encoding completion in backlog and briefing By specifier. --- specifier-prompt.md | 49 ++++++++++++++++++++++++++++++++-------- specs/feature-backlog.md | 21 ++++++++++++++++- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/specifier-prompt.md b/specifier-prompt.md index e4444a3..c1b3e6b 100644 --- a/specifier-prompt.md +++ b/specifier-prompt.md @@ -494,6 +494,36 @@ that a single user-facing feature may require specs in more than one component. not implementation gaps; the wire-order and positive-repair mutations were killed (14 executed/8 killed and 21/18). +35. **`minimal-slp-wallet` cannot emit multi-push OP_RETURNs (the + payload-layout bug class).** `sendOpReturn(msg, prefix)` hardcodes + `[OP_RETURN, prefix, msg]` and `bchjs.Script.encode2` will not nest arrays, + so every multi-field Memo action was flattened into one push. The indexer + requires `[prefix, txid(32 LE), text]` for reply/topic-message/ + add-poll-option/poll-vote and `[prefix, poll_type, option_count, question]` + for create-poll; the combined form is logged as `invalid reply push data + count 2` and dropped (and memo.cash does not display it). The shared + browser-safe adapter is `psf-memo-client/src/services/memo-multipush.js` + (`attachMultiPushOpReturn`/`broadcastMultiPush`), which swaps + `bchjs.Script.encode2` to expand a pushes array and restores it in the same + tick. When adding any future action with more than one payload field, use + that adapter and assert the push count in acceptance, not just the prefix. +36. **Node `Buffer` struck again in the multi-push adapter (gotcha #19 + repeat).** The first `memo-multipush.js` used the Node global `Buffer` to + build the script; CRA 5 does not polyfill it and the external wallet script + does not define `window.Buffer`, so every real-browser multi-push broadcast + would have thrown `Buffer is not defined` while Node tests passed. Fix: + import `{ Buffer } from 'buffer'` and declare `buffer` as a direct + dependency. `@psf/bitcoincashjs-lib`'s `compile2` requires genuine Buffers + (`Buffer.isBuffer` + `.copy`), so a `Uint8Array` is not a substitute here. +37. **Soft Gherkin mutation survivors for `memo-multipush-encoding.feature` are + intrinsic.** 20 executed / 8 killed / 12 survived; every survivor is a + single-character case mutation of a `text`/`topic`/`question` example value + used on both the setup and assertion sides (gotcha #12 class). The + structural assertions — push count, little-endian txid, poll type, and + option count — killed all 8 non-text mutations. `gherkin-mutator` wrote an + empty `scenarios` manifest because every scenario has an intrinsic + survivor; that is expected and committed as tool-written. + --- ## 10. Run / verify the app @@ -544,15 +574,16 @@ At the end of each session, update this file: - Note the current `master` HEAD commit. - State the next feature to work on. -Current `master` HEAD: `8f24ac0` (`txid-wire-encoding` merged from -`swarmforge-architect`). Two verification records name the review commit -`a2229f7dd4`: `docs/reviews/txid-wire-encoding-verification.json` (client, -417 unit / 80 property / 30 acceptance suites / lint / build) and -`docs/reviews/txid-wire-encoding-db-verification.json` (db, 371 unit / 54 -property / 13 acceptance suites / lint); the architect tip added only `docs/`. -This task fixed the client big-endian txid bug for likes/replies/polls and -added the DB repair utility. Run `swarmforge/scripts/state.sh` to refresh these -HEAD lines. +Current `master` HEAD: `4dedc51` (`memo-multipush-encoding` merged from +`swarmforge-architect`). One verification record names the review commit +`fac01730c4`: `docs/reviews/memo-multipush-encoding-verification.json` +(client, 425 unit / 85 property / 31 acceptance suites / lint / build); the +commits after the review commit added only `docs/` (summary, record, architect +process note). This task fixed the multi-field payload layout for reply, topic +message, add-poll-option, poll vote, and create-poll. The specifier merged the +branch and ran only the merged feature's acceptance suite (10/10 executions +passed) as the independent check. Run `swarmforge/scripts/state.sh` to refresh +these HEAD lines. Next action: **TBD** — ask the user for the next feature. Current direction is front-end improvements to `psf-memo-client` (UI/UX polish, accessibility, performance, responsiveness, state handling, error surfacing). See diff --git a/specs/feature-backlog.md b/specs/feature-backlog.md index 770c668..0aad97b 100644 --- a/specs/feature-backlog.md +++ b/specs/feature-backlog.md @@ -2,7 +2,7 @@ **Status**: DRAFT — refreshed 2026-09-03. **Owner**: specifier. -**Last updated**: 2026-09-16 +**Last updated**: 2026-09-17 --- @@ -31,6 +31,25 @@ focus is **front-end improvements** to `psf-memo-client` (the React SPA). ## Recently completed +- **Memo multi-push encoding (2026-09-17):** fixed the payload layout for + every multi-field Memo action. `minimal-slp-wallet`'s + `sendOpReturn(msg, prefix)` can only emit two OP_RETURN pushes + (`[prefix, msg]`), so the client had been concatenating all fields into one + push. The indexer and memo.cash expect one push per protocol field, so the + indexer logged `invalid reply push data count 2` and dropped every reply, + topic message, add-poll-option, and poll vote; create-poll was accepted by + our indexer only because it tolerates the combined form. Added the + browser-safe `psf-memo-client/src/services/memo-multipush.js` adapter + (`attachMultiPushOpReturn`/`broadcastMultiPush`) and switched the five action + services to broadcast field arrays: reply `[6d03, txid(32 LE), text]`, + topic message `[6d0c, topic, text]`, add-poll-option `[6d13, txid(32 LE), + option]`, poll vote `[6d14, txid(32 LE), comment]`, and create-poll `[6d10, + poll_type, option_count, question]`. Client-only. Spec: + `psf-memo-client/specs/memo-multipush-encoding.feature`. Merged to `master` + at `4dedc51` (review commit `fac0173`; record + `docs/reviews/memo-multipush-encoding-verification.json`, 425 unit / 85 + property / 31 acceptance suites / lint / build). + - **Txid wire encoding repair (2026-09-16):** fixed the endianness bug that broke every like, reply, poll option, and poll vote broadcast by psf-memo-client. The client embedded the referenced txid in big-endian