Refresh roadmap after Helpdesk validation

This commit is contained in:
Jason Thistlethwaite
2026-04-24 23:58:58 +00:00
parent fb6d0c2736
commit dde4dca8a2
4 changed files with 77 additions and 33 deletions
+43 -26
View File
@@ -146,6 +146,12 @@ Planned/implemented locally but not fully LAN-validated as a complete workflow:
- `journal_message.created` - `journal_message.created`
- `journal_message.updated` - `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 ### 3. Local Helpdesk Plugin Fork Changes
We made targeted changes to the local fork of `redmine_contacts_helpdesk`: 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 ./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 ## LAN Deployment Progress
The LAN Redmine copy at `192.168.50.170` was inspected and updated via SSH. 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 ## 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: Still needed:
- run and document end-to-end validation of `redmine_outbox_worker.py` against - run and document end-to-end validation of `redmine_outbox_worker.py` against
the LAN copy controlled Helpdesk activity on the LAN copy
- decide the first real external index target - prove that imported Helpdesk issues, Helpdesk replies, and normal issue
- map the derived JSONL document shape into that index updates create the expected event rows
- verify the derived JSONL document shape is useful and does not leak unsafe
content
### 2. External Search Index ### 2. External Search Index
@@ -326,17 +347,10 @@ Planned direction:
- ticket-level docs for "which issue mentioned this?" - ticket-level docs for "which issue mentioned this?"
- message-level docs for "how did we handle a similar case?" - 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 ### 3. Pre-Existing UI/Plugin Bugs
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
We discovered old plugin issues while working: 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/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/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) - [docs/pre_existing_issues.md](/home/iadnah/redmine/docs/pre_existing_issues.md:1)
Tooling: Tooling:
@@ -372,16 +388,15 @@ Local plugin work:
If continuing this project, the next best work is: If continuing this project, the next best work is:
1. Stop treating the CLI exporter as the end product. 1. Run the post-import validator and Helpdesk smoke test to establish a clean
2. Build the external worker that consumes `event_outbox_events`. baseline.
3. Start with a simple derived output target: 2. Generate controlled Helpdesk activity in `fud-helpdesk`.
- JSONL 3. Inspect `event_outbox_events` for the corresponding issue, journal,
- SQLite Helpdesk ticket, and journal message rows.
- or local files 4. Run `redmine_outbox_worker.py --dry-run --batch-size 10` and document the
4. Then connect that worker to: derived JSONL output shape.
- Qdrant 5. Process a bounded batch only after the dry-run output is correct.
- OpenAI embeddings 6. Choose the first external index target after the worker output is validated.
5. Validate end-to-end helpdesk search using real historical message data.
## Practical Commands ## Practical Commands
@@ -452,4 +467,6 @@ is the authoritative customer communication layer, plus the first safe event and
export tooling around it. export tooling around it.
The repo is now at the point where the next meaningful leap is an external 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.
+2 -1
View File
@@ -37,10 +37,11 @@ while debugging:
The final output should include: The final output should include:
```text ```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 default issue update did not send Helpdesk email
[OK] redMCP non-Helpdesk CRUD control passed [OK] redMCP non-Helpdesk CRUD control passed
[OK] Mailpit received outbound Helpdesk/Redmine mail containing the reply token [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 [OK] Closed smoke-test Helpdesk issue
Smoke test passed. Smoke test passed.
``` ```
+29 -4
View File
@@ -25,11 +25,36 @@ environment. Before risky edits, archive the current plugin directories in
LAN Redmine copy. LAN Redmine copy.
- Short alias/usage routes were added to avoid noisy routing errors during - Short alias/usage routes were added to avoid noisy routing errors during
manual browser testing. 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: - Next meaningful milestone:
- Build the external worker/indexer that consumes `event_outbox_events`, - Validate `redmine_outbox_worker.py` end to end against controlled Helpdesk
enriches via read-only MySQL joins, and emits deterministic ticket/message activity, document the derived JSONL shape, then choose the external index
documents for external indexing. 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 ## 2026-04-24 - POP3 Get Mail Compatibility Fix
+3 -2
View File
@@ -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 This imports a controlled Helpdesk email, verifies `issueWithHelpdesk()`, checks
non-Helpdesk CRUD, verifies outbound Mailpit delivery, and closes the created non-Helpdesk CRUD, confirms default updates do not send Helpdesk email, verifies
test ticket. Details are in `docs/helpdesk_smoke_test.md`. 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 ## 8. Re-Run The Read-Only Validator