Innesti Digital

Case

Libretto

A CMS for design studios and their clients, which we built with AI agents. It is the proof of the method: here are the numbers.

The librettocms.com home page

The librettocms.com home page, on 27 October 2026. librettocms.com

What it is

Libretto is a system for building sites in a visual editor, on top of each siteโ€™s own design system: colours, type, space and components are parameters of the site. Motion is staged with GSAP, text is published in every language the site speaks, and the client edits words and images without touching the design. Agents use it in two ways: they write its code and, through an MCP interface, they build and edit sites.

How it grew

The first commit is from 21 April 2026. The pace was not steady: 662 commits in April, 90 in June, 2,197 in October, more than all the previous months together. Of 3,665 commits, 2,642 carry an AI agent as co-author.

Type errors, at each step of the ratchet

1,185type errors on 6 October 2026
234on 20 October
Type errors in Libretto, application plus tests, from 6 to 20 October 2026: from 1,185 to 234, minus 80 per cent. CI limit 220.

Type errors in Libretto, application plus tests, at each step of the ratchet. The dashed line is todayโ€™s CI limit: 220 (100 application and 120 tests). It can only go down.

Source the ratchet comment in .github/workflows/ci.yml

The ratchet

35

25 Oct ยท catalogue trim

knip issues at each step of the ratchet, 6 to 25 October 2026: from 483 to 35.

Issues reported by knip: files, exports and dependencies nobody uses. The CI limit goes down with the number; a push that exceeds it stops.

Source the ratchet comment in .github/workflows/ci.yml

tutti i controlliprincipaleramounionenessuna scorciatoiatutti i controlliprincipaleramo

The gate in front of main

On GitHubโ€™s free plan, Librettoโ€™s private repository cannot protect its main branch. The gate is a script: it merges the branch into main in a dedicated copy, with its own database, and runs the same fourteen steps as CI, cheapest first. Only if they all pass does main move.

  1. install
  2. generate
  3. operation contracts
  4. reference docs
  5. layer boundaries
  6. knip
  7. complexity
  8. typecheck app
  9. typecheck tests
  10. database seed
  11. unit
  12. integration
  13. build
  14. public bundle budget
changesunitunit-reportintegrationqualitypublic-bundlemutationci gatedeployneeds: 7 jobci gate7 jobdeploy

The seven CI jobs

Every push runs these seven jobs; a final check fails if a single one is red, and the release waits for that check.

  • changes
  • unit
  • unit-report
  • integration
  • quality
  • public-bundle
  • mutation

Other limits

copiadaticontrollocopia + dati

Parallel slots

Several agents at work, each with its own checkout and database.

git worktree; scripts/merge-gate.mjs (a gate checkout with its own database)

rifiutatamodificacontrollorifiutatamodifica

Tree check

Every write goes through validateTree, or is refused.

validateTree, on every write to the tree (I1-I14)

modifica 1modifica 2modifica 3provaannullaapplicarevisioneprovaapplicarevisione

Dry run, then apply

A batch of operations is tried without writing, then applied.

docs/architecture/mcp.md: dry_run_ops, apply_ops

adminthemessharedserver17 regole ยท 0 eccezioniadminthemessharedserver17 regole ยท 0 eccezioni

Layer boundaries

Some imports cannot be written.

.dependency-cruiser.cjs (17 rules), .dependency-cruiser-known-violations.json (0)

Aa12721AA 4,5:12,43:1 rifiutatoAa121AA 4,5:12,43:1 rifiutato

AA contrast gate

A colour below 4.5:1 is not saved.

docs/design/design-system-section.md, Contrast

approvatorna indietropropostedecide una personapubblicaapprovadecideuna personaproposte

A person decides

Agents propose; the choices that matter stay with a person.

Libretto plugin: publication.publish only on a personโ€™s explicit go

agenteticketcorrezioneprodottoagenteticketcorrezioneprodotto

Agent ticket loop

When an agent is blocked it opens a ticket; the fix goes back into the product.

Libretto MCP: report_issue

The numbers

Commits per day, 6 to 27 October 2026

Commits per day in Libretto from 6 to 27 October 2026; peak of 274 on 25 October. The 27th is partial.
6 Oct27 Oct

Peak: 274 commits on 25 October. The 27th is partial.

Source git log

  • commits since 21 April 2026, over 75 working days
    3,665
  • commits with an AI agent as co-author
    2,642
  • steps before main moves
    14
  • jobs in the CI check
    7
  • layer-boundary rules, 0 exceptions
    17
  • Lighthouse accessibility required of Librettoโ€™s site and docs
    100

Functions above complexity 15 are counted since 25 October: there were 149, now 143.

If something here is useful and youโ€™d like a hand making it your own, weโ€™re at info@innestidigital.it. If not, thatโ€™s fine too.