Commit Graph

4 Commits

Author SHA1 Message Date
Jordan Ritter 57122abe83 feat(showcase): add PocketBase pull-queue collections + CAS claim hook for harness fleet 2026-06-05 10:38:40 -07:00
github-actions[bot] 5b2852c5b5 style: auto-fix formatting 2026-06-04 12:23:05 -07:00
Jordan Ritter 928793c07b fix(showcase/pocketbase): make image bootable on an existing staging volume
A PB image freshly built from main crash-loops staging PocketBase (502s)
because of two latent defects, both verified by booting the built image
against a real PB 0.22.21 binary on a volume that already has the
collections but has NOT recorded their migrations in `_migrations`.

1. Hook API. `pb_hooks/main.pb.js` registered its CORS middleware via the
   bare global `onBeforeServe(...)`, which is undefined in PB 0.22.x JSVM
   (only the `$app.onBeforeServe()` Go method exists) — it throws
   `ReferenceError: onBeforeServe is not defined` at hook load and crashes
   the server. Switch to the documented global `routerUse((next) => (c) =>
   …)` entry point. Separately, the per-request closure runs in PB's pooled
   goja runtime where top-level helpers/consts are out of scope, so calling
   them throws per request and the router returns HTTP 400 on EVERY route;
   inline the entire allowlist/env/match logic into the closure to fix that
   second regression. Verified: health 200, collection reads 200, the
   allowlisted origin is echoed on `Access-Control-Allow-Origin`, a
   non-allowlisted origin is not, and OPTIONS preflight returns 204.

2. Migration idempotency. `1777700000_create_baseline.js` and the three
   original `1745193*` creators (status, status_history, alert_state) called
   `saveCollection(new Collection(...))` unconditionally, so on a volume
   where the collection already exists they throw
   `UNIQUE constraint failed: _collections.name`, aborting the ENTIRE
   migration chain before later migrations (resource_snapshots, future fleet
   collections) can run. Guard each with the proven find-or-skip pattern
   already used by probe_runs / resource_snapshots, and harden their down
   arms to tolerate an already-absent collection. Verified end to end:
   deleting those migrations' `_migrations` rows while leaving the
   collections in place (the exact staging state), then rebooting the built
   image — boots healthy, re-records the migrations cleanly with no UNIQUE
   abort and no duplicate collections, and a brand-new collection migration
   still applies through the now-clean chain (the pool-fleet path).
2026-06-04 12:23:05 -07:00
Jordan Ritter 6faf41b8ab feat(showcase/pocketbase): service (migrations + hooks + Docker)
PocketBase backend for showcase-ops: Dockerfile + entrypoint for the
Railway-hosted instance, JSVM main.pb.js hook for CORS + request
shaping, migration sequence creating status / status_history /
alert_state collections, CORS config, and the recreate_collections
v1/v2 + drop_history_fail_count schema drift corrections.
2026-04-22 11:00:47 -07:00