Files
james.maesandClaude Fable 5.1 1cdd06098d
QRun-IO/ci-policy: ci / fork-guard (push) Skipped
QRun-IO/ci-policy: ci / fork-guard (pull_request) Skipped
QRun-IO/ci-policy: native / fork-deny (push) Skipped
QRun-IO/ci-policy: native / dotnet-0 (push) Skipped
QRun-IO/ci-policy: native / fork-deny (pull_request) Skipped
QRun-IO/ci-policy: native / dotnet-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (pull_request) Successful in 10s
QRun-IO/ci-policy: ci / Scoped workflow [workflow 1e25bb5a243dfdcd95d4b9a4f780200ff8c8778a] (push) Successful in 11s
QRun-IO/ci-policy: native / native-result (push) Successful in 8s
QRun-IO/ci-policy: ci / head-profile (pull_request) Skipped
QRun-IO/ci-policy: native / native-result (pull_request) Successful in 9s
QRun-IO/ci-policy: ci / repository-policy (pull_request) Skipped
QRun-IO/ci-policy: ci / head-profile (push) Skipped
QRun-IO/ci-policy: ci / application-template-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy (push) Skipped
QRun-IO/ci-policy: ci / gradle-1 (pull_request) Skipped
QRun-IO/ci-policy: ci / application-template-0 (push) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (pull_request) Skipped
QRun-IO/ci-policy: ci / gradle-1 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-core-2-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3 (push) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-docker-3-head (push) Skipped
QRun-IO/ci-policy: ci / java-docker-4 (push) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-frontend-browser-5 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-6-head (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7 (push) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (pull_request) Skipped
QRun-IO/ci-policy: ci / java-maven-7-head (push) Skipped
QRun-IO/ci-policy: ci / node-8 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-8 (push) Skipped
QRun-IO/ci-policy: ci / node-9 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-9 (push) Skipped
QRun-IO/ci-policy: ci / node-10 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-10 (push) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (pull_request) Skipped
QRun-IO/ci-policy: ci / node-playwright-11 (push) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (pull_request) Skipped
QRun-IO/ci-policy: ci / repository-policy-12 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (push) Skipped
QRun-IO/ci-policy: ci / source-config-13 (pull_request) Skipped
QRun-IO/ci-policy: ci / source-config-14 (push) Skipped
QRun-IO/ci-policy: ci / source-config-14 (pull_request) Skipped
QRun-IO/ci-policy: ci / android-0 (push) Skipped
QRun-IO/ci-policy: ci / android-0 (pull_request) Skipped
QRun-IO/ci-policy: ci / original-business (push) Skipped
QRun-IO/ci-policy: ci / original-business (pull_request) Skipped
QRun-IO/ci-policy: ci / original-mcp (push) Skipped
QRun-IO/ci-policy: ci / original-mcp (pull_request) Skipped
QRun-IO/ci-policy: ci / original-voyage (push) Skipped
QRun-IO/ci-policy: ci / original-cli (push) Skipped
QRun-IO/ci-policy: ci / original-voyage (pull_request) Skipped
QRun-IO/ci-policy: ci / original-cli (pull_request) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (push) Skipped
QRun-IO/ci-policy: ci / shared-pipeline (pull_request) Skipped
QRun-IO/ci-policy: ci / not-enrolled (push) Failing after 6s
QRun-IO/ci-policy: ci / not-enrolled (pull_request) Failing after 8s
QRun-IO/ci-policy: ci / ci-result (push) Failing after 7s
QRun-IO/ci-policy: ci / ci-result (pull_request) Failing after 7s
chore(release): prepare the first published release candidate 0.1.0-RC.1
Prepare, without cutting, the first artifact to be published from this
repository through the shared ci-workflows Maven workflow (push of
develop to release/0.1 publishes 0.1.0-RC.N to the Gitea Maven registry).
Add CHANGELOG.md, rewrite docs/RELEASE-STATUS.md with the publication
path, the first-RC steps, the dependency cohort and the relationship to
the GG Forge development pin 0.1.0-forge.162af9a7b8cd-archive1, and
update the README banner, Maven-publication section and known issues.

Carry the two Forge test-only PostgreSQL fixture patches verbatim
(FixtureEndpoint resolves the reachable container endpoint instead of
127.0.0.1; fixture health is reported after each intake case).

Recover the "-archive1" delta: the only class that differs between
Forge's 162af9a7b8 and 162af9a7b8cd-archive1 JARs is
ArchiveSecurity, whose digest guard now tolerates insert/update/delete
customizers and still refuses query/get/personalization customizers.
Express that in source with a focused ArchiveTest case.

Stop ignoring .gitea/ so the shared CI caller is tracked normally and
mark the retired platform-ci caller reference as superseded.

Verification: ./mvnw verify against Collaboration 53bd8f00 installed as
0.1.0-rf53bd8f00-SNAPSHOT: 284 tests, 0 failures, 0 errors, 58 skipped,
Checkstyle clean. Opt-in PostgreSQL/MySQL suites: 64 run, two
pre-existing failures (public QQQ 4.1.0-RC.21 lacks
QBackendTransaction.supportsRollbackCallbacks; the physical-drift probe
in PostgresRecordFilesTest), neither introduced here.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
2026-11-06 09:08:21 -06:00

6.7 KiB

Record Files — current status

Updated: 2026-11-06. Preparing the first published release candidate, 0.1.0-RC.1. Not a production 1.0; see KNOWN-ISSUES.md and TODO.md for the gates that remain.

Purpose

Retained uploads, scanned files and photo collections associated with QQQ records, with review status, permissions, immutable versions and audit history.

Repository layout

The root Maven module contains the QBit and its integration-test fixture classifier. Byte storage and attachment intake use the existing Collaboration attachment contracts. Generation and printing integrations live in their owning bridge modules, not here.

Building

Use Java 21 and the included Maven wrapper: ./mvnw verify. The PostgreSQL and MySQL integration suites are opt-in: they use Testcontainers (a Docker daemon is required) and run only with -DpostgresRecordFilesTests=true and -DmysqlRecordFilesTests=true; otherwise they are reported as skipped, so a plain verify is not provider evidence. The build needs a Collaboration artifact that carries the attachment lifecycle, upload journal and download SPI (AttachmentLifecyclePolicy, AttachmentDownload, AttachmentContentIntegrityException, uploadjournal.UploadRecoveryNavigation, security.ParentRecordAccess). Public Collaboration 0.1.0-RC.6 does not have them; that work is Collaboration PR 59. Until it is published, build against a locally installed snapshot of that branch and override the property, for example ./mvnw -Dqbit-collaboration.version=<local snapshot> verify.

Version and publication path

Versioning follows the shared KofTwentyTwo/ci-workflows Maven workflow, called from .gitea/workflows/build.yaml (PR 2). The version lives in the <revision> property of pom.xml and stays 0.1.0-SNAPSHOT on develop; the workflow computes published versions and commits the bump back.

Ref Version Action
feature branches, main unchanged mvn verify only
develop 0.1.0-SNAPSHOT test, deploy snapshot
release/0.1 0.1.0-RC.N test, deploy, commit bump, tag v0.1.0-RC.N
tag v0.1.0 0.1.0 test, deploy, commit to main

Packages go to the Gitea Maven registry, https://git.kof22.com/api/packages/QRun-IO/maven (sign-in required for reads as well as writes). Nothing is published to Maven Central and nothing is GPG-signed. GitHub is a shadow/archive; never publish from it.

First release candidate, step by step

  1. Merge Collaboration PR 59 and publish its release candidate (release/0.1 there), so the registry holds a Collaboration RC with the SPI above.
  2. Merge PR 2 (shared CI caller) and this release-preparation PR into develop; confirm the develop push run passes and deploys 0.1.0-SNAPSHOT.
  3. Merge PR 1 (quarantineCapturedFiles) into develop; it has no source conflict with this branch and only adds to RecordFilesQBitConfig and RetainedFileService.
  4. On develop, set qbit-collaboration.version to the published Collaboration RC (a release candidate must not depend on a -SNAPSHOT), then git push origin develop:release/0.1. The push run publishes 0.1.0-RC.1 and tags v0.1.0-RC.1.
  5. Resolve com.kingsrook.qbits:qbit-record-files:0.1.0-RC.1 (and its tests classifier if the fixture is wanted) from the registry in a fresh consumer cache and record the JAR and POM SHA-256 here. A passing build alone is not proof of publication.

The stable 0.1.0 comes later from a v0.1.0 tag on main; it is not part of this candidate.

What this candidate contains beyond the paused checkpoint (162af9a)

  • The archive-capture customizer guard change that GG Forge ran as development pin 0.1.0-forge.162af9a7b8cd-archive1 (mutation-only host customizers no longer refuse a capture; see CHANGELOG).
  • The two test-only PostgreSQL fixture patches from the Forge qualification (FixtureEndpoint, fixture health reporting), unchanged from scripts/local/patches/record-files-*.patch in the Forge handoff.
  • Release documentation. No behaviour other than the archive guard changed.

Relationship to the GG Forge development pin

Forge's pin 0.1.0-forge.162af9a7b8cd-archive1 was built from the same source as this candidate, but against development coordinates: qqq-backend-core 4.1.0-forge.33464d37e815-echo1, qqq-backend-module-rdbms 4.1.0-forge.33464d37e815 and qbit-collaboration 0.1.0-forge.8f348daf324d-files1. 0.1.0-RC.1 is a drop-in replacement for the Record Files code itself (same classes, plus the quarantineCapturedFiles setting once PR 1 is merged), but its POM pins the public QQQ 4.1.0-RC.21 tuple and the published Collaboration RC, so the host must move the whole cohort together, not only this coordinate.

Evidence retained

  • Local ./mvnw -Dqbit-collaboration.version=0.1.0-rf53bd8f00-SNAPSHOT verify on this branch (Collaboration commit 53bd8f00, the commit PR 1 was verified against; Java 21): 284 tests, 0 failures, 0 errors, 58 skipped (the opt-in database suites), Checkstyle clean, BUILD SUCCESS.
  • Opt-in database suites with Docker 29.9.2 (-DpostgresRecordFilesTests=true -DmysqlRecordFilesTests=true): 64 tests, 1 failure, 1 error. MySQL 15/15, PostgresTrackedDownload 3/3, PostgresRetainedUploadRecovery 5/5 and FixtureEndpoint 5/5 pass; POSTGRES_FIXTURE_HEALTH reports running=true oom=false restarting=false endpointMatches=true after all 22 intake cases. The two failures pre-date this branch: PostgresIntakeAndRetentionTest.unmanagedTablesKeepOrdinaryAttachmentBehavior dies in Collaboration's AttachmentsService.storeUpload with NoSuchMethodError QBackendTransaction.supportsRollbackCallbacks() (the documented QQQ core after-rollback-callback gap: public 4.1.0-RC.21 lacks it, Forge builds against 4.1.0-forge.33464d37e815-echo1), and PostgresRecordFilesTest.refusesLabelsAndPhysicalDrift fails its isDurableBackend re-check after ALTER COLUMN at TYPE TIMESTAMPTZ (line 258), a physical-drift probe untouched by this change.
  • The earlier scanner integration proof used a private dependency cohort and does not constitute a standalone public release.

Source and release state

The starting source was extracted from Website-Backend commit b6fb23825a87412397dec703b9617148ae7eb601, then adapted for standalone packaging. This repository preserves the resulting source and existing licenses. The outstanding dependency order is Core, Collaboration, Scripting/Record Files, then the integrated Generation bridges and matching UI.

The old platform-ci caller is kept, inactive, as docs/release/qrun-release.reference.yaml; the shared ci-workflows caller supersedes it.