Two bugs fixed:
1. Catch-up scan (section 2b) called _merge_pr and immediately returned,
claiming success even when fgj exits 0 but the merge silently failed
(e.g. branch-protection rules not satisfied). PR #163 was retried 30+
times in a row because the PR stayed open after each attempt.
Fix: verify the PR is no longer open after the merge call; if it is still
open, set the issue to State/Question instead of looping forever.
2. ci-fix agents wrote "Closes #198" in commit messages, causing Forgejo to
auto-close issue #198 ("Unable to load asset: assets/changelog.txt") even
though the commit only fixed the unrelated Play Store upload.
Fix: both ci-fix prompts now explicitly forbid issue-number references in
commit messages and close operations. Also save ci_run_id_at_start in
the ci-fix state (was only done for issue agents) so future guard logic
can compare run IDs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add catch-up scan in agent_loop that finds all open issue-N-fix PRs and
merges those with passed CI, using event-filtered API query (limit=50)
to cover weeks of history instead of the previous ~1.5 h window.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
When flutter_secure_storage's platform channel is unavailable (e.g. on
certain Android devices), getPassword() throws MissingPluginException.
Previously this was not recognised as a permanent error, so the IMAP and
JMAP sync loops retried indefinitely with exponential back-off, filling
the sync log with repeated failures (as shown in the screenshot).
Treat MissingPluginException as a permanent error in both _AccountSync
and _JmapAccountSync so the loop stops immediately instead of retrying.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- ci.yml: add paths filters to push and pull_request triggers so the full
Dagger check only runs when source-relevant files change (lib/, test/,
android/, linux/, scripts/, ci/, Taskfile.yml, etc.). Pure website,
docs, and assets/changelog.txt commits no longer trigger ci.yml.
- deploy.yml: add check-changes job that diffs HEAD~1..HEAD and outputs
android/linux booleans. On workflow_dispatch both are always true.
test-android-firebase, deploy-playstore, and deploy-apk are now
conditional on android==true; build-linux is conditional on linux==true.
label-deploy-health only fires when at least one build job actually ran
(not all skipped) and treats 'skipped' as acceptable in ALL_SUCCEEDED.
- ci/main.go Graph(): update Mermaid diagram to reflect the new two-
workflow structure (ci.yml fast-check + deploy.yml with change-gated jobs).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Wrap the '## sharedinbox.de' heading in a markdown hyperlink to https://sharedinbox.de
- Add a dedicated 'Git Commit' table row with a clickable link to the commit on Codeberg when GIT_HASH is set
- Update clipboard test to assert the heading link is present in copied markdown
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>