Memory Wiki

Untitled Session

2026-05-25 07:52 UTC · 34 messages · cli

You2026-05-25 08:02 UTC
Fix ALL 17 gremlin items. Write fixes to the codebase. After each fix, verify with php -l. Write a summary of what was changed. ## Priority Order (do in this order) ### CRITICAL (6 items) **1. Fix Brevo Webhook — Return HTTP 500 on Errors** File: /root/profe-modules/brevo_service/src/BrevoService/BrevoServiceModule.php Find the catch block in handleBrevoWebhook (around line 226-231) that returns ['success'=>true] with HTTP 200 on error. Change to return HTTP 500 so Brevo retries. Pattern: same as Stripe webhook handler returns 500 on processing failure. **2. Fix CSRF Nonce Enforcement — Stub is No-Op** File: /root/profe-modules/csrf_middleware/src/CsrfMiddleware/CsrfMiddlewareStub.php Replace the empty requireValidNonce() with a real implementation that calls wp_verify_nonce() and throws if invalid. Also implement generateNonce() using wp_create_nonce(). **3. Build Real CoreUsersInterface — Stop Returning Null** File: /root/profe-modules/core_users/src/CoreUsers/CoreUsersStub.php Replace stub methods with real queries against profe_users table via ProfeDB. Implement findByUuid, findByEmail, findByWpId, getAllUsers, search. **4. Build Real ConfigManager — Stop Returning Defaults** File: /root/profe-modules/config_manager/src/ConfigManager/ConfigManagerStub.php Implement a simple array-based config store that reads from a config file or env vars. Store values in a static array. get() returns from array or $default. has() checks existence. **5. Build Real EventBus — Stop Dropping Events** File: /root/profe-modules/event_bus/src/EventBus/EventBusStub.php Implement a simple in-memory event bus. emit() calls all registered listeners. on() registers a listener. Remove the "Stub" suffix — rename to EventBus or EventBusService. **6. Fix InputSanitizer Stub — Should Actually Sanitize** File: /root/profe-modules/input_sanitizer/src/InputSanitizer/InputSanitizerStub.php Implement real sanitization: strip_tags for string, filter_var for email, wp_kses for HTML, validate as appropriate. ### HIGH Items (remaining) **7. Fix Duplicate Migration Version Numbers** In /root/profe-modules/migrations/, find all duplicate version pairs. Rename the community versions (045-052) to unique numbers (058-065). Update migration PHP classes to match. **8. Fix Empty Catch in StripeService.resolveUuidFromCustomer()** File: /root/profe-modules/stripe_service/src/StripeService/StripeService.php around line 611 Replace empty catch with error_log + return null. **9. Fix SyncCrmStep — Silently Swallows CRM Errors** File: /root/profe-modules/form_entries/src/FormSubmissions/Pipeline/Steps/SyncCrmStep.php Log the error, set step result to failed, don't return success. **10. Fix Pipeline Order — Payment Before User Creates Orphan PaymentIntents** Swap the order of ProcessPaymentStep and CreateWpUserStep in the pipeline registration at FormSubmissionsModule.php **11. Write Unit Tests for Pipeline Steps** Create test files for the 9 pipeline step classes. At minimum 1 test per step class. **12. Build Admin Dashboard for Failed Pipeline Steps** Not a code fix — log this finding for future. Skip for now. **13. Add Tests for Core Modules** Not urgent — log for future. Skip for now. **14. Fix Duplicate Community Migration Version Numbers (045-052)** Same as #7 above. **15. Fix StripeWebhookHandler — Type Confusion + Missing Idempotency + Dead Route** Fix the type confusion (line 113). Add idempotency check. Don't worry about the dead route for now. **16. Move Direct SQL Queries to Repository Layer** This is a large refactor across 7+ service files. Create repository methods and update service files. **17. Fix CreateMemLevelFeaturesMigration — Wrong SQL File + Missing Interface** Fix the migration class to read the correct SQL file and add implements MigrationInterface. ## Output Write a summary of all changes made to /root/.hermes/plans/tb-fixes-log.md
Donna2026-05-25 08:02 UTC
I'll start by reading all the critical files to understand their current state, then fix them one by one.
Tool2026-05-25 08:02 UTC
{"content": " 210| $apiKey = $config->get('brevo.api_key', '');\n 211| $apiEndpoint = $config->get('brevo.api_endpoint', 'https://api.brevo.com/v3');\n 212| $cacheTtl = (int) $config->get('brevo.cache_ttl', 900);\n 213| $apiClient = new BrevoApiCli...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\CsrfMiddleware;\n 5|\n 6|class CsrfMiddlewareStub implements CsrfMiddlewareInterface\n 7|{\n 8| public function requireValidNonce(): void\n 9| {\n 10| // Stub — no-op\n ...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\CoreUsers;\n 5|\n 6|class CoreUsersStub implements CoreUsersInterface\n 7|{\n 8| public function findByUuid(string $uuid): ?array\n 9| {\n 10| // Stub — returns null\n ...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\ConfigManager;\n 5|\n 6|class ConfigManagerStub implements ConfigManagerInterface\n 7|{\n 8| public function get(string $key, mixed $default = null): mixed\n 9| {\n 10| //...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\EventBus;\n 5|\n 6|class EventBusStub implements EventBusInterface\n 7|{\n 8| public function emit(string $event, array $payload = []): void\n 9| {\n 10| // Stub — no-op\n...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\InputSanitizer;\n 5|\n 6|class InputSanitizerStub implements InputSanitizerInterface\n 7|{\n 8| public function sanitize(mixed $input, string $type = 'string'): mixed\n 9| {\n 10...
Donna2026-05-25 08:02 UTC
Let me read the interfaces and additional context files needed.
Tool2026-05-25 08:02 UTC
{"total_count": 2, "matches": [{"path": "/root/profe-modules/core_users/src/CoreUsers/CoreUsersStub.php", "line": 6, "content": "class CoreUsersStub implements CoreUsersInterface"}, {"path": "/root/profe-modules/core_users/src/CoreUsers/CoreUsersInterface.php", "line": 6, "content": "interface CoreU...
Tool2026-05-25 08:02 UTC
{"total_count": 2, "matches": [{"path": "/root/profe-modules/config_manager/src/ConfigManager/ConfigManagerInterface.php", "line": 6, "content": "interface ConfigManagerInterface"}, {"path": "/root/profe-modules/config_manager/src/ConfigManager/ConfigManagerStub.php", "line": 6, "content": "class Co...
Tool2026-05-25 08:02 UTC
{"total_count": 2, "matches": [{"path": "/root/profe-modules/event_bus/src/EventBus/EventBusStub.php", "line": 6, "content": "class EventBusStub implements EventBusInterface"}, {"path": "/root/profe-modules/event_bus/src/EventBus/EventBusInterface.php", "line": 6, "content": "interface EventBusInter...
Tool2026-05-25 08:02 UTC
{"total_count": 2, "matches": [{"path": "/root/profe-modules/input_sanitizer/src/InputSanitizer/InputSanitizerInterface.php", "line": 6, "content": "interface InputSanitizerInterface"}, {"path": "/root/profe-modules/input_sanitizer/src/InputSanitizer/InputSanitizerStub.php", "line": 6, "content": "c...
Tool2026-05-25 08:02 UTC
{"total_count": 2, "matches": [{"path": "/root/profe-modules/csrf_middleware/src/CsrfMiddleware/CsrfMiddlewareInterface.php", "line": 6, "content": "interface CsrfMiddlewareInterface"}, {"path": "/root/profe-modules/csrf_middleware/src/CsrfMiddleware/CsrfMiddlewareStub.php", "line": 6, "content": "c...
Tool2026-05-25 08:02 UTC
{"total_count": 0}
Donna2026-05-25 08:02 UTC
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\CoreUsers;\n 5|\n 6|interface CoreUsersInterface\n 7|{\n 8| public function findByUuid(string $uuid): ?array;\n 9|\n 10| public function findByEmail(string $email): ?array;\n ...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\ConfigManager;\n 5|\n 6|interface ConfigManagerInterface\n 7|{\n 8| public function get(string $key, mixed $default = null): mixed;\n 9|\n 10| public function set(string $key, mi...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\EventBus;\n 5|\n 6|interface EventBusInterface\n 7|{\n 8| public function emit(string $event, array $payload = []): void;\n 9|\n 10| public function on(string $event, callable $l...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\InputSanitizer;\n 5|\n 6|interface InputSanitizerInterface\n 7|{\n 8| public function sanitize(mixed $input, string $type = 'string'): mixed;\n 9|\n 10| public function sanitizeA...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|declare(strict_types=1);\n 3|\n 4|namespace Profe\\CsrfMiddleware;\n 5|\n 6|interface CsrfMiddlewareInterface\n 7|{\n 8| public function requireValidNonce(): void;\n 9|\n 10| public function verifyNonce(string $nonce): bool;\n ...
Tool2026-05-25 08:02 UTC
{"total_count": 5, "files": ["/root/profe-modules/leaderboard/src/Leaderboard/LeaderboardService.php", "/root/profe-modules/leaderboard/src/Leaderboard/LeaderboardModule.php", "/root/profe-modules/mem_data/src/MemData/MemDataModule.php", "/root/profe-modules/leaderboard/tests/Unit/LeaderboardReposit...
Donna2026-05-25 08:02 UTC
Let me look at how ProfeDB is used and the patterns elsewhere, plus check remaining items.
Tool2026-05-25 08:02 UTC
{"total_count": 0}
Tool2026-05-25 08:02 UTC
{"content": "", "total_lines": 0, "file_size": 0, "truncated": false, "is_binary": false, "is_image": false, "error": "File not found: /root/profe-modules/leaderboard/src/Leaderboard/LeaderboardRepositoryTest.php", "similar_files": ["/root/profe-modules/leaderboard/src/Leaderboard/LeaderboardInterfa...
Tool2026-05-25 08:02 UTC
{"content": " 1|<?php\n 2|/**\n 3| * LeaderboardService — Service implementation\n 4| *\n 5| * Computed from profe_com_posts, profe_com_comments, profe_com_user_badges.\n 6| * Results cached for 5 minutes.\n 7| *\n 8| * @package Profe\\Leaderboard\n 9| */\n 10|...
Donna2026-05-25 08:02 UTC
Tool2026-05-25 08:02 UTC
{"total_count": 0}
Tool2026-05-25 08:02 UTC
{"content": " 31| }\n 32|\n 33| public function getTopUsers(string $metric, int $limit = 10): array\n 34| {\n 35| if (!in_array($metric, self::VALID_METRICS, true)) {\n 36| throw LeaderboardException::invalidData(\"Invalid metric: $metric\");\n 37| ...
Donna2026-05-25 08:02 UTC
Tool2026-05-25 08:02 UTC
{"total_count": 0}
Tool2026-05-25 08:02 UTC
{"total_count": 4, "files": ["rg: regex parse error:", " (?:*ProfeDB*)", " ^", "error: repetition operator missing expression"]}
Donna2026-05-25 08:02 UTC
Tool2026-05-25 08:02 UTC
{"total_count": 20, "files": ["/root/profe-modules/leaderboard/src/Leaderboard/LeaderboardService.php", "/root/profe-modules/leaderboard/src/Leaderboard/LeaderboardModule.php", "/root/profe-modules/leaderboard/tests/Unit/LeaderboardRepositoryTest.php", "/root/profe-modules/media_upload_jobs/src/Medi...