{"name":"main","updatestamp":"2026-09-29T06:22:44.917292Z","head_commit":{"commitid":"bc57753cf4b80e0bd0409000cb91aea28f8275f9","message":"fix: render the backend module in core's layout and theme (#103)\n\nMerging this renders the three backend module views (dashboard, content\nlist, wizard) inside TYPO3 core's module layout, so the doc header with\nits view menu, reload, bookmark and \"View Content\" buttons appears\nagain. Buttons, badges and info boxes switch to core classes that follow\nthe light and dark scheme, and headings no longer skip levels.\n\n## What changed\n\n- `Resources/Private/Layouts/Module.html` is removed. It replaced core's\n`Module` layout, which is the one that renders the doc header; the\ncontroller's menu and buttons were built but never shown. Core's layout\nresolves on 12.4/13.4 (`Module.html`) and 14.3 (`Module.fluid.html`).\n- With the doc header visible, TYPO3 14 showed two reload buttons: 14\nadds reload and shortcut buttons itself and deprecates a manually added\nshortcut button. On 14 the controller now calls `setShortcutContext()`\nand adds neither; 12 and 13 keep the manual buttons.\n`Build/phpstan.neon` gets two version-conditional ignores for that\n`method_exists()` check, next to the existing `IconSize` ones.\n- `btn-outline-primary`/`btn-outline-secondary` (not in core's CSS) and\n`btn-secondary` become `btn-default`.\n- `badge bg-*` becomes `badge badge-*` (`bg-secondary` →\n`badge-default`).\n- Every `.alert` becomes `<f:be.infobox>` with an integer `state`:\nliterals (`-1` info, `0` ok, `1` warning) in the templates, an integer\nfrom the controller for the recommendations. The review measured that\nliterals render the right callout on 12.4, 13.4 and 14.3;\n`InfoboxViewHelper::STATE_*` is deprecated in 14, and 12/13 reject the\n`ContextualFeedbackSeverity` enum with an `InvalidArgumentException`.\n- The controller no longer calls `ButtonBar::makeLinkButton()`,\n`Menu::makeMenuItem()` and `MenuRegistry::makeMenu()`, all deprecated in\n14.0\n([#107823](https://github.com/TYPO3/typo3/blob/v14.3.7/typo3/sysext/core/Documentation/Changelog/14.0/Deprecation-107823-ButtonBarMakeMethods.rst)).\nThe named replacement, `ComponentFactory`, does not exist before 14 and\ncannot be injected while 12.4 and 13.4 are supported. Its\n`createLinkButton()`, `createMenuItem()` and `createMenu()`\n([ComponentFactory.php:261-284 at\nv14.3.7](https://github.com/TYPO3/typo3/blob/v14.3.7/typo3/sysext/backend/Classes/Template/Components/ComponentFactory.php#L261-L284))\nare each one `GeneralUtility::makeInstance()` call, and the `make*()`\nmethods on 12.4.45 and 13.4.35 are the same call. The controller now\ncalls `makeInstance()` for `Menu`, `MenuItem` and `LinkButton` directly,\nwhich the deprecation message itself offers\n([Menu.php:129](https://github.com/TYPO3/typo3/blob/v14.3.7/typo3/sysext/backend/Classes/Template/Components/Menu/Menu.php#L129)).\nIt behaves the same on all three versions, so no version gate is needed.\n- Card titles are `h2.card-title` (core's pattern), nested headings\n`h3`; size classes keep the previous look.\n- Also fixed: `card-header bg-success text-white` on the wizard summary,\n`btn-lg` (absent from core 14), `table-responsive` → core's `table-fit`,\nand the content-list row checkboxes get an `aria-label`.\n- The select-all and row checkboxes sit in `<span class=\"form-check\nform-check-type-toggle\">`, the wrapper core's record list uses\n(`DatabaseRecordList.php`). Core sizes `.form-check-input` only inside a\n`.form-check`, so without it they rendered 0×0 px on 13.4 and 14.3.\n- The view menu gets a label (`menu.label`, \"View\", German \"Ansicht\").\nWithout one it was an unnamed `<select>` on 12 and 13 (axe\n`select-name`) and on 14 a dropdown named after its first entry\n(\"Dashboard: Dashboard\").\n\n## Measurements\n\nBefore: the public demo (`typo3-demo.netresearch.de`, TYPO3 14,\nextension 1.0.0), measured read-only today; the scheme was forced\nclient-side and took effect (frame body `#eceaee` light, `#272630`\ndark). After: local throwaway instances on TYPO3 14.3.7 and 13.4.35 with\nthis branch, because the templates are rendered on the server and cannot\nbe swapped in through request interception. Same measurement scripts\n(axe-core `color-contrast`, computed styles, Tab-key focus probe) on\nboth.\n\n| Finding | View | Scheme | Before (demo, 14) | After (local 14.3.7 /\n13.4.35) |\n|---|---|---|---|---|\n| Doc header missing | all three | both | 0 `.module-docheader` | 14:\nview menu (3 entries), View Content, Reload, Share/bookmark; 13: view\nmenu, View Content, Reload, Share |\n| Filter buttons: no border | Content | light / dark | no border |\n`btn-default` border 2.16 / 2.04 (13: 1.69 / 1.73), same as core's\ndefault buttons |\n| Filter buttons: invisible focus | Content | light / dark | 4px\noutline, alpha 0 (1.0:1) | 4px outline 1.98 / 1.67 against the module\nbody (13: 1.99 / 1.98), core's `btn-default` focus ring |\n| Wizard tile `btn-secondary` | Dashboard | dark | fill vs card 1.81 |\n`btn-default`: text 10.73, border 1.86, fill vs card 1.09 |\n| Badges | Dashboard | dark | `bg-primary` 2.66, `bg-info` 2.02,\n`bg-secondary` 3.28 (local data also: `bg-success` 2.49) | lowest badge\n9.40 |\n| Badges | Dashboard, Content | light | `bg-secondary` 3.73 (local data\nalso: `bg-danger` 4.04) | lowest badge 5.47 |\n| axe `color-contrast` violations | Dashboard / Content | light | 1 / 0\n(local data: 8 / 10) | 0 / 0 on 14 and 13 |\n| axe `color-contrast` violations | Dashboard / Content | dark | 3 / 0\n(local data: 11 / 22) | 0 / 0 on 14 and 13 |\n| Heading skips | Dashboard | both | h1, h5 ×8 | h1, h2 ×6, h3 ×8, h2\n×2, no skip |\n| Heading skips | Wizard (demo: welcome; local: all 5 steps) | both |\nh1, h4 | h1, h2 (and h3 inside), no skip |\n| `.alert` instead of callouts | Dashboard, Content, Wizard | both | 1\n`.alert` per view | 0 `.alert`; `callout callout-info/-warning/-success`\n|\n| Summary header `bg-success text-white` | Wizard summary | both | fixed\ngreen header | plain `card-header` |\n\nReview round 1, measured locally on 12.4.45, 13.4.35 and 14.3.7 before\n(8030c6e) and after, with three harmonizable rows seeded. TYPO3 12 has\nno dark scheme, so its light and dark runs are identical.\n\n| Finding | Version | Before | After (light / dark) |\n|---|---|---|---|\n| Checkbox size | 13.4, 14.3 | 0×0 px, select-all and rows | 16×16,\nvisible, in `form-check form-check-type-toggle` |\n| Checkbox size | 12.4 | 12×12 | 16×16 |\n| Checkbox focus | 13.4 | nothing visible (0×0) | 4px outline, 5.34 /\n2.35 (select-all), 5.26 / 1.98 (row) against the cell |\n| Checkbox focus | 14.3 | nothing visible (0×0) | 4px outline, 6.42 /\n1.57 (select-all), 6.29 / 1.45 (row) |\n| Checkbox focus | 12.4 | 4px box-shadow ring | unchanged (core 12\nstyling) |\n| Checkbox border | 13.4 / 14.3 | – | 1.72 / 1.78 and 2.01 / 1.86\n(select-all) |\n| View menu name | 12.4, 13.4 | combobox without name, axe `select-name`\n1 per view | combobox \"View\", axe `select-name` 0 |\n| View menu name | 14.3 | button \"Dashboard: Dashboard\" | button \"View:\nDashboard\" |\n\nThe checkbox border and the dark-scheme focus ring are core's own\n`.form-check-input` styling and stay below 3:1 in dark; this change\nadopts it rather than overriding it.\n\nOn 12.4 axe reported `color-contrast` 3 / 14 / 1 (dashboard / content /\nwizard) before and after round 1: core 12's `badge-primary` and\n`btn-primary` at 4.34:1, and the dashboard's transitions figure\n(`text-warning`, 56px/300, so large text needing 3:1) at 2.16:1. Review\nround 2 fixed the last one with `text-warning text-warning-emphasis`:\n9.4:1 on 12.4 (dashboard now 2 axe findings, both core 12's 4.34:1\nprimary colour). On 13.4 both classes map to the same colour and 14.3\nhas no `text-warning-emphasis` rule, so those stay unchanged: 13.4 7.46\nlight / 12.23 dark, 14.3 8.36 light / 9.44 dark.\n\nThe demo's content list is empty, so its badge and contrast numbers come\nfrom the dashboard; \"local data\" rows are the same base commit rendered\non the local 14.3.7 instance with seeded temporal records.\n\nThe filter-button border and focus ring stay below 3:1. That is core's\nown `btn-default` styling in 13.4 and 14.3, which this change adopts\nrather than overrides.\n\n## Tests\n\n- `Tests/Unit/Resources/BackendTemplateClassesTest.php` reads the\ntemplate sources: no class outside core's themes, `btn-default` on the\nfilter, tile and wizard buttons, `aria-label` on the row checkboxes, no\nextension `Module.html`. It reads source because `f:link.action` renders\nno `<a>` without a routed module request.\n-\n`Tests/Functional/Controller/Backend/TemporalCacheModuleMarkupTest.php`\nrenders all views and wizard steps: core layout with doc header, no\nfixed-colour classes, badge and callout classes, one h1 and no skipped\nheading level.\n-\n`Tests/Functional/Controller/Backend/TemporalCacheWizardRecommendationTest.php`\nruns with harmonization disabled and seeds 25 daily transitions, so the\nanalysis step renders both recommendations; it asserts the harmonization\none as `callout-warning` and the timing one as `callout-info`. Both\nfunctional classes build their request through\n`BackendModuleRequestTrait`.\n- Each of the 14 new test methods was seen failing: 12 mutations\n(restore the old layout, revert one badge, one filter class, one\nheading, one callout, the checkbox label, the tile class, the summary\nheader, the table wrapper, a wizard button, the summary callout, the\nrecommendation `state`), each restored from a copy checked by sha256.\n- Review round 2 added: a unit test pinning `text-warning\ntext-warning-emphasis` on the transitions figure, and a functional test\nasserting the dashboard's harmonization hint as `callout-info` (one\nharmonizable record seeded at 06:20 UTC). Review round 3: that seed was\nfirst built with `strtotime('tomorrow 06:20')`, which is local time,\nwhile `HarmonizationService` measures slots in UTC; the test failed on\n12.4, 13.4 and 14.3 under `date.timezone=Pacific/Kiritimati` and\n`Europe/Berlin` and passed only because CI runs in UTC. It is now built\nwith a UTC `DateTimeImmutable`, and the functional suite passes under\nPacific/Kiritimati, Europe/Berlin and UTC on all three versions. The\nother `strtotime` seeds in the suite (three in\n`CompleteWorkflowIntegrationTest`) only need a future start time, not a\nslot, and pass in all three timezones. Mutations on all three versions:\ndropping `text-warning-emphasis` fails the unit test; the review's O1\n(hint `state=\"-1\"` → `\"1\"`), which survived before, now fails the new\nfunctional test.\n- Review round 1 added: one reload and one bookmark button in the doc\nheader (one render per test, because core 14 shares the\n`DocHeaderComponent`), the view menu label, the checkbox wrapper,\ninteger infobox states, and `TemporalCacheWizardRecommendationTest`\n(harmonization disabled) for the harmonization recommendation as\n`callout-warning`. Mutations on 12.4, 13.4 and 14.3: the review's R1\n(`if (false)` on the 14 branch) and R3 (no `setShortcutContext()`) now\nfail three doc-header cases on 14.3 and are no-ops on 12/13, where that\nbranch does not run; R2 (WARNING → INFO) fails the recommendation test\non 12.4, 13.4 and 14.3 (13.4 confirmed in round 2), and its mirror on\nthe timing recommendation (INFO → WARNING) on 12.4 and 14.3; removing\neither checkbox wrapper, the menu label, a literal state, or changing\nthe summary state fails a test on all three.\n\nLocal gates, run the way the CI config runs them (PHP 8.4, SQLite,\n`--no-coverage` because the container has no coverage driver):\n\n| TYPO3 | phpstan | unit | functional |\n|---|---|---|---|\n| 12.4.45 | no errors | 371 tests OK | 151 tests OK, 0 deprecations |\n| 13.4.35 | no errors | 371 tests OK | 151 tests OK, 0 deprecations |\n| 14.3.7 | no errors | 371 tests OK | 151 tests OK, 1 deprecation\n(below) |\n\nFunctional run with `--display-deprecations --fail-on-deprecation`:\n12.4.45 and 13.4.35 151 tests OK, no deprecations. On 14.3.7 one\ndeprecation remains, and the run fails on it with that flag (CI does not\nset it): `DocHeaderComponent.php:434`, \"Manually adding ShortcutButton\nto the button bar is deprecated\". It fires only in the two existing\ntests that call `contentAction()` twice in one process\n(`testContentActionPaginatesCorrectly`,\n`testContentActionHandlesBoundaryPagination`). In 14.3.7,\n`DocHeaderComponent` and its `ButtonBar` are shared services\n(`#[Autoconfigure(public: true)]`, DocHeaderComponent.php:66 and\nButtonBar.php:120, obtained with `makeInstance()` in\nModuleTemplate.php:97). The shortcut button core adds during the first\nrender is therefore still in the bar on the second render, where core\ncounts it as manually added (DocHeaderComponent.php:426). A single\nrender per request, as in the backend, does not trigger it. The review's\nprobe confirms this with core classes only (no extension code): two\n`ModuleTemplate`s in one process on 14.3.7 share the same\n`DocHeaderComponent` and `ButtonBar` (reload 1 then 2, shortcut 1 then\n1) and trigger exactly this deprecation; one render gives reload 1,\nshortcut 1 and none. On 13.4.35 the two renders get separate instances.\n`ci:test:php:cgl`, `ci:test:php:rector` and `ci:test:tailor-excludes`\npass on 14.3.7.\n\nThe wizard analysis step with two recommendations (warning and info) was\nalso rendered on the local 13.4.35 and 14.3.7 instances in both schemes:\ntwo callouts, no `.alert`, no exception.\n\n## Not changed\n\n- Outside this PR's scope: `Resources/Private/Layouts/Default.html` is\nnot referenced by any template. It predates this change and has nothing\nto do with theming, so it is left in place.\n- The timeline keeps Bootstrap `border-success`/`border-danger` stripes;\nthe badge next to each entry carries the same information.\n\n_Assisted by claude-code:claude-opus-5-5 —\n[Session](https://claude.ai/code/session_01UD65iriF3X73Z2U1CvME3d)_","timestamp":"2026-09-29T05:56:58Z","ci_passed":true,"author":{"service":"github","username":"CybotTM","name":"Sebastian Mendel"},"branch":"main","totals":{"files":29,"lines":2754,"hits":2382,"misses":372,"partials":0,"coverage":86.49,"branches":0,"methods":230,"sessions":22,"complexity":706.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0},"state":"complete","parent":"67ea5fa16d22ee1feb025b518aa3ba0abb542345","report":{"totals":{"files":29,"lines":2754,"hits":2382,"misses":372,"partials":0,"coverage":86.49,"branches":0,"methods":230,"messages":0,"sessions":22,"complexity":706.0,"complexity_total":0.0,"complexity_ratio":0,"diff":[1,25,24,1,0,"96.00000",0,0,0,0,0,0,0]},"files":[{"name":"Classes/Command/AnalyzeCommand.php","totals":{"files":0,"lines":166,"hits":122,"misses":44,"partials":0,"coverage":73.49,"branches":0,"methods":7,"messages":0,"sessions":0,"complexity":29.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Command/HarmonizeCommand.php","totals":{"files":0,"lines":213,"hits":127,"misses":86,"partials":0,"coverage":59.62,"branches":0,"methods":7,"messages":0,"sessions":0,"complexity":42.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Command/ListCommand.php","totals":{"files":0,"lines":205,"hits":196,"misses":9,"partials":0,"coverage":95.6,"branches":0,"methods":10,"messages":0,"sessions":0,"complexity":66.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Command/VerifyCommand.php","totals":{"files":0,"lines":194,"hits":177,"misses":17,"partials":0,"coverage":91.23,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":52.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Configuration/ExtensionConfiguration.php","totals":{"files":0,"lines":74,"hits":74,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":16,"messages":0,"sessions":0,"complexity":19.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Controller/Backend/TemporalCacheController.php","totals":{"files":0,"lines":264,"hits":235,"misses":29,"partials":0,"coverage":89.01,"branches":0,"methods":13,"messages":0,"sessions":0,"complexity":51.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Domain/Model/TemporalContent.php","totals":{"files":0,"lines":28,"hits":28,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":20.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Domain/Model/TransitionEvent.php","totals":{"files":0,"lines":17,"hits":17,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":4,"messages":0,"sessions":0,"complexity":5.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Domain/Repository/TemporalContentRepository.php","totals":{"files":0,"lines":333,"hits":243,"misses":90,"partials":0,"coverage":72.97,"branches":0,"methods":18,"messages":0,"sessions":0,"complexity":69.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/EventListener/TemporalCacheLifetime.php","totals":{"files":0,"lines":39,"hits":38,"misses":1,"partials":0,"coverage":97.43,"branches":0,"methods":5,"messages":0,"sessions":0,"complexity":12.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Report/TemporalCacheStatusReport.php","totals":{"files":0,"lines":272,"hits":261,"misses":11,"partials":0,"coverage":95.95,"branches":0,"methods":13,"messages":0,"sessions":0,"complexity":60.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Backend/HarmonizationAnalysisService.php","totals":{"files":0,"lines":115,"hits":107,"misses":8,"partials":0,"coverage":93.04,"branches":0,"methods":6,"messages":0,"sessions":0,"complexity":38.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Backend/PermissionService.php","totals":{"files":0,"lines":49,"hits":49,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":17.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Backend/TemporalCacheStatisticsService.php","totals":{"files":0,"lines":93,"hits":93,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":6,"messages":0,"sessions":0,"complexity":16.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Cache/TransitionCache.php","totals":{"files":0,"lines":20,"hits":20,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":6,"messages":0,"sessions":0,"complexity":7.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/HarmonizationService.php","totals":{"files":0,"lines":201,"hits":192,"misses":9,"partials":0,"coverage":95.52,"branches":0,"methods":13,"messages":0,"sessions":0,"complexity":52.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/RefindexService.php","totals":{"files":0,"lines":146,"hits":146,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":27.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Scoping/GlobalScopingStrategy.php","totals":{"files":0,"lines":10,"hits":10,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":4,"messages":0,"sessions":0,"complexity":4.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Scoping/PerContentScopingStrategy.php","totals":{"files":0,"lines":26,"hits":21,"misses":5,"partials":0,"coverage":80.76,"branches":0,"methods":5,"messages":0,"sessions":0,"complexity":9.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Scoping/PerPageScopingStrategy.php","totals":{"files":0,"lines":18,"hits":17,"misses":1,"partials":0,"coverage":94.44,"branches":0,"methods":4,"messages":0,"sessions":0,"complexity":7.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Scoping/ResolvesContextAspects.php","totals":{"files":0,"lines":8,"hits":8,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":2,"messages":0,"sessions":0,"complexity":2.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Scoping/ScopingStrategyFactory.php","totals":{"files":0,"lines":13,"hits":11,"misses":2,"partials":0,"coverage":84.61,"branches":0,"methods":5,"messages":0,"sessions":0,"complexity":5.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/SelectsNamedStrategy.php","totals":{"files":0,"lines":7,"hits":7,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":1,"messages":0,"sessions":0,"complexity":3.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/TemporalMonitorRegistry.php","totals":{"files":0,"lines":32,"hits":32,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":9,"messages":0,"sessions":0,"complexity":15.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Timing/DynamicTimingStrategy.php","totals":{"files":0,"lines":19,"hits":19,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":5,"messages":0,"sessions":0,"complexity":8.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Timing/HybridTimingStrategy.php","totals":{"files":0,"lines":29,"hits":29,"misses":0,"partials":0,"coverage":100.0,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":15.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Timing/SchedulerTimingStrategy.php","totals":{"files":0,"lines":34,"hits":18,"misses":16,"partials":0,"coverage":52.94,"branches":0,"methods":8,"messages":0,"sessions":0,"complexity":12.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Service/Timing/TimingStrategyFactory.php","totals":{"files":0,"lines":15,"hits":9,"misses":6,"partials":0,"coverage":60.0,"branches":0,"methods":6,"messages":0,"sessions":0,"complexity":6.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}},{"name":"Classes/Task/TemporalCacheSchedulerTask.php","totals":{"files":0,"lines":114,"hits":76,"misses":38,"partials":0,"coverage":66.66,"branches":0,"methods":17,"messages":0,"sessions":0,"complexity":38.0,"complexity_total":0.0,"complexity_ratio":0,"diff":0}}]}}}