This release adds 3 notable features for engineering teams evaluating rollout.
✓ No known CVEs patched in this version
Topics
+8 more
Affected surfaces
Summary
AI summaryGit hook failures now return structured errors and validator false positives fixed.
Changes in this release
| Type | Severity | Summary | CVE |
|---|---|---|---|
| Feature | Low |
Branch‑health thresholds (`branchWarnLimit`, `branchBlockLimit`) become configurable via `config.json` (defaults 50, 80). Branch‑health thresholds (`branchWarnLimit`, `branchBlockLimit`) become configurable via `config.json` (defaults 50, 80). Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Feature | Low |
New CLI tools: `contentrain_branch_list` (lists pending branches + merge status) and `contentrain_branch_delete` (removes stale/failed branches). New CLI tools: `contentrain_branch_list` (lists pending branches + merge status) and `contentrain_branch_delete` (removes stale/failed branches). Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Feature | Low |
`contentrain_merge` can now target a branch by `model` with optional `locale`/`latest`, not just timestamped names. `contentrain_merge` can now target a branch by `model` with optional `locale`/`latest`, not just timestamped names. Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Feature | Low |
When no git remote is configured, `contentrain_submit` guides users to use `contentrain_merge` for local landing instead of failing outright. When no git remote is configured, `contentrain_submit` guides users to use `contentrain_merge` for local landing instead of failing outright. Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Feature | Low |
`contentrain_validate --fix` lands cosmetic structural fixes via auto‑merge instead of creating a pending review branch. `contentrain_validate --fix` lands cosmetic structural fixes via auto‑merge instead of creating a pending review branch. Source: granite4.1:30b@2026-06-04-audit Confidence: low |
— |
| Bugfix | Medium |
Machine-generated `[contentrain]` commits now pass `--no-verify`, avoiding hook rejections. Machine-generated `[contentrain]` commits now pass `--no-verify`, avoiding hook rejections. Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Bugfix | Medium |
Failed saves no longer leak dangling `cr/*` branches; merged branches are automatically deleted after landing. Failed saves no longer leak dangling `cr/*` branches; merged branches are automatically deleted after landing. Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Bugfix | Medium |
Git/hook failures are returned as structured, ANSI‑stripped error objects rather than raw colored blobs. Git/hook failures are returned as structured, ANSI‑stripped error objects rather than raw colored blobs. Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Bugfix | Medium |
`contentrain_status` now derives `stats.models`/`stats.entries` live instead of echoing possibly‑stale `context.json`. `contentrain_status` now derives `stats.models`/`stats.entries` live instead of echoing possibly‑stale `context.json`. Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Bugfix | Medium |
Non‑i18n models are validated against a single locale, removing phantom per‑locale "orphan content" warnings in multi‑locale projects. Non‑i18n models are validated against a single locale, removing phantom per‑locale "orphan content" warnings in multi‑locale projects. Source: llm_adapter@2026-06-04 Confidence: high |
— |
| Bugfix | Low |
Polymorphic multi-relations accept `{ model, ref }` items instead of rejecting them as strings. Polymorphic multi-relations accept `{ model, ref }` items instead of rejecting them as strings. Source: granite4.1:30b@2026-06-04-audit Confidence: low |
— |
| Bugfix | Low |
Relation integrity resolves targets using the target model's storage locale with a default‑locale fallback, eliminating false "broken relation" errors. Relation integrity resolves targets using the target model's storage locale with a default‑locale fallback, eliminating false "broken relation" errors. Source: granite4.1:30b@2026-06-04-audit Confidence: low |
— |
| Bugfix | Low |
`contentrain_content_save`'s inline validation now evaluates the committed/overlaid state, so newly created locale files are no longer reported as missing. `contentrain_content_save`'s inline validation now evaluates the committed/overlaid state, so newly created locale files are no longer reported as missing. Source: granite4.1:30b@2026-06-04-audit Confidence: low |
— |
| Refactor | Low |
`context.json` is no longer committed on feature branches; it is regenerated deterministically on the `contentrain` branch after merge, eliminating merge‑conflict class. `context.json` is no longer committed on feature branches; it is regenerated deterministically on the `contentrain` branch after merge, eliminating merge‑conflict class. Source: llm_adapter@2026-06-04 Confidence: high |
— |
Full changelog
Patch Changes
-
149fa6b: Harden the git/branch lifecycle, redesign context.json handling, and fix validator false positives.
Git & branches
- Machine-generated
[contentrain]commits now pass--no-verify, so repos with commitlint / husky / lefthookcommit-msghooks no longer reject Contentrain writes. - Feature branches are pruned automatically: a failed save no longer leaks a dangling
cr/*branch, and merged branches (auto-merge orcontentrain_merge) are deleted after landing. - Branch-health thresholds are now configurable via
config.json—branchWarnLimit(default 50) andbranchBlockLimit(default 80) — instead of being hardcoded. - New tools:
contentrain_branch_list(pendingcr/*branches + merge status) andcontentrain_branch_delete(remove a stale/failed branch; thecontentrainbranch is protected). contentrain_mergecan now target a branch bymodel(+ optionallocale/latest), not just the exact timestamped branch name.contentrain_submitwith no git remote now guides you tocontentrain_merge(local landing) instead of failing with a bare "configure a remote".- Git/hook failures are returned as structured, ANSI-stripped errors (
{ error, stage, hook?, code?, agent_hint? }) instead of a raw escaped color blob.
context.json
context.jsonis no longer committed on feature branches; it is regenerated deterministically on thecontentrainbranch after merge (single-threaded). This removes the merge-conflict class that hit parallel content saves on different branches.contentrain_statusnow derivesstats.models/stats.entrieslive instead of echoing a possibly-stalecontext.json.
Validation
- Non-i18n models are validated against a single locale, eliminating phantom per-locale "orphan content" warnings (and the wrong-locale meta files
--fixused to write) in multi-locale projects. - Polymorphic multi-relations (
relationstargeting multiple models) accept{ model, ref }items, matching the generated SDK type instead of being rejected as "must be a string". - Relation-integrity resolves targets at the target model's own storage locale (with a default-locale fallback for i18n:true targets), removing false "broken relation" errors.
contentrain_content_save's inline validation now evaluates the committed/overlaid state, so freshly created locale files are no longer reported as "missing".contentrain_validate --fixlands cosmetic structural fixes via auto-merge instead of spawning a pending review branch.
- Machine-generated
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About Contentrain/ai
Local-first MCP server for AI content governance — 13 tools for model/content CRUD, validation, normalization, and i18n across any framework.
Related context
Earlier breaking changes
- v@contentrain/[email protected] `validateModelDefinition` now returns `{ errors, warnings }` instead of a string array.
- v@contentrain/[email protected] `model_save` rejects models with unknown keys, `min > max`, invalid constraints, and `unique` on singletons.
- v@contentrain/[email protected] `content_save` now validates before committing and rejects invalid content.
- v@contentrain/[email protected] `validateModelDefinition` now returns `{ errors, warnings }` instead of a string array.
- v@contentrain/[email protected] `model_save` rejects models with unknown keys, `min > max`, invalid constraints, and `unique` on singletons.
Beta — feedback welcome: [email protected]