Skip to content

v0.34.0

Latest

Choose a tag to compare

@github-actions github-actions released this 03 Sep 09:52
· 60 commits to main since this release
v0.34.0
10b7bbc

Backend modules moved — read this before upgrading

nr_llm no longer registers an nrllm container under Administration. A top-level AI section now holds five entries: the editor task module, the overview, and three subject containers (nrllm_setup, nrllm_authoring, nrllm_operation) carrying the fourteen former flat entries. A section has no access check of its own, which is the point — the module menu hides a top-level module whose access check fails together with all its children, so an admin-only container could never hold an editor surface, and nrllm_aitasks had to sit under web for exactly that reason.

Submodule identifiers and paths are unchanged, and nrllm_overview carries 'aliases' => ['nrllm'], so backend shortcuts keep resolving and a foreign module anchored ['after' => 'nrllm'] keeps its position. What does not survive is the container's own URL /module/nrllm; it has no successor by design. ADR-183, by @CybotTM in #878.

What a run did, and whether it stuck

Three records that were designed together and only now have a reader for each other, all by @CybotTM.

A write tool names the record it wrote (#897, ADR-182). ToolResult gains an optional writeTarget — a two-scalar RecordReference of table and uid — and all seven writers set it on success. The uid a write touched used to exist only as whatever the model had put in the tool arguments, which is free-form JSON rather than a fact the runtime established. The run trace persists it as a step of its own kind, tool_write, carrying an identity and nothing the record holds, so it survives every privacy level and shows in the run timeline.

An approval binds to the state its preview showed (#901, #902, ADR-184). ADR-136 refused this fence on the premise that a writing tool here sets absolute values, and named what would reopen it: a writer whose change is relative. attach_file_to_content_element shipped ten days later and appends. On resume, the loop re-runs the preview of every approved call and compares it line for line with what the approver saw. Equal, the call executes. Different, nothing is written and the run suspends for approval again, carrying the current preview and a marker naming the call that moved.

nrllm:outcome:derive (#905, ADR-185) takes writes whose observation window has closed, asks sys_history what happened to those records afterwards, and records one outcome each: untouched is ACCEPTED_UNCHANGED, a later modification EDITED, a deletion DISCARDED. CallOutcome gains UNKNOWN for the answer that matters most — a record whose history has been purged looks exactly like one nobody touched, and reporting that as accepted would be this signal's most plausible lie.

Use-case packs can ship a working snippet library

PackSnippet gains two optional fields, both defaulting to today's behaviour (#909, ADR-186). metadata is stored as the record's metadata JSON object — the column that already carries a persona's voice and a layout's imageSize, and which the installer never wrote, so a pack could ship a persona's text and not its voice. composedByConfiguration: false declares a snippet the declaring extension resolves by uid instead of leaving it to ADR-031 tag composition; without it, a pack whose extension composes snippets per call would append every active snippet carrying those tags to the system prompt of every completion on its configuration.

nrllm:usecasepack:install <identifier> installs a pack without a backend session. The Use Case Packs module shows a plan and waits for a confirmation that a container entrypoint or a CI provisioning step cannot give, and an instance rebuilt from a database seed that predates a pack comes up with none of its records. It writes through the same installer, so re-running creates only what is missing. Like the module, it enables no tool group, enables no editor action and applies no governance profile.

Demo data and screenshots without ddev

nrllm:demo:seed ships the demo record graph with the extension — providers, models, configurations, tasks and a span of usage history, written through the ConnectionPool so it runs on whatever DBMS the instance uses (#879). It replaces two MySQL dumps and a raw-PDO script under .ddev/ that were hard-wired to one host, database and password, which is why nothing but ddev could use them. Idempotent by identifier, and every value in the history derives from (seed, day, model), so the same --days reproduces the same figures on every machine. Build/Scripts/screenshots.sh drives Playwright against a SQLite install seeded that way, and captures the module iframe rather than the window — the sixteen full-window PNGs all went stale the day the modules moved.

Fixed

  • AgentEventKind knows the two kinds it is written with. dropped has been persisted since ADR-179 and tool_write since ADR-182, and neither had a case, so kindEnum() answered null and anything filtering an event stream by typed kind silently lost those rows (#904).
  • ProviderConnectionTest no longer measures the runner: three cases asserted a wall-clock bound around a call to a non-routable address (#903).
  • The two OpenRouter capability filters declare their return type, against a Rector proposal that was wrong about them (#899).
  • The tx_nrllm_skill.identifier index is actually created — its definition carried a column prefix length the schema layer rejected (#883).
  • The Sonar rule exemptions sit where they take effect (#881).

Housekeeping

Thirteen isset guards rewritten as ??= after Rector 2.6.5 widened the rule (#908); harden-runner synced to v2.21.1 from the shared template (#911); ddev MariaDB 11.4 to 12.3 (#884); XLIFF normalized to fractor's canonical form (#882); the runner conf dropped and the ddev wiring moved into ddev (#864); the agent docs no longer steer gate runs into a pinned PHP version (#877).

Installation

composer require netresearch/nr-llm

Publication status

Security

All release artifacts are signed with Sigstore keyless signing.

Verify signatures

cosign verify-blob \
  --bundle nr-llm-0.34.0.zip.sigstore.json \
  --certificate-identity-regexp "https://github.com/netresearch/.*" \
  --certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
  nr-llm-0.34.0.zip

Verify checksums

sha256sum -c checksums.txt

Software Bill of Materials (SBOM)

SBOMs are provided in both SPDX and CycloneDX formats for supply chain transparency.