Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
299 commits
Select commit Hold shift + click to select a range
8486a5c
Merge remote-tracking branch 'origin/docs/reset-trackers-and-add-road…
justin13888 Sep 2, 2026
be5a12a
Merge branch 'docs/reset-trackers-and-add-roadmap-398' into chore/ret…
justin13888 Sep 2, 2026
3b4ae08
feat(core): add capsule-core::notify alert classes and predicates
justin13888 Sep 2, 2026
1a26565
fix(sdk): reach the escrow the contract serves, through the generated…
justin13888 Sep 2, 2026
4d51bd8
feat(server): add the configuration and the composition root
justin13888 Sep 2, 2026
0ee91e3
refactor(server)!: replace the gen_openapi bin with a capsule-server …
justin13888 Sep 2, 2026
91a0561
feat(sdk): export the shared alert predicate through the uniffi FFI
justin13888 Sep 2, 2026
0b23ae6
docs(notifications): record the built core half of the alert surface
justin13888 Sep 2, 2026
1dff9d6
feat(core): own still decode and derivatives in capsule-core::media
justin13888 Sep 2, 2026
c67292a
feat(core): wire the LQIP producer and thumbnails into signed import
justin13888 Sep 2, 2026
d968878
feat(server): add the serve subcommand and the binary smoke test
justin13888 Sep 2, 2026
49d2084
fix(sdk): classify escrow failures by what they are, and assert the r…
justin13888 Sep 2, 2026
247a4f0
feat(ffi): export LQIP placeholder decode to the browser and native apps
justin13888 Sep 2, 2026
1dacc07
docs: record what the media pipeline ships and what it still owes
justin13888 Sep 2, 2026
16fb5f5
feat(sdk): retry a 401 once on the typed REST path (S-D17)
justin13888 Sep 2, 2026
72e5921
fix(core): widen the downscale's integer arithmetic past 32-bit overflow
justin13888 Sep 2, 2026
2605cc3
feat(server): add the gc, purge and scrub operator commands
justin13888 Sep 2, 2026
9143e74
feat(sdk): a client for the album-upgrade proposal
justin13888 Sep 2, 2026
17f17f6
docs(sdk): the crate docs and the two slice rows say what the tree holds
justin13888 Sep 2, 2026
000c750
build(server): add the compose stack, the serve tasks and the release…
justin13888 Sep 2, 2026
e222d14
feat(cli): emit the capsule command tree as a description artifact
justin13888 Sep 2, 2026
082fe9d
docs(server): replace "there is no local server today" with how to ru…
justin13888 Sep 2, 2026
fe1e3c9
fix(core): encode the thumbnail tier as JXL; harden the still pipeline
justin13888 Sep 2, 2026
4918c7c
docs: record the JXL thumbnail tier and why WebP is not available
justin13888 Sep 2, 2026
bc32e8f
docs(reference): generate the CLI reference from the committed comman…
justin13888 Sep 2, 2026
a7d8602
fix(core): arm alert timers per class, and defer rather than cancel
justin13888 Sep 2, 2026
0c5f105
test(cli): prove the command tree is locale-independent, and name its…
justin13888 Sep 2, 2026
4f8b8bd
docs(core): describe the rustdoc link asymmetry without guessing its …
justin13888 Sep 2, 2026
f508bf1
fix(core): gate rustdoc over private items, and repair what that reveals
justin13888 Sep 2, 2026
2e451d9
Merge remote-tracking branch 'origin/chore/freeze-capsule-core-api-39…
justin13888 Sep 2, 2026
fe2fe3a
docs(reference): render the REST contract from the Kynos OpenAPI docu…
justin13888 Sep 2, 2026
8c2f15e
docs(slices): record S-Z8 and S-Z9 as landed, and why S-Z10 is not
justin13888 Sep 2, 2026
ff405b1
Merge remote-tracking branch 'origin/chore/freeze-capsule-core-api-39…
justin13888 Sep 2, 2026
7c71817
fix(sdk): stop minting a catalog code, and pin the auth/transport split
justin13888 Sep 2, 2026
732967f
Merge branch 'chore/freeze-capsule-core-api-399' into fix/sdk-escrow-…
justin13888 Sep 2, 2026
aaca127
fix(server): stop deriving the attestation seed, and let a lockout decay
justin13888 Sep 2, 2026
d26568a
Merge remote-tracking branch 'origin/chore/freeze-capsule-core-api-39…
justin13888 Sep 2, 2026
142378b
test(core): pin every alert class's severity, and the badge/timer split
justin13888 Sep 2, 2026
d39ed34
fix(sdk): default the two collection fields, and gate the alert bindings
justin13888 Sep 2, 2026
eb2a445
docs(notifications): record the alert parameters with their trigger o…
justin13888 Sep 2, 2026
de006a9
feat(server): add the Postgres plumbing and the migration crate
justin13888 Sep 2, 2026
15572e3
fix(core)!: encrypt derivative bytes before they cross the network
justin13888 Sep 2, 2026
0e481d6
refactor(core): group prepare_still's file inputs into StillSource
justin13888 Sep 2, 2026
e6b6e61
Merge branch 'docs/reference-generation-415' into feat/cli-help-catal…
justin13888 Sep 2, 2026
de756e9
fix(core): keep an encoder refusal from costing the original, and wid…
justin13888 Sep 2, 2026
fa37547
test(server): let the Postgres container harness run on a rootless ru…
justin13888 Sep 2, 2026
92dd354
Merge branch 'feat/server-binary-config-operator-commands-401' into f…
justin13888 Sep 2, 2026
e9e7843
feat(server): add the Postgres asset index
justin13888 Sep 2, 2026
38addc6
Merge branch 'feat/server-binary-config-operator-commands-401' into f…
justin13888 Sep 2, 2026
61ce9f6
docs(core): keep derivative_format's doc links resolvable without the…
justin13888 Sep 2, 2026
5400011
docs(wasm): stop decodeLqip's public doc linking a private constant
justin13888 Sep 2, 2026
459e8af
fix(server): comment out the attestation seed placeholder in the temp…
justin13888 Sep 2, 2026
13e25a4
feat(cli): render --help from the cli.help.* catalog keys
justin13888 Sep 2, 2026
ebad42c
fix(core): gate the guarded re-export on native, its only caller's fe…
justin13888 Sep 2, 2026
a03d870
feat(server): add the Postgres device-cohort map
justin13888 Sep 2, 2026
6ca92c1
feat(server): add the Postgres account store and the auth suite
justin13888 Sep 2, 2026
53388e4
Merge branch 'feat/server-binary-config-operator-commands-401' into f…
justin13888 Sep 2, 2026
26825e9
feat(server): add the Postgres quota ledger and the quota suite
justin13888 Sep 2, 2026
0c38fce
Merge branch 'feat/server-binary-config-operator-commands-401' into f…
justin13888 Sep 2, 2026
22ce840
fix(docs): make the reference generator fail where it would otherwise…
justin13888 Sep 2, 2026
97a6b5d
docs(reference): correct the claims this change made stale or overstated
justin13888 Sep 2, 2026
5e7b9ab
chore: merge feat/server-binary-config-operator-commands-401 into fea…
justin13888 Sep 2, 2026
16fe2fa
fix(core): project the live index row's capture time from the sidecar
justin13888 Sep 2, 2026
1717f85
feat(server): open the durable backend's Postgres half at boot
justin13888 Sep 2, 2026
8718f27
test(server): assert E2E case 11's crash boundary
justin13888 Sep 2, 2026
391a5fe
feat(cli): add `capsule show`, the signed-sidecar read surface
justin13888 Sep 2, 2026
95fa224
feat(core): correct a signed capture timestamp as a new revision
justin13888 Sep 2, 2026
8f5abb0
Merge branch 'docs/reference-generation-415' into feat/cli-help-catal…
justin13888 Sep 2, 2026
fc7a6d1
fix(core): restore lifecycle::upload's test module declaration
justin13888 Sep 2, 2026
c359f10
docs: correct the summaries this lane's adapters falsify
justin13888 Sep 2, 2026
5a48685
fix(core): refuse a reused derivative nonce prefix, and stop two panics
justin13888 Sep 2, 2026
00f8dce
fix(docs): make the fatal checks match the grammar they claim to enforce
justin13888 Sep 2, 2026
8eee213
feat(server): advertise and gate the protocol handshake from one inte…
justin13888 Sep 2, 2026
bdf1128
fix(server): enforce and advertise the configured protocol window
justin13888 Sep 2, 2026
c739ecc
feat(sdk): send the protocol handshake as default headers
justin13888 Sep 2, 2026
b4881d3
docs(design): record the negotiation carriage and the exempt operations
justin13888 Sep 2, 2026
42d21ee
docs(core): say which failures are Sign and which are Encode
justin13888 Sep 2, 2026
2c742d7
Merge branch 'feat/media-rawshift-still-decode-410' into feat/sidecar…
justin13888 Sep 2, 2026
1e6192e
feat(cli): add `capsule repair capture-time` for pre-S-B16 sidecars
justin13888 Sep 2, 2026
c5139db
docs(slices): record S-I8, S-B18 and S-B17 as landed, and file S-B11'…
justin13888 Sep 2, 2026
e765feb
Merge branch 'docs/reference-generation-415' into feat/cli-help-catal…
justin13888 Sep 2, 2026
a48875b
build(server): add redis-rs and the Valkey container test dependencies
justin13888 Sep 2, 2026
872f89a
feat(server): Valkey adapters for the state ports and the counters
justin13888 Sep 2, 2026
c9f7f1c
feat(server): connect the Durable boot arm to VALKEY_URL
justin13888 Sep 2, 2026
a3655ef
fix(server): clamp an instant to what a microsecond column reads back
justin13888 Sep 2, 2026
7102ee5
test(server): re-point the durable refusal's binary-smoke case
justin13888 Sep 2, 2026
b09fad7
test(xtask): the smoke tier is no longer a planned entry
justin13888 Sep 2, 2026
ae01271
fix(core): type the catalog-too-new refusal at the open boundary
justin13888 Sep 2, 2026
eaee185
feat(server): gate every operation but the ten the design exempts
justin13888 Sep 2, 2026
d7d6f53
feat(sdk): build every transport from one client carrying the handshake
justin13888 Sep 2, 2026
7526395
chore(sdk): drop the redundant must_use on http_builder
justin13888 Sep 2, 2026
a959cb3
fix(server): harden the Valkey adapters after review
justin13888 Sep 2, 2026
ccc0e35
Merge branch 'feat/postgres-adapters-402' into feat/server-album-memb…
justin13888 Sep 2, 2026
8fa1713
feat(core): migrate unsigned sidecars through the signed write path
justin13888 Sep 2, 2026
0067b52
feat(core): add the owner-signed album roster attestation
justin13888 Sep 5, 2026
1604088
test(server): let the Valkey suite set the container's user namespace
justin13888 Sep 5, 2026
376c83e
refactor(ffi)!: retire the unsigned sidecar codec and its Swift wrapper
justin13888 Sep 5, 2026
0af7870
test(server): assert the unreachable-Valkey refusal through the binary
justin13888 Sep 5, 2026
0e82926
refactor(core)!: delete AssetSidecar and the second rebuild reader
justin13888 Sep 5, 2026
7738632
docs: record S-D23 closed and S-D24 landed; add the unsigned-sidecar …
justin13888 Sep 5, 2026
4d14f45
docs(reference): name the two new verbs that unseal a library
justin13888 Sep 5, 2026
8afeb9e
Merge branch 'feat/server-binary-config-operator-commands-401' into f…
justin13888 Sep 5, 2026
1d47163
Merge branch 'fix/protocol-headers-every-route-404' into feat/oidc-re…
justin13888 Sep 5, 2026
e88a8b2
feat(server): add the album membership port with its adapters and mig…
justin13888 Sep 5, 2026
0a55362
Merge branch 'fix/protocol-headers-every-route-404' at 7526395b into …
justin13888 Sep 5, 2026
bee5c49
fix(server): read each durable record from one snapshot
justin13888 Sep 5, 2026
abd6a5a
fix(server): the eviction view excludes a claimed session on every ad…
justin13888 Sep 5, 2026
dc44754
fix(server): the Valkey read gate reports expiry and never deletes
justin13888 Sep 5, 2026
eb1e8d2
docs(server): say which backend URL is read now
justin13888 Sep 5, 2026
44aa121
feat(core): expose the trash state once, and warn on an unparseable c…
justin13888 Sep 5, 2026
7beb467
fix(core): satisfy clippy's single-pattern rule in the capture-time p…
justin13888 Sep 5, 2026
8d6d997
docs(design): state the chrono gate per package and case 11's real bo…
justin13888 Sep 5, 2026
b63cf55
feat(server): add the OIDC authorization ceremony store
justin13888 Sep 5, 2026
a11d280
feat(server): hold reads to the handshake's grammar and writes to its…
justin13888 Sep 5, 2026
302da2f
feat(server): verify OIDC ID tokens as a pure function
justin13888 Sep 5, 2026
671f83e
refactor(server): check the ID token audience with contains
justin13888 Sep 5, 2026
05ea8e5
fix(server): validate the protocol window and default it to the policy's
justin13888 Sep 5, 2026
2546328
docs(sdk): say where a caller-supplied HTTP client must come from
justin13888 Sep 5, 2026
892f757
fix(web): send the protocol handshake from the browser client
justin13888 Sep 5, 2026
0317ae4
fix(cli): skip trashed assets in the repair, show the trash row, tigh…
justin13888 Sep 5, 2026
b219db3
docs(reference): rewrap the passphrase paragraph
justin13888 Sep 5, 2026
b9dd200
feat(i18n): add the album roster error codes
justin13888 Sep 5, 2026
eec3524
feat(server): publish album rosters at PUT /v1/albums/{album_id}/roster
justin13888 Sep 5, 2026
7a553d3
fix(core): never rewrite an original whose bytes already carry the si…
justin13888 Sep 5, 2026
7ce0c98
fix(core): rename the signed sidecar into place and fsync the quarant…
justin13888 Sep 5, 2026
8df7ab8
fix(core): attribute a migrated legacy GPS fix to the record, not the…
justin13888 Sep 5, 2026
a31fb4f
Merge branch 'fix/protocol-headers-every-route-404' into test/e2e-cas…
justin13888 Sep 5, 2026
a48cac9
fix(core): refuse a legacy asset outside a month bucket or with an od…
justin13888 Sep 5, 2026
e09ea51
fix(core): report an owed delete into a read-only album instead of ab…
justin13888 Sep 5, 2026
803c83b
docs: say the legacy stack id is a v8 custom UUID; drop the last FFIS…
justin13888 Sep 5, 2026
c21188d
feat(server): add the OIDC identity-provider port and its HTTP adapter
justin13888 Sep 5, 2026
e977c09
Merge branch 'fix/protocol-headers-every-route-404' into feat/oidc-re…
justin13888 Sep 5, 2026
e05c633
docs(server): scope the read gate's "that replica alone" claim to dir…
justin13888 Sep 5, 2026
032b6af
test(web): assert the browser client sends the protocol handshake
justin13888 Sep 5, 2026
d2a789d
chore(xtask): rejoin three chrono-guard messages onto continuations
justin13888 Sep 5, 2026
61f54bc
Merge branch 'fix/sdk-escrow-route-and-401-retry-408' into test/e2e-c…
justin13888 Sep 5, 2026
0cb2ae1
Merge branch 'fix/protocol-headers-every-route-404' into test/e2e-cas…
justin13888 Sep 5, 2026
6b91fbc
Merge branch 'feat/media-rawshift-still-decode-410' into test/e2e-cas…
justin13888 Sep 5, 2026
c27e86b
feat(server): mount the OIDC authorize and callback routes
justin13888 Sep 5, 2026
62376d8
Merge branch 'fix/protocol-headers-every-route-404' into feat/oidc-re…
justin13888 Sep 5, 2026
a609392
feat(server): widen album writes from the owner to writer members
justin13888 Sep 5, 2026
3f645bc
Merge branch 'feat/postgres-adapters-402' at d2a789d7 into feat/serve…
justin13888 Sep 5, 2026
2c41ec0
feat(sdk): begin and complete an OIDC login
justin13888 Sep 5, 2026
0e44b40
Merge branch 'fix/protocol-headers-every-route-404' at 032b6af2 into …
justin13888 Sep 5, 2026
73977f0
docs(design): record the OIDC relying party and ship a dex developmen…
justin13888 Sep 5, 2026
3dcad84
fix(core): make the quarantine directory fsync a no-op where the plat…
justin13888 Sep 5, 2026
6657474
perf(core): decide the plaintext rewrite from the buffer, not a secon…
justin13888 Sep 5, 2026
c080a44
test(server): walk every declared response of the OIDC operations
justin13888 Sep 5, 2026
7805ba5
perf(core): write only the signed artifacts on a metadata edit
justin13888 Sep 5, 2026
b32ae42
feat(server): render the blob route's 403 for a former album member
justin13888 Sep 5, 2026
c93f488
feat(server): page one album's changes for its members at GET /v1/syn…
justin13888 Sep 5, 2026
f3d0bad
test(e2e): add the capsule-e2e crate with cases 1, 7, 8, 9 and 12
justin13888 Sep 5, 2026
97324a5
fix(server): bind an album's page to its owner and document the curso…
justin13888 Sep 5, 2026
7111c58
feat(sdk): publish album rosters through AlbumClient
justin13888 Sep 5, 2026
f3781c9
test(e2e): land cases 2, 3, 6 and 13
justin13888 Sep 6, 2026
1417667
ci: run the rust gate when capsule-e2e changes
justin13888 Sep 6, 2026
1043e5c
docs(slices): record the landed E2E cases and what still blocks them
justin13888 Sep 6, 2026
710867a
fix(sdk): carry the held roster version on a stale refusal
justin13888 Sep 6, 2026
273f42f
fix(server): harden the OIDC token and discovery checks
justin13888 Sep 6, 2026
91cf7a0
feat(server): bound the OIDC authorize by budget and by store ceiling
justin13888 Sep 6, 2026
6512e70
fix(server): reserve a federated address only when the provider verif…
justin13888 Sep 6, 2026
d294ad7
fix(server): make loopback redirects opt-in and hold the redirect URL…
justin13888 Sep 6, 2026
9359284
docs(core): link the closed format set by its canonical path
justin13888 Sep 6, 2026
d73f235
feat(server): trust a private CA for the identity provider
justin13888 Sep 6, 2026
d132599
docs(core): stop two feature-independent docs linking the native-only…
justin13888 Sep 6, 2026
a0d5a6e
docs(core): spell out only the link that needs it, and rewrap
justin13888 Sep 6, 2026
5e4d2e8
refactor(sdk): drive the OIDC login through the generated client
justin13888 Sep 6, 2026
e54cfb5
docs(design): record the round-1 OIDC decisions and document the six …
justin13888 Sep 6, 2026
4dc1450
fix(server): accept image/jxl, and tie the accept-list to the derivat…
justin13888 Sep 6, 2026
20c4d81
feat(server): federation capabilities, the stores behind them, and th…
justin13888 Sep 6, 2026
0b7fe30
Merge branch 'feat/server-album-membership-405' at 710867a9 into feat…
justin13888 Sep 6, 2026
2e0fe2e
Merge branch 'feat/media-rawshift-still-decode-410' into test/e2e-cas…
justin13888 Sep 6, 2026
c52b8d0
Merge branch 'feat/server-binary-config-operator-commands-401' into t…
justin13888 Sep 6, 2026
3122b8a
fix(sdk): report the escrow route's 426 as an unexpected status with …
justin13888 Sep 6, 2026
d97ac77
test(e2e): push the JXL thumbnail in case 2 and split case 6
justin13888 Sep 6, 2026
834b020
docs(design): name the provenance-rung blocker on every landed E2E row
justin13888 Sep 6, 2026
f0548e1
feat(core)!: carry the provenance rung's bytes on UploadBundle
justin13888 Sep 6, 2026
9a85e7b
fix(sdk): ship the provenance rung the push ladder omitted
justin13888 Sep 6, 2026
40d08a5
fix(core): decode the feed's bytes as the provenance record they are
justin13888 Sep 6, 2026
da86f04
test(server): prove a pushed asset reaches the feed and the entry ver…
justin13888 Sep 6, 2026
de48e9e
feat(server): serve one album's sync page to a federated peer's capab…
justin13888 Sep 9, 2026
fd5aae7
Merge remote-tracking branch 'origin/fix/sdk-escrow-route-and-401-ret…
justin13888 Sep 9, 2026
653999c
fix(server): bound how far above the held one a roster version may be
justin13888 Sep 9, 2026
d59c466
fix(server): refuse a lifecycle write from a suspended account
justin13888 Sep 9, 2026
fbb507a
fix(server): refuse a write attributed to another account
justin13888 Sep 9, 2026
b0f2e19
docs(server): record the lock's shared keyspace and what removal does…
justin13888 Sep 9, 2026
57cac57
docs(design): tell operators that S-C51 refuses every cursor issued b…
justin13888 Sep 9, 2026
6aa3a52
test(e2e): push through the SDK ladder, not a harness rung
justin13888 Sep 9, 2026
d6987f8
feat(server): serve a federated peer's blob fetch within its capabili…
justin13888 Sep 9, 2026
011249f
docs(design): record that the landed E2E cases run the SDK push path
justin13888 Sep 9, 2026
28b69b9
refactor(sdk): publish rosters through the generated operation
justin13888 Sep 9, 2026
acaf9c1
fix(core): take the backup wrap cost from the caller, not from cfg(test)
justin13888 Sep 9, 2026
36c7341
fix(server): charge the OIDC authorize budget under a bounded key
justin13888 Sep 9, 2026
d5b0afe
fix(server): purge and bound the in-memory counter windows
justin13888 Sep 9, 2026
739845d
feat(server): give the OIDC at-capacity refusal its own code
justin13888 Sep 9, 2026
137fa2e
fix(server): decide the roster version window before the column width
justin13888 Sep 9, 2026
5e065eb
feat(server): mint, revoke and refresh the federation capability
justin13888 Sep 9, 2026
b1861f9
feat(server): take signed federated moderation reports and cut a bloc…
justin13888 Sep 9, 2026
28f8c9f
fix(server): stop comparing a continuation's author to its caller
justin13888 Sep 9, 2026
6eabbcd
feat(server): keep federation's capabilities, revocations and peers i…
justin13888 Sep 9, 2026
856e731
fix(server): bound the enrollment redemption key before charging it
justin13888 Sep 9, 2026
04192ea
fix(server): give each counter key its own ceiling
justin13888 Sep 9, 2026
1a5b9e9
docs(design): record the partitioned counter ceiling and the code sha…
justin13888 Sep 9, 2026
b0fbfa1
fix(core): compile the weak-cost backup export out of production builds
justin13888 Sep 9, 2026
3e4f5fc
fix(server): keep every roster counter inside what a client can decode
justin13888 Sep 9, 2026
7dedbc1
feat(sdk): pull a shared album from a peer's home server under a capa…
justin13888 Sep 9, 2026
c2a59e8
test(server): fill the drop partition to its shipped ceiling
justin13888 Sep 9, 2026
3ba6c8c
docs(federation): say what the federation layer now does, and what it…
justin13888 Sep 9, 2026
799a905
fix(core): name a continuation's own signer, not the asset's creator
justin13888 Sep 9, 2026
8ab7f15
fix(server): refuse a lifecycle write attributed to another account
justin13888 Sep 9, 2026
5fcd4a6
docs(core): drop a redundant explicit link target in sign_lifecycle
justin13888 Sep 9, 2026
436c4f8
style(federation): clear the lints the check gate does not reach
justin13888 Sep 9, 2026
47ed85a
fix(server): tell a caller a full limiter partition is not an outage
justin13888 Sep 9, 2026
b9e5b8e
docs(server): name the issue the shared counter lock is deferred to
justin13888 Sep 9, 2026
e0ad630
fix(server): bound a federation grant by an absolute deadline its ref…
justin13888 Sep 9, 2026
f1ab7d2
test(server): pin that only the ceiling reads as a capacity refusal
justin13888 Sep 9, 2026
6ace9b8
fix(server): keep a federated report's signed bytes so the row can be…
justin13888 Sep 9, 2026
cb1b730
chore(integration): merge docs/reset-trackers-and-add-roadmap-398 (#422)
justin13888 Sep 9, 2026
edb1fde
chore(integration): merge chore/retire-capsule-wire-400 (#430)
justin13888 Sep 9, 2026
5f9b050
chore(integration): merge chore/delete-core-import-media-bucket-423 (…
justin13888 Sep 9, 2026
8d8f346
chore(integration): merge chore/close-ci-gate-holes-416 (#419)
justin13888 Sep 9, 2026
50e3795
chore(integration): merge fix/i18n-plurals-and-swift-detector-414 (#420)
justin13888 Sep 9, 2026
b877007
chore(integration): merge chore/freeze-capsule-core-api-399 (#426)
justin13888 Sep 9, 2026
43e0a0d
chore(integration): merge feat/core-notify-alert-classes-411 (#433)
justin13888 Sep 10, 2026
21a55ae
chore(integration): merge fix/sdk-escrow-route-and-401-retry-408 (#434)
justin13888 Sep 10, 2026
b38422e
chore(integration): merge feat/media-rawshift-still-decode-410 (#436)
justin13888 Sep 10, 2026
3e66695
fix(server): bound every field, account and budget on the federated r…
justin13888 Sep 10, 2026
9f23ca1
chore(integration): merge feat/sidecar-unsigned-migration-412 (#455)
justin13888 Sep 10, 2026
f731cf1
docs(server): link the body-cap constraint to the issue that tracks it
justin13888 Sep 10, 2026
185ab6e
chore(integration): merge docs/reference-generation-415 (#443)
justin13888 Sep 10, 2026
45b7e9d
chore(integration): merge feat/cli-help-catalogs-show-repair-413 (#450)
justin13888 Sep 10, 2026
94b217e
docs(federation): say that the blocklist and report intake cannot be …
justin13888 Sep 10, 2026
51d1a78
chore(integration): merge feat/server-binary-config-operator-commands…
justin13888 Sep 10, 2026
6241e2c
chore(integration): merge feat/valkey-adapters-403 (#454)
justin13888 Sep 10, 2026
b1b1786
fix(server): answer a peer's backup fetch as unrelated, and state wha…
justin13888 Sep 10, 2026
cc00855
fix: pin the epoch boundary every adapter must agree on, and thread t…
justin13888 Sep 10, 2026
88f923f
chore(integration): merge feat/postgres-adapters-402 (#447)
justin13888 Sep 10, 2026
a1591ed
docs(server): regenerate the document, and stop citing a bound that b…
justin13888 Sep 10, 2026
4c8448a
chore(integration): merge fix/protocol-headers-every-route-404 (#453)
justin13888 Sep 10, 2026
bb4c86e
test(server): pin that a capability is refused on every account-only …
justin13888 Sep 10, 2026
ae74ff5
Merge branch 'feat/server-album-membership-405' at 5fcd4a6c into feat…
justin13888 Sep 10, 2026
8fb4730
chore(integration): merge feat/oidc-relying-party-407 (#459)
justin13888 Sep 10, 2026
011ab76
chore(integration): merge feat/server-album-membership-405 (#458)
justin13888 Sep 10, 2026
c87a4d0
test(server): sign the SDK push case as the library's own account
justin13888 Sep 10, 2026
74ac803
fix(server): enforce the grant-lifetime ceiling in the store, not in …
justin13888 Sep 10, 2026
b8babdb
fix(server): accept a report for an unknown account rather than revea…
justin13888 Sep 10, 2026
7e29b51
chore(integration): merge feat/server-federation-406 (#472)
justin13888 Sep 10, 2026
c61d180
chore(integration): merge test/e2e-cases-409 (#463)
justin13888 Sep 10, 2026
0cbe911
docs(trackers): recount SLICES and state what this tree actually proves
justin13888 Sep 10, 2026
629949e
fix(docs): render an optional object, and give federation a reference…
justin13888 Sep 10, 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
  •  
  •  
  •  
50 changes: 42 additions & 8 deletions .config/nextest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,51 @@ slow-timeout = { period = "60s", terminate-after = 3 }
[profile.ci.junit]
path = "junit.xml"

# The container group is **empty as of `S-C59`**, and the declaration stays.
# The container group holds the adapter suites that stand up a real backing service.
#
# It existed for the retired Salvo auth crate, whose integration tests spun up shared Postgres
# and Valkey containers and shared a tracing `Once` — running them concurrently was the main
# flakiness source, so the group was pinned to one thread with retries as the backstop. The
# rebuilt server has no container test at all: every port has a deterministic in-memory adapter
# and Kynos's `TestClient` drives a built service in-process, which is why `mise run test-rust`
# now needs no podman for anything above the storage ports.
# flakiness source, so the group was pinned to one thread with retries as the backstop. It was
# then empty for the length of the Kynos rebuild, kept rather than deleted because the first
# real adapter would need exactly it and rediscovering the one-thread rule by watching CI flake
# is the expensive way to learn it. Every port still has a deterministic in-memory adapter and
# Kynos's `TestClient` drives a built service in-process, which is why `mise run test-rust` needs
# no podman — the container suites below are env-gated and pass as skipped without their variable.
#
# The group is kept rather than deleted because the first Postgres or Valkey *adapter* will need
# exactly it, and rediscovering the one-thread rule by watching CI flake is the expensive way to
# learn it. An empty test group costs nothing.
# The Postgres adapters (#402) are that first adapter. Every container-backed case lives under a
# test module named `postgres_conformance`, so the filterset below is mechanical rather than a
# list somebody has to remember to extend — a new port's suite joins the group by being named
# like the others. Each of those cases starts its **own** container (nextest runs a process per
# test, so a shared one would buy nothing), which is why one thread matters: five Postgres
# instances racing to bind ports and warm up is the flakiness the group exists to prevent.
#
# **These tests skip themselves without `CAPSULE_TEST_POSTGRES=1`**, printing one line each that
# says so — see `capsule_server::postgres::testing`. The default `cargo nextest run` is green on
# a machine with no container runtime, which is the acceptance gap design/module-map.md sets.
#
# `capsule-server/tests/valkey.rs` (#403) is the second, and joins by binary rather than by test
# name because the whole binary is container-backed. It runs the store and counter conformance
# suites against a `valkey/valkey` container when `CAPSULE_TEST_VALKEY=1`. One thread, for the
# same reason and one more: each test starts its own container and the eviction view is one
# global sorted set.
[test-groups.containers]
max-threads = 1

[[profile.default.overrides]]
filter = 'test(postgres_conformance)'
test-group = 'containers'

[[profile.ci.overrides]]
filter = 'test(postgres_conformance)'
test-group = 'containers'
# A container that loses a port race or is still warming up is the transient failure the `ci`
# profile's retries exist for; nextest reports flaky separately from failed, so a retry that
# succeeds is still visible.

[[profile.default.overrides]]
filter = 'package(capsule-server) and binary(valkey)'
test-group = 'containers'

[[profile.ci.overrides]]
filter = 'package(capsule-server) and binary(valkey)'
test-group = 'containers'
18 changes: 12 additions & 6 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,22 @@ updates:
directory: "/capsule-web"
schedule:
interval: "weekly"
# The workspace root: `Cargo.toml` and `Cargo.lock` live here and cover every member. This
# pointed at `/capsule-api` until the Salvo tree moved to `legacy-review/` in `S-C59`, so it
# had been watching a directory that no longer exists — and therefore watching nothing.
- package-ecosystem: "cargo"
directory: "/capsule-api"
schedule:
interval: "weekly"
- package-ecosystem: "docker"
directory: "/capsule-api"
directory: "/"
schedule:
interval: "weekly"
# The server's local service images (Postgres, Valkey). Same story: `/capsule-api/compose.yaml`
# went with the Salvo tree, and `capsule-server/compose.yaml` is the live file (issue #401).
#
# There is no `docker` entry any more. It watched `/capsule-api/Containerfile`, and no
# Containerfile exists anywhere in the active tree — an OCI image for the rebuilt server is
# not written yet, and an ecosystem pointed at an absent file is a permanent dashboard error
# rather than a dependency update. Add it back in the change that adds the Containerfile.
- package-ecosystem: "docker-compose"
directory: "/capsule-api"
directory: "/capsule-server"
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
Expand Down
14 changes: 0 additions & 14 deletions .github/workflows/build-ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,6 @@ jobs:
working_directory: capsule-swift
install_args: tuist xcbeautify

# capsule-sdk's build script compiles the capsule.sync.v1 proto with
# prost-build, which shells out to protoc; the macOS image does not carry it.
- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Build Rust FFI xcframework
run: bash capsule-swift/Scripts/build-rust-ffi.sh

Expand Down Expand Up @@ -123,13 +116,6 @@ jobs:
working_directory: capsule-swift
install_args: tuist xcbeautify

# capsule-sdk's build script compiles the capsule.sync.v1 proto with
# prost-build, which shells out to protoc; the macOS image does not carry it.
- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

- name: Build Rust FFI xcframework
run: bash capsule-swift/Scripts/build-rust-ffi.sh

Expand Down
83 changes: 73 additions & 10 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,20 +51,51 @@ jobs:
- 'hk.pkl'
- '.cargo/**'
- 'capsule-server/**'
- 'capsule-wire/**'
- 'capsule-i18n/**'
- 'capsule-cli/**'
- 'capsule-e2e/**'
- 'capsule-core/**'
- 'capsule-sdk/**'
- 'capsule-core-ffi/**'
- 'capsule-wasm/**'
- 'xtask/**'
# `check-rust` reads the catalogs directly: `i18n-check` and
# `i18n-guard` are `cargo run -p xtask -- i18n …` over `locales/`,
# so a catalog-only change must still pay the Rust gate. The
# `swift` filter already lists it for the same reason.
#
# `i18n-check` compares `locales/` against its *generated* outputs,
# and drift is drift whichever side moved — a hand-edit to a
# generated catalog is the case it exists to catch. `check-rust` is
# the only task that runs it and the `rust` job is the only job that
# runs `check-rust`, so these four globs are what makes the CI gate
# at least as wide as the local one — hk.pkl's `i18n-check` step
# lists the same generated targets (the two remaining entries of
# that glob, `capsule-i18n/src/**` and `xtask/src/i18n.rs`, are
# already covered here by `capsule-i18n/**` and `xtask/**`). Keep
# the two in step.
- 'locales/**'
- 'capsule-web/src/i18n/messages/**'
- 'capsule-swift/Generated/**'
- 'capsule-android/src/androidMain/res/values*/strings.xml'
- '.github/workflows/ci.yml'
web:
- 'capsule-web/**'
- 'mise.toml'
- 'mise-tasks/**'
- '.github/workflows/ci.yml'
# Every artifact the docs build reads, not just `capsule-docs/**` — the
# generator turns two committed description artifacts into the `/reference/`
# pages, so a filter that names only the site lets a stale reference page
# publish on a change to the surface it describes. See
# design/developer-docs.md, "Artifacts cross the boundary, not toolchains".
docs:
- 'capsule-docs/**'
- 'capsule-cli/cli-surface.json'
- 'capsule-server/openapi.json'
# `capsule-docs/biome.jsonc` extends the root one, so a change there can fail
# this job's format and lint steps from outside `capsule-docs/**`.
- 'biome.jsonc'
- 'mise.toml'
- 'mise-tasks/**'
- '.github/workflows/ci.yml'
Expand All @@ -81,11 +112,32 @@ jobs:
- 'capsule-docs/endpoint-census-allowlist.txt'
- 'capsule-docs/planned-modules.txt'
- 'capsule-server/openapi.json'
# No check reads this one today; it is here because the cross-links check
# resolves any repo-relative path a document names, and the reference prose
# now names this artifact. Cheap: the job installs nothing.
- 'capsule-cli/cli-surface.json'
- 'capsule-*/src/**'
- '**/*.md'
- '**/*.mdx'
- 'LICENSE'
- 'NOTICE'
# For the `roadmap` check, which arrives with `#422` together with
# the ROADMAP.md it reads — neither is in the tree at this commit.
# It will resolve that file's rows against the manifests below,
# which declare what actually exists, so a pull request that adds
# or removes a package without touching Markdown must still run the
# job — otherwise the gate would be advisory for exactly the change
# it exists to catch. Listed ahead of the check so the filter is
# correct the moment `#422` lands; until then these globs only
# widen when `docs-truth` runs, which is harmless.
- 'Cargo.toml'
- 'settings.gradle.kts'
- 'capsule-swift/Project.swift'
- '**/Package.swift'
- '**/package.json'
- '**/pyproject.toml'
- '.gitmodules'
- 'legacy-review/**'
- 'mise.toml'
- '.github/workflows/ci.yml'
vision:
Expand Down Expand Up @@ -240,13 +292,6 @@ jobs:
tier2: true
steps:
- uses: actions/checkout@v4
# capsule-sdk's build script compiles the capsule.sync.v1 proto with
# prost-build, which shells out to protoc. The hosted images do not carry
# it, so every leg of this matrix fails in the SDK build script without it.
- name: Install protoc
uses: arduino/setup-protoc@v3
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Install Rust toolchain
run: |
rustup toolchain install
Expand Down Expand Up @@ -470,7 +515,11 @@ jobs:

# Single aggregated status check. Mark THIS ("CI / required") as the required
# check in branch protection — path-filtered jobs report "skipped", which this
# treats as a pass. rust-test is non-blocking and intentionally excluded.
# treats as a pass. Every job in `needs` is verified below: the loop covers the
# eleven gates (`rust-test` included — it became blocking with `S-C59`, see the
# note on that job), and `changes` is checked ahead of it under a stricter rule,
# because "skipped" is only trustworthy when the filter that skipped it ran.
# A job in `needs` but absent from both checks is a gate that cannot fail.
required:
name: required
if: always()
Expand All @@ -479,7 +528,21 @@ jobs:
steps:
- name: Verify required jobs succeeded
run: |
for r in "${{ needs.commit-lint.result }}" "${{ needs.rust.result }}" "${{ needs.rust-cross.result }}" \
# `changes` must have SUCCEEDED, not merely "not failed". Every filtered
# job's `if:` reads needs.changes.outputs.*; if that job dies (a checkout
# hiccup, a paths-filter error) those outputs are empty, so every gate
# evaluates false and reports "skipped" — and `if: always()` still runs
# this one. Treating those skips as passes would green-light a merge with
# zero toolchain gates executed, which is the failure mode this whole job
# exists to prevent. It is the one `needs` entry that cannot be skipped:
# unlike `commit-lint` (push events) or the filtered gates, it has no `if:`.
if [ "${{ needs.changes.result }}" != "success" ]; then
echo "The path-filter job did not succeed (result: ${{ needs.changes.result }})."
echo "Every filtered gate would report skipped, so this aggregate proves nothing."
exit 1
fi
for r in "${{ needs.commit-lint.result }}" "${{ needs.rust.result }}" \
"${{ needs.rust-test.result }}" "${{ needs.rust-cross.result }}" \
"${{ needs.web.result }}" \
"${{ needs.docs.result }}" "${{ needs.docs-truth.result }}" "${{ needs.vision.result }}" \
"${{ needs.markdown.result }}" "${{ needs.kotlin.result }}" "${{ needs.swift.result }}"; do
Expand Down
25 changes: 20 additions & 5 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
name: Release

# Fires when a release commit (`chore(release): vX.Y.Z`, produced by prepare-release.yml
# and merged via its PR) lands on master. It builds the `capsule` CLI for each target and
# publishes a GitHub Release. `gh release create` also creates the tag, so the whole
# build+publish happens in this one run — no PAT or tag-push re-trigger needed.
# and merged via its PR) lands on master. It builds the `capsule` CLI and the `capsule-server`
# binary for each target and publishes a GitHub Release. `gh release create` also creates the
# tag, so the whole build+publish happens in this one run — no PAT or tag-push re-trigger
# needed.
#
# Both binaries ride in the one per-target archive rather than two: an operator running a
# self-hosted deployment wants the server and the CLI that talks to it at the same version, and
# two downloads is two chances to mix versions. The server is Unix-only here — Windows is
# already best-effort for the CLI, and adding a server build to a job that is allowed to fail
# would make "did the Windows CLI ship" harder to answer, not easier.
on:
push:
branches: [master]
Expand Down Expand Up @@ -41,7 +48,7 @@ jobs:
fi

build:
name: Build capsule (${{ matrix.target }})
name: Build binaries (${{ matrix.target }})
needs: detect
if: ${{ needs.detect.outputs.release == 'true' }}
runs-on: ${{ matrix.os }}
Expand Down Expand Up @@ -74,8 +81,11 @@ jobs:
uses: Swatinem/rust-cache@v2
with:
key: release-${{ matrix.target }}
- name: Build release binary
- name: Build the CLI
run: cargo build -p capsule-cli --release --target ${{ matrix.target }}
- name: Build the server
if: runner.os != 'Windows'
run: cargo build -p capsule-server --release --target ${{ matrix.target }}
- name: Package (unix)
if: runner.os != 'Windows'
shell: bash
Expand All @@ -84,6 +94,11 @@ jobs:
dist="capsule-v${{ needs.detect.outputs.version }}-${{ matrix.target }}"
mkdir -p "$dist"
cp "target/${{ matrix.target }}/release/capsule" "$dist/"
cp "target/${{ matrix.target }}/release/capsule-server" "$dist/"
# The operator's starting point: every setting the server reads, with what it defaults
# to and why. A release without it is a binary that refuses to start and an operator
# reading GitHub to find out which variables it wanted.
cp capsule-server/.env.example "$dist/"
cp README.md LICENSE NOTICE CHANGELOG.md "$dist/"
tar -czf "${dist}.tar.gz" "$dist"
echo "ASSET=${dist}.tar.gz" >> "$GITHUB_ENV"
Expand Down
10 changes: 10 additions & 0 deletions .markdownlint-cli2.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,16 @@
// submodules, so without this the gate passes there and fails on any dev machine
// that has run `git submodule update`.
"rawshift/**",
// Generated reference pages (capsule-docs/scripts/gen-reference.mjs). Gitignored
// build output whose formatting comes from the generator, not from a contributor:
// a finding here is fixed in the generator, and the file it points at may not
// exist on the machine reading the report.
"capsule-docs/src/content/docs/reference/cli/**",
"capsule-docs/src/content/docs/reference/api/**",
// The same two directories reached through the repo-root `docs` symlink, which
// this glob walker follows (unlike the docs-truth walk, which skips symlinks).
"docs/reference/cli/**",
"docs/reference/api/**",
"CLAUDE.md", // symlink to AGENTS.md
"CHANGELOG.md" // generated by convco; not hand-formatted
]
Expand Down
Loading
Loading