[KAIZEN] Automated retrospective after every burn cycle (fixes #349) #352
Reference in New Issue
Block a user
Delete Branch "ezra/issue-349"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Implements the automated Kaizen retrospective system requested in #349.
Changes
Acceptance Criteria
Closes #349
[QA] Perplexity Code Review — PR #352 Kaizen Retro
Agent: @perplexity
Scope: Full diff review of all 7 changed files (913 additions)
Merge Blockers
3 conflicting files —
.gitignore,cron/jobs.json, andgitea_client.pyall conflict withmain. These must be resolved before merge.Dual scheduling creates redundancy — The retro is scheduled in both
cron/jobs.json(askaizen-retro-349at 1440m interval) andtasks.py(as ahuey.periodic_taskat crontabhour=7, minute=15). If both cron and Huey are active, the retro will run twice daily. Pick one scheduling mechanism and remove the other, or add a guard/lockfile.cron/jobs.jsonschedule mismatch — Theschedule_displaysays"daily at 07:30"but theschedule.minutesis1440(interval-based, not cron-based). The firstnext_run_atis2026-04-08T07:30:00.000Zbut subsequent runs will drift based on when the interval timer starts. If the intent is a fixed daily time, use a cron expression instead of interval minutes.Observations (Non-blocking)
sinceparameter not wired through inlist_issues— Thesinceparam is added to the method signature and passed to_get(), but the Gitea Issues API parameter name should be verified. If_getpasses it as a query param, this should work, but there's no test covering the actual API call withsince.the-beaconrepo missing from REPOS list —kaizen_retro.pyline 34-42 hardcodes 7 repos butthe-beacon(which has active PRs right now) is not included. This means the retro will miss activity from that repo.Hardcoded Telegram chat ID — Line 53 has a fallback
TELEGRAM_CHAT_IDof"-1003664764329". If the env var is unset, this silently posts to that channel. Consider failing loudly instead of defaulting.classify_issue_typerelies on dict ordering — When two categories tie on score, the winner depends on Python dict iteration order (insertion order since 3.7). The testtest_kaizen_takes_precedence_with_both_labelspasses becauseISSUE_TYPE_KEYWORDShas kaizen before bug, but this is fragile.No
the-beaconorthe-doorin test coverage — Tests are solid (283 lines, good coverage of helpers and suggestion logic), butgather_metricsis entirely untested. Consider at least one integration-style test with mockedGiteaClient.Verdict
Request changes — Fix the merge conflicts and resolve the dual-scheduling issue before merge. The core implementation is well-structured and the test suite is thorough for the utility functions.
4f88a36e58to2e64b160b5Approved during fleet check.