Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
342 commits
Select commit Hold shift + click to select a range
b88de71
feat(e2e-ui): polish demos, event domains, blob URL routes
patrickleet Jul 20, 2026
675c5ab
fix(e2e-ui): wait for move confirms before blob next level
patrickleet Jul 20, 2026
c9a72f1
fix(e2e-ui): restore todo/chat event wire formats
patrickleet Jul 20, 2026
d9fddf6
fix(e2e-ui): drop fake board from blob empty state
patrickleet Jul 20, 2026
0a9a1e3
test(e2e-ui): add Playwright browser e2e suite
patrickleet Jul 20, 2026
a9a78e5
ci: run e2e-ui offline suite and Playwright on PR/main
patrickleet Jul 20, 2026
51c9b1f
fix: green CI for e2e-ui HTTP surface, m2m where, blob start
patrickleet Jul 20, 2026
834cced
fix(e2e-ui): hydrate-safe blob start + align offline UI contracts
patrickleet Jul 20, 2026
ed7d590
feat: extract Distributed JS client package
patrickleet Jul 21, 2026
15ea103
feat: select normalized cache engine
patrickleet Jul 22, 2026
5aba603
feat: emit authorized client manifests
patrickleet Jul 22, 2026
88f09b1
chore: refresh e2e GraphQL artifacts
patrickleet Jul 22, 2026
ba208da
chore: refresh e2e command artifacts
patrickleet Jul 22, 2026
84866e1
feat: add normalized client replica
patrickleet Jul 22, 2026
8410d4a
feat: add typed causal command contracts
patrickleet Jul 22, 2026
6d85afe
feat: add durable causal command dispatch
patrickleet Jul 23, 2026
4694141
feat: harden causal projection protocol
patrickleet Jul 23, 2026
a0bfccb
feat: expose causal GraphQL client protocol
patrickleet Jul 23, 2026
4e20a83
feat: add unified client compiler foundation
patrickleet Jul 23, 2026
5359835
feat: harden client compiler contracts
patrickleet Jul 23, 2026
0ed6d47
feat: compile recursive client replica plans
patrickleet Jul 23, 2026
07f14f5
feat: complete compiler-backed client plans
patrickleet Jul 23, 2026
d4cfe35
docs: move durable decisions to distributed kb
patrickleet Jul 23, 2026
6b6fd86
feat: bind clients to authorization surfaces
patrickleet Jul 23, 2026
963afd5
fix: keep manifest validation test current
patrickleet Jul 23, 2026
9e31204
feat!: complete compiler-backed client replica
patrickleet Jul 24, 2026
b71dad2
fix: isolate GraphiQL introspection limits
patrickleet Jul 24, 2026
b82641a
fix!: split query authority from causal comparability
patrickleet Jul 24, 2026
201e826
fix: retain projection poll liveness
patrickleet Jul 24, 2026
6c6130d
fix: preserve stale replica views during revalidation
patrickleet Jul 24, 2026
f476ad8
fix: stabilize optimistic command feedback
patrickleet Jul 24, 2026
dfd7af5
fix: keep todo command controls visually stable
patrickleet Jul 24, 2026
d3e51be
fix: preserve optimistic order while revalidating
patrickleet Jul 24, 2026
d20e020
fix: fence stale revalidation after projected commands
patrickleet Jul 24, 2026
f74cf67
fix: retain projected rows until read-model echo
patrickleet Jul 25, 2026
27f4abb
feat: add direct-only projection owners
patrickleet Jul 25, 2026
4592a49
fix(cli): treat exact --documents paths as literal files (#136)
patrickleet Jul 25, 2026
a7a71eb
fix: enforce asserted roles in strict OIDC mode
patrickleet Jul 25, 2026
d79bfd1
fix: share expiring OIDC JWKS cache per engine
patrickleet Jul 25, 2026
20d7cc9
test: cover exact GraphQL document paths
patrickleet Jul 25, 2026
9045bea
fix: address GraphQL query service review findings
patrickleet Jul 25, 2026
953ace3
fix: keep projected fences against stale high-revision snapshots
patrickleet Jul 25, 2026
2d56722
fix: fence projected rows by response start
patrickleet Jul 26, 2026
d9103c8
docs: position Distributed as full-stack CQRS + GraphQL + JS
patrickleet Jul 26, 2026
1726753
docs: lead README with Fieldnote, Blob, and live demos
patrickleet Jul 26, 2026
06010ab
docs: highlight first-class OIDC and multi-IdP e2e
patrickleet Jul 26, 2026
eddf173
docs: lead demos with e2e-ui code index
patrickleet Jul 26, 2026
f76901e
docs(e2e-ui): refresh home walkthrough for latest patterns
patrickleet Jul 26, 2026
b740844
refactor(e2e-ui): nest CSS natively; keep postcss for custom-media
patrickleet Jul 26, 2026
8e0ba5c
revert(e2e-ui): undo CSS nesting rewrite
patrickleet Jul 26, 2026
7e3cdbd
refactor(e2e-ui): product components + split global CSS
patrickleet Jul 26, 2026
a471292
fix(e2e-ui): polish chat and blob after product shell migration
patrickleet Jul 26, 2026
8ddb6e8
fix(e2e-ui): read Zitadel project roles from access token
patrickleet Jul 26, 2026
b17a4b5
fix(e2e-ui): type-cast refreshed token when storing groups
patrickleet Jul 26, 2026
65a1a8d
fix(e2e-ui): always request Zitadel project role scopes at login
patrickleet Jul 26, 2026
517771f
fix(e2e-ui): let admin use the normal fieldnote app surface
patrickleet Jul 26, 2026
12a6d8f
refactor: split distributed-replica into folder modules
patrickleet Jul 26, 2026
e3d71d3
fix(e2e-ui): align Playwright with product shell and admin hydration
patrickleet Jul 26, 2026
c7c808e
refactor: split command-runtime into folder modules
patrickleet Jul 26, 2026
8167d7e
refactor: split cache-engine into folder modules
patrickleet Jul 26, 2026
8bb733b
refactor: split query-plan into filter/order/pagination modules
patrickleet Jul 26, 2026
344c9bd
refactor(js): extract shared helpers into src/lib
patrickleet Jul 26, 2026
d039874
fix(js): clear unused imports so tsc check matches CI
patrickleet Jul 26, 2026
576fad3
refactor(js): split commands into types, prepare, presets, receipt
patrickleet Jul 26, 2026
a528395
refactor(js): split identity, helpers barrels, persistence, index, di…
patrickleet Jul 26, 2026
d93e628
refactor(js): extract distributed-replica impl concern modules
patrickleet Jul 26, 2026
e52751f
refactor(js): body-split commands, identity, helpers, persistence, in…
patrickleet Jul 26, 2026
4412560
refactor(js): move command-runtime helpers into lib/
patrickleet Jul 26, 2026
f2a1c27
refactor(js): drop command-runtime helpers.ts barrel
patrickleet Jul 26, 2026
fbe6470
refactor: split graphql compile modules
patrickleet Jul 26, 2026
1d2f61d
refactor: split client compiler manifest module
patrickleet Jul 26, 2026
d6a5bc4
refactor: split client compiler graphql pipeline
patrickleet Jul 26, 2026
768fb1e
refactor: split client compiler render module
patrickleet Jul 26, 2026
74cc03b
refactor: split client manifest module
patrickleet Jul 26, 2026
c49a50e
refactor: split command ledger module
patrickleet Jul 26, 2026
50657cc
refactor: split sqlx repository core
patrickleet Jul 26, 2026
e51fdda
refactor: split command manifest compiler
patrickleet Jul 26, 2026
2d540b2
refactor: split graphql protocol helpers
patrickleet Jul 26, 2026
9480a95
refactor: split GraphQL command contract modules
patrickleet Jul 26, 2026
7d3e413
fix(macros): update trybuild paths after command_contract split
patrickleet Jul 26, 2026
628ddb1
refactor: split projection protocol store module
patrickleet Jul 26, 2026
cd28a5b
fix: re-export ProjectionPartitionSnapshot from store split
patrickleet Jul 26, 2026
6b86bfc
refactor: split projection protocol codec
patrickleet Jul 26, 2026
e4a7d9b
refactor: split hot rust modules
patrickleet Jul 26, 2026
ac91bc8
refactor: split projector runtime module
patrickleet Jul 26, 2026
2109e4d
refactor: split sqlx read model module
patrickleet Jul 26, 2026
e756f6d
refactor: split distributed macros entry modules
patrickleet Jul 26, 2026
380ef5f
refactor: split graphql surface modules
patrickleet Jul 26, 2026
bb78d02
refactor: split graphql engine orchestration
patrickleet Jul 26, 2026
a6cd9d7
refactor: split microsvc service module
patrickleet Jul 26, 2026
2547673
refactor: folderize SQLx projection protocol
patrickleet Jul 26, 2026
11a947e
refactor: folderize in-memory projection protocol
patrickleet Jul 26, 2026
a293aa5
refactor: share pure projection backend helpers
patrickleet Jul 26, 2026
6dd94f1
refactor: share projection kind storage decoding
patrickleet Jul 27, 2026
003e848
refactor: share projection digest helper
patrickleet Jul 27, 2026
a0d1db2
refactor: share projection failure batch predicate
patrickleet Jul 27, 2026
b1d9302
refactor: share projection ownership validation
patrickleet Jul 27, 2026
a05849d
test: share projection protocol scenarios
patrickleet Jul 27, 2026
5f6372b
refactor!: rename client GraphQL protocol version 2 → 1
patrickleet Jul 27, 2026
a59dd91
fix: update postgres/cli fingerprint goldens for protocol v1
patrickleet Jul 27, 2026
6cd1703
refactor!: ship unreleased wire versions as v1
patrickleet Jul 27, 2026
e5d21d3
fix: update orders harness schema fingerprint for v1 wire versions
patrickleet Jul 27, 2026
847e419
fix: update postgres role-surface schema fingerprint for v1
patrickleet Jul 27, 2026
7d5d31b
chore: drop NPM_RELEASE_READY gate from tag publish
patrickleet Jul 27, 2026
f84dd20
fix(e2e-ui): drop dead Manage Account and Protected Page links
patrickleet Jul 27, 2026
a69690a
chore(e2e-ui): refresh generated clients after protocol v1 wire renames
patrickleet Jul 27, 2026
0d6b931
chore: apply cargo fix for unused re-exports
patrickleet Jul 27, 2026
a324d43
chore: silence false dead_code noise without deleting protocol surface
patrickleet Jul 27, 2026
f1a78d7
fix: restore test-only re-exports removed by cargo fix
patrickleet Jul 27, 2026
8781a9d
refactor(e2e-ui): rename Fieldnote demo to Todos
patrickleet Jul 27, 2026
2f0755f
refactor(e2e-ui): name template e2e-ui; keep Todos as one demo
patrickleet Jul 27, 2026
aea4842
feat: infer natural read-model storage names
patrickleet Jul 28, 2026
709a5b2
refactor: rename successful command outcomes
patrickleet Jul 28, 2026
f3c9e4e
feat(js): replace optimistic layers atomically
patrickleet Jul 28, 2026
60b55d4
feat: add typed domain-event occurrence runtime
patrickleet Jul 28, 2026
39f706a
feat: generate sourced domain-event capture
patrickleet Jul 28, 2026
a027ddb
feat: define portable projection program IR
patrickleet Jul 28, 2026
7eaf18d
Implement fluent projection commit API
patrickleet Jul 28, 2026
410acba
Implements [[tasks/graphql-qs-projection-model-8]]
patrickleet Jul 28, 2026
77bd865
Fix projection direct candidate classification
patrickleet Jul 28, 2026
2eee576
feat: add projection catalog identities and placement
patrickleet Jul 28, 2026
4108751
test: align compile failures with succeeded outcomes
patrickleet Jul 28, 2026
bff4eec
Implement causal projection executor and graph workspace
patrickleet Jul 28, 2026
2d085a1
feat: declare exact command projection events
patrickleet Jul 28, 2026
f3f31f0
feat: bind modeled projections to GraphQL surfaces
patrickleet Jul 28, 2026
c62c2b9
feat: expose crate projection expression views
patrickleet Jul 28, 2026
31bd80c
fix: authorize modeled projection surfaces
patrickleet Jul 28, 2026
e2427bb
feat: type sourced domain event contracts
patrickleet Jul 28, 2026
68770e3
fix: seal adapter event contracts
patrickleet Jul 28, 2026
1c411b8
fix: witness exact domain event bodies
patrickleet Jul 28, 2026
086f2c4
test: refresh event contract diagnostics
patrickleet Jul 28, 2026
3dc2556
feat: export strict authorized projection manifests
patrickleet Jul 28, 2026
988663b
feat: model authorized optimistic projection occurrences
patrickleet Jul 28, 2026
2d73e86
feat: define role-safe projection delta v1
patrickleet Jul 28, 2026
c85d9bf
chore: export projection delta module
patrickleet Jul 28, 2026
d933134
fix: seal projection delta authority
patrickleet Jul 28, 2026
fc35d06
fix: canonicalize projection delta final state
patrickleet Jul 28, 2026
107fcab
feat: lower sealed role-safe projection deltas
patrickleet Jul 28, 2026
6d909ed
fix: harden projection delta recovery scopes
patrickleet Jul 28, 2026
9a3257e
feat: expose role-safe projection partitions [[tasks/graphql-qs-proje…
patrickleet Jul 28, 2026
e2b4596
test: freeze projection delta v1 vectors
patrickleet Jul 28, 2026
5d7a92b
feat: parse projection manifest v2 contracts
patrickleet Jul 28, 2026
dba4ade
feat: compile projection preview artifacts
patrickleet Jul 28, 2026
cf74b1a
test: lock projection compiler contracts
patrickleet Jul 28, 2026
8fd80a8
fix: prove optimistic projection inputs
patrickleet Jul 28, 2026
f0765a3
fix: close projection preview safety gaps
patrickleet Jul 28, 2026
c0880d6
fix: fail closed at projection runtime seam
patrickleet Jul 28, 2026
20fbb6e
fix: fail closed on first-present unset
patrickleet Jul 28, 2026
79f668e
Add authenticated projection metadata authority [[tasks/graphql-qs-pr…
patrickleet Jul 28, 2026
6fa54a5
Persist modeled projection receipts exactly [[tasks/graphql-qs-projec…
patrickleet Jul 28, 2026
58a1df7
Mount modeled projectors and derive causal obligations [[tasks/graphq…
patrickleet Jul 28, 2026
6c44aa7
Format Task 11 runtime changes [[tasks/graphql-qs-projection-model-11]]
patrickleet Jul 28, 2026
ef5778a
Bound modeled replay metadata lifetime and decoding [[tasks/graphql-q…
patrickleet Jul 28, 2026
509823e
Format integrated projection runtime [[tasks/graphql-qs-projection-mo…
patrickleet Jul 28, 2026
ec8bf15
feat: adapt modeled direct projections to exact proof [[tasks/graphql…
patrickleet Jul 28, 2026
aba6ca4
Bind modeled direct proof to active program [[tasks/graphql-qs-projec…
patrickleet Jul 28, 2026
f592251
feat(projections): implement atomic snapshot adapters [[tasks/graphql…
patrickleet Jul 28, 2026
4b81b4e
Harden projection conformance proofs [[tasks/graphql-qs-projection-mo…
patrickleet Jul 28, 2026
279406c
feat: migrate Todo and Chat projection leaves [[tasks/graphql-qs-proj…
patrickleet Jul 28, 2026
d122c4a
Keep purge descriptor test-only [[tasks/graphql-qs-projection-model-18]]
patrickleet Jul 28, 2026
c729fff
Fix FK-authoritative relationship delegation [[tasks/graphql-qs-proje…
patrickleet Jul 28, 2026
15edcea
fix: keep purged todos terminal [[tasks/graphql-qs-projection-model-18]]
patrickleet Jul 28, 2026
708691e
Test hydrated purge terminality [[tasks/graphql-qs-projection-model-18]]
patrickleet Jul 28, 2026
3e77e34
Reject mixed direct projection epochs [[tasks/graphql-qs-projection-m…
patrickleet Jul 28, 2026
1f61599
Harden direct projection owner compatibility [[tasks/graphql-qs-proje…
patrickleet Jul 28, 2026
669aa68
feat: apply authoritative projection deltas in JS [[tasks/graphql-qs-…
patrickleet Jul 28, 2026
b45c4d6
fix: harden JS projection reconciliation [[tasks/graphql-qs-projectio…
patrickleet Jul 28, 2026
7a57536
fix: close projection reconciliation audit gaps [[tasks/graphql-qs-pr…
patrickleet Jul 28, 2026
aca10df
fix: close projection runtime follow-up gaps [[tasks/graphql-qs-proje…
patrickleet Jul 29, 2026
25f22a9
feat: model Blob direct projection [[tasks/graphql-qs-projection-mode…
patrickleet Jul 29, 2026
0261d9a
Implement modeled projection developer experience [[tasks/graphql-qs-…
patrickleet Jul 29, 2026
55b1320
Fix modeled topology integration [[tasks/graphql-qs-projection-model-…
patrickleet Jul 29, 2026
683ee50
Harden modeled projection rollout integration [[tasks/graphql-qs-proj…
patrickleet Jul 29, 2026
66df902
Fence draining projection replay with lifecycle proofs [[tasks/graphq…
patrickleet Jul 29, 2026
231160b
Revalidate terminal projection receipt replays [[tasks/graphql-qs-pro…
patrickleet Jul 29, 2026
cbb17a9
Fix projection draining revalidation bridge [[tasks/graphql-qs-projec…
patrickleet Jul 29, 2026
613ea25
Bind empty projection receipts to command contracts [[tasks/graphql-q…
patrickleet Jul 29, 2026
de8d09b
Classify mixed draining projection fallback [[tasks/graphql-qs-projec…
patrickleet Jul 29, 2026
405f424
Correct deletion projection examples [[tasks/graphql-qs-projection-mo…
patrickleet Jul 29, 2026
920360e
Fix generated projection UI integration [[tasks/graphql-qs-projection…
patrickleet Jul 29, 2026
d408497
Migrate typed command manifest coverage [[tasks/graphql-qs-projection…
patrickleet Jul 29, 2026
f725bd4
Strengthen projection manifest coverage [[tasks/graphql-qs-projection…
patrickleet Jul 29, 2026
74b2b13
Accept embedded model invalidation [[tasks/graphql-qs-projection-mode…
patrickleet Jul 29, 2026
7198802
Constrain embedded invalidation authority [[tasks/graphql-qs-projecti…
patrickleet Jul 29, 2026
930d83c
Fix PR 127 CI regressions [[incidents/pr-127-ci-failures-after-projec…
patrickleet Jul 29, 2026
047f584
Wait for durable Todo commands in live test [[incidents/pr-127-ci-fai…
patrickleet Jul 29, 2026
b3703e1
Fix application projection visibility authority [[incidents/pr-127-ci…
patrickleet Jul 29, 2026
5569357
Infer projected responses from read models [[tasks/graphql-qs-project…
patrickleet Jul 30, 2026
2535e76
Restore explicit CQRS fixture boundaries [[tasks/graphql-qs-projectio…
patrickleet Jul 30, 2026
abe05e3
chore: better version in e2e-ui of test
patrickleet Jul 30, 2026
8931937
feat: add event-independent mutation IR and dual-path projectors
patrickleet Jul 30, 2026
8c967f4
feat: placement-selected projected() and wire mutation programs on se…
patrickleet Jul 30, 2026
461b5ff
feat: drive e2e mounts from mutation IR rewrite (real resolve path)
patrickleet Jul 30, 2026
f7af95e
feat: WP10 cutover — remove projection! and command-side .project
patrickleet Jul 31, 2026
94d6d61
feat: AC4 residual cutover — remove effects macros and public project…
patrickleet Jul 31, 2026
415d59a
docs: teach placement-selected Blob projected path only
patrickleet Jul 31, 2026
4f5268c
refactor: release-ready cleanup of leftover projector authoring surfaces
patrickleet Jul 31, 2026
28fdcb7
feat: mutation_projector! sugar and arm helpers for nice app mounts
patrickleet Jul 31, 2026
7fad7db
docs(e2e-ui): show mutation_projector! author surface in README
patrickleet Jul 31, 2026
285e3a5
feat: portable_handlers! matches the spec author model
patrickleet Jul 31, 2026
d75fe50
fix: import DomainEventContract in todo projection tests
patrickleet Jul 31, 2026
2d18562
refactor: remove dual-path compatibility surface; ship portable_handl…
patrickleet Jul 31, 2026
0aa6262
refactor(e2e): rename TODO_READS to TODOS for model-consistent naming
patrickleet Jul 31, 2026
c1d1f2b
refactor(e2e-ui): consistent command previews and portable_handlers d…
patrickleet Jul 31, 2026
710027d
feat: event-first mutations, applies mapping, handler-owned projected…
patrickleet Jul 31, 2026
b43a7d7
fix: keep chat live+optimism with author joins and portable todo lists
patrickleet Jul 31, 2026
54fcb68
fix: keep warm same-scope cache and polish lobby chat history
patrickleet Jul 31, 2026
75d717f
fix: restore quality and e2e-ui offline CI on mutation-projectors branch
patrickleet Jul 31, 2026
a1809c3
fix(e2e-ui): grant admin principals the user role too
patrickleet Jul 31, 2026
7c0ff28
fix(e2e-ui): write create_human status to stderr for clean UIDs
patrickleet Jul 31, 2026
4f74c66
fix: multi-role application surfaces + chat history load race
patrickleet Jul 31, 2026
681e17e
fix(e2e-ui): update surface structural gate and chat optimism window
patrickleet Jul 31, 2026
82c64b0
feat: set-only identity and surface-privilege GraphQL execution
patrickleet Jul 31, 2026
63b3272
fix: prove e2e-ui-public anonymous open and finish AuthZ docs
patrickleet Jul 31, 2026
4692786
fix: CI failures for set-only identity (x-roles)
patrickleet Jul 31, 2026
f60b0dd
fix: remove x-role identity bridges — set-only cutover
patrickleet Jul 31, 2026
a5be455
fix: align subscription unknown-role test with set-only authority
patrickleet Jul 31, 2026
735373d
fix(e2e-ui): treat scrape outbox duplicates as skips
patrickleet Jul 31, 2026
46610c1
feat(e2e-ui): framework home + How it’s built slide-out
patrickleet Jul 31, 2026
d91b247
fix(e2e-ui): hero highlights full-stack CQRS, TS, OIDC, SvelteKit
patrickleet Jul 31, 2026
47e8895
fix(e2e-ui): wider How-it’s-built panel, no closed shadow, code colors
patrickleet Jul 31, 2026
fdde34f
feat(e2e-ui): browser-first How-it’s-built tab order
patrickleet Jul 31, 2026
2d951fb
feat(e2e-ui): open lobby chat for anonymous GraphQL reads
patrickleet Aug 1, 2026
fc880e3
feat(e2e-ui): show RBAC on How-it’s-built query and command tabs
patrickleet Aug 1, 2026
9fabd99
fix(e2e-ui): replace comment-only How-it’s-built samples with real code
patrickleet Aug 1, 2026
3db3407
feat(e2e-ui): rewrite home as Distributed product landing
patrickleet Aug 1, 2026
87bfdfe
style(e2e-ui): product-home layout styles for dist-* sections
patrickleet Aug 1, 2026
5fd7bd8
fix(e2e-ui): reframe home as GraphQL realtime → owned write model
patrickleet Aug 1, 2026
1799a69
fix(e2e-ui): home is CQRS/domain-first; GraphQL is transport
patrickleet Aug 1, 2026
c5e9b54
fix(e2e-ui): brand Distributed; hero product definition
patrickleet Aug 1, 2026
c1c3cd5
fix(e2e-ui): hero — start simple, scale to microservices
patrickleet Aug 1, 2026
4b8ade3
feat(e2e-ui): product home Features from CQRS/ES canon narrative
patrickleet Aug 1, 2026
cb3d48b
refactor: rename portable_handlers! to projection!
patrickleet Aug 1, 2026
d07c990
feat: event-first projection! on { events, mutation, input }
patrickleet Aug 1, 2026
8aed8a9
refactor(e2e-ui): name replica handles query, data by resource
patrickleet Aug 1, 2026
dac4da7
feat(e2e-ui): SOTA home story — claim arc, general bar, delivery
patrickleet Aug 1, 2026
a70abe8
feat(e2e-ui): walkthrough read models + unidirectional flow diagram
patrickleet Aug 1, 2026
68c4c4b
fix(e2e-ui): gate todos/blob on login; drop redundant /public page
patrickleet Aug 1, 2026
51deab9
feat: Eventual/Atomic command semantics + restore chat optimism
patrickleet Aug 2, 2026
7092617
test(e2e-ui): gate demo optimism offline and in the browser
patrickleet Aug 2, 2026
453a332
fix(e2e-ui): blob move board optimism via .applies input fields
patrickleet Aug 2, 2026
a56813b
docs(e2e-ui): clarify blob move uses shared .applies optimism path
patrickleet Aug 2, 2026
9c1934b
refactor!: drop TypedCommand.preview alias — use applies only
patrickleet Aug 2, 2026
e3552f6
docs: application composition — logical mounts, process roles, runtime
patrickleet Aug 2, 2026
b5a74d0
fix(ci): finish eventual/atomic rename in CLI fixtures and suite asserts
patrickleet Aug 2, 2026
1121690
fix: repair PR 170 migration and contract drift
patrickleet Aug 2, 2026
4fb2bb8
test(e2e-ui): consolidate duplicate coverage
patrickleet Aug 2, 2026
06235d7
test(js): centralize command protocol fixtures
patrickleet Aug 2, 2026
5c1e721
ci: remove duplicate feedback work
patrickleet Aug 2, 2026
7cf888f
ci: overlap independent e2e-ui offline gates
patrickleet Aug 2, 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
  •  
  •  
  •  
44 changes: 40 additions & 4 deletions .github/workflows/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,12 @@ existing unbounded-tech quality provider plus the integration/* jobs below —
|----------|-----------------|----------|
| [`quality.yaml`](./quality.yaml) | yes | **Consumers:** fmt → clippy → build → test + coverage (sticky PR comment) |
| [`test-all-features.yaml`](./test-all-features.yaml) | yes | **This repo:** workspace `--all-features` |
| [`integration-*.yaml`](./) | yes | **This repo:** broker / DB / CLI / observability |
| [`integration-*.yaml`](./) | yes | **This repo:** broker / DB / CLI / observability / GraphQL identity+OIDC |
| [`integration-e2e-ui.yaml`](./integration-e2e-ui.yaml) | yes | **This repo:** `tests/e2e-ui` offline suite + Playwright browser e2e |
| [`integration-js.yaml`](./integration-js.yaml) | yes | **This repo:** install, typecheck, test, build, and packed-consumer smoke test for `js/` |
| [`on-pr-quality.yaml`](./on-pr-quality.yaml) | entry | **This repo** PR gate (not the consumer quality contract) |
| [`on-push-main-version-and-tag.yaml`](./on-push-main-version-and-tag.yaml) | entry | **This repo** main → **vnext** tag |
| [`on-v-tag-publish.yaml`](./on-v-tag-publish.yaml) | entry | **This repo** crates.io + `dctl` binary release |
| [`on-v-tag-publish.yaml`](./on-v-tag-publish.yaml) | entry | **This repo** crates.io + npm + `dctl` binary release |

**Version tagging (anywhere):** `unbounded-tech/workflow-vnext-tag`
**GitHub Release only (domain crates):** `unbounded-tech/workflow-simple-release`
Expand Down Expand Up @@ -90,12 +92,46 @@ jobs:

**Pinning:** prefer a released tag once cut (`@vX.Y.Z` or git SHA). During development of quality, `@feat/shared-workflows` is fine.

## npm release setup

Version tags publish the package under [`js/`](../../js/) to npm as
`@hops-ops/distributed`. The tag must have the exact form `vX.Y.Z`; the workflow
uses `X.Y.Z` for both `js/package.json` and `js/package-lock.json`, runs the same
package quality gate used on pull requests, and publishes with npm provenance.

Configure an npm **Trusted Publisher** for `@hops-ops/distributed` with these
exact GitHub Actions coordinates:

- Organization or user: `hops-ops`
- Repository: `distributed`
- Workflow filename: `on-v-tag-publish.yaml`
- Environment: `npm`
- Allowed action: `npm publish`

Trusted Publisher configuration is available only after the npm package exists.
One-time bootstrap (already completed for this repo):

1. Publish a throwaway non-release version such as `0.0.0` for
`@hops-ops/distributed` on the public npm registry.
2. Configure the npm Trusted Publisher using the exact coordinates above
(`npm trust github @hops-ops/distributed --file on-v-tag-publish.yaml
--repo hops-ops/distributed --env npm --allow-publish`).
3. Create the GitHub `npm` deployment environment (optional protection rules:
tag pattern `v*`, required reviewers).

Release preflight validates the tag form and that `@hops-ops/distributed`
exists on the public registry before any npm or crates.io write starts. Tagged
npm releases authenticate through GitHub Actions OIDC. The workflow
intentionally has job-scoped `id-token: write`, uses npm 11.5.1 or newer, and
does **not** require or accept a long-lived `NPM_TOKEN` repository secret.

## Why this monorepo doesn’t call `quality.yaml`

The framework workspace needs a different gate: default-features tests via
unbounded quality (or similar), plus **all-features**, Postgres/NATS/Kafka/…
integrations, and CLI/observability jobs. Consumer domain crates are single
packages (or small libs) and only need the reusable quality contract.
integrations, CLI/observability, and GraphQL identity/OIDC jobs. Consumer
domain crates are single packages (or small libs) and only need the reusable
quality contract.

## Out of scope (for now)

Expand Down
181 changes: 181 additions & 0 deletions .github/workflows/integration-e2e-ui.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
name: e2e-ui fixture (offline + browser)

# Nested Todos template under tests/e2e-ui — not the root workspace.
# Local parity:
# cd tests/e2e-ui && make check-client
# cd tests/e2e-ui && make test
# cd tests/e2e-ui && make up && make run # then make test-browser
on:
workflow_call:

env:
CARGO_TERM_COLOR: always
# Playwright / Auth.js over HTTP on localhost
CI: true

jobs:
offline:
name: e2e-ui offline (domain + suite + UI unit)
runs-on: ubuntu-latest
defaults:
run:
working-directory: tests/e2e-ui
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false

- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable

- uses: Swatinem/rust-cache@v2
with:
workspaces: tests/e2e-ui -> target
shared-key: e2e-ui-offline

- uses: actions/setup-node@v4
with:
node-version: "22"
cache: npm
cache-dependency-path: |
js/package-lock.json
tests/e2e-ui/ui/package-lock.json

# Install/build shared JS prerequisites once, then overlap the independent
# Rust and UI pipelines while retaining byte-for-byte generated drift.
- name: Verify generated artifacts and run offline suite
run: make ci-offline

browser:
name: e2e-ui Playwright (live stack)
runs-on: ubuntu-latest
timeout-minutes: 45
defaults:
run:
working-directory: tests/e2e-ui
steps:
- uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5
with:
persist-credentials: false

- uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8
with:
toolchain: stable

- uses: Swatinem/rust-cache@v2
with:
workspaces: tests/e2e-ui -> target
shared-key: e2e-ui-browser

- uses: actions/setup-node@v4
with:
node-version: "22"
cache: npm
cache-dependency-path: |
js/package-lock.json
tests/e2e-ui/package-lock.json
tests/e2e-ui/ui/package-lock.json

- name: Install host tools
run: sudo apt-get update && sudo apt-get install -y jq openssl curl

- name: Docker stack + OIDC bootstrap (make up)
run: |
chmod +x scripts/up.sh
make up

- name: Build e2e-ui API binary
run: cargo build -p e2e-runner --bin e2e-ui

- name: Install UI deps
run: make ui-install

- name: Start API + UI
run: |
set -euo pipefail
set -a
# shellcheck disable=SC1091
. ./e2e-ui.env
set +a
export AUTH_URL="${E2E_UI_ORIGIN:-http://localhost:5180}"
export AUTH_USE_SECURE_COOKIES=false
export AUTH_TRUST_HOST=true

./target/debug/e2e-ui > .make-runner.log 2>&1 &
echo $! > .make-runner.pid

ok=0
for i in $(seq 1 90); do
code=$(curl -s -o /dev/null -w '%{http_code}' -X POST "http://127.0.0.1:8791/graphql" \
-H 'content-type: application/json' \
-d '{"query":"{ __typename }"}' 2>/dev/null || echo 000)
if [ "$code" = "200" ] || [ "$code" = "401" ]; then ok=1; break; fi
sleep 0.5
done
if [ "$ok" != "1" ]; then
echo "API failed to become ready"; tail -100 .make-runner.log; exit 1
fi
echo "API ready (HTTP $code)"

cd ui
npm run dev -- --host localhost --port 5180 > ../.make-ui.log 2>&1 &
echo $! > ../.make-ui.pid
cd ..

ok=0
for i in $(seq 1 60); do
code=$(curl -s -o /dev/null -w '%{http_code}' "http://localhost:5180/" 2>/dev/null || echo 000)
# 200 home, or 303 redirect when auth wraps routes — not 000/5xx
if [ "$code" = "200" ] || [ "$code" = "303" ] || [ "$code" = "302" ]; then ok=1; break; fi
sleep 0.5
done
if [ "$ok" != "1" ]; then
echo "UI failed to become ready (last HTTP $code)"; tail -80 .make-ui.log; exit 1
fi
echo "UI ready (HTTP $code)"

- name: Install Playwright + Chromium
run: |
npm install
npx playwright install chromium --with-deps

- name: Run browser e2e
run: npm run test:browser
env:
E2E_UI_ORIGIN: http://localhost:5180
E2E_API_ORIGIN: http://127.0.0.1:8791
CI: true

- name: Upload Playwright report
if: failure()
uses: actions/upload-artifact@v4
with:
name: e2e-ui-playwright-report
path: |
tests/e2e-ui/playwright-report
tests/e2e-ui/test-results
if-no-files-found: ignore
retention-days: 7

- name: Dump logs on failure
if: failure()
run: |
echo '=== API log ==='
tail -150 .make-runner.log || true
echo '=== UI log ==='
tail -80 .make-ui.log || true
docker compose -f docker/docker-compose.yml ps -a || true
docker compose -f docker/docker-compose.yml logs --tail=100 || true

- name: Stop API/UI
if: always()
run: |
[ -f .make-ui.pid ] && kill "$(cat .make-ui.pid)" 2>/dev/null || true
[ -f .make-runner.pid ] && kill "$(cat .make-runner.pid)" 2>/dev/null || true
lsof -ti:8791 2>/dev/null | xargs -r kill -9 2>/dev/null || true
lsof -ti:5180 2>/dev/null | xargs -r kill -9 2>/dev/null || true

- name: Tear down Docker
if: always()
run: docker compose -f docker/docker-compose.yml down -v || true
Loading
Loading