Commit Graph
100 Commits
Author SHA1 Message Date
Chris Troutner bf51558800 Merge commit '7ca73cffdc' into swarmforge-coder 2026-09-04 10:00:45 -07:00
Chris Troutner 59cce4426d Reduce paginated client page size to 50
By coder.
2026-09-04 10:00:19 -07:00
Chris Troutner 7ca73cffdc Review youtube-embed property tests, document equivalents
By architect.
2026-09-04 09:50:19 -07:00
Chris Troutner 5117e6537b Merge commit '9ec8760b59' into swarmforge-architect 2026-09-04 09:48:00 -07:00
Chris Troutner 81cedabcdf Specify 50-item page size for all paginated pages
By specifier.
2026-09-04 09:47:47 -07:00
Chris Troutner 9ec8760b59 Add property tests for youtube-embed parser invariants
Cover round-trip reconstruction, segment shape, non-YouTube URLs staying
text, and video-id round trips over broad random inputs.

By refactorer.
2026-09-04 09:43:51 -07:00
Chris Troutner 73c937d6b0 Use dry4javascript --help in startup smoke check
By architect.
2026-09-04 09:41:06 -07:00
Chris Troutner 0dba837238 Update briefing and backlog after youtube-embed merge
By specifier.
2026-09-04 09:38:04 -07:00
Chris Troutner b63019c31f Review youtube-embed: harden parser edge cases, document equivalents
Add unit tests for invalid video id and non-/watch youtube.com URL to
kill mutation survivors; document the match[1]/match[0] equivalent and
the soft-Gherkin example-value equivalents.

By architect.
2026-09-04 09:28:13 -07:00
Chris Troutner 93baa25ad0 Reduce CRAP in youtube-embed parser
Extract validVideoId, parseCandidate, videoIdFromWatchUrl,
videoIdFromShortUrl, and pushText helpers to lower cyclomatic
complexity of extractYouTubeVideoId and parsePostText to <= 6.

By refactorer.
2026-09-04 09:19:18 -07:00
Chris Troutner b478d132fe Merge commit '8e606aecb1' into swarmforge-refactorer 2026-09-04 08:51:05 -07:00
Chris Troutner 8e606aecb1 Implement YouTube embed rendering in recent posts feed
By coder.
2026-09-04 08:50:28 -07:00
Chris Troutner 146685434e Specify YouTube embed in posts
By specifier.
2026-09-04 08:43:41 -07:00
Chris Troutner 4eea327f60 Reduce CRAP and DRY in psf-memo-db
- Add tests for profile/level handleError to raise coverage
- Extract DbBackup pure helpers into testable db-backup-util module
- Add tests for DbBackup zip/unzip and the pure helpers
- Extract shared handleControllerError helper across 7 REST controllers

By refactorer.
2026-09-04 07:52:19 -07:00
Chris Troutner 15d7491a69 Merge architect topics-most-recent-order review
By specifier.
2026-09-04 07:33:22 -07:00
Chris Troutner 5bb2906d92 Review topics-most-recent-order: hide lastHeight ordering key, harden height-0 cases
By architect.
2026-09-04 07:25:44 -07:00
Chris Troutner 57915081c6 Update listTopics property test comment to reflect most-recent-post ordering
By refactorer.
2026-09-04 06:59:50 -07:00
Chris Troutner f7647c70f4 Merge commit 'f45f2f9e2a' into swarmforge-refactorer 2026-09-04 06:43:42 -07:00
Chris Troutner f45f2f9e2a Order GET /topics by most recent post
By coder.
2026-09-04 06:43:28 -07:00
Chris Troutner 5bc61c76d9 Merge specifier topics-most-recent-order spec\n\nBy coder. 2026-09-04 06:39:53 -07:00
Chris Troutner bc07eda916 Spec GET /topics ordering by most recent post
By specifier.
2026-09-04 06:39:31 -07:00
Chris Troutner 2a3e742532 Pass appData to Profile route so Follow/Mute buttons receive the wallet
By specifier.
2026-09-03 21:44:01 -07:00
Chris Troutner 0613aa4a29 Merge profile-wallet-connect review from architect
By refactorer.
2026-09-03 16:19:15 -07:00
Chris Troutner c0893d36cd Merge architect profile-wallet-connect review
By coder.
2026-09-03 16:19:09 -07:00
Chris Troutner fdd13ef734 Review profile-wallet-connect: confirm selector, fix gherkin-parser wrapper
Reviewed the refactorer's profile-wallet-connect work. getViewerAddress is a
clean pure selector (reactive-then-wallet precedence, null-on-absent); the
profile index.js wiring fix is sound and correctly re-loads when the address
becomes available. Fixed swarmforge/scripts/gherkin-parser, which delegated to
a non-existent .swarmforge/tools/aps path, to use the established tmp/aps-spec
checkout. Added the mutation differential-manifest for the new module.
Verification: 243 client unit + 33 property tests pass, lint clean,
mutation 2 killed / 0 survived, DRY no candidates, soft Gherkin mutation
6 intrinsic equivalents.

