10 Commits
Author SHA1 Message Date
james.maesandClaude Opus 5.5 d5288c55a6 build(deps): align with Gitea registry (parent 2.2.1, QQQ 4.1.0-RC.26)
maven / build (push) Successful in 4m14s
build / maven (push) Successful in 4m14s
pom.xml: parent -> 2.2.1
pom.xml: qqq.snapshot.version: 4.1.0-RC.7 -> 4.1.0-RC.26
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:05 +00:00
james.maesandClaude Opus 5.5 9003d1dabe 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-web-performance.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:33:04 -05:00
james.maesandClaude Opus 5.5 ffa50f6964 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:10:27 -05:00
james.maesandClaude Opus 5.5 1e71915f7b feat(help): ship the qbit-web-performance 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:37:23 -05:00
james.maesandClaude Opus 5.5 cad99545b2 Merge origin/develop into feature/foreign-keys
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:49:47 -05:00
james.maesandClaude Opus 5.5 dff3077f50 feat(help): table help, Setup card, guardrail tests, enforce reportRetentionDays
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:06:48 -05:00
james.maesandClaude Opus 5.5 7ed9d0b81e feat(schema): foreign keys for every table reference, with orphan quarantine
Changesets 12-26 add a foreign key for each possible-value reference between
the QBit's tables, named fk_<child table>_<column>:

- lab_finding.run_id, lab_report.run_id -> lab_run: CASCADE (owned detail)
- comparison.change_event_id -> change_event: CASCADE (computed for the change)
- regression.cause_change_event_id, lab_run.change_event_id -> change_event,
  regression.first_run_id / checkpoint_run_id -> lab_run: SET NULL (pointers)
- lab_run / lab_finding / regression / comparison .target_id -> target and
  regression.budget_id -> budget: RESTRICT (history is kept, D8; pages and
  budgets are disabled, not deleted; the QBit never deletes either)

Each changeset first records parent-less rows in qqq_fk_quarantine and nulls
them (or, for the NOT NULL run_id columns, copies the row as JSON and deletes
it, PostgreSQL only), and is marked ran when the constraint already exists.
Changeset 12 indexes the foreign key columns that had no leading index.

WebPerfForeignKeyTest runs the changelog with Liquibase on PostgreSQL
(Testcontainers), checks the orphan path and re-run idempotency, and fails
when a table reference in the meta-data has no constraint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:16:35 -05:00
james.maesandClaude Opus 5.5 0745f331f4 feat(evaluation): write regressions, budget checks, site changes and comparisons
The regression, budget, change event and comparison tables had list
screens but nothing wrote them; the open regression count was a
hard-coded 0 and budgets were never evaluated.

- Change events: new build ids from the DeployProbe and ChangeEventSource
  events become durable, idempotent change_event rows (event_key);
  lab runs record the deployment (change event) and CDN stage.
- Budgets are evaluated after lab runs and field imports; breaches open
  or refresh regressions.
- Regression detection compares new results with the baseline per page,
  strategy and metric as the design describes, links the likely change,
  confirms before opening, and resolves on recovery. The open regression
  count is real.
- Before/after comparisons are written per change event.
- Dismiss and Mark resolved are standard record actions on regressions.
- Optional alerts through core QAlerts (logging sink without the Alerts
  qbit). QQQ BOM moves to the released 4.1.0-RC.6 for core alerts.
- Changeset 11 adds the progress and identity columns.

Refs #8

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:00:41 -05:00
james.maesandClaude Opus 5.5 7af5ed758e refactor: name tables web_performance_ per the owner naming rule
Owner rule (2026-10-12): table names are lowercase snake_case and every
qbit prefixes its tables with its full name, no abbreviations.

- table prefix webperf_ -> web_performance_ (tables, backend names,
  possible-value sources)
- Liquibase property webperf.tablePrefix -> web_performance.tablePrefix,
  changelog webperf.changelog.sql -> web_performance.changelog.sql
- name prefix and permission base webperf -> webPerformance (processes,
  widgets, process fields, permissions)

Java package and class names unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 13:55:14 -05:00
james.maesandClaude Opus 5.5 2c18a63a47 feat: qbit-web-performance skeleton (tables, changelog, SPIs, sitemap and build probes)
Local skeleton of the web performance QBit designed in QRun-IO/qqq
docs/specs/2026-10-12-web-performance-design.md (PR #1088; owner decisions
D1-D13 accepted 2026-10-12, D9 amended: alerts via the Alerts qbit).

- WebPerfQBitProducer and WebPerfQBitConfig (validation, namespace prefix,
  duplicate-install guard, Google API key optional and redacted)
- nine visible webperf_ tables, lookups and the Performance app; machine
  tables read-only and unaudited, people-edited tables field-audited
- host-included prefix-parameterized changelog with the seeded budgets
- SPIs: UrlSource, ContentResolver, LabRunner, DeployProbe, RumSource,
  ChangeEventSource
- SitemapUrlSource (XXE-safe, sitemap index) and HttpBuildIdProbe
  (Website-Frontend /api/build)

No PSI/CrUX runner yet: that waits for the Google API key.

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