Add architectural review for reduce-test-dry-duplication

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.
This commit is contained in:
Chris Troutner
2026-08-25 20:36:24 -07:00
parent 0159119921
commit 916dab4c75
12 changed files with 82 additions and 11 deletions
@@ -0,0 +1,71 @@
# Architectural Review Summary — reduce-test-dry-duplication
## Task and commits reviewed
- Task: `reduce-test-dry-duplication`
- Reviewed the refactorer branch ending at `0159119921bc` (fast-forward merged into
`swarmforge-architect`), which extracted shared test helpers for the Memo post and
Set Name behavior slices. No source files changed; the diff is test-only
(427 insertions / 522 deletions across 13 test files).
## Architectural findings and fixes applied
Reviewed UI/Core separation, dependency rule, information hiding/encapsulation, and
local code quality. The refactorer's work is clean; no structural fixes were needed.
1. **Test helpers separated from tests (good).** Shared fakes and test registrars
live in `test/helpers/` (`fake-wallet.js`, `fake-profiles.js`) and
`test/unit/*-helpers.js` / `test/property/behavior-helpers.js`, kept apart from
the `.test.js` files. The `node --test "test/unit/*.test.js"` and
`node --test "test/property/*.test.js"` globs match only `.test.js`, so the
helper modules are never executed as standalone tests. This satisfies the
"keep tests separate from test helpers" rule.
2. **Dependency direction (good).** Helpers depend inward on `src/services` and on
each other; no test helper reaches into UI/IO. The fake wallet exposes only the
small adapter surface the Memo action modules need (`walletInfo`, `getUtxos`,
`sendOpReturn`) and records broadcasts for assertion, preserving information
hiding.
3. **Cohesion (good).** Each helper owns one concern: `memo-action-helpers.js`
registers the shared MemoAction max/over-length/validation tests;
`page-controller-helpers.js` registers the shared in-flight/missing-handler/
broadcast-failure page tests; `page-build-helpers.js` wires a page to a working
action; `behavior-helpers.js` registers the shared property invariants
(validation, counter conservation, setInput round-trip, broadcast-failure
never navigates). Slice specifics are supplied through a small `cfg` object,
so the two behavior slices share one implementation instead of duplicating it.
4. **Local code quality (good).** Helper APIs are documented, names are clear, and
the `cfg`-driven registrars keep the per-slice test files terse and readable.
`.gitignore` now excludes `target/` (project-local tool output).
## Verification results
- **Unit (`node --test`):** 56/56 pass.
- **Property (`node --test test/property/*.test.js`):** 13/13 pass.
- **Acceptance (normal):** `memo-new`, `post-memo`, and `set-name` generated suites
all pass (14 + 5 + 13 scenarios).
- **Mutation (`mutate4javascript`, `--max-workers 8`):** differential run reports
0/0/0 (manifests current; source unchanged). `--mutate-all` confirms every
testable core module fully kills: memo-action 5/0/0, memo-post 2/0/0,
memo-set-name 2/0/0, page-controller 7/0/0, set-name-page 3/0/0, account-page
7/0/0, profiles 1/0/0, new-post 4/0/0. No survivors, no uncovered.
- **DRY (`dry4javascript src` and `dry4javascript test`):** no duplicate candidates
in either tree.
- **Gherkin acceptance mutation (soft):**
- `memo-new.feature` — 14 executed, **4 killed, 10 survived**, 0 errors.
- `post-memo.feature` — 5 executed, **0 killed, 5 survived**, 0 errors.
- `set-name.feature` — 13 executed, **6 killed, 7 survived**, 0 errors.
- Killed: byte/char `count` dithers and the empty-value boundary — values are
behaviorally connected to the counter and rejection branches.
- Survived (documented equivalents): message/name/broadcast-error text dithers
are opaque data — any non-empty value broadcasts and reflects identically, so
the mutation does not change observable behavior.
## Suite status
- Unit + property + acceptance all pass; source-level mutation fully kills all
testable core modules. Gherkin acceptance mutation survivors are documented
equivalents.
## Handoffs sent
- None. The refactorer's work is test-only (no product behavior change) and this
review produced no source changes, so there is no functional commit for the
specifier and no follow-up work for the coder/refactorer to review. Per the
handoff rules, non-functional work is not forwarded.
By architect.
+1 -1
View File
@@ -1,5 +1,5 @@
# acceptance-mutation-manifest-begin
# {"version":1,"tested_at":"2026-08-26T00:40:19.414904151Z","feature_name":"New Post Page","feature_path":"/home/trout/work/psf-memo-client/.worktrees/architect/specs/memo-new.feature","background_hash":"e1d5f81f1ed083ac6934c429ca3cb4a0f8d4dac44c2eaa45c0960920bde2c017","implementation_hash":"unknown","scenarios":[{"index":1,"name":"New Post Page - 2 an empty memo is rejected on the new post page","scenario_hash":"ac70dcf123f435da2b8a6c4953b0b22b8e7a5a8a74291547b954cb562cf9f339","mutation_count":1,"result":{"Total":1,"Killed":1,"Survived":0,"Errors":0},"tested_at":"2026-08-26T00:08:15.433121898Z"}]}
# {"version":1,"tested_at":"2026-08-26T03:36:06.630079245Z","feature_name":"New Post Page","feature_path":"../../specs/memo-new.feature","background_hash":"e1d5f81f1ed083ac6934c429ca3cb4a0f8d4dac44c2eaa45c0960920bde2c017","implementation_hash":"unknown","scenarios":[{"index":1,"name":"New Post Page - 2 an empty memo is rejected on the new post page","scenario_hash":"ac70dcf123f435da2b8a6c4953b0b22b8e7a5a8a74291547b954cb562cf9f339","mutation_count":1,"result":{"Total":1,"Killed":1,"Survived":0,"Errors":0},"tested_at":"2026-08-26T03:34:47.703957423Z"}]}
# acceptance-mutation-manifest-end
# Scenarios: New Post Page - 1, New Post Page - 2, New Post Page - 3, New Post Page - 4, New Post Page - 5, New Post Page - 6
+1 -1
View File
@@ -1,5 +1,5 @@
# acceptance-mutation-manifest-begin
# {"version":1,"tested_at":"2026-08-26T00:08:35.176401424Z","feature_name":"Post a Memo","feature_path":"/home/trout/work/psf-memo-client/.worktrees/architect/specs/post-memo.feature","background_hash":"d7f1a31b7651301ec01bdea9c4c990f9a032ce179aa84f8d6a78595f8a476474","implementation_hash":"unknown","scenarios":[{"index":1,"name":"Post a Memo - 2 an empty memo is rejected","scenario_hash":"4e6fea6fa5adbf7fe0eefdd9bc21a7027fe7312d2937a4fd68f1a1eb68d33a8d","mutation_count":1,"result":{"Total":1,"Killed":1,"Survived":0,"Errors":0},"tested_at":"2026-08-25T23:22:52.631790256Z"}]}
# {"version":1,"tested_at":"2026-08-26T03:35:45.131394972Z","feature_name":"Post a Memo","feature_path":"../../specs/post-memo.feature","background_hash":"d7f1a31b7651301ec01bdea9c4c990f9a032ce179aa84f8d6a78595f8a476474","implementation_hash":"unknown","scenarios":[{"index":1,"name":"Post a Memo - 2 an empty memo is rejected","scenario_hash":"4e6fea6fa5adbf7fe0eefdd9bc21a7027fe7312d2937a4fd68f1a1eb68d33a8d","mutation_count":1,"result":{"Total":1,"Killed":1,"Survived":0,"Errors":0},"tested_at":"2026-08-26T03:34:49.113519078Z"}]}
# acceptance-mutation-manifest-end
# Scenarios: Post a Memo - 1, Post a Memo - 2, Post a Memo - 3
+1 -1
View File
@@ -1,5 +1,5 @@
# acceptance-mutation-manifest-begin
# {"version":1,"tested_at":"2026-08-26T03:00:49.110540817Z","feature_name":"Set Name","feature_path":"specs/set-name.feature","background_hash":"e1d5f81f1ed083ac6934c429ca3cb4a0f8d4dac44c2eaa45c0960920bde2c017","implementation_hash":"unknown","scenarios":[{"index":1,"name":"Set Name - 2 an empty name is rejected on the set name page","scenario_hash":"a4fbf28bd1afbffeff2f24f685299663df57e3cc4332a115fea84c08db634670","mutation_count":1,"result":{"Total":1,"Killed":1,"Survived":0,"Errors":0},"tested_at":"2026-08-26T03:00:28.196490363Z"}]}
# {"version":1,"tested_at":"2026-08-26T03:35:47.374200272Z","feature_name":"Set Name","feature_path":"../../specs/set-name.feature","background_hash":"e1d5f81f1ed083ac6934c429ca3cb4a0f8d4dac44c2eaa45c0960920bde2c017","implementation_hash":"unknown","scenarios":[{"index":1,"name":"Set Name - 2 an empty name is rejected on the set name page","scenario_hash":"a4fbf28bd1afbffeff2f24f685299663df57e3cc4332a115fea84c08db634670","mutation_count":1,"result":{"Total":1,"Killed":1,"Survived":0,"Errors":0},"tested_at":"2026-08-26T03:34:50.405131105Z"}]}
# acceptance-mutation-manifest-end
# Scenarios: Set Name - 1, Set Name - 2, Set Name - 3, Set Name - 4, Set Name - 5
+1 -1
View File
@@ -53,5 +53,5 @@ AccountPage.ACCOUNT_PATH = ACCOUNT_PATH
module.exports = AccountPage
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T02:57:14.578Z","module_hash":"956a690653185cdbda205b7ee5124f905241d47660357f40e32ee2a9f2340ea9","functions":[{"id":"func/AccountPage.constructor","name":"AccountPage.constructor","line":18,"end_line":22,"hash":"89f261283d2ceab1023088c80e89e48e21d1b62dbc2241a6e9fb00b5653d0607"},{"id":"func/AccountPage.getAddress","name":"AccountPage.getAddress","line":25,"end_line":27,"hash":"dd06e8414856559223a8fd5bd68193d8e04ea6264e3ac7c08e80c8dea69e2a36"},{"id":"func/AccountPage.getName","name":"AccountPage.getName","line":31,"end_line":37,"hash":"63f3f003cea554075f50c92062da81de964fc5cedefbf871843d9dd871aaed17"},{"id":"func/AccountPage.hasSetNameButton","name":"AccountPage.hasSetNameButton","line":40,"end_line":42,"hash":"49dc20060d4c55606057a926132f0cc5c8154548a445b299927ef68b9da86ca3"},{"id":"func/AccountPage.clickSetName","name":"AccountPage.clickSetName","line":45,"end_line":47,"hash":"82ff3b1da4068cbb8b78d55a9dfbd366c78927b67c7d4aa96c4cda12e3144f38"}]}
// {"version":1,"tested_at":"2026-08-26T03:33:33.460Z","module_hash":"956a690653185cdbda205b7ee5124f905241d47660357f40e32ee2a9f2340ea9","functions":[{"id":"func/AccountPage.constructor","name":"AccountPage.constructor","line":18,"end_line":22,"hash":"89f261283d2ceab1023088c80e89e48e21d1b62dbc2241a6e9fb00b5653d0607"},{"id":"func/AccountPage.getAddress","name":"AccountPage.getAddress","line":25,"end_line":27,"hash":"dd06e8414856559223a8fd5bd68193d8e04ea6264e3ac7c08e80c8dea69e2a36"},{"id":"func/AccountPage.getName","name":"AccountPage.getName","line":31,"end_line":37,"hash":"63f3f003cea554075f50c92062da81de964fc5cedefbf871843d9dd871aaed17"},{"id":"func/AccountPage.hasSetNameButton","name":"AccountPage.hasSetNameButton","line":40,"end_line":42,"hash":"49dc20060d4c55606057a926132f0cc5c8154548a445b299927ef68b9da86ca3"},{"id":"func/AccountPage.clickSetName","name":"AccountPage.clickSetName","line":45,"end_line":47,"hash":"82ff3b1da4068cbb8b78d55a9dfbd366c78927b67c7d4aa96c4cda12e3144f38"}]}
// mutate4javascript-manifest-end
+1 -1
View File
@@ -73,5 +73,5 @@ class MemoAction {
module.exports = MemoAction
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T02:59:30.088Z","module_hash":"9f6ac3a351ce499162bd5f350ac2eec15f7a4a88450334b49cb1c445b83b0eea","functions":[{"id":"func/MemoAction.constructor","name":"MemoAction.constructor","line":13,"end_line":22,"hash":"881f01aa2a258bcbc4750b69dc303a03139b6368decb2e10e667dc2f23f5ea80"},{"id":"func/MemoAction.validate","name":"MemoAction.validate","line":26,"end_line":36,"hash":"b8598a392b3a65b5f1fe329048a041a087ef0735806fd03f42fe0cf7e19ef7fc"},{"id":"func/MemoAction.broadcast","name":"MemoAction.broadcast","line":40,"end_line":59,"hash":"07853c0eec474cae372e901db388b62b50020db0aff1f63bb587b9e494f4ede5"},{"id":"func/MemoAction._throwIfInvalid","name":"MemoAction._throwIfInvalid","line":62,"end_line":70,"hash":"dafb785969f30b0fa347c8e699e4bf3302ce3a9ef0d3481f1ffa5c276992c808"}]}
// {"version":1,"tested_at":"2026-08-26T03:32:20.894Z","module_hash":"9f6ac3a351ce499162bd5f350ac2eec15f7a4a88450334b49cb1c445b83b0eea","functions":[{"id":"func/MemoAction.constructor","name":"MemoAction.constructor","line":13,"end_line":22,"hash":"881f01aa2a258bcbc4750b69dc303a03139b6368decb2e10e667dc2f23f5ea80"},{"id":"func/MemoAction.validate","name":"MemoAction.validate","line":26,"end_line":36,"hash":"b8598a392b3a65b5f1fe329048a041a087ef0735806fd03f42fe0cf7e19ef7fc"},{"id":"func/MemoAction.broadcast","name":"MemoAction.broadcast","line":40,"end_line":59,"hash":"07853c0eec474cae372e901db388b62b50020db0aff1f63bb587b9e494f4ede5"},{"id":"func/MemoAction._throwIfInvalid","name":"MemoAction._throwIfInvalid","line":62,"end_line":70,"hash":"dafb785969f30b0fa347c8e699e4bf3302ce3a9ef0d3481f1ffa5c276992c808"}]}
// mutate4javascript-manifest-end
+1 -1
View File
@@ -65,5 +65,5 @@ MemoPost.MAX_MEMO_CHARS = MAX_MEMO_CHARS
module.exports = MemoPost
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T02:59:50.005Z","module_hash":"ef34e1b3318b764dab099f693855e5f57704d60b2173e99c146bdbf34b6dd8c5","functions":[{"id":"func/MemoPost.constructor","name":"MemoPost.constructor","line":34,"end_line":37,"hash":"527e19b059e463a67be214a5c77c0ce4261ffadb58b9546b422be543c1df292d"},{"id":"func/MemoPost.isTooLong","name":"MemoPost.isTooLong","line":40,"end_line":42,"hash":"833f9f66eae849df0248d0c696c95c767a121b394b1c728bc3ec675668dff5de"},{"id":"func/MemoPost.post","name":"MemoPost.post","line":46,"end_line":48,"hash":"26d8e84b520fae1928f7f72215e6ed95f7219c14266c99b710e2af5373cb6faf"},{"id":"func/MemoPost.reflect","name":"MemoPost.reflect","line":51,"end_line":59,"hash":"87e2168a71309a572c60b63f382dd6f681cb28ed543090dbde399e29556cfcdf"}]}
// {"version":1,"tested_at":"2026-08-26T03:32:36.219Z","module_hash":"ef34e1b3318b764dab099f693855e5f57704d60b2173e99c146bdbf34b6dd8c5","functions":[{"id":"func/MemoPost.constructor","name":"MemoPost.constructor","line":34,"end_line":37,"hash":"527e19b059e463a67be214a5c77c0ce4261ffadb58b9546b422be543c1df292d"},{"id":"func/MemoPost.isTooLong","name":"MemoPost.isTooLong","line":40,"end_line":42,"hash":"833f9f66eae849df0248d0c696c95c767a121b394b1c728bc3ec675668dff5de"},{"id":"func/MemoPost.post","name":"MemoPost.post","line":46,"end_line":48,"hash":"26d8e84b520fae1928f7f72215e6ed95f7219c14266c99b710e2af5373cb6faf"},{"id":"func/MemoPost.reflect","name":"MemoPost.reflect","line":51,"end_line":59,"hash":"87e2168a71309a572c60b63f382dd6f681cb28ed543090dbde399e29556cfcdf"}]}
// mutate4javascript-manifest-end
+1 -1
View File
@@ -61,5 +61,5 @@ MemoSetName.MAX_NAME_BYTES = MAX_NAME_BYTES
module.exports = MemoSetName
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T03:00:01.475Z","module_hash":"7df00da6f6ac452ed14c70ec73f07ac6e7a9c9e50f105f3fb3fcb969e409b567","functions":[{"id":"func/MemoSetName.constructor","name":"MemoSetName.constructor","line":34,"end_line":37,"hash":"9407b43605444074011b1da595c9d53356352c72b0d847e00365d79ad705663a"},{"id":"func/MemoSetName.isTooLong","name":"MemoSetName.isTooLong","line":40,"end_line":42,"hash":"c19efae68fd1faed8e63e106a9dbad10872853879870fe49df16968f1c8a3641"},{"id":"func/MemoSetName.setName","name":"MemoSetName.setName","line":46,"end_line":48,"hash":"9226b63b60a573a9dfb5c7bbb1449d1a138f30b648642d345c5162d012a2cfc0"},{"id":"func/MemoSetName.reflect","name":"MemoSetName.reflect","line":51,"end_line":55,"hash":"3cfed5e8ec7acf592e07e67659b4d8e075d98bbddf79755b8a31b76fd1ae5696"}]}
// {"version":1,"tested_at":"2026-08-26T03:32:46.747Z","module_hash":"7df00da6f6ac452ed14c70ec73f07ac6e7a9c9e50f105f3fb3fcb969e409b567","functions":[{"id":"func/MemoSetName.constructor","name":"MemoSetName.constructor","line":34,"end_line":37,"hash":"9407b43605444074011b1da595c9d53356352c72b0d847e00365d79ad705663a"},{"id":"func/MemoSetName.isTooLong","name":"MemoSetName.isTooLong","line":40,"end_line":42,"hash":"c19efae68fd1faed8e63e106a9dbad10872853879870fe49df16968f1c8a3641"},{"id":"func/MemoSetName.setName","name":"MemoSetName.setName","line":46,"end_line":48,"hash":"9226b63b60a573a9dfb5c7bbb1449d1a138f30b648642d345c5162d012a2cfc0"},{"id":"func/MemoSetName.reflect","name":"MemoSetName.reflect","line":51,"end_line":55,"hash":"3cfed5e8ec7acf592e07e67659b4d8e075d98bbddf79755b8a31b76fd1ae5696"}]}
// mutate4javascript-manifest-end
+1 -1
View File
@@ -68,5 +68,5 @@ NewPostPage.RECENT_FEED_PATH = RECENT_FEED_PATH
module.exports = NewPostPage
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T02:57:53.801Z","module_hash":"45d772cfe40b8a34018092abbe924c01cbde741c5cbaa737a283ba35214a99ff","functions":[{"id":"func/NewPostPage.constructor","name":"NewPostPage.constructor","line":23,"end_line":33,"hash":"686653c181941b27c19cd8c1f9fa7b3fee50db6e19c1e39d0db79e6bfbe52a81"},{"id":"func/NewPostPage.addMenuLink","name":"NewPostPage.addMenuLink","line":36,"end_line":39,"hash":"bac97164d2d70bfdb946c4d54e67983c43cad093bac558f1d169e1739ca97137"},{"id":"func/NewPostPage.hasMenuLink","name":"NewPostPage.hasMenuLink","line":42,"end_line":44,"hash":"7e1abf5d0833aaf3b3da3a024de9eb2b80da900b2930e832c7e92d77e0e50344"},{"id":"func/NewPostPage.remainingCount","name":"NewPostPage.remainingCount","line":47,"end_line":49,"hash":"521ce4ed841f62099529b327f2245a9e94c09af2f67ed5d91839e52607bcea37"},{"id":"func/NewPostPage._setBusy","name":"NewPostPage._setBusy","line":52,"end_line":54,"hash":"af4c51d75a9bbfc4d8c2566414ee950704d83831ad915ee04eea8bf2fab65a3e"},{"id":"func/NewPostPage._perform","name":"NewPostPage._perform","line":57,"end_line":62,"hash":"e66f893a4913b5d6f3cc4fcc1ad58e21557b4a316f0150050c961e3ece237795"}]}
// {"version":1,"tested_at":"2026-08-26T03:34:10.185Z","module_hash":"45d772cfe40b8a34018092abbe924c01cbde741c5cbaa737a283ba35214a99ff","functions":[{"id":"func/NewPostPage.constructor","name":"NewPostPage.constructor","line":23,"end_line":33,"hash":"686653c181941b27c19cd8c1f9fa7b3fee50db6e19c1e39d0db79e6bfbe52a81"},{"id":"func/NewPostPage.addMenuLink","name":"NewPostPage.addMenuLink","line":36,"end_line":39,"hash":"bac97164d2d70bfdb946c4d54e67983c43cad093bac558f1d169e1739ca97137"},{"id":"func/NewPostPage.hasMenuLink","name":"NewPostPage.hasMenuLink","line":42,"end_line":44,"hash":"7e1abf5d0833aaf3b3da3a024de9eb2b80da900b2930e832c7e92d77e0e50344"},{"id":"func/NewPostPage.remainingCount","name":"NewPostPage.remainingCount","line":47,"end_line":49,"hash":"521ce4ed841f62099529b327f2245a9e94c09af2f67ed5d91839e52607bcea37"},{"id":"func/NewPostPage._setBusy","name":"NewPostPage._setBusy","line":52,"end_line":54,"hash":"af4c51d75a9bbfc4d8c2566414ee950704d83831ad915ee04eea8bf2fab65a3e"},{"id":"func/NewPostPage._perform","name":"NewPostPage._perform","line":57,"end_line":62,"hash":"e66f893a4913b5d6f3cc4fcc1ad58e21557b4a316f0150050c961e3ece237795"}]}
// mutate4javascript-manifest-end
+1 -1
View File
@@ -59,5 +59,5 @@ class PageController {
module.exports = PageController
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T02:56:41.826Z","module_hash":"3799cba6a1b2af39fb7e570336328abc7216f01ed2af7071a2a0d345469f7fae","functions":[{"id":"func/PageController.constructor","name":"PageController.constructor","line":13,"end_line":18,"hash":"09ba0e480cbc1213c699f45c7b6ef59e584dce4e8d4f1ab0adf5094435eba06f"},{"id":"func/PageController.setInput","name":"PageController.setInput","line":21,"end_line":24,"hash":"595484662b7ca07ef5eef5cebbff06309242552d9b4d15687df02f260ba88244"},{"id":"func/PageController.submit","name":"PageController.submit","line":29,"end_line":42,"hash":"6e9c336a13eb33e355b92a1a1f82ba6ac480c9125dc51d433a0b1acfb01d5d39"},{"id":"func/PageController._handleSubmitFailure","name":"PageController._handleSubmitFailure","line":47,"end_line":56,"hash":"3d9ad3eb3a25e11b8a1eef164b2757034499b85b439754bb606622f99c72d5f9"}]}
// {"version":1,"tested_at":"2026-08-26T03:32:57.173Z","module_hash":"3799cba6a1b2af39fb7e570336328abc7216f01ed2af7071a2a0d345469f7fae","functions":[{"id":"func/PageController.constructor","name":"PageController.constructor","line":13,"end_line":18,"hash":"09ba0e480cbc1213c699f45c7b6ef59e584dce4e8d4f1ab0adf5094435eba06f"},{"id":"func/PageController.setInput","name":"PageController.setInput","line":21,"end_line":24,"hash":"595484662b7ca07ef5eef5cebbff06309242552d9b4d15687df02f260ba88244"},{"id":"func/PageController.submit","name":"PageController.submit","line":29,"end_line":42,"hash":"6e9c336a13eb33e355b92a1a1f82ba6ac480c9125dc51d433a0b1acfb01d5d39"},{"id":"func/PageController._handleSubmitFailure","name":"PageController._handleSubmitFailure","line":47,"end_line":56,"hash":"3d9ad3eb3a25e11b8a1eef164b2757034499b85b439754bb606622f99c72d5f9"}]}
// mutate4javascript-manifest-end
+1 -1
View File
@@ -28,5 +28,5 @@ class Profiles {
module.exports = Profiles
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T02:57:34.069Z","module_hash":"6a13673cbcae9c1dc6a497b7214409f415a403b9c6eaefd04776950fb8b64768","functions":[{"id":"func/Profiles.constructor","name":"Profiles.constructor","line":13,"end_line":15,"hash":"d13fcf15cca167093fca3cb89c2482d1fbbfac5afad666e4b9cf47a440aa8394"},{"id":"func/Profiles.setName","name":"Profiles.setName","line":17,"end_line":20,"hash":"5a36c6e237798608de0bedd8744b75000c0eec5c0a6a64c870a25bcdf20aed21"},{"id":"func/Profiles.getName","name":"Profiles.getName","line":22,"end_line":25,"hash":"2fcb9d84687ea0f3b24f3e34c0a72eda55a4e869b87e08a7f4551321a4166198"}]}
// {"version":1,"tested_at":"2026-08-26T03:33:56.932Z","module_hash":"6a13673cbcae9c1dc6a497b7214409f415a403b9c6eaefd04776950fb8b64768","functions":[{"id":"func/Profiles.constructor","name":"Profiles.constructor","line":13,"end_line":15,"hash":"d13fcf15cca167093fca3cb89c2482d1fbbfac5afad666e4b9cf47a440aa8394"},{"id":"func/Profiles.setName","name":"Profiles.setName","line":17,"end_line":20,"hash":"5a36c6e237798608de0bedd8744b75000c0eec5c0a6a64c870a25bcdf20aed21"},{"id":"func/Profiles.getName","name":"Profiles.getName","line":22,"end_line":25,"hash":"2fcb9d84687ea0f3b24f3e34c0a72eda55a4e869b87e08a7f4551321a4166198"}]}
// mutate4javascript-manifest-end
+1 -1
View File
@@ -53,5 +53,5 @@ SetNamePage.ACCOUNT_PATH = ACCOUNT_PATH
module.exports = SetNamePage
// mutate4javascript-manifest-begin
// {"version":1,"tested_at":"2026-08-26T02:57:01.182Z","module_hash":"398fed9fb3ec02fb64027d97c4d0110f667014fd86102413e03c92b26cdbb03c","functions":[{"id":"func/SetNamePage.constructor","name":"SetNamePage.constructor","line":23,"end_line":29,"hash":"4ce053830f485ce8a0fba4495cd85fc5e2cac3c9db88b5cbf1e8c66a371a9752"},{"id":"func/SetNamePage.remainingCount","name":"SetNamePage.remainingCount","line":32,"end_line":34,"hash":"a6aac7215cf5bcbbfbab23f8edfa3c665bcf0ddf6db1d83601c9c23b9de56ad6"},{"id":"func/SetNamePage._setBusy","name":"SetNamePage._setBusy","line":37,"end_line":39,"hash":"a0947ed899e0def1f6ae243197d409f5603c4820467f0e0fafdcb4deadb3a92b"},{"id":"func/SetNamePage._perform","name":"SetNamePage._perform","line":42,"end_line":47,"hash":"8614f25b06dcb21b81ab94b4a4611c5e3719ebf4ed7ab13e13976ab0d5938b27"}]}
// {"version":1,"tested_at":"2026-08-26T03:33:19.790Z","module_hash":"398fed9fb3ec02fb64027d97c4d0110f667014fd86102413e03c92b26cdbb03c","functions":[{"id":"func/SetNamePage.constructor","name":"SetNamePage.constructor","line":23,"end_line":29,"hash":"4ce053830f485ce8a0fba4495cd85fc5e2cac3c9db88b5cbf1e8c66a371a9752"},{"id":"func/SetNamePage.remainingCount","name":"SetNamePage.remainingCount","line":32,"end_line":34,"hash":"a6aac7215cf5bcbbfbab23f8edfa3c665bcf0ddf6db1d83601c9c23b9de56ad6"},{"id":"func/SetNamePage._setBusy","name":"SetNamePage._setBusy","line":37,"end_line":39,"hash":"a0947ed899e0def1f6ae243197d409f5603c4820467f0e0fafdcb4deadb3a92b"},{"id":"func/SetNamePage._perform","name":"SetNamePage._perform","line":42,"end_line":47,"hash":"8614f25b06dcb21b81ab94b4a4611c5e3719ebf4ed7ab13e13976ab0d5938b27"}]}
// mutate4javascript-manifest-end