By architect.
2026-09-03 16:19:00 -07:00
Chris Troutner 2bd9af5a1b Merge commit '5c6bffd6de' into swarmforge-architect 2026-09-03 16:15:35 -07:00
Chris Troutner 68df72fcc6 Merge notifications property test review from architect
By refactorer.
2026-09-03 16:13:50 -07:00
Chris Troutner 5c6bffd6de Add getViewerAddress property tests for reactive precedence
Pin the profile wallet-address selector invariants over broad input
space: reactive-state precedence, wallet fallback, and null-on-absent.
CRAP (3.0), DRY, and mutation scan assessed; no split needed and no
manifests discarded.

By refactorer.
2026-09-03 16:13:15 -07:00
Chris Troutner c558027286 Merge architect notifications property-test review
By coder.
2026-09-03 16:10:35 -07:00
Chris Troutner 9cdc5941f0 Review notifications property tests: confirm reference oracle, run verification
Merged the refactorer's notifications-query property-test suite and reviewed
it architecturally. Property tests are well-placed in test/property/, reuse
the shared harness, and the independent buildExpected oracle traces 1:1
against the production aggregation/sort/pagination. No production source
changed. Verification: 39 property tests pass, 315 unit tests pass, lint
clean, mutation differential 0/0/0 (no regression), DRY no candidates,
soft Gherkin mutation 0 killed / 16 intrinsic equivalents.

By architect.
2026-09-03 16:10:07 -07:00
Chris Troutner 62af430e8e Merge profile wallet connect implementation from coder
By refactorer.
2026-09-03 16:08:13 -07:00
Chris Troutner c294617782 Fix profile page wallet address wiring so Follow button appears for other profiles
Use the reactive bchWalletState.cashAddress as the viewer address source
and include it in the profile load effect dependencies. Extract a small
wallet-address selector so the behavior is unit-testable.

By coder.
2026-09-03 16:07:48 -07:00
Chris Troutner cf09636a76 Merge commit '2704c2059d' into swarmforge-architect 2026-09-03 16:05:53 -07:00
Chris Troutner 2704c2059d Add notifications-query property tests for ordering and pagination
Pin the NotificationsQuery aggregation invariants over broad random
inputs: newest-first ordering with seen tie-break, global ordering, and
pagination conservation. Coverage, CRAP (max 6.0), DRY, and mutation
scan were assessed; all changed/new source files are well under the
100-site split threshold and mutation manifests are preserved.

By refactorer.
2026-09-03 16:04:36 -07:00
Chris Troutner b2756d2ead Merge specifier profile-wallet-connect briefing
By coder.
2026-09-03 16:03:34 -07:00
Chris Troutner 58dc9ac719 Merge notifications review refactor from architect
By refactorer.
2026-09-03 15:55:32 -07:00
Chris Troutner c9e0c294f8 Merge architect notifications refactor
By coder.
2026-09-03 15:54:55 -07:00
Chris Troutner edbdbc6019 Record architect merge in briefing
By specifier.
2026-09-03 14:28:45 -07:00
Chris Troutner d99eda3db4 Add startup bloat check for mutation build dirs
Record the tmp/acceptance and target/mutation-workers bloat that made
mutate4javascript worker copies many GB and mutation runs appear to hang.
Add a startup check that flags any of these dirs over 100MB so they are
cleaned before a mutation run.

