Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
123 commits
Select commit Hold shift + click to select a range
dbb7f69
feat(server): strict arango|postgres source-backend selector with Pos…
matthewpeterkort Nov 9, 2026
df1a81b
feat(compiler): add backend-tagged compiled command result (pg-ir-01)…
matthewpeterkort Nov 9, 2026
b66b4f2
feat(postgres): bounded pgx pool with PG18 readiness ping (pg-store-0…
matthewpeterkort Nov 9, 2026
266143d
feat(postgres): opt-in isolated PG18 test fixture and owned-namespace…
matthewpeterkort Nov 9, 2026
48f7b31
feat(postgres): advisory-lock serialized, embedded SQL migration runn…
matthewpeterkort Nov 9, 2026
157700c
feat(postgres): scoped JSONB FHIR resource repository with keyset rea…
matthewpeterkort Nov 9, 2026
27f33c0
feat(postgres): exact publication bundle catalog with fenced leases a…
matthewpeterkort Nov 9, 2026
dd77188
feat(postgres): Explorer-owner Create/Get/List on the shared pool and…
matthewpeterkort Nov 9, 2026
ea20b29
feat(postgres): dataset generation manifests + active-generation CAS …
matthewpeterkort Nov 9, 2026
53a8cf7
feat(postgres): scoped typed edge occurrence repository with unresolv…
matthewpeterkort Nov 9, 2026
cd37c55
feat(pg): move recipe registrations and revision chains to PostgreSQL…
matthewpeterkort Nov 9, 2026
b9230bb
feat(postgres): fence execution-owner and reconciler checkpoints with…
matthewpeterkort Nov 9, 2026
4b95eb6
feat(postgres): publish-last generation-scoped resource inventory bui…
matthewpeterkort Nov 9, 2026
c6e16dd
feat(pg-ir-02): trusted PostgreSQL storage bindings + parameterized S…
matthewpeterkort Nov 9, 2026
eafbf05
feat(postgres): persist semantic-inventory build lifecycle, lease, an…
matthewpeterkort Nov 9, 2026
b2a31de
feat(postgres): move private ClickHouse artifact manifests and cleanu…
matthewpeterkort Nov 9, 2026
cecb537
ci(postgres): run ./internal/dataset/postgres as a never-skipped fixt…
matthewpeterkort Nov 9, 2026
c2d2239
feat(catalog/postgres): persist bounded field-profile records in Post…
matthewpeterkort Nov 9, 2026
2421686
feat(postgres): immutable project release candidates + atomic active-…
matthewpeterkort Nov 9, 2026
4c14cbc
feat(postgres): persist Explorer owners and draft saves with atomic v…
matthewpeterkort Nov 9, 2026
9b2d77a
feat(postgres): bounded, idempotent COPY batch writer for resource an…
matthewpeterkort Nov 9, 2026
58cc558
feat(explorer/postgres): immutable capability snapshots + table-shape…
matthewpeterkort Nov 9, 2026
25dd421
ci(postgres): run ./internal/explorer/postgres as a never-skipped fix…
matthewpeterkort Nov 9, 2026
eaabc5d
feat(explorer/postgres): compilation receipts + immutable Explorer re…
matthewpeterkort Nov 9, 2026
72fb783
test(explorer/postgres): self-derive rerun-convergence ledger expecta…
matthewpeterkort Nov 9, 2026
ceb3069
feat(pg-sql-01): render the scoped direct root collection scan on Pos…
matthewpeterkort Nov 9, 2026
8a0a4eb
feat(explorer/postgres): immutable interpretation libraries + content…
matthewpeterkort Nov 9, 2026
005c8f1
feat(explorer/postgres): staged selection revision identity, project-…
matthewpeterkort Nov 9, 2026
984d500
feat(pg-sql-02): enforce project, generation and authorization filter…
matthewpeterkort Nov 9, 2026
0543ffa
feat(explorer/postgres): explicit-group revision headers + ordered de…
matthewpeterkort Nov 9, 2026
25570dc
feat(postgres): typed selector extraction with two-valued path presen…
matthewpeterkort Nov 9, 2026
c70ffc2
feat(catalog/postgres): derive authorization-scoped relationship coun…
matthewpeterkort Nov 9, 2026
bf7d9b9
feat(pg-ingest-01): write validated built resource batches to Postgre…
matthewpeterkort Nov 9, 2026
b209b91
feat(postgres): commit bundle PUBLISHED state and its logical reader …
matthewpeterkort Nov 9, 2026
0c78e7e
feat(dataframe/postgres): add PostgreSQL typed row-streaming adapter …
matthewpeterkort Nov 9, 2026
6e1b8af
feat(catalog/postgres): semantic-inventory contribution storage and r…
matthewpeterkort Nov 9, 2026
94f5f74
feat(catalog/postgres): bounded semantic-inventory pages and selectio…
matthewpeterkort Nov 9, 2026
58dc30d
feat(explorer/postgres): atomic PublishAuthoring across receipt, revi…
matthewpeterkort Nov 9, 2026
999c65f
feat(dataframe/execution): dispatch row execution and preview control…
matthewpeterkort Nov 9, 2026
d0ee66a
feat(publication/postgres): read retention pins vs cleanup claims + s…
matthewpeterkort Nov 9, 2026
5d1424a
feat(pg-ingest-02): persist built FHIR references as PostgreSQL edge …
matthewpeterkort Nov 9, 2026
25b2055
feat(explorer/postgres): bounded idempotent member batches and fenced…
matthewpeterkort Nov 9, 2026
7631dcc
feat(dataframe): typed compiled commands as the only execution bounda…
matthewpeterkort Nov 9, 2026
7c0ae90
feat(dataframe/execution): sanitized live PostgreSQL Explain through …
matthewpeterkort Nov 10, 2026
5e407d8
feat(store/postgres): translate PostgreSQL driver failures into stabl…
matthewpeterkort Nov 10, 2026
ef7ae66
feat(pg-ingest-03): one bounded PostgreSQL generation load over resou…
matthewpeterkort Nov 10, 2026
7150721
feat(explorer/postgres): insert-once explicit-group memberships and f…
matthewpeterkort Nov 10, 2026
7c422ee
refactor(dataframe/execution): remove Arango plan and index types fro…
matthewpeterkort Nov 10, 2026
7a36b92
feat(pg): verify-on-read for explicit-group header serve paths [pg-ex…
matthewpeterkort Nov 10, 2026
7e4e262
refactor(source): separate logical source contracts from PostgreSQL p…
matthewpeterkort Nov 10, 2026
648f7c7
refactor(store/arango): put vendor error interpretation at the adapte…
matthewpeterkort Nov 10, 2026
a4d29f0
fix(verification): re-pin reviewed client.go hash for the arch-backen…
matthewpeterkort Nov 10, 2026
bc551f5
docs(verification): complete the reviewed-baseline receipt chain with…
matthewpeterkort Nov 10, 2026
eec7f4d
feat(store/postgres): make PostgreSQL migration-history ownership com…
matthewpeterkort Nov 10, 2026
00676b9
feat(pg): register UNNEST with stable item identity and ordinality [p…
matthewpeterkort Nov 10, 2026
c4e2bd6
feat(pg-sql-05): parameterized scalar and boolean filters in the Post…
matthewpeterkort Nov 10, 2026
0d8496f
pg-sql-12: deterministic sort and preview window over final row ident…
matthewpeterkort Nov 10, 2026
d08c5ba
feat(postgres): render exact optional and required relationship trave…
matthewpeterkort Nov 10, 2026
a11b8ef
refactor(execution): centralize source rows on one selected target an…
matthewpeterkort Nov 10, 2026
80e1e48
feat(pg-sql-18): render population and cohort-scoped root sources (#119)
matthewpeterkort Nov 10, 2026
34725fa
feat(loom-data): backend-tagged generation-load CLI [pg-runtime-cli-d…
matthewpeterkort Nov 10, 2026
bb6e984
feat(pg-sql-08): render correlated related-record sets and reductions…
matthewpeterkort Nov 10, 2026
8b0e552
feat(pg-sql-15): render registered UNPIVOT melt with typed keys and n…
matthewpeterkort Nov 10, 2026
984ee16
feat(pg-exec-05): execute bounded PostgreSQL root-page command sequen…
matthewpeterkort Nov 10, 2026
f1389b4
feat(pg-sql-20): render authored finite graph path unions for Postgre…
matthewpeterkort Nov 10, 2026
e4aa22c
feat(pg-sql-11): render nested object and bounded slice projections f…
matthewpeterkort Nov 11, 2026
43b9937
refactor(backend): consolidate PostgreSQL implementations behind one …
matthewpeterkort Nov 11, 2026
5944bcd
feat(pg-sql-19): render coded Group tuples with repeated Coding ident…
matthewpeterkort Nov 11, 2026
00565bf
test(pg-exec-04): stream bounded PostgreSQL previews through PreviewO…
matthewpeterkort Nov 11, 2026
068172a
feat(pg-sql-10): register derived scalar calls as typed parameterized…
matthewpeterkort Nov 11, 2026
7daa692
feat(pg-exec-03): preserve Loom post-query values and named-UUID sema…
matthewpeterkort Nov 11, 2026
7f862e6
feat(pg-sql-21): register unit-normalized Quantity extraction as a cl…
matthewpeterkort Nov 11, 2026
659e1a7
feat(pg-sql-13): render stage GROUP keys, reducers, row values, stabl…
matthewpeterkort Nov 11, 2026
e2ac5dd
test(compiler): restore check-4 with recipe-boundary TestCompiledComm…
matthewpeterkort Nov 11, 2026
b604a30
feat(pg-sql-14): render scalar GROUPED_PIVOT and coded CODED_PIVOT ca…
matthewpeterkort Nov 11, 2026
f5a600e
refactor(catalog): one neutral relationship-evidence policy and neutr…
matthewpeterkort Nov 11, 2026
28e32a4
feat(pg-query-route): first scoped PostgreSQL scalar read on the publ…
matthewpeterkort Nov 11, 2026
32e8ad3
refactor(arango): one owned backend factory; move all adapter trees u…
matthewpeterkort Nov 11, 2026
15923e9
feat(pg-sql-16): render composed construction stage sequences (Postgr…
matthewpeterkort Nov 11, 2026
21e4c91
feat(server): compose the full PostgreSQL runtime behind the six-seri…
matthewpeterkort Nov 12, 2026
ccefce0
feat(pg-sql-26): render table-shape excluded-row evidence on PostgreS…
matthewpeterkort Nov 12, 2026
0386bf5
feat(pg-sql-23): compile bounded row-lineage contributor pages (Postg…
matthewpeterkort Nov 12, 2026
b89430e
pg-ir-03: explicit prefix source backend tag + CompileClickHousePrefi…
matthewpeterkort Nov 12, 2026
81b9bc2
pg-sql-25: PostgreSQL category presence/value terminal (#141)
matthewpeterkort Nov 12, 2026
ccbd11f
feat(pg-exec-12): execute table-shape exclusion evidence on PostgreSQ…
matthewpeterkort Nov 12, 2026
5e6e660
feat(pg-exec-08): execute the pg-sql-23 bounded row-lineage contribut…
matthewpeterkort Nov 12, 2026
adebb15
feat(pg-sql-22): compile population member-to-output mapping to Postg…
matthewpeterkort Nov 12, 2026
52461ff
feat(pg-exec-06): execute category scans on PostgreSQL (exact output/…
matthewpeterkort Nov 12, 2026
c335916
feat(pg-sql-24): compile typed cell-value evidence pages (PostgreSQL)…
matthewpeterkort Nov 12, 2026
ca9cf06
feat(pg-exec-07): execute the pg-sql-22 population-mapping witness te…
matthewpeterkort Nov 12, 2026
51dda9e
feat(health): independent source-backend/ClickHouse readiness on Post…
matthewpeterkort Nov 12, 2026
354d7ad
feat(pg-exec-11): PostgreSQL draft outputs feed the workspace Combine…
matthewpeterkort Nov 12, 2026
fd223af
feat(pg-exec-09): trace PostgreSQL cell values and contributor pages …
matthewpeterkort Nov 12, 2026
fc5b596
refactor(server): unify server and CLI composition through the backen…
matthewpeterkort Nov 12, 2026
faffab3
feat(arch-12): one source diagnostics meaning and two plan identity f…
matthewpeterkort Nov 13, 2026
b2da41e
refactor(arch-09): delete root control facade, typed bridges, machine…
matthewpeterkort Nov 13, 2026
25267d1
fix(pg): implement all-generations auth-path discovery on the Postgre…
matthewpeterkort Nov 13, 2026
7ecb42e
fix(pg): compose the capability-evidence reader over all three catalo…
matthewpeterkort Nov 13, 2026
9534829
test(arch-10): dual-backend conformance suite with frozen cell identi…
matthewpeterkort Nov 13, 2026
80bca9a
chore(comments): remove handwritten comments from dataframe and backe…
matthewpeterkort Nov 13, 2026
7f1c995
refactor(execution): share the bounded category result-page collector…
matthewpeterkort Nov 13, 2026
53090b5
refactor(dataframe/execution): converge cell-trace dialect decoding b…
matthewpeterkort Nov 13, 2026
d5e6bd2
refactor(execution): normalize dialect evidence before one table-shap…
matthewpeterkort Nov 13, 2026
0a5be7b
refactor(pg): centralize SQLSTATE predicates behind the store error b…
matthewpeterkort Nov 13, 2026
dfe5aab
test(pg): scope publication fixture audits to the owned verify_pubvis…
matthewpeterkort Nov 13, 2026
e8a738d
refactor(pg/explorer): move fixture-only schema quoting out of produc…
matthewpeterkort Nov 13, 2026
e68c7d6
refactor(pg): give partial catalog adapters capability-specific types…
matthewpeterkort Nov 13, 2026
4878319
test/comments(go-application): remove handwritten comments from lane …
matthewpeterkort Nov 13, 2026
6b94220
refactor(pg): unify the persisted field-profile projection across cat…
matthewpeterkort Nov 13, 2026
2fbb099
chore(comments): remove handwritten comments from lane-04 tooling/con…
matthewpeterkort Nov 13, 2026
3040a67
fix(verification): re-pin 10 comment-sweep-broken digest entries in t…
matthewpeterkort Nov 13, 2026
23df96f
refactor(pg): drop test-only control Verify forwarders; witness Runti…
matthewpeterkort Nov 13, 2026
90267c0
chore(ui-comments): remove handwritten comments from ui/** lane (code…
matthewpeterkort Nov 13, 2026
fd2bfeb
refactor(pg): centralize the schema-name predicate in the store packa…
matthewpeterkort Nov 13, 2026
7e081f4
feat(pg): PostgreSQL adapter for ActivateRepositoryGeneration - secon…
matthewpeterkort Nov 13, 2026
492d3f0
fix(catalog): deterministic pivot defaults in shared write profiler (…
matthewpeterkort Nov 13, 2026
8f65f3c
feat(comments): repository-wide no-code-comments gate + atomic strip/…
matthewpeterkort Nov 13, 2026
cc889e2
feat(pg-render): register post-window child routes and SUM/COUNT/MIN/…
matthewpeterkort Nov 13, 2026
80e8877
fix(verification): final pubbundle reviewed-sources re-pin at 8f65f3c…
matthewpeterkort Nov 13, 2026
8e09676
refactor(server): split construction-input catalog list into two name…
matthewpeterkort Nov 13, 2026
cc599ec
refactor(postgres): split resource and edge phases out of the batch t…
matthewpeterkort Nov 13, 2026
8943086
refactor(server): dispatch authored construction lineage through per-…
matthewpeterkort Nov 13, 2026
afd454c
refactor(scripts): split UI contract canonicalizer into explicit phas…
matthewpeterkort Nov 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,7 @@ This checkpoint exercises actual Arango transactions and public service behavior

## Draft save transaction protocol

Use `node scripts/verify-builder-formal-core.mjs --model draft-transaction --out /tmp/loom-draft-transaction-review --self-test` after changes to `internal/explorer/arango/drafts.go`. Read the result with pstack `/statechart`. The existing statechart frontend lowers checked TLC evidence through its IR into the Mermaid chart; the project adds reader labels, not a second TLA compiler. Use the module's `--witness FILE [SCRATCH_DRAFTS_SOURCE]` command to replay a saved counterexample against production SaveDraft. Pristine source must hold; the matching scratch source fault must reproduce it.
Use `node scripts/verify-builder-formal-core.mjs --model draft-transaction --out /tmp/loom-draft-transaction-review --self-test` after changes to `internal/backends/arango/internal/explorer/drafts.go`. Read the result with pstack `/statechart`. The existing statechart frontend lowers checked TLC evidence through its IR into the Mermaid chart; the project adds reader labels, not a second TLA compiler. Use the module's `--witness FILE [SCRATCH_DRAFTS_SOURCE]` command to replay a saved counterexample against production SaveDraft. Pristine source must hold; the matching scratch source fault must reproduce it.

`DraftSaveTransaction` models one save of one existing draft, one immutable previous revision, and the three ordered query boundaries: read expected head, INSERT previous revision, guarded UPDATE head. Begin, each query callback, abort, commit and return are separate protocol actions. Finite outcomes include missing CAS rows, typed1200, other query errors, confirmed commit rejection and publication followed by a lost acknowledgement. Actual Go replay calls production Store.SaveDraft, observes the RowVisitor callbacks, checks literal expected query bindings and independently expected old/new workspace bytes, and checks final domain error classification with backend cause retained.

Expand Down
1 change: 0 additions & 1 deletion .github/workflows/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ jobs:
build-and-push:
name: Build and push ${{ matrix.arch }} image
needs: tests
# Never expose Quay credentials to code from a forked pull request.
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository
runs-on: ${{ matrix.arch == 'amd64' && 'ubuntu-latest' || 'ubuntu-24.04-arm' }}
strategy:
Expand Down
284 changes: 281 additions & 3 deletions .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ jobs:
- name: Install UI dependencies
working-directory: ui
run: npm ci --ignore-scripts --no-audit --no-fund
- name: No-code-comments gate
run: python3 scripts/check_no_code_comments.py --all-tracked
- name: Check reviewed UI source checkpoint
run: python3 scripts/verify_ui_contract_inventory.py --source-only
- name: Check UI boundaries
Expand Down Expand Up @@ -51,6 +53,34 @@ jobs:
with:
go-version: 1.26.5
cache: true
- name: Install ripgrep for the boundary check
run: |
if ! command -v rg >/dev/null 2>&1; then
sudo apt-get update -qq
sudo apt-get install -y -qq --no-install-recommends ripgrep
fi
rg --version | head -1
- name: Run Go package boundary check
run: bash scripts/check_dataframe_package_boundaries.sh
- name: Backend ownership guard named gates
run: |
set -o pipefail
go test -json -count=1 -timeout=600s ./internal/dataframe/compiler \
-run '^(TestBackendOwnershipGuardContract|TestCompilerProductionFilesNeverImportBackendsOrDrivers)$' \
| node scripts/lib/check-go-test-events.mjs \
TestBackendOwnershipGuardContract \
TestBackendOwnershipGuardContract/compiler_backends_and_drivers \
TestBackendOwnershipGuardContract/neutral_domain_backend_import \
TestBackendOwnershipGuardContract/renderer_runtime_import \
TestBackendOwnershipGuardContract/legitimate_adapter_domain_import \
TestBackendOwnershipGuardContract/actual_relocated_adapter_import \
TestBackendOwnershipGuardContract/missing_or_malformed_input_is_error \
TestBackendOwnershipGuardContract/facade_law_control_plane \
TestCompilerProductionFilesNeverImportBackendsOrDrivers \
TestCompilerProductionFilesNeverImportBackendsOrDrivers/non_vacuity_named_victims_bleed \
TestCompilerProductionFilesNeverImportBackendsOrDrivers/non_vacuity_fires_on_a_real_postgres_adapter \
TestCompilerProductionFilesNeverImportBackendsOrDrivers/non_vacuity_fires_on_a_real_arango_adapter \
TestCompilerProductionFilesNeverImportBackendsOrDrivers/non_vacuity_malformed_input_is_verification_failure
- name: Run all ordinary Go packages and catalog witnesses
run: |
package_list=$(go list . ./internal/... ./cmd/... ./generated/... ./conformance/...)
Expand Down Expand Up @@ -217,6 +247,251 @@ jobs:
./internal/dataframe/published
./internal/store/clickhouse

pg-fixture:
name: PostgreSQL 18 opt-in fixture runner
runs-on: ubuntu-latest
timeout-minutes: 10
services:
postgres18:
image: postgres:18
env:
POSTGRES_DB: loom_test
POSTGRES_USER: loom_test
POSTGRES_PASSWORD: loom_ci_test_only
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -h 127.0.0.1 -U loom_test -d loom_test"
--health-interval 3s
--health-timeout 5s
--health-retries 40
env:
LOOM_TEST_POSTGRES_URL: postgresql://loom_test:loom_ci_test_only@127.0.0.1:5432/loom_test?sslmode=disable
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 1.26.5
cache: true
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 24.x
- name: Run fixture runner coverage without any service
run: timeout 180s node --test scripts/run-postgres-integration.test.mjs
- name: Run owned-namespace real PostgreSQL acceptance
run: timeout 540s node scripts/run-postgres-integration.mjs --out "$RUNNER_TEMP/pg-fixture"
- name: Run the post-window live reducer leg on PostgreSQL 18
run: |
set -euo pipefail
go test -timeout=240s -count=1 -v \
-run 'TestPostWindowLive' \
./internal/dataframe/compiler/render/postgres \
| tee "$RUNNER_TEMP/pg-post-window-live.log"
- name: Assert the post-window live leg executed and never skipped
run: |
set -euo pipefail
log="$RUNNER_TEMP/pg-post-window-live.log"
grep -q -- '--- PASS: TestPostWindowLiveReducersExecuteWithPredicates' "$log"
if grep -q -- '--- SKIP: TestPostWindowLiveReducersExecuteWithPredicates' "$log"; then
echo '::error/post-window live reducer leg skipped despite the PostgreSQL 18 service being configured'
exit 1
fi
- name: Preserve fixture evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: pg-fixture
path: ${{ runner.temp }}/pg-fixture
if-no-files-found: warn

pg-repository-publish:
name: PostgreSQL repository-publish spine across PostgreSQL 18 and ClickHouse
runs-on: ubuntu-latest
timeout-minutes: 10
services:
postgres18:
image: postgres:18
env:
POSTGRES_DB: loom_test
POSTGRES_USER: loom_test
POSTGRES_PASSWORD: loom_ci_test_only
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -h 127.0.0.1 -U loom_test -d loom_test"
--health-interval 3s
--health-timeout 5s
--health-retries 40
clickhouse:
image: clickhouse/clickhouse-server:25.3
env:
CLICKHOUSE_DB: loom_test
CLICKHOUSE_USER: loom_ci
CLICKHOUSE_PASSWORD: loom_ci_password
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
ports:
- 9000:9000
- 8123:8123
options: >-
--health-cmd "wget --no-verbose --tries=1 --spider http://127.0.0.1:8123/ping || exit 1"
--health-interval 5s
--health-timeout 3s
--health-retries 20
env:
LOOM_TEST_POSTGRES_URL: postgresql://loom_test:loom_ci_test_only@127.0.0.1:5432/loom_test?sslmode=disable
LOOM_CLICKHOUSE_URL: clickhouse://127.0.0.1:9000
LOOM_CLICKHOUSE_DATABASE: loom_test
LOOM_CLICKHOUSE_USERNAME: loom_ci
LOOM_CLICKHOUSE_PASSWORD: loom_ci_password
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 1.26.5
cache: true
- name: Run the pgComp battery with the repository-publish spine leg
run: |
set -euo pipefail
go test -timeout=8m -count=1 -v \
-run 'TestPostgresRuntime|TestPostgreSQL|TestHealthWiringPerCompositionArm|TestBackendCompositionContract|TestZZPgCompZeroLeftoverFixtures' \
./internal/server \
| tee "$RUNNER_TEMP/pg-repository-publish.log"
- name: Assert the spine leg executed and never skipped
run: |
set -euo pipefail
log="$RUNNER_TEMP/pg-repository-publish.log"
grep -q -- '--- PASS: TestPostgresRuntimeRepositoryPublishRouteActivatesThroughFinalFlip' "$log"
if grep -q -- '--- SKIP: TestPostgresRuntimeRepositoryPublishRouteActivatesThroughFinalFlip' "$log"; then
echo '::error/repository-publish spine leg skipped despite both live services being configured'
exit 1
fi
grep -q -- '--- PASS: TestPostgresRuntimeRepositoryPublishRetryAfterActivationFailureRevives' "$log"
if grep -q -- '--- SKIP: TestPostgresRuntimeRepositoryPublishRetryAfterActivationFailureRevives' "$log"; then
echo '::error/repository-publish retry-revival leg skipped despite both live services being configured'
exit 1
fi
- name: Preserve spine evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: pg-repository-publish
path: ${{ runner.temp }}/pg-repository-publish.log
if-no-files-found: warn

backend-conformance:
name: Backend architecture conformance across Arango and PostgreSQL
runs-on: ubuntu-latest
timeout-minutes: 10
services:
arangodb:
image: arangodb:3.12
env:
ARANGO_NO_AUTH: '1'
ports:
- 8529:8529
options: >-
--health-cmd "wget --quiet --tries=1 --spider http://127.0.0.1:8529/_api/version"
--health-interval 3s
--health-timeout 5s
--health-retries 40
postgres18:
image: postgres:18
env:
POSTGRES_DB: loom_test
POSTGRES_USER: loom_test
POSTGRES_PASSWORD: loom_ci_test_only
ports:
- 5432:5432
options: >-
--health-cmd "pg_isready -h 127.0.0.1 -U loom_test -d loom_test"
--health-interval 3s
--health-timeout 5s
--health-retries 40
env:
LOOM_TEST_ARANGO_URL: http://127.0.0.1:8529
LOOM_TEST_POSTGRES_URL: postgresql://loom_test:loom_ci_test_only@127.0.0.1:5432/loom_test?sslmode=disable
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v5
with:
go-version: 1.26.5
cache: true
- name: Set up Node
uses: actions/setup-node@v4
with:
node-version: 24.x
- name: Verify the offline skip-set capture against the frozen allowlist
run: env -u LOOM_TEST_ARANGO_URL -u LOOM_TEST_POSTGRES_URL node scripts/backend-conformance-skipset-verify.mjs
- name: Run both conformance arms against the actual services
run: |
set -o pipefail
mkdir -p "$RUNNER_TEMP/backend-conformance"
status=0
timeout 480s go test -json -count=1 -timeout=420s ./internal/server \
-run '^TestBackendArchitectureConformance$' \
> "$RUNNER_TEMP/backend-conformance/conformance.jsonl" || status=$?
node scripts/lib/check-go-test-events.mjs \
TestBackendArchitectureConformance \
TestBackendArchitectureConformance/arangodb \
TestBackendArchitectureConformance/arangodb/scalarQueryServesLiteralScalars \
TestBackendArchitectureConformance/arangodb/repeatedRelatedOccurrenceStaysDistinct \
TestBackendArchitectureConformance/arangodb/nullAndMissingSemanticsPreserved \
TestBackendArchitectureConformance/arangodb/explicitScopeServesAuthorizedAndExcludesUnauthorized \
TestBackendArchitectureConformance/arangodb/restrictedEmptyScopeServesNothing \
TestBackendArchitectureConformance/arangodb/unrestrictedSeesEverything \
TestBackendArchitectureConformance/arangodb/generationIsolationServesActiveOnly \
TestBackendArchitectureConformance/arangodb/stablePagingIsDeterministic \
TestBackendArchitectureConformance/arangodb/explorerDraftCASOneWinnerExactPreimage \
TestBackendArchitectureConformance/arangodb/publicationControlFenceRejectsStaleOwner \
TestBackendArchitectureConformance/arangodb/cancellationTypedFailureNoFallback \
TestBackendArchitectureConformance/arangodb/backendUnavailableAndWrongTagNoFallback \
TestBackendArchitectureConformance/arangodb/upgradeFromPinnedPreRefactorReopensSafely \
TestBackendArchitectureConformance/postgresql \
TestBackendArchitectureConformance/postgresql/scalarQueryServesLiteralScalars \
TestBackendArchitectureConformance/postgresql/repeatedRelatedOccurrenceStaysDistinct \
TestBackendArchitectureConformance/postgresql/nullAndMissingSemanticsPreserved \
TestBackendArchitectureConformance/postgresql/explicitScopeServesAuthorizedAndExcludesUnauthorized \
TestBackendArchitectureConformance/postgresql/restrictedEmptyScopeServesNothing \
TestBackendArchitectureConformance/postgresql/unrestrictedSeesEverything \
TestBackendArchitectureConformance/postgresql/generationIsolationServesActiveOnly \
TestBackendArchitectureConformance/postgresql/stablePagingIsDeterministic \
TestBackendArchitectureConformance/postgresql/explorerDraftCASOneWinnerExactPreimage \
TestBackendArchitectureConformance/postgresql/publicationControlFenceRejectsStaleOwner \
TestBackendArchitectureConformance/postgresql/cancellationTypedFailureNoFallback \
TestBackendArchitectureConformance/postgresql/backendUnavailableAndWrongTagNoFallback \
TestBackendArchitectureConformance/postgresql/upgradeFromPinnedPreRefactorReopensSafely \
TestBackendArchitectureConformance/crossBackendCandidateIdentityParity \
< "$RUNNER_TEMP/backend-conformance/conformance.jsonl" || status=$?
# The gate fails closed on events alone; surface the failing tests'
# own output so a red lane is diagnosable from this step's log.
node -e '
const fs = require("node:fs");
const events = fs.readFileSync(process.argv[1], "utf8").split("\n").filter(Boolean).map(JSON.parse);
const outputs = new Map();
const failed = [];
for (const e of events) {
if (e.Test && e.Action === "output") outputs.set(e.Test, [...(outputs.get(e.Test) ?? []), e.Output]);
if (e.Action === "fail" && e.Test) failed.push(e.Test);
}
for (const name of failed) for (const line of outputs.get(name) ?? []) process.stdout.write(line);
if (failed.length === 0 && events.some(e => e.Action === "fail")) console.error("package-level failure with no named failing test; see conformance.jsonl artifact");
' "$RUNNER_TEMP/backend-conformance/conformance.jsonl" || true
exit $status
- name: Preserve conformance evidence
if: always()
uses: actions/upload-artifact@v4
with:
name: backend-conformance
path: ${{ runner.temp }}/backend-conformance
if-no-files-found: warn

node-unit:
name: Node unit tests
runs-on: ubuntu-latest
Expand All @@ -239,9 +514,6 @@ jobs:
working-directory: ui
run: npm ci --ignore-scripts --no-audit --no-fund
- name: Record executable routes and fail on a broken retained closure
# --out writes the document only after the full inventory succeeds, via an
# atomic rename, so a broken retained dependency closure fails without
# leaving a truncated or stale file for the always() upload to publish.
run: node scripts/verify-builder-formal-core.mjs --phase inventory --out "$RUNNER_TEMP"
- name: Preserve verification inventory
if: always()
Expand Down Expand Up @@ -281,8 +553,14 @@ jobs:
- uses: actions/setup-node@v4
with:
node-version: 22.x
cache: npm
cache-dependency-path: ui/package-lock.json
- name: Install UI dependencies
working-directory: ui
run: npm ci --ignore-scripts --no-audit --no-fund
- name: Run retained Python tests
run: |
export LOOM_TYPESCRIPT_DIR="$GITHUB_WORKSPACE/ui/node_modules/typescript"
python3 -m unittest discover -s scripts/tests
python3 -m unittest scripts.test_validate_architecture_plan

Expand Down
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,8 @@ META/
/ui/apps/*/dist/
/ui/packages/*/dist/

# Explicit machine-local native CDA target configuration.
/.codex/owned-cda-target.json

# Legacy locations of generated verification reports. Current outputs use .cache/.
/verification/builder-interactions/test-obligations.json
/verification/builder-interactions/test-obligations.md
/verification/builder-interactions/route-action-proposals.json
Expand All @@ -51,3 +49,5 @@ META/
/verification/builder-interactions/report.md
/verification/builder-interactions/http-500-audit.json
/docs/verification/playwright/source-conversion-manifest.md

/loom-data
2 changes: 0 additions & 2 deletions .gitnexusignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# Local datasets, analysis artifacts, and agent tooling are not application code.
/CDA-FHIR/
/META_SMALL/
/.audit/
Expand All @@ -7,7 +6,6 @@
/loom
/loom-DocumentReference.csv

# Keep generated API contracts, tests, fixtures, and CI in the architecture graph.
!/generated/
!__tests__/
!__mocks__/
Expand Down
2 changes: 0 additions & 2 deletions Dockerfile.dev
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# Development-only API image. Source is mounted by compose.dev.yaml so saves
# rebuild the binary in Air instead of rebuilding this image.
FROM golang:1.26.5-bookworm

RUN apt-get update \
Expand Down
Loading
Loading