7 Commits
Author SHA1 Message Date
wtandClaude Opus 5.5 7fbe86a943 Contract v2: clarify ids, rates, recurring, ledger and attachment details
CI / Rust (fmt / clippy / test / build) (push) Successful in 1m4s
CI / HTTP/JSON reference + SQLite persistence (push) Successful in 1m36s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 23:51:38 +07:00
wtandClaude Opus 5.5 dfb4fe4e1a Implement ecosystem contract v2: capabilities, shared ledgers, attachments
- GET /v1/capabilities and the extended sync entity allowlist (§0, §1).
- Shared ledgers (§7): ledgers, members and hashed one-time invite codes;
  X-Balance-Ledger selects the space on /v1/sync and /v1/attachments with
  its own records, change stream and cursor. Personal space keeps the v1
  tables and behaviour; the migration only adds tables.
- Attachments (§8): SHA-256, size and media type checks, blob files in
  BALANCE_ATTACHMENTS_DIR (default: attachments next to the database),
  garbage collection of unreferenced blobs with a grace period for fresh
  uploads, and ledger deletion removes its blobs.
- Tests for every new endpoint and error code; API, sync, data model,
  security, deployment and README docs updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 23:30:12 +07:00
wtandClaude Opus 5.5 10272f3851 Remove the Go reference server; keep only Rust
CI / Rust (fmt / clippy / test / build) (push) Successful in 1m41s
CI / HTTP/JSON reference + SQLite persistence (push) Successful in 1m16s
CI / Rust (fmt / clippy / test / build) (pull_request) Successful in 47s
CI / HTTP/JSON reference + SQLite persistence (pull_request) Successful in 1m34s
The Go implementation is preserved in the v1.0.0 tag. Its observable
behaviour stays the API reference: responses recorded from the Go server
live in tools/compatibility_expected.txt, and tools/compatibility.py now
compares the Rust server against them (--update re-records after an
intentional change). The Go SQLite schema is frozen in
tests/fixtures/go_schema_v1.sql for the existing-database test.

Move the web client from internal/httpapi/web to web/, drop the Go CI job
and Go version pin, and update README, AGENTS.md and docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 16:27:33 +07:00
wtandClaude Opus 5.5 16dd2a3b3c docs: add repository cover and avatar images
CI / Go (test / vet / build) (push) Successful in 39s
CI / Rust (fmt / clippy / test / build) (push) Successful in 54s
CI / Go ↔ Rust differential + SQLite takeover (push) Successful in 1m55s
Add a 1280x640 cover shown at the top of the README, a square variant and
a text-free repository avatar that stays legible at small sizes. SVG
sources are kept next to the rendered PNGs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 14:48:13 +07:00
wtandClaude Opus 5.5 ae49c8f8c3 build: publish multi-platform image (amd64, arm64, arm/v7)
CI / Go (test / vet / build) (push) Successful in 27s
CI / Rust (fmt / clippy / test / build) (push) Successful in 1m5s
CI / Go ↔ Rust differential + SQLite takeover (push) Successful in 1m38s
Docker publish / Build and push image (push) Successful in 1h6m5s
The builder stage runs on the build platform and cross-compiles Rust,
with GCC cross compilers for bundled SQLite, so only the small runtime
stage runs under QEMU. The workflow sets up QEMU via the Docker Hub
mirror and pushes all three platforms under the same tags.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 14:27:42 +07:00
wtandClaude Opus 5.5 622740fe70 ci: pin Go 1.27.3 for the differential compatibility check
CI / Go (test / vet / build) (push) Successful in 1m22s
CI / Go (test / vet / build) (pull_request) Successful in 1m31s
CI / Rust (fmt / clippy / test / build) (pull_request) Successful in 2m18s
CI / Rust (fmt / clippy / test / build) (push) Successful in 2m47s
CI / Go ↔ Rust differential + SQLite takeover (pull_request) Successful in 1m49s
CI / Go ↔ Rust differential + SQLite takeover (push) Successful in 2m42s
Go 1.25 ServeMux redirects unclean paths with 301, while newer Go (and the
Rust port that mirrors it) uses 307, so the Go reference built in CI
disagreed with Rust on '/a/../app.js'.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 13:03:00 +07:00
wt 65de1782c9 initial commit 2026-10-29 18:43:28 +07:00