6.9 KiB
redmine handoff
Where to find things
- Project rules:
/home/jason/projects/redmine/PROJECT.md - Active checklist:
/home/jason/projects/redmine/PLAN.md - Main script touched:
/home/jason/projects/redmine/redmine_contacts.py - Ticket sync script:
/home/jason/projects/redmine/redmine_tickets.py - Tests added:
/home/jason/projects/redmine/tests/test_redmine_contacts.py - Ticket sync tests:
/home/jason/projects/redmine/tests/test_redmine_tickets.py - Ticket spam cleanup handoff:
/home/jason/projects/redmine/docs/ticket_spam_cleanup_handoff_2026-07-09.md - Known-spam fast close plan:
/home/jason/projects/redmine/docs/known_spam_fast_close_plan.md - Rebot legacy spam rules:
/home/jason/projects/redmine/docs/rebot_legacy_spam_rules.md - Known-spam profile seed:
/home/jason/projects/redmine/profiles/known-spam/customer-service.json - Ticket decomposition plan:
/home/jason/projects/redmine/docs/ticket_decomposition_knowledge_ingestion_plan.md - Obsidian process note:
/home/jason/lilaBuild/vaults/obsidian-ldr/Processes/Redmine/ticket-decomposition-and-knowledge-ingestion.md - Decomposition pilot contact proposals:
/home/jason/projects/redmine/docs/decomposition_pilot_contact_update_proposals_2026-07-09.json - KarpathyWiki plugin inspection:
/home/jason/projects/redmine/docs/karpathywiki_plugin_inspection.md
Last completed milestones
- Applied the shared PROJECT template into this repo with redmine-specific requirements and continuity-doc expectations.
- Implemented and tested
redmine_contacts.pyupgrades:- date/tag filtering helpers used by
fetch+search showcommand (cache/api source)issue-fullcommand (issue + helpdesk context)updatetag and custom-field ergonomic options (--add-tag,--remove-tag,--set-custom-field)
- date/tag filtering helpers used by
- Added unit tests for new filter/tag/custom-field behavior and verified:
python3 -m unittest discover -s tests -p 'test_redmine_contacts.py' -vpython3 -m py_compile redmine_contacts.py
- Completed LAN integration validation on
192.168.50.170:- validated
show --source apiandissue-full - executed safe
update --applyon contact14with temporary tag/custom-field, then rolled it back to original state - locked fetch behavior: default
fetchcaches full results; filtered cache requires--cache-mode filtered
- validated
- Implemented and verified a dry-run-first
batch-updatecommand:- supports date/tag filters +
--max-contacts - supports shared update payload options (
--set,--add-tag,--remove-tag,--set-custom-field) - defaults to dry-run output and only writes when
--applyis passed
- supports date/tag filters +
- Implemented deterministic batch ordering + UX upgrades:
- added
batch-update --orderwith choices:as-isoldest-updated-first/newest-updated-firstoldest-created-first/newest-created-firstid-asc/id-desc
- added tests for oldest-updated-first ordering and missing-timestamp behavior
- expanded argparse
--helpdescriptions/options across commands - added Bash completion script at
/home/jason/projects/redmine/redmine_contacts_completion.shand verified withbash -n
- added
- Captured Jason's broader contact triage loop vision in:
/home/jason/projects/redmine/docs/contact_triage_loop_workflow.md- includes workflow explanation, scoring rubric examples, queue-tag architecture, and a mermaid loop diagram
- linked the document from
/home/jason/projects/redmine/README.mdfor discoverability
- Adjusted
fetchfilter behavior to match expected UX:fetch --cache-mode auto(default) now caches filtered results when any filter flag is supplied--cache-mode fullremains available for canonical full-snapshot caching- added tests for
resolve_fetch_cache_modeand verified against LAN command example
- Implemented and verified ticket-centric sync/search foundation:
- new
/home/jason/projects/redmine/redmine_tickets.py - new
/home/jason/projects/redmine/tests/test_redmine_tickets.py synccommand caches enriched issue payloads using standard/issuesAPI withinclude=journals,helpdesk- per-project cache under
.cache/redmine_tickets_lan/customer-service/*.json manifest.jsontracksupdated_on, local cache paths, and per-ticket action idempotency markerssearchcommand filters cached issues without API callsspam-checkaction scores cached tickets for promotional/spam signals and can record local idempotency with--apply
- new
- LAN validation completed on
192.168.50.170/customer-service:
- dry-run:
seen=10 fetched=10 skipped_cached=0 written=0 - cache write:
seen=10 fetched=10 skipped_cached=0 written=10 - immediate second sync:
seen=10 fetched=0 skipped_cached=10 written=0 - cached search showed newest open tickets matching UI, including
#41788/#41789“Up to 20% Off Select Fans & Blowers” spam-checkflagged#41788and#41789asSPAM(score=2) and left the other 8 as not-spam/low-scorespam-check --applyrecorded local manifest action markers; a secondspam-checkchecked 0 ticketsclose-if-spamdry-run planned closures for#41788and#41789with payload{status_id: 5, notes: ...}close-if-spamfetched/reviewed sendercontact_id=621history and found4/10recent tickets scoring as spam, solikely_spammer=True- no Redmine ticket close mutation has been applied yet;
close-if-spam --applyis pending explicit approval close-if-spam --applydefaults write impersonation to--impersonate-user rebot; reads/dry-runs do not impersonate- tests verified:
python3 -m unittest discover -s tests -p 'test_redmine_tickets.py' -v(23tests) - compile verified:
python3 -m py_compile redmine_tickets.py tests/test_redmine_tickets.py redmine_contacts.py
Next step and why
Jason identified the Obsidian KarpathyWiki plugin as close to the desired decomposition behavior. Inspection found it has no standalone CLI and depends on Obsidian App/Vault/TFile APIs, but its prompts/schema are strong references for a headless mirror. Compatibility rule: the plugin owns obsidian-ldr/wiki/ (wiki/entities, wiki/concepts, wiki/sources, wiki/index.md, wiki/log.md), so the Python decomposer must not write there by default; use LDR-owned paths like Timeline/, entities/organizations/, and Processes/Redmine/, with explicit wikilinks to plugin pages when useful. Current implementation: redmine_tickets.py decompose --issue-id/--input-json --format json|markdown produces dry-run plans and includes a KarpathyWiki-style structured extraction layer (summary, entities, concepts, key_points, contradictions, clean_text) for the three pilot tickets. Tests pass (23 tests). Dry-run outputs live under .cache/decomposition-pilot-20260709/dry-run-output/. Next: add prompt-driven/LLM JSON extraction for broader ticket types, then compare output quality against hand-written pilot notes before adding vault-write mode.