Skip to main content

Release 1.3.0

Release Number1.3.0
Release TypeFeature
Release DateSeptember 23rd, 2026
Tagv1.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.

What to expect after upgrading

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 later save(allow_upsert=True) sends the deleted id again. The rule applies to a hydrated relationship, names what hydrates one (include=["<rel>"], not prefetch_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 from generate(), 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:

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 a storage_id present — rather than until the CoreArtifact node exists. A poll that only counted nodes returned artifacts whose content fetch still returned 404 (#88).
  • The .infrahub.yml reference in infrahub-common now documents the graphql_fragments section, 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.graphql is documented as the output of infrahubctl 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 the smoke evaluation 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 smoke evaluation preset no longer runs on every pull request that touches skills/. It bills a real API key, so it runs on dispatch only; the full regression suite runs weekly against main.

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.py checks 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.graphql documented as infrahubctl graphql export-schema output (#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_fragments documented in the .infrahub.yml reference, 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​

  • .agents and .codex routing 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 smoke evaluation 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.
  • smoke evaluation 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