Commit Graph
60 Commits
Author SHA1 Message Date
james.maesandCodex 9f54082024 ci: centralize QBit source scanning
Co-Authored-By: Codex <noreply@openai.com>
2026-10-21 10:18:40 -05:00
james.maesandCodex 47b9c52b32 ci: adopt central orb 0.7.12 and stable gates (#34)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 08:56:25 -05:00
james.maesandCodex d683c20449 ci: centralize rc release completion in qqq orb (#33)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 02:25:33 -05:00
james.maesandCodex 638e988461 ci: adopt shared orb 0.7.11 (#32)
Co-authored-by: Codex <noreply@openai.com>
2026-10-21 00:59:29 -05:00
james.maes 8de023efa7 Merge pull request #31 from QRun-IO/feature/central-ci
ci: adopt shared QQQ orb standard
2026-10-20 19:06:47 -05:00
james.maesandCodex 90cf7fd158 ci: adopt verified central QQQ orb 0.7.3
Co-Authored-By: Codex <noreply@openai.com>
2026-10-20 19:02:48 -05:00
james.maes 7b492f857c Merge pull request #29 from QRun-IO/feature/cloudfront-health-check
fix(health): real CloudFront health probe; UP/not-testable instead of UNKNOWN
2026-10-16 11:51:29 -05:00
james.maesandClaude Opus 5.5 9ff55f4c23 fix(health): real CloudFront health probe; UP/not-testable instead of UNKNOWN
The cdn.provider.<id> health check returned UNKNOWN ("CDN provider does not
support connection tests") for any adapter without CdnOperations, i.e. the
NONE placeholder and Souin. The central evaluator never alerts or changes
state on UNKNOWN, so such a check is permanently useless.

- New optional SPI CdnHealthProbe/CdnHealth; the health check prefers it,
  then the connection test, then reports UP with testable=false.
- CloudFront implements it: GetDistribution -> UP when enabled and
  Deployed, DEGRADED while InProgress, DOWN when NoSuchDistribution or
  disabled; throttling/5xx/network errors DEGRADED; rejected or missing
  credentials DOWN. On AccessDenied it falls back to GetDistributionConfig
  (the kof22 policy grants that, not GetDistribution) and reports
  testable=false; if both are denied, UP with testable=false.
- CloudWatch AWS/CloudFront 5xxErrorRate (Average, 5-min periods, last 30
  minutes) goes into details; above 5% the check is DEGRADED. Best effort.
- Messages are fixed text; details hold only booleans, numbers and known
  states.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 11:38:34 -05:00
james.maes 407b7674c6 Merge pull request #28 from QRun-IO/ci/release-rc-secrets-inherit
ci(release-rc): pass secrets so the shared workflow can sign the RC tag
2026-10-16 08:05:05 -05:00
james.maesandClaude Opus 5.5 3ff13a663e ci(release-rc): pass secrets to the shared workflow so it can sign the RC tag
QRun-IO/.github#2 adds a tag-and-release job that signs vX with the
QRUN_TAG_SIGNING_KEY secret after Maven Central confirms the artifact.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 16:20:40 -05:00
james.maes 85f2ba60ef Merge pull request #27 from QRun-IO/fix/producer-version-from-build
fix: qbit metadata version comes from the build
2026-10-15 01:42:57 -05:00
james.maesandClaude Opus 5.5 79ae6264f8 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-cdn.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:22:59 -05:00
james.maes 98114a6482 Merge pull request #26 from QRun-IO/fix/help-bundle-version-test
test(help): bundle version test compares with the artifact version
2026-10-14 23:18:42 -05:00
james.maesandClaude Opus 5.5 3d72a5d05d 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:25 -05:00
james.maes 4fb8d74458 Merge pull request #25 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:21 -05:00
james.maesandClaude Opus 5.5 aba80ff62f 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:01:28 -05:00
james.maes 55a2ec2a09 Merge pull request #22 from QRun-IO/feature/health-checks
feat(health): register CDN provider checks with core central health
2026-10-14 21:27:00 -05:00
james.maesandClaude Opus 5.5 1262f567c8 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:03 -05:00
james.maes bbf1b55eac Merge pull request #24 from QRun-IO/feature/help-bundle
feat(help): qbit-cdn help bundle via QQQ help bundles, with coverage gate
2026-10-14 20:29:38 -05:00
james.maesandClaude Opus 5.5 f7c9e0fce3 feat(help): ship the qbit-cdn 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:09 -05:00
james.maes d03c791ca3 Merge pull request #23 from QRun-IO/feature/tables-populated-defaults
feat: origin check, guided empty states, create-default actions
2026-10-14 17:19:50 -05:00
james.maesandClaude Opus 5.5 5a0d3e824a fix: hard socket deadline, IPv6 allowlist, port stripping for the origin check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:12:41 -05:00
james.maesandClaude Opus 5.5 422b34988d fix: pin origin check to the checked address, full address blocklist, header-only read; setup and defaults review fixes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:06:20 -05:00
james.maesandClaude Opus 5.5 3980e05719 feat: origin header check, setup card, guided empty states, create-default actions
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:57:57 -05:00
james.maesandClaude Opus 5.5 1cd8810e32 docs: CDN health checks
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:55:08 -05:00
james.maesandClaude Opus 5.5 d3995734dd refactor(cdn): drop the HTML health card and the scheduled connection test (central health covers them)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:55:07 -05:00
james.maesandClaude Opus 5.5 8bb2c4eb4f feat(health): register CDN provider checks with core central health
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 14:55:06 -05:00
james.maes b4d08dc065 Merge pull request #21 from QRun-IO/feature/tag-rule-ignored-fields
feat(purge): "!field" entries in onlyWhenFieldsChange ignore a field
2026-10-14 11:32:41 -05:00
james.maesandClaude Opus 5.5 49c0db82f3 feat(purge): "!field" entries in onlyWhenFieldsChange ignore a field
onlyWhenFieldsChange was only an allow-list, so a rule could not say
"purge on any change except this derived counter" without listing every
rendered field. An entry starting with "!" now names an ignored field:
with only ignored entries, any other changed field still purges; with a
mixed list the allow-list applies and ignored fields never count.
Inserts and deletes are unaffected. No schema change.

For kof22: the cms_blog_post rule gets "!viewCount" so the nightly view
count refresh purges nothing (Website-Backend#206).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:30:17 -05:00
james.maes 675b9fb32c Merge pull request #19 from QRun-IO/feature/orb-0.6.9
ci: qqq-orb 0.6.9 (refresh SNAPSHOT dependencies)
2026-10-14 10:56:43 -05:00
james.maes 37fb879f51 Merge pull request #20 from QRun-IO/fix/no-cdn-provider-honest
fix(purge): say when purges are recorded only, not sent (no live CDN)
2026-10-14 10:50:21 -05:00
james.maesandClaude Opus 5.5 ecceaf31ee fix(purge): say when purges are recorded only, not sent
With no live CDN (provider NONE, or every hostname at stage OFF) the
Purge From CDN, Purge Everything and Retry Purge actions said the
requests were "sent within seconds" while the dispatcher skipped them.
Review and Result now carry a warning line ("No CDN provider configured:
purges are recorded only, not sent." or "CDN hostnames are not live"),
from the same status logic CdnPurgeService records (sendingStatus).
The home's Connection, Health and Purges cards say the same, and the
Origin headers card no longer implies a check is scheduled.

Refs KofTwentyTwo/Website-Backend#199

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 10:39:55 -05:00
james.maesandClaude Opus 5.5 4546a17d6b 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:06:19 -05:00
james.maes fb4a536494 Merge pull request #18 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:21:58 -05:00
james.maesandClaude Opus 5.5 967c52f8bc 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:29 -05:00
james.maes 5801ff2ebd Merge pull request #16 from QRun-IO/feature/arch-core-signer
feat(revalidation): core WebhookSigner + SafeHttpClient for hooks (#15)
2026-10-13 19:36:55 -05:00
james.maesandClaude Opus 5.5 7510392166 feat(revalidation): sign hooks with core WebhookSigner and the safe HTTP client
Replace the hand-rolled HMAC in RevalidationHookRunner with core
WebhookSigner (Standard Webhooks) from QQQ 4.1.0-RC.5, and send through
core SafeHttpClient.

New cdn_revalidation_hook fields:
- signatureFormat: STANDARD_WEBHOOKS (the default for new rows) or LEGACY,
  which keeps X-Revalidate-Signature byte-for-byte. A null format, as on
  existing rows, stays LEGACY.
- allowPlainHttp and internalAllowlist: explicit exceptions to the SSRF
  policy.

Closes #15 (architecture review QRun-IO/qqq#1150, finding F11).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 19:33:36 -05:00
james.maes 59fc98ccb2 Merge pull request #14 from QRun-IO/feature/release-rc-automation
ci: automate RC releases; hotfix/* pushes no longer publish
2026-10-13 14:43:05 -05:00
james.maesandClaude Opus 5.5 1e2af2acf1 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:29:07 -05:00
james.maes b1d7d9543f Merge pull request #13 from QRun-IO/feature/awssdk-2.41.34
build(deps): AWS SDK for Java v2 2.41.34 (GHSA-443w-3rq3-5m5h)
2026-10-13 10:40:35 -05:00
james.maesandClaude Opus 5.5 15439d2fba build(deps): AWS SDK for Java v2 2.41.10 -> 2.41.34 (GHSA-443w-3rq3-5m5h)
2.41.10 carries the HIGH advisory GHSA-443w-3rq3-5m5h (flagged by a Trivy scan); 2.41.30+ fixes it. Same minor line, so no API change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 10:23:30 -05:00
james.maes dd9442f37c Merge pull request #10 from QRun-IO/fix/tag-rule-pvs-table
fix(tag-rules): resolve joined table through the FK field's possible-value source
2026-10-12 19:49:43 -05:00
james.maesandClaude Opus 5.5 26e62f3bcc fix(purge): resolve tag-rule joined tables via the FK field's possible-value source
{blog.slug} used the prefix as both the FK field name and the table name, so
apps with prefixed tables (cms_blog) silently lost those purge paths. The
joined table now comes from the <prefix>Id field's possible-value source,
falling back to the bare prefix. A missing joined table is logged once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.1.1
2026-10-12 19:41:32 -05:00
james.maes a64b1223d2 Merge pull request #8 from QRun-IO/feature/ga-only-release-tags
ci: publish only GA tags (vX.Y.Z), never RC tags
2026-10-12 16:01:41 -05:00
james.maesandClaude Opus 5.5 922b53c82f 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:58:56 -05:00
james.maes 925c2c9134 Merge pull request #3 from QRun-IO/feature/cdn-qbit-complete
fix(app): CDN home without tables; build: qqq-bom 4.1.0-RC.4 profile
2026-10-12 14:59:25 -05:00
james.maesandClaude Opus 5.5 22562e3b7b build: qqq-snapshot profile on qqq-bom-pom 4.1.0-RC.4 (repo standard)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 14:57:18 -05:00
james.maes 8fbaacb42a Merge remote-tracking branch 'origin/develop' into develop 2026-10-12 14:55:59 -05:00
james.maes 3574393724 Merge pull request #1 from QRun-IO/chore/qrun-repo-standard
chore: adopt the QRun qbit repository standard
2026-10-12 14:54:41 -05:00
james.maesandClaude Opus 5.5 8ef4a0f90e fix(app): CDN home uses definition lists and lists, no tables
Readable at every width without inner scrolling: label/value blocks are dl grids, hostnames and recent purges are lists (passes the kof22 widget readability guard).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 14:48:27 -05:00