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.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.
+2 -1
View File
@@ -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.
```
+29 -4
View File
@@ -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
+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
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