<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: puppet</title>
    <description>The latest articles tagged 'puppet' on DEV Community.</description>
    <link>https://dev.to/t/puppet</link>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tag/puppet"/>
    <language>en</language>
    <item>
      <title>Your AI makes decisions. We make sure every data move obeys the law. Try the demo at viradotech.com and give us your honest take.</title>
      <dc:creator>virgiljunioradoleyine-stack</dc:creator>
      <pubDate>Sat, 22 Aug 2026 16:38:09 +0000</pubDate>
      <link>https://dev.to/viradotech/your-ai-makes-decisions-we-make-sure-every-data-move-obeys-the-law-try-the-demo-at-viradotechcom-2l95</link>
      <guid>https://dev.to/viradotech/your-ai-makes-decisions-we-make-sure-every-data-move-obeys-the-law-try-the-demo-at-viradotechcom-2l95</guid>
      <description></description>
      <category>ai</category>
      <category>productivity</category>
      <category>puppet</category>
    </item>
    <item>
      <title>Puppet Core 9.0 and 8.21 Released: Ruby 4.0, OpenSSL 3.5, Platform Changes, and Security Hardening</title>
      <dc:creator>Jason St-Cyr</dc:creator>
      <pubDate>Thu, 20 Aug 2026 15:26:21 +0000</pubDate>
      <link>https://dev.to/puppet/puppet-core-90-and-821-released-ruby-40-openssl-35-platform-changes-and-security-hardening-4294</link>
      <guid>https://dev.to/puppet/puppet-core-90-and-821-released-ruby-40-openssl-35-platform-changes-and-security-hardening-4294</guid>
      <description>&lt;p&gt;Did you know there's a new major version in town for Puppet Core? You might have heard about it through the grapevine or in the &lt;a href="https://www.puppet.com/resources/events/webinars/puppet-9" rel="noopener noreferrer"&gt;Are You Ready for Puppet 9?&lt;/a&gt; webinar that &lt;a class="mentioned-user" href="https://dev.to/gpatton"&gt;@gpatton&lt;/a&gt; and I recently hosted. The wait is over and Puppet Core 9.0.0 is now available alongside Puppet Core 8.21.0.&lt;/p&gt;

&lt;p&gt;Puppet Core 9 introduces significant runtime and platform changes, moving to Ruby 4.0, OpenSSL 3.5, and other changes, but the essential Puppet under the hood is largely unchanged from Puppet 8. The majority of upgrade effort will center on Ruby 4 compatibility and runtime dependency changes rather than Puppet language changes.&lt;/p&gt;

&lt;p&gt;If you are staying on the Puppet Core 8.x release track, the latest Puppet Core 8.21 delivers the basic support fixes and security improvements you might need without the major dependency changes found in Puppet Core 9.&lt;/p&gt;

&lt;h2&gt;
  
  
  What matters most for the admins
&lt;/h2&gt;

&lt;p&gt;Before upgrading to Puppet Core 9:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test custom facts, functions, types, and providers against Ruby 4.0.&lt;/li&gt;
&lt;li&gt;Validate any Forge modules you use for Ruby 4 compatibility.&lt;/li&gt;
&lt;li&gt;Review integrations that depend on OpenSSL behavior.&lt;/li&gt;
&lt;li&gt;Verify any workflows that still rely on SHA-1.&lt;/li&gt;
&lt;li&gt;Confirm managed nodes are running supported operating systems.&lt;/li&gt;
&lt;li&gt;Review any custom code that depends on PSON or &lt;code&gt;multi_json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check deferred function behavior if you have custom types or providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perforce will be rolling out updates to Puppetlabs modules on the Forge based on their &lt;a href="https://dev.to/puppet/puppetlabs-modules-now-have-tiered-review-cycles-42ob"&gt;priority tier&lt;/a&gt; and dependencies. The first batch of these should be rolling out soon.&lt;/p&gt;




&lt;h2&gt;
  
  
  Puppet Core 9.0 highlights
&lt;/h2&gt;

&lt;p&gt;These are a few highlights I pulled from the release notes. Make sure to reference the &lt;a href="https://help.puppet.com/core/current/Content/PuppetCore/PuppetReleaseNotes/release_notes_puppet_x-9-0-0.htm" rel="noopener noreferrer"&gt;full 9.0 release notes&lt;/a&gt; to get all the details about what has changed!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ruby updated to 4.0.5:&lt;/strong&gt; With a new Ruby baseline some deprecated syntax from older Ruby versions will no longer be compatible. This is the primary focus area for upgrades as you will want to validate your custom code and modules. The latest &lt;a href="https://help.puppet.com/pdk/current/topics/release_notes_pdk.htm#PDK380" rel="noopener noreferrer"&gt;PDK 3.8.0&lt;/a&gt; introduced some Ruby 4 validators to help you update your syntax while you are still on Puppet Core 8, before upgrading to Puppet Core 9. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenSSL updated to 3.5.7:&lt;/strong&gt; This lays the groundwork for supporting post-quantum cryptography (PQC) and moves to TLS 1.3 as the default protocol version. This upgrade will resolve several OpenSSL-related CVEs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Puppet Server has updated baseline components:&lt;/strong&gt; As part of the move to JRuby 10.1, Puppet Server is now updated to require minimum JDK 21. The embedded web server is now using Jetty 12. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PSON support removed:&lt;/strong&gt; You will need to migrate to a supported data format if your code has relied on PSON.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deferred functions return to Puppet 7 behavior:&lt;/strong&gt; While Puppet Core 9 largely keeps the same underlying behavior as Puppet Core 8.x, there is one change worth noting about deferred functions. In older versions (like Puppet 7), &lt;code&gt;preprocess_deferred&lt;/code&gt; was enabled by default, but this was disabled by default in Puppet 8. In Puppet Core 9, &lt;code&gt;preprocess_deferred&lt;/code&gt; is now enabled by default again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UTF-8 encoding now used on Windows:&lt;/strong&gt; Puppet Core now uses UTF-8 as the default external encoding on Windows. You will want to look for any configuration files encoded in non-UTF-8 before upgrading.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are just some highlights I pulled from the full list, I really recommend taking a look at the release notes to get a full picture.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security hardening
&lt;/h2&gt;

&lt;p&gt;Both the 9.0 and 8.21 releases contain security-related fixes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stricter SSH key validation:&lt;/strong&gt; Puppet now rejects malformed SSH keys that previously passed validation. This includes invalid inputs such as embedded newline characters. The goal is to prevent unsafe content from being written to managed files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improved autoloader validation:&lt;/strong&gt; The &lt;code&gt;puppet resource&lt;/code&gt; command now performs stricter validation of autoloader inputs. This change helps prevent unintended code loading through user-controlled values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;curl updated to 8.21.0:&lt;/strong&gt; Both Puppet Core 9.0 and Puppet Core 8.21 update curl from 8.20.0 to 8.21.0. The update addresses numerous curl CVEs. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Admins who track dependency risk should review the release notes for the complete CVE list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/core/current/Content/PuppetCore/PuppetReleaseNotes/release_notes_puppet_x-9-0-0.htm" rel="noopener noreferrer"&gt;Puppet Core 9.0 Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/core/8/Content/PuppetCore/PuppetReleaseNotes/release_notes_puppet_x-8-21-0.htm" rel="noopener noreferrer"&gt;Puppet Core 8.21 Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Platform updates
&lt;/h2&gt;

&lt;h3&gt;
  
  
  New agent platforms
&lt;/h3&gt;

&lt;p&gt;The following agent platforms are now supported in both Puppet Core 9.0 and 8.21:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rocky Linux 10 (x86_64)&lt;/li&gt;
&lt;li&gt;Alma Linux 10 (x86_64)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operating systems removed from support
&lt;/h3&gt;

&lt;p&gt;Several end-of-life operating systems have been removed: Debian 10, macOS 13, RHEL 7, Ubuntu 18.04 and 20.04, and others. &lt;/p&gt;

&lt;p&gt;The official full list is &lt;a href="https://help.puppet.com/core/current/Content/PuppetCore/PuppetReleaseNotes/release_notes_puppet_x-9-0-0.htm#Deprecations" rel="noopener noreferrer"&gt;in the docs&lt;/a&gt;. The list in this article is not complete, so make sure to reference those notes to check your systems! &lt;/p&gt;

&lt;p&gt;If you need to keep using a platform that has been removed you should know there is an extended support option. Migrating to a more modern OS is likely the best path, but if you can't migrate just yet, make sure to &lt;a href="https://www.puppet.com/extended-agent-support" rel="noopener noreferrer"&gt;reach out to the team to get help with extended platform support&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Upgrade resources
&lt;/h2&gt;

&lt;p&gt;Before moving to Puppet Core 9, review the official upgrade documentation and release notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/core/current/Content/PuppetCore/upgrading-from-puppet8-to-puppet9.htm" rel="noopener noreferrer"&gt;Puppet Core 9 upgrade documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/core/current/Content/PuppetCore/PuppetReleaseNotes/release_notes_puppet_x-9-0-0.htm" rel="noopener noreferrer"&gt;Puppet Core 9.0.0 release notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/core/8/Content/PuppetCore/PuppetReleaseNotes/release_notes_puppet_x-8-21-0.htm" rel="noopener noreferrer"&gt;Puppet Core 8.21.0 release notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.puppet.com/products/puppet-core/support-lifecycle" rel="noopener noreferrer"&gt;Puppet Core platform support lifecycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/pdk/current/topics/release_notes_pdk.htm#PDK380" rel="noopener noreferrer"&gt;PDK 3.8.0 compatibility testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Make sure to start your Puppet Core 9 compatibility testing early and send over any questions as you encounter issues so that the team can help!&lt;/p&gt;

</description>
      <category>puppet</category>
      <category>devops</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>Why Healthcare Software Needs a Different QA Bar Than Everything Else You've Built</title>
      <dc:creator>Ayushi Kumari</dc:creator>
      <pubDate>Tue, 18 Aug 2026 06:56:13 +0000</pubDate>
      <link>https://dev.to/ayushi_kumari_22cee92b18f/why-healthcare-software-needs-a-different-qa-bar-than-everything-else-youve-built-2nc0</link>
      <guid>https://dev.to/ayushi_kumari_22cee92b18f/why-healthcare-software-needs-a-different-qa-bar-than-everything-else-youve-built-2nc0</guid>
      <description>&lt;p&gt;Most engineers carry an intuitive sense of "good enough" QA from whatever domain they cut their teeth in — e-commerce, SaaS dashboards, internal tools. That instinct is dangerous the moment it gets applied unchanged to healthcare software, where the cost of a subtle bug isn't a support ticket or a refund. It can be a missed medication interaction, a delayed diagnosis, or a compliance violation with real legal consequences.&lt;/p&gt;

&lt;p&gt;Here's what actually has to change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Failure Modes Are Categorically Different&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a typical SaaS product, a bug that shows a stale number on a dashboard is annoying. In a system tracking medication dosages, a stale or incorrectly calculated number can directly affect patient safety. The same class of bug — a caching issue, a rounding error, a race condition in concurrent writes — carries a wildly different severity depending on what data it touches.&lt;/p&gt;

&lt;p&gt;This means healthcare QA can't treat all features equally. A cosmetic UI bug on a marketing page and a calculation bug in a dosage calculator are not the same priority tier, even if they'd be treated similarly in a typical product backlog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge Cases Aren't Edge Cases — They're Tuesday&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Healthcare data is messier than most systems are designed to expect. Patient records have missing fields because the information genuinely wasn't available at intake. Names have characters that break naive string validation. A single patient might have multiple records that need to be reconciled, or duplicate entries that shouldn't be merged automatically. What would be a rare edge case in a typical CRUD app is routine, everyday data in a clinical system.&lt;/p&gt;

&lt;p&gt;QA for healthcare software has to actively hunt for these patterns rather than treating them as improbable inputs unlikely to matter — because in this domain, they're the normal case, not the exception.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compliance Isn't a Separate Checklist — It's a Testing Requirement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;HIPAA (or equivalent regional regulations) isn't just a legal document to review once during planning. It has direct, testable implications: who can access which records, how access is logged, how long data is retained, what happens when a record needs to be permanently deleted versus archived. These aren't features to build and forget — they're behaviors that need explicit test coverage, the same way a payment flow needs test coverage for its critical paths.&lt;/p&gt;

&lt;p&gt;A permissions bug that lets the wrong role view a patient record isn't a minor defect in this context. It's a reportable incident with real regulatory consequences, which changes how much test coverage that logic actually deserves relative to a typical feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Concurrency Bugs Have Higher Stakes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multiple clinicians updating the same patient record simultaneously — a nurse logging vitals while a doctor updates a treatment plan — is a routine occurrence in clinical settings, not a rare race condition. Systems that haven't been explicitly tested for concurrent writes to the same record can silently lose or overwrite critical updates, and because the failure is silent, it might not surface until someone notices a treatment plan doesn't match what was actually decided.&lt;/p&gt;

