Skip to content

Batch: 29 PRs tested together (calendar, cloud server setup, sync, AI chat, search, CI) - #2060

Merged
joepio merged 105 commits into
developfrom
batch/2026-10-04
Oct 5, 2026
Merged

joepio merged 105 commits into
developfrom
batch/2026-10-04

Conversation

@joepio

@joepio joepio commented Oct 5, 2026 •

Copy link
Copy Markdown
Member

Combines 29 open PRs, tested in one full Mancave run on the exact head (run 4999, green).

Included: #1530 (remove /version endpoints), #1638 (mobile resource menu stays visible), #1663 (CI prioritises the latest develop pipeline), #1835 (integrations soft launch), #1869 (CONTRIBUTING: trekmeester rebases), #1896 and #1898 (calendar repeat field and local-day times), #1911 (hosted builds open on sign-in), #1912 and #1919 and #1981 (Cloud Server setup fixes), #1913 (avatar URLs kept between mounts), #1914 (sync page stops repeating requests), #1918 (report failing writes to Sentry), #1929 (React Compiler check hook), #1931 (pnpm 11), #1949 (live updates for shared resources), #1958 (vanity hosts), #1959 (fewer peer sessions), #1961 and #1963 (AI chat keeps running, Try again), #1968 (search preview on tablets), #1975 (search never lists destroyed subjects), #1985 (discard a stuck upload), #1988 (AI status on hosted builds), #2038 (on-screen keyboard resize), #2041 (Nix flake), #2047 (two Sentry fixes), #2050 (dashboard Table block).

The source PRs are closed as included once this lands.


Generated by Claude Code

claude and others added 30 commits September 17, 2026 21:48
Resource history is read from the Loro oplog client-side now. The History
route (`routes/History/`) calls `resource.getLoroHistory()` directly and
gets signers from `/history-attribution`; no network round trip, no
paging. These two endpoints were the older server-side path to the same
data, and the only thing left reaching them was one "All versions" link
at the bottom of the version scroller, which led from that view to a
worse rendering of what it was already showing.

`lib/src/history.rs` itself stays -- it is already Loro-backed, and
`versions()` / `at_version()` are what the WASM and Flutter bridges read
through `Resource::get_history` and `Resource::view_at`. Only
`encode_version_id` / `decode_version_id` go: they existed to carry an
opaque VersionID through an HTTP query parameter, which nothing does now.
That is a breaking change to the published `atomic_lib` surface, on a
beta version, for two functions whose only caller was the deleted
endpoint.

The archived verifiable-credentials doc pointed at `/all-versions` for
finding who signed a version; `/history-attribution` answers exactly that
question, so it now points there.

Verified: `cargo test -p atomic-server --lib` (84 passed),
`cargo test -p atomic_lib --features db-redb --lib` (543 passed),
data-browser typecheck + lint, and the pre-commit hook's own
`cargo clippy --workspace --exclude atomic-server-tauri --no-deps
--all-targets --no-default-features --features light -- -D warnings`
(exit 0). The hook itself could not run here: it snapshots via
`git checkout-index`, so the gitignored `dist` / `assets_tmp` are absent
and `server/build.rs` attempts a network JS build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YUL3EPFVmaDAok34JPev3F
`ForkBar` renders above every resource view -- that is its job, to say you
are looking at a fork rather than the original. For anything that is not a
fork it returns null, but React runs the hooks first, so
`useResource(original ?? '')` fired on every resource page. An empty
subject resolves against the page origin, and nothing serves a resource
there: `AppState::init` deliberately creates no Drive at `/`, so
`handle_not_found` answers 404 (lib/src/storelike.rs). Every page load
spent a request on that and logged a console error.

It now asks for `unknownSubject`, which `Store.getResourceLoading`
short-circuits to an in-memory placeholder without any fetch. Only the
non-fork path changes, and that path renders nothing; a real fork has
`originalSubject` set and behaves as before.

This is what failed the `offline-persistence` and `offline-tables` e2e
specs. Both assert that a test produces no unexpected browser console
errors, and both reload with the WebSocket disconnected -- which is the
only reason the miss was visible: over WS it is a protocol answer with
nothing logged, over HTTP it is a 404 the browser reports. The fetch was
happening online too, just silently.

