You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Summary
- Release Sync Web 1.3.0.
- Add the document record abstraction and integrate document metadata through ledger/interface reads, writes, resolves, traces, slices, and prunes.
- Migrate public record paths to flat staged/indexed/bridge traversal forms across records, gateway clients, Explorer, tests, and examples.
- Replace the old file-system adapter with a gateway-backed WebDAV service, including navigable ledger index paths, WebDAV directory markers, `/control/pin`, and updated local/API smoke coverage.
- Move user document payloads to byte-vector-only storage, with explicit `expression? #t` boundary codecs for expression-oriented API calls.
- Align Explorer, WebDAV, gateway/workbench examples, locust, and social-agent workloads with byte-vector documents and metadata-aware access.
- Add gateway-local SSE change hints and Explorer stale-while-revalidate refreshes for live staged/admin/ledger views.
- Add the static router journal-node splash page and WebDAV guide, served by the router without a new service.
- Harden local/network operations: isolated Compose stack names, safer teardown docs, runtime-neutral Docker/Podman helpers, healthchecks, development check docs, and screenshot helper updates.
- Improve bridge workflows: negotiated bridge modes, journal peer identity defaults, JSON batch normalization/decoding, content-only directory discovery, accurate local `pinned?` semantics, and historical multi-hop bridge proof resolution.
- Stabilize Explorer/network behavior: preserve active staged edits during refresh, fix bridged pin/unpin display, show node loading feedback, default Explorer stage to user home, and write social-agent documents as plain UTF-8 byte-vectors.
Testing
- `git diff --check`
- `./records/tests/test.sh ./journal/target/release/journal-sdk`
- `cd services/explorer && npm test -- --watchAll=false`
- `cd tests/network/common/social-agent && python -m unittest discover -s tests`
- `cd services/gateway && npm test` (run earlier in branch)
- `cd services/file-system && go test ./...` (run earlier in branch)
- `cd tests/load/locust && python -m unittest discover -s tests` (run earlier in branch)
- Local 8-node Podman compose smoke: router health, splash/WebDAV guide, raw byte-vector social-agent documents, bridged pin/unpin sibling behavior, and historical multi-hop bridge resolve.
Notes/Risks
- Durable document payloads are now byte-vector-only. Use `expression? #t` for public API calls that intentionally encode/decode Scheme expressions.
- Public path syntax is now the flat path shape; older nested public path shapes are intentionally not preserved.
- `pinned?` now means local permanent proof can resolve the value: confirmed values, including `(nothing)`, are pinned; `(unknown)` is not pinned. The check does not perform remote bridge fetches.
- Chain `get` returns `(unknown)` for unavailable pruned proof paths instead of leaking low-level sync-node access errors, allowing bridge fallback fetch/merge to continue.
- WebDAV is a protocol endpoint; browser users should use the new router WebDAV guide instead of opening `/webdav/` directly.
- Do all work on separate branches, never push or otherwise edit `main` directly.
6
+
- Do not push any branch unless explicitly asked.
7
+
- All pull requests to `main` should consist of a single squashed commit with a detailed markdown message.
8
+
9
+
## Versioning
10
+
11
+
- The platform version in `/VERSION` and the journal-sdk crate version is in `journal/Cargo.toml`.
12
+
- Platform version should be updated for all pull requests
13
+
- Crate version should only be updated for pull requests that affect the journal-sdk
14
+
- For both notions of version:
15
+
- Bump the relevant version for every pull request. Confirm the type first: patch, minor, or (rarely) major.
16
+
- When bumping version, update all deployment configurations to reference the latest version.
17
+
- When bumping minor or major versions, update the changelog if one already exists.
18
+
19
+
## Documentation
20
+
- Before final pull requests, ensure that documentation in `/docs` track the implementation
21
+
- Before final pull requests, ensure that README.md and other repo-level documents track the implementation.
22
+
- When adding or changing modules, classes, or functions, ensure that docstrings are correct and consistent.
23
+
24
+
## Deployment
25
+
26
+
- Preserve both deployment paths:
27
+
-`deploy/compose/general/compose.yaml` is the primary single-node deployment path.
28
+
-`tests/api/local-compose.sh` is the primary local smoke-test path.
29
+
- Preserve both TLS and plaintext deployment paths
30
+
- HTTP-only deployment must keep working for internal networks.
31
+
- TLS deployment must keep working with host-provided certificate/key paths.
32
+
- Preserve both Docker, Podman, and other standard container runtimes where possible.
33
+
- Consider Windows, macOS, and Linux (Ubuntu and Fedora SELinux) compatibility posture where possible.
34
+
35
+
## Testing
36
+
37
+
- Before submitting pull requests, identify and run Github Actions locally where relevant and possible.
38
+
- Relevant actions are in .github/workflows/*.yml.
39
+
40
+
## Development
41
+
42
+
- When working with s7 scheme/lisp code, consult `/records/LANGUAGE.md`
43
+
- In Scheme, avoid polluting local namespaces with low-value intermediate variables when collection references are short and explicit.
44
+
- Prefer exact expected data shapes that fail quickly when malformed over networks of ad hoc fallbacks that become hard to reason about.
45
+
- For high-blast-radius changes, roll out from lower layers to higher layers in separate commits/PR slices where practical: Rust/journal changes first, then Scheme record changes, then service/UI changes. Run/update relevant tests incrementally with each slice.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+23Lines changed: 23 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,28 @@
1
1
# Changelog
2
2
3
+
## 1.3.0
4
+
5
+
### Added
6
+
7
+
-**Document records** — Added byte-vector-only document payloads with metadata support and explicit `expression?` public I/O codec for expression-oriented callers.
8
+
-**WebDAV file-system service** — Replaced the previous file-system adapter with a gateway-backed WebDAV service and navigable ledger index paths.
9
+
-**Gateway events** — Added authenticated Server-Sent Events change hints and Explorer live refresh integration.
10
+
-**Router splash page** — Added a static journal node home page and WebDAV guide served directly by the router.
11
+
12
+
### Changed
13
+
14
+
-**Record paths** — Public ledger/interface paths now use flat path syntax for staged, indexed, and bridge traversal paths.
15
+
-**Document adapters** — Explorer, WebDAV, gateway examples, social-agent, and load workloads now write normal document content as byte-vectors unless explicitly using `expression?`.
16
+
-**Pinned state** — `pinned?` now reports local permanent proof value availability; confirmed values including `(nothing)` are pinned, while `(unknown)` is not.
17
+
-**Compose defaults** — All service image tags default to `1.3.0`.
18
+
19
+
### Fixed
20
+
21
+
-**Bridge resolution** — Historical multi-hop bridge paths now return semantic values/unknowns instead of low-level sync-node access errors.
22
+
-**Explorer stability** — Preserved active staged edits during background refreshes and fixed bridged file pin/unpin display.
docker compose -f deploy/compose/general/compose.yaml up
25
26
```
26
27
27
-
See `deploy/compose/general/README.md` for full configuration options.
28
+
Use `podman-compose` or `podman compose` instead of `docker compose` if that is your container runtime. See `deploy/compose/general/README.md` for full configuration options and `docs/development-checks.md` for validation commands and tool dependencies.
This compose stack runs one journal with gateway, explorer, workbench, router, and the `file-system` SMB service.
3
+
This compose stack runs one journal with gateway, explorer, workbench, router, identity-provider, and the WebDAV `file-system` service.
4
4
5
-
The journal service uses the generic `journal-sdk` image directly. The general
6
-
interface is assembled at startup from mounted deployment inputs:
5
+
The journal service uses the generic `journal-sdk` image directly. The general interface is assembled at startup from mounted deployment inputs:
7
6
8
7
-`records/lisp/*.scm`
9
8
-`deploy/compose/general/run.sh`
10
9
- the persistent `database` volume
11
10
12
-
For a fresh database, `run.sh` installs the general interface from the mounted Lisp
13
-
files. For an existing database, mounted Lisp files are only applied when
14
-
`JOURNAL_UPDATE=1`; otherwise the durable journal state continues from the database.
11
+
For a fresh database, `run.sh` installs the general interface from the mounted Lisp files. For an existing database, mounted Lisp files are only applied when `JOURNAL_UPDATE=1`; otherwise the durable journal state continues from the database.
15
12
16
13
## Requirements
17
14
18
-
- Docker
19
-
- Docker Compose
20
-
- Podman Compose on Fedora is also supported. The bind mounts use SELinux
21
-
relabel flags so rootless Podman can read the mounted startup script and Lisp
22
-
files.
15
+
- A Compose-compatible container runtime: Docker Compose, Podman Compose, or `podman-compose`
16
+
-`curl` for the local smoke helper
17
+
18
+
The bind mounts use SELinux relabel flags (`:Z`) so rootless Podman can read the mounted startup script and Lisp files.
19
+
20
+
## Stack identity and ports
21
+
22
+
Use `COMPOSE_PROJECT_NAME` to isolate local, public, and experimental stacks. Container and network names are prefixed from this value, for example `sync-dev-journal` and `sync-prod-gateway`.
23
+
24
+
Default local ports are adjacent and non-privileged:
25
+
26
+
-`HTTP_PORT` default `8192`
27
+
-`HTTPS_PORT` default `8193`
28
+
29
+
Example local stack:
30
+
31
+
```bash
32
+
COMPOSE_PROJECT_NAME=sync-dev SECRET=password \
33
+
HTTP_PORT=8192 HTTPS_PORT=8193 \
34
+
docker compose -f deploy/compose/general/compose.yaml up -d
docker compose -f deploy/compose/general/compose.yaml up -d
43
+
```
44
+
45
+
With Podman Compose:
46
+
47
+
```bash
48
+
COMPOSE_PROJECT_NAME=sync-dev SECRET=password \
49
+
HTTP_PORT=8192 HTTPS_PORT=8193 \
50
+
podman-compose -f deploy/compose/general/compose.yaml up -d
51
+
```
23
52
24
53
## Configuration
25
54
55
+
-`COMPOSE_PROJECT_NAME` (recommended): stack/project identity used for generated volumes and parameterized container/network names
26
56
-`SECRET` (required): authentication secret for restricted journal/gateway operations
27
-
-`PORT` (default `8192`): host HTTP port exposed by router
28
-
-`HTTPS_PORT` (default `443`): host TLS port exposed by router
57
+
-`HTTP_PORT` (default `8192`): host HTTP port exposed by router
58
+
-`HTTPS_PORT` (default `8193`): host TLS port exposed by router
59
+
-`ORIGIN` (default `http://localhost:8192`): public origin used by the identity provider; set this explicitly when using non-default/public ports or hostnames
-`SYNC_FS_JournalJsonUrl` (default `http://journal/interface`): direct journal JSON endpoint used by the default file-system backend
41
-
-`SYNC_FS_GatewayBaseUrl` (default `http://gateway/api/v1`): gateway endpoint used only when gateway-backed file-system modes are selected
68
+
-`FILE_SYSTEM_IMAGE` (default `ghcr.io/sandialabs/sync-web/file-system:1.3.0`): image used by the `file-system` service
69
+
-`SYNC_FS_MAX_OBJECT_BYTES` (default `1048576`): maximum WebDAV object size
42
70
43
71
Gateway note:
72
+
44
73
-`ALLOW_ADMIN_ROUTES` is enabled by default in `deploy/compose/general/compose.yaml`.
45
74
- Gateway landing page is exposed through the router at `/gateway`.
46
75
- Public/client-facing API traffic should go to `gateway` under `/api/v1/general/*` and `/api/v1/root/*`.
76
+
- WebDAV traffic is exposed through the router under `/webdav/`.
47
77
- The raw `/interface` endpoint is still present for direct journal transport use and bridge-oriented internals.
48
78
- The journal's periodic scheduler uses the raw root-step call `(*step* "<secret>")`, which depends on the merged `records/` root-step pipeline.
49
79
50
-
## TLS Behavior
80
+
## TLS behavior
51
81
52
82
This stack uses one compose file. Router auto-selects mode at startup:
53
83
54
84
- HTTP mode: if TLS cert/key files are not present
55
85
- TLS mode: if both `TLS_CERT_FILE` and `TLS_KEY_FILE` exist
56
86
57
-
`tests/api/local-compose.sh` forces HTTP mode by default (`LOCAL_COMPOSE_FORCE_HTTP=1`) for predictable local smoke runs.
58
-
Set `LOCAL_COMPOSE_FORCE_HTTP=0` if you explicitly want TLS behavior during local-compose execution.
87
+
`tests/api/local-compose.sh` forces HTTP mode by default (`LOCAL_COMPOSE_FORCE_HTTP=1`) for predictable local smoke runs. Set `LOCAL_COMPOSE_FORCE_HTTP=0` if you explicitly want TLS behavior during local-compose execution.
59
88
60
89
In TLS mode, router serves:
61
-
-`80` for ACME HTTP-01 challenge path and HTTPS redirects
62
-
-`443` for proxied application routes
63
90
64
-
This is certificate-provider agnostic. Only file paths are required.
91
+
- container port `80` for ACME HTTP-01 challenge path and HTTPS redirects
92
+
- container port `443` for proxied application routes
65
93
66
-
HTTP-only deployment (no TLS files configured):
94
+
The host ports are controlled by `HTTP_PORT` and `HTTPS_PORT`.
67
95
68
-
```bash
69
-
SECRET=password PORT=8192 \
70
-
docker compose -f deploy/compose/general/compose.yaml up -d
71
-
```
96
+
The default compose stack mounts ACME webroot to `/var/www/acme-challenge`. Use `ACME_WEBROOT_HOST_PATH` to override where challenge files come from on the host.
72
97
73
-
With Podman Compose:
74
-
75
-
```bash
76
-
SECRET=password PORT=8192 \
77
-
podman-compose -f deploy/compose/general/compose.yaml up -d
78
-
```
79
-
80
-
The default compose stack now mounts ACME webroot to `/var/www/acme-challenge`.
81
-
Use `ACME_WEBROOT_HOST_PATH` to override where challenge files come from on the host.
The local compose helper enables the SMB file-system service by default.
106
-
107
-
The helper builds a local `journal-sdk` image and uses the same mounted Lisp/runtime
108
-
script layout as the reference compose stack. It no longer builds a separate
109
-
`general` image.
120
+
The local compose helper defaults to `COMPOSE_PROJECT_NAME=sync-local`, `HTTP_PORT=8192`, and `HTTPS_PORT=8193`. It builds local service images, enables the WebDAV file-system service by default, and uses the same mounted Lisp/runtime script layout as the reference compose stack.
110
121
111
122
To override the file-system image during local development:
112
123
@@ -115,8 +126,18 @@ FILE_SYSTEM_IMAGE=sync-web/local-file-system:1.0.0 tests/api/local-compose.sh up
0 commit comments