&lt;p&gt;This makes concurrency testing a first-class requirement rather than something addressed only if it happens to surface during normal testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit Trails Need Their Own Test Suite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Beyond the primary feature working correctly, healthcare systems typically need to prove who did what, when — an audit trail robust enough to hold up under regulatory review. It's not enough for the audit log to usually capture changes; gaps in the audit trail can themselves become a compliance finding, independent of whether the underlying feature worked correctly. This means the audit logging mechanism needs dedicated test coverage, not an assumption that it'll work because the primary code path was thoroughly tested.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Practical Shift in QA Priorities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Compared to a typical SaaS QA process, healthcare software QA generally needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Explicit test coverage for permission boundaries, not just functional correctness&lt;/li&gt;
&lt;li&gt;Deliberate testing of messy, incomplete, and duplicate data, treated as the expected case rather than an edge case&lt;/li&gt;
&lt;li&gt;Concurrency testing on any record multiple roles can update simultaneously&lt;/li&gt;
&lt;li&gt;Dedicated tests for audit trail completeness, separate from tests of the feature the audit trail is logging&lt;/li&gt;
&lt;li&gt;A severity framework that weights patient-safety-adjacent bugs above cosmetic or convenience bugs, even when they'd rank similarly by engineering complexity alone&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The Takeaway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The technical skills required for healthcare software aren't fundamentally different from any other domain — the discipline around testing priorities and failure-mode awareness is what actually shifts. Teams that bring a generic SaaS QA mindset into healthcare software tend to catch the bugs that would matter anywhere and miss the ones that matter specifically because of what's at stake here. Getting this right usually means building with a development partner that's specifically experienced in healthcare software, not just competent engineering applied without domain context.&lt;/p&gt;

&lt;p&gt;Anchor text used above: "a development partner that's specifically experienced in healthcare software" → links to &lt;a href="https://www.weboraz.com/industries/healthcare" rel="noopener noreferrer"&gt;https://www.weboraz.com/industries/healthcare&lt;/a&gt;&lt;/p&gt;

</description>
      <category>healthcare</category>
      <category>qa</category>
      <category>softwareengineering</category>
      <category>puppet</category>
    </item>
    <item>
      <title>PDK 3.8.0 now has Ruby validation to prepare for Puppet 9!</title>
      <dc:creator>Jason St-Cyr</dc:creator>
      <pubDate>Tue, 11 Aug 2026 12:53:45 +0000</pubDate>
      <link>https://dev.to/puppet/pdk-380-now-has-ruby-validation-to-prepare-for-puppet-9-2ici</link>
      <guid>https://dev.to/puppet/pdk-380-now-has-ruby-validation-to-prepare-for-puppet-9-2ici</guid>
      <description>&lt;p&gt;A new release is out for the Puppet Development Kit and it has some new additions like Debian 13 support, some security-related updates, and some new validation for Ruby syntax to help you get yourself ready for Puppet Core 9!&lt;/p&gt;

&lt;p&gt;The next releases of Puppet Core 9 and Puppet Enterprise 2026, due out soon, will be moving to Ruby 4. To help you get ready, you can start using this new version of PDK on your Puppet 8 installation to look for areas that might need updates.&lt;/p&gt;

&lt;p&gt;When you run &lt;code&gt;pdk validate&lt;/code&gt;, it can now identify changes you can make that will be safe to run on Puppet 8, but also will prepare your codebase for Puppet Core 9:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code that uses legacy Ruby Hash#inspect formatting, for example &lt;code&gt;{:x=&amp;gt;1, "baz"=&amp;gt;3}&lt;/code&gt; . Legacy formatting can cause module code to fail after you upgrade to Puppet Core 9.&lt;/li&gt;
&lt;li&gt;Ruby 4 syntax compatibility checks.&lt;/li&gt;
&lt;li&gt;The Security/Open Rubocop flags Ruby patterns associated with &lt;code&gt;Kernel#open&lt;/code&gt; and &lt;code&gt;IO.open&lt;/code&gt; invocation that are no longer valid in Ruby 4. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once Puppet Core 9 is out, you'll be able to do additional validation, but this should help you get started finding those places where the syntax might need some updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full release notes:&lt;/strong&gt; &lt;a href="https://help.puppet.com/pdk/current/topics/release_notes_pdk.htm#PDK380" rel="noopener noreferrer"&gt;https://help.puppet.com/pdk/current/topics/release_notes_pdk.htm#PDK380&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download PDK:&lt;/strong&gt; &lt;a href="https://forge.puppet.com/resources/pdk" rel="noopener noreferrer"&gt;https://forge.puppet.com/resources/pdk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>puppet</category>
    </item>
    <item>
      <title>Vox Pupuli Container Statistics</title>
      <dc:creator>Robert Waffen</dc:creator>
      <pubDate>Sat, 08 Aug 2026 11:13:05 +0000</pubDate>
      <link>https://dev.to/voxpupuli/vox-pupuli-container-statistics-ph3</link>
      <guid>https://dev.to/voxpupuli/vox-pupuli-container-statistics-ph3</guid>
      <description>&lt;p&gt;Hello everyone! &lt;br&gt;
I am excited to share some updates regarding container statistics.&lt;/p&gt;

&lt;p&gt;We now have a page where we display the statistics for all our containers.&lt;br&gt;
You can find it at &lt;a href="https://voxpupuli.org/container_statistics/" rel="noopener noreferrer"&gt;https://voxpupuli.org/container_statistics/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is built from &lt;a href="https://github.com/voxpupuli/container_statistics" rel="noopener noreferrer"&gt;https://github.com/voxpupuli/container_statistics&lt;/a&gt; and is updated every 24 hours.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting the Downloads
&lt;/h2&gt;

&lt;p&gt;For the download count, it scrapes the package HTML pages for the containers.&lt;br&gt;
Sadly, this does not work with GraphQL or the API, so we have to use the HTML pages for now.&lt;br&gt;
GraphQL and the API do expose a download count, but it is only for GitHub's legacy container system and not for ghcr.io &lt;code&gt;¯\_(ツ)_/¯&lt;/code&gt;.&lt;br&gt;
If someone has an idea for a better way to get the download count from ghcr.io, please let me know.&lt;br&gt;
The API is not very talkative about this :/&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting the CVEs
&lt;/h2&gt;

&lt;p&gt;For CVEs, we run two scanners: the wildly popular Trivy scanner and Grype from Anchore.&lt;br&gt;
Both are run against the latest version of each container, and the results are displayed on the statistics page.&lt;br&gt;
For Grype, we downplay the nvd/cpe entries, as they tend to be false positives.&lt;br&gt;
They are still displayed, but specifically marked as nvd/cpe entries, so you can filter them out if you want to.&lt;/p&gt;
&lt;h2&gt;
  
  
  How the statistics are generated
&lt;/h2&gt;

&lt;p&gt;The statistics can be generated by running the &lt;code&gt;bin/container-statistics&lt;/code&gt; script in the container_statistics repository.&lt;br&gt;
It needs a configuration file, which is located in the &lt;code&gt;config&lt;/code&gt; directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openvoxproject/openbolt&lt;/span&gt;
    &lt;span class="na"&gt;registry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openvoxproject/openvoxagent&lt;/span&gt;
    &lt;span class="na"&gt;registry&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;latest&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We run it in GitHub Actions and push the results to the gh-pages branch, which is then displayed on the statistics page.&lt;br&gt;
Scanning is also done in GitHub Actions.&lt;br&gt;
The whole process is automated and runs every 24 hours, so the statistics are always up to date.&lt;br&gt;
See the GitHub Actions workflow in the container_statistics repository (&lt;a href="https://github.com/voxpupuli/container_statistics/blob/main/.github/workflows/container-statistics.yml" rel="noopener noreferrer"&gt;.github/workflows/container-statistics.yml&lt;/a&gt;) for more details.&lt;/p&gt;

&lt;p&gt;You can run it locally and generate the statistics yourself.&lt;br&gt;
You will need to have the scanners installed and available in your path.&lt;/p&gt;
&lt;h2&gt;
  
  
  CLI Commands
&lt;/h2&gt;
&lt;h3&gt;
  
  
  bin/container-statistics --download-report
&lt;/h3&gt;

&lt;p&gt;This will display the downloads for all containers in a table format.&lt;br&gt;
This will live-scrape the HTML pages for the containers, so it might take a while to run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;bin/container-statistics --download-report

CONTAINER                             TOTAL DOWNLOADS
------------------------------------  ---------------
ghcr.io/openvoxproject/openbolt                 1,504
ghcr.io/openvoxproject/openvoxagent            11,814
ghcr.io/openvoxproject/openvoxdb              157,774
ghcr.io/openvoxproject/openvoxserver          151,344
ghcr.io/voxpupuli/commitlint                      756
ghcr.io/voxpupuli/onceover                      4,248
ghcr.io/voxpupuli/r10k-webhook                  7,738
ghcr.io/voxpupuli/r10k                         22,548
ghcr.io/voxpupuli/renovate                      5,551
ghcr.io/voxpupuli/semantic-release              7,870
ghcr.io/voxpupuli/voxbox                      131,841
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  bin/container-statistics --cve-report
&lt;/h3&gt;

&lt;p&gt;This will display the CVEs for all containers in a table format.&lt;br&gt;
It depends on the scanners being installed and having been run at least once, so that the results are available in the cache.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;bin/container-statistics --cve-report
CONTAINER                                           CRITICAL  HIGH  MEDIUM  LOW  UNKNOWN  TOTAL
--------------------------------------------------  --------  ----  ------  ---  -------  -----
ghcr.io/openvoxproject/openbolt:latest                     1     4       2    1        -      8
ghcr.io/openvoxproject/openvoxagent:latest                 -     7      58    7        2     74
ghcr.io/openvoxproject/openvoxdb:latest                    -     6      79    9        2     96
ghcr.io/openvoxproject/openvoxdb:latest-alpine             -     1       -    -        -      1
ghcr.io/openvoxproject/openvoxserver:latest                2    49     634  100        4    789
ghcr.io/openvoxproject/openvoxserver:latest-alpine         -     1       -    -        -      1
ghcr.io/voxpupuli/commitlint:latest                        1     6       5    2        -     14
ghcr.io/voxpupuli/onceover:latest                          1     4       2    1        -      8
ghcr.io/voxpupuli/r10k-webhook:latest                      3    41      35    2        7     88
ghcr.io/voxpupuli/r10k:latest                              -     8       5    -        1     14
ghcr.io/voxpupuli/renovate:latest                          -     1       -    -        -      1
ghcr.io/voxpupuli/semantic-release:latest                  1     6       8    2        -     17
ghcr.io/voxpupuli/voxbox:latest                            -     -       -    -        -      -
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First published at: &lt;a href="https://voxpupuli.org/blog/2026/08/07/container-statistics/" rel="noopener noreferrer"&gt;https://voxpupuli.org/blog/2026/08/07/container-statistics/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>containers</category>
      <category>voxpupuli</category>
      <category>openvox</category>
      <category>puppet</category>
    </item>
    <item>
      <title>Puppetlabs Modules Roundup - July 2026</title>
      <dc:creator>Jason St-Cyr</dc:creator>
      <pubDate>Thu, 06 Aug 2026 12:19:41 +0000</pubDate>
      <link>https://dev.to/puppet/puppetlabs-modules-roundup-july-2026-3325</link>
      <guid>https://dev.to/puppet/puppetlabs-modules-roundup-july-2026-3325</guid>
      <description>&lt;p&gt;July 2026 brought 17 Puppetlabs module releases, headlined by a fairly large Continuous Delivery release. cd4peadm 5.16.0 added external PostgreSQL database support and a configurable image pull policy, and closes 11 CVEs, alongside a breaking change to commit status contexts. More modules dropped Puppet 7 support, some others picked up stdlib 10, and Windows Server 2025 support started rolling out into the modules. This roundup pulls the most important changes into one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Highlighted Updates
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Continuous Delivery Adds External Databases, Configurable Image Pull Policies, and Closes 11 CVEs
&lt;/h3&gt;

&lt;p&gt;cd4peadm 5.16.0 is the biggest release of the month. It adds support for pointing Continuous Delivery at an externally managed PostgreSQL database. That could be a self-managed instance, Amazon RDS for PostgreSQL, or Amazon Aurora. This externally managed db can be used instead of the database CD manages internally, giving operators control over durability, backups, and high availability. It also adds a configurable &lt;code&gt;image_pull_policy&lt;/code&gt; option for job templates (&lt;code&gt;Always&lt;/code&gt;/&lt;code&gt;IfNotPresent&lt;/code&gt;/&lt;code&gt;Never&lt;/code&gt;) and removes the &lt;code&gt;docker.io&lt;/code&gt; fallback when using Podman; the matching cd4pe_jobs 1.7.4 release adds the same task parameter and fallback removal, so upgrade both together.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;BREAKING:&lt;/strong&gt; Commit status contexts now include the pipeline name (&lt;code&gt;cd-pe/&amp;lt;pipelineName&amp;gt;/stage-&amp;lt;N&amp;gt;&lt;/code&gt; instead of &lt;code&gt;cd-pe/stage-&amp;lt;N&amp;gt;&lt;/code&gt;). Review any branch protection rules or required status checks that reference the old format.&lt;/li&gt;
&lt;li&gt;This release also closed 11 CVEs across opentelemetry, NGINX, jetty, jackson, log4j, postgresql, golang.org/x/sys, and react-router.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Puppet 7 Support Dropped
&lt;/h3&gt;

&lt;p&gt;Five modules dropped Puppet 7 support in major version bumps: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;haproxy, iis, mount_iso, scheduled_task, sslcertificate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were all released as major version bumps to ensure that users still working on upgrading from Puppet 7 can stay pinned on the previous major version releases. &lt;/p&gt;

&lt;p&gt;In related news, postgresql 10.6.3 restored the Puppet 7 support that 10.6.2 broke in a previous release; see its entry below.&lt;/p&gt;

&lt;h3&gt;
  
  
  stdlib 10.x Rollout Continues
&lt;/h3&gt;

&lt;p&gt;Following June's stdlib 10.x rollout, four more modules now allow the puppetlabs-stdlib dependency to move to 10.x: haproxy, mount_iso, puppet_authorization, and sslcertificate. haproxy also widens its concat constraint to 10.x.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Affected modules: haproxy, mount_iso, puppet_authorization, sslcertificate.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Windows Server 2025 Support Added
&lt;/h3&gt;

&lt;p&gt;Three Windows-focused modules added support for Windows Server 2025 this month: scheduled_task, windows_env, and windows_eventlog. These now all run acceptance testing against the 2025 version of the OS, in addition to other supported Windows versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Updates Happened to Puppetlabs Modules in July 2026?
&lt;/h2&gt;

&lt;p&gt;The following is an alphabetical listing of modules which received updates in July 2026. If a module had multiple versions released, the updates are collected together, numbered with the "latest" version available.&lt;/p&gt;




&lt;h3&gt;
  
  
  apache 13.3.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-23 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/apache" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Added OWASP CRS v4 support on modern Enterprise Linux (EL10) while preserving existing EL7/8/9 behaviour.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(MODULES-11857) Scaffold OWASP CRS v4 support on EL10 via crs_source enum &lt;a href="https://github.com/puppetlabs/puppetlabs-apache/pull/2637" rel="noopener noreferrer"&gt;#2637&lt;/a&gt; (&lt;a href="https://github.com/SugatD" rel="noopener noreferrer"&gt;SugatD&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  cd4pe_jobs 1.7.4
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-28 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/cd4pe_jobs" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Adds the same configurable &lt;code&gt;image_pull_policy&lt;/code&gt; task parameter and Podman fallback removal shipping in cd4peadm 5.16.0 — upgrade both together to get matching behavior.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A new optional &lt;code&gt;image_pull_policy&lt;/code&gt; task parameter controls whether the container image is pulled before a job runs: &lt;code&gt;Always&lt;/code&gt; (the default, and the previous behavior) pulls on every run; &lt;code&gt;IfNotPresent&lt;/code&gt; pulls only when the image is absent from the local runtime; &lt;code&gt;Never&lt;/code&gt; skips the pull entirely and relies on the locally present image. Presence is checked with &lt;code&gt;docker image inspect&lt;/code&gt; / &lt;code&gt;podman image exists&lt;/code&gt;. Omitting the parameter keeps the existing pull-every-run behavior.&lt;/li&gt;
&lt;li&gt;The module no longer retries a failed image pull against &lt;code&gt;docker.io&lt;/code&gt;. Image names are now pulled exactly as given. If you rely on unqualified image names (e.g. &lt;code&gt;nginx&lt;/code&gt;, &lt;code&gt;myuser/myimage&lt;/code&gt;) on a Podman host, add &lt;code&gt;docker.io&lt;/code&gt; to &lt;code&gt;unqualified-search-registries&lt;/code&gt; in &lt;code&gt;registries.conf&lt;/code&gt;, or use a fully-qualified name.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  cd4peadm 5.16.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-29 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/cd4peadm" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;The changes this month added external PostgreSQL database support, a configurable image pull policy, source control token management improvements, and closed 11 CVEs. There is also a breaking change to commit status contexts — see below (and the linked release notes).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Added support for external databases. You can now point Continuous Delivery at a PostgreSQL instance you operate yourself, Amazon RDS for PostgreSQL, Amazon Aurora (PostgreSQL-compatible), or a self-managed PostgreSQL server, instead of the database CD manages for you. This gives you control over durability, backups, and high availability. You can configure external mode on a fresh install or migrate an existing managed install.&lt;/li&gt;
&lt;li&gt;Added a feature to Continuous Delivery job templates so you can set an image pull policy per job (&lt;code&gt;Always&lt;/code&gt;, &lt;code&gt;IfNotPresent&lt;/code&gt;, or &lt;code&gt;Never&lt;/code&gt;). In an air-gapped environment, for example, setting the policy to &lt;code&gt;Never&lt;/code&gt; stops Continuous Delivery's attempts to reach out to the internet for the image.&lt;/li&gt;
&lt;li&gt;Updated the &lt;strong&gt;Source Control&lt;/strong&gt; settings page to show when a configured Personal Access Token (PAT) expires on each connected GitHub, GitHub Enterprise, and GitLab integration card. Tokens that have already expired or will expire within 30 days are clearly flagged so you can renew them before they cause failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BREAKING:&lt;/strong&gt; Commit status contexts now include the pipeline name (&lt;code&gt;cd-pe/&amp;lt;pipelineName&amp;gt;/stage-&amp;lt;N&amp;gt;&lt;/code&gt; instead of &lt;code&gt;cd-pe/stage-&amp;lt;N&amp;gt;&lt;/code&gt;), which prevents collisions when multiple pipelines report status for the same commit. Review any branch protection rules or required status checks that reference the old format.&lt;/li&gt;
&lt;li&gt;11 CVEs addressed, including opentelemetry, NGINX, jetty, jackson, log4j, postgresql, golang.org/x/sys, and react-router.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the official &lt;a href="https://help.puppet.com/cdpe/current/Content/UserGuide/CDPE/ReleaseNotes/cd_release_notes.htm#Version5160" rel="noopener noreferrer"&gt;release notes for cd4peadm 5.16.0&lt;/a&gt; for the full details.&lt;/p&gt;




&lt;h3&gt;
  
  
  comply 3.8.1
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-03 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/comply" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;A Security Compliance Management maintenance release that did not have any new CVE fixes this time and was mostly operational and licensing improvements.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased the CIS-CAT Pro Assessor license expiry time; licenses are now good for a full year.&lt;/li&gt;
&lt;li&gt;Added a &lt;code&gt;license_path&lt;/code&gt; parameter to update the CIS-CAT Pro Assessor license without upgrading SCM.&lt;/li&gt;
&lt;li&gt;Added an &lt;code&gt;assessor_scan_timeout&lt;/code&gt; option to control the task timeout for Windows 2022 domain controllers.&lt;/li&gt;
&lt;li&gt;Added a background scan sweeper that detects and cancels scans stuck in a "running" state.&lt;/li&gt;
&lt;li&gt;Increased the default &lt;strong&gt;Max graphql requests limit&lt;/strong&gt; to 300 requests per window; use the &lt;code&gt;complyadm::configure&lt;/code&gt; Bolt plan to customize.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the official &lt;a href="https://help.puppet.com/scm/current/Content/UserGuide/SCM/Release_notes/release_notes.htm#SecurityComplianceManagement381" rel="noopener noreferrer"&gt;release notes for comply 3.8.1&lt;/a&gt; for the full details.&lt;/p&gt;




&lt;h3&gt;
  
  
  haproxy 9.1.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-28 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/haproxy" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Two releases this month: 9.0.0 dropped Puppet 7 support (&lt;strong&gt;BREAKING&lt;/strong&gt;) and added &lt;code&gt;cache&lt;/code&gt; resource support, while 9.1.0 removed a sensitive-data workaround and allows both stdlib and concat to move to their 10.x releases.&lt;/p&gt;

&lt;p&gt;Includes monthly releases: 9.1.0 (2026-07-28), 9.0.0 (2026-07-20).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Eliminate Workaround for Sensitive Data; raises minimum &lt;code&gt;puppetlabs/concat&lt;/code&gt; requirement to &lt;code&gt;7.4.0&lt;/code&gt; &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/607" rel="noopener noreferrer"&gt;#607&lt;/a&gt; (&lt;a href="https://github.com/cocker-cc" rel="noopener noreferrer"&gt;cocker-cc&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add support for running programs &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/604" rel="noopener noreferrer"&gt;#604&lt;/a&gt; (&lt;a href="https://github.com/deric" rel="noopener noreferrer"&gt;deric&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Pass install_options to package installer &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/603" rel="noopener noreferrer"&gt;#603&lt;/a&gt; (&lt;a href="https://github.com/deric" rel="noopener noreferrer"&gt;deric&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;examples: disable default stats listener &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/640" rel="noopener noreferrer"&gt;#640&lt;/a&gt; (&lt;a href="https://github.com/bastelfreak" rel="noopener noreferrer"&gt;bastelfreak&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;make picking haproxy::globals::sort_options_alphabetic work &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/573" rel="noopener noreferrer"&gt;#573&lt;/a&gt; (&lt;a href="https://github.com/trefzer" rel="noopener noreferrer"&gt;trefzer&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove Puppet 7 support (BREAKING); the module now requires &lt;code&gt;puppet &amp;gt;= 8.0.0 &amp;lt; 9.0.0&lt;/code&gt;&lt;/strong&gt; &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/631" rel="noopener noreferrer"&gt;#631&lt;/a&gt; (&lt;a href="https://github.com/gavindidrichsen" rel="noopener noreferrer"&gt;gavindidrichsen&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Add support for &lt;code&gt;cache&lt;/code&gt; resource, extra backend options, and docs &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/626" rel="noopener noreferrer"&gt;#626&lt;/a&gt; (&lt;a href="https://github.com/matejzero" rel="noopener noreferrer"&gt;matejzero&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(MODULES-11840) Allow puppetlabs/stdlib 10.x &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/642" rel="noopener noreferrer"&gt;#642&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Allow puppetlabs/concat 10.x &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/641" rel="noopener noreferrer"&gt;#641&lt;/a&gt; (&lt;a href="https://github.com/bastelfreak" rel="noopener noreferrer"&gt;bastelfreak&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;dependency: create mapfile before configfile &lt;a href="https://github.com/puppetlabs/puppetlabs-haproxy/pull/572" rel="noopener noreferrer"&gt;#572&lt;/a&gt; (&lt;a href="https://github.com/trefzer" rel="noopener noreferrer"&gt;trefzer&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  iis 11.0.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-01 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/iis" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Dropped Puppet 7 support (&lt;strong&gt;BREAKING&lt;/strong&gt;) as part of ongoing modernization efforts, and marked the &lt;code&gt;iis_application_pool&lt;/code&gt; password parameter as sensitive so it no longer leaks into Puppet reports.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(CAT-2374) Puppet Core update (BREAKING) — drops Puppet 7 support &lt;a href="https://github.com/puppetlabs/puppetlabs-iis/pull/414" rel="noopener noreferrer"&gt;#414&lt;/a&gt; (&lt;a href="https://github.com/LukasAud" rel="noopener noreferrer"&gt;LukasAud&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(MODULES-11595) Mark iis_application_pool password as sensitive to stop report leak &lt;a href="https://github.com/puppetlabs/puppetlabs-iis/pull/418" rel="noopener noreferrer"&gt;#418&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  mount_iso 5.0.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-22 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/mount_iso" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Dropped Puppet 7 support (&lt;strong&gt;BREAKING&lt;/strong&gt;) and allowed the stdlib dependency to move to 10.x.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(CAT-2380) Update for Puppet Core / Drop Support for Puppet 7 (BREAKING) &lt;a href="https://github.com/puppetlabs/puppetlabs-mount_iso/pull/58" rel="noopener noreferrer"&gt;#58&lt;/a&gt; (&lt;a href="https://github.com/david22swan" rel="noopener noreferrer"&gt;david22swan&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(MODULES-11840) Allow puppetlabs/stdlib 10.x &lt;a href="https://github.com/puppetlabs/puppetlabs-mount_iso/pull/59" rel="noopener noreferrer"&gt;#59&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  mysql 17.1.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-02 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/mysql" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This month was a small update but important as RHEL 10 support was added.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(MODULES-11802) Add support for RHEL 10 &lt;a href="https://github.com/puppetlabs/puppetlabs-mysql/pull/1712" rel="noopener noreferrer"&gt;#1712&lt;/a&gt; (&lt;a href="https://github.com/skyamgarp" rel="noopener noreferrer"&gt;skyamgarp&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  node_encrypt 3.2.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-22 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/node_encrypt" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Adds Ubuntu 24 and Debian 12 support, and upgrades rexml to address a CVE.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(CAT-2124) Add support for Ubuntu 24 &lt;a href="https://github.com/puppetlabs/puppetlabs-node_encrypt/pull/120" rel="noopener noreferrer"&gt;#120&lt;/a&gt; (&lt;a href="https://github.com/skyamgarp" rel="noopener noreferrer"&gt;skyamgarp&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(CAT-2100) Add Debian 12 support &lt;a href="https://github.com/puppetlabs/puppetlabs-node_encrypt/pull/119" rel="noopener noreferrer"&gt;#119&lt;/a&gt; (&lt;a href="https://github.com/shubhamshinde360" rel="noopener noreferrer"&gt;shubhamshinde360&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(CAT-2158) Upgrade rexml to address CVE-2024-49761 &lt;a href="https://github.com/puppetlabs/puppetlabs-node_encrypt/pull/121" rel="noopener noreferrer"&gt;#121&lt;/a&gt; (&lt;a href="https://github.com/amitkarsale" rel="noopener noreferrer"&gt;amitkarsale&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  peadm 3.38.1
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-08 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/peadm" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Restores public-schema privileges on PostgreSQL 15+ in &lt;code&gt;restore.pp&lt;/code&gt;, fixing a bug that could affect PE restores on newer PostgreSQL versions.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(PE-44867) Restore public-schema privileges on PostgreSQL 15+ in restore.pp &lt;a href="https://github.com/puppetlabs/puppetlabs-peadm/pull/676" rel="noopener noreferrer"&gt;#676&lt;/a&gt; (&lt;a href="https://github.com/CharithaDunuwille" rel="noopener noreferrer"&gt;CharithaDunuwille&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  postgresql 10.6.3
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-07 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/postgresql" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Restores Puppet 7 support that was unintentionally dropped in the 10.6.2 patch release last month.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; As flagged in June's roundup, the Puppet 7 removal in 10.6.2 shipped in a patch release rather than a major one. 10.6.3 restores Puppet 7 support; the removal will happen again, correctly, in a future major release.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(MODULES-11858) Restore Puppet 7 support broken by 10.6.2 &lt;a href="https://github.com/puppetlabs/puppetlabs-postgresql/pull/1686" rel="noopener noreferrer"&gt;#1686&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  puppet_authorization 1.0.1
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-21 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/puppet_authorization" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;A maintenance release: allows both the stdlib and concat dependencies to move to 10.x, tweaks a CI workflow flag, and adds a LICENSE file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change flag option in CI workflow &lt;a href="https://github.com/puppetlabs/puppetlabs-puppet_authorization/pull/56" rel="noopener noreferrer"&gt;#56&lt;/a&gt; (&lt;a href="https://github.com/zaben903" rel="noopener noreferrer"&gt;zaben903&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(MODULES-11840) Allow puppetlabs/stdlib 10.x &lt;a href="https://github.com/puppetlabs/puppetlabs-puppet_authorization/pull/57" rel="noopener noreferrer"&gt;#57&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;puppetlabs/concat: Allow 10.x &lt;a href="https://github.com/puppetlabs/puppetlabs-puppet_authorization/pull/55" rel="noopener noreferrer"&gt;#55&lt;/a&gt; (&lt;a href="https://github.com/bastelfreak" rel="noopener noreferrer"&gt;bastelfreak&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Create LICENSE &lt;a href="https://github.com/puppetlabs/puppetlabs-puppet_authorization/pull/52" rel="noopener noreferrer"&gt;#52&lt;/a&gt; (&lt;a href="https://github.com/binford2k" rel="noopener noreferrer"&gt;binford2k&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  sce_linux 2.8.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-28 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/sce_linux" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Updates CIS Benchmarks from v3.0.0 to v4.0.0 for RHEL 8, AlmaLinux 8, and Oracle Linux 8, with matching control updates for each, and fixes three bugs affecting benchmark enforcement.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Updated CIS Benchmarks.&lt;/strong&gt; RHEL 8, AlmaLinux 8, and Oracle Linux 8 move from CIS Benchmark v3.0.0 to v4.0.0, with matching control updates for each operating system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updated dependency.&lt;/strong&gt; SCE for Linux now supports puppetlabs-stdlib &amp;gt;= 9.2.0 &amp;lt; 11.0.0; avoid using earlier stdlib versions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed:&lt;/strong&gt; the user-specified &lt;code&gt;default_zone&lt;/code&gt; setting was not enforced for CIS control 3.4.1.2; it is now enforced correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed:&lt;/strong&gt; &lt;code&gt;aide --init&lt;/code&gt; failed on RHEL/AlmaLinux/Oracle Linux/Rocky Linux 8 hosts shipping AIDE 0.17.x, which renamed the &lt;code&gt;database=&lt;/code&gt; directive to &lt;code&gt;database_in=&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed:&lt;/strong&gt; CIS control 6.2.2.2 (journald log-forwarding) did not work as designed on RHEL/AlmaLinux/Oracle Linux/Rocky Linux 9 and 10; control 6.2.3.3 was also added.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the official &lt;a href="https://help.puppet.com/sce/current/linux/scel_relnotes_280.htm" rel="noopener noreferrer"&gt;release notes for sce_linux 2.8.0&lt;/a&gt; for the full details.&lt;/p&gt;




&lt;h3&gt;
  
  
  scheduled_task 5.0.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-13 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/scheduled_task" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Drops Puppet 7 support (&lt;strong&gt;BREAKING&lt;/strong&gt;) and also adds Windows Server 2025 support.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(CAT-2391) Puppet Core upgrade (BREAKING) — drops Puppet 7 support &lt;a href="https://github.com/puppetlabs/puppetlabs-scheduled_task/pull/271" rel="noopener noreferrer"&gt;#271&lt;/a&gt; (&lt;a href="https://github.com/LukasAud" rel="noopener noreferrer"&gt;LukasAud&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;[MODULES-11616] Adding Windows 2025 support to module &lt;a href="https://github.com/puppetlabs/puppetlabs-scheduled_task/pull/275" rel="noopener noreferrer"&gt;#275&lt;/a&gt; (&lt;a href="https://github.com/jst-cyr" rel="noopener noreferrer"&gt;jst-cyr&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Update link to contributing documentation &lt;a href="https://github.com/puppetlabs/puppetlabs-scheduled_task/pull/273" rel="noopener noreferrer"&gt;#273&lt;/a&gt; (&lt;a href="https://github.com/jst-cyr" rel="noopener noreferrer"&gt;jst-cyr&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  sslcertificate 6.0.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-22 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/sslcertificate" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Drops Puppet 7 support (&lt;strong&gt;BREAKING&lt;/strong&gt;) and allows the stdlib dependency to move to 10.x.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(CAT-2394) Puppet Core update (BREAKING) — drops Puppet 7 support &lt;a href="https://github.com/puppetlabs/puppetlabs-sslcertificate/pull/142" rel="noopener noreferrer"&gt;#142&lt;/a&gt; (&lt;a href="https://github.com/LukasAud" rel="noopener noreferrer"&gt;LukasAud&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;(MODULES-11840) Allow puppetlabs/stdlib 10.x &lt;a href="https://github.com/puppetlabs/puppetlabs-sslcertificate/pull/143" rel="noopener noreferrer"&gt;#143&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  windows_env 6.1.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-21 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/windows_env" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Adds Windows Server 2025 support.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(MODULES-11891) Add Windows Server 2025 support &lt;a href="https://github.com/puppetlabs/puppetlabs-windows_env/pull/115" rel="noopener noreferrer"&gt;#115&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  windows_eventlog 5.1.0
&lt;/h3&gt;

