, etc.) and does NOT defend against argument injection. A\npayload like `params => ['-r --some-flag /etc/passwd']` would still split\nacross addit\n[…]\nrg-injection token quoting and the allow-list deny/empty/allow paths\n(`ExecuteTaskTest.php`). Refresh the docs section to describe the new\nescaping primitive and the production allow-list requirement.", "is_bot": false, "headline": "Harden ExecuteTask with per-arg escapeshellarg and allow-list (#485)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-05-02T14:36:55Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "34e805092aa7b1f472f21f9711fe6df232654425", "body": "Using 'escape' => false also disables HTML escaping of attributes (URL, classes, title), not just the title text. The narrower 'escapeTitle' => false keeps attribute escaping on while still allowing the icon HTML in the title.", "is_bot": false, "headline": "Use escapeTitle instead of escape in pagination element (#483)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-30T23:07:42Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "64c95715882c02f8756c8d6be20e1d5d569829bd", "body": "The legacy raw-serialized branch in EmailTask::run() previously called unserialize() without an allowed_classes restriction, so a queue job whose 'class' was a Message subclass but whose 'settings' string contained a different gadget-chain class would deserialize that gadget. Anyone who can enqueue \n[…]\ninto RCE.\n\nPin the deserialization to the same Message subclass that was already validated for instantiation. Modern app code that passes settings as an array via EmailTask::serialize() is unaffected.", "is_bot": false, "headline": "Restrict unserialize to the configured Message class (#484)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-30T23:07:30Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "53865a78d0acf43a1e40e23e1d72429ba2b66d2e", "body": null, "is_bot": false, "headline": "Use ServerRequest import in app.example.php (CS fix)", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-04-30T15:52:41Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "7c0e6b45b5e678671faf2422d236aaf266d60b97", "body": null, "is_bot": false, "headline": "Document Queue.adminAccess in app.example.php", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-04-30T15:17:09Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "19d73a87dc6fb8bf7ea7e90e8a2ca5942902cbe1", "body": "The Queue admin UI can trigger jobs (via AddFromBackendInterface tasks),\nreset / remove queued jobs, and terminate workers. Accidental exposure\nis operational damage waiting to happen.\n\nMirror the captcha plugin's \"fail closed\" pattern: the host app MUST\nconfigure Queue.adminAccess as a Closure that\n[…]\nan\n example role-based gate.\n\nBackwards-incompatible: existing installs that just relied on host\nAppController gating will 403 until they add a Closure. Migration is\none line in config/bootstrap.php.", "is_bot": false, "headline": "Default-deny admin access via Queue.adminAccess Closure (#481)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-30T13:43:24Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "72e35b0213067db0819da22ca5dd33a135158c8f", "body": "* Sweep stale queue_processes rows on worker startup\n\nWorkers that die without graceful shutdown (SIGKILL, OOM, container\nrestart, anything that bypasses the SIGTERM handler) leave their\nqueue_processes row behind with terminate=0. Without intervention these\nghost rows accumulate and count toward Qu\n[…]\nat.\n\nRemoving both keeps the cleanup discipline clear (one canonical sweep\npoint per worker lifecycle) and saves a couple of needless DELETE\nqueries per worker. No behaviour change for the happy path.", "is_bot": false, "headline": "Sweep stale queue_processes rows on worker startup (#480)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-30T11:23:28Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "0e8126f22e31f54d6aa1d41afa86cfeffe32d2cc", "body": null, "is_bot": false, "headline": "Adjust CS badge", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-04-28T16:58:43Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "39cf2e7a79ebea4b6aef6d8741a0865f916d4d38", "body": "* Add Queue.workerLifetimeJitter config to stagger worker shutdowns\n\nEach worker picks a random offset in [0, workerLifetimeJitter] at startup\nand adds it to its effective lifetime. Prevents thundering-herd restarts\nwhen a fleet of workers (e.g. ECS/Kubernetes tasks) is spawned at the\nsame instant a\n[…]\nainst a legacy CakePHP 2.x fork) by\nRommel Penaflor (@xrompdev) in #475; ported to the modern processor.\n\n* Add workerLifetimeJitter to app.example.php\n\n* Align worker lifetime jitter with PHP timeout", "is_bot": false, "headline": "Add Queue.workerLifetimeJitter to stagger worker shutdowns (#476)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-27T13:13:33Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "0294a066343ea79dd2c9daabd5688ee28b094de2", "body": "* Move mobile-nav background to CSS class (strict-CSP)\n\nDrops the inline `style=\"background: linear-gradient(...)\"` attribute on the\nmobile offcanvas in favour of a `.queue-mobile-nav-bg` class that reuses the\nexisting `--queue-sidebar-bg` custom property. Removes the\n`style-src 'unsafe-inline'` req\n[…]\n's existing nonced `\u003cscript>`\n reads them and assigns to `el.style` (JS-driven style mutation is not\n subject to `style-src 'unsafe-inline'`).\n\nTemplates now contain zero inline `style=` attributes.", "is_bot": false, "headline": "Move mobile-nav background to CSS class (strict-CSP) (#479)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-26T22:29:25Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "ef13c13820f29c7a2cd1a52d2a3132f1a019a108", "body": "- Add nonce attribute to inline \u003cscript> blocks (layout, stats chart)\n- Replace postLink+confirm with postButton+data-confirm-message across\n all admin templates to eliminate inline onclick handlers that CSP\n blocks without unsafe-inline / unsafe-hashes\n- JS delegate in the layout already intercep\n[…]\nnts and replicates the confirmation UX\n\nThis lets the admin UI work under a strict script-src CSP\n(e.g. \"script-src 'self' 'nonce-X' 'unsafe-eval'\") without needing\n'unsafe-inline' or 'unsafe-hashes'.", "is_bot": false, "headline": "Refactor admin UI to be CSP-compatible (#477)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-22T23:10:45Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "bd2ccf02e194a688f6007225b21bd6146bb8ff3c", "body": "AddInterface::add() returns void and may silently skip queuing a job\nwhen required configuration is missing — most notably EmailTask, which\ndoes nothing when Config.adminEmail is not set.\n\nPreviously the controller showed a green success flash regardless,\nmaking it look like the admin UI had queued \n[…]\n't.\n\nNow we count QueuedJobs before/after invoking the task. If the count\ndid not increase, we show an error flash pointing the operator at the\nlikely config gap, instead of falsely reporting success.", "is_bot": false, "headline": "Fix silent no-op in Queue::addJob when task does not queue a job (#478)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-22T23:10:32Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "54105129a38ced1ce5f0b4ac601a35a00b42ebd0", "body": "… (#474)\n\n* Fix EmailTask undefined-method errors for serialized Message settings\n\nKeys coming from Message::__serialize()/jsonSerialize (htmlMessage,\ntextMessage, appCharset) don't map to set\u003cProp>() methods on Mailer or\nMessage, so passing them via queued JSON payloads failed with\n'Call to undefin\n[…]\nblem as the address maps: string keys would otherwise be\ninterpreted as named arguments when the generic loop spreads them into\n`setHeaders()`. Forward the map as a single positional argument instead.", "is_bot": false, "headline": "Fix EmailTask undefined-method errors for serialized Message settings…", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-17T18:05:18Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "6eda87a2320430787169c0b90b02d76bba817a31", "body": "…472)\n\n* Fix EmailTask named-parameter error for associative address arrays\n\nPHP 8 treats string keys in the argument array of call_user_func_array()\nas named parameters, so queued payloads with an associative email => name\nmap for to/from/cc/bcc/replyTo would fail with 'Unknown named parameter'.\n\nRoute address setters through a helper that unpacks list-shaped values\npositionally (preserving the prior behavior) and forwards associative\nmaps as a single positional argument.\n\n* Fix CS", "is_bot": false, "headline": "Fix EmailTask named-parameter error for associative address arrays (#…", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-04-17T14:00:30Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "a534d1f8e8d6478dc374025c0bba59a48be9876f", "body": null, "is_bot": false, "headline": "Fix pre element overflow in standalone layout", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-04-02T14:53:55Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "08ba64b9b3f97460cef364a04ce3b3c47adb2d28", "body": "Sets explicit Bootstrap 5 templates to avoid app/Tools templates\naffecting the standalone admin layout.", "is_bot": false, "headline": "Make pagination element fully standalone.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-28T14:12:15Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "5cea4b0241cc0cc29670ebfd2fc3348f9c53325f", "body": "Extract flash rendering logic into flash/flash.php element for cleaner\nlayout code and easier maintenance.", "is_bot": false, "headline": "Refactor flash rendering to use dedicated element.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-28T13:45:29Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "2a37a1145bd7ce55814a0f62f6ae8346ab1332c9", "body": null, "is_bot": false, "headline": "Fix datetime fields.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-28T13:38:28Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "58c2bf6ca258839195e5407b0afb07b1f2c24157", "body": null, "is_bot": false, "headline": "Fix datetime fields.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-28T13:24:12Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "697206e83ee638c69ddc05f2e5795a0366c47261", "body": "When invalid JSON is submitted via the data edit form, the\nJsonableBehavior threw a TypeError because json_decode returned null\nbut the return type was array.\n\nChanges:\n- Update _fromJson() to throw InvalidArgumentException with a\n descriptive error message instead of TypeError\n- Catch the exceptio\n[…]\nlid input so they can fix it\n- Add data_string virtual property annotation to QueuedJob entity\n- Add test for invalid JSON handling\n- Fix PHPStan errors: handle nullable description() in example tasks", "is_bot": false, "headline": "Fix TypeError when editing queued job with invalid JSON payload (#468)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-03-28T12:57:06Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "ba99af3b86fbb258e45950d79b201c5bd7b9cf59", "body": null, "is_bot": false, "headline": "Fix PHPStan errors: add type annotations for list query results (#467)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-03-19T20:47:46Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "6ab3291329a62e91f22b173dfa75cfbe9dc70e86", "body": null, "is_bot": false, "headline": "Fix PHPStan errors for nullable description passed to io->out()", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T23:03:14Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "4de7db1a840a109a67bcae4fb9a8d7cf6f58a05a", "body": null, "is_bot": false, "headline": "Add descr.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T22:52:36Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "1d41261d6067f91a7ccb54dbebcf82a61d9bcc2d", "body": null, "is_bot": false, "headline": "Add 'standalone-ui' to composer.json keywords", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-03-18T20:49:14Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "c63f624f7a5e1b51830ea1fb891c9f1a6878b488", "body": "* Add multi-connection support for multiple databases\n\nAdd support for running queue workers and admin interface across\nmultiple database connections (e.g., primary and secondary databases).\n\nFeatures:\n- Configure connections via Queue.connections array in config\n- Connection switcher dropdown in ad\n[…]\nion to persist connection choice across requests\n- Query param ?connection=xxx sets session value\n- Connection switcher redirects to dashboard to avoid 404s\n- Fix CS issue with RuntimeException import", "is_bot": false, "headline": "Add multi-connection support for multiple databases (#465)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-03-18T17:52:40Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "9f240b75ecc795c8f20df0b60bfde19898611058", "body": null, "is_bot": false, "headline": "Fix Icon helper loading - only load if Templating plugin available", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T17:05:12Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "3eb9ec48861b7be437658b65473c1e4c11d96306", "body": null, "is_bot": false, "headline": "Add fallbacks for Tools/Shim helpers when plugins not loaded", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T17:03:01Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "8781022aa908e0e1ee9490abcec358fc45ad0e0b", "body": null, "is_bot": false, "headline": "Add pagination element fallback when Tools plugin is not loaded", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T16:58:10Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "43291e8fb11e93f086e02f55250d71129d85bcfd", "body": null, "is_bot": false, "headline": "Add standalone option to app.example.php", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T16:44:35Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "6639108fbfee7d23b5c5e821496b013c84e4f17f", "body": null, "is_bot": false, "headline": "Document Queue.standalone config option", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T16:42:11Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "54097a4ea4632e7d07b921b52e95824b2e8913c9", "body": "By default, QueueAppController extends App\\Controller\\AppController\nto inherit app authentication, components, and configuration (BC).\n\nSet `Queue.standalone` to `true` for an isolated admin that doesn't\ndepend on the host app's AppController setup.", "is_bot": false, "headline": "Restore AppController extension with standalone opt-in (#464)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-03-18T16:40:53Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "241f31d400c7521bebc7d9dd3f775e084d663ccb", "body": "* Add heatmap analytics for job activity visualization\n\n- Add getHeatmapData() method to QueuedJobsTable for aggregating jobs by day/hour\n- Add heatmap action to QueuedJobsController with filters for metric, days, and job type\n- Add heatmapColor() helper method for color gradient\n- Create heatmap te\n[…]\nd in layout)\n- Use expr() instead of deprecated newExpr()\n- Add comprehensive tests for getHeatmapData() method\n- Add tests for heatmapColor() helper method\n- Add controller tests for heatmap() action", "is_bot": false, "headline": "Add heatmap analytics for job activity visualization (#463)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-03-18T05:05:50Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "320c07b3183a6dedc99c312dcf38f5a255181011", "body": "- Add isRestarted() helper method to detect jobs that were manually reset\n (have attempts but no failure_message)\n- Show \"Restarted\" badge (info/cyan) in all templates between Requeued and Running\n- Previously these jobs incorrectly showed as \"Running\"\n- Add comprehensive tests for isRestarted()", "is_bot": false, "headline": "Add Restarted status for manually reset jobs", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-18T04:31:25Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "0b50781e66dd6f375a0a5db2651acb1df7c562f5", "body": "* Add modern isolated admin dashboard with Bootstrap 5\n\n- Create QueueAppController as isolated base for admin controllers\n- Add queue.php layout with Bootstrap 5.3.3 and Font Awesome 6.7.2 via CDN\n- Add reusable elements: sidebar, stats_card, status_badge, flash messages\n- Update admin templates wi\n[…]\nove dashboard stats display\n\n- Reorder stats cards: Scheduled → Pending → Running → Failed\n (follows job lifecycle chronologically)\n- Add safeguard against negative pendingJobs count with max(0, ...)", "is_bot": false, "headline": "Add modern isolated admin dashboard with Bootstrap 5 (#461)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-03-18T04:14:08Z", "body_truncated": true, "is_coding_agent": true }, { "oid": "1baab99eeb73f77553bce89bbdf0e293cae01a2e", "body": "The duration() method is specific to the Tools TimeHelper. Applications\nnot using the Tools plugin would get a fatal error. This adds a\nmethod_exists check with a fallback to PHP's DateInterval::format().\n\nPort of #462 to master.", "is_bot": false, "headline": "Add runtime fallback for Tools Time->duration() method", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-17T21:51:39Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "32de0da594563ffd7ebd31d42ae80cba8b4e3796", "body": null, "is_bot": false, "headline": "Fix CS", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-17T19:57:52Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "e60221ff99cdf3a202e9d9c56776200adf35391e", "body": "JsonableBehavior now uses Queue\\Database\\Type\\ArrayType instead of\nShim\\Database\\Type\\ArrayType, removing the undocumented dependency\non dereuromark/cakephp-shim.", "is_bot": false, "headline": "Add local ArrayType to remove hidden Shim plugin dependency", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-17T19:53:28Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "f58ec4d15c378e33b716cf1c17b92288c7e65796", "body": "- relLengthOfTime() falls back to timeAgoInWords() from CakePHP core\n- Format->ok() calls now use Queue.ok element which has built-in fallback", "is_bot": false, "headline": "Add runtime fallbacks for Tools plugin dependencies in admin templates", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-17T19:49:19Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "465fa28eb73022edad5378a0d56281329735824f", "body": null, "is_bot": false, "headline": "Enable phpcs cache for faster subsequent runs", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-15T15:35:52Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "8dc1db72045b6a563b4ebe9af5dbab50072773f8", "body": null, "is_bot": false, "headline": "Improve composer.json metadata", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-13T14:51:21Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "b4ad201c5705d06f12efa1b0cdb0cba66aff07bd", "body": null, "is_bot": false, "headline": "Add admin-panel keyword", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-03-13T14:43:43Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "0a52e9cc962f3325da79106670a92cd62e352453", "body": null, "is_bot": false, "headline": "Fix PHPStan type errors with entity annotations", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-02-28T00:02:48Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "474b5622a107772921159b0611d31c822ee41479", "body": null, "is_bot": false, "headline": "Allow PHPUnit 13", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-02-06T23:54:07Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "fab07eea73cd9e5744c7913b898e32ec8795989c", "body": "- cakephp-tools ^3.12.0: fixes Message::addAttachment() signature\n incompatibility with CakePHP 5.3\n- friendsofcake/search ^7.7.0: fixes searchManager/isSearch/searchParams\n behavior call deprecations on CakePHP 5.3", "is_bot": false, "headline": "Bump minimum cakephp-tools and search plugin versions (#460)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-31T04:41:29Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "7d7da44c7e5b0228bf936efda7829d10367b7745", "body": null, "is_bot": false, "headline": "Upgrade migrations dev dep", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-01-31T04:14:55Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "798f9afb1f1247e3175a4f8018c0372416e096b0", "body": "* Auto-detect captureOutput based on output column existence\n\nInstead of requiring explicit `Queue.captureOutput` configuration,\nthe Processor now auto-detects whether to capture output by checking\nif the `output` column exists on the `queued_jobs` table.\n\nExplicit config still takes precedence. The\n[…]\ntest\n\nWrap getSchema()->hasColumn() in try/catch to handle mock tables in tests\n(and any edge case in production). Suppress E_USER_DEPRECATED in\nInfoCommandTest that deliberately uses old config keys.", "is_bot": false, "headline": "Auto-detect captureOutput based on output column existence (#459)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-29T17:56:25Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "b8b9e5d6cb4f99170c0547457f706f124cd25f40", "body": "* Add optional output capture for queue jobs\n\nIntroduce a new `Queue.captureOutput` config option that, when enabled,\ncaptures task stdout/stderr output and stores it in a new `output` text\ncolumn on the `queued_jobs` table. This allows reviewing job output in\nthe admin panel after execution, which \n[…]\nemory\n\nWorkerCommand.php:\n- Fix defaultName() collision with JobCommand (was 'queue job',\n now 'queue worker')\n\nQueueProcessesTable.php:\n- Sanitize PID/signal as integers in terminateProcess() exec()", "is_bot": false, "headline": "Add optional output capture for queue jobs (#458) - fix edge case issues", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-29T10:37:06Z", "body_truncated": true, "is_coding_agent": false }, { "oid": "d8fd7254593dbdacede4952e1197ab3cff8b3de7", "body": null, "is_bot": false, "headline": "Update brick/varexporter version requirement", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-28T05:12:47Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "f8a4435f12ea4c6ece94579dfeb51520242cc712", "body": null, "is_bot": false, "headline": "Raise PHP Min Version", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-01-28T05:02:40Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "1418afb3860c5b2f153aa57005e98c41187b6aee", "body": "Add generic events for queue job lifecycle:\n- Queue.Job.created: when job is added to queue\n- Queue.Job.started: when job processing starts\n- Queue.Job.completed: when job completes successfully\n- Queue.Job.failed: when job fails\n\nAdd CakeSentryEventBridge listener that bridges these events to\nCakeSentry.Queue.* events for lordsimal/cakephp-sentry integration.\nUsers can enable it with: EventManager::instance()->on(new CakeSentryEventBridge())", "is_bot": false, "headline": "Add Queue.Job.* lifecycle events with optional Sentry bridge. (#453)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-11T03:10:38Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "3800ca14b53ee82f13dba8ee08aedbe970f44e30", "body": "varexporter v7", "is_bot": false, "headline": "Merge pull request #457 from dereuromark/fix-docs-syntax", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-07T00:42:03Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "726c675e53f9c2c4bba2165948b9fc0415657947", "body": null, "is_bot": false, "headline": "varexporter v7", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-01-07T00:35:20Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "2e46f97519a39848a7c2519a6b51118fbe6dff20", "body": "Fix missing semicolons in configuration.md examples", "is_bot": false, "headline": "Merge pull request #456 from dereuromark/fix-docs-syntax", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-04T05:01:27Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "31e29f7d9c84ed84a10e8d90b30bccaaff807be0", "body": null, "is_bot": false, "headline": "Fix missing semicolons in configuration.md examples", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-01-04T04:59:21Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "e1c944f36cc9f255b3a0c4910e8c9e59de454a87", "body": "…time\n\nAdd real-time progress documentation with Mercure/FrankenPHP", "is_bot": false, "headline": "Merge pull request #451 from dereuromark/docs/frankenphp-mercure-real…", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-04T02:32:16Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "6fccb5b13f37bd14ad4af0571d934a3d0aa1135c", "body": "Add getDescription() to all commands", "is_bot": false, "headline": "Merge pull request #455 from dereuromark/add-command-descriptions", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-04T02:30:41Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "514ee88233de0f2ded727c513ce5a560d23a9ef7", "body": null, "is_bot": false, "headline": "Add getDescription() to all commands", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-01-04T02:19:54Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "b74d00be179ab07d0373553ec162a98320b40a1e", "body": "Make Icon configuration optional with text fallback", "is_bot": false, "headline": "Merge pull request #454 from dereuromark/feature/optional-icon-config", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2026-01-01T16:54:32Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "99731ec588af6be75106336bbe934707ede71f85", "body": "- Conditionally load Icon helper only when Icon.sets is configured\n- Add icon element with text fallback for when icons are not configured\n- Update templates to use the icon element\n\nThe backend UI now works without Icon.sets configured, showing text\nlabels like [View], [Edit], [Del] instead of icons.", "is_bot": false, "headline": "Make Icon configuration optional with text fallback", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2026-01-01T16:48:13Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "4bd3f8bb801e32fde5ba5d8d1f2eb4072c4ad9d0", "body": "Documents the PID 1 issue when running queue workers in Docker containers\nand provides solutions using stable hostnames and startup cleanup commands.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)", "is_bot": false, "headline": "Add Docker/docker-compose deployment documentation", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2025-12-20T01:04:17Z", "body_truncated": false, "is_coding_agent": true }, { "oid": "e447805c1e945c58c03d3d4d02e14acb01c67e61", "body": "Instead of warning when a task timeout exceeds the requeue timeout,\nautomatically cap it to prevent duplicate execution.", "is_bot": false, "headline": "Auto-cap task timeout to defaultRequeueTimeout.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2025-12-19T22:17:13Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "18ac9872d9ff331513de2109ed49e76cdb6b503e", "body": null, "is_bot": false, "headline": "Allow config overwrite on vendor tasks.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2025-12-19T22:12:27Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "ef5ac978c5adc028a2794cc831902d1dd7ec4c15", "body": "Documents how to display live queue job progress in the browser using:\n- Mercure protocol with Server-Sent Events\n- FrankenPHP with built-in Mercure hub\n- Example queue task with progress publishing\n- Controller and template examples\n- Production deployment with systemd/supervisor\n- Worker scaling configuration", "is_bot": false, "headline": "Add real-time progress documentation with Mercure/FrankenPHP", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2025-12-19T18:51:00Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "ce69d1fff33dc784bc5c43ee83c199def0489f62", "body": null, "is_bot": false, "headline": "Add readable config ints.", "author_name": "mscherer", "author_login": "dereuromark", "committed_at": "2025-12-11T19:55:01Z", "body_truncated": false, "is_coding_agent": false }, { "oid": "486dce3ddf5026d2c2f75f951d522f9cc6d7d14e", "body": "Support both the legacy queue_phinxlog table (Migrations plugin 4.x)\nand the new cake_migrations table (Migrations plugin 5.x).\n\nThe migration now checks if cake_migrations exists and uses it with\nthe plugin column filter, otherwise falls back to queue_phinxlog.", "is_bot": false, "headline": "Add support for unified cake_migrations table (#450)", "author_name": "Mark Scherer", "author_login": "dereuromark", "committed_at": "2025-12-11T19:49:05Z", "body_truncated": false, "is_coding_agent": false } ], "releases_count": 100, "commits_last_year": 145, "latest_release_at": "2026-06-06T20:11:41Z", "latest_release_tag": "8.15.1", "releases_from_tags": false, "days_since_last_push": 0, "active_weeks_last_year": 32, "days_since_latest_release": 56, "mean_days_between_releases": 9 }, "community": { "has_readme": true, "has_license": true, "has_description": true, "has_contributing": true, "health_percentage": 57, "has_issue_template": false, "has_code_of_conduct": false, "has_pull_request_template": false }, "ecosystem": { "packages": [ { "name": "dereuromark/cakephp-queue", "exists": true, "license": "MIT", "keywords": [ "queue", "cakephp", "background", "async", "jobs", "admin-panel", "workers", "deferred tasks", "standalone-ui" ], "ecosystem": "packagist", "matches_repo": true, "registry_url": "https://packagist.org/packages/dereuromark/cakephp-queue", "is_deprecated": false, "latest_version": "8.15.1", "repository_url": "https://github.com/dereuromark/cakephp-queue", "versions_count": 136, "total_downloads": 997463, "dependents_count": 16, "deprecation_note": null, "maintainers_count": null, "monthly_downloads": 38799, "first_published_at": null, "latest_published_at": "2026-06-06T16:09:37Z", "latest_version_yanked": null, "days_since_latest_publish": 56 } ] }, "popularity": { "forks": 138, "stars": 308, "watchers": 19, "fork_history": { "days": [ { "date": "2013-01-25", "count": 1 }, { "date": "2013-07-05", "count": 1 }, { "date": "2013-12-27", "count": 1 }, { "date": "2014-02-13", "count": 1 }, { "date": "2014-03-19", "count": 1 }, { "date": "2014-04-16", "count": 1 }, { "date": "2014-06-22", "count": 1 }, { "date": "2014-07-16", "count": 1 }, { "date": "2014-08-05", "count": 1 }, { "date": "2014-09-02", "count": 1 }, { "date": "2014-12-11", "count": 1 }, { "date": "2015-02-16", "count": 1 }, { "date": "2015-02-17", "count": 1 }, { "date": "2015-02-19", "count": 1 }, { "date": "2015-02-23", "count": 1 }, { "date": "2015-03-16", "count": 1 }, { "date": "2015-05-10", "count": 1 }, { "date": "2015-06-15", "count": 1 }, { "date": "2015-07-08", "count": 1 }, { "date": "2015-07-31", "count": 1 }, { "date": "2015-08-04", "count": 1 }, { "date": "2015-08-07", "count": 1 }, { "date": "2015-08-12", "count": 1 }, { "date": "2015-08-16", "count": 1 }, { "date": "2015-08-22", "count": 1 }, { "date": "2015-11-18", "count": 1 }, { "date": "2015-12-28", "count": 1 }, { "date": "2016-01-05", "count": 1 }, { "date": "2016-01-07", "count": 1 }, { "date": "2016-01-22", "count": 1 }, { "date": "2016-01-24", "count": 1 }, { "date": "2016-01-25", "count": 1 }, { "date": "2016-02-18", "count": 1 }, { "date": "2016-03-12", "count": 1 }, { "date": "2016-03-17", "count": 1 }, { "date": "2016-04-07", "count": 1 }, { "date": "2016-04-20", "count": 1 }, { "date": "2016-04-27", "count": 1 }, { "date": "2016-04-30", "count": 1 }, { "date": "2016-06-17", "count": 1 }, { "date": "2016-07-08", "count": 1 }, { "date": "2016-08-05", "count": 1 }, { "date": "2016-08-12", "count": 1 }, { "date": "2016-08-17", "count": 1 }, { "date": "2016-09-02", "count": 1 }, { "date": "2016-10-14", "count": 1 }, { "date": "2016-10-22", "count": 1 }, { "date": "2016-11-16", "count": 1 }, { "date": "2016-12-01", "count": 1 }, { "date": "2016-12-28", "count": 1 }, { "date": "2017-01-09", "count": 1 }, { "date": "2017-03-15", "count": 1 }, { "date": "2017-03-20", "count": 1 }, { "date": "2017-04-10", "count": 1 }, { "date": "2017-04-26", "count": 1 }, { "date": "2017-04-27", "count": 1 }, { "date": "2017-05-29", "count": 1 }, { "date": "2017-06-01", "count": 1 }, { "date": "2017-06-30", "count": 1 }, { "date": "2017-07-03", "count": 1 }, { "date": "2017-07-10", "count": 1 }, { "date": "2017-10-04", "count": 1 }, { "date": "2017-10-20", "count": 1 }, { "date": "2018-03-01", "count": 1 }, { "date": "2018-03-14", "count": 1 }, { "date": "2018-04-30", "count": 1 }, { "date": "2018-05-06", "count": 1 }, { "date": "2018-06-19", "count": 1 }, { "date": "2018-08-10", "count": 1 }, { "date": "2018-09-07", "count": 1 }, { "date": "2018-11-14", "count": 2 }, { "date": "2018-11-29", "count": 1 }, { "date": "2018-12-28", "count": 1 }, { "date": "2019-01-15", "count": 1 }, { "date": "2019-02-09", "count": 1 }, { "date": "2019-03-04", "count": 1 }, { "date": "2019-03-15", "count": 1 }, { "date": "2019-04-22", "count": 1 }, { "date": "2019-05-10", "count": 1 }, { "date": "2019-05-12", "count": 1 }, { "date": "2019-06-25", "count": 1 }, { "date": "2019-07-11", "count": 1 }, { "date": "2019-08-01", "count": 1 }, { "date": "2019-08-13", "count": 1 }, { "date": "2019-09-09", "count": 1 }, { "date": "2019-12-09", "count": 1 }, { "date": "2019-12-12", "count": 1 }, { "date": "2019-12-29", "count": 1 }, { "date": "2020-01-03", "count": 1 }, { "date": "2020-01-23", "count": 1 }, { "date": "2020-06-08", "count": 1 }, { "date": "2020-06-22", "count": 1 }, { "date": "2020-09-08", "count": 1 }, { "date": "2020-10-21", "count": 1 }, { "date": "2021-01-26", "count": 1 }, { "date": "2021-05-24", "count": 1 }, { "date": "2021-06-30", "count": 1 }, { "date": "2021-07-07", "count": 1 }, { "date": "2021-07-14", "count": 1 }, { "date": "2021-10-10", "count": 1 }, { "date": "2021-12-22", "count": 1 }, { "date": "2022-01-02", "count": 1 }, { "date": "2022-01-12", "count": 1 }, { "date": "2022-03-16", "count": 1 }, { "date": "2022-03-21", "count": 1 }, { "date": "2022-04-15", "count": 1 }, { "date": "2022-05-20", "count": 1 }, { "date": "2022-08-18", "count": 1 }, { "date": "2022-08-19", "count": 1 }, { "date": "2022-08-22", "count": 1 }, { "date": "2022-10-18", "count": 1 }, { "date": "2022-10-25", "count": 1 }, { "date": "2022-11-02", "count": 1 }, { "date": "2022-12-18", "count": 1 }, { "date": "2023-01-03", "count": 1 }, { "date": "2023-01-09", "count": 1 }, { "date": "2023-02-09", "count": 1 }, { "date": "2023-02-14", "count": 1 }, { "date": "2023-02-23", "count": 1 }, { "date": "2023-04-03", "count": 1 }, { "date": "2023-07-20", "count": 1 }, { "date": "2023-09-13", "count": 1 }, { "date": "2024-05-06", "count": 1 }, { "date": "2024-06-21", "count": 1 }, { "date": "2024-09-19", "count": 1 }, { "date": "2024-10-24", "count": 1 }, { "date": "2025-03-18", "count": 1 }, { "date": "2025-05-07", "count": 1 }, { "date": "2025-08-23", "count": 1 }, { "date": "2025-11-22", "count": 1 }, { "date": "2026-03-31", "count": 1 }, { "date": "2026-06-14", "count": 1 }, { "date": "2026-07-15", "count": 1 } ], "complete": true, "collected": 134, "total_forks": 138 }, "star_history": 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": 37884, "source_files_sampled": 161, "oversized_source_files": 0, "agent_instruction_files": [], "agent_instruction_max_bytes": null }, "dependencies": { "manifests": [ "composer.json", "docs/package.json" ], "advisories": { "error": null, "scope": "repository_graph", "source": "osv", "findings": [ { "name": "vite", "direct": false, "version": "5.4.21", "severity": "high", "ecosystem": "npm", "cvss_score": 7.5, "advisory_ids": [ "GHSA-4w7w-66w2-5vf9", "GHSA-fx2h-pf6j-xcff", "GHSA-v6wh-96g9-6wx3" ], "fixed_version": "8.0.16", "advisory_count": 3, "oldest_advisory_days": 117 }, { "name": "esbuild", "direct": false, "version": "0.21.5", "severity": "moderate", "ecosystem": "npm", "cvss_score": 5.3, "advisory_ids": [ "GHSA-67mh-4wv8-2f99" ], "fixed_version": "0.25.0", "advisory_count": 1, "oldest_advisory_days": 537 } ], "collected": true, "malicious": [], "truncated": false, "by_severity": { "high": 1, "moderate": 1 }, "advisory_count": 4, "affected_count": 2, "assessed_count": 173, "malicious_count": 0, "assessed_package": null, "unassessed_count": 13, "direct_affected_count": 0 }, "ecosystems": [ "npm", "packagist" ], "dependencies": [ { "name": "brick/varexporter", "manifest": "composer.json", "ecosystem": "packagist", "version_constraint": "^0.5.0 || ^0.6.0 || ^0.7.0" }, { "name": "cakephp/cakephp", "manifest": "composer.json", "ecosystem": "packagist", "version_constraint": "^5.1.1" } ], "all_dependencies": { "error": null, "source": "github-sbom", "packages": [ { "name": "brick/varexporter", "direct": true, "version": null, "ecosystem": "packagist" }, { "name": "cakephp/cakephp", "direct": true, "version": null, "ecosystem": "packagist" }, { "name": "@algolia/abtesting", "direct": false, "version": "1.18.0", "ecosystem": "npm" }, { "name": "@algolia/autocomplete-core", "direct": false, "version": "1.17.7", "ecosystem": "npm" }, { "name": "@algolia/autocomplete-plugin-algolia-insights", "direct": false, "version": "1.17.7", "ecosystem": "npm" }, { "name": "@algolia/autocomplete-preset-algolia", "direct": false, "version": "1.17.7", "ecosystem": "npm" }, { "name": "@algolia/autocomplete-shared", "direct": false, "version": "1.17.7", "ecosystem": "npm" }, { "name": "@algolia/client-abtesting", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/client-analytics", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/client-common", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/client-insights", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/client-personalization", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/client-query-suggestions", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/client-search", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/ingestion", "direct": false, "version": "1.52.0", "ecosystem": "npm" }, { "name": "@algolia/monitoring", "direct": false, "version": "1.52.0", "ecosystem": "npm" }, { "name": "@algolia/recommend", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/requester-browser-xhr", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/requester-fetch", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@algolia/requester-node-http", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "@babel/helper-string-parser", "direct": false, "version": "7.27.1", "ecosystem": "npm" }, { "name": "@babel/helper-validator-identifier", "direct": false, "version": "7.28.5", "ecosystem": "npm" }, { "name": "@babel/parser", "direct": false, "version": "7.29.3", "ecosystem": "npm" }, { "name": "@babel/types", "direct": false, "version": "7.29.0", "ecosystem": "npm" }, { "name": "@docsearch/css", "direct": false, "version": "3.8.2", "ecosystem": "npm" }, { "name": "@docsearch/js", "direct": false, "version": "3.8.2", "ecosystem": "npm" }, { "name": "@docsearch/react", "direct": false, "version": "3.8.2", "ecosystem": "npm" }, { "name": "@esbuild/aix-ppc64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/android-arm", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/android-arm64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/android-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/darwin-arm64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/darwin-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/freebsd-arm64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/freebsd-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-arm", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-arm64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-ia32", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-loong64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-mips64el", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-ppc64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-riscv64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-s390x", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/linux-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/netbsd-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/openbsd-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/sunos-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/win32-arm64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/win32-ia32", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@esbuild/win32-x64", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "@iconify-json/simple-icons", "direct": false, "version": "1.2.80", "ecosystem": "npm" }, { "name": "@iconify/types", "direct": false, "version": "2.0.0", "ecosystem": "npm" }, { "name": "@jridgewell/sourcemap-codec", "direct": false, "version": "1.5.5", "ecosystem": "npm" }, { "name": "@rollup/rollup-android-arm-eabi", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-android-arm64", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-darwin-arm64", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-darwin-x64", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-freebsd-arm64", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-freebsd-x64", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-arm-gnueabihf", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-arm-musleabihf", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-arm64-gnu", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-arm64-musl", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-loong64-gnu", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-loong64-musl", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-ppc64-gnu", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-ppc64-musl", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-riscv64-gnu", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-riscv64-musl", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-s390x-gnu", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-x64-gnu", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-linux-x64-musl", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-openbsd-x64", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-openharmony-arm64", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-win32-arm64-msvc", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-win32-ia32-msvc", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-win32-x64-gnu", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@rollup/rollup-win32-x64-msvc", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "@shikijs/core", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "@shikijs/engine-javascript", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "@shikijs/engine-oniguruma", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "@shikijs/langs", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "@shikijs/themes", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "@shikijs/transformers", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "@shikijs/types", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "@shikijs/vscode-textmate", "direct": false, "version": "10.0.2", "ecosystem": "npm" }, { "name": "@types/estree", "direct": false, "version": "1.0.8", "ecosystem": "npm" }, { "name": "@types/hast", "direct": false, "version": "3.0.4", "ecosystem": "npm" }, { "name": "@types/linkify-it", "direct": false, "version": "5.0.0", "ecosystem": "npm" }, { "name": "@types/markdown-it", "direct": false, "version": "14.1.2", "ecosystem": "npm" }, { "name": "@types/mdast", "direct": false, "version": "4.0.4", "ecosystem": "npm" }, { "name": "@types/mdurl", "direct": false, "version": "2.0.0", "ecosystem": "npm" }, { "name": "@types/unist", "direct": false, "version": "3.0.3", "ecosystem": "npm" }, { "name": "@types/web-bluetooth", "direct": false, "version": "0.0.21", "ecosystem": "npm" }, { "name": "@ungap/structured-clone", "direct": false, "version": "1.3.0", "ecosystem": "npm" }, { "name": "@vitejs/plugin-vue", "direct": false, "version": "5.2.4", "ecosystem": "npm" }, { "name": "@vue/compiler-core", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/compiler-dom", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/compiler-sfc", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/compiler-ssr", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/devtools-api", "direct": false, "version": "7.7.9", "ecosystem": "npm" }, { "name": "@vue/devtools-kit", "direct": false, "version": "7.7.9", "ecosystem": "npm" }, { "name": "@vue/devtools-shared", "direct": false, "version": "7.7.9", "ecosystem": "npm" }, { "name": "@vue/reactivity", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/runtime-core", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/runtime-dom", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/server-renderer", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vue/shared", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "@vueuse/core", "direct": false, "version": "12.8.2", "ecosystem": "npm" }, { "name": "@vueuse/integrations", "direct": false, "version": "12.8.2", "ecosystem": "npm" }, { "name": "@vueuse/metadata", "direct": false, "version": "12.8.2", "ecosystem": "npm" }, { "name": "@vueuse/shared", "direct": false, "version": "12.8.2", "ecosystem": "npm" }, { "name": "algoliasearch", "direct": false, "version": "5.52.0", "ecosystem": "npm" }, { "name": "birpc", "direct": false, "version": "2.9.0", "ecosystem": "npm" }, { "name": "ccount", "direct": false, "version": "2.0.1", "ecosystem": "npm" }, { "name": "character-entities-html4", "direct": false, "version": "2.1.0", "ecosystem": "npm" }, { "name": "character-entities-legacy", "direct": false, "version": "3.0.0", "ecosystem": "npm" }, { "name": "comma-separated-tokens", "direct": false, "version": "2.0.3", "ecosystem": "npm" }, { "name": "copy-anything", "direct": false, "version": "4.0.5", "ecosystem": "npm" }, { "name": "csstype", "direct": false, "version": "3.2.3", "ecosystem": "npm" }, { "name": "dequal", "direct": false, "version": "2.0.3", "ecosystem": "npm" }, { "name": "devlop", "direct": false, "version": "1.1.0", "ecosystem": "npm" }, { "name": "emoji-regex-xs", "direct": false, "version": "1.0.0", "ecosystem": "npm" }, { "name": "entities", "direct": false, "version": "7.0.1", "ecosystem": "npm" }, { "name": "esbuild", "direct": false, "version": "0.21.5", "ecosystem": "npm" }, { "name": "estree-walker", "direct": false, "version": "2.0.2", "ecosystem": "npm" }, { "name": "focus-trap", "direct": false, "version": "7.8.0", "ecosystem": "npm" }, { "name": "fsevents", "direct": false, "version": "2.3.3", "ecosystem": "npm" }, { "name": "hast-util-to-html", "direct": false, "version": "9.0.5", "ecosystem": "npm" }, { "name": "hast-util-whitespace", "direct": false, "version": "3.0.0", "ecosystem": "npm" }, { "name": "hookable", "direct": false, "version": "5.5.3", "ecosystem": "npm" }, { "name": "html-void-elements", "direct": false, "version": "3.0.0", "ecosystem": "npm" }, { "name": "is-what", "direct": false, "version": "5.5.0", "ecosystem": "npm" }, { "name": "magic-string", "direct": false, "version": "0.30.21", "ecosystem": "npm" }, { "name": "mark.js", "direct": false, "version": "8.11.1", "ecosystem": "npm" }, { "name": "mdast-util-to-hast", "direct": false, "version": "13.2.1", "ecosystem": "npm" }, { "name": "micromark-util-character", "direct": false, "version": "2.1.1", "ecosystem": "npm" }, { "name": "micromark-util-encode", "direct": false, "version": "2.0.1", "ecosystem": "npm" }, { "name": "micromark-util-sanitize-uri", "direct": false, "version": "2.0.1", "ecosystem": "npm" }, { "name": "micromark-util-symbol", "direct": false, "version": "2.0.1", "ecosystem": "npm" }, { "name": "micromark-util-types", "direct": false, "version": "2.0.2", "ecosystem": "npm" }, { "name": "minisearch", "direct": false, "version": "7.2.0", "ecosystem": "npm" }, { "name": "mitt", "direct": false, "version": "3.0.1", "ecosystem": "npm" }, { "name": "nanoid", "direct": false, "version": "3.3.16", "ecosystem": "npm" }, { "name": "oniguruma-to-es", "direct": false, "version": "3.1.1", "ecosystem": "npm" }, { "name": "perfect-debounce", "direct": false, "version": "1.0.0", "ecosystem": "npm" }, { "name": "picocolors", "direct": false, "version": "1.1.1", "ecosystem": "npm" }, { "name": "postcss", "direct": false, "version": "8.5.25", "ecosystem": "npm" }, { "name": "preact", "direct": false, "version": "10.29.1", "ecosystem": "npm" }, { "name": "property-information", "direct": false, "version": "7.1.0", "ecosystem": "npm" }, { "name": "regex", "direct": false, "version": "6.1.0", "ecosystem": "npm" }, { "name": "regex-recursion", "direct": false, "version": "6.0.2", "ecosystem": "npm" }, { "name": "regex-utilities", "direct": false, "version": "2.3.0", "ecosystem": "npm" }, { "name": "rfdc", "direct": false, "version": "1.4.1", "ecosystem": "npm" }, { "name": "rollup", "direct": false, "version": "4.60.2", "ecosystem": "npm" }, { "name": "search-insights", "direct": false, "version": "2.17.3", "ecosystem": "npm" }, { "name": "shiki", "direct": false, "version": "2.5.0", "ecosystem": "npm" }, { "name": "source-map-js", "direct": false, "version": "1.2.1", "ecosystem": "npm" }, { "name": "space-separated-tokens", "direct": false, "version": "2.0.2", "ecosystem": "npm" }, { "name": "speakingurl", "direct": false, "version": "14.0.1", "ecosystem": "npm" }, { "name": "stringify-entities", "direct": false, "version": "4.0.4", "ecosystem": "npm" }, { "name": "superjson", "direct": false, "version": "2.2.6", "ecosystem": "npm" }, { "name": "tabbable", "direct": false, "version": "6.4.0", "ecosystem": "npm" }, { "name": "trim-lines", "direct": false, "version": "3.0.1", "ecosystem": "npm" }, { "name": "unist-util-is", "direct": false, "version": "6.0.1", "ecosystem": "npm" }, { "name": "unist-util-position", "direct": false, "version": "5.0.0", "ecosystem": "npm" }, { "name": "unist-util-stringify-position", "direct": false, "version": "4.0.0", "ecosystem": "npm" }, { "name": "unist-util-visit", "direct": false, "version": "5.1.0", "ecosystem": "npm" }, { "name": "unist-util-visit-parents", "direct": false, "version": "6.0.2", "ecosystem": "npm" }, { "name": "vfile", "direct": false, "version": "6.0.3", "ecosystem": "npm" }, { "name": "vfile-message", "direct": false, "version": "4.0.3", "ecosystem": "npm" }, { "name": "vite", "direct": false, "version": "5.4.21", "ecosystem": "npm" }, { "name": "vitepress", "direct": false, "version": "1.6.4", "ecosystem": "npm" }, { "name": "vue", "direct": false, "version": "3.5.33", "ecosystem": "npm" }, { "name": "zwitch", "direct": false, "version": "2.0.4", "ecosystem": "npm" }, { "name": "cakedc/cakephp-phpstan", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "cakephp/bake", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "cakephp/migrations", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "dereuromark/cakephp-dto", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "dereuromark/cakephp-ide-helper", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "dereuromark/cakephp-templating", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "dereuromark/cakephp-tools", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "fig-r/psr2r-sniffer", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "friendsofcake/search", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "php", "direct": false, "version": null, "ecosystem": "packagist" }, { "name": "phpunit/phpunit", "direct": false, "version": null, "ecosystem": "packagist" } ], "collected": true, "truncated": false, "total_count": 186, "direct_count": 2, "indirect_count": 184 } }, "maintainership": { "issues": { "open_prs": 0, "merged_prs": 270, "open_issues": 0, "closed_ratio": 1, "closed_issues": 202, "closed_unmerged_prs": 39 }, "bus_factor": 1, "bot_contributors": 1, "top_contributors": [ { "type": "User", "login": "dereuromark", "commits": 909, "avatar_url": "https://avatars.githubusercontent.com/u/39854?v=4" }, { "type": "User", "login": "LordSimal", "commits": 46, "avatar_url": "https://avatars.githubusercontent.com/u/9105243?v=4" }, { "type": "User", "login": "MSeven", "commits": 37, "avatar_url": "https://avatars.githubusercontent.com/u/31497?v=4" }, { "type": "User", "login": "inoas", "commits": 17, "avatar_url": "https://avatars.githubusercontent.com/u/20972207?v=4" }, { "type": "User", "login": "houseoftech", "commits": 14, "avatar_url": "https://avatars.githubusercontent.com/u/297458?v=4" }, { "type": "User", "login": "Graziel", "commits": 12, "avatar_url": "https://avatars.githubusercontent.com/u/5963584?v=4" }, { "type": "User", "login": "jiru", "commits": 11, "avatar_url": "https://avatars.githubusercontent.com/u/5107734?v=4" }, { "type": "User", "login": "challgren", "commits": 9, "avatar_url": "https://avatars.githubusercontent.com/u/88909?v=4" }, { "type": "User", "login": "stmeyer", "commits": 9, "avatar_url": "https://avatars.githubusercontent.com/u/10654545?v=4" }, { "type": "User", "login": "netstyler", "commits": 8, "avatar_url": "https://avatars.githubusercontent.com/u/319755?v=4" } ], "contributors_sampled": 56, "top_contributor_share": 0.784 }, "quality_signals": { "has_ci": true, "has_tests": true, "ci_workflows": [ "ci.yml", "deploy-docs.yml" ], "has_docs_dir": true, "linter_configs": [ "phpcs.xml", "phpstan.neon" ], "has_editorconfig": true, "has_linter_config": true, "has_precommit_config": false }, "security_signals": { "lockfiles": [ "package-lock.json" ], "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": 1, "reason": "branch protection is not maximal on development and all release branches", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection" }, { "name": "CI-Tests", "score": 10, "reason": "19 out of 19 merged PRs checked by a CI test -- score normalized to 10", "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/29 approved changesets -- score normalized to 0", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review" }, { "name": "Contributors", "score": 10, "reason": "project has 13 contributing companies or organizations", "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": 10, "reason": "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": 10, "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10", "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": "SAST tool is not run on all commits -- score normalized to 0", "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": 6, "reason": "4 existing vulnerabilities detected", "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities" } ], "commit": "2c1a1bfc69ccb44b62f7f2e2b60f53d4dc2a5399", "ran_at": "2026-08-02T12:02:31Z", "aggregate_score": 5, "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": "2026-08-02T11:55:11Z", "oldest_open_prs": [], "last_merged_pr_at": "2026-08-02T11:53:58Z", "ci_last_conclusion": "FAILURE", "oldest_open_issues": [] } }, "config": { "disabled_metrics": [], "disabled_categories": [], "disabled_components": {} }, "source": { "url": "https://github.com/dereuromark/cakephp-queue", "host": "github.com", "name": "cakephp-queue", "owner": "dereuromark" }, "metrics": { "overall": { "key": "overall", "band": "excellent", "name": "Overall health", "note": "The weighted overall 76 is calibrated to 90 on the published index scale (record calibration 2026-08-02).", "notes": [ { "code": "overall_calibration", "params": { "raw": 76, "calibrated": 90, "calibration": "2026-08-02" } } ], "value": 90, "inputs": { "security": 60, "vitality": 92, "community": 68, "governance": 68, "calibration": "2026-08-02", "engineering": 94, "ai_readiness": 51, "weighted_overall_raw": 76 }, "components": [] }, "categories": [ { "key": "vitality", "band": "excellent", "name": "Vitality", "value": 92, "weight": 0.21, "metrics": [ { "key": "development_activity", "band": "excellent", "name": "Development activity", "note": null, "notes": [], "value": 86, "inputs": { "commits_last_year": 145, "human_commit_share": 0.99, "days_since_last_push": 0, "active_weeks_last_year": 32 }, "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": "32/52 weeks with commits", "points": 22.2, "status": "partial", "details": [ { "code": "commit_cadence_weeks", "params": { "weeks": 32 } } ], "max_points": 36 }, { "key": "commit_volume", "name": "Commit volume", "detail": "145 commits in the last year", "points": 18, "status": "met", "details": [ { "code": "commits_last_year", "params": { "count": 145 } } ], "max_points": 18 }, { "key": "openssf_scorecard_maintained", "name": "OpenSSF Scorecard: Maintained", "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10", "points": 10, "status": "met", "details": [], "max_points": 10 } ] }, { "key": "release_discipline", "band": "exceptional", "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": 100, "inputs": { "releases_count": 100, "latest_release_tag": "8.15.1", "releases_from_tags": false, "days_since_latest_release": 56, "mean_days_between_releases": 9 }, "components": [ { "key": "ships_releases", "name": "Ships releases", "detail": "100 releases published", "points": 27, "status": "met", "details": [ { "code": "releases_published", "params": { "count": 100 } } ], "max_points": 27 }, { "key": "release_recency", "name": "Release recency", "detail": "latest release 56 days ago", "points": 36, "status": "met", "details": [ { "code": "release_recency", "params": { "days": 56 } } ], "max_points": 36 }, { "key": "release_cadence", "name": "Release cadence", "detail": "a release every ~9 days", "points": 27, "status": "met", "details": [ { "code": "release_cadence", "params": { "gap": 9 } } ], "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": "exceptional", "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": 35, "days_since_last_human_commit_is_floor": false }, "components": [ { "key": "project_is_still_maintained", "name": "Project is still maintained", "detail": "last human commit 35 days ago", "points": 100, "status": "met", "details": [ { "code": "abandonment_maintained", "params": { "days": 35 } } ], "max_points": 100 } ] } ], "description": "Is the project alive — is code being written and are releases shipping?" }, { "key": "community", "band": "good", "name": "Community & Adoption", "value": 68, "weight": 0.17, "metrics": [ { "key": "popularity", "band": "good", "name": "Popularity & adoption", "note": null, "notes": [], "value": 65, "inputs": { "forks": 138, "stars": 308, "watchers": 19, "growth_state": "unverified", "growth_factor_pct": 100, "growth_unverified_reason": "no_history" }, "components": [ { "key": "stars", "name": "Stars", "detail": "308 stars", "points": 40.3, "status": "partial", "details": [ { "code": "stars", "params": { "count": 308 } } ], "max_points": 60 }, { "key": "forks", "name": "Forks", "detail": "138 forks", "points": 17.8, "status": "partial", "details": [ { "code": "forks", "params": { "count": 138 } } ], "max_points": 25 }, { "key": "watchers", "name": "Watchers", "detail": "19 watchers", "points": 7, "status": "partial", "details": [ { "code": "watchers", "params": { "count": 19 } } ], "max_points": 15 } ] }, { "key": "community_health", "band": "good", "name": "Community health", "note": null, "notes": [], "value": 70, "inputs": { "has_readme": true, "has_license": true, "readme_badges": null, "has_contributing": true, "has_issue_template": false, "has_code_of_conduct": false, "readme_badge_services": [], "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": 18, "status": "met", "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": "good", "name": "Ecosystem adoption (downloads)", "note": null, "notes": [], "value": 69, "inputs": { "packages": [ "dereuromark/cakephp-queue" ], "dependents": 16, "ecosystems": "packagist", "total_downloads": 997463, "monthly_downloads": 38799 }, "components": [ { "key": "monthly_downloads", "name": "Monthly downloads", "detail": "38,799 downloads/month across packagist", "points": 61.2, "status": "partial", "details": [ { "code": "downloads_monthly", "params": { "count": 38799, "ecosystems": "packagist" } } ], "max_points": 80 }, { "key": "registry_dependents", "name": "Registry dependents", "detail": "16 packages depend on it", "points": 8.2, "status": "partial", "details": [ { "code": "registry_dependents", "params": { "count": 16 } } ], "max_points": 20 } ] } ], "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?" }, { "key": "governance", "band": "good", "name": "Sustainability & Governance", "value": 68, "weight": 0.23, "metrics": [ { "key": "maintainer_resilience", "band": "weak", "name": "Maintainer resilience (bus factor)", "note": null, "notes": [], "value": 37, "inputs": { "bus_factor": 1, "contributors_sampled": 56, "top_contributor_share": 0.784 }, "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 78% of commits", "points": 4.9, "status": "partial", "details": [ { "code": "top_contributor_share", "params": { "share": 78 } } ], "max_points": 22.5 }, { "key": "contributor_breadth", "name": "Contributor breadth", "detail": "56 contributors", "points": 13.5, "status": "met", "details": [ { "code": "contributors_sampled", "params": { "count": 56 } } ], "max_points": 13.5 }, { "key": "openssf_scorecard_contributors", "name": "OpenSSF Scorecard: Contributors", "detail": "project has 13 contributing companies or organizations", "points": 10, "status": "met", "details": [], "max_points": 10 } ] }, { "key": "responsiveness", "band": "good", "name": "Issue & PR responsiveness", "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "newcomer_pr_acceptance" ] } }, { "code": "weights_renormalized", "params": {} } ], "value": 78, "inputs": { "merged_prs": 270, "open_issues": 0, "closed_issues": 202, "prs_merged_7d": null, "prs_decided_7d": null, "prs_merged_30d": null, "prs_decided_30d": null, "issue_closed_ratio": 1, "closed_unmerged_prs": 39, "first_time_authors_30d": null, "first_time_prs_merged_30d": null, "first_time_prs_decided_30d": null }, "components": [ { "key": "issue_resolution", "name": "Issue resolution", "detail": "100% of issues closed", "points": 42, "status": "met", "details": [ { "code": "issues_closed_share", "params": { "share": 100 } } ], "max_points": 42 }, { "key": "pr_acceptance", "name": "PR acceptance", "detail": "270/309 decided PRs merged", "points": 26.2, "status": "partial", "details": [ { "code": "decided_prs_merged", "params": { "merged": 270, "decided": 309 } } ], "max_points": 30 }, { "key": "newcomer_pr_acceptance", "name": "Newcomer PR acceptance", "detail": "no first-time contributor's PR decided in 30d", "points": 0, "status": "excluded", "details": [ { "code": "no_newcomer_prs", "params": { "days": 30 } } ], "max_points": 13 }, { "key": "openssf_scorecard_code_review", "name": "OpenSSF Scorecard: Code-Review", "detail": "Found 0/29 approved changesets -- score normalized to 0", "points": 0, "status": "missed", "details": [], "max_points": 15 } ] }, { "key": "stewardship", "band": "good", "name": "Ownership & stewardship", "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "verified_domain" ] } }, { "code": "weights_renormalized", "params": {} } ], "value": 70, "inputs": { "followers": 748, "owner_type": "User", "is_verified": null, "owner_login": "dereuromark", "public_repos": 123, "account_age_days": 6442 }, "components": [ { "key": "ownership_backing", "name": "Ownership backing", "detail": "personal (user) account", "points": 10, "status": "partial", "details": [ { "code": "owner_personal", "params": {} } ], "max_points": 30 }, { "key": "verified_domain", "name": "Verified domain", "detail": "not applicable to user accounts", "points": 0, "status": "excluded", "details": [ { "code": "not_applicable_to_user_accounts", "params": {} } ], "max_points": 20 }, { "key": "owner_reach", "name": "Owner reach", "detail": "748 followers of dereuromark", "points": 20.7, "status": "partial", "details": [ { "code": "owner_followers", "params": { "count": 748, "login": "dereuromark" } } ], "max_points": 25 }, { "key": "track_record", "name": "Track record", "detail": "123 public repos, account ~17 yr old", "points": 25, "status": "met", "details": [ { "code": "public_repos", "params": { "count": 123 } }, { "code": "account_age_years", "params": { "years": 17 } } ], "max_points": 25 } ] }, { "key": "package_maintenance", "band": "exceptional", "name": "Package maintenance", "note": null, "notes": [], "value": 100, "inputs": { "packages": [ "dereuromark/cakephp-queue" ], "ecosystems": "packagist", "any_deprecated": false, "min_days_since_publish": 56 }, "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 56 days ago", "points": 35, "status": "met", "details": [ { "code": "publish_recency", "params": { "days": 56 } } ], "max_points": 35 }, { "key": "version_history", "name": "Version history", "detail": "136 published versions", "points": 20, "status": "met", "details": [ { "code": "published_versions", "params": { "count": 136 } } ], "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": "exceptional", "name": "Engineering Quality", "value": 94, "weight": 0.19, "metrics": [ { "key": "engineering_practices", "band": "excellent", "name": "Engineering practices", "note": null, "notes": [], "value": 90, "inputs": { "has_ci": true, "has_tests": true, "has_editorconfig": true, "has_linter_config": true, "has_precommit_config": false }, "components": [ { "key": "ci_workflows", "name": "CI workflows", "detail": "2 workflow(s)", "points": 24, "status": "met", "details": [ { "code": "ci_workflows", "params": { "count": 2 } } ], "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": "phpcs.xml, phpstan.neon", "points": 16, "status": "met", "details": [ { "code": "file_list", "params": { "files": "phpcs.xml, phpstan.neon" } } ], "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": 6.4, "status": "met", "details": [], "max_points": 6.4 }, { "key": "openssf_scorecard_ci_tests", "name": "OpenSSF Scorecard: CI-Tests", "detail": "19 out of 19 merged PRs checked by a CI test -- score normalized to 10", "points": 20, "status": "met", "details": [], "max_points": 20 } ] }, { "key": "documentation", "band": "exceptional", "name": "Documentation", "note": null, "notes": [], "value": 100, "inputs": { "topics": [ "asynchronous", "background-jobs", "cronjob", "queue", "cakephp", "cakephp-plugin", "php" ], "has_wiki": true, "homepage": "https://dereuromark.github.io/cakephp-queue/", "has_readme": true, "has_docs_dir": true, "has_description": true }, "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": "https://dereuromark.github.io/cakephp-queue/", "points": 15, "status": "met", "details": [], "max_points": 15 }, { "key": "repository_description", "name": "Repository description", "detail": null, "points": 10, "status": "met", "details": [], "max_points": 10 }, { "key": "topics", "name": "Topics", "detail": "7 topics", "points": 10, "status": "met", "details": [ { "code": "topics_count", "params": { "count": 7 } } ], "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": "moderate", "name": "Security", "value": 60, "weight": 0.16, "metrics": [ { "key": "security_posture", "band": "moderate", "name": "Security posture", "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "dangerous_workflow", "packaging", "pinned_dependencies", "signed_releases", "token_permissions" ] } }, { "code": "weights_renormalized", "params": {} } ], "value": 50, "inputs": { "source": "openssf_scorecard", "checks_evaluated": 13, "scorecard_version": "v5.5.0", "checks_inconclusive": 5, "scorecard_aggregate": 5 }, "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": "branch protection is not maximal on development and all release branches", "points": 0.8, "status": "partial", "details": [], "max_points": 7.5 }, { "key": "ci_tests", "name": "CI-Tests", "detail": "19 out of 19 merged PRs checked by a CI test -- score normalized to 10", "points": 2.5, "status": "met", "details": [], "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/29 approved changesets -- score normalized to 0", "points": 0, "status": "missed", "details": [], "max_points": 7.5 }, { "key": "contributors", "name": "Contributors", "detail": "project has 13 contributing companies or organizations", "points": 2.5, "status": "met", "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": "update tool detected", "points": 7.5, "status": "met", "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10", "points": 7.5, "status": "met", "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": "SAST tool is not run on all commits -- score normalized to 0", "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": "4 existing vulnerabilities detected", "points": 4.5, "status": "partial", "details": [], "max_points": 7.5 } ] }, { "key": "dependency_advisories", "band": "exceptional", "name": "Dependency advisories", "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 173 resolved dependencies against OSV; 13 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.", "notes": [ { "code": "excluded_no_data", "params": { "components": [ "indirect_dependencies_free_of_known_advisories", "no_advisories_left_outstanding" ] } }, { "code": "weights_renormalized", "params": {} }, { "code": "advisories_scope_repository", "params": { "assessed": 173 } }, { "code": "advisories_unassessed", "params": { "count": 13 } }, { "code": "advisories_repo_graph_caveat", "params": {} }, { "code": "advisories_reachability", "params": {} } ], "value": 100, "inputs": { "source": "osv", "advisories": 4, "affected_packages": 2, "assessed_packages": 173, "unassessed_packages": 13, "affected_by_severity": "high 1, moderate 1", "direct_affected_packages": 0 }, "components": [ { "key": "direct_dependencies_free_of_known_advisories", "name": "Direct dependencies free of known advisories", "detail": "no direct dependency carries a known advisory", "points": 35, "status": "met", "details": [ { "code": "no_direct_advisories", "params": {} } ], "max_points": 35 }, { "key": "indirect_dependencies_free_of_known_advisories", "name": "Indirect dependencies free of known advisories", "detail": "transitive set not separable from development and test dependencies in this scope", "points": 0, "status": "excluded", "details": [ { "code": "advisories_scope_not_separable", "params": {} } ], "max_points": 25 }, { "key": "no_advisories_left_outstanding", "name": "No advisories left outstanding", "detail": "no advisory carries a publication date", "points": 0, "status": "excluded", "details": [ { "code": "advisories_no_publication_date", "params": {} } ], "max_points": 40 } ] }, { "key": "malicious_dependencies", "band": "exceptional", "name": "Malicious dependencies", "note": null, "notes": [], "value": 100, "inputs": { "source": "osv", "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored", "packages": [], "red_flag": false, "assessed_packages": 173, "malicious_packages": 0, "direct_malicious_packages": 0, "withdrawn_malicious_packages": 0, "installable_malicious_packages": 0 }, "components": [ { "key": "no_dependency_reported_as_a_malicious_package", "name": "No dependency reported as a malicious package", "detail": "no dependency is reported as a malicious package", "points": 100, "status": "met", "details": [ { "code": "no_malicious_dependencies", "params": {} } ], "max_points": 100 } ] }, { "key": "high_risk_jurisdiction_exposure", "band": "exceptional", "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" ], "commit_weight_rule": { "min_commits": 50, "min_commit_share": 0.1 }, "review_only_matches": 0, "below_threshold_exposures": [], "assessed_self_published_locations": 13 }, "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": "moderate", "name": "AI Readiness", "value": 51, "weight": 0.04, "metrics": [ { "key": "ai_agent_context", "band": "weak", "name": "Agent context & guidance", "note": null, "notes": [], "value": 36, "inputs": { "has_llms_txt": false, "legible_history_share": 0.677, "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": "67 of 99 human commits state their intent (structured subject or explanatory body)", "points": 36.1, "status": "partial", "details": [ { "code": "legible_history", "params": { "legible": 67, "sampled": 99 } } ], "max_points": 40 } ] }, { "key": "ai_verify_loop", "band": "moderate", "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": 61, "inputs": { "has_nix": false, "has_tests": true, "lockfiles": [ "package-lock.json" ], "has_dockerfile": false, "typed_language": false, "bootstrap_files": [], "has_devcontainer": false, "has_linter_config": true, "typecheck_configs": [], "agent_commit_share": 0.02, "toolchain_manifests": [], "dependency_bot_commit_share": 0.01 }, "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": "phpcs.xml, phpstan.neon", "points": 11, "status": "met", "details": [ { "code": "file_list", "params": { "files": "phpcs.xml, phpstan.neon" } } ], "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": "lockfile", "points": 10, "status": "met", "details": [ { "code": "file_list", "params": { "files": "lockfile" } } ], "max_points": 10 }, { "key": "demonstrated_agent_practice", "name": "Demonstrated agent practice", "detail": "2 of the last 100 commits agent-authored or agent-credited", "points": 4, "status": "partial", "details": [ { "code": "agent_authored_commits", "params": { "count": 2, "sampled": 100 } } ], "max_points": 10 }, { "key": "automated_maintenance", "name": "Automated maintenance", "detail": "1 of the last 100 commits are automated dependency updates", "points": 8, "status": "met", "details": [ { "code": "dependency_bot_commits", "params": { "count": 1, "sampled": 100 } } ], "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": 37884, "source_files_sampled": 161, "oversized_source_files": 0 }, "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": "0/161 source files over 60KB", "points": 55, "status": "met", "details": [ { "code": "oversized_source_files", "params": { "kb": 60, "sampled": 161, "oversized": 0 } } ], "max_points": 55 } ] } ], "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)." } ], "classification": { "labels": [ "library" ], "scores": { "plugin": 2, "web-ui": 2, "library": 6 }, "primary": "library", "evidence": [ { "tier": "distribution", "label": "library", "source": "registry:packagist", "weight": 6 }, { "tier": "description", "label": "plugin", "source": "description:plugin", "weight": 2 }, { "tier": "tags", "label": "web-ui", "source": "tag:admin-panel", "weight": 2 } ], "artifacts": [], "confidence": "medium", "host_extension": false, "runs_as_process": false, "consumed_by_code": true }, "metrics_version": "2.3.1" }, "warnings": [ "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token" ], "report_type": "repository", "generated_at": "2026-08-02T12:02:54.849037Z", "schema_version": "0.27.0", "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dereuromark/cakephp-queue.svg", "full_name": "dereuromark/cakephp-queue", "license_state": "standard", "license_spdx": "MIT" }, "repoMeta": null, "notFound": false, "related": [ { "id": 3436, "full_name": "Sylius/Sylius", "url": "https://github.com/Sylius/Sylius", "description": "Headless open-source eCommerce platform on top of PHP/Symfony/API Platform", "ecosystem": "packagist", "ecosystems": [ "packagist", "npm" ], "primary_language": "PHP", "languages": [ "PHP" ], "topics": [ "api", "api-ecommerce", "ecommerce", "ecommerce-platform", "framework", "hacktoberfest", "headless", "headless-ecommerce", "php", "rest-api", "restful-api", "shop", "shopping-cart", "sylius", "symfony", "symfony-bundle" ], "license_spdx": "MIT", "license_state": "standard", "stars": 8505, "forks": 2161, "watchers": 257, "monthly_downloads": 120034, "latest_score": 98, "latest_band": "exceptional", "latest_scanned_at": "2026-07-14T10:23:48.536599Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 10334, "full_name": "symfony/symfony", "url": "https://github.com/symfony/symfony", "description": "The Symfony PHP framework", "ecosystem": "packagist", "ecosystems": [ "packagist" ], "primary_language": "PHP", "languages": [ "PHP" ], "topics": [ "framework", "php", "symfony", "symfony-bundle", "bundle", "php-framework", "hacktoberfest", "dev" ], "license_spdx": "MIT", "license_state": "standard", "stars": 31107, "forks": 9850, "watchers": 1040, "monthly_downloads": 261266, "latest_score": 97, "latest_band": "exceptional", "latest_scanned_at": "2026-07-22T00:57:57.157500Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "organic", "abandonment_state": "maintained", "red_flags": [], "badge_url": "" }, { "id": 8573, "full_name": "Dependabot/dependabot-core", "url": "https://github.com/Dependabot/dependabot-core", "description": "🤖 Dependabot's core logic for creating update PRs.", "ecosystem": "rubygems", "ecosystems": [ "rubygems" ], "primary_language": "Ruby", "languages": [ "Ruby", "C#" ], "topics": [ "elixir", "ruby", "php", "python", "javascript", "java", "rust", "dotnet", "go", "elm", "terraform", "dependencies", "docker", "pnpm", "rubygems" ], "license_spdx": "MIT", "license_state": "standard", "stars": 5683, "forks": 1451, "watchers": 111, "monthly_downloads": null, "latest_score": 98, "latest_band": "exceptional", "latest_scanned_at": "2026-07-16T00:08:15.011461Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 21359, "full_name": "twisted/twisted", "url": "https://github.com/twisted/twisted", "description": "Event-driven networking engine written in Python.", "ecosystem": "pypi", "ecosystems": [ "pypi" ], "primary_language": "Python", "languages": [ "Python" ], "topics": [ "python", "twisted", "async", "async-python", "network", "event-driven", "http", "irc", "dns", "xmpp", "imap", "smtp", "tls", "ssl" ], "license_spdx": null, "license_state": "custom", "stars": 5973, "forks": 1215, "watchers": 168, "monthly_downloads": 14705440, "latest_score": 97, "latest_band": "exceptional", "latest_scanned_at": "2026-07-18T13:14:30.031060Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" }, { "id": 15887, "full_name": "swagger-api/swagger-ui", "url": "https://github.com/swagger-api/swagger-ui", "description": "Swagger UI is a collection of HTML, JavaScript, and CSS assets that dynamically generate beautiful documentation from a Swagger-compliant API.", "ecosystem": "npm", "ecosystems": [ "npm", "packagist" ], "primary_language": "JavaScript", "languages": [ "JavaScript" ], "topics": [ "swagger", "swagger-ui", "swagger-api", "swagger-js", "rest", "rest-api", "openapi-specification", "oas", "openapi", "openapi3", "hacktoberfest", "openapi31", "open-source", "swagger-oss", "documentation", "ui", "api", "specification" ], "license_spdx": "Apache-2.0", "license_state": "standard", "stars": 28917, "forks": 9263, "watchers": 620, "monthly_downloads": 47388955, "latest_score": 98, "latest_band": "exceptional", "latest_scanned_at": "2026-07-22T06:30:10.552449Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "organic", "abandonment_state": "maintained", "red_flags": [], "badge_url": "" }, { "id": 29169, "full_name": "Automattic/wp-calypso", "url": "https://github.com/Automattic/wp-calypso", "description": "The JavaScript and API powered WordPress.com", "ecosystem": "maven", "ecosystems": [ "maven", "npm", "packagist", "rubygems" ], "primary_language": "TypeScript", "languages": [ "TypeScript", "JavaScript" ], "topics": [ "wordpress", "javascript", "react", "es2015", "es6", "es6-javascript", "redux", "nodejs" ], "license_spdx": "GPL-2.0", "license_state": "standard", "stars": 12631, "forks": 2021, "watchers": 459, "monthly_downloads": null, "latest_score": 97, "latest_band": "exceptional", "latest_scanned_at": "2026-07-20T19:40:26.928166Z", "has_high_risk_jurisdiction_exposure": false, "has_malicious_dependency": false, "growth_authenticity": "unverified", "abandonment_state": "unverified", "red_flags": [], "badge_url": "" } ] } }
Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 2.3.1 · 2026-08-02 12:02 UTC

dereuromark / cakephp-queue

Queue plugin for CakePHP - simple, pure PHP and without dependencies.

PHPMIT★ 308 Sterne⑂ 138 Forksseit Okt. 2011Auf GitHub ansehen ↗

dereuromark/cakephp-queue erreicht einen Gesundheitsindex von 90 von 100 und liegt damit im Bereich Exzellent. Am stärksten schneidet es bei Engineering Quality (94/100) ab, am schwächsten bei AI Readiness (51/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

90
gesamt / 100
Exzellent

Software-Gesundheitsindex

Metriken werden auf einer standardisierten Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr gewichtetes Mittel, kalibriert auf die Verteilung des öffentlichen Registers, sodass die Stufen Perzentilbedeutung tragen; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze Gefährdet von 34.

90
Außergewöhnlich93-100Die Spitzengruppe des Registers (≈ obere 5 %); erfüllt im Wesentlichen alle geprüften Kriterien
Exzellent80-92Durchgehend stark; geringfügige Lücken
Gut65-79Gesund; Lücken sind begrenzt und beherrschbar
Mittel50-64Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Schwach35-49Wesentliche Schwächen in mehreren Bereichen
Gefährdet20-34Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-19Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Der gewichtete Gesamtwert 76 wird auf der veröffentlichten Indexskala auf 90 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

Mark SchererPersönliches Konto
748 Follower123 öffentliche Reposseit Dez. 2008Available as (Cake)PHP expert

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlichtTags
Packagistdereuromark/cakephp-queue8.15.138.799136vor 56 Tagenqueuecakephpbackgroundasyncjobsadmin-panelworkersdeferred-tasksstandalone-ui

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

92Exzellent · 21 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
22.2/36Commit-Rhythmus — 32/52 Wochen mit Commits
18/18Commit-Volumen — 145 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year145
human_commit_share0,99
days_since_last_push0
active_weeks_last_year32

Release-Disziplin

100Außergewöhnlich
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 100 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 56 Tagen
27/27Release-Rhythmus — ein Release etwa alle 9 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count100
latest_release_tag8.15.1
releases_from_tagsnein
days_since_latest_release56
mean_days_between_releases9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

68Gut · 17 % des Gesamtindex
Wie die Bewertung erfolgt
40.3/60Stars — 308 Stars
17.8/25Forks — 138 Forks
7/15Watcher — 19 Watcher
Verwendete Eingangsdaten
forks138
stars308
watchers19
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
readme_badges
has_contributingja
has_issue_templatenein
has_code_of_conductnein
readme_badge_services
has_pull_request_templatenein
Wie die Bewertung erfolgt
61.2/80Downloads pro Monat — 38.799 Downloads/Monat über packagist
8.2/20Abhängige in der Registry — 16 Pakete hängen davon ab
Verwendete Eingangsdaten
packagesdereuromark/cakephp-queue
dependents16
ecosystemspackagist
total_downloads997.463
monthly_downloads38.799

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

68Gut · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
4.9/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 78 % der Commits
13.5/13.5Breite der Beitragenden — 56 Beitragende
10/10OpenSSF Scorecard: Contributors — project has 13 contributing companies or organizations
Verwendete Eingangsdaten
bus_factor1
contributors_sampled56
top_contributor_share0,784
Wie die Bewertung erfolgt
42/42Issue-Lösungsquote — 100 % der Issues geschlossen
26.2/30PR-Annahme — 270/309 entschiedene PRs gemergt
0/13Newcomer PR acceptance — kein PR eines Erstbeitragenden in 30 Tagen entschieden
0/15OpenSSF Scorecard: Code-Review — Found 0/29 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs270
open_issues0
closed_issues202
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs39
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
20.7/25Reichweite des Inhabers — 748 Follower von dereuromark
25/25Kontohistorie — 123 öffentliche Repos, Kontoalter ca. 17 Jahre
Verwendete Eingangsdaten
followers748
owner_typeUser
is_verified
owner_logindereuromark
public_repos123
account_age_days6.442
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Außergewöhnlich
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf packagist
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 56 Tagen
20/20Versionshistorie — 136 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesdereuromark/cakephp-queue
ecosystemspackagist
any_deprecatednein
min_days_since_publish56

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

94Außergewöhnlich · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 2 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — phpcs.xml, phpstan.neon
0/9.6Pre-Commit-Hooks
6.4/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 19 out of 19 merged PRs checked by a CI test -- score normalized to 10
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfigja
has_linter_configja
has_precommit_confignein

Dokumentation

100Außergewöhnlich
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://dereuromark.github.io/cakephp-queue/
10/10Repository-Beschreibung
10/10Topics — 7 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsasynchronous, background-jobs, cronjob, queue, cakephp, cakephp-plugin, php
has_wikija
homepagehttps://dereuromark.github.io/cakephp-queue/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

60Mittel · 16 % des Gesamtindex
Wie die Bewertung erfolgt
7.5/7.5Binary-Artifacts — no binaries found in the repo
0.8/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 19 out of 19 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/29 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 13 contributing companies or organizations
0/10Dangerous-Workflow — keine Daten
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — keine Daten
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — keine Daten
0/7.5Token-Permissions — keine Daten
4.5/7.5Vulnerabilities — 4 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate5
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Die verbleibenden Gewichte wurden renormalisiert.

Abhängigkeits-Advisories

100Außergewöhnlich
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories4
affected_packages2
assessed_packages173
unassessed_packages13
affected_by_severityhigh 1, moderate 1
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories, Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. 173 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. 13 konnten nicht bewertet werden — keine aufgelöste Version, ein nicht unterstütztes Ökosystem oder außerhalb der ausgewiesenen Paketliste. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Trägt ein bewusst kleines Gewicht (4 %): Agenten-Tooling ist ein echtes Pflegesignal, doch ein Repository ohne jedes Signal kann weiterhin 100/100 erreichen.

51Mittel · 4 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
36.1/40Lesbare Commit-Historie — 67 von 99 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,677
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
0/18Bootstrap mit einem Befehl
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — phpcs.xml, phpstan.neon
0/11Statische Typprüfung
10/10Reproduzierbare Umgebung — lockfile
4/10Belegte Agentenpraxis — 2 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
8/8Automatisierte Wartung — 1 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
0/10OpenSSF Scorecard: Pinned-Dependencies — keine Daten
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackage-lock.json
has_dockerfilenein
typed_languagenein
bootstrap_files
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,02
toolchain_manifests
dependency_bot_commit_share0,01
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Pinned-Dependencies. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
0/45Typprüfbarer Code — PHP ohne Typprüfungs-Konfiguration
55/55Handhabbare Dateigrößen — 0/161 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languagePHP
largest_source_bytes37.884
source_files_sampled161
oversized_source_files0

Eckdaten

308GitHub-Sterne
56Mitwirkende
145Commits, letzte 12 Monate
0Tage seit letztem Push
100Releases
1Bus-Faktor
0offene Issues
npm, PackagistPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Weitere Details

Stern- und Fork-Verlauf 0 ★ / 138 ⇿
0Sterne
138Forks
100Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

025507510012515013432013-012019-102026-07
Major 5Minor 36Patch 52

Jeder Punkt umfasst 13 Tage.

OpenSSF Scorecard 5.0 / 10
5.0Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).Scorecard v5.5.0 · 2026-08-02 12:02 UTC

10Binary-Artifactsno binaries found in the repo
1Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests19 out of 19 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/29 approved changesets -- score normalized to 0
10Contributorsproject has 13 contributing companies or organizations
k. A.Dangerous-Workflowno workflows found
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
k. A.Pinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
k. A.Token-PermissionsNo tokens found
6Vulnerabilities4 existing vulnerabilities detected
Direkte Abhängigkeiten 2
RegistryPaketVersionsvorgabeManifest
Packagistbrick/varexporter^0.5.0 || ^0.6.0 || ^0.7.0composer.json
Packagistcakephp/cakephp^5.1.1composer.json
Alle Abhängigkeiten 186

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 2 direkte und 184 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
Packagistbrick/varexporterdirekt
Packagistcakephp/cakephpdirekt
npm@algolia/abtesting1.18.0indirekt
npm@algolia/autocomplete-core1.17.7indirekt
npm@algolia/autocomplete-plugin-algolia-insights1.17.7indirekt
npm@algolia/autocomplete-preset-algolia1.17.7indirekt
npm@algolia/autocomplete-shared1.17.7indirekt
npm@algolia/client-abtesting5.52.0indirekt
npm@algolia/client-analytics5.52.0indirekt
npm@algolia/client-common5.52.0indirekt
npm@algolia/client-insights5.52.0indirekt
npm@algolia/client-personalization5.52.0indirekt
npm@algolia/client-query-suggestions5.52.0indirekt
npm@algolia/client-search5.52.0indirekt
npm@algolia/ingestion1.52.0indirekt
npm@algolia/monitoring1.52.0indirekt
npm@algolia/recommend5.52.0indirekt
npm@algolia/requester-browser-xhr5.52.0indirekt
npm@algolia/requester-fetch5.52.0indirekt
npm@algolia/requester-node-http5.52.0indirekt
npm@babel/helper-string-parser7.27.1indirekt
npm@babel/helper-validator-identifier7.28.5indirekt
npm@babel/parser7.29.3indirekt
npm@babel/types7.29.0indirekt
npm@docsearch/css3.8.2indirekt
npm@docsearch/js3.8.2indirekt
npm@docsearch/react3.8.2indirekt
npm@esbuild/aix-ppc640.21.5indirekt
npm@esbuild/android-arm0.21.5indirekt
npm@esbuild/android-arm640.21.5indirekt
npm@esbuild/android-x640.21.5indirekt
npm@esbuild/darwin-arm640.21.5indirekt
npm@esbuild/darwin-x640.21.5indirekt
npm@esbuild/freebsd-arm640.21.5indirekt
npm@esbuild/freebsd-x640.21.5indirekt
npm@esbuild/linux-arm0.21.5indirekt
npm@esbuild/linux-arm640.21.5indirekt
npm@esbuild/linux-ia320.21.5indirekt
npm@esbuild/linux-loong640.21.5indirekt
npm@esbuild/linux-mips64el0.21.5indirekt
npm@esbuild/linux-ppc640.21.5indirekt
npm@esbuild/linux-riscv640.21.5indirekt
npm@esbuild/linux-s390x0.21.5indirekt
npm@esbuild/linux-x640.21.5indirekt
npm@esbuild/netbsd-x640.21.5indirekt
npm@esbuild/openbsd-x640.21.5indirekt
npm@esbuild/sunos-x640.21.5indirekt
npm@esbuild/win32-arm640.21.5indirekt
npm@esbuild/win32-ia320.21.5indirekt
npm@esbuild/win32-x640.21.5indirekt
npm@iconify-json/simple-icons1.2.80indirekt
npm@iconify/types2.0.0indirekt
npm@jridgewell/sourcemap-codec1.5.5indirekt
npm@rollup/rollup-android-arm-eabi4.60.2indirekt
npm@rollup/rollup-android-arm644.60.2indirekt
npm@rollup/rollup-darwin-arm644.60.2indirekt
npm@rollup/rollup-darwin-x644.60.2indirekt
npm@rollup/rollup-freebsd-arm644.60.2indirekt
npm@rollup/rollup-freebsd-x644.60.2indirekt
npm@rollup/rollup-linux-arm-gnueabihf4.60.2indirekt
npm@rollup/rollup-linux-arm-musleabihf4.60.2indirekt
npm@rollup/rollup-linux-arm64-gnu4.60.2indirekt
npm@rollup/rollup-linux-arm64-musl4.60.2indirekt
npm@rollup/rollup-linux-loong64-gnu4.60.2indirekt
npm@rollup/rollup-linux-loong64-musl4.60.2indirekt
npm@rollup/rollup-linux-ppc64-gnu4.60.2indirekt
npm@rollup/rollup-linux-ppc64-musl4.60.2indirekt
npm@rollup/rollup-linux-riscv64-gnu4.60.2indirekt
npm@rollup/rollup-linux-riscv64-musl4.60.2indirekt
npm@rollup/rollup-linux-s390x-gnu4.60.2indirekt
npm@rollup/rollup-linux-x64-gnu4.60.2indirekt
npm@rollup/rollup-linux-x64-musl4.60.2indirekt
npm@rollup/rollup-openbsd-x644.60.2indirekt
npm@rollup/rollup-openharmony-arm644.60.2indirekt
npm@rollup/rollup-win32-arm64-msvc4.60.2indirekt
npm@rollup/rollup-win32-ia32-msvc4.60.2indirekt
npm@rollup/rollup-win32-x64-gnu4.60.2indirekt
npm@rollup/rollup-win32-x64-msvc4.60.2indirekt
npm@shikijs/core2.5.0indirekt
npm@shikijs/engine-javascript2.5.0indirekt
npm@shikijs/engine-oniguruma2.5.0indirekt
npm@shikijs/langs2.5.0indirekt
npm@shikijs/themes2.5.0indirekt
npm@shikijs/transformers2.5.0indirekt
npm@shikijs/types2.5.0indirekt
npm@shikijs/vscode-textmate10.0.2indirekt
npm@types/estree1.0.8indirekt
npm@types/hast3.0.4indirekt
npm@types/linkify-it5.0.0indirekt
npm@types/markdown-it14.1.2indirekt
npm@types/mdast4.0.4indirekt
npm@types/mdurl2.0.0indirekt
npm@types/unist3.0.3indirekt
npm@types/web-bluetooth0.0.21indirekt
npm@ungap/structured-clone1.3.0indirekt
npm@vitejs/plugin-vue5.2.4indirekt
npm@vue/compiler-core3.5.33indirekt
npm@vue/compiler-dom3.5.33indirekt
npm@vue/compiler-sfc3.5.33indirekt
npm@vue/compiler-ssr3.5.33indirekt
npm@vue/devtools-api7.7.9indirekt
npm@vue/devtools-kit7.7.9indirekt
npm@vue/devtools-shared7.7.9indirekt
npm@vue/reactivity3.5.33indirekt
npm@vue/runtime-core3.5.33indirekt
npm@vue/runtime-dom3.5.33indirekt
npm@vue/server-renderer3.5.33indirekt
npm@vue/shared3.5.33indirekt
npm@vueuse/core12.8.2indirekt
npm@vueuse/integrations12.8.2indirekt
npm@vueuse/metadata12.8.2indirekt
npm@vueuse/shared12.8.2indirekt
npmalgoliasearch5.52.0indirekt
npmbirpc2.9.0indirekt
npmccount2.0.1indirekt
npmcharacter-entities-html42.1.0indirekt
npmcharacter-entities-legacy3.0.0indirekt
npmcomma-separated-tokens2.0.3indirekt
npmcopy-anything4.0.5indirekt
npmcsstype3.2.3indirekt
npmdequal2.0.3indirekt
npmdevlop1.1.0indirekt
npmemoji-regex-xs1.0.0indirekt
npmentities7.0.1indirekt
npmesbuild0.21.5indirekt
npmestree-walker2.0.2indirekt
npmfocus-trap7.8.0indirekt
npmfsevents2.3.3indirekt
npmhast-util-to-html9.0.5indirekt
npmhast-util-whitespace3.0.0indirekt
npmhookable5.5.3indirekt
npmhtml-void-elements3.0.0indirekt
npmis-what5.5.0indirekt
npmmagic-string0.30.21indirekt
npmmark.js8.11.1indirekt
npmmdast-util-to-hast13.2.1indirekt
npmmicromark-util-character2.1.1indirekt
npmmicromark-util-encode2.0.1indirekt
npmmicromark-util-sanitize-uri2.0.1indirekt
npmmicromark-util-symbol2.0.1indirekt
npmmicromark-util-types2.0.2indirekt
npmminisearch7.2.0indirekt
npmmitt3.0.1indirekt
npmnanoid3.3.16indirekt
npmoniguruma-to-es3.1.1indirekt
npmperfect-debounce1.0.0indirekt
npmpicocolors1.1.1indirekt
npmpostcss8.5.25indirekt
npmpreact10.29.1indirekt
npmproperty-information7.1.0indirekt
npmregex6.1.0indirekt
npmregex-recursion6.0.2indirekt
npmregex-utilities2.3.0indirekt
npmrfdc1.4.1indirekt
npmrollup4.60.2indirekt
npmsearch-insights2.17.3indirekt
npmshiki2.5.0indirekt
npmsource-map-js1.2.1indirekt
npmspace-separated-tokens2.0.2indirekt
npmspeakingurl14.0.1indirekt
npmstringify-entities4.0.4indirekt
npmsuperjson2.2.6indirekt
npmtabbable6.4.0indirekt
npmtrim-lines3.0.1indirekt
npmunist-util-is6.0.1indirekt
npmunist-util-position5.0.0indirekt
npmunist-util-stringify-position4.0.0indirekt
npmunist-util-visit5.1.0indirekt
npmunist-util-visit-parents6.0.2indirekt
npmvfile6.0.3indirekt
npmvfile-message4.0.3indirekt
npmvite5.4.21indirekt
npmvitepress1.6.4indirekt
npmvue3.5.33indirekt
npmzwitch2.0.4indirekt
Packagistcakedc/cakephp-phpstanindirekt
Packagistcakephp/bakeindirekt
Packagistcakephp/migrationsindirekt
Packagistdereuromark/cakephp-dtoindirekt
Packagistdereuromark/cakephp-ide-helperindirekt
Packagistdereuromark/cakephp-templatingindirekt
Packagistdereuromark/cakephp-toolsindirekt
Packagistfig-r/psr2r-snifferindirekt
Packagistfriendsofcake/searchindirekt
Packagistphpindirekt
Packagistphpunit/phpunitindirekt
Abhängigkeits-Advisories 2

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 173 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 2 tragen bekannte Advisories, davon 0 direkte. 13 konnten nicht bewertet werden – keine aufgelöste Version, ein nicht unterstütztes Ökosystem, oder außerhalb der ausgewiesenen Paketliste.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
vite5.4.21indirekthoch38.0.16
esbuild0.21.5indirektmittel10.25.0

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [
        "asynchronous",
        "background-jobs",
        "cronjob",
        "queue",
        "cakephp",
        "cakephp-plugin",
        "php"
      ],
      "is_fork": false,
      "size_kb": 2208,
      "has_wiki": true,
      "homepage": "https://dereuromark.github.io/cakephp-queue/",
      "languages": {
        "PHP": 558960,
        "Twig": 696
      },
      "pushed_at": "2026-08-02T11:54:00Z",
      "created_at": "2011-10-09T17:09:44Z",
      "owner_type": "User",
      "updated_at": "2026-08-02T11:54:14Z",
      "description": "Queue plugin for CakePHP - simple, pure PHP and without dependencies.",
      "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.dereuromark.de/",
      "name": "Mark Scherer",
      "type": "User",
      "login": "dereuromark",
      "company": "Available as (Cake)PHP expert",
      "location": "Berlin",
      "followers": 748,
      "avatar_url": "https://avatars.githubusercontent.com/u/39854?v=4",
      "created_at": "2008-12-11T16:33:44Z",
      "is_verified": null,
      "public_repos": 123,
      "account_age_days": 6442
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "8.15.1",
          "kind": "patch",
          "published_at": "2026-06-06T20:11:41Z"
        },
        {
          "tag": "8.15.0",
          "kind": "minor",
          "published_at": "2026-05-28T16:52:06Z"
        },
        {
          "tag": "8.14.0",
          "kind": "minor",
          "published_at": "2026-05-14T02:02:30Z"
        },
        {
          "tag": "8.13.0",
          "kind": "minor",
          "published_at": "2026-05-03T15:51:13Z"
        },
        {
          "tag": "8.12.0",
          "kind": "minor",
          "published_at": "2026-04-30T15:54:40Z"
        },
        {
          "tag": "8.11.0",
          "kind": "minor",
          "published_at": "2026-04-27T13:24:49Z"
        },
        {
          "tag": "8.10.2",
          "kind": "patch",
          "published_at": "2026-04-17T18:51:24Z"
        },
        {
          "tag": "8.10.1",
          "kind": "patch",
          "published_at": "2026-04-17T14:33:22Z"
        },
        {
          "tag": "8.10.0",
          "kind": "minor",
          "published_at": "2026-04-02T14:57:18Z"
        },
        {
          "tag": "8.9.1",
          "kind": "patch",
          "published_at": "2026-03-17T21:54:32Z"
        },
        {
          "tag": "8.9.0",
          "kind": "minor",
          "published_at": "2026-01-29T18:35:58Z"
        },
        {
          "tag": "8.8.0",
          "kind": "minor",
          "published_at": "2026-01-11T03:11:38Z"
        },
        {
          "tag": "8.7.0",
          "kind": "minor",
          "published_at": "2026-01-04T04:45:56Z"
        },
        {
          "tag": "8.6.2",
          "kind": "patch",
          "published_at": "2025-12-20T00:09:56Z"
        },
        {
          "tag": "8.6.1",
          "kind": "patch",
          "published_at": "2025-11-22T10:00:44Z"
        },
        {
          "tag": "8.6.0",
          "kind": "minor",
          "published_at": "2025-11-21T15:18:10Z"
        },
        {
          "tag": "8.5.2",
          "kind": "patch",
          "published_at": "2025-11-10T21:05:18Z"
        },
        {
          "tag": "8.5.1",
          "kind": "patch",
          "published_at": "2025-10-30T21:10:11Z"
        },
        {
          "tag": "6.9.3",
          "kind": "patch",
          "published_at": "2025-09-12T11:49:35Z"
        },
        {
          "tag": "8.5.0",
          "kind": "minor",
          "published_at": "2025-09-16T12:05:29Z"
        },
        {
          "tag": "8.4.0",
          "kind": "minor",
          "published_at": "2025-08-16T22:36:19Z"
        },
        {
          "tag": "8.3.1",
          "kind": "patch",
          "published_at": "2025-08-08T18:50:50Z"
        },
        {
          "tag": "8.3.0",
          "kind": "minor",
          "published_at": "2025-06-12T11:33:54Z"
        },
        {
          "tag": "6.9.2",
          "kind": "patch",
          "published_at": "2025-05-08T01:33:17Z"
        },
        {
          "tag": "8.2.4",
          "kind": "patch",
          "published_at": "2025-05-01T10:45:12Z"
        },
        {
          "tag": "8.2.3",
          "kind": "patch",
          "published_at": "2025-03-21T12:09:25Z"
        },
        {
          "tag": "8.2.2",
          "kind": "patch",
          "published_at": "2025-03-12T01:04:40Z"
        },
        {
          "tag": "8.2.1",
          "kind": "patch",
          "published_at": "2025-03-10T02:30:11Z"
        },
        {
          "tag": "8.2.0",
          "kind": "minor",
          "published_at": "2024-11-18T14:22:50Z"
        },
        {
          "tag": "8.1.1",
          "kind": "patch",
          "published_at": "2024-07-18T13:24:42Z"
        },
        {
          "tag": "8.1.0",
          "kind": "minor",
          "published_at": "2024-07-03T10:36:33Z"
        },
        {
          "tag": "8.0.0",
          "kind": "major",
          "published_at": "2024-03-11T22:47:54Z"
        },
        {
          "tag": "7.2.3",
          "kind": "patch",
          "published_at": "2024-03-09T16:24:55Z"
        },
        {
          "tag": "8.0.0-RC",
          "kind": "prerelease",
          "published_at": "2024-03-07T22:50:18Z"
        },
        {
          "tag": "7.2.2",
          "kind": "patch",
          "published_at": "2024-03-06T15:12:44Z"
        },
        {
          "tag": "7.2.1",
          "kind": "patch",
          "published_at": "2024-02-23T18:14:29Z"
        },
        {
          "tag": "7.2.0",
          "kind": "minor",
          "published_at": "2024-02-07T23:33:42Z"
        },
        {
          "tag": "7.1.3",
          "kind": "patch",
          "published_at": "2024-01-23T06:24:07Z"
        },
        {
          "tag": "7.1.2",
          "kind": "patch",
          "published_at": "2023-12-11T22:25:37Z"
        },
        {
          "tag": "6.9.1",
          "kind": "patch",
          "published_at": "2023-12-04T22:17:08Z"
        },
        {
          "tag": "7.1.1",
          "kind": "patch",
          "published_at": "2023-12-02T23:58:44Z"
        },
        {
          "tag": "6.9.0",
          "kind": "minor",
          "published_at": "2023-11-28T12:34:29Z"
        },
        {
          "tag": "7.1.0",
          "kind": "minor",
          "published_at": "2023-11-28T19:26:57Z"
        },
        {
          "tag": "7.0.1",
          "kind": "patch",
          "published_at": "2023-11-27T20:47:02Z"
        },
        {
          "tag": "6.8.0",
          "kind": "minor",
          "published_at": "2023-10-25T17:33:50Z"
        },
        {
          "tag": "7.0.0",
          "kind": "major",
          "published_at": "2023-10-30T10:41:58Z"
        },
        {
          "tag": "7.0.0-RC",
          "kind": "prerelease",
          "published_at": "2023-09-28T21:44:57Z"
        },
        {
          "tag": "6.7.2",
          "kind": "patch",
          "published_at": "2023-09-10T08:43:21Z"
        },
        {
          "tag": "6.7.1",
          "kind": "patch",
          "published_at": "2023-06-19T12:27:57Z"
        },
        {
          "tag": "6.7.0",
          "kind": "minor",
          "published_at": "2023-04-23T23:08:00Z"
        },
        {
          "tag": "6.6.2",
          "kind": "patch",
          "published_at": "2023-03-27T14:39:59Z"
        },
        {
          "tag": "6.6.1",
          "kind": "patch",
          "published_at": "2023-03-12T15:03:49Z"
        },
        {
          "tag": "6.6.0",
          "kind": "minor",
          "published_at": "2023-01-04T17:22:52Z"
        },
        {
          "tag": "6.5.0",
          "kind": "minor",
          "published_at": "2022-10-14T22:04:47Z"
        },
        {
          "tag": "6.4.4",
          "kind": "patch",
          "published_at": "2022-10-13T10:31:35Z"
        },
        {
          "tag": "6.4.3",
          "kind": "patch",
          "published_at": "2022-08-19T11:49:48Z"
        },
        {
          "tag": "6.4.2",
          "kind": "patch",
          "published_at": "2022-08-18T20:22:20Z"
        },
        {
          "tag": "6.4.1",
          "kind": "patch",
          "published_at": "2022-06-22T12:01:50Z"
        },
        {
          "tag": "6.4.0",
          "kind": "minor",
          "published_at": "2022-06-16T19:51:18Z"
        },
        {
          "tag": "6.3.2",
          "kind": "patch",
          "published_at": "2022-05-03T11:07:00Z"
        },
        {
          "tag": "6.3.1",
          "kind": "patch",
          "published_at": "2022-03-10T13:32:52Z"
        },
        {
          "tag": "6.3.0",
          "kind": "minor",
          "published_at": "2022-03-02T14:07:13Z"
        },
        {
          "tag": "6.2.2",
          "kind": "patch",
          "published_at": "2022-01-16T15:06:52Z"
        },
        {
          "tag": "6.2.1",
          "kind": "patch",
          "published_at": "2021-11-17T15:45:47Z"
        },
        {
          "tag": "6.2.0",
          "kind": "minor",
          "published_at": "2021-11-11T14:34:25Z"
        },
        {
          "tag": "6.1.0",
          "kind": "minor",
          "published_at": "2021-10-27T06:34:47Z"
        },
        {
          "tag": "6.0.2",
          "kind": "patch",
          "published_at": "2021-09-14T18:38:02Z"
        },
        {
          "tag": "6.0.1",
          "kind": "patch",
          "published_at": "2021-07-12T09:04:32Z"
        },
        {
          "tag": "6.0.0",
          "kind": "major",
          "published_at": "2021-07-11T10:48:28Z"
        },
        {
          "tag": "6.0.0-beta",
          "kind": "prerelease",
          "published_at": "2021-07-04T12:04:29Z"
        },
        {
          "tag": "6.0.0-alpha",
          "kind": "prerelease",
          "published_at": "2021-06-13T15:09:11Z"
        },
        {
          "tag": "4.4.1",
          "kind": "patch",
          "published_at": "2023-01-03T14:16:51Z"
        },
        {
          "tag": "5.4.0",
          "kind": "minor",
          "published_at": "2021-05-18T22:24:02Z"
        },
        {
          "tag": "5.3.0",
          "kind": "minor",
          "published_at": "2021-02-18T12:23:24Z"
        },
        {
          "tag": "5.2.1",
          "kind": "patch",
          "published_at": "2020-12-17T13:25:43Z"
        },
        {
          "tag": "5.2.0",
          "kind": "minor",
          "published_at": "2020-12-02T12:59:14Z"
        },
        {
          "tag": "5.1.0",
          "kind": "minor",
          "published_at": "2020-10-12T16:40:46Z"
        },
        {
          "tag": "5.0.3",
          "kind": "patch",
          "published_at": "2020-07-19T14:23:07Z"
        },
        {
          "tag": "5.0.2",
          "kind": "patch",
          "published_at": "2020-04-24T01:20:06Z"
        },
        {
          "tag": "5.0.1",
          "kind": "patch",
          "published_at": "2020-04-17T19:04:55Z"
        },
        {
          "tag": "5.0.0",
          "kind": "major",
          "published_at": "2020-04-13T21:34:45Z"
        },
        {
          "tag": "4.4.0",
          "kind": "minor",
          "published_at": "2020-03-07T15:52:48Z"
        },
        {
          "tag": "4.3.1",
          "kind": "patch",
          "published_at": "2020-03-05T22:21:12Z"
        },
        {
          "tag": "5.0.0-rc",
          "kind": "prerelease",
          "published_at": "2020-01-17T17:06:28Z"
        },
        {
          "tag": "4.3.0",
          "kind": "minor",
          "published_at": "2020-01-17T17:02:44Z"
        },
        {
          "tag": "4.2.3",
          "kind": "patch",
          "published_at": "2020-01-15T02:18:39Z"
        },
        {
          "tag": "5.0.0-beta",
          "kind": "prerelease",
          "published_at": "2019-12-28T00:57:15Z"
        },
        {
          "tag": "4.2.2",
          "kind": "patch",
          "published_at": "2019-12-23T14:46:46Z"
        },
        {
          "tag": "4.2.1",
          "kind": "patch",
          "published_at": "2019-11-28T00:42:43Z"
        },
        {
          "tag": "4.2.0",
          "kind": "minor",
          "published_at": "2019-10-31T09:22:55Z"
        },
        {
          "tag": "4.1.1",
          "kind": "patch",
          "published_at": "2019-10-30T14:25:45Z"
        },
        {
          "tag": "4.1.0",
          "kind": "minor",
          "published_at": "2019-09-12T10:37:27Z"
        },
        {
          "tag": "4.0.1",
          "kind": "patch",
          "published_at": "2019-08-07T11:36:53Z"
        },
        {
          "tag": "4.0.0",
          "kind": "major",
          "published_at": "2019-08-02T08:55:06Z"
        },
        {
          "tag": "4.0.0-RC",
          "kind": "prerelease",
          "published_at": "2019-07-23T22:12:05Z"
        },
        {
          "tag": "3.16.2",
          "kind": "patch",
          "published_at": "2019-04-08T12:30:23Z"
        },
        {
          "tag": "3.16.1",
          "kind": "patch",
          "published_at": "2019-03-25T18:21:02Z"
        },
        {
          "tag": "3.16.0",
          "kind": "minor",
          "published_at": "2019-03-20T20:22:01Z"
        },
        {
          "tag": "3.15.1",
          "kind": "patch",
          "published_at": "2019-03-13T15:06:22Z"
        },
        {
          "tag": "3.15.0",
          "kind": "minor",
          "published_at": "2019-03-08T14:05:22Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "2c1a1bfc69ccb44b62f7f2e2b60f53d4dc2a5399",
          "body": "Bumps [postcss](https://github.com/postcss/postcss) from 8.5.13 to 8.5.25.\n- [Release notes](https://github.com/postcss/postcss/releases)\n- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/postcss/postcss/compare/8.5.13...8.5.25)\n\n---\nupdated-depe\n[…]\nss\n  dependency-version: 8.5.25\n  dependency-type: indirect\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump postcss from 8.5.13 to 8.5.25 in /docs (#512)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-08-02T11:53:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "585681d0b4d81df9628b302f0cb68210cffa7f19",
          "body": null,
          "is_bot": false,
          "headline": "Fix PHPStan annotations for CakePHP 5.4 (#511)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-06-28T10:32:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "595f7b5e38f16123bb3e86e9780854d3fb453fd7",
          "body": "actions/cache@v1-v4 declare Node 20, which GitHub now deprecates and\nforce-runs on Node 24. v5 is Node 24 native and removes the warning.",
          "is_bot": false,
          "headline": "CI: bump actions/cache to v5 (Node 24)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-06-28T09:41:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64fe313969d3017ab8709e2f9b29a78aa75c4da0",
          "body": "…#508)\n\n* Truncate failure_message so recording a large failure cannot crash the worker\n\nmarkJobFailed() stored the failure message and captured output verbatim into the\nfailure_message / output TEXT columns. A failure larger than the column (e.g. a\ndatabase error that echoes a huge multi-row query)\n[…]\norts an error on the dynamic $this->$action() call,\nso the @phpstan-ignore-next-line became an unmatched (failing) ignore. Cast the\nresult to int to satisfy the declared return type without an ignore.",
          "is_bot": false,
          "headline": "Truncate failure_message so a large failure cannot crash the worker (…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-06-06T16:09:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "981b67f18bba9fb88edd7705470026af06a4fcdb",
          "body": "…rted label (#507)\n\n* Label dashboard Failed card as Requeued/Failed\n\nThe card counts every unfinished job with a failure_message, which includes\nstill-retrying (requeued, attempts <= retries) jobs as well as terminally\nfailed/aborted ones. The label now reflects both so a job on attempt 1/2 is\nnot \n[…]\nelper, the Restarted branch in failureStatus()\n(returns null now for a running job with no failure), and the Restarted badge\nbranches in the admin templates. Such jobs now correctly render as Running.",
          "is_bot": false,
          "headline": "Dashboard status clarity: Requeued/Failed card + drop ambiguous Resta…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-28T16:48:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f607a614b63bdc4e7ed0d2852737f99babdb9e1a",
          "body": "… aborted exclusion (#506)\n\n- getLength() now reuses pendingConditions() so it excludes terminally\n  aborted jobs, matching getPendingCount()/getPendingStats(). This fixes\n  the admin \"Pending Jobs (new/current)\" card header showing a count that\n  the (aborted-aware) pending list below it did not co\n[…]\nd stat-card count.\n- Dashboard Scheduled/Pending/Running/Failed stat cards now link to the\n  job index filtered by the matching status, so they are clickable and\n  land on exactly the jobs they count.",
          "is_bot": false,
          "headline": "Link dashboard stat cards to filtered job lists; align getLength with…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-28T16:35:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b27c1804201a28672b545c19231e61d51024b3e9",
          "body": "* Exclude aborted jobs from pending count and stats\n\ngetPendingCount() and getPendingStats() counted jobs that had exhausted\ntheir retries (status = aborted) even though they are terminal and will\nnever run again. That inflated the admin pending total and any external\ncaller. They now exclude status\n[…]\nk).\n- reset() now clears status so a reset job loses its terminal aborted\n  state and counts as pending and gets picked up again.\n\n* Order union type hint as object|array|null to satisfy psr2r-sniffer",
          "is_bot": false,
          "headline": "Exclude aborted jobs from pending count and stats (#505)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-28T16:12:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4b4b9346e8b60ebf1bd637c111794f5dc55e4180",
          "body": "… (#504)\n\nA job with `completed IS NULL` is treated as queued/in-progress by\nisQueued(), the admin \"in_progress\" filter, and the status badge. That\nconflates three different things: pending, actively running, and\npermanently failed. Once a job exhausts its retries it will never run\nagain, yet it kee\n[…]\nble failures are untouched: while attempts remain the job is\ngenuinely in flight and still counts as queued, so there is no early\nre-dispatch or pile-up. flushFailedJobs() continues to prune old rows.",
          "is_bot": false,
          "headline": "Persist terminal \"aborted\" state so dead jobs stop counting as queued…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-28T13:41:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "25b2c0825ab2a9c48fe3d09f3f478eb932a2a78f",
          "body": null,
          "is_bot": false,
          "headline": "Add sort direction indicators to admin tables",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-26T21:13:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "907be37d6f7fc3848f271da225da16b7f7faf824",
          "body": "* Bump dto to v3\n\n* Keep dto interface optional at runtime\n\n* Conflict with old dto major",
          "is_bot": false,
          "headline": "Bump dto to v3 (#502)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-25T23:24:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c941aea0fcaa33579415a4de415bccc4438e5307",
          "body": "* Run PHPCS cleanup\n\n* Address queue review follow-ups\n\n* Remove stale queue results annotation\n\n* Restore !empty ternary in queue cleanup\n\n* Fix queue rebase marker\n\n* Fix queue review follow-up\n\n* Fix queue process status typing",
          "is_bot": false,
          "headline": "Apply conservative Rector cleanup (#501)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-25T13:52:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d01d1a4f90082772efb8a7f9a4b225870877adec",
          "body": "* Apply conservative Rector cleanup\n\n* Run PHPCS cleanup\n\n* Restore safe typed property checks\n\n* Restore compact() for matching view vars\n\n* Address queue review follow-ups\n\n* Restore compact() for matching view vars\n\n* Fix queue cleanup regressions\n\n* Fix queue static analysis types",
          "is_bot": false,
          "headline": "Apply conservative Rector cleanup (#500)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-25T12:02:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07370531a2de90f09b6f6044da17f151ae5a9c35",
          "body": "Point readers to https://toolbox.dereuromark.de/dbml so they can convert this\nDBML snapshot into the migration or raw SQL they need for their own app.",
          "is_bot": false,
          "headline": "Link the DBML converter in the schema snapshot",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-23T15:54:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9ba2e7706199c6af81a884f67bfd0d4c4b3b5ad4",
          "body": "Hand-maintained DBML snapshot of the plugin's migration schema under\nresources/schema/schema.dbml — paste into dbdiagram.io to view/diagram.\nMirrors the snapshot already shipped by cakephp-workflow.",
          "is_bot": false,
          "headline": "Add DBML database schema snapshot",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-23T12:54:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c0ca5b238b9535811fb8d7520e443b6fb25fbaa6",
          "body": null,
          "is_bot": false,
          "headline": "Move CONTRIBUTING.md to .github/ and refresh",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-22T18:51:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cb477f86f9986a62a1a485ac72839e7aee8f4fcf",
          "body": "- Set cleanUrls so doc pages drop the .html suffix (works on GitHub Pages)\n- Bump deploy-docs actions to the Node 24 majors ahead of the Node 20\n  runner removal (checkout v6, setup-node v6, configure-pages v6,\n  upload-pages-artifact v5, deploy-pages v5)",
          "is_bot": false,
          "headline": "Enable clean docs URLs and update deploy actions to Node 24",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-21T17:24:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f673503e841e7af3952d1af9c66c6ecb94ffea2",
          "body": null,
          "is_bot": false,
          "headline": "Document missing configuration keys in config/app.example.php",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-21T12:54:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d777481281aaea61d674c690ead6d2b74e7fcc75",
          "body": "The dashboard banner now distinguishes three states instead of two:\n\n- green Queue Running  (heartbeat < dashboardIdleAfter, 60s default)\n- yellow Queue Idle    (heartbeat >= dashboardIdleAfter, or no heartbeat\n                        and no backlog)\n- red Queue Stalled    (heartbeat >= dashboardSta\n[…]\n\nbanner to unrelated semantics. Installations with unusual cron cadence\n(e.g. slow exitwhennothingtodo cron) should raise dashboardStalledAfter\npast the cron interval to avoid false-red between ticks.",
          "is_bot": false,
          "headline": "Add red 'stalled' status to admin dashboard banner (#499)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-14T00:50:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06abf178962758584c0fc0f330fac16880ca164a",
          "body": "When a fan-out dispatcher enqueues per-tenant work on every cron tick,\nplain `createJob()` happily inserts a duplicate row even if the previous\ntick's job for the same tenant is still pending or stuck. The result is\na slow accumulation of identical pending jobs -- in one observed case,\n5876 stuck `V\n[…]\nse that, but it requires a migration and a decision on how callers\nshould opt in per-table -- out of scope for this PR. The 99%\neffectiveness already kills the slow-buildup scenario this is built\nfor.",
          "is_bot": false,
          "headline": "Add createJob(unique: true) for fan-out dedup (#498)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-13T17:17:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c575000df6f14cd749e5f70e184c68b61aca60e7",
          "body": "…s (#497)\n\n* Cap admin dashboard pending/scheduled details to avoid OOM on backlogs\n\nThe admin index unconditionally materialised every pending and every\nscheduled queued_jobs row, then passed both arrays to the view. With a\nrealistic backlog (thousands of unfetched pending jobs) the response\nballoo\n[…]\ntus=scheduled, matching the existing search-collection\nfilter names. Lands you exactly on the rows the truncated list\nrepresents instead of the full mixed list of completed + failed +\nrunning entries.",
          "is_bot": false,
          "headline": "Cap admin dashboard pending/scheduled details to avoid OOM on backlog…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-13T16:41:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5854c7980797296b7bdc2ed932675ab64660a6e4",
          "body": "… doc (#496)\n\nTwo correctness bugs from the source-grounded review plus the ops-first\ndocumentation strategic item.\n\n1. Processor::captureOutput() cached the auto-detected schema result for\n   the lifetime of the worker. A long-running worker started before\n   `bin/cake migrations migrate` added the\n[…]\ns\n   you add columns without restarting workers), multi-server pitfalls,\n   and common task-author traps. Linked from /guide/ and the sidebar.\n\nphpunit (186/186 + 7 skipped), phpstan, phpcs all clean.",
          "is_bot": false,
          "headline": "Fix captureOutput stale cache, ExecuteTask path tokenization; add ops…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-13T16:32:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "06c5d48806b0292bf77f93bedeb62fe68c6f15de",
          "body": "The page-header pattern (title + action buttons in\n`d-flex justify-content-between align-items-center`) pushed buttons\noff-viewport on phones because no wrap was allowed. Wrap on viewports\n< sm so buttons fall to a new row instead of being clipped.",
          "is_bot": false,
          "headline": "Make page-header row wrap on phones so action buttons stay on-screen",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-11T23:38:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9ad7b0feed5d8057ad23baf9d252e5104e50001",
          "body": "The default Bootstrap 5 placeholder color (--bs-secondary-color, ~#757575)\nis dark enough to look like real field values. Override to the gray-500\ntoken so empty fields read clearly as placeholders.",
          "is_bot": false,
          "headline": "Lighten form placeholder color so it's not mistaken for real content",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-11T22:01:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3ad8f49d7b1d7f09a22d67bdc0aff09592fd205",
          "body": null,
          "is_bot": false,
          "headline": "Fix CS.",
          "author_name": "Mark",
          "author_login": "dereuromark",
          "committed_at": "2026-05-09T18:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6d22e4de12ca5a1551901db697da05a69e040a6",
          "body": "Packagist already shows the GitHub repo under Source; the homepage\nfield is more useful pointing at the dedicated docs site.",
          "is_bot": false,
          "headline": "Point composer.json homepage at the VitePress docs site",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-09T13:42:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4122ef21203c608d922af648e77f923a03399ea",
          "body": "…ue index (#495)\n\ntestAddDoesNotEvictRecentRowOnSamePidServer was asserting QueryException,\nwhich fired before #494 because the unique (pid, server) index rejected\nthe second insert. With the unique constraint dropped, the second insert\nsucceeds, so the test premise no longer holds and master CI fai\n[…]\n same (pid, server), assert the\npre-existing fresh row still exists. Coverage of the threshold check\nis preserved; the duplicate-allowed behavior is already covered by\ntestAddAllowsDuplicatePidServer.",
          "is_bot": false,
          "headline": "Fix eviction-guard test premise after dropping the (pid, server) uniq…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-08T15:19:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e93a9be6e858d78d05b6929a84dea64ec44e9df",
          "body": "…(#494)\n\nPID is not a stable worker identity. The OS recycles low PIDs across\ncontainer restarts, and the unique index on (pid, server) collides\nwhenever a containerized worker is replaced before its row is cleaned.\nworkerkey is already a UUID-style hash generated per process - the\ncorrect identity,\n[…]\niew:\n- Should worker end / kill accept --workerkey as an alternative to\n  PID for precise targeting?\n- Can the eviction logic added in PR #493 be removed once this lands,\n  or kept as belt-and-braces?",
          "is_bot": false,
          "headline": "Drop (pid, server) unique index; use workerkey as canonical identity …",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-08T15:04:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85dbb81746ff691b914df23a191a073e29ec1a0d",
          "body": "Adds Queue.staleHeartbeatThreshold config (default 90s).\nQueueProcessesTable::add() now evicts a stale (pid, server) row whose\nmodified is older than the threshold *before* attempting the insert.\n\nFixes the crash loop seen on container restarts (FrankenPHP / Docker),\nwhere killed workers leave orpha\n[…]\neTimeout\n(default 10min): that one governs in-flight job requeueing and is\ndeliberately long; workers heartbeat far more often, so a row not\nrefreshed in 90s almost certainly belongs to a dead worker.",
          "is_bot": false,
          "headline": "Auto-evict stale queue_processes rows on worker startup (#493)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-08T15:03:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f88ba5659fae73873d1040d7b18230cbfa066ef",
          "body": "… (#492)\n\nWhen a containerized worker is killed (SIGKILL, container restart) the\nqueue_processes row survives with a recent modified timestamp. The default\nheartbeat-based cleanEndedProcesses() considers the row \"still alive\" and\nkeeps it. The new worker, getting the same recycled PID, then crash-loops\non the unique (pid, server) index.\n\nThe --force flag wipes every queue_processes row in one shot so an operator\ncan recover without manual SQL.",
          "is_bot": false,
          "headline": "Add --force flag to queue worker clean for container-restart recovery…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-08T14:50:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "637807436ab19eb01eaad85390a93c0e223a1e70",
          "body": "* Suppress idle-poll heartbeat unless verbose\n\nThe worker loop printed three lines every sleeptime() interval on an\nidle queue: a timestamped \"Looking for Job ...\", \"nothing to do,\nsleeping.\", and a horizontal-rule separator. On a mostly-idle worker\nthis fills logs and stdout with steady-state noise\n[…]\n-only steady-state output. Switch to the always-on\nevent lines that prove the same thing: \"terminating.\" for the empty-\nqueue worker loop, and \"Running Job of type \\\"Foo\\\"\" for the\njob-execution path.",
          "is_bot": false,
          "headline": "Suppress idle-poll heartbeat unless verbose (#491)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-06T22:20:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b724aaa51d13cf964e731657f8d3bae2241e38d9",
          "body": "Reads Queue.adminBackUrl + optional Queue.adminBackLabel (defaults to\n\"Back to App\"). Mirrors the same pattern in cakephp-audit-stash,\ncakephp-bouncer, cakephp-databaselog so apps can wire all four with one\nconsistent config shape.",
          "is_bot": false,
          "headline": "Add configurable Back-to-App link to admin header",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-04T12:30:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0b5e0f0a538d8342593c6ec6a0f963148e90501",
          "body": "- Reorganize docs/ into guide/, tasks/, admin/, reference/ with kebab-case file names\n- Add VitePress config with sidebar nav, local search, sitemap, lastUpdated, brand-colored theme, and SVG logo\n- Add GitHub Pages deploy workflow building from docs/ on push to master\n- Move CONTRIBUTING.md back to\n[…]\noot for GitHub auto-link\n- Add docs URL to composer.json support metadata\n- Update root README.md to point to https://dereuromark.github.io/cakephp-queue/\n\nCo-authored-by: Mark <dereuromark@gmail.com>",
          "is_bot": false,
          "headline": "Migrate docs to VitePress (#489)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-04T02:48:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c3a746ceea3a8bdfccf68ce5e701ac221cd1a8a",
          "body": "Re-extract resources/locales/queue.pot via cake i18n extract against the\ncurrent src/ and templates/. The committed POT had 110 msgids; current source\nhas 244 — 134 strings added in newer code that translators had no entry for.\n\nDrop the per-string \"#: ./src/...\" location comments from the previous\n\n[…]\ngenerations stay\ntidy (a single line move no longer reshuffles every entry's `#:` line). No\ncode changes — the plugin already uses __d('queue', ...) consistently\nthroughout (361 calls, single domain).",
          "is_bot": false,
          "headline": "Refresh queue.pot from current source (#488)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-04T02:16:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8a7c89c8ef6c06d4aa020be7088e3bbaec88c7a9",
          "body": "Switched the Paginator nav titles from escapeTitle => false to\nescape => false. PaginatorHelper only honors the escape option —\nescapeTitle is silently ignored — so the FontAwesome <i> tags fell back\nto the default escaped path and rendered as literal HTML text.\n\nVerified in cakephp/cakephp PaginatorHelper: prev/next/first/last/sort\nall use only the escape option, with no narrower title-only equivalent.",
          "is_bot": false,
          "headline": "Fix pagination icons rendering as raw text (#487)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-03T15:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22cbe5b74a0c8c7ccd8179beb8328b15c834d6dd",
          "body": "Add the new allow-list config option to config/app.example.php (the\ncanonical inventory of Queue.* knobs) so users wiring up the plugin\ndiscover that production needs it.\n\nAdd an upgrading-doc subsection covering both the per-token\nescapeshellarg switch (callers with multi-token single-param entries\nmust split them) and the production allow-list requirement.",
          "is_bot": false,
          "headline": "Document Queue.executeAllowedCommands and ExecuteTask BC change (#486)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-02T14:42:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6443a03ab93a24840da0311cf922e04099469a26",
          "body": "The ExecuteTask previously concatenated `command` and each `params` entry\nthrough `escapeshellcmd()`, which only neutralizes shell metacharacters\n(`; & | $`, etc.) and does NOT defend against argument injection. A\npayload like `params => ['-r --some-flag /etc/passwd']` would still split\nacross addit\n[…]\nrg-injection token quoting and the allow-list deny/empty/allow paths\n(`ExecuteTaskTest.php`). Refresh the docs section to describe the new\nescaping primitive and the production allow-list requirement.",
          "is_bot": false,
          "headline": "Harden ExecuteTask with per-arg escapeshellarg and allow-list (#485)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-05-02T14:36:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "34e805092aa7b1f472f21f9711fe6df232654425",
          "body": "Using 'escape' => false also disables HTML escaping of attributes (URL, classes, title), not just the title text. The narrower 'escapeTitle' => false keeps attribute escaping on while still allowing the icon HTML in the title.",
          "is_bot": false,
          "headline": "Use escapeTitle instead of escape in pagination element (#483)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-30T23:07:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64c95715882c02f8756c8d6be20e1d5d569829bd",
          "body": "The legacy raw-serialized branch in EmailTask::run() previously called unserialize() without an allowed_classes restriction, so a queue job whose 'class' was a Message subclass but whose 'settings' string contained a different gadget-chain class would deserialize that gadget. Anyone who can enqueue \n[…]\ninto RCE.\n\nPin the deserialization to the same Message subclass that was already validated for instantiation. Modern app code that passes settings as an array via EmailTask::serialize() is unaffected.",
          "is_bot": false,
          "headline": "Restrict unserialize to the configured Message class (#484)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-30T23:07:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "53865a78d0acf43a1e40e23e1d72429ba2b66d2e",
          "body": null,
          "is_bot": false,
          "headline": "Use ServerRequest import in app.example.php (CS fix)",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-30T15:52:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c0e6b45b5e678671faf2422d236aaf266d60b97",
          "body": null,
          "is_bot": false,
          "headline": "Document Queue.adminAccess in app.example.php",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-30T15:17:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19d73a87dc6fb8bf7ea7e90e8a2ca5942902cbe1",
          "body": "The Queue admin UI can trigger jobs (via AddFromBackendInterface tasks),\nreset / remove queued jobs, and terminate workers. Accidental exposure\nis operational damage waiting to happen.\n\nMirror the captcha plugin's \"fail closed\" pattern: the host app MUST\nconfigure Queue.adminAccess as a Closure that\n[…]\nan\n  example role-based gate.\n\nBackwards-incompatible: existing installs that just relied on host\nAppController gating will 403 until they add a Closure. Migration is\none line in config/bootstrap.php.",
          "is_bot": false,
          "headline": "Default-deny admin access via Queue.adminAccess Closure (#481)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-30T13:43:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "72e35b0213067db0819da22ca5dd33a135158c8f",
          "body": "* Sweep stale queue_processes rows on worker startup\n\nWorkers that die without graceful shutdown (SIGKILL, OOM, container\nrestart, anything that bypasses the SIGTERM handler) leave their\nqueue_processes row behind with terminate=0. Without intervention these\nghost rows accumulate and count toward Qu\n[…]\nat.\n\nRemoving both keeps the cleanup discipline clear (one canonical sweep\npoint per worker lifecycle) and saves a couple of needless DELETE\nqueries per worker. No behaviour change for the happy path.",
          "is_bot": false,
          "headline": "Sweep stale queue_processes rows on worker startup (#480)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-30T11:23:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0e8126f22e31f54d6aa1d41afa86cfeffe32d2cc",
          "body": null,
          "is_bot": false,
          "headline": "Adjust CS badge",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-28T16:58:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39cf2e7a79ebea4b6aef6d8741a0865f916d4d38",
          "body": "* Add Queue.workerLifetimeJitter config to stagger worker shutdowns\n\nEach worker picks a random offset in [0, workerLifetimeJitter] at startup\nand adds it to its effective lifetime. Prevents thundering-herd restarts\nwhen a fleet of workers (e.g. ECS/Kubernetes tasks) is spawned at the\nsame instant a\n[…]\nainst a legacy CakePHP 2.x fork) by\nRommel Penaflor (@xrompdev) in #475; ported to the modern processor.\n\n* Add workerLifetimeJitter to app.example.php\n\n* Align worker lifetime jitter with PHP timeout",
          "is_bot": false,
          "headline": "Add Queue.workerLifetimeJitter to stagger worker shutdowns (#476)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-27T13:13:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0294a066343ea79dd2c9daabd5688ee28b094de2",
          "body": "* Move mobile-nav background to CSS class (strict-CSP)\n\nDrops the inline `style=\"background: linear-gradient(...)\"` attribute on the\nmobile offcanvas in favour of a `.queue-mobile-nav-bg` class that reuses the\nexisting `--queue-sidebar-bg` custom property. Removes the\n`style-src 'unsafe-inline'` req\n[…]\n's existing nonced `<script>`\n  reads them and assigns to `el.style` (JS-driven style mutation is not\n  subject to `style-src 'unsafe-inline'`).\n\nTemplates now contain zero inline `style=` attributes.",
          "is_bot": false,
          "headline": "Move mobile-nav background to CSS class (strict-CSP) (#479)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-26T22:29:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef13c13820f29c7a2cd1a52d2a3132f1a019a108",
          "body": "- Add nonce attribute to inline <script> blocks (layout, stats chart)\n- Replace postLink+confirm with postButton+data-confirm-message across\n  all admin templates to eliminate inline onclick handlers that CSP\n  blocks without unsafe-inline / unsafe-hashes\n- JS delegate in the layout already intercep\n[…]\nnts and replicates the confirmation UX\n\nThis lets the admin UI work under a strict script-src CSP\n(e.g. \"script-src 'self' 'nonce-X' 'unsafe-eval'\") without needing\n'unsafe-inline' or 'unsafe-hashes'.",
          "is_bot": false,
          "headline": "Refactor admin UI to be CSP-compatible (#477)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-22T23:10:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd2ccf02e194a688f6007225b21bd6146bb8ff3c",
          "body": "AddInterface::add() returns void and may silently skip queuing a job\nwhen required configuration is missing — most notably EmailTask, which\ndoes nothing when Config.adminEmail is not set.\n\nPreviously the controller showed a green success flash regardless,\nmaking it look like the admin UI had queued \n[…]\n't.\n\nNow we count QueuedJobs before/after invoking the task. If the count\ndid not increase, we show an error flash pointing the operator at the\nlikely config gap, instead of falsely reporting success.",
          "is_bot": false,
          "headline": "Fix silent no-op in Queue::addJob when task does not queue a job (#478)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-22T23:10:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54105129a38ced1ce5f0b4ac601a35a00b42ebd0",
          "body": "… (#474)\n\n* Fix EmailTask undefined-method errors for serialized Message settings\n\nKeys coming from Message::__serialize()/jsonSerialize (htmlMessage,\ntextMessage, appCharset) don't map to set<Prop>() methods on Mailer or\nMessage, so passing them via queued JSON payloads failed with\n'Call to undefin\n[…]\nblem as the address maps: string keys would otherwise be\ninterpreted as named arguments when the generic loop spreads them into\n`setHeaders()`. Forward the map as a single positional argument instead.",
          "is_bot": false,
          "headline": "Fix EmailTask undefined-method errors for serialized Message settings…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-17T18:05:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6eda87a2320430787169c0b90b02d76bba817a31",
          "body": "…472)\n\n* Fix EmailTask named-parameter error for associative address arrays\n\nPHP 8 treats string keys in the argument array of call_user_func_array()\nas named parameters, so queued payloads with an associative email => name\nmap for to/from/cc/bcc/replyTo would fail with 'Unknown named parameter'.\n\nRoute address setters through a helper that unpacks list-shaped values\npositionally (preserving the prior behavior) and forwards associative\nmaps as a single positional argument.\n\n* Fix CS",
          "is_bot": false,
          "headline": "Fix EmailTask named-parameter error for associative address arrays (#…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-17T14:00:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a534d1f8e8d6478dc374025c0bba59a48be9876f",
          "body": null,
          "is_bot": false,
          "headline": "Fix pre element overflow in standalone layout",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-04-02T14:53:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08ba64b9b3f97460cef364a04ce3b3c47adb2d28",
          "body": "Sets explicit Bootstrap 5 templates to avoid app/Tools templates\naffecting the standalone admin layout.",
          "is_bot": false,
          "headline": "Make pagination element fully standalone.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-28T14:12:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cea4b0241cc0cc29670ebfd2fc3348f9c53325f",
          "body": "Extract flash rendering logic into flash/flash.php element for cleaner\nlayout code and easier maintenance.",
          "is_bot": false,
          "headline": "Refactor flash rendering to use dedicated element.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-28T13:45:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a37a1145bd7ce55814a0f62f6ae8346ab1332c9",
          "body": null,
          "is_bot": false,
          "headline": "Fix datetime fields.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-28T13:38:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58c2bf6ca258839195e5407b0afb07b1f2c24157",
          "body": null,
          "is_bot": false,
          "headline": "Fix datetime fields.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-28T13:24:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "697206e83ee638c69ddc05f2e5795a0366c47261",
          "body": "When invalid JSON is submitted via the data edit form, the\nJsonableBehavior threw a TypeError because json_decode returned null\nbut the return type was array.\n\nChanges:\n- Update _fromJson() to throw InvalidArgumentException with a\n  descriptive error message instead of TypeError\n- Catch the exceptio\n[…]\nlid input so they can fix it\n- Add data_string virtual property annotation to QueuedJob entity\n- Add test for invalid JSON handling\n- Fix PHPStan errors: handle nullable description() in example tasks",
          "is_bot": false,
          "headline": "Fix TypeError when editing queued job with invalid JSON payload (#468)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-28T12:57:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ba99af3b86fbb258e45950d79b201c5bd7b9cf59",
          "body": null,
          "is_bot": false,
          "headline": "Fix PHPStan errors: add type annotations for list query results (#467)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-19T20:47:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6ab3291329a62e91f22b173dfa75cfbe9dc70e86",
          "body": null,
          "is_bot": false,
          "headline": "Fix PHPStan errors for nullable description passed to io->out()",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T23:03:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4de7db1a840a109a67bcae4fb9a8d7cf6f58a05a",
          "body": null,
          "is_bot": false,
          "headline": "Add descr.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T22:52:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d41261d6067f91a7ccb54dbebcf82a61d9bcc2d",
          "body": null,
          "is_bot": false,
          "headline": "Add 'standalone-ui' to composer.json keywords",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T20:49:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c63f624f7a5e1b51830ea1fb891c9f1a6878b488",
          "body": "* Add multi-connection support for multiple databases\n\nAdd support for running queue workers and admin interface across\nmultiple database connections (e.g., primary and secondary databases).\n\nFeatures:\n- Configure connections via Queue.connections array in config\n- Connection switcher dropdown in ad\n[…]\nion to persist connection choice across requests\n- Query param ?connection=xxx sets session value\n- Connection switcher redirects to dashboard to avoid 404s\n- Fix CS issue with RuntimeException import",
          "is_bot": false,
          "headline": "Add multi-connection support for multiple databases (#465)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T17:52:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9f240b75ecc795c8f20df0b60bfde19898611058",
          "body": null,
          "is_bot": false,
          "headline": "Fix Icon helper loading - only load if Templating plugin available",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T17:05:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3eb9ec48861b7be437658b65473c1e4c11d96306",
          "body": null,
          "is_bot": false,
          "headline": "Add fallbacks for Tools/Shim helpers when plugins not loaded",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T17:03:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8781022aa908e0e1ee9490abcec358fc45ad0e0b",
          "body": null,
          "is_bot": false,
          "headline": "Add pagination element fallback when Tools plugin is not loaded",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T16:58:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43291e8fb11e93f086e02f55250d71129d85bcfd",
          "body": null,
          "is_bot": false,
          "headline": "Add standalone option to app.example.php",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T16:44:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6639108fbfee7d23b5c5e821496b013c84e4f17f",
          "body": null,
          "is_bot": false,
          "headline": "Document Queue.standalone config option",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T16:42:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54097a4ea4632e7d07b921b52e95824b2e8913c9",
          "body": "By default, QueueAppController extends App\\Controller\\AppController\nto inherit app authentication, components, and configuration (BC).\n\nSet `Queue.standalone` to `true` for an isolated admin that doesn't\ndepend on the host app's AppController setup.",
          "is_bot": false,
          "headline": "Restore AppController extension with standalone opt-in (#464)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T16:40:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "241f31d400c7521bebc7d9dd3f775e084d663ccb",
          "body": "* Add heatmap analytics for job activity visualization\n\n- Add getHeatmapData() method to QueuedJobsTable for aggregating jobs by day/hour\n- Add heatmap action to QueuedJobsController with filters for metric, days, and job type\n- Add heatmapColor() helper method for color gradient\n- Create heatmap te\n[…]\nd in layout)\n- Use expr() instead of deprecated newExpr()\n- Add comprehensive tests for getHeatmapData() method\n- Add tests for heatmapColor() helper method\n- Add controller tests for heatmap() action",
          "is_bot": false,
          "headline": "Add heatmap analytics for job activity visualization (#463)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T05:05:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "320c07b3183a6dedc99c312dcf38f5a255181011",
          "body": "- Add isRestarted() helper method to detect jobs that were manually reset\n  (have attempts but no failure_message)\n- Show \"Restarted\" badge (info/cyan) in all templates between Requeued and Running\n- Previously these jobs incorrectly showed as \"Running\"\n- Add comprehensive tests for isRestarted()",
          "is_bot": false,
          "headline": "Add Restarted status for manually reset jobs",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T04:31:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b50781e66dd6f375a0a5db2651acb1df7c562f5",
          "body": "* Add modern isolated admin dashboard with Bootstrap 5\n\n- Create QueueAppController as isolated base for admin controllers\n- Add queue.php layout with Bootstrap 5.3.3 and Font Awesome 6.7.2 via CDN\n- Add reusable elements: sidebar, stats_card, status_badge, flash messages\n- Update admin templates wi\n[…]\nove dashboard stats display\n\n- Reorder stats cards: Scheduled → Pending → Running → Failed\n  (follows job lifecycle chronologically)\n- Add safeguard against negative pendingJobs count with max(0, ...)",
          "is_bot": false,
          "headline": "Add modern isolated admin dashboard with Bootstrap 5 (#461)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-18T04:14:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1baab99eeb73f77553bce89bbdf0e293cae01a2e",
          "body": "The duration() method is specific to the Tools TimeHelper. Applications\nnot using the Tools plugin would get a fatal error. This adds a\nmethod_exists check with a fallback to PHP's DateInterval::format().\n\nPort of #462 to master.",
          "is_bot": false,
          "headline": "Add runtime fallback for Tools Time->duration() method",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-17T21:51:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32de0da594563ffd7ebd31d42ae80cba8b4e3796",
          "body": null,
          "is_bot": false,
          "headline": "Fix CS",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-17T19:57:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e60221ff99cdf3a202e9d9c56776200adf35391e",
          "body": "JsonableBehavior now uses Queue\\Database\\Type\\ArrayType instead of\nShim\\Database\\Type\\ArrayType, removing the undocumented dependency\non dereuromark/cakephp-shim.",
          "is_bot": false,
          "headline": "Add local ArrayType to remove hidden Shim plugin dependency",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-17T19:53:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f58ec4d15c378e33b716cf1c17b92288c7e65796",
          "body": "- relLengthOfTime() falls back to timeAgoInWords() from CakePHP core\n- Format->ok() calls now use Queue.ok element which has built-in fallback",
          "is_bot": false,
          "headline": "Add runtime fallbacks for Tools plugin dependencies in admin templates",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-17T19:49:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "465fa28eb73022edad5378a0d56281329735824f",
          "body": null,
          "is_bot": false,
          "headline": "Enable phpcs cache for faster subsequent runs",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-15T15:35:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8dc1db72045b6a563b4ebe9af5dbab50072773f8",
          "body": null,
          "is_bot": false,
          "headline": "Improve composer.json metadata",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-13T14:51:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4ad201c5705d06f12efa1b0cdb0cba66aff07bd",
          "body": null,
          "is_bot": false,
          "headline": "Add admin-panel keyword",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-03-13T14:43:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a52e9cc962f3325da79106670a92cd62e352453",
          "body": null,
          "is_bot": false,
          "headline": "Fix PHPStan type errors with entity annotations",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-02-28T00:02:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "474b5622a107772921159b0611d31c822ee41479",
          "body": null,
          "is_bot": false,
          "headline": "Allow PHPUnit 13",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-02-06T23:54:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fab07eea73cd9e5744c7913b898e32ec8795989c",
          "body": "- cakephp-tools ^3.12.0: fixes Message::addAttachment() signature\n  incompatibility with CakePHP 5.3\n- friendsofcake/search ^7.7.0: fixes searchManager/isSearch/searchParams\n  behavior call deprecations on CakePHP 5.3",
          "is_bot": false,
          "headline": "Bump minimum cakephp-tools and search plugin versions (#460)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-31T04:41:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d7da44c7e5b0228bf936efda7829d10367b7745",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade migrations dev dep",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-31T04:14:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "798f9afb1f1247e3175a4f8018c0372416e096b0",
          "body": "* Auto-detect captureOutput based on output column existence\n\nInstead of requiring explicit `Queue.captureOutput` configuration,\nthe Processor now auto-detects whether to capture output by checking\nif the `output` column exists on the `queued_jobs` table.\n\nExplicit config still takes precedence. The\n[…]\ntest\n\nWrap getSchema()->hasColumn() in try/catch to handle mock tables in tests\n(and any edge case in production). Suppress E_USER_DEPRECATED in\nInfoCommandTest that deliberately uses old config keys.",
          "is_bot": false,
          "headline": "Auto-detect captureOutput based on output column existence (#459)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-29T17:56:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8b9e5d6cb4f99170c0547457f706f124cd25f40",
          "body": "* Add optional output capture for queue jobs\n\nIntroduce a new `Queue.captureOutput` config option that, when enabled,\ncaptures task stdout/stderr output and stores it in a new `output` text\ncolumn on the `queued_jobs` table. This allows reviewing job output in\nthe admin panel after execution, which \n[…]\nemory\n\nWorkerCommand.php:\n- Fix defaultName() collision with JobCommand (was 'queue job',\n  now 'queue worker')\n\nQueueProcessesTable.php:\n- Sanitize PID/signal as integers in terminateProcess() exec()",
          "is_bot": false,
          "headline": "Add optional output capture for queue jobs (#458) - fix edge case issues",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-29T10:37:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8fd7254593dbdacede4952e1197ab3cff8b3de7",
          "body": null,
          "is_bot": false,
          "headline": "Update brick/varexporter version requirement",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-28T05:12:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8a4435f12ea4c6ece94579dfeb51520242cc712",
          "body": null,
          "is_bot": false,
          "headline": "Raise PHP Min Version",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-28T05:02:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1418afb3860c5b2f153aa57005e98c41187b6aee",
          "body": "Add generic events for queue job lifecycle:\n- Queue.Job.created: when job is added to queue\n- Queue.Job.started: when job processing starts\n- Queue.Job.completed: when job completes successfully\n- Queue.Job.failed: when job fails\n\nAdd CakeSentryEventBridge listener that bridges these events to\nCakeSentry.Queue.* events for lordsimal/cakephp-sentry integration.\nUsers can enable it with: EventManager::instance()->on(new CakeSentryEventBridge())",
          "is_bot": false,
          "headline": "Add Queue.Job.* lifecycle events with optional Sentry bridge. (#453)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-11T03:10:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3800ca14b53ee82f13dba8ee08aedbe970f44e30",
          "body": "varexporter v7",
          "is_bot": false,
          "headline": "Merge pull request #457 from dereuromark/fix-docs-syntax",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-07T00:42:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "726c675e53f9c2c4bba2165948b9fc0415657947",
          "body": null,
          "is_bot": false,
          "headline": "varexporter v7",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-07T00:35:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e46f97519a39848a7c2519a6b51118fbe6dff20",
          "body": "Fix missing semicolons in configuration.md examples",
          "is_bot": false,
          "headline": "Merge pull request #456 from dereuromark/fix-docs-syntax",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-04T05:01:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31e29f7d9c84ed84a10e8d90b30bccaaff807be0",
          "body": null,
          "is_bot": false,
          "headline": "Fix missing semicolons in configuration.md examples",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-04T04:59:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1c944f36cc9f255b3a0c4910e8c9e59de454a87",
          "body": "…time\n\nAdd real-time progress documentation with Mercure/FrankenPHP",
          "is_bot": false,
          "headline": "Merge pull request #451 from dereuromark/docs/frankenphp-mercure-real…",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-04T02:32:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6fccb5b13f37bd14ad4af0571d934a3d0aa1135c",
          "body": "Add getDescription() to all commands",
          "is_bot": false,
          "headline": "Merge pull request #455 from dereuromark/add-command-descriptions",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-04T02:30:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "514ee88233de0f2ded727c513ce5a560d23a9ef7",
          "body": null,
          "is_bot": false,
          "headline": "Add getDescription() to all commands",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-04T02:19:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b74d00be179ab07d0373553ec162a98320b40a1e",
          "body": "Make Icon configuration optional with text fallback",
          "is_bot": false,
          "headline": "Merge pull request #454 from dereuromark/feature/optional-icon-config",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-01T16:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99731ec588af6be75106336bbe934707ede71f85",
          "body": "- Conditionally load Icon helper only when Icon.sets is configured\n- Add icon element with text fallback for when icons are not configured\n- Update templates to use the icon element\n\nThe backend UI now works without Icon.sets configured, showing text\nlabels like [View], [Edit], [Del] instead of icons.",
          "is_bot": false,
          "headline": "Make Icon configuration optional with text fallback",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2026-01-01T16:48:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bd3f8bb801e32fde5ba5d8d1f2eb4072c4ad9d0",
          "body": "Documents the PID 1 issue when running queue workers in Docker containers\nand provides solutions using stable hostnames and startup cleanup commands.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)",
          "is_bot": false,
          "headline": "Add Docker/docker-compose deployment documentation",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2025-12-20T01:04:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e447805c1e945c58c03d3d4d02e14acb01c67e61",
          "body": "Instead of warning when a task timeout exceeds the requeue timeout,\nautomatically cap it to prevent duplicate execution.",
          "is_bot": false,
          "headline": "Auto-cap task timeout to defaultRequeueTimeout.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2025-12-19T22:17:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "18ac9872d9ff331513de2109ed49e76cdb6b503e",
          "body": null,
          "is_bot": false,
          "headline": "Allow config overwrite on vendor tasks.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2025-12-19T22:12:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef5ac978c5adc028a2794cc831902d1dd7ec4c15",
          "body": "Documents how to display live queue job progress in the browser using:\n- Mercure protocol with Server-Sent Events\n- FrankenPHP with built-in Mercure hub\n- Example queue task with progress publishing\n- Controller and template examples\n- Production deployment with systemd/supervisor\n- Worker scaling configuration",
          "is_bot": false,
          "headline": "Add real-time progress documentation with Mercure/FrankenPHP",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2025-12-19T18:51:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce69d1fff33dc784bc5c43ee83c199def0489f62",
          "body": null,
          "is_bot": false,
          "headline": "Add readable config ints.",
          "author_name": "mscherer",
          "author_login": "dereuromark",
          "committed_at": "2025-12-11T19:55:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "486dce3ddf5026d2c2f75f951d522f9cc6d7d14e",
          "body": "Support both the legacy queue_phinxlog table (Migrations plugin 4.x)\nand the new cake_migrations table (Migrations plugin 5.x).\n\nThe migration now checks if cake_migrations exists and uses it with\nthe plugin column filter, otherwise falls back to queue_phinxlog.",
          "is_bot": false,
          "headline": "Add support for unified cake_migrations table (#450)",
          "author_name": "Mark Scherer",
          "author_login": "dereuromark",
          "committed_at": "2025-12-11T19:49:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 145,
      "latest_release_at": "2026-06-06T20:11:41Z",
      "latest_release_tag": "8.15.1",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 32,
      "days_since_latest_release": 56,
      "mean_days_between_releases": 9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "dereuromark/cakephp-queue",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "queue",
            "cakephp",
            "background",
            "async",
            "jobs",
            "admin-panel",
            "workers",
            "deferred tasks",
            "standalone-ui"
          ],
          "ecosystem": "packagist",
          "matches_repo": true,
          "registry_url": "https://packagist.org/packages/dereuromark/cakephp-queue",
          "is_deprecated": false,
          "latest_version": "8.15.1",
          "repository_url": "https://github.com/dereuromark/cakephp-queue",
          "versions_count": 136,
          "total_downloads": 997463,
          "dependents_count": 16,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 38799,
          "first_published_at": null,
          "latest_published_at": "2026-06-06T16:09:37Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 56
        }
      ]
    },
    "popularity": {
      "forks": 138,
      "stars": 308,
      "watchers": 19,
      "fork_history": {
        "days": [
          {
            "date": "2013-01-25",
            "count": 1
          },
          {
            "date": "2013-07-05",
            "count": 1
          },
          {
            "date": "2013-12-27",
            "count": 1
          },
          {
            "date": "2014-02-13",
            "count": 1
          },
          {
            "date": "2014-03-19",
            "count": 1
          },
          {
            "date": "2014-04-16",
            "count": 1
          },
          {
            "date": "2014-06-22",
            "count": 1
          },
          {
            "date": "2014-07-16",
            "count": 1
          },
          {
            "date": "2014-08-05",
            "count": 1
          },
          {
            "date": "2014-09-02",
            "count": 1
          },
          {
            "date": "2014-12-11",
            "count": 1
          },
          {
            "date": "2015-02-16",
            "count": 1
          },
          {
            "date": "2015-02-17",
            "count": 1
          },
          {
            "date": "2015-02-19",
            "count": 1
          },
          {
            "date": "2015-02-23",
            "count": 1
          },
          {
            "date": "2015-03-16",
            "count": 1
          },
          {
            "date": "2015-05-10",
            "count": 1
          },
          {
            "date": "2015-06-15",
            "count": 1
          },
          {
            "date": "2015-07-08",
            "count": 1
          },
          {
            "date": "2015-07-31",
            "count": 1
          },
          {
            "date": "2015-08-04",
            "count": 1
          },
          {
            "date": "2015-08-07",
            "count": 1
          },
          {
            "date": "2015-08-12",
            "count": 1
          },
          {
            "date": "2015-08-16",
            "count": 1
          },
          {
            "date": "2015-08-22",
            "count": 1
          },
          {
            "date": "2015-11-18",
            "count": 1
          },
          {
            "date": "2015-12-28",
            "count": 1
          },
          {
            "date": "2016-01-05",
            "count": 1
          },
          {
            "date": "2016-01-07",
            "count": 1
          },
          {
            "date": "2016-01-22",
            "count": 1
          },
          {
            "date": "2016-01-24",
            "count": 1
          },
          {
            "date": "2016-01-25",
            "count": 1
          },
          {
            "date": "2016-02-18",
            "count": 1
          },
          {
            "date": "2016-03-12",
            "count": 1
          },
          {
            "date": "2016-03-17",
            "count": 1
          },
          {
            "date": "2016-04-07",
            "count": 1
          },
          {
            "date": "2016-04-20",
            "count": 1
          },
          {
            "date": "2016-04-27",
            "count": 1
          },
          {
            "date": "2016-04-30",
            "count": 1
          },
          {
            "date": "2016-06-17",
            "count": 1
          },
          {
            "date": "2016-07-08",
            "count": 1
          },
          {
            "date": "2016-08-05",
            "count": 1
          },
          {
            "date": "2016-08-12",
            "count": 1
          },
          {
            "date": "2016-08-17",
            "count": 1
          },
          {
            "date": "2016-09-02",
            "count": 1
          },
          {
            "date": "2016-10-14",
            "count": 1
          },
          {
            "date": "2016-10-22",
            "count": 1
          },
          {
            "date": "2016-11-16",
            "count": 1
          },
          {
            "date": "2016-12-01",
            "count": 1
          },
          {
            "date": "2016-12-28",
            "count": 1
          },
          {
            "date": "2017-01-09",
            "count": 1
          },
          {
            "date": "2017-03-15",
            "count": 1
          },
          {
            "date": "2017-03-20",
            "count": 1
          },
          {
            "date": "2017-04-10",
            "count": 1
          },
          {
            "date": "2017-04-26",
            "count": 1
          },
          {
            "date": "2017-04-27",
            "count": 1
          },
          {
            "date": "2017-05-29",
            "count": 1
          },
          {
            "date": "2017-06-01",
            "count": 1
          },
          {
            "date": "2017-06-30",
            "count": 1
          },
          {
            "date": "2017-07-03",
            "count": 1
          },
          {
            "date": "2017-07-10",
            "count": 1
          },
          {
            "date": "2017-10-04",
            "count": 1
          },
          {
            "date": "2017-10-20",
            "count": 1
          },
          {
            "date": "2018-03-01",
            "count": 1
          },
          {
            "date": "2018-03-14",
            "count": 1
          },
          {
            "date": "2018-04-30",
            "count": 1
          },
          {
            "date": "2018-05-06",
            "count": 1
          },
          {
            "date": "2018-06-19",
            "count": 1
          },
          {
            "date": "2018-08-10",
            "count": 1
          },
          {
            "date": "2018-09-07",
            "count": 1
          },
          {
            "date": "2018-11-14",
            "count": 2
          },
          {
            "date": "2018-11-29",
            "count": 1
          },
          {
            "date": "2018-12-28",
            "count": 1
          },
          {
            "date": "2019-01-15",
            "count": 1
          },
          {
            "date": "2019-02-09",
            "count": 1
          },
          {
            "date": "2019-03-04",
            "count": 1
          },
          {
            "date": "2019-03-15",
            "count": 1
          },
          {
            "date": "2019-04-22",
            "count": 1
          },
          {
            "date": "2019-05-10",
            "count": 1
          },
          {
            "date": "2019-05-12",
            "count": 1
          },
          {
            "date": "2019-06-25",
            "count": 1
          },
          {
            "date": "2019-07-11",
            "count": 1
          },
          {
            "date": "2019-08-01",
            "count": 1
          },
          {
            "date": "2019-08-13",
            "count": 1
          },
          {
            "date": "2019-09-09",
            "count": 1
          },
          {
            "date": "2019-12-09",
            "count": 1
          },
          {
            "date": "2019-12-12",
            "count": 1
          },
          {
            "date": "2019-12-29",
            "count": 1
          },
          {
            "date": "2020-01-03",
            "count": 1
          },
          {
            "date": "2020-01-23",
            "count": 1
          },
          {
            "date": "2020-06-08",
            "count": 1
          },
          {
            "date": "2020-06-22",
            "count": 1
          },
          {
            "date": "2020-09-08",
            "count": 1
          },
          {
            "date": "2020-10-21",
            "count": 1
          },
          {
            "date": "2021-01-26",
            "count": 1
          },
          {
            "date": "2021-05-24",
            "count": 1
          },
          {
            "date": "2021-06-30",
            "count": 1
          },
          {
            "date": "2021-07-07",
            "count": 1
          },
          {
            "date": "2021-07-14",
            "count": 1
          },
          {
            "date": "2021-10-10",
            "count": 1
          },
          {
            "date": "2021-12-22",
            "count": 1
          },
          {
            "date": "2022-01-02",
            "count": 1
          },
          {
            "date": "2022-01-12",
            "count": 1
          },
          {
            "date": "2022-03-16",
            "count": 1
          },
          {
            "date": "2022-03-21",
            "count": 1
          },
          {
            "date": "2022-04-15",
            "count": 1
          },
          {
            "date": "2022-05-20",
            "count": 1
          },
          {
            "date": "2022-08-18",
            "count": 1
          },
          {
            "date": "2022-08-19",
            "count": 1
          },
          {
            "date": "2022-08-22",
            "count": 1
          },
          {
            "date": "2022-10-18",
            "count": 1
          },
          {
            "date": "2022-10-25",
            "count": 1
          },
          {
            "date": "2022-11-02",
            "count": 1
          },
          {
            "date": "2022-12-18",
            "count": 1
          },
          {
            "date": "2023-01-03",
            "count": 1
          },
          {
            "date": "2023-01-09",
            "count": 1
          },
          {
            "date": "2023-02-09",
            "count": 1
          },
          {
            "date": "2023-02-14",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 1
          },
          {
            "date": "2023-04-03",
            "count": 1
          },
          {
            "date": "2023-07-20",
            "count": 1
          },
          {
            "date": "2023-09-13",
            "count": 1
          },
          {
            "date": "2024-05-06",
            "count": 1
          },
          {
            "date": "2024-06-21",
            "count": 1
          },
          {
            "date": "2024-09-19",
            "count": 1
          },
          {
            "date": "2024-10-24",
            "count": 1
          },
          {
            "date": "2025-03-18",
            "count": 1
          },
          {
            "date": "2025-05-07",
            "count": 1
          },
          {
            "date": "2025-08-23",
            "count": 1
          },
          {
            "date": "2025-11-22",
            "count": 1
          },
          {
            "date": "2026-03-31",
            "count": 1
          },
          {
            "date": "2026-06-14",
            "count": 1
          },
          {
            "date": "2026-07-15",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 134,
        "total_forks": 138
      },
      "star_history": 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": 37884,
      "source_files_sampled": 161,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "composer.json",
        "docs/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "vite",
            "direct": false,
            "version": "5.4.21",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-4w7w-66w2-5vf9",
              "GHSA-fx2h-pf6j-xcff",
              "GHSA-v6wh-96g9-6wx3"
            ],
            "fixed_version": "8.0.16",
            "advisory_count": 3,
            "oldest_advisory_days": 117
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.21.5",
            "severity": "moderate",
            "ecosystem": "npm",
            "cvss_score": 5.3,
            "advisory_ids": [
              "GHSA-67mh-4wv8-2f99"
            ],
            "fixed_version": "0.25.0",
            "advisory_count": 1,
            "oldest_advisory_days": 537
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 1,
          "moderate": 1
        },
        "advisory_count": 4,
        "affected_count": 2,
        "assessed_count": 173,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 13,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "packagist"
      ],
      "dependencies": [
        {
          "name": "brick/varexporter",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^0.5.0 || ^0.6.0 || ^0.7.0"
        },
        {
          "name": "cakephp/cakephp",
          "manifest": "composer.json",
          "ecosystem": "packagist",
          "version_constraint": "^5.1.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "brick/varexporter",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/cakephp",
            "direct": true,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "@algolia/abtesting",
            "direct": false,
            "version": "1.18.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/autocomplete-core",
            "direct": false,
            "version": "1.17.7",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/autocomplete-plugin-algolia-insights",
            "direct": false,
            "version": "1.17.7",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/autocomplete-preset-algolia",
            "direct": false,
            "version": "1.17.7",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/autocomplete-shared",
            "direct": false,
            "version": "1.17.7",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/client-abtesting",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/client-analytics",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/client-common",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/client-insights",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/client-personalization",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/client-query-suggestions",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/client-search",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/ingestion",
            "direct": false,
            "version": "1.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/monitoring",
            "direct": false,
            "version": "1.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/recommend",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/requester-browser-xhr",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/requester-fetch",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@algolia/requester-node-http",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-string-parser",
            "direct": false,
            "version": "7.27.1",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/helper-validator-identifier",
            "direct": false,
            "version": "7.28.5",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/parser",
            "direct": false,
            "version": "7.29.3",
            "ecosystem": "npm"
          },
          {
            "name": "@babel/types",
            "direct": false,
            "version": "7.29.0",
            "ecosystem": "npm"
          },
          {
            "name": "@docsearch/css",
            "direct": false,
            "version": "3.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "@docsearch/js",
            "direct": false,
            "version": "3.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "@docsearch/react",
            "direct": false,
            "version": "3.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/aix-ppc64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-arm64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/android-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-arm64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/darwin-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-arm64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/freebsd-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-arm64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ia32",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-loong64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-mips64el",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-ppc64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-riscv64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-s390x",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/linux-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/netbsd-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/openbsd-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/sunos-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-arm64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-ia32",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@esbuild/win32-x64",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "@iconify-json/simple-icons",
            "direct": false,
            "version": "1.2.80",
            "ecosystem": "npm"
          },
          {
            "name": "@iconify/types",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@jridgewell/sourcemap-codec",
            "direct": false,
            "version": "1.5.5",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm-eabi",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-android-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-darwin-x64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-freebsd-x64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-gnueabihf",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm-musleabihf",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-arm64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-loong64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-ppc64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-riscv64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-s390x-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-linux-x64-musl",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openbsd-x64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-openharmony-arm64",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-arm64-msvc",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-ia32-msvc",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-gnu",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@rollup/rollup-win32-x64-msvc",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/core",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/engine-javascript",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/engine-oniguruma",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/langs",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/themes",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/transformers",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/types",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "@shikijs/vscode-textmate",
            "direct": false,
            "version": "10.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/estree",
            "direct": false,
            "version": "1.0.8",
            "ecosystem": "npm"
          },
          {
            "name": "@types/hast",
            "direct": false,
            "version": "3.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/linkify-it",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/markdown-it",
            "direct": false,
            "version": "14.1.2",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mdast",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "@types/mdurl",
            "direct": false,
            "version": "2.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "@types/unist",
            "direct": false,
            "version": "3.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "@types/web-bluetooth",
            "direct": false,
            "version": "0.0.21",
            "ecosystem": "npm"
          },
          {
            "name": "@ungap/structured-clone",
            "direct": false,
            "version": "1.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "@vitejs/plugin-vue",
            "direct": false,
            "version": "5.2.4",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/compiler-core",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/compiler-dom",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/compiler-sfc",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/compiler-ssr",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/devtools-api",
            "direct": false,
            "version": "7.7.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/devtools-kit",
            "direct": false,
            "version": "7.7.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/devtools-shared",
            "direct": false,
            "version": "7.7.9",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/reactivity",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/runtime-core",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/runtime-dom",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/server-renderer",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vue/shared",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "@vueuse/core",
            "direct": false,
            "version": "12.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "@vueuse/integrations",
            "direct": false,
            "version": "12.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "@vueuse/metadata",
            "direct": false,
            "version": "12.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "@vueuse/shared",
            "direct": false,
            "version": "12.8.2",
            "ecosystem": "npm"
          },
          {
            "name": "algoliasearch",
            "direct": false,
            "version": "5.52.0",
            "ecosystem": "npm"
          },
          {
            "name": "birpc",
            "direct": false,
            "version": "2.9.0",
            "ecosystem": "npm"
          },
          {
            "name": "ccount",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "character-entities-html4",
            "direct": false,
            "version": "2.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "character-entities-legacy",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "comma-separated-tokens",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "copy-anything",
            "direct": false,
            "version": "4.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "csstype",
            "direct": false,
            "version": "3.2.3",
            "ecosystem": "npm"
          },
          {
            "name": "dequal",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "devlop",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "emoji-regex-xs",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "entities",
            "direct": false,
            "version": "7.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "esbuild",
            "direct": false,
            "version": "0.21.5",
            "ecosystem": "npm"
          },
          {
            "name": "estree-walker",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "focus-trap",
            "direct": false,
            "version": "7.8.0",
            "ecosystem": "npm"
          },
          {
            "name": "fsevents",
            "direct": false,
            "version": "2.3.3",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-to-html",
            "direct": false,
            "version": "9.0.5",
            "ecosystem": "npm"
          },
          {
            "name": "hast-util-whitespace",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "hookable",
            "direct": false,
            "version": "5.5.3",
            "ecosystem": "npm"
          },
          {
            "name": "html-void-elements",
            "direct": false,
            "version": "3.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "is-what",
            "direct": false,
            "version": "5.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "magic-string",
            "direct": false,
            "version": "0.30.21",
            "ecosystem": "npm"
          },
          {
            "name": "mark.js",
            "direct": false,
            "version": "8.11.1",
            "ecosystem": "npm"
          },
          {
            "name": "mdast-util-to-hast",
            "direct": false,
            "version": "13.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-character",
            "direct": false,
            "version": "2.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-encode",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-sanitize-uri",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-symbol",
            "direct": false,
            "version": "2.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "micromark-util-types",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "minisearch",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "npm"
          },
          {
            "name": "mitt",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "nanoid",
            "direct": false,
            "version": "3.3.16",
            "ecosystem": "npm"
          },
          {
            "name": "oniguruma-to-es",
            "direct": false,
            "version": "3.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "perfect-debounce",
            "direct": false,
            "version": "1.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "picocolors",
            "direct": false,
            "version": "1.1.1",
            "ecosystem": "npm"
          },
          {
            "name": "postcss",
            "direct": false,
            "version": "8.5.25",
            "ecosystem": "npm"
          },
          {
            "name": "preact",
            "direct": false,
            "version": "10.29.1",
            "ecosystem": "npm"
          },
          {
            "name": "property-information",
            "direct": false,
            "version": "7.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "regex",
            "direct": false,
            "version": "6.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "regex-recursion",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "regex-utilities",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "npm"
          },
          {
            "name": "rfdc",
            "direct": false,
            "version": "1.4.1",
            "ecosystem": "npm"
          },
          {
            "name": "rollup",
            "direct": false,
            "version": "4.60.2",
            "ecosystem": "npm"
          },
          {
            "name": "search-insights",
            "direct": false,
            "version": "2.17.3",
            "ecosystem": "npm"
          },
          {
            "name": "shiki",
            "direct": false,
            "version": "2.5.0",
            "ecosystem": "npm"
          },
          {
            "name": "source-map-js",
            "direct": false,
            "version": "1.2.1",
            "ecosystem": "npm"
          },
          {
            "name": "space-separated-tokens",
            "direct": false,
            "version": "2.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "speakingurl",
            "direct": false,
            "version": "14.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "stringify-entities",
            "direct": false,
            "version": "4.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "superjson",
            "direct": false,
            "version": "2.2.6",
            "ecosystem": "npm"
          },
          {
            "name": "tabbable",
            "direct": false,
            "version": "6.4.0",
            "ecosystem": "npm"
          },
          {
            "name": "trim-lines",
            "direct": false,
            "version": "3.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-is",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-position",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-stringify-position",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-visit",
            "direct": false,
            "version": "5.1.0",
            "ecosystem": "npm"
          },
          {
            "name": "unist-util-visit-parents",
            "direct": false,
            "version": "6.0.2",
            "ecosystem": "npm"
          },
          {
            "name": "vfile",
            "direct": false,
            "version": "6.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "vfile-message",
            "direct": false,
            "version": "4.0.3",
            "ecosystem": "npm"
          },
          {
            "name": "vite",
            "direct": false,
            "version": "5.4.21",
            "ecosystem": "npm"
          },
          {
            "name": "vitepress",
            "direct": false,
            "version": "1.6.4",
            "ecosystem": "npm"
          },
          {
            "name": "vue",
            "direct": false,
            "version": "3.5.33",
            "ecosystem": "npm"
          },
          {
            "name": "zwitch",
            "direct": false,
            "version": "2.0.4",
            "ecosystem": "npm"
          },
          {
            "name": "cakedc/cakephp-phpstan",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/bake",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "cakephp/migrations",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "dereuromark/cakephp-dto",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "dereuromark/cakephp-ide-helper",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "dereuromark/cakephp-templating",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "dereuromark/cakephp-tools",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "fig-r/psr2r-sniffer",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "friendsofcake/search",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "php",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          },
          {
            "name": "phpunit/phpunit",
            "direct": false,
            "version": null,
            "ecosystem": "packagist"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 186,
        "direct_count": 2,
        "indirect_count": 184
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 270,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 202,
        "closed_unmerged_prs": 39
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "dereuromark",
          "commits": 909,
          "avatar_url": "https://avatars.githubusercontent.com/u/39854?v=4"
        },
        {
          "type": "User",
          "login": "LordSimal",
          "commits": 46,
          "avatar_url": "https://avatars.githubusercontent.com/u/9105243?v=4"
        },
        {
          "type": "User",
          "login": "MSeven",
          "commits": 37,
          "avatar_url": "https://avatars.githubusercontent.com/u/31497?v=4"
        },
        {
          "type": "User",
          "login": "inoas",
          "commits": 17,
          "avatar_url": "https://avatars.githubusercontent.com/u/20972207?v=4"
        },
        {
          "type": "User",
          "login": "houseoftech",
          "commits": 14,
          "avatar_url": "https://avatars.githubusercontent.com/u/297458?v=4"
        },
        {
          "type": "User",
          "login": "Graziel",
          "commits": 12,
          "avatar_url": "https://avatars.githubusercontent.com/u/5963584?v=4"
        },
        {
          "type": "User",
          "login": "jiru",
          "commits": 11,
          "avatar_url": "https://avatars.githubusercontent.com/u/5107734?v=4"
        },
        {
          "type": "User",
          "login": "challgren",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/88909?v=4"
        },
        {
          "type": "User",
          "login": "stmeyer",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/10654545?v=4"
        },
        {
          "type": "User",
          "login": "netstyler",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/319755?v=4"
        }
      ],
      "contributors_sampled": 56,
      "top_contributor_share": 0.784
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "deploy-docs.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "phpcs.xml",
        "phpstan.neon"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": 1,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "19 out of 19 merged PRs checked by a CI test -- score normalized to 10",
            "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/29 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 13 contributing companies or organizations",
            "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": 10,
            "reason": "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": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "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": "SAST tool is not run on all commits -- score normalized to 0",
            "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": 6,
            "reason": "4 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "2c1a1bfc69ccb44b62f7f2e2b60f53d4dc2a5399",
        "ran_at": "2026-08-02T12:02:31Z",
        "aggregate_score": 5,
        "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": "2026-08-02T11:55:11Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-08-02T11:53:58Z",
      "ci_last_conclusion": "FAILURE",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dereuromark/cakephp-queue",
    "host": "github.com",
    "name": "cakephp-queue",
    "owner": "dereuromark"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "excellent",
      "name": "Overall health",
      "note": "The weighted overall 76 is calibrated to 90 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 76,
            "calibrated": 90,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 90,
      "inputs": {
        "security": 60,
        "vitality": 92,
        "community": 68,
        "governance": 68,
        "calibration": "2026-08-02",
        "engineering": 94,
        "ai_readiness": 51,
        "weighted_overall_raw": 76
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "commits_last_year": 145,
              "human_commit_share": 0.99,
              "days_since_last_push": 0,
              "active_weeks_last_year": 32
            },
            "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": "32/52 weeks with commits",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 32
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "145 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 145
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "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": 100,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "8.15.1",
              "releases_from_tags": false,
              "days_since_latest_release": 56,
              "mean_days_between_releases": 9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 56 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 56
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 9
                    }
                  }
                ],
                "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": "exceptional",
            "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": 35,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 35 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 35
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "good",
        "name": "Community & Adoption",
        "value": 68,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "forks": 138,
              "stars": 308,
              "watchers": 19,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "308 stars",
                "points": 40.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 308
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "138 forks",
                "points": 17.8,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 138
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "19 watchers",
                "points": 7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "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": 18,
                "status": "met",
                "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": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "packages": [
                "dereuromark/cakephp-queue"
              ],
              "dependents": 16,
              "ecosystems": "packagist",
              "total_downloads": 997463,
              "monthly_downloads": 38799
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "38,799 downloads/month across packagist",
                "points": 61.2,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 38799,
                      "ecosystems": "packagist"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "16 packages depend on it",
                "points": 8.2,
                "status": "partial",
                "details": [
                  {
                    "code": "registry_dependents",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 68,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "weak",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 37,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 56,
              "top_contributor_share": 0.784
            },
            "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 78% of commits",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 78
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "56 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 56
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 78,
            "inputs": {
              "merged_prs": 270,
              "open_issues": 0,
              "closed_issues": 202,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 39,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "270/309 decided PRs merged",
                "points": 26.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 270,
                      "decided": 309
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "good",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "followers": 748,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "dereuromark",
              "public_repos": 123,
              "account_age_days": 6442
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "748 followers of dereuromark",
                "points": 20.7,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 748,
                      "login": "dereuromark"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "123 public repos, account ~17 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 123
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 17
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "dereuromark/cakephp-queue"
              ],
              "ecosystems": "packagist",
              "any_deprecated": false,
              "min_days_since_publish": 56
            },
            "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 56 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 56
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "136 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 136
                    }
                  }
                ],
                "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": "exceptional",
        "name": "Engineering Quality",
        "value": 94,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "phpcs.xml, phpstan.neon",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpcs.xml, phpstan.neon"
                    }
                  }
                ],
                "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": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "19 out of 19 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "asynchronous",
                "background-jobs",
                "cronjob",
                "queue",
                "cakephp",
                "cakephp-plugin",
                "php"
              ],
              "has_wiki": true,
              "homepage": "https://dereuromark.github.io/cakephp-queue/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "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": "https://dereuromark.github.io/cakephp-queue/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "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": "moderate",
        "name": "Security",
        "value": 60,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 5
            },
            "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": "branch protection is not maximal on development and all release branches",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "19 out of 19 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "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/29 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "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": "update tool detected",
                "points": 7.5,
                "status": "met",
                "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "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": "SAST tool is not run on all commits -- score normalized to 0",
                "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": "4 existing vulnerabilities detected",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "exceptional",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 173 resolved dependencies against OSV; 13 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 173
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 13
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 4,
              "affected_packages": 2,
              "assessed_packages": 173,
              "unassessed_packages": 13,
              "affected_by_severity": "high 1, moderate 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 173,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "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"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 13
            },
            "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": "moderate",
        "name": "AI Readiness",
        "value": 51,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 36,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.677,
              "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": "67 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 36.1,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "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": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "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": "phpcs.xml, phpstan.neon",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "phpcs.xml, phpstan.neon"
                    }
                  }
                ],
                "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "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": 37884,
              "source_files_sampled": 161,
              "oversized_source_files": 0
            },
            "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": "0/161 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 161,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "labels": [
        "library"
      ],
      "scores": {
        "plugin": 2,
        "web-ui": 2,
        "library": 6
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:packagist",
          "weight": 6
        },
        {
          "tier": "description",
          "label": "plugin",
          "source": "description:plugin",
          "weight": 2
        },
        {
          "tier": "tags",
          "label": "web-ui",
          "source": "tag:admin-panel",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.3.1"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-02T12:02:54.849037Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dereuromark/cakephp-queue.svg",
  "full_name": "dereuromark/cakephp-queue",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v2.3.1, Schema v0.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenPackagist.