Commit Graph
77 Commits
Author SHA1 Message Date
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.maes 673e665aba Merge pull request #20 from QRun-IO/fix/help-bundle-version
fix(help): help bundle version comes from the build, not a hardcoded SNAPSHOT
2026-10-14 22:37:20 -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.maes b67abf4ff4 Merge pull request #16 from QRun-IO/feature/health-checks
feat(health): register webhook endpoint and dispatcher checks with core central health
2026-10-14 21:27:00 -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.maes b31e65f40d Merge pull request #19 from QRun-IO/feature/help-bundle
feat(help): qbit-webhooks help bundle via QQQ help bundles, with coverage gate
2026-10-14 20:29:38 -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.maes 35acb94756 Merge pull request #17 from QRun-IO/feature/foreign-keys
Foreign keys between the webhooks tables, with an orphan-safe upgrade
2026-10-14 18:00:28 -05:00
james.maesandClaude Opus 5.5 1259fa25fe Merge origin/develop into feature/foreign-keys
Keeps both changelog entries. H2 tests and the demo server load
src/test/resources/webhooks-h2.sql (FKs in H2 syntax), never the Postgres DDL
or the pg_temp upgrade script.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:52:26 -05:00
james.maes 3bd7cab084 Merge pull request #18 from QRun-IO/feature/tables-populated-defaults
feat: guided empty states, Setup card and tables guardrail
2026-10-14 17:11:31 -05:00
james.maesandClaude Opus 5.5 cf940eb3bb fix: setup card counts blocked endpoints as DeliveryEngine does; host help test; marker prose
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:07:08 -05:00
james.maesandClaude Opus 5.5 35af32dc1d feat: guided empty states, Setup card and tables guardrail
Help bundle for the app and all five tables (how rows get created, where
event types come from), applied by WebhooksHelp. Setup card on the home.
WebhooksTablesGuardrailTest. Test that an expired secret stops signing
before it is retired. Nothing is seeded (owner choices and logs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:44:46 -05:00
james.maesandClaude Opus 5.5 3636aacc26 style(test): import order in the foreign key guardrail test
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:25:18 -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 d650deb46f docs: webhooks health checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:55:12 -05:00
james.maesandClaude Opus 5.5 d988e00be6 refactor(webhooks): home links to central health instead of its own endpoint health tile
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:55:11 -05:00
james.maesandClaude Opus 5.5 3cf073e2d5 feat(health): register webhook endpoint and dispatcher checks with core central health
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:55:11 -05:00
james.maes 945ebe66ff Merge pull request #15 from QRun-IO/feature/orb-0.6.9
ci: qqq-orb 0.6.9 (refresh SNAPSHOT dependencies)
2026-10-14 10:46:45 -05:00
james.maesandClaude Opus 5.5 f7291b03b3 ci: qqq-orb 0.6.9 (refresh SNAPSHOT dependencies)
Moves qqq-orb@0.6.8 to qqq-orb@0.6.9, which passes --update-snapshots so cached SNAPSHOT dependencies are re-checked on every build (QRun-IO/qqq-orb#22).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:08:02 -05:00
james.maes 53a7844c5a Merge pull request #14 from QRun-IO/feature/guardrails-2.1.0
build: QQQ 4.1.0-RC.6 + guardrails (parent 2.1.0, enforced)
2026-10-14 07:22:11 -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.maes f51b3ff75f Merge pull request #13 from QRun-IO/feature/arch-core-signer
refactor(signing): core WebhookSigner/WebhookVerifier (qqq#1160)
2026-10-13 19:36:49 -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.maes ad235f675f Merge pull request #12 from QRun-IO/feature/release-rc-automation
ci: automate RC releases; hotfix/* pushes no longer publish
2026-10-13 15:01:02 -05:00
james.maesandClaude Opus 5.5 1c73868acb ci: automate RC releases; hotfix/* pushes no longer publish
Removes publish_hotfix_release: a hotfix/* branch push published a GA
release to Maven Central with no tag or review (QRun-IO/qbit-cdn#12,
QRun-IO/qqq#1121). hotfix/* branches now run test_only; a hotfix
release publishes from a reviewed vX.Y.Z tag through publish_release.
Adds .github/workflows/release-rc.yml (reusable QRun-IO/.github
qbit-release-rc): a manual dispatch, or merging a develop PR labelled
release:rc, merges develop into the release line and the release/* push
runs the existing CircleCI RC publish.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:31:03 -05:00
james.maes 2b2a593ded Merge pull request #11 from QRun-IO/chore/remove-0x-sources
chore!: remove the 0.x webhooks sources and tests
2026-10-12 18:26:08 -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.maes 97a27195f8 Merge pull request #8 from QRun-IO/feature/webhooks-1.0
feat!: qbit-webhooks 1.0 (signed, SSRF-safe, replica-safe outbound webhooks)
2026-10-12 18:18:30 -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 0814ac59b7 docs: README, design, receiver guide and migration for 1.0
The README now matches the code. docs/DESIGN.md covers the signing format,
SSRF policy, event sources, delivery semantics, data model and the phase 2
inbound design; docs/RECEIVERS.md has verification code for Java, Node.js
and Python.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:49:04 -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.maesandClaude Opus 5.5 9584605426 chore: align repository files with the QRun qbit standard
LICENSE and NOTICE in the standard form (F1, F2), pointer files to
QRun-IO/qqq (F4), dependabot (F8), .gitattributes (F11), .editorconfig
(F12) and the reference .gitignore (F10).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:49:02 -05:00
james.maes e0c5d3d379 Merge pull request #7 from QRun-IO/feature/ga-only-release-tags
ci: publish only GA tags (vX.Y.Z), never RC tags
2026-10-12 16:07:32 -05:00
james.maesandClaude Opus 5.5 094a1fb28d ci: publish only GA tags (vX.Y.Z), never RC tags
An RC tag matched /v.*/ and the orb republished it as the next RC.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:00:10 -05:00
james.maes fcfb6782b2 Merge pull request #6 from QRun-IO/feature/ga-only-release-tags
ci: publish only GA tags (vX.Y.Z), never RC tags
2026-10-12 15:48:17 -05:00
james.maes f6a1419c38 Merge pull request #5 from QRun-IO/feature/GH-10-public-stack-prep
build: prepare QQQ releases and align Apache-2.0
2026-10-12 15:48:13 -05:00
james.maesandClaude Opus 5.5 7be93496b8 ci: publish only GA tags (vX.Y.Z), never RC tags
An RC tag matched /v.*/ and the orb republished it as the next RC.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 15:36:33 -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
james.maes 9600349b7d ci: pin settings-safe QQQ orb 0.6.8
Use the reviewed immutable release tooling for QRun-IO/qqq-all#10.
2026-09-30 10:44:18 -05:00
james.maes 19543936b2 ci: retain main tests and gate GA publication on tags
Refs QRun-IO/qqq-all#10. Preserve reviewed selectors; version pins remain separate and publication remains gated.
2026-09-28 20:59:35 -05:00
CircleCI 58c5f91cdb Bump version to 0.4.0-SNAPSHOT [skip ci] 2026-09-26 06:10:39 +00:00
james.maes 0f308c2291 build: re-pin to qbit-build-parent 2.0.0 (#4)
Closes QRun-IO/qqq#767. Part of QRun-IO/qqq-all#1.
2026-09-26 01:08:47 -05:00
james.maes bfb0706ef4 docs: refresh repo agent notes for the parent 2.0.0 re-pin
Replaces cautions this branch resolved with the qqq-snapshot profile and current licensing and README caveats.

Part of QRun-IO/qqq-all#1
2026-09-25 20:49:10 -05:00
james.maes b1df0d6d25 ci: keep package installs unattended on CircleCI
Adds the configure-package-install pre-step so needrestart cannot hang install_java (QRun-IO/qqq-orb#11).

Part of QRun-IO/qqq-all#1
2026-09-25 20:47:02 -05: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 c8b985369f test: assert webhook post body keeps null-valued fields
Guards the toJsonCustomized migration so receivers still see null fields.

Part of QRun-IO/qqq-all#1
2026-09-25 20:44:51 -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 MaesandClaude Opus 4.8 68f1d0443b docs: add CLAUDE.md pointer to QQQ knowledge-base dossier + hub
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-12 05:31:28 -05:00