Verified by reproducing the CI failure locally and re-running against it:
`pnpm test-e2e:local offline-persistence` and then both specs together,
2 passed. Typecheck, lint and format-check clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YUL3EPFVmaDAok34JPev3F
…on-ubt5pe

# Conflicts:
#	browser/CHANGELOG.md
…on-ubt5pe

# Conflicts:
#	CHANGELOG.md
#	browser/CHANGELOG.md
…p server queries without a server

The demo workspace (and any drive on an origin with no node) no longer asks
/query for its connections, which on app.atomic.place returned the app's HTML
and showed "Connection query failed". A note at the top says the feature is
new. The "Show experimental plugins" toggle is only offered to users who
already turned it on, or who unlocked it on this device through
/integrations?preview=plugins during a user-testing session.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The demo spec now serves `/query` the SPA's HTML, the way the hosted origin
with no node answers it, waits for the page to go quiet, and checks there is
no error alert, no query was sent, the new-feature note shows and the
experimental toggle does not. On develop it fails on the "Connection query
failed" alert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
newResource reads the parent's drive from memory. When the Team table was
not loaded, the new member row claimed the table itself as its drive, so
the store stopped treating it as local-only and posted its genesis commit
to the server. The server has never seen the local demo drive and answered
404 on every outbox retry, logging "[Demo] could not add the user to the
team table".

The director now loads the table (from the local database) before creating
a row or board card under it, and skips the beat when the table is gone.
Conflicts only in the translation catalogs, where both sides appended
entries at the end; kept both and confirmed with a vite run that the
result is the extractor's fixed point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The row dialog opened from a calendar view shows a Repeat field instead
of the raw recurrence JSON: none, daily, weekly on chosen days, monthly
by date or nth weekday, or yearly, ending never, on a date or after N
times, with a summary in words. It writes the payload the view already
expands; a payload it cannot show reads as Custom, kept as is, with its
JSON one click away.

A table without a recurrence property gets one (shortname
atomic-calendar-recurrence, as in the Event ontology) when a row first
repeats. A row's own series (calendarId "atomic") follows the row's
date columns, so moving the row moves the series; imported payloads
stay the provider's.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A Playwright test makes an event repeat weekly from the row dialog and
checks it appears on the following weeks. The Custom hint moves into
its own component: inside its guard the extractor dropped it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setting undefined through Resource.set failed validation, so turning a
repeat off raised an error. Remove the value instead. The e2e test now
turns the repeat off again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Unchecking All day in a calendar row's dialog reveals a start and end
time. They are stored in atomic-calendar-start / atomic-calendar-end,
the exact-instant properties the atomic-plugins Event ontology already
defines (RFC 3339 strings with their offset), added to the class when a
row first gets a time. Day, End day and All day keep their meaning: Day
still says which date, the exclusive End day is untouched, and an
all-day row stays date-only.

Timed events, rows and imported timed recurrences alike, are placed on
the viewer's local day and show local times on their chips ("09:30
Dentist"); a Tuesday 19:30 New York meeting is Wednesday 01:30 in
Amsterdam.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The table view's row dialog now shows the calendar's Repeat field for the
recurrence property instead of its raw JSON, with the JSON behind Show JSON.
It uses the calendar's detection (`atomic-calendar-recurrence` or the
imported `lt-google-calendar-property-` one) and repeats from the calendar's
Day, else the class's first date column. A table creates no property: a
class without a recurrence or date column, or a row without a day, keeps the
JSON editor. The recurrence cell shows the Repeat summary, read-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in the table view's Repeat field (#1801). Resolves the CalendarView
import conflict (calendarRangeColumns now finds All day / End day), moves
useTableCalendarRow to useCalendarRowProps, and keeps the table's row dialog
to the Repeat field only (`repeatOnly`): Start and End are table columns of
their own, and the table creates no property.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Setup switched servers without copying an already-synced drive and reported
success without waiting for the reconcile, so the node lacked the drive root
and every commit was refused as "Parent of ... not found", retried forever.

- Sync the drive to the node and verify its inventory before reporting connected
- Park "Parent ... not found" as a blocking refusal instead of retrying over HTTP
- Stop the sync page request storm (compare polled info, narrow effect deps, throttle /api/me)
- Cache avatar object URLs so remounts are instant
- Send store errors to Sentry and fix the Bugsnag isDev gate that never fired
@joepio
joepio deleted the batch/2026-10-04 branch October 5, 2026 05:35
This was referenced Oct 5, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants