Contents
Playground And Scripts Overhaul Plan
Goals
Make the playground a maintainable, packaged-product example and make scripts predictable entry points rather than a growing collection of partially overlapping orchestration logic. Preserve documented commands during the 1.x compatibility window.
Current Risks
sandbox/playground/app.pycombines connection lifecycle, extension setup, source registration, graph build/retry policy, query execution, result serialization, and Streamlit rendering in one module.sandbox/playground/queries.pycombines catalog metadata and hundreds of lines of SQL strings, making query/profile drift difficult to review.scripts/quickstart.showns Docker orchestration, demo SQL, local pgrx installation, playground routing, compatibility aliases, cleanup, and CLI parsing.- Heavy shell tests repeat database lifecycle, pgrx start/install, polling, cleanup, logging, and environment validation.
run_release_gate.shis a long list of boolean environment switches without a declarative inventory, tier model, dependency graph, or evidence manifest.- Script documentation is split across root README,
scripts/scripts.md, the sandbox README, heavy-test README, and contributor docs. sandbox/start_playground.shcurrently falls back to directpipinstalls whensfwis unavailable, which violates the repository package-install policy.- Playground provisioning is duplicated in the UI, benchmark preparation, and release validator, and each copy uses test-only/private catalog operations.
- The playground release validator splits SQL on semicolons, which is not safe for quoted or dollar-quoted SQL.
- The aggregate release gate omits some separately documented docs, upgrade, latency, sanitizer, and release-validation checks.
P1: Inventory And Contract Freeze
- [x] Create a machine-readable script inventory containing owner, audience, tier, required tools, inputs, outputs, destructive behavior, timeout, supported platforms, and CI/release usage.
- [x] Classify entry points as public/stable, maintainer/stable, or internal.
- [x] Freeze public commands and exit-code/environment contracts for 1.0.
- [x] Identify duplicate, unused, obsolete, or misleading scripts and record keep/merge/replace/delete decisions before moving files.
- [x] Add
bash -nand ShellCheck coverage for every maintained shell script, plus focused Python lint/type/unit checks for script helpers. - [x] Require
sfwfor any dependency installation performed by a script, or use a prebuilt/locked environment that performs no runtime installation.
P2: Shared Script Foundations
- [x] Put shared PostgreSQL/pgrx lifecycle, database naming, polling, timeout, cleanup, logging, prerequisite, and evidence helpers in one sourced library with a narrow documented interface.
- [x] Require traps to clean only resources created by the current script; reject unsafe or ambiguous database/cluster targets.
- [x] Standardize
--help, exit codes, environment validation, timeouts, temporary directories, log locations, and machine-readable summaries. - [x] Replace copied shell SQL with versioned
.sqlfixtures where doing so improves reviewability and reuse. - [x] Keep platform-specific behavior at adapters; do not spread macOS/Linux/ Docker branching through every workflow.
P3: Release Orchestration
- [x] Replace boolean-sprawl orchestration with named tiers such as
pr,nightly,rc, andfull-matrix, backed by a declarative gate registry. - [x] Record exact command, PostgreSQL/pgGraph versions, duration, result, dataset checksum, memory/performance thresholds, and artifact locations in one evidence manifest.
- [x] Make dependencies and exclusivity explicit so database/port/cluster collisions cannot silently corrupt results.
- [x] Support resuming an interrupted release run without treating stale output as fresh evidence.
- [x] Preserve
run_release_gate.shas a compatibility wrapper for at least the documented 1.x deprecation window if its interface changes. - [x] Reconcile the aggregate runner with every documented required gate, including docs drift, release metadata validation, upgrade, latency, sanitizers, and supported-major evidence.
P4: Playground Refactor
- [x] Separate configuration, database client, bootstrap/registration, build coordination, query catalog, execution, result models, and Streamlit UI.
- [x] Move query examples into structured data with stable IDs, title, question, mode/capability requirements, SQL, expected schema or checksum, and documentation link.
- [x] Make the automated release gate and UI consume the same query catalog so examples cannot drift.
- [x] Represent multi-statement examples as explicit statement lists; do not parse SQL by splitting on semicolons.
- [x] Remove direct truncation of pgGraph internal catalogs from the playground; use supported reset/registration APIs or add a narrowly scoped test-only fixture mechanism outside the user-facing app.
- [x] Use explicit connection health/reconnect and bounded query execution; avoid caching a permanently broken connection.
- [x] Keep mutable examples isolated and resettable so one user/session cannot make later examples nondeterministic.
- [x] Separate dataset acquisition/checksum/setup from application startup and document licensing, size, provenance, and offline/retry behavior.
- [x] Add unit tests for catalog parsing and result formatting, integration tests for bootstrap/reconnect/error handling, and packaged end-to-end smoke tests for CSR and mutable modes.
- [x] Review accessibility, error guidance, secret handling, SQL trust boundary, row/result caps, and deployment assumptions before presenting the playground as production-adjacent.
- [x] Document PostgreSQL 17 as the 1.0 playground reference environment. The extension itself still passes the PostgreSQL 14-18 release matrix.
Compatibility And Migration
- Keep
scripts/quickstart.shcommands and the documented playground modes as wrappers while internals move. - Print a deprecation warning and replacement command before removing any documented alias; follow the project-wide deprecation window.
- Do not rename environment variables or change defaults silently.
- Tests must compare old wrapper and new entry-point behavior for supported paths throughout the transition.
Exit Gate
- Public and maintainer entry points are documented from one generated index.
- No duplicated lifecycle/bootstrap implementation remains without a recorded reason.
- Static checks and tier-appropriate smoke tests cover every maintained script.
- The playground query catalog, docs examples, and release gate share one source and pass in CSR and mutable modes against the packaged PostgreSQL 17 reference environment.
- Compatibility wrappers and removal dates are documented.