&lt;p&gt;📅 Latest release: 2026-07-22 (🌐 &lt;a href="https://forge.puppet.com/modules/puppetlabs/windows_eventlog" rel="noopener noreferrer"&gt;View on the Forge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Adds Windows Server 2025 support.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(MODULES-11892) Add Windows Server 2025 support &lt;a href="https://github.com/puppetlabs/puppetlabs-windows_eventlog/pull/98" rel="noopener noreferrer"&gt;#98&lt;/a&gt; (&lt;a href="https://github.com/imaqsood" rel="noopener noreferrer"&gt;imaqsood&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Until Next Time!
&lt;/h2&gt;

&lt;p&gt;That wraps up the July 2026 roundup. If any of these modules intersect with your environment. especially the cd4peadm breaking change to commit status contexts and the Puppet 7 removals, the linked Forge pages and release notes are worth a closer look before upgrading.&lt;/p&gt;

&lt;p&gt;Feedback on the series is always useful, especially if there are module families or release-note patterns that deserve more attention in future editions!&lt;/p&gt;

&lt;p&gt;More updates coming next month when the August 2026 releases land.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 AI Disclosure
&lt;/h2&gt;

&lt;p&gt;This roundup is produced by a mostly-automated pipeline, with some AI sprinkled in for orchestration and enrichment (or 'Combobulating' and 'Finagling'), followed by a human review (that would be me) before publishing.&lt;/p&gt;

&lt;p&gt;The automation is an &lt;a href="https://github.com/jst-cyr/puppetlabs-modules-roundup-writer" rel="noopener noreferrer"&gt;open-source project&lt;/a&gt; with deterministic python scripts to crawl the Forge and determine which &lt;code&gt;puppetlabs&lt;/code&gt; modules were released during a specific month (and catching when a module gets more than one release in a month). By combining a template, automation scripts, and some AI orchestration the content all gets pulled together for a structured markdown document. I then jump in to double-check the content and update any wording that seems repetitive or irrelevant (and sometimes I need to add some extra context that isn't in the changelog notes).&lt;/p&gt;

</description>
      <category>puppet</category>
    </item>
    <item>
      <title>The Decision Maker’s Guide to Puppet: What is Perforce Puppet? Which Edition of Puppet is Right for You?</title>
      <dc:creator>Dragonsoft DevSecOps</dc:creator>
      <pubDate>Mon, 03 Aug 2026 09:13:31 +0000</pubDate>
      <link>https://dev.to/dragonsoft_devsecops/the-decision-makers-guide-to-puppet-what-is-perforce-puppet-which-edition-of-puppet-is-right-for-1e7k</link>
      <guid>https://dev.to/dragonsoft_devsecops/the-decision-makers-guide-to-puppet-what-is-perforce-puppet-which-edition-of-puppet-is-right-for-1e7k</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;As your infrastructure expands, you need a solution that securely scales as quickly as your organization grows. In this article, Dragonsoft, an authorized Perforce partner, will guide you through the modern automation landscape to help you make the right choice for your organization, including comparisons for each edition of Puppet, from open source to enterprise-ready options.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What is Perforce Puppet
&lt;/h2&gt;

&lt;p&gt;Perforce Puppet empowers people to innovate through infrastructure automation. For more than a dozen years, Puppet has led the way in IT infrastructure automation to simplify complexity for the masses in order to strengthen customers’ security posture, compliance standards, and business resiliency beyond the data center to the cloud. More than 40,000 organizations — including more than 80 percent of the Global 5000 — have benefited from Puppet’s open source and commercial solutions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Consider When Choosing Automation Solutions Like Puppet
&lt;/h2&gt;

&lt;p&gt;What happens when your IT matures? IT maturity can mean a lot of things, but in a digital-first world, it almost always means new problems to solve.&lt;/p&gt;

&lt;p&gt;As your business grows, your infrastructure must evolve to keep up. Your IT teams need to strengthen security, ensure compliance, enhance observability, and stay audit-ready without sacrificing performance or reliability. Even if your IT footprint isn’t expanding, it may shift laterally, introducing complexity without adding scale. Legacy tools and technical debt can still hold you back. Regardless of how it happens, your infrastructure will face growing pains.&lt;/p&gt;

&lt;p&gt;One thing is certain: Your IT doesn't get easier to manage on its own.&lt;/p&gt;

&lt;p&gt;So naturally, you turn to automation to handle the expanding workloads and increased expectations. All of a sudden, you’re writing scripts, automating tasks, and saving mountains of time by keeping everything in your desired state. Automation empowers infrastructure teams to be more focused and productive and break through the limits of human scale. Soon, you can’t imagine ever doing development, operations, or DevOps differently.&lt;/p&gt;

&lt;p&gt;But before long, those growing pains start to show up again. You find that the tools, solutions, and processes that kept your IT afloat in the past don’t cut it anymore. The security, scale, and sophistication of your IT are essential to business success, but in a fast-paced, ever-changing digital landscape, new challenges and complexity are never far behind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The IT Automation Landscape: A Brief Overview
&lt;/h2&gt;

&lt;p&gt;Broadly, IT automation solutions fall into three categories: open source automation tools, open core solutions, and enterprise platforms. Each has distinct strengths and limitations, making them suitable for different use cases. Here’s a quick comparison of Puppet offerings to support informed decision-making.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkr4hqoyqmhjbaui09x43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkr4hqoyqmhjbaui09x43.png" alt=" " width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenSource Puppet&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open Source Puppet is freely available for organizations looking to adopt automation. It appeals to businesses with limited budgets or that have an open source-first model and the resources to build and maintain it. But open source tools have  underlying costs: They require significant in-house expertise and ongoing maintenance. They also often lack rigorous security testing, which can present issues for organizations with compliance and SLA requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puppet Core&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Puppet Core is designed to balance cost efficiency with security. It delivers reliable, stable, and secure software builds that are consistently updated and rigorously tested. Hardened binaries, defect support, and guaranteed SLAs reduce the burden on internal teams, letting them focus on keeping their systems running smoothly with Puppet instead of worrying about the security of their infrastructure automation solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Puppet Enterprise Platform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For organizations prioritizing scalability and future growth, an enterprise infrastructure automation and management platform is the go-to choice. With advanced features, enhanced integrations and capabilities, and dedicated support, the Puppet Enterprise platform is designed to ensure long-term efficiency and resiliency in large, complex environments.&lt;/p&gt;

&lt;p&gt;Enterprise organizations benefit from the advanced capabilities of an infrastructure operations platform that scales with their needs — particularly businesses with a strong focus on security and compliance and who are unwilling to sacrifice innovation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Puppet Products Compared
&lt;/h2&gt;

&lt;p&gt;Puppet is here to support your path to more resilient IT — especially when you need to handle greater complexity, support a growing userbase, and speed up evelopment.&lt;/p&gt;

&lt;p&gt;All editions of Puppet are built on the same proven foundation, but there are key differences to consider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In short:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Open Source Puppet automates and enforces desired state without cost, although maintaining it requires trained resources and involves greater manual effort.&lt;/p&gt;

&lt;p&gt;• Puppet Core is for those who want the same hands-on control of Open Source Puppet but require hardened, stable builds with vendor-backed SLAs.&lt;/p&gt;

&lt;p&gt;• The Puppet Enterprise platform is built for enterprise teams who need their automation to work for them — not the other way around. The AI-powered user experience and intuitive GUI interface help users get started quickly, and advanced capabilities and exclusive third-party integrations increase productivity at every level.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8f2m4voc38bvxrgtta44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8f2m4voc38bvxrgtta44.png" alt=" " width="800" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The more we use Puppet Enterprise, the more we find we can do with it. Puppet Enterprise comes with many modules to help us manage our Puppet setup more easily. The open source version does not come with these modules … Every new upgrade of Puppet proves to be more innovative, and brings exciting features that we want.”——Pope Davis, Senior Director of systems Engineering, NYSE/ICE&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Organizations Choose Puppet Core
&lt;/h2&gt;

&lt;p&gt;Puppet Core builds on the powerful automation capabilities of Open Source Puppet and adds additional peace of mind for security-conscious organizations. Backed by Perforce, a trusted DevOps partner with over 30 years experience supporting global enterprises, releases undergo rigorous testing and include signed, hardened binaries. Defects can be reported via a customer portal and guaranteed SLAs ensure quick remediation for high and critical CVEs on Puppet software. Puppet Core also incorporates built-in enforcement of popular security baselines to ensure your infrastructure is continuously verified as compliant.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Organizations Choose the Puppet Enterprise Platform
&lt;/h2&gt;

&lt;p&gt;As infrastructure grows and compliance demands intensify, organizations often outgrow the limitations of their automation tools. Whether it’s the need to scale rapidly or respond swiftly to security vulnerabilities, teams require a platform that evolves with them.&lt;/p&gt;

&lt;p&gt;That's why many who start with Open Source Puppet or Puppet Core later transition to Puppet Enterprise: to gain the advanced features, enterprise support, and integrated capabilities that modern environments demand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deciding Which Puppet Solution Your Organization Should Choose
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;l Choose OpenSource Puppet if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• You have minimal security and compliance requirements&lt;/p&gt;

&lt;p&gt;• You don’t need formal SLAs for your Puppet software&lt;/p&gt;

&lt;p&gt;• Your infrastructure is relatively simple and not spread across hybrid/cloud environments&lt;/p&gt;

&lt;p&gt;• You don’t require the latest OS support or access to enterprise-grade agent updates&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;l Choose Puppet Core if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• You need releases with secure, signed binaries&lt;/p&gt;

&lt;p&gt;• Your team has the in-house expertise to manage infrastructure automation software&lt;/p&gt;

&lt;p&gt;• You prefer a hands-on, code-centric approach to infrastructure management&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;l Choose the Puppet Enterprise platform if:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;• Your IT infrastructure is large, complex, or hybrid (e.g., thousands of servers, multi-cloud)&lt;/p&gt;

&lt;p&gt;• You want intuitive, GUI-based tools to manage the full infrastructure lifecycle&lt;/p&gt;

&lt;p&gt;• You want to empower more team members to access   infrastructure insights and take action (without needing Puppet expertise) through AI-driven, natural language  interaction&lt;/p&gt;

&lt;p&gt;• You need a solution that scales without adding operational overhead or tool sprawl&lt;/p&gt;

&lt;p&gt;• You want seamless integration with your existing security, observability, and self-service tools&lt;/p&gt;

&lt;p&gt;• You require centralized control for compliance reporting, vulnerability remediation, and audit readiness&lt;/p&gt;

&lt;p&gt;• You aim to build powerful automation workflows without reinventing your toolchain&lt;/p&gt;

&lt;p&gt;• Your organization is growing — whether through scale, expansion, or complexity&lt;/p&gt;

&lt;p&gt;• You’re ready to simplify infrastructure management and increase operational efficiency&lt;/p&gt;

&lt;p&gt;The Puppet Enterprise platform is the only solution that combines both model-based (declarative) and task-based (imperative) capabilities in a way that enables you to scale&lt;/p&gt;

&lt;p&gt;your hybrid infrastructure as your automation footprint grows. With both agent-based and agentless capabilities, the Puppet Enterprise platform gives your organization the flexibility to automate what you want, how you want, wherever you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps: Getting Started
&lt;/h2&gt;

&lt;p&gt;Ready to take the next step with Puppet? &lt;/p&gt;

&lt;p&gt;Whether you're just beginning or expanding your automation journey, our team at Dragonsoft, an authorized Perforce partner,is here to help. We'll work with you to assess your current environment, understand your goals, and chart a clear path to a more secure, efficient, and resilient infrastructure.&lt;/p&gt;

&lt;p&gt;Schedule a demo or connect with our team to explore the best Puppet solution for your organization.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="http://www.hkdsdtech.com" rel="noopener noreferrer"&gt;www.hkdsdtech.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Phone: +852-51679050&lt;/p&gt;

&lt;p&gt;Email: &lt;a href="mailto:marketing@hkdsdtech.com"&gt;marketing@hkdsdtech.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>perforce</category>
      <category>puppet</category>
    </item>
    <item>
      <title>New Benchmarks now Available for Puppet SCE for Linux</title>
      <dc:creator>Jason St-Cyr</dc:creator>
      <pubDate>Thu, 30 Jul 2026 11:49:16 +0000</pubDate>
      <link>https://dev.to/puppet/new-benchmarks-now-available-for-puppet-sce-for-linux-34jf</link>
      <guid>https://dev.to/puppet/new-benchmarks-now-available-for-puppet-sce-for-linux-34jf</guid>
      <description>&lt;p&gt;Security Compliance Enforcement (SCE) for Linux 2.8.0 is now available, delivering updated CIS Benchmark coverage along with improvements to policy enforcement, auditing, and logging reliability. These updates help organizations strengthen compliance programs, reduce operational risk, and maintain confidence that Linux systems remain aligned with security and governance requirements.&amp;nbsp;SCE for Linux is available as part of Puppet Core and Puppet Enterprise Advanced.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Why Upgrade?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Stay aligned with current CIS guidance&amp;nbsp;through updated benchmark coverage for major enterprise Linux distributions.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Improve audit readiness&amp;nbsp;with expanded benchmark coverage and updated compliance checks.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Reduce operational risk&amp;nbsp;through fixes that improve firewall, integrity monitoring, and logging behavior.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Increase confidence in enforcement&amp;nbsp;by addressing issues that could prevent configurations from being applied as intended.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's New?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Updated CIS Benchmark support for RHEL 8, AlmaLinux 8, Oracle Linux 8, and Rocky Linux 8.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Enhancements that improve alignment with current benchmark recommendations across system hardening, auditing, networking, and account management.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Reliability improvements for firewall zone enforcement, AIDE-based integrity monitoring, and log forwarding.&lt;/li&gt;
&lt;li&gt;  Updated platform dependencies to support ongoing compatibility and maintainability.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Security and Maintenance Updates
&lt;/h2&gt;

&lt;p&gt;This release includes maintenance updates and issue resolutions that help improve platform stability, reduce security risk, and support more reliable compliance operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;Review the release notes for complete details and upgrade guidance, then plan your upgrade to take advantage of the latest benchmark coverage and reliability improvements.&lt;/p&gt;

&lt;p&gt;If you're new to SCE, visit the documentation page to learn how it helps automate compliance assessments, policy enforcement, and ongoing audit readiness across enterprise Linux environments.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/sce/current/linux/scel_relnotes_280.htm" rel="noopener noreferrer"&gt;SCE for Linux Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://help.puppet.com/sce/current/intro/sce_intro.htm" rel="noopener noreferrer"&gt;Learn more about SCE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>puppet</category>
      <category>security</category>
      <category>linux</category>
    </item>
    <item>
      <title>Building with AI: Our Approach to Responsible Agentic Development in Open Source</title>
      <dc:creator>Jason St-Cyr</dc:creator>
      <pubDate>Tue, 28 Jul 2026 12:36:14 +0000</pubDate>
      <link>https://dev.to/puppet/building-with-ai-our-approach-to-responsible-agentic-development-in-open-source-5f2b</link>
      <guid>https://dev.to/puppet/building-with-ai-our-approach-to-responsible-agentic-development-in-open-source-5f2b</guid>
      <description>&lt;p&gt;The tech world has been building up towards the shift to a&amp;nbsp;&lt;strong&gt;fully agentic development life cycle&lt;/strong&gt;&amp;nbsp;for a few years now. AI is changing how software gets built.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Across the Puppet ecosystem, we're seeing a shift toward more agentic engineering workflows. AI helps generate code, shape documentation, and accelerate how Puppet modules evolve. This brings real benefits in speed and consistency, but it also raises important questions from the community:&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  How are AI-generated changes validated?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  How do you ensure consistency across modules?&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  What does this mean for contributors and maintainers?&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are exactly the kinds of questions we should be asking! This article will outline how Perforce and the Puppet team are approaching the use of AI in our open source modules and repositories.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Build Trust in AI-Assisted Contributions&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;At Perforce, AI is a core part of our process and our teams operate within a&amp;nbsp;&lt;strong&gt;defined, governed framework&lt;/strong&gt;&amp;nbsp;for development. We don’t rely on trust in the tool itself. We rely on the processes around it.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Whether a change is written by a person, generated with AI, or some mix of both, they are held to the same standards before it’s accepted and released.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;In practice, that means:&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Human review is always the gate:&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
Every change is reviewed by maintainers. AI can assist, but it doesn’t replace accountability.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AI works within established patterns:&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
AI-generated code isn’t created in isolation. It’s guided by the same module structures, conventions, and expectations that already exist across the ecosystem.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Validation is continuous and enforced:&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
AI doesn’t change our standards. It reinforces them. AI-generated changes go through the same checks as any other contribution:&amp;nbsp;

&lt;ul&gt;
&lt;li&gt;  Test suites&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Integration validation&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Functional verification&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;AI output is a starting point, not a final artifact:&lt;/strong&gt;&amp;nbsp;
Generated code is iterated on, refined, and aligned before acceptance. We treat AI as an accelerator, not an authority.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The community plays an important role&lt;/strong&gt;&amp;nbsp;
Open source means visibility. The community can review changes, raise issues, and contribute ideas. That feedback loop adds another layer of resilience and helps shape how these workflows evolve.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At a high level, our approach is simple:&amp;nbsp;&lt;strong&gt;the outcome matters more than how the code was created.&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Community Contributions and AI&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Community members are not required to use code assist tools when providing contributions to Puppet open source projects, even when those projects contain frameworks or files designed to support coding agents.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Contributions can be made using any tools or workflows that work best for you and there is no expectation to match the Perforce technology stack. While the Puppet team will be adding instructions, skills, and other artifacts to support agentic workflows, including tools like Claude Code, these are provided as optional enhancements, not requirements.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;When contributions are reviewed, the same standards apply regardless of how they were created. This includes contributions that contain AI-generated code, are submitted by AI agents, or have been tested or reviewed using AI tools. We welcome contributions in any form, but all submissions go through the same review and approval process before they are accepted and released.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Maintaining Consistency Across the Ecosystem&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Another important question we hear is how we avoid duplication or inconsistency as AI becomes part of the workflow. This is where&amp;nbsp;&lt;strong&gt;ecosystem-level thinking and governance&lt;/strong&gt;&amp;nbsp;matter most and where we will be incrementally improving our engineering patterns.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Here’s how we approach that:&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Changes are evaluated in context&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
We don’t review contributions in isolation. We look at how they relate to existing modules and whether similar functionality already exists.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Reuse is prioritized over duplication&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
When reviewing changes, we actively ask whether something can be reused instead of reimplemented. This helps maintain DRY principles across the ecosystem—not just within a single module.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Shared patterns guide development&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
AI-assisted changes are aligned to standard module structures, established design patterns, and proven implementation approaches. This helps ensure consistency even as contribution velocity increases.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Documentation is treated as part of the system&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
Generated documentation and supporting artifacts are treated as first-class components. This improves clarity, supports reuse, and helps maintain long-term consistency across modules.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Governance Is Built In, Not Bolted On&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Building with AI tools is not left to individual discretion. AI usage at Perforce follows&amp;nbsp;&lt;a href="https://trust.perforce.com/resources?s=h4ucgvqdld3suqiwml8o4d&amp;amp;name=ai-governance-at-perforce" rel="noopener noreferrer"&gt;structured processes&lt;/a&gt;&amp;nbsp;designed to ensure quality, security, and accountability across the lifecycle.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Here’s what that looks like for Puppet open source teams:&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;AI tools and workflows are intentionally reviewed&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
We evaluate how AI tools are used within our development process, including how they interact with existing systems and patterns. Only tools approved for use by the Perforce AI governance team can be used for agentic development by Perforce employees.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Risks and dependencies are actively managed&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
Using agentic development flows introduces new considerations from code duplication to unintended behaviors. These are identified, reviewed, and addressed as part of normal development workflows.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Security and compliance are built into the process&lt;/strong&gt;&amp;nbsp;&amp;nbsp;
AI-assisted development operates within the same security, permission, and compliance boundaries as any other contribution.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI usage is part of a broader&amp;nbsp;&lt;a href="https://www.perforce.com/press-releases/%20ISO-42001-Certification" rel="noopener noreferrer"&gt;&lt;strong&gt;AI management system aligned with ISO 42001&lt;/strong&gt;,&lt;/a&gt;&amp;nbsp;ensuring responsible use across the lifecycle.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;We also recognize the broader concerns around AI. We're deliberate about how and where AI is used. At its core, governance is about maintaining control while enabling progress. AI should operate within the systems teams already trust, not bypass them.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Commitment to the Open Source Community &amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;This evolution isn’t happening in isolation. The Puppet modules team works within an open source ecosystem and it’s important that the community is informed about AI usage and included so that all members of the community are able to provide feedback as these processes evolve.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our goal is to provide:&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Clear communication about AI-assisted changes&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Transparency in how contributions are reviewed&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  Ongoing dialogue as workflows evolve&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a new world of software delivery that we all maintainers and contributors are collaborating in, and we'll need to work together to find the right process for everyone.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Means Going Forward&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;The agentic software development lifecycle is going to continue to shift and grow. AI will continue to play a growing role in how modules are developed and maintained.&amp;nbsp;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In your favorite Puppetlabs modules, you are going to see:&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Structural documentation, skills, instructions, and other frameworks to support agentic development&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  More AI-assisted contributions to open source repos&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  More structured documentation that aligns across the ecosystem&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  An increase in iteration cycles as agentic workflows grow and stabilize&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is one thing that won't change:&amp;nbsp;&lt;strong&gt;Every contribution will be held to the same standards of quality, consistency, and trust.&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;In the end, trust in AI doesn’t come from the model. It comes from the systems, processes, and people behind it.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;We want to hear from the community as we continue to evolve these practices and develop a solid agentic-supported workflow for our open source community. We’d love your feedback, so please share your thoughts here or in the Puppet Community Slack.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;These additional resources could be helpful if you are interested in this topic and want to learn more!&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://trust.perforce.com/resources?s=h4ucgvqdld3suqiwml8o4d&amp;amp;name=ai-governance-at-perforce" rel="noopener noreferrer"&gt;AI Governance at Perforce&lt;/a&gt;&amp;nbsp;(trust.perforce.com)&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.perforce.com/press-releases/%20ISO-42001-Certification" rel="noopener noreferrer"&gt;Perforce AI Products and Features Achive ISO 42001 Certification&lt;/a&gt;&amp;nbsp;(perforce.com)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤖 AI Disclosure
&lt;/h2&gt;

&lt;p&gt;You'll probably notice a few tell-tale structural suggestions from AI on this one. I experimented with drafting with AI on this one, using our AI Governance documentation and some context I provided about how we work on the Puppet team. From that draft, it has gone through multiple human reviews and a LOT of editing and rework, with a final review by an AI agent for brand voice alignment. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>puppet</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Integrar los datos de fichaje con el software de nóminas: el flujo real (export-validación-gestoría)</title>
      <dc:creator>Nucleo360</dc:creator>
      <pubDate>Mon, 27 Jul 2026 16:17:52 +0000</pubDate>
      <link>https://dev.to/nucleo360/integrar-los-datos-de-fichaje-con-el-software-de-nominas-el-flujo-real-export-validacion-gestoria-524b</link>
      <guid>https://dev.to/nucleo360/integrar-los-datos-de-fichaje-con-el-software-de-nominas-el-flujo-real-export-validacion-gestoria-524b</guid>
      <description>&lt;p&gt;Desde el 12 de mayo de 2019, el Real Decreto-ley 8/2019 (BOE-A-2019-3481) obliga a todas las empresas en España a llevar un registro horario diario de su plantilla. Ese registro no vive aislado: cada mes, alguien tiene que convertir horas trabajadas, horas extra y ausencias en una nómina. Y ahí es donde muchas pymes pierden tiempo (y cometen errores).&lt;/p&gt;

&lt;p&gt;En este artículo documentamos el flujo real para llevar los datos de fichaje de &lt;a href="https://nucleo360.com/registro-horario/" rel="noopener noreferrer"&gt;Nucleo360&lt;/a&gt; hasta el software de nóminas o el gestor laboral, con un paso de validación intermedio que te puede ahorrar más de un disgusto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Empecemos por la honestidad técnica
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nucleo360 no calcula nóminas.&lt;/strong&gt; Es una decisión de producto deliberada: la plataforma cubre el registro horario, las vacaciones y ausencias, la gestión documental, el canal de denuncias y el resto de la gestión de RRHH de una pyme, y &lt;strong&gt;exporta la documentación y los datos al gestor laboral o al software de nóminas&lt;/strong&gt; que ya usa la empresa. El cálculo de la nómina (convenios, cotizaciones, IRPF) lo hace quien mejor sabe hacerlo: tu asesoría o tu programa de nóminas.&lt;/p&gt;

&lt;p&gt;Eso significa que la integración de la que hablamos aquí no es una sincronización mágica en tiempo real, sino un &lt;strong&gt;pipeline de datos clásico y robusto&lt;/strong&gt;: exportar → validar → entregar. Es aburrido, y por eso funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  El flujo en tres pasos
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Paso 1 · Exportar el periodo desde Nucleo360
&lt;/h3&gt;

&lt;p&gt;Al cierre de cada mes (o del periodo que pacte tu gestoría), se exportan desde Nucleo360 los datos del registro horario del periodo: fichajes por empleado y día, con sus tramos de entrada y salida y los totales. El registro es &lt;strong&gt;inmutable y con trazabilidad&lt;/strong&gt; (quién fichó, cuándo y desde dónde), así que lo que exportas refleja lo que realmente se registró, no una versión editada a posteriori.&lt;/p&gt;

&lt;p&gt;Para nóminas, lo habitual es trabajar con el export en formato tabular (CSV) o con los informes del periodo, según lo que acepte tu gestor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8isktf0vh5n6u6w2l19e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8isktf0vh5n6u6w2l19e.png" alt=" " width="512" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 2 · Validar antes de enviar
&lt;/h3&gt;

&lt;p&gt;Este es el paso que casi nadie hace y el que más errores evita. Antes de entregar los datos a quien hace la nómina, conviene comprobar tres cosas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Totales por empleado&lt;/strong&gt;: que las horas del mes cuadran con lo esperado (jornada pactada ± extras).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Huecos&lt;/strong&gt;: días laborables sin ningún fichaje. Pueden ser vacaciones o ausencias legítimas (cotéjalo con el módulo de vacaciones), o pueden ser olvidos que hay que resolver &lt;em&gt;antes&lt;/em&gt; de que lleguen a la nómina.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solapes&lt;/strong&gt;: tramos que se pisan entre sí (entrada a las 9:00 y a las 9:30 sin salida intermedia). Suelen indicar un fichaje duplicado o mal cerrado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aquí tienes un &lt;strong&gt;ejemplo genérico&lt;/strong&gt; en Python (solo librería estándar) que hace exactamente eso sobre un CSV de fichajes. No depende de ningún proveedor: ajusta los nombres de columna a los de tu export real.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
EJEMPLO GENÉRICO de validación de un CSV de fichajes antes de
entregarlo al gestor laboral. Ajusta columnas y delimitador a tu export.

Formato esperado (una fila por tramo de fichaje):
    empleado_id;nombre;fecha;hora_entrada;hora_salida
    E001;Ana;2026-07-01;08:00;15:00
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;

&lt;span class="n"&gt;FORMATO_FECHA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%Y-%m-%d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;FORMATO_HORA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%H:%M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cargar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ruta&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;tramos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# (empleado_id, fecha) -&amp;gt; [(inicio, fin), ...]
&lt;/span&gt;    &lt;span class="n"&gt;nombres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ruta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;n_linea&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fila&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delimiter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;;&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;dia&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fecha&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;FORMATO_FECHA&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;date&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="n"&gt;entrada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hora_entrada&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;FORMATO_HORA&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
                &lt;span class="n"&gt;salida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hora_salida&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;FORMATO_HORA&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;KeyError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[ERROR] Línea &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n_linea&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: fila ilegible (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;salida&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;entrada&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# Turno nocturno: la salida cae en el día siguiente
&lt;/span&gt;                &lt;span class="n"&gt;salida&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;tramos&lt;/span&gt;&lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;empleado_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;)].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;entrada&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salida&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;empleado_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nombre&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tramos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombres&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tramos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;dias&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;incidencias&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

    &lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tramos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
        &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="c1"&gt;# Solapes dentro del mismo día
&lt;/span&gt;        &lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ini_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fin_a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ini_b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fin_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:]):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ini_b&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;fin_a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[SOLAPE] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dia&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                      &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ini_a&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fin_a&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; se pisa con &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ini_b&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;fin_b&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;H&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;M&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;incidencias&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ini&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;lista&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;fin&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;ini&lt;/span&gt;
        &lt;span class="n"&gt;dias&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dia&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Huecos: días laborables (L-V) sin fichajes dentro del rango del archivo.
