Move the optimistic reply object construction out of the ReplyThreadForm
React component into a testable service module with unit tests, keeping
the component a thin UI adapter. Behavior is preserved; all unit,
property, and acceptance tests pass.
By refactorer.
- Make PostReplyCount clickable whenever an onClick handler is provided,
so posts with zero replies still open the thread modal.
- Add ReplyThreadForm inside PostThreadModal with a 184-byte counter and
optimistic reply rendering.
- Pass wallet/profiles through RecentPosts, Profile, and PostThreadModal.
- Add acceptance handlers for the new reply-thread UI scenarios.
- Extend PostThreadModal CSS for the reply form.
By coder.
Review the reply-memo feature (specifier spec, coder implementation,
refactorer test extraction). Kill two mutation survivors by adding tests
for the hexToBytes length check and the reply page successPath wiring.
Refresh mutation and acceptance mutation manifests from verification runs.
By architect.
Refactor the coder's new memo-reply and reply-thread-page tests to use
the shared test helpers (fake wallet, MemoAction tests, page-controller
tests, page submit tests, page build wiring). Extend the memo-action and
page-build helpers to support the reply slice's extra parent-txid
argument and byte-based multi-byte tests. Behavior is preserved; all
unit, property, and acceptance tests pass.
By refactorer.
- Add src/services/memo-reply.js for 0x6d03 reply broadcast with parent txid payload.
- Add src/services/reply-thread-page.js as the page controller for the reply form.
- Add unit tests for both modules.
- Extend acceptance/lib/handlers.js with reply thread steps.
- Skip navigation in PageController when successPath is unset.
By coder.
Review the refactorer's test-helper extraction (test-only, no source
changes). No structural fixes needed. Refresh mutation and acceptance
mutation manifests from the verification runs.
By architect.
Extract shared test helpers for the Memo post and Set Name behavior
slices: fake wallet/profiles, MemoAction tests, page-controller tests,
page build wiring, and shared property-test invariants. Behavior is
preserved; all unit, property, and acceptance tests pass.
By refactorer.
Replace Node-only Buffer.byteLength with a TextEncoder-based UTF-8 byte
length helper so the Set Name page and byte counter work in the browser.
By specifier.
Move per-action config into a static config object on MemoPost and
MemoSetName and have the MemoAction base constructor read it, eliminating
the DRY-flagged duplicate constructor pattern. Commit the differential and
acceptance mutation manifests written by the approved tools during the
architect verification pass for the set-name feature.
By architect.
Extract MemoAction and PageController base classes to remove structural
duplication between the memo post/set-name actions and the new post/set-name
page controllers. Add property tests for the set-name byte counter and
validation invariants. Refresh mutation manifests for the refactored files.
By refactorer.
- Add MemoSetName service with 77-byte UTF-8 validation and broadcast.
- Add SetNamePage controller with byte counter and navigation to /account.
- Add AccountPage controller showing stored name and Set Name button.
- Add Profiles session store to share the new name across pages.
- Add React views /memo/set-name and /account, plus nav link.
- Update acceptance handlers for set-name scenarios and fix fake wallet
sendOpReturn signature to match public minimal-slp-wallet API.
- Update existing post memo tests to match the corrected wallet API.
By coder.
Add a unit test for the broadcast-error message fallback to kill the last
new-post mutant, and commit the differential and acceptance mutation
manifests written by the approved tools during the architect verification
pass for the new-post-errors feature.
By architect.
- Extract _handleSubmitFailure helper to lower submit() complexity
- Refresh mutation manifest via approved tool
- Add property test for broadcast-failure surfacing/no-navigation
By refactorer.
Implements New Post Page scenario 6 (specs/memo-new.feature): when a memo
broadcast fails, the app surfaces the real wallet error and the user stays
on /posts/new instead of navigating to the feed.
- src/services/new-post.js: distinguish local validation errors from
broadcast failures; expose the real error message via broadcastError.
- src/components/app-body/new-post/index.js: render the broadcast error.
- acceptance/lib/handlers.js: support wallet-fail, attempts-to-broadcast,
error-containing, and remain-on-path steps.
- Unit tests for broadcast-failure surfacing.
By coder.
Cover the new-post posting flag (initial idle, in-flight true, settled
false) to kill the four surviving mutants, and commit the differential and
acceptance mutation manifests written by the approved tools during the
architect verification pass for the new-post-page feature.
By architect.
- Add a small seeded property-testing harness (node:test based)
- Property-test validation classification, character-counter
conservation, setInput round-trip, and menu-link idempotence
- Expose as explicit test:property command, separate from unit tests
By refactorer.
Adds a New Post page for composing and broadcasting Memo posts:
- src/services/new-post.js: testable controller (input, character counter
counting down from the memo limit, validation/length errors, navigation to
the recent feed after a successful post).
- src/components/app-body/new-post: React view with a message textarea, post
button, and remaining-character counter.
- Route /posts/new and a navigation menu link.
- Extend acceptance step handlers to cover both specs/post-memo.feature and
specs/memo-new.feature wording; add unit tests for the controller.
- Drop redundant 'use strict' in compiled modules to fix the CI build warning.
By coder.
Add the persistent runner adapter for gherkin-mutator and commit the
differential/acceptance mutation manifests written by the approved tools
during the architect verification pass for the post-memo feature.
By architect.
Implements the post-memo behavior slice per specs/post-memo.feature:
- src/services/memo-post.js: compose, validate (empty/length), and broadcast
a Memo post OP_RETURN (0x6d02) via the minimal-slp-wallet adapter surface.
- Stands up the Babashka APS acceptance pipeline (entrypoint generator,
runtime, regex step handlers, convenience runner).
- Adds focused unit tests for the memo behavior.
By coder.
Move general-purpose truncateAddr/truncateTxid out of the feed-specific
post-display module into src/util so the recent-profiles view depends on
the shared utility layer rather than a sibling feature module.
By architect.