33 Commits
Author SHA1 Message Date
james.maesandClaude Opus 5.5 db4eca240b build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)
maven / build (push) Successful in 4m15s
build / maven (push) Successful in 4m15s
pom.xml: parent -> 2.2.1
pom.xml: qqq.snapshot.version: 4.1.0-RC.8 -> 4.1.0-RC.26
pom.xml: qqq-frontend-next: 1.0.0-RC.14 -> 1.0.0-RC.38
pom.xml: added qqq.version=4.1.0-RC.26 (parent BOM import)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 18:12:32 +00:00
james.maesandClaude Opus 5.5 6b3be6d305 fix: the qbit metadata version comes from the build, not a hardcoded constant
The producer read a literal version, so released artifacts reported a stale
or -SNAPSHOT version. qbit-webhooks.properties (version=${project.version}) is
Maven-filtered and the producer loads it; tests assert producer == bundle ==
artifact version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:27:39 -05:00
james.maesandClaude Opus 5.5 d03c902f58 test(help): compare the help bundle version with the artifact version, not a hardcoded SNAPSHOT
The bundle version is now Maven-filtered, so a literal SNAPSHOT in the test
fails every release build. Surefire passes the artifact version in
qbit.artifactVersion.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:07:56 -05:00
james.maesandClaude Opus 5.5 9dfe565df0 fix(help): the help bundle carries the artifact version (Maven-filtered) instead of a hardcoded SNAPSHOT
On release branches the bundle's version and the producer's differed, so the
bundle test that asserts they match failed, and released bundles recorded
SNAPSHOT as their provenance. help/*.yaml is now filtered:
version: ${project.version}.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:04:41 -05:00
james.maesandClaude Opus 5.5 0a8ccb3442 Merge origin/develop into feature/health-checks; pin QQQ 4.1.0-RC.8
RC.8 ships the central health kernel (QRun-IO/qqq#1207).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:15:07 -05:00
james.maesandClaude Opus 5.5 e84ec8b9e5 feat(help): ship the qbit-webhooks help bundle through QQQ help bundles, with coverage gate
Host-neutral help (deployment-specific facts removed), registered with
HelpBundles, gated by HelpBundleAssertions. QQQ 4.1.0-RC.7.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:17:15 -05:00
james.maesandClaude Opus 5.5 a160ef216d feat(ddl): foreign keys between the webhooks tables, with an orphan-safe upgrade
Declare a named foreign key for every join and table possible-value field
between the five webhooks tables. Endpoint secrets and subscriptions are
deleted with their endpoint; deliveries and attempts keep it (RESTRICT);
a delivery outlives its subscription (SET NULL); attempts go with their
delivery. The upgrade script quarantines orphans before adding the keys and
replaces the NO ACTION endpoint keys. A Testcontainers guardrail test fails
when a new relation has no key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:15:19 -05:00
james.maesandClaude Opus 5.5 d62556b764 build: QQQ 4.1.0-RC.6 and qbit-build-parent 2.1.0 with guardrails enforced
Move the core baseline to the released 4.1.0-RC.6 (architecture review
finding F19, guardrail G7). Adopt qbit-build-parent 2.1.0 with the
architecture guardrails enforced (G1, G3, G4, G7) and tests in strict
raw-route mode (G2). Everything passes with no source changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 07:18:36 -05:00
james.maesandClaude Opus 5.5 f33e592aef refactor(signing): use core WebhookSigner and WebhookVerifier
Delete the local shared/signing package (WebhookSigner, WebhookVerifier,
WebhookSecret, WebhookVerificationException) and use core
com.kingsrook.qqq.backend.core.utils.webhooks from QQQ 4.1.0-RC.5.
Delivery signing, inbound verification and secret generation and rotation
all go through core. The wire format is unchanged: same headers, v1,
prefix, whsec_ secrets and timestamp tolerance. Endpoints, secret storage
and delivery stay in this qbit.

Refs QRun-IO/qqq#1160 (this repo has issues disabled), architecture review
QRun-IO/qqq#1150 finding F11.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:33:16 -05:00
james.maesandClaude Opus 5.5 09345924e4 chore!: remove the 0.x webhooks sources and tests
The owner approved removing the old code. Deletes the 0.x engine
(actions/, model/, tables/, the old processes and registry plugins) and
its tests, which 1.0 replaced, and drops the TEMPORARY compiler and
Checkstyle exclusions from pom.xml and the note in CLAUDE.md/AGENTS.md.

./mvnw clean verify: 144 tests, 0 failures, Checkstyle clean, JaCoCo
gate met.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:23:15 -05:00
james.maesandClaude Opus 5.5 f6ecc75d7f fix(ui): Next UI-safe home, full-width relations, read-only deliveries
Checked against Next UI 1.0.0-RC.14 with a local demo server (H2, real
traffic from the engine): Next's sanitizer removes <style>, so the home
now uses inline styles only, with intrinsic auto-fit grids instead of
media queries; the relation widgets and the payload span the full record
width; deliveries and attempts drop the insert, update and delete
capabilities so the UI offers no Edit or New (they are written only by
the qbit); the home widget is labelled Overview. Screenshots at 390 and
1440 px, light and dark: no page or inner horizontal scroll.

Adds the test-scoped WebhooksDemoServer used for the screenshots.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 17:04:54 -05:00
james.maesandClaude Opus 5.5 6b56de589d feat!: qbit-webhooks 1.0 (signed, SSRF-safe, replica-safe outbound webhooks)
Rebuilds the qbit on QQQ 4.1.0-RC.4 per the assessment (QRun-IO/qqq#1105,
decisions D1-D8):

- webhooks_endpoint, webhooks_endpoint_secret, webhooks_subscription,
  webhooks_delivery and webhooks_delivery_attempt (snake_case, webhooks_
  prefix), permissions webhooks.view / manage / admin
- Standard Webhooks signing with per-endpoint secrets (AES-GCM or env
  references) and overlapping rotation
- SSRF-safe client: private, loopback, link-local and metadata ranges
  blocked, DNS pinned, no redirects, timeouts, size cap, admin-only
  internal allowlist (shared/ is an internal copy of QRun-IO/qqq#1109,
  replaced at RC.5)
- event sources: table insert/update/delete (record change listener),
  process completed/failed, ESB topics (own events skipped, CloudEvent
  id dedup), custom events and a channel API for other qbits
- delivery: unique attempt-row claims with leases (no double sends across
  replicas), retries with backoff, Retry-After, dead letters and Replay,
  serial mode, per-endpoint rate limits, health with probation and
  auto-disable, alerts through the Alerts SPI when present, retention
- subscriptions: record filters, record security, read permission check,
  detail levels, include and exclude fields, payload customizer hook
- app home dashboard, actions with the standard review/result screens,
  ESB / Quick Search / API integration hooks
- JaCoCo gate, Checkstyle in verify, Maven wrapper, default 4.1 profile,
  Postgres DDL in docs/ddl

The 0.x sources stay in the tree, excluded from the build, until their
removal is approved.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:49:03 -05:00
james.maes 1795858d0b build(#921): update AssertJ test dependency to 3.27.7
Apply the independently reviewed one-pin test dependency update. Preserve revision, parent, CI and production source. Full verify passes; tracking: QRun-IO/qqq#921.
2026-10-01 20:56:22 -05:00
james.maes 37492d0352 fix: align first-party Apache-2.0 declarations
Refs QRun-IO/qqq#923.
2026-09-30 20:17:47 -05:00
CircleCI 58c5f91cdb Bump version to 0.4.0-SNAPSHOT [skip ci] 2026-09-26 06:10:39 +00:00
james.maes dfeb3fad99 build: add opt-in qqq-snapshot profile
Imports qqq-bom-pom ${qqq.snapshot.version} (default 4.1.0-SNAPSHOT) ahead of the parent's BOM.

Part of QRun-IO/qqq-all#1
2026-09-25 20:46:22 -05:00
james.maes d247432c38 build: re-pin to qbit-build-parent 2.0.0 (qqq 4.0.0)
Drops the unresolvable qqq-bom-pom 0.40.0-SNAPSHOT import and migrates the qqq 4.0 API removals.

Part of QRun-IO/qqq-all#1
2026-09-25 20:44:51 -05:00
james.maes 9c063bfb27 chore: merge main into develop
Brings main's Java 21 parent, 0.3.0 release, Apache-2.0 LICENSE, NOTICE and orb 0.5.0 into develop.

Part of QRun-IO/qqq-all#1
2026-09-25 20:41:29 -05:00
james.maes 1ee9e57bfd chore: bump qqq to 0.40.0-SNAPSHOT 2026-01-10 21:05:19 -06:00
CircleCI b40a1c2418 Bump version to 0.3.0 [skip ci] 2025-12-28 22:45:26 +00:00
CircleCI 51c1bcf676 Bump version to 0.2.1 [skip ci] 2025-12-28 22:37:37 +00:00
james.maes 7d465d401a feat: Java 21 LTS migration with qbit-build-parent 1.5.0 (#2)
* feat: migrate to Java 21 with qbit-build-parent 1.5.0

* fix: update qbit-build-parent to 1.5.1 for JUnit 6 compatibility

* chore: retrigger CI after Maven Central sync
2025-12-28 16:36:02 -06:00
CircleCI c73e278ee0 Bump version to 0.2.1 [skip ci] 2025-09-29 20:34:48 +00:00
james.maes 9e6ed3f985 chore(deps): Updated parent pom and qqq-orb to latest published versions 2025-09-18 12:16:10 -05:00
CircleCI 7aeceac1b1 Bump version to v0.2.1 [skip ci] 2025-09-16 19:46:33 +00:00
james.maes 247f66f924 chore: bump snapshot version after release 2025-09-16 14:46:32 -05:00
james.maes 577524c4dd chore: Updated to meet requirements for maven central and qqq-orb 2025-09-16 14:38:26 -05:00
Darin Kelkhoff 5d9cfedf83 Add 'store' type events, to fire for either an insert or an update. update to 1.0.4 2025-08-07 14:41:50 -05:00
Darin Kelkhoff 14ddfb84d2 Turn on redirectTestOutputToFile in surefire plugin 2025-08-06 08:19:38 -05:00
Darin Kelkhoff c1f2d4980a Fix post-update firing to include all old-record values when processing record, to avoid false-misses due to security key field not being in updated sparse qrecord; update version to 0.1.3 and increase qqq dep 2025-08-06 08:15:09 -05:00
Darin Kelkhoff 9ff3263624 Close backend transactions; bump to 0.1.2 2025-07-28 09:42:41 -05:00
Darin Kelkhoff d49ab06abc Update qqq and our own version number (0.1.1) 2025-06-18 20:29:49 -05:00
Darin Kelkhoff 505c5582d2 Initial checkin 2025-06-13 20:35:04 -05:00