原始 JSON 报告 机器可读
{
"data": {
"repo": {
"topics": [
"magento2"
],
"is_fork": false,
"size_kb": 1622,
"has_wiki": true,
"homepage": null,
"languages": {
"PHP": 591112,
"HTML": 9967,
"Less": 20759,
"JavaScript": 42303
},
"pushed_at": "2026-07-28T15:05:12Z",
"created_at": "2020-11-19T16:06:38Z",
"owner_type": "Organization",
"updated_at": "2026-05-21T13:41:55Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "master",
"license_spdx_raw": "MIT",
"primary_language": "PHP",
"significant_languages": [
"PHP"
]
},
"owner": {
"blog": "https://www.dotdigital.com",
"name": "Dotdigital",
"type": "Organization",
"login": "dotmailer",
"company": null,
"location": null,
"followers": 9,
"avatar_url": "https://avatars.githubusercontent.com/u/3176979?v=4",
"created_at": "2013-01-03T12:10:10Z",
"is_verified": null,
"public_repos": 39,
"account_age_days": 4954
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v3.0.2",
"kind": "patch",
"published_at": "2026-05-22T08:42:13Z"
},
{
"tag": "v3.0.1",
"kind": "patch",
"published_at": "2026-03-16T12:41:30Z"
},
{
"tag": "v3.0.0",
"kind": "major",
"published_at": "2026-03-11T13:15:39Z"
},
{
"tag": "v2.8.0",
"kind": "minor",
"published_at": "2026-02-17T15:11:17Z"
},
{
"tag": "v2.7.3",
"kind": "patch",
"published_at": "2025-11-21T09:39:50Z"
},
{
"tag": "v2.7.2",
"kind": "patch",
"published_at": "2025-10-09T08:39:04Z"
},
{
"tag": "v2.7.1",
"kind": "patch",
"published_at": "2025-07-31T13:36:09Z"
},
{
"tag": "v2.7.0",
"kind": "minor",
"published_at": "2025-07-23T14:33:20Z"
},
{
"tag": "v2.6.2",
"kind": "patch",
"published_at": "2025-04-14T14:55:22Z"
},
{
"tag": "v2.6.1",
"kind": "patch",
"published_at": "2025-02-28T10:23:04Z"
},
{
"tag": "v2.6.0",
"kind": "minor",
"published_at": "2024-12-06T12:14:05Z"
},
{
"tag": "v2.5.0",
"kind": "minor",
"published_at": "2024-12-03T11:09:59Z"
},
{
"tag": "v2.4.0",
"kind": "minor",
"published_at": "2024-10-08T13:56:12Z"
},
{
"tag": "v2.3.3",
"kind": "patch",
"published_at": "2024-09-24T11:44:07Z"
},
{
"tag": "v2.3.2",
"kind": "patch",
"published_at": "2024-07-29T20:02:42Z"
},
{
"tag": "v2.3.1",
"kind": "patch",
"published_at": "2024-06-10T18:33:33Z"
},
{
"tag": "v2.3.0",
"kind": "minor",
"published_at": "2024-05-29T14:36:11Z"
},
{
"tag": "v2.2.2",
"kind": "patch",
"published_at": "2024-05-08T07:17:35Z"
},
{
"tag": "v2.2.1",
"kind": "patch",
"published_at": "2024-04-18T11:13:18Z"
},
{
"tag": "v2.2.0",
"kind": "minor",
"published_at": "2024-02-14T16:03:36Z"
},
{
"tag": "v2.1.0",
"kind": "minor",
"published_at": "2024-01-31T13:53:14Z"
},
{
"tag": "v2.0.1",
"kind": "patch",
"published_at": "2023-12-05T10:14:34Z"
},
{
"tag": "v2.0.0",
"kind": "major",
"published_at": "2023-11-29T14:23:29Z"
},
{
"tag": "v1.7.2",
"kind": "patch",
"published_at": "2023-11-07T15:54:08Z"
},
{
"tag": "v1.7.1",
"kind": "patch",
"published_at": "2023-10-24T08:36:47Z"
},
{
"tag": "v1.7.0",
"kind": "minor",
"published_at": "2023-10-09T12:54:12Z"
},
{
"tag": "v1.6.0",
"kind": "minor",
"published_at": "2023-10-03T09:32:41Z"
},
{
"tag": "v1.5.0",
"kind": "minor",
"published_at": "2023-02-14T10:04:28Z"
},
{
"tag": "v1.4.2",
"kind": "patch",
"published_at": "2022-10-25T10:19:04Z"
},
{
"tag": "v1.4.1",
"kind": "patch",
"published_at": "2022-08-31T09:22:47Z"
},
{
"tag": "v1.4.0",
"kind": "minor",
"published_at": "2022-07-05T15:24:57Z"
},
{
"tag": "v1.3.2",
"kind": "patch",
"published_at": "2022-03-02T11:51:03Z"
},
{
"tag": "v1.3.1",
"kind": "patch",
"published_at": "2022-01-26T12:54:34Z"
},
{
"tag": "v1.3.0",
"kind": "minor",
"published_at": "2022-01-26T12:22:54Z"
},
{
"tag": "v1.2.1",
"kind": "patch",
"published_at": "2022-01-19T14:45:21Z"
},
{
"tag": "v1.2.0-RC1",
"kind": "prerelease",
"published_at": "2021-04-28T14:00:12Z"
},
{
"tag": "v1.1.1",
"kind": "patch",
"published_at": "2021-04-28T10:31:22Z"
},
{
"tag": "v1.1.0",
"kind": "minor",
"published_at": "2021-02-03T10:50:23Z"
},
{
"tag": "v1.0.0",
"kind": "major",
"published_at": "2021-01-26T17:01:27Z"
}
],
"recent_commits": [
{
"oid": "2bafd915694b0340669f59548796caba532a807e",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into release/3.0.2",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-05-21T10:17:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5ccd25f665c50e4574e881dc8ba045d8344ca4b4",
"body": "Version bump\n\nRelated work items: #347633",
"is_bot": false,
"headline": "Merged PR 73946: 3.0.2 pre-release",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-05-21T10:16:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3577df4c815d8f4a2068bc1563d9eb1e61a46a7",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into release/3.0.2",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-05-20T15:25:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fa61213b219217c2cc0adf7a032de573b04c06b0",
"body": "## What's being changed\n\nThis adds guards against missing extension attribute accessor methods, which are supposed to be generated by Magento at compile.\n\nI've added a ConfigProvider for checkout that prevents the mixins from extending the shipping payload if the accessor methods aren't available. I\n[…]\n Consent back on\n- Go back through checkout, see the checkbox if you have a US number\n- Test an order with the checkbox checked\n- Test an order with the checkbox unchecked\n\nRelated work items: #347304",
"is_bot": false,
"headline": "Merged PR 73932: Guard against missing extension attribute methods",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-05-20T11:43:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "edf6a943629fbd23de0ef7ed40ebb918f8ebea38",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into release/3.0.1",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-03-16T08:20:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e96962e7a764ad9feba55ff9a72477767a763956",
"body": "## What's being changed\n\nThis PR adjusts the intlTelInput.less file to use the LESS escape notation for CSS custom properties like `calc()` and `image-set()`.\n\n## Why it's being changed\n\n`calc()` for example only works in the browser at runtime. Magento uses the wikimedia/less.php LESS parser to com\n[…]\n& bin/magento setup:static-content:deploy -f`\n- See no errors\n- In a Luma theme, smoke test the CSS presentation in e.g. customer account sign up for SMS marketing consent\n\nRelated work items: #338177",
"is_bot": false,
"headline": "Merged PR 73504: Fix IntlTelInput LESS preprocessing for < 2.4.8",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-03-16T08:19:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c5b1146687977787085c5e9367dc37425ed3e79d",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into release/3.0.0",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-03-10T15:37:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "03bb91cffb4d4fac6fcc173976dcd399bcc565b6",
"body": "This release must be a major version increment, because it is not backwards-compatible with our Hyvä themes compatibility modules.\n\nRelated work items: #337365",
"is_bot": false,
"headline": "Merged PR 73405: 3.0.0 pre-release",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-03-10T14:51:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e64a24ff13b24214f05ff8f84beac43a7741c5f0",
"body": "## What's being changed\nUpdated intl-tel-input to v26.5.1.\n\n## Why it's being changed\nLatest version of the library is using newer versions of libphonenumber which adds more support for phone number parsing and identifying valid numbers.\n\n## How to review / test this change\n- Go to checkout.\n- Use +\n[…]\nows 'Telephone number is too short' instead of 'Invalid telephone number').\n- flag images in webp format. The 2x image is lighter than its png alternative (66kb vs 102kb).\n\nRelated work items: #332932",
"is_bot": false,
"headline": "Merged PR 72961: Update intl-tel-input to v26.5.1",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2026-03-04T13:41:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c526c231f8b33ab65f55f2ea97924e7c922a8f7e",
"body": "…magento2-extension-sms into release/2.8.0",
"is_bot": false,
"headline": "Merge branch 'develop' of ssh.dev.azure.com:v3/dotdigital/ec/ec-core-…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-02-05T10:23:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec747252182e616e305c4107532151a81d2d9806",
"body": "Related work items: #329652",
"is_bot": false,
"headline": "Merged PR 71926: 2.8.0 pre-release",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-02-05T10:01:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a5e7c066dac85dc368069cb9bee0d2e8d47dfe12",
"body": "## What's being changed\n- Updated visibility logic for the consent checkbox.\n- Removed emitter that was triggering for payment page address form.\n- Use intl-input promise for phone number validation.\n\n## Why it's being changed\n- The transactional consent checkbox was being hidden when going to payme\n[…]\nddress form telephone input does not change visibility of checkbox on shipping page\n- Verify phone number update input does not display when using a faulty number\n\nRelated work items: #328451, #331676",
"is_bot": false,
"headline": "Merged PR 72322: Update checkout consent validation",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2026-02-05T09:20:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8b52cd240d260d17ac60199ff1c3c7a3c14cb4bc",
"body": "## What's being changed\nWe have added an address exists check to the transactional consent capture checkbox component.\n\n## Why it's being changed\nBehavior introduced for authenticated customers who did not have an address stored due to the new isLoggedIn check added to correct another regression fou\n[…]\niew / test this change\n- Checkout as a customer without an address, observe the checkbox does not auto uncheck and the consent data is captured in the email_consent table.\n\nRelated work items: #328444",
"is_bot": false,
"headline": "Merged PR 72163: New customer address regression",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2026-01-22T13:15:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "65f3ef44a5c9007322c40a995a469de4b6dd4844",
"body": "## What's being changed\n\nWe have added an `isLoggedIn` check to the transactional consent capture checkbox component.\n\n## Why it's being changed\n\nBehaviour introduced for authenticated customers was being carried over to the guest checkout, causing the consent capture to become unchecked and the con\n[…]\n consent is unchecked when switching between shipping addresses.\n- Checkout as a guest and observe a new transactional consent record in the `email_contact_consent` table.\n\nRelated work items: #328444",
"is_bot": false,
"headline": "Merged PR 71987: Fix guest checkout regression",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2026-01-14T09:46:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ca817f5fc207a7c932d849607570f02f93eb92a1",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into release/2.8.0",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2026-01-08T16:48:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cb4471bb7616c81eafc952a8c6f4d2608e822bc3",
"body": "…ress change\n\n## What's being changed\n\nAdded `Magento_Checkout/js/model/quote` dependency to the consent transactional checkbox component. The component now automatically unchecks the consent checkbox when the shipping address changes, while maintaining existing functionality to uncheck on country c\n[…]\nx is still unchecked as expected\n\n## Notes\n\nUses `jQuery.async` to wait for the checkbox element to be available in the DOM before subscribing to shipping address changes.\n\nRelated work items: #325944",
"is_bot": false,
"headline": "Merged PR 71045: Reset transactional consent checkbox on shipping add…",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-12-02T13:53:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a22c9cccefb5ad2451892aab815799efd473c464",
"body": "## What's being changed\nRemoved order checks for sign-up and new account SMS\n\n## Why it's being changed\nOrder info is not required for these SMS types\n\n## How to review / test this change\n- Create a new account\n- Run the consumer\n- `bin/magento queue:consumers:start ddg.sms.message --max-messages=1`\n- See message in `email_sms_message_queue`\n\nRelated work items: #326604",
"is_bot": false,
"headline": "Merged PR 71231: Remove order check for sign-up SMS",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-12-02T10:13:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9c6975e38f2a4d8629a086435a6ed874af2fc10c",
"body": "## What's being changed\n- Updated CPaaS configuration setup to include checks for store scope setting.\n- Added check to allow 404 responses on inbound rule delete, a rule can be via the API, which will then conflict with the stored id when trying to delete it.\n\n## Why it's being changed\nTransactiona\n[…]\nle transactional SMS on website and store level\n- Check no rules exists via /cpaas/automation/inboundrules/optout\n- Enable at store level\n- Check inbound rules are created\n\nRelated work items: #326701",
"is_bot": false,
"headline": "Merged PR 71240: Check store scope for cpaas rule configuration",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-12-02T09:29:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0278f2de2fd283c2d4a06239a30bebaae4539b5a",
"body": "## What's being changed\n\nThis adds a required `setWebsiteId()` method to the `CpaasConfigMessage`.\n\n## Why it's being changed\n\nThis missing accessor method was preventing the consumer from processing the message, unless website id was 0.\n\n## How to review / test this change\n\n- Test switching the Transactional SMS consent on and off in different scopes\n- Confirm all messages are consumed as expected\n\nRelated work items: #326279",
"is_bot": false,
"headline": "Merged PR 71168: Add missing accessor method",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-12-01T10:14:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "588a62e8b2c37380d6a491fdd5e57119cc710afc",
"body": "## What's being changed\n- Refactored CPaaS config setup\n- Opt-in inbound rule is now configured when feature is enabled\n\n## Why it's being changed\nThis inbound rule is required for resubscriptions\n\n## How to review / test this change\n- Disable and enable Transactional SMS Consent\n- Verify new rule is configured in CPaaS via postman with START keyword: https://r1-api.dotmailer.com/cpaas/automation/inboundrules/optout\n\nRelated work items: #325589",
"is_bot": false,
"headline": "Merged PR 70948: Refactor CPaaS config setup, add opt-in inbound rule",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-25T08:28:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "785499e50cb1211ceda24a0e2e86a107202166c1",
"body": "## What's being changed\nUpdated consent config help text\n\n## Why it's being changed\nHelp text updated to clarify functionality\n\n## How to review / test this change\n- Clear config cache\n- Verify help text in Transactional SMS Consent (for sending to US numbers) section\n\nRelated work items: #325919",
"is_bot": false,
"headline": "Merged PR 71029: Update consent help text",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-25T07:56:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be124b82eb3d17ea08a3ca65544f66abca142fa3",
"body": "## What's being changed\n\nThis removes a check we had in place to allow local enablement of Transactional SMS even if our target accounts did not officially have a paid PAYG flag for sending SMS.\n\n## Why it's being changed\n\nInitially when we set this up, we didn't allow merchants to turn on the featu\n[…]\nt the notice exists and will display.\n\n## How to review / test this change\n\n- Go to the Transactional SMS section\n- See the PAYG notice when switching on Transactional SMS\n\nRelated work items: #325781",
"is_bot": false,
"headline": "Merged PR 71010: Remove dotdigital.com email check for PAYG notice",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-11-24T14:55:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "27ee379049cf8ce59a6dddd763b5b4c01b0b17e9",
"body": "## What's being changed\nAdded logging for http response codes, eg 403 Forbidden\n\n## Why it's being changed\nAccounts connected to staging can return error codes which is not captured on the response body\n\n## How to review / test this change\n- Use staging API credentials\n- Ensure connector_api_credent\n[…]\nf the staging endpoint returns 403 in postman for https://r1-api-stg.dotmailer.com/cpaas/automation/inboundrules/optout you will see the same error thrown in connector.log\n\nRelated work items: #324922",
"is_bot": false,
"headline": "Merged PR 70878: Log API errors and HTTP error codes",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-21T09:56:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "18a533eba5ebb2baa440956e47cdc0f0fa81d388",
"body": "## What's being changed\nRefactored ShipmentUpdatePlugin to use SmsMessagePublisher for shipment updates\n\n## Why it's being changed\nShipment updates was not using the new sms message publisher\n\n## How to review / test this change\n- Enable SMS for shipment updates\n- Update shipping on an order\n- Verify queue message is published\n- Verify SMS is sent\n\nRelated work items: #325544",
"is_bot": false,
"headline": "Merged PR 70927: Use SmsMessagePublisher for shipment updates",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-20T12:06:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7d6ab39675c0fc2f95e1678edc3b060cd3211c59",
"body": "## What's being changed\nUpdated CpaaS status notice text\n\n## Why it's being changed\nThe current UI copy does not need to mention CpaaS\n\n## How to review / test this change\n- Toggle the transactional SMS Consent setting\n- Check new notice text shows correct text\n\nRelated work items: #319038",
"is_bot": false,
"headline": "Merged PR 70890: Update CpaaS status notice text",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-20T08:00:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e66c1776663f0268adb1f537886d1a25f2c8f565",
"body": "## What's being changed\nAdded check for empty append opt-out text\n\n## Why it's being changed\nTo prevent sending message with extra new line characters\n\n## How to review / test this change\n- Set append opt-out text to an empty string\n- Send sms\n- Verify no extra new line characters are added to end of sms\n\nRelated work items: #324830",
"is_bot": false,
"headline": "Merged PR 70747: Check for empty append opt-out text",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-17T10:56:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1fb6129b972fbbb89827466d59034b330e65ccde",
"body": "## What's being changed\n- Config queue consumer added to handle CpaaS configuration when enabling consent\n- Added CpaasConfigManager to dotdigital task list\n- Consumer updated to check order optin status - adds requireOptIn to message payload\n- Enabling \"Transactional SMS Consent (for sending to US \n[…]\nnsactional_requires_opt_in=1` and `sms_transactional_opt_in=0`\n- Put the opted-out order on hold\n- Verify message is not sent and is not added to `email_sms_message_queue`\n\nRelated work items: #314679",
"is_bot": false,
"headline": "Merged PR 70071: Transactional SMS Queues - US numbers",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-14T15:33:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b2220c0c8e519ba4213450e6a0c9effbb74e5d4e",
"body": "This merges [this commit](https://github.com/dotmailer/dotmailer-magento2-extension-sms/commit/d54f2f14b02610fdf6379989a1363417780a5f98) back to develop following [this hotfix](https://github.com/dotmailer/dotmailer-magento2-extension-sms/commit/ad746e95029bc45b25183473bc01362d3459e503) onto master, which we will ignore on develop because the logic has changed in our newer Transent code.\n\nRelated work items: #324685",
"is_bot": false,
"headline": "Merged PR 70707: Merge 324346 Hotfix back to develop",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-11-14T14:34:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d54f2f14b02610fdf6379989a1363417780a5f98",
"body": null,
"is_bot": false,
"headline": "version bump and change log update",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-11-13T08:39:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad746e95029bc45b25183473bc01362d3459e503",
"body": null,
"is_bot": false,
"headline": "remove redundant condition from input display logic",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-11-13T08:31:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7664d4c572d9157f62875ae5f0bc603e56fde3ff",
"body": "## What's being changed\nCheckoutTransactionalConsentObserver updated to save opt-in consent\n\n## Why it's being changed\nWe need to capture transactional sms consent per order\n\n## How to review / test this change\n- Place an order\n- Use a US shipping phone number\n- Opt-in to receive sms\n- Verify a new record is created in email_contact_consent with the correct consent opt-in text\n- Update order, eg put order on hold\n- Verify only one consent record is created\n\nRelated work items: #314648",
"is_bot": false,
"headline": "Merged PR 70476: Capture transactional SMS consent",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-10T14:11:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6d1b2a046651e4783de711f48691cbfa5a9f66cc",
"body": "## What's being changed\n\n- Renamed existing SMS marketing consent components and classes to be more specific (`ConsentCheckbox` → `ConsentMarketingCheckbox`, etc.)\n- Created new `ConsentTransactionalCheckbox` component that appears only for US phone numbers when transactional consent is enabled\n- Up\n[…]\n for the transactional consent feature. Both logged-in and guest checkout flows need testing to ensure proper functionality across all configuration combinations.\n\nRelated work items: #296033, #319740",
"is_bot": false,
"headline": "Merged PR 69905: Transactional SMS consent capture",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-11-06T13:36:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "52700a2915e1e8ecf684b57d94e06b5f6022193a",
"body": "## What's being changed\n\nThe SMS API Client class now uses the usual Dotdigital host for API calls i.e. r1-api.dotdigital.com instead of api-cpaas.dotdigital.com.\n\n## Why it's being changed\n\nThis allows us to easily connect to non-production envs in our work on the SMS module.\n\n## How to review / te\n[…]\nevant scope\n- The options should load for 'Select default SMS from name' without any API errors in the logs\n- Test message sending still works when connected to production\n\nRelated work items: #322204",
"is_bot": false,
"headline": "Merged PR 70176: Use Dotdigital API host for CPaaS endpoint paths",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-11-05T17:33:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5568223f9920ee18d9ac47b04418b1769570ee9e",
"body": "## What's being changed\n\n- Replaced custom queue with native Magento publisher/consumer pattern\n- Added MessageTypeFactory for creating message type instances from configuration\n- New SmsMessagePublisher handles queueing\n- New SmsMessageConsumer processes individual messages (not batched)\n- Moved qu\n[…]\ners:start ddg.sms.message`\n- Check `email_sms_message_queue` table for saved messages with correct status\n- Disable message types in admin - confirm messages aren't queued\n\nRelated work items: #238538",
"is_bot": false,
"headline": "Merged PR 69882: Move SMS sending from database queue to message queue",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-11-04T12:16:37Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5009180a7e9c8bae1bf93351cdd150a09c94441a",
"body": "## What's being changed\nOpt-in schema added for transactional SMS in email_order table.\n\n## Why it's being changed\nOpt-in status needs to be captured for transactional SMS.\n\n## How to review / test this change\n- `bin/magento setup:upgrade`\n- Modify `sms_transactional_requires_opt_in` and `sms_transactional_opt_in` in `email_order`\n- `bin/magento dotdigital:migrate --table=email_order`\n- Validate columns are restored\n\nRelated work items: #314830",
"is_bot": false,
"headline": "Merged PR 69612: Add opt-in schema for transactional SMS in email orders",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-10-13T08:03:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d83e5b2d4e05aabe9cc842016c7ee2cbe9bc7c39",
"body": "…idation\n\n## What's being changed\n\nThis PR modifies an MFTF test to pass reliably. Instead of looking for the error message inside the `.mage-error` div, we now just confirm that the input is marked with the class `.mage-error`.\n\n## Why it's being changed\n\nAt some point since we initially wrote this\n[…]\n loads the form. I've tested it during the pause, and it works - just not when the test is left to run by itself.\n\n## How to review / test this change\n\n- See a green build\n\nRelated work items: #310588",
"is_bot": false,
"headline": "Merged PR 69563: Modify ConsentRegistrationValidationTest to test val…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-10-10T14:43:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b4a1332394e4a3aa62a110b7c63043b56a229bcd",
"body": "###Improvements\n\n- We added \"SMS Subscriber Enabled\" and \"Add SMS Subscribers To\" to Integration Insight data.\n\n###Bug fixes\n\n- Our telephone input validator was loading at checkout even if the setting was disabled; this has been fixed.\n- Updated telephone numbers for SMS subscribers will now be pub\n[…]\nsubscribing to SMS while the main Dotdigital connector was disabled.\n- The on-blur behaviour of the SMS consent telephone input is now aligned with other telephone inputs.\n\nRelated work items: #310772",
"is_bot": false,
"headline": "Merged PR 69492: Pre-release 2.7.2",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-10-07T14:38:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9cc8ea4bb3b08b03ede7726f06c2353a9500ab80",
"body": "## What's being changed\nAdded catch block to prevent fatal error\n\n## Why it's being changed\nThe observer needs to catch all errors if connector is turned off\n\n## How to review / test this change\n- Turn off DD account connection at default level or for given scope\n- Turn on SMS consent for the account context\n- Register a customer and provide SMS consent\n\nRelated work items: #309994",
"is_bot": false,
"headline": "Merged PR 68217: Catch fatal error on sms registration observer",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-10-07T14:38:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e01a4789988e83d22bf859bc69a864a54d9ca049",
"body": "…ut consent fields\n\n## What's being changed\n\nAdded blur event listener to the international telephone input field in the checkout consent form that automatically updates the field value with the formatted phone number when the user leaves the field.\n\n## Why it's being changed\n\nTo normalize the behav\n[…]\ner is automatically formatted to international format\n- Test with various country codes and phone number formats\n- Ensure the formatting only occurs when leaving the field\n\nRelated work items: #318681",
"is_bot": false,
"headline": "Merged PR 69468: Add blur validation and value reassignment to checko…",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-10-07T14:37:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c05fef49a8ba439c7a39873346defef86b6ff641",
"body": "…bscribed mobile number\n\n## What's being changed\n\nThis ensures that customers who are subscribed to marketing SMS, and who update their mobile number via their account, have this number updated in Dotdigital - even if they aren't changing their subscriber status.\n\n## Why it's being changed\n\nWe weren\n[…]\nt in, we publish to the queue and save the number.\n- If the customer is not subscribed and they change their number without changing their opt in, we just save the number.\n\nRelated work items: #318240",
"is_bot": false,
"headline": "Merged PR 69409: Queue API update when subscribed customer changes su…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-10-07T14:37:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d804fc9009af1ad780136fa11a0ae50ad28ac88b",
"body": "…s To\" to Integration Insight data\n\n## What's being changed\nAdded \"SMS Subscriber Enabled\" and \"Add SMS Subscribers To\" to Insight data\n\n## Why it's being changed\nAllows support to identify SMS subscriber list when checking integration insight data\n\n## How to review / test this change\n- `bin/magento dotdigital:sync IntegrationInsights`\n- Validate insight data in the dashboard\n\nRelated work items: #313987",
"is_bot": false,
"headline": "Merged PR 68456: Add \"SMS Subscriber Enabled\" and \"Add SMS Subscriber…",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-10-07T14:37:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f37942a9a0e9044dce4235b5afacfc2bcd04d146",
"body": "…lidation is disabled\n\n## What's being changed\n\nThis PR prevents the IntlTelInput loading at checkout if telephone validation is disabled.\n\n## Why it's being changed\n\nThere was a regression some time back connected to a refactor for Hyvä themes. The impact is that telephone input validation would bl\n[…]\nured at checkout\n- Test the consent input with validation enabled\n- Test the consent input with validation disabled\n- See a green build for all checkout-related MFTF tests\n\nRelated work items: #310380",
"is_bot": false,
"headline": "Merged PR 67587: Stop loading the telephone input at checkout when va…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-10-07T14:37:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4f108fe99fa63ebc9d1a5d7e729e413b70655ac0",
"body": "###Improvements\n\n- We added \"SMS Subscriber Enabled\" and \"Add SMS Subscribers To\" to Integration Insight data.\n\n###Bug fixes\n\n- Our telephone input validator was loading at checkout even if the setting was disabled; this has been fixed.\n- Updated telephone numbers for SMS subscribers will now be pub\n[…]\nsubscribing to SMS while the main Dotdigital connector was disabled.\n- The on-blur behaviour of the SMS consent telephone input is now aligned with other telephone inputs.\n\nRelated work items: #310772",
"is_bot": false,
"headline": "Merged PR 69492: Pre-release 2.7.2",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-10-07T11:34:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e85c04cbf61015edaa4c9b406b60a41223da1b05",
"body": "## What's being changed\n- Methods added to Dotdigitalgroup\\Sms\\Model\\Apiconnector\\Client to support Cpaas setup\n- Transactional SMS Backend model updated to check and configure Cpaas opt-out rules\n\n## Why it's being changed\nCpaas opt-out rules are required to send a transactional SMS to US numbers\n\n\n[…]\n Disable Transactional SMS Consent and clear Transactional SMS consent text\n- Save Config\n- Validate config is cleared in `core_config_data` and rule is deleted in Postman\n\nRelated work items: #314804",
"is_bot": false,
"headline": "Merged PR 69222: Transactional SMS Cpaas Config",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-10-07T08:28:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ed076727210a488dea7f27317bfb9e2683593fa1",
"body": "## What's being changed\nAdded catch block to prevent fatal error\n\n## Why it's being changed\nThe observer needs to catch all errors if connector is turned off\n\n## How to review / test this change\n- Turn off DD account connection at default level or for given scope\n- Turn on SMS consent for the account context\n- Register a customer and provide SMS consent\n\nRelated work items: #309994",
"is_bot": false,
"headline": "Merged PR 68217: Catch fatal error on sms registration observer",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-10-06T15:24:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04e2aed24d25c0e22dad1581654c28ce86544337",
"body": "…ut consent fields\n\n## What's being changed\n\nAdded blur event listener to the international telephone input field in the checkout consent form that automatically updates the field value with the formatted phone number when the user leaves the field.\n\n## Why it's being changed\n\nTo normalize the behav\n[…]\ner is automatically formatted to international format\n- Test with various country codes and phone number formats\n- Ensure the formatting only occurs when leaving the field\n\nRelated work items: #318681",
"is_bot": false,
"headline": "Merged PR 69468: Add blur validation and value reassignment to checko…",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-10-06T15:18:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1ffbe19d7431830c88f26027eb42dc2aa7ce8fb5",
"body": "…bscribed mobile number\n\n## What's being changed\n\nThis ensures that customers who are subscribed to marketing SMS, and who update their mobile number via their account, have this number updated in Dotdigital - even if they aren't changing their subscriber status.\n\n## Why it's being changed\n\nWe weren\n[…]\nt in, we publish to the queue and save the number.\n- If the customer is not subscribed and they change their number without changing their opt in, we just save the number.\n\nRelated work items: #318240",
"is_bot": false,
"headline": "Merged PR 69409: Queue API update when subscribed customer changes su…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-10-03T14:52:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "69de4d3691b31b504dfe23cf55ed2195d1939b80",
"body": "## What's being changed\nAdds config section for transactional SMS consent.\n\n## Why it's being changed\nTransactional SMS consent text needs to be configurable.\n\n## How to review / test this change\n- Confirm enabling without consent text throws an error\n- Confirm clearing consent text without disabling throws an error\n\nRelated work items: #296035",
"is_bot": false,
"headline": "Merged PR 69191: Transactional SMS consent config",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-09-30T08:49:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bdca9b3af82b1948ef9f787c6ed5deb2c522dcf3",
"body": "…s To\" to Integration Insight data\n\n## What's being changed\nAdded \"SMS Subscriber Enabled\" and \"Add SMS Subscribers To\" to Insight data\n\n## Why it's being changed\nAllows support to identify SMS subscriber list when checking integration insight data\n\n## How to review / test this change\n- `bin/magento dotdigital:sync IntegrationInsights`\n- Validate insight data in the dashboard\n\nRelated work items: #313987",
"is_bot": false,
"headline": "Merged PR 68456: Add \"SMS Subscriber Enabled\" and \"Add SMS Subscriber…",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-09-08T07:28:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9738b5113fbf27b466c46262dc04cdc87091fe81",
"body": "…lidation is disabled\n\n## What's being changed\n\nThis PR prevents the IntlTelInput loading at checkout if telephone validation is disabled.\n\n## Why it's being changed\n\nThere was a regression some time back connected to a refactor for Hyvä themes. The impact is that telephone input validation would bl\n[…]\nured at checkout\n- Test the consent input with validation enabled\n- Test the consent input with validation disabled\n- See a green build for all checkout-related MFTF tests\n\nRelated work items: #310380",
"is_bot": false,
"headline": "Merged PR 67587: Stop loading the telephone input at checkout when va…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-08-04T08:54:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "36d3d4a45f2bfc5ea4315b2b4145a461bc3ec68c",
"body": "## What's being changed\n\nMFTF tests. This PR contains various test fixes.\n\n## Why it's being changed\n\nThese have been broken for some time owing to problems with the pipeline itself.\n\n## How to review / test this change\n\n- All tests should pass in the pipeline apart from:\n```\nConsentCheckoutValidati\n[…]\nnsentGuestCheckoutValidationDisabledTest\nConsentRegistrationValidationTest\n```\n(which require code changes outside of the tests themselves and will follow in separate PRs)\n\nRelated work items: #308037",
"is_bot": false,
"headline": "Merged PR 67534: MFTF test fixes",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-08-01T12:04:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "19d21d092ae97f13170b6fdf874060fd1919f6b5",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into AM/release-271",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-07-29T16:41:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "410c18f813d3c003a01975562714329df1bd173a",
"body": "## What's being changed\n\nWe have added escapers to several template files.\n\n## Why it's being changed\n\nAdobe coding standards failed due to the missing escapers within the templates.\n\n## How to review / test this change\n\n- Smoke test pages affected.\n- Coding standards must pass.\n\nRelated work items: #309832",
"is_bot": false,
"headline": "Merged PR 67443: Add escaping in templates",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-07-29T16:11:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c347b88b39f31ba4bae6d22e8037aaff570fa20",
"body": "2.7.1 Pre release\n\nRelated work items: #309594",
"is_bot": false,
"headline": "Merged PR 67410: 2.7.1 Pre release",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-07-28T13:53:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eb7ef68abb0db549d87649d7d024b681205abb63",
"body": "release notes, composer version bump to 2.7.1\n\nRelated work items: #309594",
"is_bot": false,
"headline": "Merged PR 67386: 2.7.1 Pre release",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-07-28T13:53:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dc2e386273de66aede50560b99ecfa9b4cda02db",
"body": "## What's being changed\n\nWe have added a conditional check to ensure the element exists before attempting to retrieve it from the Intl input globals object.\n\n## Why it's being changed\n\nThe console was throwing an error during runtime if the element had not loaded by the time the intlInput wanted to \n[…]\n review / test this change\n\n- Enable SMS consent\n- Open console on frontend.\n- Log in as a customer\n- Proceed to shipping with a saved address\n- Observe no console errors.\n\nRelated work items: #306842",
"is_bot": false,
"headline": "Merged PR 67273: Fix console errors for SMS consent",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-07-28T13:53:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8d4ea345b29d8db5616b606eed8d93992068d8b5",
"body": "…mentRestPlugin\n\n## What's being changed\n- Scoped module enabled check\n- Removed trailing comma for PHP 7.4\n\n## Why it's being changed\n- Order sync updated needs to be scoped on the website level\n- Fix error in PHP 7.4\n\n## How to review / test this change\n\n- Use PHP 7,4\n- See no error exceptions\n\nRelated work items: #307909",
"is_bot": false,
"headline": "Merged PR 66985: Use order website scope for enabled check in NewShip…",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-07-28T13:53:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "560d15bd84a18dab478b822646bfeb1cfd523dff",
"body": "2.7.1 Pre release\n\nRelated work items: #309594",
"is_bot": false,
"headline": "Merged PR 67410: 2.7.1 Pre release",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-07-28T13:39:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea570f1f7a00dd2d6496d7a67c6fdcc115e44081",
"body": "release notes, composer version bump to 2.7.1\n\nRelated work items: #309594",
"is_bot": false,
"headline": "Merged PR 67386: 2.7.1 Pre release",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-07-28T11:39:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3af8f4880754ecc53e738e1374ef73e461b8f714",
"body": "## What's being changed\n\nWe have added a conditional check to ensure the element exists before attempting to retrieve it from the Intl input globals object.\n\n## Why it's being changed\n\nThe console was throwing an error during runtime if the element had not loaded by the time the intlInput wanted to \n[…]\n review / test this change\n\n- Enable SMS consent\n- Open console on frontend.\n- Log in as a customer\n- Proceed to shipping with a saved address\n- Observe no console errors.\n\nRelated work items: #306842",
"is_bot": false,
"headline": "Merged PR 67273: Fix console errors for SMS consent",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-07-25T13:03:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ac3486f3f8013c7ac14a522e1ab8a9d935c723c9",
"body": "…mentRestPlugin\n\n## What's being changed\n- Scoped module enabled check\n- Removed trailing comma for PHP 7.4\n\n## Why it's being changed\n- Order sync updated needs to be scoped on the website level\n- Fix error in PHP 7.4\n\n## How to review / test this change\n\n- Use PHP 7,4\n- See no error exceptions\n\nRelated work items: #307909",
"is_bot": false,
"headline": "Merged PR 66985: Use order website scope for enabled check in NewShip…",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-07-15T11:33:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee15211f95b95200dd8b7d0485f3f2e708b5faf7",
"body": "…mentRestPlugin\n\n## What's being changed\n- Scoped module enabled check\n- Removed trailing comma for PHP 7.4\n\n## Why it's being changed\n- Order sync updated needs to be scoped on the website level\n- Fix error in PHP 7.4\n\n## How to review / test this change\n\n- Use PHP 7,4\n- See no error exceptions\n\nRelated work items: #307909",
"is_bot": false,
"headline": "Merged PR 66985: Use order website scope for enabled check in NewShip…",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-07-15T11:32:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f34469168af7b4319cc83fdea70eda3397d16c4b",
"body": "…magento2-extension-sms into release/2.7.0",
"is_bot": false,
"headline": "Merge branch 'develop' of ssh.dev.azure.com:v3/dotdigital/ec/ec-core-…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-07-10T15:52:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3a3a1f1ed3dcb5b0f98be96e5ac301d796ca0600",
"body": "2.7.0 pre-release\n\nRelated work items: #297764",
"is_bot": false,
"headline": "Merged PR 66788: 2.7.0 pre-release",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-07-10T15:50:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bc0637141cff22f0e1400e26aa0effbad3777ac4",
"body": "## What's being changed\nNewShipmentRestPlugin added\n\n## Why it's being changed\nPlugin to send new shipment sms when using order ship rest endpoint\n\n## How to review / test this change\n- Send a new request to order shipment endpoint\n- Verify record added to `email_sms_message_queue`\n\n##Notes\nSample r\n[…]\n \"track_number\": \"1Y-9876543210\",\n \"title\": \"Custom\",\n \"carrier_code\": \"custom\",\n \"extension_attributes\": {}\n }\n ]\n}\n```\n\nRelated work items: #266715",
"is_bot": false,
"headline": "Merged PR 64380: Transactional SMS new-shipment rest plugin",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-04-24T14:04:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9289d1e541c59d03420b16adc65ab10d15ce8772",
"body": "## What's being changed\nNumber formatting function changed to remove all non numeric characters\n\n## Why it's being changed\nPhone number validation passes on the frontend with dashes, but is incorrectly stored if non numeric characters like dashes are saved\n\n## How to review / test this change\n- Logi\n[…]\nEnter +1 201-555-0123 as the mobile number for sms marketing consent\n- Edit customer and verify number on dotdigital tab the number is stored as +12015550123 and not +1201\n\nRelated work items: #296052",
"is_bot": false,
"headline": "Merged PR 64334: Number validation fix",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-04-22T07:18:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "213f387864fc524735dc4ef49aa8e8d5b3fc6290",
"body": "### 2.6.2\n\n##### Improvements\n- `{{ entity_id }}` is added to the available template variables for transactional SMS.\n- We removed implicitly null types for compatibility with PHP 8.4.\n- We fixed some MFTF test annotation errors.\n\nRelated work items: #292479",
"is_bot": false,
"headline": "Merged PR 64042: Pre release 2.6.2",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-04-08T13:38:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cf0ff40c8559c506555329ae45fd2cfa9bfc67ef",
"body": "…lates\n\n## What's being changed\n\nWe have introduced the `entity_id` to the transactional SMS template(s).\n\n## Why it's being changed\n\nMerchants have requested the addition of the `entity_id` or **True order ID** on several occasions.\n\n## How to review / test this change\n\n- Ensure transactional SMS i\n[…]\nist(s).\n- Place an order.\n- Run your cron.\n- Observe the `entity_id` replacement in the template with the true entity ID not the incremental ID in **Reports > SMS Sends**\n\nRelated work items: #292646",
"is_bot": false,
"headline": "Merged PR 63635: Allow the use of entity_id in transactional SMS temp…",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-04-08T13:38:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9a7a89045aa44ea3169e5aa8a3f66e44ac61d332",
"body": "## What's being changed\n\nFixes some annotation errors flagged in the BAP report. Also I've added a line to `ConsentGuestCheckoutValidationDisabledTest` which we have on `ConsentGuestCheckoutValidationTest`, for consistency.\n\n## Why it's being changed\n\nThe line addition relating to Flat Rate doesn't \n[…]\ne')}}\" stepKey=\"selectFlatRateShippingMethod\"/>\n\nI added this, and it still tripped up at the same point.\n\n## How to review / test this change\n\n- See a green build in MFTF\n\nRelated work items: #275301",
"is_bot": false,
"headline": "Merged PR 58505: Fix MFTF test annotation errors",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-04-08T13:38:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "396b778a42c89c4dfa4eac40e0c9c76947cffbb8",
"body": "## What's being changed\nUpdated nullable parameters to not throw deprecated warnings\n\n## Why it's being changed\nMagento 2.4.8-beta2/PHP8.4 compatibility\n\n## How to review / test this change\n- Checkout develop branch\n- See deprecated warnings on frontend and when running `bin/magento setup:di:compile`\n- Checkout patch branch, confirm errors are gone\n\nRelated work items: #291346",
"is_bot": false,
"headline": "Merged PR 63324: PHP 8.4 patch",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-04-08T13:38:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d8108d7b7ad16891a7f5cc8283de208f1b6c5ade",
"body": "### 2.6.2\n\n##### Improvements\n- `{{ entity_id }}` is added to the available template variables for transactional SMS.\n- We removed implicitly null types for compatibility with PHP 8.4.\n- We fixed some MFTF test annotation errors.\n\nRelated work items: #292479",
"is_bot": false,
"headline": "Merged PR 64042: Pre release 2.6.2",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-04-07T15:22:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c8d9a9e0e2df4551cbe856305aeaeafed79119a",
"body": "…lates\n\n## What's being changed\n\nWe have introduced the `entity_id` to the transactional SMS template(s).\n\n## Why it's being changed\n\nMerchants have requested the addition of the `entity_id` or **True order ID** on several occasions.\n\n## How to review / test this change\n\n- Ensure transactional SMS i\n[…]\nist(s).\n- Place an order.\n- Run your cron.\n- Observe the `entity_id` replacement in the template with the true entity ID not the incremental ID in **Reports > SMS Sends**\n\nRelated work items: #292646",
"is_bot": false,
"headline": "Merged PR 63635: Allow the use of entity_id in transactional SMS temp…",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2025-03-25T07:26:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "291285c874111c1735b3919eb6aea3e83d4d18d9",
"body": "## What's being changed\n\nFixes some annotation errors flagged in the BAP report. Also I've added a line to `ConsentGuestCheckoutValidationDisabledTest` which we have on `ConsentGuestCheckoutValidationTest`, for consistency.\n\n## Why it's being changed\n\nThe line addition relating to Flat Rate doesn't \n[…]\ne')}}\" stepKey=\"selectFlatRateShippingMethod\"/>\n\nI added this, and it still tripped up at the same point.\n\n## How to review / test this change\n\n- See a green build in MFTF\n\nRelated work items: #275301",
"is_bot": false,
"headline": "Merged PR 58505: Fix MFTF test annotation errors",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2025-03-24T09:36:31Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0849d37c250e1e19909ec4c89e46df801c3acfae",
"body": "## What's being changed\nUpdated nullable parameters to not throw deprecated warnings\n\n## Why it's being changed\nMagento 2.4.8-beta2/PHP8.4 compatibility\n\n## How to review / test this change\n- Checkout develop branch\n- See deprecated warnings on frontend and when running `bin/magento setup:di:compile`\n- Checkout patch branch, confirm errors are gone\n\nRelated work items: #291346",
"is_bot": false,
"headline": "Merged PR 63324: PHP 8.4 patch",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-03-19T10:24:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d80e409217671697df6931d45404942537c0ed5a",
"body": "…-core-magento2-extension-sms into release/2.6.1",
"is_bot": false,
"headline": "Merge branch 'develop' of https://dev.azure.com/dotdigital/ec/_git/ec…",
"author_name": "Gustaf.Landman",
"author_login": "gpl-php",
"committed_at": "2025-02-14T14:57:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e9b9f5c59e64263083f0035203c7e719a42e2f4",
"body": "**Improvements**\n\n- A list for SMS Subscribers is now created when merchants run ‘Setup Integration’ on the admin Accounts page.\n\nRelated work items: #285127",
"is_bot": false,
"headline": "Merged PR 62274: Pre-release 2.6.1",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-02-14T14:53:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89c74ac56bd53a5bfe9adf234a07e013059d75d1",
"body": "## What's being changed\n\nIntegration setup plugin added\n\n## Why it's being changed\n\nTo create a list for SMS Subscribers when Set Up Integration button is clicked\n\n## How to review / test this change\n\nGo to **Store->Configuration->Dotdigital->Marketing Consent**\nEnable \"During Account Registration\" \n[…]\ns\nPHPStan build fails because setAddressBookMap is defined on a seperate pull request\nhttps://dev.azure.com/dotdigital/ec/_git/ec-core-magento2-extension/pullrequest/61089\n\nRelated work items: #211557",
"is_bot": false,
"headline": "Merged PR 61088: Add SMS Subscribers list to integration set up",
"author_name": "Gustaf Landman",
"author_login": "gpl-php",
"committed_at": "2025-01-09T10:59:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8033c700091f4a3131c582296f1c2686faef0d64",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into release/2.6.0",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-12-05T08:50:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "16e3e28df210447bd2098c01dec357130b5e6721",
"body": "2.6.0 pre-release\n\nRelated work items: #278726",
"is_bot": false,
"headline": "Merged PR 60592: 2.6.0 pre-release",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-12-04T13:03:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "390bfd7dea3111f54bd134a08068a4fa3ed2e157",
"body": "## What's being changed\n\nOne of our observers.\n\n## Why it's being changed\n\nThere was a trailling comma in the constructor arguments and this breaks in PHP 7.4.\n\n## How to review / test this change\n\n- Use PHP 7.4 on a Magento version that supports it (2.3.7, or 2.4.0-2.4.3)\n- Run bin/magento setup:di:compile\n\nRelated work items: #279729",
"is_bot": false,
"headline": "Merged PR 60366: Fix setup:di:compile on PHP 7.4",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-11-28T14:04:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b416da453c7541374a03391629f4d101cdded7ed",
"body": "…without consent text\n\n## What's being changed\n\nEnabling consent for SMS marketing in the connector admin. Merchants must now set consent text when enabling consent. In addition, merchants cannot clear consent text if consent is enabled in any context.\n\n## Why it's being changed\n\nConsent text is a r\n[…]\nnherited values\n- Set everything up so it's correct - then try deleting consent text while consent is Yes in any context or at any level (this should also not be possible)\n\nRelated work items: #216620",
"is_bot": false,
"headline": "Merged PR 60336: Add backend models to prevent consent being enabled …",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-11-26T16:32:35Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8399f72b95ac4777746cde715259e5ad152c72ae",
"body": "### 2.5.0\n\n##### What’s new\n- We have added an `isRequired()` method to the `TelephoneCheckoutConfig` class for use in Hyva Checkout.\n\n##### Improvements\n- Keywords are no longer listed as possible ‘From name’ originators for transactional SMS.\n- The ddg_automation_sms cron job now schedules ahead for 10 minutes.\n- We removed an overloaded method in the RestoreEmailContactTableSmsSubscribers data migration.\n\nRelated work items: #276000",
"is_bot": false,
"headline": "Merged PR 60126: 2.5.0 pre-release",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2024-11-20T10:20:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dca7255814b01405ca9160cd91ffff25d70480de",
"body": "## What's being changed\n\nThe list of possible originators returned in the source model for 'Select default SMS from name'.\n\nI also updated the `getFromNumber` method to make it more agnostic (it can return a name or a number, and it was confusing to have a `getFromNumber` method that returned a vari\n[…]\nt SMS from name'\n- Set the long number as your originator\n- Enable transactional SMS for e.g. new order\n- Place an order (use a UK number)\n- See SMS delivered successfully\n\nRelated work items: #276468",
"is_bot": false,
"headline": "Merged PR 59532: Remove keywords as originators in transactional SMS",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-11-20T10:19:49Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "0666c78f9964dc89f87e3bf8d68ff34088383f90",
"body": "… cron group\n\n## What's being changed\n\nThe schedule ahead for default value for the cron group.\n\n## Why it's being changed\n\nScheduling ahead further into the future should improve the likelihood that, if a merchant runs cron less often than a 1-minute interval, a `ddg_automation_sms_order_messages` \n[…]\no cron:run 2>&1 | grep -v \"Ran jobs by schedule\" >> /www/var/log/magento.cron.log\n```\n- Confirm that `ddg_automation_sms_order_messages` runs at least once every 5 minutes\n\nRelated work items: #253510",
"is_bot": false,
"headline": "Merged PR 59514: Extend schedule ahead default for ddg_automation_sms…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-11-20T10:19:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4dde676637ad28b7cdef436ef97ad1eb83b4132a",
"body": "…idation\n\n## What's being changed\n\nWe have added an additional `isRequired()` method to the `tel` config object.\n\n## Why it's being changed\n\nWe need a way to check if the telephone number at checkout was set to Optional for Hyvä checkout.\n\n## How to review / test this change\n\n- Review steps on PR 54302\n\nRelated work items: #271505",
"is_bot": false,
"headline": "Merged PR 58416: Add isRequired to config to use in Hyva checkout val…",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2024-11-20T10:19:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "40a4b9a248bb533a556a95269198b02e28d74959",
"body": "### 2.5.0\n\n##### What’s new\n- We have added an `isRequired()` method to the `TelephoneCheckoutConfig` class for use in Hyva Checkout.\n\n##### Improvements\n- Keywords are no longer listed as possible ‘From name’ originators for transactional SMS.\n- The ddg_automation_sms cron job now schedules ahead for 10 minutes.\n- We removed an overloaded method in the RestoreEmailContactTableSmsSubscribers data migration.\n\nRelated work items: #276000",
"is_bot": false,
"headline": "Merged PR 60126: 2.5.0 pre-release",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2024-11-20T07:08:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89aa25d8339700eb4d3aa8fca2ff97d2ae538913",
"body": "## What's being changed\n\nThe list of possible originators returned in the source model for 'Select default SMS from name'.\n\nI also updated the `getFromNumber` method to make it more agnostic (it can return a name or a number, and it was confusing to have a `getFromNumber` method that returned a vari\n[…]\nt SMS from name'\n- Set the long number as your originator\n- Enable transactional SMS for e.g. new order\n- Place an order (use a UK number)\n- See SMS delivered successfully\n\nRelated work items: #276468",
"is_bot": false,
"headline": "Merged PR 59532: Remove keywords as originators in transactional SMS",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-11-05T12:32:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c9570d81d4d447c776af7343fec250d1ae925ba0",
"body": "… cron group\n\n## What's being changed\n\nThe schedule ahead for default value for the cron group.\n\n## Why it's being changed\n\nScheduling ahead further into the future should improve the likelihood that, if a merchant runs cron less often than a 1-minute interval, a `ddg_automation_sms_order_messages` \n[…]\no cron:run 2>&1 | grep -v \"Ran jobs by schedule\" >> /www/var/log/magento.cron.log\n```\n- Confirm that `ddg_automation_sms_order_messages` runs at least once every 5 minutes\n\nRelated work items: #253510",
"is_bot": false,
"headline": "Merged PR 59514: Extend schedule ahead default for ddg_automation_sms…",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-11-01T14:43:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c19ddf6d3d321489bac6d65ee93d7790faab385d",
"body": "## What's being changed\n\nThe `bulkUpdate` method has been removed in the `RestoreEmailContactTableSmsSubscribers` data migration.\n\n## Why it's being changed\n\nThis method was only present here in order to pass an array to `getUpdateBindings()` instead of a key string, which is what the parent did. I'\n[…]\neview / test this change\n\n- Take a note of the count for this migration type before switching branches\n- Switch to this branch, re-run migrate, and check the count matches\n\nRelated work items: #240661",
"is_bot": false,
"headline": "Merged PR 59357: Remove overloaded migration method",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-10-31T16:18:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8da208da4414fcf03ee36a38ae03ded730d907f0",
"body": "…idation\n\n## What's being changed\n\nWe have added an additional `isRequired()` method to the `tel` config object.\n\n## Why it's being changed\n\nWe need a way to check if the telephone number at checkout was set to Optional for Hyvä checkout.\n\n## How to review / test this change\n\n- Review steps on PR 54302\n\nRelated work items: #271505",
"is_bot": false,
"headline": "Merged PR 58416: Add isRequired to config to use in Hyva checkout val…",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2024-10-31T07:50:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bb4b8c8f71bcc20b6d137838337022ac2c365077",
"body": null,
"is_bot": false,
"headline": "Merge branch 'develop' into release/2.4.0",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-10-08T10:45:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8016086b359064a060cfd4088a8245ef83a2eb4a",
"body": "Related work items: #272885",
"is_bot": false,
"headline": "Merged PR 58605: 2.4.0 pre-release",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-10-08T10:39:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "197cef43b4087176de9af9289886574ed2321ea1",
"body": "## What's being changed\n\nWe have added a `Before` plugin method and deprecated the current `After` plugin method.\n\n## Why it's being changed\n\nWe made significant changes to the Email sync queue manager and progress handler. This required us to make modifications to the module that plugins into the c\n[…]\nension-sms/pullrequest/58615).\n\nPlease use [Fix pluggable import types](https://dev.azure.com/dotdigital/ec/_git/ec-core-magento2-extension/pullrequest/58622) when testing\n\nRelated work items: #272928",
"is_bot": false,
"headline": "Merged PR 58643: Add before getBulkQueue() plugin",
"author_name": "Shaun Hogan",
"author_login": "pvpcookie",
"committed_at": "2024-10-08T08:59:01Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6be6baa57690f2da65ab3abb74a618945ef5a485",
"body": "## What's being changed\n\nThis PR updates the plugin responsible for providing module-specific in-progress imports to the ImporterProgressHandler.\n\n## Why it's being changed\n\nThe ImporterProgressHandler changed in the latest Email release.\n\n## How to review / test this change\n\n- Run SMS_Subscriber sync\n- Run the importer sync\n- See SMS_Subscriber rows get picked up and marked as either completed or failed\n\nRelated work items: #272914",
"is_bot": false,
"headline": "Merged PR 58615: Add custom in-progress group for SMS_Subscriber imports",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-10-08T08:38:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "774cf221cffd96c8bff193a4791454c239e9b0c6",
"body": "## What's being changed\n\nWe've wrapped any calls to PublisherInterface::publish in try/catch statements. In addition, all this module's observers are now wrapped in try/catch.\n\nOne other small thing - the observers now return `$this` as opposed to void. This doesn't change anything, because Magento \n[…]\nplete as expected\n- Change the topic names for each to a bad topic name and confirm the thrown exception is caught, logged, and does not surface an error to the storefront\n\nRelated work items: #265574",
"is_bot": false,
"headline": "Merged PR 58300: Add try catch when publishing to queues",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-10-04T08:24:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "13b9f090de684b6cd93a64bfcff8439332576e2f",
"body": "## What's being changed\n\nWe're updating an MFTF test that had started failing following [this commit](47a6a4cbe8c7b650bd353852d5e64ed79868940f).\n\n## Why it's being changed\n\nWe had previously altered the expected phone number value in the consent input, because of the way it used to work (i.e. differ\n[…]\neason for why it behaved this way, the test can be changed to what it should have been in the first place.\n\n## How to review / test this change\n\n- See a PASS for this test\n\nRelated work items: #271479",
"is_bot": false,
"headline": "Merged PR 58235: Update ConsentGuestCheckoutValidationTest MFTF",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-10-03T12:36:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6b9e238c1e3b0b3e716de9fef8b2d75dfa25dd82",
"body": "## What's being changed\n\nSmsSubscriberBatchProcessor.php.\n\n## Why it's being changed\n\nThis class is now deprecated. We will move to using the new MegaBatchProcessor class in the Email module at some point in the future.\n\nRelated work items: #270860",
"is_bot": false,
"headline": "Merged PR 58556: Add deprecation notice to SmsSubscriberBatchProcessor",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-10-03T12:28:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "380bac7b7721b6447fc23852a303e9e448b4bfcc",
"body": "## What's being changed\n\nThe SmsSubscriptionConsumer. We were passing a mobile number identifier to the patch call whilst setting an 'email' match identifier in `prepareContact()`.\n\nI also fixed a bad potential bug when loading a V3Client for a specific website id.\n\n## Why it's being changed\n\nThis c\n[…]\nd in DD\n- Log in as a customer\n- Test subscribing and unsubscribing to SMS via the account subscriptions page\n- Reset SMS subscribers and smoke test the SmsSubscriber sync\n\nRelated work items: #269596",
"is_bot": false,
"headline": "Merged PR 58037: Use email as match identifier in SMS subscribes",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-09-25T13:36:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "71c60a80298dbe6266a5e753462a0ec5840d527d",
"body": "2.3.3 pre-release\n\nRelated work items: #271384",
"is_bot": false,
"headline": "Merged PR 58204: 2.3.3 pre-release",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-09-23T15:56:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "58aec81f6554a15b72dec7bea252ec6903e90b6f",
"body": "…number\n\n## What's being changed\n\nThe consent telephone number component at checkout now uses the intended config as passed via the view model and the ConsentCollapseGroup component.\n\nWe're also now requiring the intlTelInput dependency in consentCheckoutForm.js, just in case this was not already in\n[…]\ne as the other input instances\n- Check `window.intlTelInputGlobals.instances` in the console. Confirm that each instance's options property indicates `nationalMode: false`\n\nRelated work items: #271105",
"is_bot": false,
"headline": "Merged PR 58105: Apply correct ViewModel config to consent telephone …",
"author_name": "Alastair Mucklow",
"author_login": "sta1r",
"committed_at": "2024-09-23T15:55:56Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 39,
"commits_last_year": 53,
"latest_release_at": "2026-05-22T08:42:13Z",
"latest_release_tag": "v3.0.2",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 16,
"days_since_latest_release": 67,
"mean_days_between_releases": 49.8
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": false,
"has_contributing": false,
"health_percentage": 25,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "dotdigital/dotdigital-magento2-extension-sms",
"exists": true,
"license": "MIT",
"keywords": [],
"ecosystem": "packagist",
"matches_repo": true,
"registry_url": "https://packagist.org/packages/dotdigital/dotdigital-magento2-extension-sms",
"is_deprecated": false,
"latest_version": "3.0.2",
"repository_url": "https://github.com/dotmailer/dotmailer-magento2-extension-sms",
"versions_count": 41,
"total_downloads": 154381,
"dependents_count": 3,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 2962,
"first_published_at": null,
"latest_published_at": "2026-05-21T10:17:06Z",
"latest_version_yanked": null,
"days_since_latest_publish": 68
}
]
},
"popularity": {
"forks": 2,
"stars": 0,
"watchers": 5,
"fork_history": {
"days": [
{
"date": "2021-01-29",
"count": 1
},
{
"date": "2023-11-29",
"count": 1
}
],
"complete": true,
"collected": 2,
"total_forks": 2
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 313897,
"source_files_sampled": 191,
"oversized_source_files": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"composer.json"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"packagist"
],
"dependencies": [
{
"name": "dotdigital/dotdigital-magento2-extension",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^4.29.0"
},
{
"name": "magento/framework",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": ">=103.0.2 <104"
},
{
"name": "magento/module-config",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": ">=101 <102"
},
{
"name": "magento/module-backend",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": ">=101 <103"
},
{
"name": "magento/module-customer",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": ">=102 <104"
},
{
"name": "magento/module-store",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": ">=101 <102"
},
{
"name": "magento/module-checkout",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^100.3|^100.4"
},
{
"name": "magento/module-sales",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": ">=102 <104"
},
{
"name": "magento/module-ui",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": ">=101 <102"
},
{
"name": "magento/module-shipping",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^100.3|^100.4"
},
{
"name": "magento/module-directory",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^100.3|^100.4"
},
{
"name": "magento/module-reports",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^100.3|^100.4"
},
{
"name": "magento/module-cron",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^100.3|^100.4"
},
{
"name": "magento/module-newsletter",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^100.3|^100.4"
},
{
"name": "psr/log",
"manifest": "composer.json",
"ecosystem": "packagist",
"version_constraint": "^1 || ^2 || ^3"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 3,
"open_issues": 0,
"closed_ratio": 1,
"closed_issues": 5,
"closed_unmerged_prs": 1
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "sta1r",
"commits": 189,
"avatar_url": "https://avatars.githubusercontent.com/u/77671?v=4"
},
{
"type": "User",
"login": "pvpcookie",
"commits": 55,
"avatar_url": "https://avatars.githubusercontent.com/u/26158876?v=4"
},
{
"type": "User",
"login": "sertlab",
"commits": 48,
"avatar_url": "https://avatars.githubusercontent.com/u/40098832?v=4"
},
{
"type": "User",
"login": "gpl-php",
"commits": 32,
"avatar_url": "https://avatars.githubusercontent.com/u/194241058?v=4"
},
{
"type": "User",
"login": "zergionn-amasty",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/53526389?v=4"
},
{
"type": "User",
"login": "simon-letch",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/4983213?v=4"
},
{
"type": "User",
"login": "vmalyk",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/5318027?v=4"
}
],
"contributors_sampled": 7,
"top_contributor_share": 0.576
},
"quality_signals": {
"has_ci": false,
"has_tests": true,
"ci_workflows": [],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": null,
"reason": "no workflows found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 3,
"reason": "4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": null,
"reason": "no dependencies found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": null,
"reason": "No tokens found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "2bafd915694b0340669f59548796caba532a807e",
"ran_at": "2026-07-28T15:36:54Z",
"aggregate_score": 3.4,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": null,
"oldest_open_prs": [],
"last_merged_pr_at": "2021-05-27T08:42:48Z",
"ci_last_conclusion": null,
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/dotmailer/dotmailer-magento2-extension-sms",
"host": "github.com",
"name": "dotmailer-magento2-extension-sms",
"owner": "dotmailer"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 53,
"inputs": {
"security": 34,
"vitality": 76,
"community": 31,
"governance": 64,
"engineering": 48
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 76,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"commits_last_year": 53,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 16
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "16/52 weeks with commits",
"points": 11.1,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 16
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "53 commits in the last year",
"points": 15.6,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 53
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 92,
"inputs": {
"releases_count": 39,
"latest_release_tag": "v3.0.2",
"releases_from_tags": false,
"days_since_latest_release": 67,
"mean_days_between_releases": 49.8
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "39 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 39
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 67 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 67
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~49.8 days",
"points": 19.8,
"status": "partial",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 49.8
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "excellent",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "maintained",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": null,
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": 68,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 68 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 68
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 31,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 3,
"inputs": {
"forks": 2,
"stars": 0,
"watchers": 5,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "2 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 2
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "5 watchers",
"points": 3.3,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 5
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
},
{
"key": "ecosystem_adoption",
"band": "moderate",
"name": "Ecosystem adoption (downloads)",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"packages": [
"dotdigital/dotdigital-magento2-extension-sms"
],
"dependents": 3,
"ecosystems": "packagist",
"total_downloads": 154381,
"monthly_downloads": 2962
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,962 downloads/month across packagist",
"points": 46.3,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2962,
"ecosystems": "packagist"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "3 packages depend on it",
"points": 4,
"status": "partial",
"details": [
{
"code": "registry_dependents",
"params": {
"count": 3
}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 64,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "at_risk",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 31,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 7,
"top_contributor_share": 0.576
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 58% of commits",
"points": 9.5,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 58
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "7 contributors",
"points": 9.5,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 7
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 76,
"inputs": {
"merged_prs": 3,
"open_issues": 0,
"closed_issues": 5,
"issue_closed_ratio": 1,
"closed_unmerged_prs": 1
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "100% of issues closed",
"points": 46.8,
"status": "met",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 100
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "3/4 decided PRs merged",
"points": 28.7,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 3,
"decided": 4
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"followers": 9,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "dotmailer",
"public_repos": 39,
"account_age_days": 4954
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "9 followers of dotmailer",
"points": 7.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 9,
"login": "dotmailer"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "39 public repos, account ~13 yr old",
"points": 23.7,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 39
}
},
{
"code": "account_age_years",
"params": {
"years": 13
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"dotdigital/dotdigital-magento2-extension-sms"
],
"ecosystems": "packagist",
"any_deprecated": false,
"min_days_since_publish": 68
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on packagist",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "packagist"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 68 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 68
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "41 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 41
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "at_risk",
"name": "Engineering Quality",
"value": 48,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "at_risk",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 30,
"inputs": {
"has_ci": false,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [
"magento2"
],
"has_wiki": true,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "1 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 1
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 34,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, CI-Tests, Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"ci_tests",
"dangerous_workflow",
"packaging",
"pinned_dependencies",
"signed_releases",
"token_permissions"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 34,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 11,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 7,
"scorecard_aggregate": 3.4
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no workflows found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "No tokens found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 3
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "at_risk",
"name": "AI Readiness",
"value": 35,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 0.77,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "77 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 77,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "critical",
"name": "Verify loop (build / test / typecheck)",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_pinned_dependencies"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 24,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": false,
"typed_language": false,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "no dependencies found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "moderate",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"primary_language": "PHP",
"largest_source_bytes": 313897,
"source_files_sampled": 191,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "PHP without a type-check config",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_typecheck_config_language",
"params": {
"language": "PHP"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/191 source files over 60KB",
"points": 54.7,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 191,
"oversized": 1
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
}
],
"metrics_version": "1.13.0"
},
"warnings": [
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T15:37:01.295832Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dotmailer/dotmailer-magento2-extension-sms.svg",
"full_name": "dotmailer/dotmailer-magento2-extension-sms",
"license_state": "standard",
"license_spdx": "MIT"
}