Files
james.maesandClaude Opus 5.5 4f850c2cf3
maven / build (push) Failing after 9s
build / maven (push) Failing after 9s
build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)
bridges/printing/pom.xml: qqq.version: 4.1.0-RC.22 -> 4.1.0-RC.26
bridges/printing/pom.xml: qbit-record-files.version: 0.1.0-RC.1 -> 0.4.0-RC.1
bridges/printing/pom.xml: qbit-printing.version: 1.0.0 -> 1.2.0-RC.1
bridges/record-files/pom.xml: qqq.version: 4.1.0-RC.22 -> 4.1.0-RC.26
bridges/record-files/pom.xml: qbit-record-files.version: 0.1.0-RC.1 -> 0.4.0-RC.1
bridges/scripting/pom.xml: qqq.version: 4.1.0-RC.22 -> 4.1.0-RC.26
bridges/scripting/pom.xml: qbit-scripting.version: 1.0.0 -> 1.1.0-RC.3
foundation/pom.xml: qqq.version: 4.1.0-RC.22 -> 4.1.0-RC.26
pom.xml: parent -> 2.2.1
pom.xml: added qqq.version=4.1.0-RC.26 (parent BOM import)
pom.xml: revision -> 1.1.0-SNAPSHOT

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 18:59:01 +00:00
..

Optional scripting bridge

This separate artifact depends on both QBits' public APIs. Neither QBit depends on the other or owns the other's tables.

Wire DocumentGenerationQBitConfig.withContextExecution(new PublishedScriptContextAdapter(scriptingService)). Trusted programmatic callers may obtain PublishedScriptContextAdapter.reference(scriptingService.selectPublishedContext(actor, publicationId).pin()); the reference includes publication ID, artifact ID and SHA-256. A malformed reference, missing exact-build context-test success, changed hash, missing permission, inaccessible source record, unavailable worker or failed execution blocks generation.

For native user authoring, create one adapter and install both .withContextExecution(adapter) and .withContextSelection(adapter). The template's Select or clear published context script action searches current-authorized isolated projects and selects a publication tested successfully as CONTEXT on its exact build. The server obtains the immutable artifact/hash reference; users never construct it. Clearing is explicit. Discovery is bounded to20 matching projects/100 publication candidates and50 results; narrow by project name. Older exact selection lookup remains authorized independently. Publishing a newer script never moves an existing template pin. The direct reference(...) helper remains compatible for trusted programmatic integration.

Eligibility is checked for direct raw-reference publication and execution as well as the chooser. An older document pin that was published using only a hook test now fails closed until that exact build has successful context-test evidence. The adapter never substitutes another build or silently republishes a template. Generic Scripting context execution retains its existing API semantics; this stricter document contract belongs to the optional adapter.

The adapter fetches the actual source under current QQQ permissions. Scripts receive context.payload.context.record and context.payload.context.source through the worker's main(context, qqq) entrypoint. The return value is a bounded JSON object; Document Generation reserves its original record context. Published signed declarations are the maximum read grants; hosts may supply a narrower grant selector. QQQ table, record and field permissions still apply to every broker read.

Build from the Document Generation repository using its wrapper: ./mvnw -f bridges/scripting/pom.xml verify, after installing the matching Scripting QBit and this repository foundation (./mvnw -pl foundation install). This bridge does not supply or qualify an execution worker.

Test fixtures explicitly allow volatile storage through the scripting test base; production hosts must configure the scripting owner's qualified transaction policy and isolated worker.

Cold maintenance for document context publications

Configure the optional owner-neutral SPI with ScriptingRuntime.withWarmPublicationSource(new GenerationWarmPublicationSource(definitions)). The native scripting lifecycle calls it under its fresh declared service principal. Give that principal scripting.warm, scripting.view, document-generation.view and document-generation.warm, the required metadata read ceilings and access to required script projects. Do not add scripting.execute. The generation inventory requires a freshly minted, currently declared native service identity; an ordinary user carrying the same role strings is not sufficient. No source record, template body or executable bundle enters this supplier. The declared warm target-table set intersects the generation host's configured source tables.

The inventory includes current draft pins (preview), active published revision pins, revisions of QUEUED/RUNNING queue items and incomplete synchronous batches. Completed request/revision history and historical PREVIEW snapshots do not reserve capacity. Every queue pin must match its immutable revision. Complete publication:id:artifact:sha256 tuples remain intact; Scripting independently verifies project visibility, artifact/HMAC and exact-build CONTEXT test evidence. Warming grants no execution or broker authority. No hot path prepares a missing artifact.

Apply the additive 20261031-warm-batch-completion-{h2,mysql}.sql migration once before adopting this version on an existing database. Fresh schemas include nullable document_generation_batch.completed. NULL legacy batches remain required: completion is never inferred from a partial request history. Only successful replay of the same pinned batch selection marks completion; failures, changed selections and partial results cannot release its pin. Queue reconciliation and retained-original reprint do not execute historical scripts. Unknown generation uses the current publication.

The inventory projects code metadata only: at most 1000 templates, 1000 required revisions, 1000 incomplete batches, 1000 required queue headers and 10016 pending queue items, each with a lookahead row. This is a bounded supported capacity, not a performance claim. Required metadata loss, overflow, hidden fields, mismatched native/owner reads or combined scripting pin/byte limits fail readiness rather than truncate. The explicit maintenance projection bypasses only this owner's known actor/parent POST_QUERY_RECORD filter on work tables. Ordinary caller queries are unchanged; custom host filters and row locks are refused. Native table/field, credential/channel and current service declaration checks still apply. No source records or initiating actors are projected.

Historical first restart-tranche evidence: the initial five native-memory inventory tests and existing three context adapter tests passed; four new translation tests exposed an invalid empty native test instance before reaching assertions. The fixture now uses normal native backend/table/auth metadata, and a sixth inventory regression covers draft-only pins and draft changes. This corrected snapshot and final restart qualification remain root-owned and pending. These tests do not qualify a worker or database.

The earlier conservative retained-history policy is superseded by the active/in-flight inventory and cold idle-session reclamation described above. Parent Generation67 (34 service/22 JDBC/11 inventory) and full Scripting227 gates passed with zero failures/errors/skips and Checkstyle0; scripting coverage also passed. The actual H2 migration case passed; the inherited MySQL migration case remains a separate gate. Earlier65/5 and67/2 Generation failures remain preserved with their corrections in the source handoff. Required active code can still exceed configured capacity. Reserve headroom for authoring: bounded use leases protect newly prepared code through test dispatch/publication or binding commit, so a periodic pass cannot discard it between preparation and use. Busy/protected sessions may defer reclamation; readiness stays down until the complete current inventory is prepared.