&lt;/span&gt;    &lt;span class="c1"&gt;# OJO: pueden ser vacaciones o ausencias legítimas; esto solo los señala.
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fechas&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dias&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ultimo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fechas&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fechas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;ultimo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;weekday&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;fechas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[HUECO] &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;): sin fichajes el &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
                      &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(¿vacaciones/ausencia sin cotejar?)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;incidencias&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;--- Totales por empleado ---&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()):&lt;/span&gt;
        &lt;span class="n"&gt;horas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;total_seconds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;horas&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;6.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; h en &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dias&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;emp&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; días&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;incidencias&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Uso: python valida_fichajes.py fichajes.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;tramos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cargar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;validar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tramos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;nombres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; incidencias detectadas.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script devuelve código de salida distinto de cero si hay incidencias, así que puedes encadenarlo en cualquier automatización: si algo no cuadra, el archivo no sigue viaje hacia la nómina.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paso 3 · Entregar al gestor (bien empaquetado)
&lt;/h3&gt;

&lt;p&gt;La entrega falla casi siempre por detalles tontos de formato, no por los datos. Pacta con tu gestoría o con quien opere el software de nóminas, una sola vez y por escrito:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Columnas y su orden&lt;/strong&gt; (una tabla de mapeo de dos columnas es suficiente).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codificación&lt;/strong&gt;: UTF-8. Los nombres con tildes y eñes lo agradecerán.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delimitador&lt;/strong&gt; (&lt;code&gt;;&lt;/code&gt; es lo habitual en España, porque la coma decimal rompe los CSV con &lt;code&gt;,&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formato de fecha&lt;/strong&gt;: ISO 8601 (&lt;code&gt;2026-07-01&lt;/code&gt;) evita el clásico baile día/mes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fecha de corte&lt;/strong&gt;: qué día del mes se exporta, para que la nómina no espere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Y conserva una copia de lo entregado: el registro horario debe conservarse &lt;strong&gt;4 años&lt;/strong&gt; (art. 34.9 del Estatuto de los Trabajadores).&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Y la integración directa por API?
&lt;/h2&gt;

&lt;p&gt;Pregunta legítima de cualquier perfil técnico: «¿puedo saltarme el CSV y tirar de API?».&lt;/p&gt;

&lt;p&gt;Respuesta honesta: a fecha de este artículo, la integración directa vía API con sistemas de nóminas está &lt;strong&gt;[PENDIENTE DE CONFIRMAR CON CLIENTE]&lt;/strong&gt; — no hay una API pública documentada que podamos enseñarte aquí, y preferimos no inventárnosla. El flujo soportado y probado es el que acabas de leer: export, validación y entrega.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Se integra directamente con algún programa de nóminas concreto?
&lt;/h2&gt;

&lt;p&gt;Misma honestidad: &lt;strong&gt;no hay integraciones directas confirmadas&lt;/strong&gt; con programas concretos de nóminas ni con gestorías [PENDIENTE DE CONFIRMAR CON CLIENTE]. Lo que sí funciona hoy es el puente universal: la mayoría de software de nóminas y gestorías aceptan importación de datos tabulares (CSV) o trabajan directamente con los informes del periodo. Pregunta a tu gestor qué formato de importación acepta su herramienta y pacta el mapeo de columnas del Paso 3.&lt;/p&gt;

&lt;p&gt;¿Menos glamuroso que un webhook? Sí. ¿Funciona con cualquier gestoría de España sin depender de que dos proveedores se pongan de acuerdo? También.&lt;/p&gt;

&lt;h2&gt;
  
  
  En resumen
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nucleo360 registra la jornada (registro inmutable, con trazabilidad) y &lt;strong&gt;exporta&lt;/strong&gt;; la nómina la calcula tu gestor o tu software de nóminas.&lt;/li&gt;
&lt;li&gt;Valida siempre antes de entregar: totales, huecos y solapes. El script de arriba es un punto de partida.&lt;/li&gt;
&lt;li&gt;Pacta el formato con tu gestoría una vez y por escrito; UTF-8, &lt;code&gt;;&lt;/code&gt; e ISO 8601 te evitan el 90 % de los problemas.&lt;/li&gt;
&lt;li&gt;API pública e integraciones directas con programas concretos: pendientes de confirmar; hoy el camino es el export.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si quieres ver el módulo de registro horario en detalle (el plan Basic es gratuito y sin permanencia), tienes toda la información en &lt;a href="https://nucleo360.com" rel="noopener noreferrer"&gt;nucleo360.com&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Última actualización: julio de 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://nucleo360.com" rel="noopener noreferrer"&gt;Nucleo360.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rrhh</category>
      <category>puppet</category>
      <category>database</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Puppetlabs Modules Now Have Tiered Review Cycles</title>
      <dc:creator>Jason St-Cyr</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:16:39 +0000</pubDate>
      <link>https://dev.to/puppet/puppetlabs-modules-now-have-tiered-review-cycles-42ob</link>
      <guid>https://dev.to/puppet/puppetlabs-modules-now-have-tiered-review-cycles-42ob</guid>
      <description>&lt;p&gt;If you've been watching the&amp;nbsp;&lt;a href="https://forge.puppet.com/modules/puppetlabs?utm_medium=social&amp;amp;utm_source=linkedin&amp;amp;utm_campaign=2026-puppet-cloud-repatriation-trends-2026&amp;amp;utm_content=blog&amp;amp;limit=25&amp;amp;sort_by=latest_release&amp;amp;module_groups=base%20pe_only" rel="noopener noreferrer"&gt;Puppetlabs namespace on the Forge&lt;/a&gt;&amp;nbsp;(or waiting on a pull request you opened) you've likely noticed that the pace of inclusion of community pull requests and fixes into the module releases has slowed over the last several cycles. That isn't how we want to serve the community that built these modules with us. The team has been reviewing how we can improve and this post is our commitment to do better. Here are the steps we're taking now:&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Clear tiers with review cadences.&lt;/strong&gt;&amp;nbsp;Modules in the puppetlabs namespace will be grouped into three tiers, each with a defined review schedule (weekly, monthly, or quarterly).&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Defining what “review cadence” means in practice.&lt;/strong&gt;&amp;nbsp;Every community PR gets engineering review in the next scheduled cycle for that module’s tier. &amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Showing progress monthly.&lt;/strong&gt;&amp;nbsp;We’ll continue to publish the monthly Modules Roundup covering what was released.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Tiered Approach to Priorities&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;We've categorized supported modules in the puppetlabs namespace into three tiers, each with a defined community review cadence:&amp;nbsp;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Tier&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Count&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Community review cadence&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Tier 1:&lt;/strong&gt; core, business-critical modules&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Weekly&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Tier 2:&lt;/strong&gt; important, meaningfully used modules&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Monthly&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Tier 3:&lt;/strong&gt; niche or low-usage modules&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Quarterly&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  What a Review Cadence Means
&lt;/h3&gt;

&lt;p&gt;Every community pull request (PR) on a module in the puppetlabs namespace gets engineering review during the next scheduled cycle for that module's tier. This doesn’t mean that every PR will be accepted. Sometimes a pull request needs feedback or changes, some pull requests won't fit a module's direction, but the cadence is intended to make sure that PRs will no longer sit quietly in a queue. That is the baseline we're holding ourselves to with these tiers and review cadences.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;We do have a backlog of requests over the years and we will be working through that backlog as well, but priority will be given to active contributions for the purposes of our review cadence.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 1: Our highest-priority modules&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;The following modules are our committed Tier 1 set. These modules will get a weekly review, with nightly CI coverage, and get priority on maintenance capacity:&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  puppetlabs-apache&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-apt&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-augeas_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-concat&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-cron_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-docker&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-firewall&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-haproxy&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-inifile&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-java&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-java_ks&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-lvm&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-mount_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-mysql&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-ntp&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-package&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-postgresql&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-powershell&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-reboot&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-registry&amp;nbsp;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-ruby_task_helper&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-service&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-sshkeys_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-stdlib&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-vcsrepo&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tier 2: Monthly reviews&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;The following modules have currently been assigned to our Tier 2 for prioritization. These modules will get a monthly review.&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &amp;nbsp;puppetlabs-accounts&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-acl&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-bolt_shim&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-chocolatey&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-facter_task&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-iis&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-kubernetes&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-motd&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-mount_iso&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-node_encrypt&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-puppet_conf&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-satellite_pe_tools&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-scheduled_task&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-sqlserver&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-sslcertificate&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-tomcat&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-windows_env&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-windows_eventlog&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-wsus_client&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tier 3: Quarterly reviews&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;The modules assigned to Tier 3 are still supported but will not generally be getting a high degree of priority. These modules will be reviewed quarterly and released as needed.&amp;nbsp;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  ca_extend&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  influxdb&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppet_operational_dashboards&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-bash_task_helper&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-dropsonde&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-dsc_lite&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-facts&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-host_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-node_manager&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-pe_databases&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-pe_event_forwarding&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-pe_status_check&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-puppet_bolt_server&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-puppet_metrics_collector&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-puppet_status_check&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-selinux_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-splunk_hec&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-yumrepo_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-zfs_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  puppetlabs-zone_core&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  ruby-pwsh&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  support-tasks&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Product and Engineering teams are still reviewing the puppetlabs modules for final placement in Tier 2 or Tier 3 and will follow the cadence associated with their tier once that placement is confirmed. Ultimately, the lists above might shift slightly as the team finds that some modules might need more attention than others.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  What has already shipped?&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;It is one thing to say you will do better and quite another to follow through. We’re sharing this now because we have tangible changes already underway. In a focused sprint on Tier 1 modules, the team &lt;strong&gt;triaged and actioned several open community pull requests,&lt;/strong&gt;&amp;nbsp;some merged after review, some closed after discussion, others consolidated with newer work. You’ll see several modules released this month and next with these merged changes on the Forge. Keep an eye on the&amp;nbsp;&lt;a href="https://forge.puppet.com/modules/puppetlabs?utm_medium=social&amp;amp;utm_source=linkedin&amp;amp;utm_campaign=2026-puppet-cloud-repatriation-trends-2026&amp;amp;utm_content=blog&amp;amp;limit=25&amp;amp;sort_by=latest_release&amp;amp;module_groups=base%20pe_only" rel="noopener noreferrer"&gt;Forge modules list&lt;/a&gt;&amp;nbsp;or check out the next&amp;nbsp;&lt;a href="https://dev.to/jasonstcyr/series/34389"&gt;Puppet Modules Roundup&lt;/a&gt;&amp;nbsp;post for a summary!&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  On the Issues With CI for community PRs&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;We're aware that testing community contributions has been harder than it should be. The current pull request model makes it difficult to run the full acceptance test suite against a contributor's PR without manual effort by Perforce employees, which slows reviews and discourages contributions. Solving this is a priority for the team and we have been prototyping an improved approach that will meet both user expectations and maintaining a secure infrastructure. We’ll share specifics once it's working end-to-end. This is a known gap we're committed to closing.&amp;nbsp;&lt;/p&gt;

&lt;h2&gt;
  
  
  How We'll Show Our Work&amp;nbsp;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Monthly Modules Roundup.&lt;/strong&gt; We publish a roundup each month covering what &amp;nbsp;modules have been released, who contributed, and what’s next. You can follow the series here: Puppetlabs Modules Roundup on dev.to.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Contributor recognition.&lt;/strong&gt; The release notes on the Forge and in the monthly roundup will call out merged community PRs by name.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Public GitHub transparency.&lt;/strong&gt;&amp;nbsp;We will be following up with contributors directly in pull requests and issues in our open source modules. In advance of a release, we will continue to merge and close PRs so that you can see what will be included in an upcoming release.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How can you help?&amp;nbsp;
&lt;/h2&gt;

&lt;p&gt;Keep contributing! Keep filing issues. Keep telling us when a module is in your way. If a PR of yours has stalled out, please rebase it or comment on the PR. And if the tiering above looks wrong for how &lt;em&gt;you&lt;/em&gt; use Puppet day-to-day, let us know! The whole point of publishing this article is so that the community can understand what is changing and also to invite you to shape where the priority goes.&amp;nbsp;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tiering is not a one-way decision.&lt;/strong&gt; &amp;nbsp;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The tiers outlined here have been based on the activity we have observed in our analytics and the importance identified by customers. If a module you depend on isn't in the tier you think it should be, or perhaps a long-waiting PR or issue is blocking you, reach out via the Puppet Community Slack or leave a comment on the monthly Puppet Modules Roundup posts. We want your input to make sure the tiering meet the needs of all our users.&lt;/p&gt;

</description>
      <category>puppet</category>
    </item>
    <item>
      <title>Driving Value from Puppet Metrics: Puppet Observability Data Connector</title>
      <dc:creator>klab-systems</dc:creator>
      <pubDate>Mon, 13 Jul 2026 16:28:45 +0000</pubDate>
      <link>https://dev.to/puppet/driving-value-from-puppet-metrics-puppet-observability-data-connector-391f</link>
      <guid>https://dev.to/puppet/driving-value-from-puppet-metrics-puppet-observability-data-connector-391f</guid>
      <description>&lt;h2&gt;
  
  
  What is the Puppet Observability Data Connector?
&lt;/h2&gt;

&lt;p&gt;The Puppet Observability Data Connector is a &lt;a href="https://forge.puppet.com/modules/puppetlabs/puppet_data_connector/readme?utm_medium=social&amp;amp;utm_source=linkedin&amp;amp;utm_campaign=2026-puppet-cloud-repatriation-trends-2026&amp;amp;utm_content=blog" rel="noopener noreferrer"&gt;premium Forge module&lt;/a&gt; included with Puppet Enterprise Advanced (PEA). This module provides a deeper dive into your Puppet agent reports. Visualizing these metrics gives you a great way to identify what is healthy and unhealthy in your environment.&lt;/p&gt;

&lt;h4&gt;
  
  
  Behind the scenes, this module provides 2 core functionalities.
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;It provides a report processor to convert Puppet reports into usable metrics.&lt;/li&gt;
&lt;li&gt;It manages an exporter to serve these metrics for your time series database to scrape.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example Metrics
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Failed nodes&lt;/li&gt;
&lt;li&gt;Changed nodes&lt;/li&gt;
&lt;li&gt;Catalog cache failures&lt;/li&gt;
&lt;li&gt;Stale nodes&lt;/li&gt;
&lt;li&gt;Corrective changes&lt;/li&gt;
&lt;li&gt;Out of sync resources&lt;/li&gt;
&lt;li&gt;Average total run time&lt;/li&gt;
&lt;li&gt;Max run time&lt;/li&gt;
&lt;li&gt;Run time breakdowns

&lt;ul&gt;
&lt;li&gt;Total run time&lt;/li&gt;
&lt;li&gt;Fact generation time&lt;/li&gt;
&lt;li&gt;Catalog application time&lt;/li&gt;
&lt;li&gt;Config retrieval time&lt;/li&gt;
&lt;li&gt;Plugin sync time&lt;/li&gt;
&lt;li&gt;Convert catalog time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Managed resource count by host&lt;/li&gt;
&lt;li&gt;Managed resource count over time&lt;/li&gt;
&lt;li&gt;Catalog application time trends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using the metrics provided by Puppet Observability Data Connector, you can make impactful dashboards. Below are some examples that I have created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; All dashboards can be filtered by the environment and/or host. All thresholds for color coding can be modified to fit your environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fleet Status Dashboard Example
&lt;/h2&gt;

&lt;p&gt;This example 'Fleet Status' dashboard provides an always-open first-look insight into whether anything in your fleet requires immediate attention. I will break this down by section.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Use a Fleet Status Dashboard?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;After deploying Puppet code to confirm no regressions&lt;/li&gt;
&lt;li&gt;During incidents to identify affected nodes&lt;/li&gt;
&lt;li&gt;As part of a daily ops review to verify fleet-wide compliance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Fleet Health Summary (stat panels)
&lt;/h3&gt;

&lt;p&gt;A top-level count of nodes in each state from the most recent run. Six stats that give you an instant fleet pulse without scrolling.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0dz43nzvwnzt0vq1awgo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0dz43nzvwnzt0vq1awgo.png" alt="Fleet Health Summary" width="800" height="143"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Nodes Reporting&lt;/td&gt;
&lt;td&gt;Quantity of nodes submitting reports; this number should be 1:1 with the amount of Puppet agent managed nodes in your environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed Nodes&lt;/td&gt;
&lt;td&gt;Nodes where &lt;code&gt;puppet_status{state="failed"} == 1;&lt;/code&gt; any non-zero value requires immediate investigation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed Nodes&lt;/td&gt;
&lt;td&gt;Nodes where Puppet applied changes in the last run; expected after a code push, unexpected otherwise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unchanged Nodes&lt;/td&gt;
&lt;td&gt;Nodes fully converged — your desired steady state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catalog Cache Failures&lt;/td&gt;
&lt;td&gt;Nodes that could not obtain a fresh catalog and fell back to a cached one. Triggers on server/network unreachable &lt;strong&gt;or&lt;/strong&gt; any catalog compilation error (duplicate resource declaration, undefined variable, syntax error, missing module)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stale Nodes (&amp;gt;2h)&lt;/td&gt;
&lt;td&gt;Nodes that haven't reported in over two run intervals; the agent may be down, hung, or disconnected&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Node Run Status (bar gauges)
&lt;/h3&gt;

&lt;p&gt;Per-node breakdowns of the two most critical run-level signals.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fotuc0tywzr5cjfxk4v80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fotuc0tywzr5cjfxk4v80.png" alt="Node Run Status" width="799" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Time Since Last Puppet Run&lt;/td&gt;
&lt;td&gt;Minutes since each node last phoned home. Green = within one run interval (~30 min), yellow = approaching stale, red = definitely stale. Use to find silent failures where the agent has stopped running entirely.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transaction Completed by Host&lt;/td&gt;
&lt;td&gt;Whether the last run completed (1) or was aborted mid-run (0). An aborted transaction means the node's actual state is unknown — treat it the same as a failure.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Compliance &amp;amp; Drift (stats + bar gauges + time series)
&lt;/h3&gt;

&lt;p&gt;This section separates &lt;em&gt;intentional&lt;/em&gt; changes (deployments) from &lt;em&gt;unintentional&lt;/em&gt; drift (external actors modifying managed state).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffitoz4ji3qmnkw7eg9ki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffitoz4ji3qmnkw7eg9ki.png" alt="Compliance and Drift" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Corrective Changes (Fleet)&lt;/td&gt;
&lt;td&gt;Aggregate count of corrective changes across all nodes. A corrective change means Puppet found a resource in the wrong state and fixed it — something external changed it. Persistent non-zero values are a compliance red flag.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Failed Resources (Fleet)&lt;/td&gt;
&lt;td&gt;Resources that Puppet attempted to enforce but could not. Non-zero always warrants investigation.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Event Failures (Fleet)&lt;/td&gt;
&lt;td&gt;Resource-level event failures, which can appear even on nodes not marked failed. Catches partial failures.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Out-of-Sync Resources (Fleet)&lt;/td&gt;
&lt;td&gt;Resources declared in the catalog but not yet in the desired state. Elevated values indicate pending convergence or a broken dependency chain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrective Changes by Host&lt;/td&gt;
&lt;td&gt;Identifies which specific nodes are experiencing drift. Nodes with persistent corrective changes may have rogue processes or manual interventions overwriting Puppet-managed state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed Resources by Host&lt;/td&gt;
&lt;td&gt;Identifies which nodes have broken resources. Cross-reference with the node's Puppet report for the specific resource type and error message.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Corrective Changes Over Time&lt;/td&gt;
&lt;td&gt;Trend view — spikes correlate with manual changes, automated tooling conflicts, or software self-repair mechanisms overwriting managed files.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failed Resources Over Time&lt;/td&gt;
&lt;td&gt;Trend view — a step-change increase after a code push indicates a bug in new Puppet code. A gradual increase may indicate environment drift.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Catalog Cache Status (stats + bar gauge)
&lt;/h3&gt;

&lt;p&gt;Catalog cache usage is a leading indicator of Puppet infrastructure health, often surfacing issues before nodes start failing outright.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqtaxc9avqjvhkm1c521.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqtaxc9avqjvhkm1c521.png" alt="Catalog Cache Status" width="800" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Nodes: Cache Used on Failure&lt;/td&gt;
&lt;td&gt;A fresh catalog could not be obtained. Common causes: Puppet server unreachable, network failure, or a catalog &lt;strong&gt;compilation error&lt;/strong&gt; (duplicate resource declaration, undefined variable, syntax error, missing module). The node ran with a potentially stale catalog — investigate PE server logs and the agent's last run report.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nodes: Cache Explicitly Requested&lt;/td&gt;
&lt;td&gt;Nodes intentionally running offline (e.g., --use-cached-catalog). Expected during planned maintenance; unexpected otherwise.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nodes: No Cache (Fresh Catalog)&lt;/td&gt;
&lt;td&gt;Healthy nodes compiling a fresh catalog every run — your desired steady state.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catalog Cache on Failure – by Host&lt;/td&gt;
&lt;td&gt;Pinpoints which nodes are falling back to cache. Use to determine whether it's a widespread compiler/network issue or a node-specific catalog compilation error (check that node's agent log for the exact cause).&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Full Dashboard Snapshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fit40lpt8vtjwatndgt0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fit40lpt8vtjwatndgt0k.png" alt="Full Fleet Status Dashboard" width="800" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Performance Example Dashboard
&lt;/h2&gt;