By architect.
2026-09-03 14:23:38 -07:00
Chris Troutner fcb864b6b6 Merge commit 'cd7da1f696' into swarmforge-architect
By architect.
2026-09-03 14:11:45 -07:00
Chris Troutner 87ca402cae Review notifications refactor: extract shared getPostOrNull, add adapter unit suite
Extract the post-lookup-with-null helper into a shared module used by both
the notifications and post query adapters, removing duplication. Add a
dedicated NotificationsQuery unit suite (26 tests) and hardening tests that
kill the sort-comparator and followee-guard mutations. Refresh mutation
manifests via the approved tool. Document 5 intrinsic mutation equivalents
and 16 soft-Gherkin equivalents in the review summary.

By architect.
2026-09-03 14:10:54 -07:00
Chris Troutner 8592db3dbc Add gherkin-parser wrapper for APS Babashka task
By coder.
2026-09-03 09:34:51 -07:00
Chris Troutner cd7da1f696 Merge specifier commit 45882dc4aa into swarmforge-coder
By coder.
2026-09-03 06:55:43 -07:00
Chris Troutner 45882dc4aa Remove debug console.logs from profile page
By specifier.
2026-09-03 06:49:21 -07:00
Chris Troutner 4764edff78 Adding console.log for debugging 2026-09-03 06:40:11 -07:00
Chris Troutner cfa3d82782 Clear backlog; set direction to front-end improvements
By specifier.
2026-09-03 06:21:52 -07:00
Chris Troutner d3903fa2b4 Record notifications merge in briefing and backlog
By specifier.
2026-09-02 20:37:53 -07:00
Chris Troutner 45a2fc2579 Merge notifications feature from architect
By specifier.
2026-09-02 20:37:40 -07:00
Chris Troutner ab5254c469 Merge commit '5389660b76' into swarmforge-refactorer 2026-09-02 13:11:39 -07:00
Chris Troutner f1841b64a6 Refactor notifications: extract reply predicate, add manifests
Extract the reply-notification predicate from
_collectReplyNotifications into a _replyNotificationChild helper, moving
the txid-presence guard into the loop so both functions drop to CRAP 5.
Add mutation manifests for the new notifications-query, list-notifications,
and notifications-page modules via the approved tool.

By refactorer.
2026-09-02 13:11:29 -07:00
Chris Troutner 73ff53553f Merge following-feed review refactor from architect
By coder.
2026-09-02 13:02:01 -07:00
Chris Troutner 5389660b76 Review isFolloweePost refactor: confirm CRAP cut, refresh manifests
By architect.
2026-09-02 13:01:34 -07:00
Chris Troutner 9d63733166 Merge commit '5c95e4bf57' into swarmforge-refactorer 2026-09-02 12:55:04 -07:00
Chris Troutner 5c95e4bf57 Serialize notification aggregation to avoid concurrent LevelDB iterators
By coder.
2026-09-02 12:54:13 -07:00
Chris Troutner 1a7d2574ce Merge commit '8ee07fc35f' into swarmforge-refactorer 2026-09-02 12:53:28 -07:00
Chris Troutner 8ee07fc35f Implement Notifications read-only feature
Add psf-memo-db notifications query, use case, route, and tests.
Add psf-memo-client NotificationsPage service, React page, nav link,
route, and tests. Wire acceptance handlers for notifications.

By coder.
2026-09-02 12:53:02 -07:00
Chris Troutner 53ead58b9c Merge branch 'swarmforge-refactorer' into swarmforge-architect 2026-09-02 12:52:12 -07:00
Chris Troutner b85878a5d5 Refactor following-feed scan: extract isFolloweePost to cut CRAP
Extract the reply/viewer/membership predicate from
scanFollowingFeedTxidsAndCount into an isFolloweePost helper, reducing
the scan's cyclomatic complexity from 7 to 5 (CRAP 7.0 to 5.0) while
preserving behavior. Refresh the mutation manifest via the approved tool.

By refactorer.
2026-09-02 12:51:53 -07:00
Chris Troutner 843a90ec8c Record notifications handoff in briefing and backlog
By specifier.
2026-09-02 12:33:22 -07:00
Chris Troutner 297abf6389 Spec Notifications (P6.3)
Add Gherkin spec for the Notifications read-side feature: the psf-memo-db
API aggregates replies to the viewer's posts, likes on the viewer's posts,
and follows of the viewer into a single newest-first, paginated list; the
client renders a Notifications page. Only actions by other people on the
viewer's own content are shown.

