diff --git a/README.md b/README.md index 744e28d..0bd31ef 100644 --- a/README.md +++ b/README.md @@ -146,6 +146,12 @@ Planned/implemented locally but not fully LAN-validated as a complete workflow: - `journal_message.created` - `journal_message.updated` +The Helpdesk user workflow itself is now live-smoke-tested, including inbound +Mailpit import, `issueWithHelpdesk()` metadata, default non-email updates, and +explicit customer-visible Helpdesk replies. The remaining gap is validating that +those same controlled actions produce the expected outbox rows and derived +worker documents. + ### 3. Local Helpdesk Plugin Fork Changes We made targeted changes to the local fork of `redmine_contacts_helpdesk`: @@ -279,6 +285,19 @@ If Mailpit moves, pass the host that Redmine can reach: ./reset_helpdesk_mail_settings.py --mailpit-host 192.168.50.170 ``` +### 8. redMCP Helpdesk Semantics + +The redMCP wrapper now makes Helpdesk behavior explicit: + +- `issueWithHelpdesk()` composes normal issue data with Helpdesk ticket/message + metadata. +- `updateIssue()` is safe by default and does not send customer email. +- `updateIssue(..., ['send_helpdesk_email' => true])` and + `sendHelpdeskIssueResponse()` deliberately use the Helpdesk email path. + +The live smoke test verifies both default non-email updates and explicit +customer-visible replies through Mailpit. + ## LAN Deployment Progress The LAN Redmine copy at `192.168.50.170` was inspected and updated via SSH. @@ -304,16 +323,18 @@ The deployed helpdesk search routes were verified with: ## What Is Not Finished Yet -### 1. The Real Worker/Indexer +### 1. Worker Validation -This is the main unfinished piece. +This is the next implementation milestone. Still needed: - run and document end-to-end validation of `redmine_outbox_worker.py` against - the LAN copy -- decide the first real external index target -- map the derived JSONL document shape into that index + controlled Helpdesk activity on the LAN copy +- prove that imported Helpdesk issues, Helpdesk replies, and normal issue + updates create the expected event rows +- verify the derived JSONL document shape is useful and does not leak unsafe + content ### 2. External Search Index @@ -326,17 +347,10 @@ Planned direction: - ticket-level docs for "which issue mentioned this?" - message-level docs for "how did we handle a similar case?" -### 3. Full Helpdesk Event Validation +This should wait until the worker validation pass has documented the derived +document shape that will feed the index. -The local code includes helpdesk outbox hooks and read-only helpdesk API -changes, but the complete create/update test matrix for: - -- `helpdesk_ticket.*` -- `journal_message.*` - -still needs to be run and documented cleanly on the LAN copy. - -### 4. Pre-Existing UI/Plugin Bugs +### 3. Pre-Existing UI/Plugin Bugs We discovered old plugin issues while working: @@ -356,6 +370,8 @@ Project docs: - [docs/event_outbox_spec.md](/home/iadnah/redmine/docs/event_outbox_spec.md:1) - [docs/redmineup_local_fork_changelog.md](/home/iadnah/redmine/docs/redmineup_local_fork_changelog.md:1) +- [docs/helpdesk_smoke_test.md](/home/iadnah/redmine/docs/helpdesk_smoke_test.md:1) +- [docs/test_instance_post_import.md](/home/iadnah/redmine/docs/test_instance_post_import.md:1) - [docs/pre_existing_issues.md](/home/iadnah/redmine/docs/pre_existing_issues.md:1) Tooling: @@ -372,16 +388,15 @@ Local plugin work: If continuing this project, the next best work is: -1. Stop treating the CLI exporter as the end product. -2. Build the external worker that consumes `event_outbox_events`. -3. Start with a simple derived output target: - - JSONL - - SQLite - - or local files -4. Then connect that worker to: - - Qdrant - - OpenAI embeddings -5. Validate end-to-end helpdesk search using real historical message data. +1. Run the post-import validator and Helpdesk smoke test to establish a clean + baseline. +2. Generate controlled Helpdesk activity in `fud-helpdesk`. +3. Inspect `event_outbox_events` for the corresponding issue, journal, + Helpdesk ticket, and journal message rows. +4. Run `redmine_outbox_worker.py --dry-run --batch-size 10` and document the + derived JSONL output shape. +5. Process a bounded batch only after the dry-run output is correct. +6. Choose the first external index target after the worker output is validated. ## Practical Commands @@ -452,4 +467,6 @@ is the authoritative customer communication layer, plus the first safe event and export tooling around it. The repo is now at the point where the next meaningful leap is an external -worker/indexer, not more Redmine UI surface. +worker validation pass, not more Redmine UI surface. The Qdrant/OpenAI index +work should follow once the worker output is proven against controlled Helpdesk +activity. diff --git a/docs/helpdesk_smoke_test.md b/docs/helpdesk_smoke_test.md index 97deb1f..d3d19fa 100644 --- a/docs/helpdesk_smoke_test.md +++ b/docs/helpdesk_smoke_test.md @@ -37,10 +37,11 @@ while debugging: The final output should include: ```text -[OK] redMCP issueWithHelpdesk returned ticket and message context +[OK] redMCP issueWithHelpdesk returned Helpdesk ticket context [OK] redMCP default issue update did not send Helpdesk email [OK] redMCP non-Helpdesk CRUD control passed [OK] Mailpit received outbound Helpdesk/Redmine mail containing the reply token +[OK] redMCP issueWithHelpdesk returned post-reply journal message context [OK] Closed smoke-test Helpdesk issue Smoke test passed. ``` diff --git a/docs/redmineup_local_fork_changelog.md b/docs/redmineup_local_fork_changelog.md index 4bd017f..ac61e51 100644 --- a/docs/redmineup_local_fork_changelog.md +++ b/docs/redmineup_local_fork_changelog.md @@ -25,11 +25,36 @@ environment. Before risky edits, archive the current plugin directories in LAN Redmine copy. - Short alias/usage routes were added to avoid noisy routing errors during manual browser testing. - - Full end-to-end helpdesk outbox validation is still pending. + - Helpdesk mail import, Helpdesk metadata lookup, default non-email updates, + and explicit outbound Helpdesk replies are live-smoke-tested through redMCP. + - Helpdesk outbox/worker validation is still pending. - Next meaningful milestone: - - Build the external worker/indexer that consumes `event_outbox_events`, - enriches via read-only MySQL joins, and emits deterministic ticket/message - documents for external indexing. + - Validate `redmine_outbox_worker.py` end to end against controlled Helpdesk + activity, document the derived JSONL shape, then choose the external index + target. + +## 2026-04-24 - Helpdesk/redMCP Smoke Validation + +- Touched areas: + - `redMCP` + - Helpdesk test tooling +- Purpose: + - Prove the LAN test instance can import a Helpdesk email, expose its + Helpdesk metadata through redMCP, update a non-Helpdesk control issue, send + an explicit Helpdesk reply, and verify outbound delivery through Mailpit. + - Make customer-visible Helpdesk email opt-in in redMCP. +- Behavior clarified: + - `RedMCP\RedmineClient::updateIssue()` uses the normal Redmine REST API and + does not send a Helpdesk email by default. + - `updateIssue(..., ['send_helpdesk_email' => true])` and + `sendHelpdeskIssueResponse()` deliberately use the Helpdesk email path. +- LAN test result: + - `./helpdesk_smoke_test.py` passed against `fud-helpdesk` and + `fud-nohelpdesk`. + - The smoke test verifies that a default issue update does not send Mailpit + mail, while an explicit Helpdesk response does. + - Latest documented passing run created and closed controlled Helpdesk issue + `#39871`. ## 2026-04-24 - POP3 Get Mail Compatibility Fix diff --git a/docs/test_instance_post_import.md b/docs/test_instance_post_import.md index 8374087..a2b1f58 100644 --- a/docs/test_instance_post_import.md +++ b/docs/test_instance_post_import.md @@ -132,8 +132,9 @@ After the post-import checks pass, run the live Helpdesk/redMCP smoke test: ``` This imports a controlled Helpdesk email, verifies `issueWithHelpdesk()`, checks -non-Helpdesk CRUD, verifies outbound Mailpit delivery, and closes the created -test ticket. Details are in `docs/helpdesk_smoke_test.md`. +non-Helpdesk CRUD, confirms default updates do not send Helpdesk email, verifies +explicit outbound Mailpit delivery, and closes the created test ticket. Details +are in `docs/helpdesk_smoke_test.md`. ## 8. Re-Run The Read-Only Validator