Shabbat 3.1.1 fixes Daf message formatting and retries, private settings entry when Telegram cannot reach the user, and igbinary session compatibility. The release manifest and matching GitHub Actions run identify the final verified source and assets. See release requirements, publication status and implementation status.
Scheduled Daf Yomi messages could fail before delivery with DOMDocument::loadXML(): EntityRef: expecting ';'. A real Hebcal page URL contains & query separators, for example https://www.sefaria.org/Bekhorot.35a?lang=bi&utm_source=hebcal.com&utm_medium=api; inserting it directly into HTML produces invalid entity syntax.
- Keep raw Daf text separate from HTML and escape it once at the HTML boundary. The
{{daf}}variable remains raw for custom templates, including templates with native Telegram entities. - Use one formatter over already-loaded Daf data for the private view and scheduled group card. The default card contains the bold title, group location and timezone, Gregorian and Hebrew dates, bold tractate/page and a localized page link. It uses the existing Presentation emoji
daf_yomi(5947481135939328427) and its Unicode fallback. - Preserve the rich default card when the configured template is exactly
{{daf}}, including keyboard-only edits. Custom text/entities, media, buttons and topic routing remain supported. - Correct only the recognizable frozen, two-line Daf HTML generated by 3.1.0 while a job has an active owned retry lease and has not expired. A never-dispatched payload or the specific local DOM entity-parse failure is eligible; generic uncertain sends and native/custom payloads remain untouched. Escape the stored URL without fetching new provider data or changing the old message into the new card. Keep
random_id, attempts/history, expiry and message metadata. Do not reset queues or revive failed/expired jobs. Scheduled provider failures remain failures for normal retry rather than being delivered as a success card. - Cover the real parameterized URL through MadelineProto
TextEntities::fromHtml, private/scheduled card parity, custom emoji/fallback, normal/default/custom/native-entity templates, keyboard-only edits, prepared retries and double-escaping regressions.
When a group settings action receives Telegram PEER_ID_INVALID while sending privately to the administrator, the bot avoids sending another error to that same unreachable recipient. In the valid originating group it returns the existing localized private-start link instead, without posting private settings. Opening the link retains the existing administrator checks. Other Telegram errors, group sends and cancellation keep their current handling; a private-only context does not trigger another private reply.
The Docker image also includes pinned igbinary 3.2.16 so sessions previously serialized with igbinary remain readable. An offline probe checks the extension, a synthetic serialization round trip and MadelineProto initialization without opening the real session or sending Telegram messages. This includes the earlier deployment hotfix; preserve the existing session and do not convert or replace it. The extension source and original BSD-3-Clause notice are retained.
This patch release changes no Composer dependency, lock file, database schema or migration checksum. MadelineProto remains locked to 8.11.10 / TL layer 232; the two existing library patch sets remain unchanged. Earlier 3.1.0 changes are retained in CHANGELOG.
An existing 3.0/3.1 SQLite installation keeps its database, session, settings and queue. Follow the stopped-writer update procedure and backup/restore guide, retaining the actual Compose project and its volumes. Do not repeat legacy import, remove queue rows or reset pending jobs to address this error. Run php bin/igbinary-check.php in the new image before startup; this checks synthetic data, not the production session. The retry compatibility path runs within normal delivery processing and preserves ordinary eligibility and expiry rules.
For an installation still using the file-based legacy bot, use the separate English production guide or מדריך השדרוג בעברית. Verify the actual production path and rehearse restore. The migration/import path is not required again after a successful earlier import.
| Asset | Purpose |
|---|---|
shabbat-3.1.1.zip |
Deployment source, lock and exact release build identity; Docker installs dependencies. No installed vendor or private state. |
shabbat-3.1.1-corresponding-source.zip |
Application, documented locked runtime sources, licenses, active patches and required preferred-source supplements. |
RELEASE_MANIFEST.json |
Actual commit, version, fingerprint, scope and artifact hashes. |
SHA256SUMS |
Checksums for both ZIPs and the manifest. |
Generate the final assets only from the reviewed merge commit after the release gates pass. CI artifacts from a PR or intermediate commit are verification outputs, not the final stable release assets.
Keep archive build-info.json unchanged and leave BUILD_COMMIT out of the private .env when using an unchanged release ZIP. Use SOURCE_URL=https://github.com/WizardLoop/shabbat/releases/tag/v3.1.1 with the published release and its corresponding-source asset. A testing or modified deployment needs the exact source offer for its own source; an unavailable tag URL is not a source offer.
The source scope excludes the complete operating system/container and optional development-tool source; consult licensing, third-party notices and the source manifest.
The reviewed implementation at 0f08f0548e85518e1d15b83975dcfbf03b2dc9e8 in PR #24 passed all eight push/PR CI jobs: PHP 8.3.36, 8.4.27 and 8.5.12, plus the Docker job in each workflow. The suite reported 1,397 tests and 55,328 assertions. Static analysis, lint/style, documentation/locales, Composer audit, patch/source checks and packaging checks passed. Docker verified PHP 8.4.27 with igbinary 3.2.16; the deployment ZIP built successfully without Git or a BUILD_COMMIT override.
Those results identify that reviewed implementation commit. Every later change and the final merge commit must pass the required checks again before tagging and final asset creation. The final merge validation is separate from these recorded branch results. Automated tests use provider fixtures and isolated databases. TextEntities::fromHtml verifies the locked SDK parsing boundary, not live Telegram delivery or rendering in every client.
The owner-reported dev.9 locking, unlocking, original-permission restoration and restart results from 2026-10-16 are historical. They do not establish the new Daf delivery behavior, real holy-day transitions, paid operations, sustained traffic or a long soak. On a separate bot and disposable group, verify a scheduled Daf message, the page link, selected custom emoji/fallback and the custom message features used by the deployment before production acceptance.
Publishing GitHub assets does not deploy to the server, migrate production, change group permissions or restart the active bot.