By specifier.
2026-09-02 12:32:57 -07:00
Chris Troutner c5a609b3e7 Record following-feed hardening merge in briefing and backlog
By specifier.
2026-09-02 12:31:26 -07:00
Chris Troutner 4422372c51 Merge following-feed hardening from architect
Merge the architect's second-pass hardening of the Following feed (P6.6):
extract parseRequiredString shared by the addr/room-scoped list use cases,
add client and DB composition-root hardening tests, and record the review
summary and architect process notes.

By specifier.
2026-09-02 12:31:16 -07:00
Chris Troutner d8639dc04c Point architect startup at its process notes
By architect.
2026-09-02 12:27:00 -07:00
Chris Troutner b4848c887e Rename process notes to architect-scoped and add role guard
By architect.
2026-09-02 12:25:24 -07:00
Chris Troutner fe75bc0dbd Document review-summary force-add exception in process notes
By architect.
2026-09-02 12:23:44 -07:00
Chris Troutner 4f6b09e011 Commit following-feed review summary (force-add; docs/ is gitignored)
By architect.
2026-09-02 12:23:38 -07:00
Chris Troutner 4bf99e7db0 Review and harden following feed: kill survivors, DRY parseRequiredString
- Extract parseRequiredString into pagination.js, shared by the three list
  use cases, removing duplicated required-field guards.
- Add client hardening tests (emptyBecauseNoFollows init, canLoadMore null
  guard) and a DB composition-root test for UseCases.start.
- Refresh mutation manifests and Gherkin acceptance-mutation stamp.

By architect.
2026-09-02 12:20:37 -07:00
Chris Troutner 9b482c4ae0 Mark Following feed (P6.6) shipped; update briefing
By specifier.
2026-08-29 13:01:25 -07:00
Chris Troutner 62d6297197 Merge Following feed (P6.6) from refactorer 2026-08-29 10:44:54 -07:00
Chris Troutner d606ee6608 Refactor following feed: reduce CRAP/DRY, add property coverage
- Extract shared runUseCase and listPostsForAddr in the posts controller to
  remove the duplicated try/catch error wrapper (CRAP 14.7 -> 4.0) and DRY
  the addr-scoped handlers.
- Add error-path unit tests for the posts controller covering both branches
  of handleError.
- Consolidate ListFollowingFeed onto the shared ListUseCase constructor to
  remove constructor duplication across list use cases.
- Add property tests for scanFollowingFeedTxidsAndCount (ordering, reply/
  viewer/membership exclusion, pagination conservation) and for the client
  FollowingFeedPage.load state invariants.

By refactorer.
2026-08-29 10:44:28 -07:00
Chris Troutner 9fff348081 Merge branch 'swarmforge-coder' into swarmforge-refactorer 2026-08-29 10:31:33 -07:00
Chris Troutner 6d1bd148e9 Implement Following feed
Add psf-memo-db endpoint GET /posts/following/:addr that returns top-level
posts from followed profiles, excluding replies and the viewer's own posts,
newest first and paginated. Add PostQuery.scanFollowingFeedTxidsAndCount,
ListFollowingFeed use case, and REST controller/router wiring.

Add psf-memo-client Following feed page, route /posts/following, nav link,
MemoDb.getFollowingFeed, and FollowingFeedPage service. Update acceptance
handlers for the new following-feed.feature.

By coder.
2026-08-29 10:30:54 -07:00
Chris Troutner 9f5357ba29 Record following-feed handoff in backlog and briefing
By specifier.
2026-08-29 10:22:14 -07:00
Chris Troutner 6d94372438 Spec Following feed (P6.6)
By specifier.
2026-08-29 10:21:28 -07:00
Chris Troutner 96956f3ef3 Mark Search (P6.4) shipped; update briefing
By specifier.
2026-08-29 09:25:52 -07:00
Chris Troutner 20328eabe7 Merge Search feature (P6.4) from architect
Merge swarmforge-architect into master. Verified client (build/test/lint)
and DB (test/lint) after merge.

By specifier.
2026-08-29 09:25:43 -07:00
Chris Troutner e8bf42a1f3 Review and harden search: kill mutation survivors, refresh manifests
Add hardening tests to kill mutation survivors in SearchQuery guards and
profileMatches defaults, SearchAll pagination/empty-query guards, the search
REST controller 500-error path, and the client SearchPage constructor/getPost/
getProfile. Refresh mutation manifests and the Gherkin acceptance-mutation
stamp.

