Commit graph

4 commits

Author SHA1 Message Date
Claude
410062af78 Make Cube v1 run at all: Cube Store, refresh worker, healthcheck
Phase 5 deployed to lin001 for the first time, and the cube service as
committed could not answer a single query. Three separate faults, none of them
visible without deploying it.

  - CUBEJS_EXT_DB_TYPE: postgres is not supported in Cube v1. Cube Store is the
    only external pre-aggregation store, and it is also the default cache and
    queue driver, so naming Postgres failed EVERY query - not just
    pre-aggregated ones - with "It`s not possible to use Cube Store as
    queue/cache driver without using it as external". So cubestore is now a
    service: pinned in lockstep with cube, ai-internal only, no ports, data on
    /datadisk because it grows and / is 62 GB.

    CUBEJS_CACHE_AND_QUEUE_DRIVER: memory is NOT a way out. It does not fall
    back - it hangs /readyz and every query indefinitely, logging nothing at
    level warn. That cost longer to diagnose than the original error.

    This is a deviation from the build spec, which says pre-aggregations
    materialise into pg-ai schema cube_preagg. They cannot, on this version.
    cube_preagg and its grants in 003_roles.sql stay, unused, so that nothing
    else has to change if a later Cube restores Postgres as an external store.

  - CUBEJS_REFRESH_WORKER was never set, so nothing built the pre-aggregations.
    A query matching a rollup does not fall back to the source: it fails with
    "No pre-aggregation partitions were built yet". max_value, min_value and
    sample_count were dead on arrival while avg_value worked, which reads as a
    per-measure bug and is not one.

  - The healthcheck ran wget, which is not in the image (nor is curl). A
    perfectly healthy cube reported unhealthy on every deploy, training the
    reader to ignore the one signal that would show a real fault. It uses node,
    which the image does have.

Verified on lin001: cube healthy, no published host ports, ai-internal and
proxy only, and a query matching alarms_by_hour now returns external: true -
served from Cube Store rather than scanning the source.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 14:35:52 +10:00
Claude
830c050f72 Keep the Phase 9 compose additions inert until Phase 9
The design commit added ai-docs-worker with no profile and an inbox mount on
ai-api. Both take effect the moment anyone deploys, and neither has the code or
the directories behind it yet:

  - ai-compose.yml's own header says to run a bare `up -d`. That would start
    ai-docs-worker with entrypoint `python worker.py` - a file that does not
    exist - under restart: unless-stopped, so it crash-loops on a live shared
    host that also runs the demo PLC.
  - Docker creates a missing bind source as a ROOT-OWNED directory. ai-api does
    not run as root, so deploying the inbox mount before the directory exists
    gives the API an inbox it cannot write to, on the growing disk.

So: profiles: [worker] on the worker, matching the ai-ingest precedent, and the
ai-api volume block commented out with the install command beside it - the same
"add each piece at the phase that needs it" convention as caddy/ai-routes.caddy.
A bare `up -d` from main now starts exactly what it started before: pg-ai, cube,
ai-api, ai-web.

Both guards come off in the commit that adds worker.py.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 13:36:12 +10:00
Claude
98083cd8d6 Design Phase 9 - operator document management
Operators cannot add a document today: ingestion is CLI-only, needs a host
login and a TTY for confirm_header(), /datadisk/ai-docs is mounted read-only,
ai-api has no identity, and nothing in the stack has a role that can write
doc_chunks. This designs the way in, the way out, and control over what is in
the retrieval pool. Design and schema only - no router, worker or UI code yet.

Documents in (16.1-16.9, db/004):
  upload -> pre-scan -> review -> approve -> published, with the header
  confirmation moved from a terminal prompt to a review screen and recorded
  rather than discarded. A CHECK constraint refuses an approved row without a
  confirmed number, revision and effective date, so an API bug cannot skip it.
  Three roles: agent_ro unchanged, uploads_rw writes the queue only, ingest_rw
  writes doc_chunks and has no HTTP surface.

Documents out (16.10-16.11, db/005):
  --supersede needs a revision to keep, so a cancelled procedure cannot be
  withdrawn at all. Adds withdraw (immediate, reversible, audited), restore
  (refused while another revision is live) and purge (off by default). A
  column grant plus a trigger let the web-facing role make a document less
  citable and never more.

The pool (16.13-16.15, db/006):
  pool_enabled, orthogonal to superseded: one is a claim about the document,
  the other about the corpus. Retrieval requires both, so re-enabling a
  withdrawn document does not make it citable. Named profiles and a
  per-request override let a demo trim the corpus without mutating state on a
  shared live host, and every reduced-pool answer carries a banner with the
  document count, following the used_fixture_data precedent.

Two existing defects found and documented while designing this:
  - ai-ingest takes PGUSER=agent_ro from api.env, a SELECT-only role, so the
    Phase 3 command in the README cannot write doc_chunks (16.1).
  - ingest_file() always inserts superseded = FALSE, so `--all` re-ingests a
    superseded revision as live. --supersede survives only until the next bulk
    run (16.10).

One commit rather than three: the upload, withdrawal and pool designs
interleave in the same spec, README and compose files.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 13:17:38 +10:00
Claude
34d2ccc576 Scaffold the WRPS plant operations assistant repository
Build spec and host brief carried in from C:\Claude and WRPS/02-env; the
plant model (equipment, tags, alarm bitmask, enums, unit conversions) is
derived from WRPS/04-plc/register-map.csv, WRPS/05-scada/modbus/scada-points.csv
and WRPS-CTL-003.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 13:56:32 +10:00