Release 1.3.0
| Release Number | 1.3.0 |
|---|---|
| Release Type | Feature |
| Release Date | September 23rd, 2026 |
| Tag | v1.3.0 |
Release summary​
After upgrading, you can write generators whose relationship writes survive several runs writing to the same node at once, and whose deletes do not bring deleted peers back on the next save. The managing skills also load when you modify, debug, or extend an existing schema, object file, check, transform, generator, or menu, not only when you create one. Menu, transform, and .infrahub.yml guidance that pointed you at the wrong result has been corrected.
Nothing about how you invoke the skills has changed, and no files in your repository need an edit to keep working. One item is worth a review on your side.
- Review generators that add peers with
.add()followed by.save()on a node that several runs can write at once.
See Upgrade notes for full details.
Write generators that stay correct when several runs write to the same node​
Build generators with the managing-generators skill that keep every peer when runs overlap, delete peers without resurrecting them, and keep tracking intact across helper modules (#86, #147, #78).
What changed:
- Add peers with
node.add_relationships()on a node that several generator runs can write at once. The earlier.add()plus.save()pattern is a client-side read-modify-write:save()sends the whole peer list, so a concurrent run overwrites peers another run just added. In a measured run, three of eight peers survived. - Detach a relationship before you delete its peers. Deleting a peer through its own
.delete()leaves it in the holder's in-memory relationship manager, so a latersave(allow_upsert=True)sends the deleted id again. The rule applies to a hydrated relationship, names what hydrates one (include=["<rel>"], notprefetch_relationships=True), and gives the cheapest fix: do not hydrate the relationship on the handle you save. - Keep tracking consistent across helper modules. Tracking covers every
save()reachable fromgenerate(), including saves inside imported helpers. A generator whose own file opted out of tracking correctly still deleted a leaf port, because a shared addressing helper saved with the default.
Get the managing skills when you change existing work​
Modify, debug, or extend an existing artifact and the matching skill now loads, where before only creation work triggered it (#143, #78).
What changed:
- managing-checks, managing-menus, managing-objects, managing-transforms, and managing-schemas fire on modifying, debugging, and extending an existing artifact.
- managing-generators fires on modification and debugging work, and its mirror surfaces now match its description.
- importing-data and converting-netbox-device-types gained the same triggers.
Bug fixes​
- The menus skill no longer recreates the IPAM section that Infrahub already ships. To place your items under a built-in section, attach them with
parent: BuiltinIPAM(#24). - Artifact regeneration polling in the transforms skill now waits until each artifact's body can be retrieved — status
Ready, or astorage_idpresent — rather than until theCoreArtifactnode exists. A poll that only counted nodes returned artifacts whose content fetch still returned 404 (#88). - The
.infrahub.ymlreference ininfrahub-commonnow documents thegraphql_fragmentssection, which it had omitted from a block headed "Complete Structure", and the audit skill no longer flags that key as unrecognized. A test reads the section list from the repository configuration model in the SDK, so a section added upstream fails the test suite once the SDK is updated (#122). schema.graphqlis documented as the output ofinfrahubctl graphql export-schema, which you re-export rather than edit by hand (#29).
Minor changes​
Release process
- Releases now arrive as a reviewable
chore(release)pull request, gated by thesmokeevaluation suite. The changelog is assembled with towncrier from news fragments that every pull request adds, and the assembled changelog becomes the GitHub Release body. - The
smokeevaluation preset no longer runs on every pull request that touchesskills/. It bills a real API key, so it runs on dispatch only; the fullregressionsuite runs weekly againstmain.
Developer experience
.agents/is now the source of truth for the contributor skills and rules, and.claude/and.codex/hold only relative symlinks into it, so agents other than Claude find the same skills.scripts/check-symlinks.pychecks the five remaining routing links.- Contributors have a four-skill pipeline for skill changes: analyze a bug or question an idea, write the failing evaluation or test, then implement and ship it. It records which documentation a change leaves stale and updates those pages in the same change.
- Rule authoring asks how often a failure was seen, and requires the evaluation prompt to use a different scenario from the incident that motivated the rule.
- Five recurring review lessons, and a corrected evaluation discrimination proof, were added to the contributor guidance.
Upgrade notes​
Generators that add peers concurrently​
If: you wrote a generator that adds peers with .add() followed by .save(), and more than one run can write to the same node.
Then: switch those writes to node.add_relationships(). The skill does not rewrite existing generators, and the old pattern can lose peers that another run added.
Notes: a generator that only one run at a time writes to is not affected.
Full changelog​
Fixed​
- Menu skill no longer recreates the IPAM section Infrahub already ships, and documents attaching to a built-in section with
parent: BuiltinIPAM(#24). schema.graphqldocumented asinfrahubctl graphql export-schemaoutput (#29).- managing-generators triggers on modification and debugging work, and tracking covers saves inside imported helpers (#78).
- managing-generators teaches
node.add_relationships()for concurrent peer writes (#86). - managing-transforms artifact regeneration polling waits for a retrievable body (#88).
graphql_fragmentsdocumented in the.infrahub.ymlreference, and no longer flagged by the audit skill (#122).- Managing skills, importing-data, and converting-netbox-device-types trigger on modifying, debugging, and extending existing work (#143).
- managing-generators teaches the ordering between detaching a relationship and deleting its peers (#147).
Housekeeping​
.agentsand.codexrouting directories for agents other than Claude.- Four-skill contributor pipeline for skill changes.
- towncrier news fragments replace release-drafter, and releases arrive as a reviewable pull request gated by the
smokeevaluation suite. - Corrected evaluation discrimination proof and ground truth ladder.
- Five review lessons harvested into the contributor guidance.
- Contributor skills moved from
.claude/skills/to.agents/skills/. - Leftover release-drafter guidance replaced in the contributor docs.
- Rule authoring asks for failure frequency and a scenario distinct from the motivating incident.
smokeevaluation preset no longer runs on every pull request.- The skill-change pipeline assesses which documentation a change leaves stale.
Skills included​
- infrahub-managing-schemas
- infrahub-managing-objects
- infrahub-managing-checks
- infrahub-managing-generators
- infrahub-managing-transforms
- infrahub-managing-menus
- infrahub-auditing-repo
- infrahub-analyzing-data
- infrahub-reporting-issues
- infrahub-reporting-skill-gaps
- infrahub-collecting-diagnostics
- infrahub-analyzing-diagnostics
- infrahub-importing-data
- infrahub-teaching-concepts
- infrahub-converting-netbox-device-types