By architect.
2026-08-29 08:51:42 -07:00
Chris Troutner d3e3b23bbe Refactor search: reduce CRAP, DRY, add property coverage
- Split SearchQuery.searchProfiles/searchPosts into small helpers to bring
  CRAP to 5.0 or below across the search feature.
- Extract shared normalizeQuery/sortByHeightDesc (src/lib/search.js) and
  loadReplyTxids (src/adapters/lib/load-reply-txids.js) to remove duplication
  with search-all, list-recent-profiles, and post-query.
- Add error-path unit tests for the search controller.
- Add property tests for SearchQuery and SearchAll (pagination, ordering,
  case-insensitivity, reply exclusion, substring containment).
- Refresh mutation manifests for post-query and list-recent-profiles.

By refactorer.
2026-08-29 07:35:26 -07:00
Chris Troutner 8508fdaff0 Implement Search feature (P6.4)
- Add psf-memo-db /search endpoint with SearchQuery adapter, SearchAll use case,
  and REST controller/router.
- Add psf-memo-client SearchPage service, Search component, route, and nav link.
- Wire search support into the acceptance handler fake MemoDb.
- Add unit tests for the new adapter, use case, controller, and page service.

By coder.
2026-08-29 07:18:39 -07:00
Chris Troutner 236bb5a9fa Update specifier briefing for task search
By specifier.
2026-08-29 07:11:08 -07:00
Chris Troutner d11365c057 Spec Search feature (P6.4)
Add psf-memo-client/specs/search.feature specifying the /search read
endpoint (posts by text, profiles by name/bio) and the client Search page.
Update the backlog: mark Search in pipeline, note Send money (P5.1) skipped.

By specifier.
2026-08-29 07:10:38 -07:00
Chris Troutner 35cb1725a3 Update briefing and backlog for mute-user merge
Mark P4.1/P4.2 mute/unmute shipped; point next spec at P5.1 send money.

By specifier.
2026-08-28 21:46:05 -07:00
Chris Troutner ac468072df Review and harden mute-user: kill mutation survivors, refresh manifests
Add hardening tests to kill mutation survivors in MemoMute.validate,
ProfilePage constructor/_loadState/canMute, MuteQuery._nextString,
MuteState validation guards, and the mute REST controller statused-error
path. Refresh mutation manifests and Gherkin acceptance-mutation stamps.

By architect.
2026-08-28 21:08:50 -07:00
Chris Troutner d8ab5bc79c Refactor mute-user: reduce DRY, add property coverage
Extract shared _getState/_getList helpers in the client MemoDb, a shared
_loadState/_setState base in ProfilePage, and a runAction helper for the
profile follow/mute handlers. Add property tests for the MemoMute service,
the DB MuteQuery adapter, and the indexer handleMute action. Preserve
behavior; all unit, acceptance, and property suites pass across client, DB,
and indexer.

By refactorer.
2026-08-28 19:58:39 -07:00
Chris Troutner 4b03210e85 Implement mute/unmute user feature (0x6d16/0x6d17)
- Client: MemoMute service, ProfilePage mute controls, Profile UI Mute/Unmute buttons,
  Profiles mute state, MemoDb mute read APIs, unit/acceptance tests.
- DB: mutes LevelDB store, MuteQuery adapter, /mute REST routes, MuteState and ListMuted use cases, tests.
- Indexer: mute/unmute action codes, handleMute action handler, muteDb adapter, tests.
- Backlog: mark P4.1/P4.2 mute/unmute as shipped.

By coder.
2026-08-28 19:38:42 -07:00
Chris Troutner fa90179869 Spec mute/unmute user (P4.1/P4.2)
Add client, DB, and indexer Gherkin specs for the Memo mute (0x6d16) and
unmute (0x6d17) actions.

By specifier.
2026-08-28 19:07:07 -07:00
Chris Troutner befae539c7 Update briefing and backlog for poll-actions merge
By specifier.
2026-08-28 18:24:22 -07:00
Chris Troutner 6309c4a50d Merge branch 'swarmforge-coder' 2026-08-28 18:11:39 -07:00
Chris Troutner 06e95150e3 Review and harden poll actions: kill mutation survivors, reduce DRY
- Add hardening tests to kill mutation survivors across client, DB, and
  indexer (hex guards, poll byte-limit boundaries, busy-flag defaults,
  parseTxid empty-string, polls controller handleError, memo-codes
  isMemoPrefix, normalizePollCreateDatas, storePollChildRecord returns).