&lt;p&gt;This example 'Run Performance' dashboard acts as your performance and capacity planning dashboard. It answers whether Puppet is running efficiently and helps you locate bottlenecks before they become outages. I will break this down by section.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to use a Run Performance dashboard?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Run times are creeping up across the fleet&lt;/li&gt;
&lt;li&gt;After adding new modules or resource types to identify compile/apply costs&lt;/li&gt;
&lt;li&gt;To compare performance across environments (production vs. feature_demo)&lt;/li&gt;
&lt;li&gt;When planning infrastructure scaling (for example, adding more compilers or faster agents)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Performance Summary (stat panels)
&lt;/h3&gt;

&lt;p&gt;Fleet-wide performance KPIs. These numbers represent your overall SLA for Puppet run completion.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qlt834r6v7gt37a35j9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3qlt834r6v7gt37a35j9.png" alt="Performance Summary" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Avg Total Run Time&lt;/td&gt;
&lt;td&gt;The mean end-to-end run duration across all selected nodes. Green &amp;lt; 120s, yellow 120–300s, red &amp;gt; 300s.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Max Total Run Time&lt;/td&gt;
&lt;td&gt;The slowest node in the fleet — identifies outliers dragging down SLA.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Fact Generation Time&lt;/td&gt;
&lt;td&gt;How long Facter is taking on average. This phase runs before catalog compilation so delays here block everything downstream.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Avg Catalog Application Time&lt;/td&gt;
&lt;td&gt;How long Puppet spends enforcing resources. A reliable proxy for catalog complexity and system responsiveness.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Run Time Trends (time series)
&lt;/h3&gt;