- Reduce duplication: extract shared reflect/isTooLong into MemoTxidAction
  (client), shared _run into the polls controller and configurable execute
  into PollReadUseCase (DB).
- Refresh mutation manifests and Gherkin acceptance-mutation stamps.

By architect.
2026-08-28 17:51:03 -07:00
Chris Troutner 739b13bfb2 Refactor poll actions: reduce CRAP/DRY, add property coverage
Extract shared txid-action and poll-page bases in the client, a shared
poll-read use-case base and a poll-txid iteration helper in the DB, and a
shared poll-child record helper in the indexer. Reduce normalizePollCreateDatas
complexity (CRAP 7.1 -> 5.0). Add property tests for poll services, handlers,
and query filtering. Preserve behavior; all unit, acceptance, and property
suites pass across client, DB, and indexer.

By refactorer.
2026-08-28 15:23:04 -07:00
Chris Troutner cf05de6630 Implement poll actions (create, option, vote) across client, indexer, and DB
- Client: add MemoPollCreate, MemoPollOption, MemoPollVote services and page controllers.
- Indexer: add create-poll, add-poll-option, and poll-vote handlers with new poll DB adapters.
- DB: add polls/pollOptions/pollVotes stores, PollQuery adapter, GET /polls/:txid endpoints, and use cases.
- Add Gherkin acceptance handlers and focused unit tests for all three components.

By coder.
2026-08-28 14:50:05 -07:00
Chris Troutner b349af0ae3 Update briefing and backlog for P3 poll-actions handoff
By specifier.
2026-08-28 14:11:50 -07:00
Chris Troutner 5d7ce7601b Spec P3 poll actions: create poll, add option, vote
By specifier.
2026-08-28 14:11:14 -07:00
Chris Troutner 25de2d9eb7 Update backlog and briefing for topic-actions merge
By specifier.
2026-08-28 13:38:29 -07:00
Chris Troutner 61616eb9eb Merge topic-actions implementation from architect
Merge swarmforge-architect into master for task topic-actions.

By specifier.
2026-08-28 13:17:10 -07:00
Chris Troutner 5183359143 Review and harden topic actions: kill mutation survivors
- Add hardening tests for topic-post-page, profiles, topic-feed-page, and
  topic-query to kill mutation survivors.
- Refresh mutation manifests and Gherkin acceptance-mutation stamps.
- Add topic-actions review summary.

By architect.
2026-08-28 13:13:01 -07:00
Chris Troutner d6f56780be Refactor topic actions: reduce CRAP/DRY, add property coverage, complete acceptance
- Add unit coverage for Profiles topic follow state to bring CRAP to 4.
- DRY Profiles set/get follow state via shared nested-map helpers.
- Add TopicQuery topic-follow read-side property tests and MemoTopicPost
  byte-accounting property tests.
- Complete client and DB acceptance step handlers and mocks for the
  topic-follow and topic-post features.

By refactorer.
2026-08-28 11:13:03 -07:00
Chris Troutner 50e287ed0f Implement topic post, follow, and unfollow
- Add MemoTopicPost service and TopicPostPage controller for topic messages.
- Add MemoTopicFollow service for topic follow/unfollow broadcasts.
- Extend TopicFeedPage with follow state and follower list.
- Update TopicFeed view with composer and Follow/Unfollow button.
- Extend MemoDb client with topic follow state and followers endpoints.
- Extend Profiles store with topic follow state.
- Add DB topic follow read side: TopicQuery, use cases, REST routes.
- Add unit tests for all new behavior.

By coder.
2026-08-28 10:55:42 -07:00
Chris Troutner 20cc2e0399 Update backlog and briefing for topic-actions handoff
By specifier.
2026-08-28 10:44:20 -07:00
Chris Troutner b8a10d3706 Spec topic post, follow, and unfollow actions
Add client specs for the topic post composer and topic follow/unfollow
buttons, plus the DB read side for topic follow state and followers.

By specifier.
2026-08-28 10:43:52 -07:00