&lt;p&gt;Long-term trend views to distinguish persistent regressions from one-off anomalies.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe16dr9tllbi3uq5zjgvt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe16dr9tllbi3uq5zjgvt.png" alt="Runtime Trends" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Run Time Over Time&lt;/td&gt;
&lt;td&gt;The most important single trend. A sudden step-change after a deployment indicates new expensive resources. A gradual increase over weeks suggests catalog bloat or system degradation. A red threshold line at 300s provides a visual SLA boundary.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fact Generation Time Over Time&lt;/td&gt;
&lt;td&gt;Isolates Facter performance from the rest of the run. Upward trends often indicate new custom facts, growing hardware inventories, or external fact sources becoming slow.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Run Time Breakdown – Latest Run (by Host) (bar gauges)
&lt;/h3&gt;

&lt;p&gt;Per-node, per-phase timing from the most recent run. Use this to pinpoint &lt;em&gt;which phase&lt;/em&gt; is slow on &lt;em&gt;which node&lt;/em&gt; rather than just knowing the total is high.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4t7s9unvsjeo7pxkdaep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4t7s9unvsjeo7pxkdaep.png" alt="Runtime Breakdown" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Panel&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Phase&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Optimization Lever&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Run Time&lt;/td&gt;
&lt;td&gt;End-to-end wall clock&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fact Generation Time&lt;/td&gt;
&lt;td&gt;Running Facter&lt;/td&gt;
&lt;td&gt;Audit custom facts; disable unused external facts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Catalog Application Time&lt;/td&gt;
&lt;td&gt;Enforcing all resources&lt;/td&gt;
&lt;td&gt;Reduce catalog size; identify slow resource types (Package, Exec)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config Retrieval Time&lt;/td&gt;
&lt;td&gt;Fetching compiled catalog from PE server&lt;/td&gt;
&lt;td&gt;Scale compilers; check network latency between agent and server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plugin Sync Time&lt;/td&gt;
&lt;td&gt;Downloading Puppet functions/types/providers&lt;/td&gt;
&lt;td&gt;Audit and prune modules; check if all plugins are necessary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Convert Catalog Time&lt;/td&gt;
&lt;td&gt;Transforming compiled catalog into apply-ready format&lt;/td&gt;
&lt;td&gt;Indicates catalog structural complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Resource Catalog (bar gauge + time series)
&lt;/h3&gt;

&lt;p&gt;Catalog size is the root cause of many performance problems. These panels correlate resource count with run time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0ceiac7t736d9jnc9ed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn0ceiac7t736d9jnc9ed.png" alt="Resource Catalog" width="798" height="228"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Managed Resources by Host&lt;/td&gt;
&lt;td&gt;Nodes with significantly more resources than peers warrant investigation — are all those resources intentional? &lt;code&gt;pe.klab.internal&lt;/code&gt; managing 2,419 resources vs 61 for simpler nodes is expected for a PE server; unexpected divergence between similar nodes is not.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total Managed Resources Over Time&lt;/td&gt;
&lt;td&gt;A sudden jump indicates a code change added many new resources. Gradual growth over months indicates catalog bloat — exported resources collecting without cleanup, or defined resource types generating more instances than expected.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Catalog Application Time Trends (time series)
&lt;/h3&gt;

&lt;p&gt;Deeper trend analysis for the two phases most sensitive to infrastructure and code changes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvhiz7jn017kcib7o8axo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvhiz7jn017kcib7o8axo.png" alt="Catalog Application Time Trends" width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  &lt;em&gt;What this tells you:&lt;/em&gt;
&lt;/h5&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Term&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Catalog Application Time Over Time&lt;/td&gt;
&lt;td&gt;Correlate spikes with git commit timestamps. A spike immediately following a deployment confirms the new code introduced expensive resources. Persistent elevation after the spike stabilizes means the cost is structural, not transient.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Config Retrieval Time Over Time&lt;/td&gt;
&lt;td&gt;Sustained increases across &lt;em&gt;all&lt;/em&gt; nodes simultaneously point to a PE server bottleneck (JVM heap, database pressure, or compiler overload). Increases on a single node suggest agent-side network issues.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Full Dashboard Snapshot
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzosx2n0dck5oj2sw3s15.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzosx2n0dck5oj2sw3s15.png" alt="Full Run Performance Dashboard" width="799" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Download the Puppet Data Connector Forge Module
&lt;/h2&gt;

&lt;p&gt;Want to try it in your environment? Download the premium Forge module now.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://forge.puppet.com/modules/puppetlabs/puppet_data_connector/readme" rel="noopener noreferrer"&gt;Get the Module&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;The Puppet Observability Data Connector provides valuable information about the Puppet agent nodes across your environment. Visualizing these metrics gives organizations key insights, allowing team members to identify problems, measure performance, and track changes. The dashboards shown here are just one of the many ways to drive value from your Puppet metrics.&lt;/p&gt;

&lt;p&gt;For assistance driving value from your Puppet metrics please ask your account team about how Professional Services could help you with dashboards that match your environment and operational priorities.&lt;/p&gt;

</description>
      <category>puppet</category>
    </item>
  </channel>
</rss>
