Skip to content

Commit c5b8d80

Browse files
committed
Merge remote-tracking branch 'origin/main' into ci/tiered-test-gates
2 parents e095436 + b962ac8 commit c5b8d80

14 files changed

Lines changed: 147 additions & 32 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"everything-dev": patch
3+
---
4+
5+
De-scale the router's default pending boundary so navigations no longer blank the page: the default pending component renders a compact centered spinner instead of a full-viewport "Loading..." takeover, and `defaultPendingMs` moves from 100ms to 333ms so brief navigations keep the previous page visible with the root progress bar carrying the signal. Pairs with the login route rendering instantly from the hydrated session cache instead of blocking on a session fetch.

‎.changeset/pre.json‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@
201201
"image-cdn-only-distribution",
202202
"image-leg-split-from-deploy",
203203
"image-native-artifacts",
204+
"immutable-version-dirs",
204205
"import-migration-reconciliation",
205206
"init-auth-types-stale-copy",
206207
"init-prune-unused-ui",
@@ -215,6 +216,7 @@
215216
"manifest-composition-rework",
216217
"manifest-contract-v2",
217218
"modernize-ui-rsbuild-environments",
219+
"mount-guards",
218220
"near-account-management-mobile-login",
219221
"near-auth-network-recipient",
220222
"near-connect-fork3-webauthn-bridge",
@@ -375,6 +377,7 @@
375377
"types-gen-hermetic-resolution",
376378
"ui-authored-router-factory",
377379
"ui-generated-bootstrap-stubs",
380+
"ui-only-deploys-drift-alarm",
378381
"ui-route-grafting-foundation",
379382
"ui-rsbuild-synthesis",
380383
"ui-surface-durable-cleanup",

‎packages/better-near-auth/src/near.sandbox.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { base58, base64, hex } from "@scure/base";
1+
import { base64, hex } from "@scure/base";
22
import { getTestInstance } from "better-auth/test";
33
import { generateKey, MlDsa65KeyPair, Near } from "near-kit";
44
import { Sandbox } from "near-kit/sandbox";

‎packages/every-plugin/CHANGELOG.md‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
11
# every-plugin
22

3+
## 3.0.0-rc.16
4+
5+
### Minor Changes
6+
7+
- e685c4c: Immutable version directories — parent republishes can no longer rot pinned slots (#826)
8+
9+
Workspace deploys now dual-write every dist file into a content-addressed `versions/<dirId>/…` directory beside the existing flat slot-root layout, and the version manifest declares its directory via a new `dir` field. Pin resolution prefixes artifact coordinates (`entryUrl`, `browserManifestUrl`, `ssrEntryUrl`) with the manifest's directory, so a child pinned to an older slot keeps loading the old deploy's entry **and** its expose chunk, chunks, and manifests from the same frozen directory — a parent republish that overwrites the fixed-name files at the slot root no longer produces mixed builds (`__webpack_modules__[r] is not a function`). Legacy manifests without `dir` resolve exactly as before.
10+
11+
- `versionDirPath(files)` derives the directory from the dist's file map (content-addressed: identical bytes → identical directory → unchanged redeploys skip the copy entirely via the previous pin's `dir`)
12+
- The upload service treats `versions/**` as write-once: an upload whose bytes differ from the stored object fails with a new `CONFLICT` (409) error, mirroring the platform "version is burned" rule; identical bytes stay an idempotent skip
13+
- Serving classification treats everything under `versions/` as immutable (cache-control `immutable`), independent of filename hashing
14+
- Staged (in-image) dists ignore the directory — the staged namespace materializes flat, so staged resolution passes `{ ignoreDir: true }`
15+
16+
### Patch Changes
17+
18+
- ad8414f: Mount guards are ordinary beforeLoads supplied by the composing framework, replacing gate kinds. The mount registry now carries shape metadata only (`guarded`, `implemented`) and `constructTree` takes `guards` keyed by mount id — construction fails loudly when a guarded mount has none. The default wiring guards `authenticated` with `requireSession` and `admin` with `requireAdmin`, so a client-rendered full page load resolves the session through the query cache instead of reading a signed-in visitor as signed out (#818): full loads of authed pages no longer bounce through `/login`, and admin pages keep the `?redirect=` return path. Banned users now bounce at the mount, and signed-in non-admins on admin mounts land on `/dashboard`. The engine's invented `HostContext`/`GateUser` types are gone — it has no auth semantics.
19+
320
## 3.0.0-rc.15
421

522
### Patch Changes

‎packages/every-plugin/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "every-plugin",
3-
"version": "3.0.0-rc.15",
3+
"version": "3.0.0-rc.16",
44
"type": "module",
55
"publishConfig": {
66
"access": "public"

‎packages/everything-dev/CHANGELOG.md‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,32 @@
11
# everything-dev
22

3+
## 2.0.0-rc.41
4+
5+
### Minor Changes
6+
7+
- e685c4c: Immutable version directories — parent republishes can no longer rot pinned slots (#826)
8+
9+
Workspace deploys now dual-write every dist file into a content-addressed `versions/<dirId>/…` directory beside the existing flat slot-root layout, and the version manifest declares its directory via a new `dir` field. Pin resolution prefixes artifact coordinates (`entryUrl`, `browserManifestUrl`, `ssrEntryUrl`) with the manifest's directory, so a child pinned to an older slot keeps loading the old deploy's entry **and** its expose chunk, chunks, and manifests from the same frozen directory — a parent republish that overwrites the fixed-name files at the slot root no longer produces mixed builds (`__webpack_modules__[r] is not a function`). Legacy manifests without `dir` resolve exactly as before.
10+
11+
- `versionDirPath(files)` derives the directory from the dist's file map (content-addressed: identical bytes → identical directory → unchanged redeploys skip the copy entirely via the previous pin's `dir`)
12+
- The upload service treats `versions/**` as write-once: an upload whose bytes differ from the stored object fails with a new `CONFLICT` (409) error, mirroring the platform "version is burned" rule; identical bytes stay an idempotent skip
13+
- Serving classification treats everything under `versions/` as immutable (cache-control `immutable`), independent of filename hashing
14+
- Staged (in-image) dists ignore the directory — the staged namespace materializes flat, so staged resolution passes `{ ignoreDir: true }`
15+
16+
- 0e2e7f9: Right-sized deploys: ui-only trains skip Railway, drift alarm (`bos verify`), restart advisory
17+
18+
- **Ui-only deploys stop restarting the host** (#826 follow-up): the train diffs the published config against the live one, and when the change touches only SnapshotWatch-adopted surfaces (the ui slot, plugin ui overrides) the Railway leg skips — the soft-refresh banner carries the adoption instead of a restart. `--force-railway` overrides; any backend/host/config change keeps the full train; uncertainty reads cold.
19+
- **`bos verify`** — the drift alarm: for every published pin, SRI-verify the version manifest and hash every file it names against the served bytes (the manual curl+sha384 sweep, automated). Rot fails the command naming the file; being behind the parent's live release is advisory. Child deploys run it post-publish, non-blocking, with the report on the job summary.
20+
- **Restart advisory**: when a snapshot adopt moves a boot-frozen slot's pin (api/auth/plugin backends — the swap cannot adopt them), the host surfaces `restartRequired` at `/.well-known/version` and `/health` instead of silently serving the previous generation.
21+
- **Ui-only CI runs the smoke spec**: a diff confined to `ui/` replaces the full sharded browser regression matrix with the app-load spec (boot + hydration + runtime-config shape).
22+
23+
### Patch Changes
24+
25+
- ad8414f: Mount guards are ordinary beforeLoads supplied by the composing framework, replacing gate kinds. The mount registry now carries shape metadata only (`guarded`, `implemented`) and `constructTree` takes `guards` keyed by mount id — construction fails loudly when a guarded mount has none. The default wiring guards `authenticated` with `requireSession` and `admin` with `requireAdmin`, so a client-rendered full page load resolves the session through the query cache instead of reading a signed-in visitor as signed out (#818): full loads of authed pages no longer bounce through `/login`, and admin pages keep the `?redirect=` return path. Banned users now bounce at the mount, and signed-in non-admins on admin mounts land on `/dashboard`. The engine's invented `HostContext`/`GateUser` types are gone — it has no auth semantics.
26+
- Updated dependencies [e685c4c]
27+
- Updated dependencies [ad8414f]
28+
- every-plugin@3.0.0-rc.16
29+
330
## 2.0.0-rc.40
431

532
### Minor Changes

‎packages/everything-dev/package.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "everything-dev",
3-
"version": "2.0.0-rc.40",
3+
"version": "2.0.0-rc.41",
44
"type": "module",
55
"engines": {
66
"node": ">=20.11"

‎packages/everything-dev/src/services/scaffold/upgrade-audit/steps/v2-catalog.ts‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ export const V2_CATALOG: Readonly<Record<string, string>> = {
6565
"drizzle-kit": "^0.31.11",
6666
"drizzle-orm": "^0.45.4",
6767
effect: "4.0.0-rc.118",
68-
"every-plugin": "^3.0.0-rc.15",
69-
"everything-dev": "^2.0.0-rc.40",
68+
"every-plugin": "^3.0.0-rc.16",
69+
"everything-dev": "^2.0.0-rc.41",
7070
"near-kit": "^0.20.2",
7171
pg: "^8.12.0",
7272
react: "19.3.1",

‎packages/everything-dev/src/ui/router-client.tsx‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,11 @@ export function createRouter<
6666
scrollRestoration: true,
6767
defaultStructuralSharing: true,
6868
defaultPreloadStaleTime: 0,
69-
// Show the pending boundary fast (#683): the router's 1000ms default left
70-
// cold authed navigations blank for up to a second, forcing every child
71-
// to re-declare pendingMs.
72-
defaultPendingMs: 100,
69+
// Pending boundary at 333ms: brief navigations keep the previous page
70+
// rendered with the root progress bar carrying the signal, and the
71+
// compact spinner is reserved for genuinely slow or first loads — still
72+
// well inside the 1000ms blank window #683 fixed.
73+
defaultPendingMs: 333,
7374
defaultPendingMinMs: 0,
7475
defaultErrorComponent: RouterError,
7576
defaultNotFoundComponent,

‎packages/everything-dev/src/ui/router-defaults.tsx‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@ export function defaultNotFoundComponent() {
1919

2020
export function defaultPendingComponent() {
2121
return (
22-
<div className="min-h-screen flex items-center justify-center bg-background px-6">
23-
<div className="flex flex-col items-center gap-3" role="status" aria-live="polite">
24-
<div className="h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground" />
25-
<p className="text-sm text-muted-foreground">Loading...</p>
26-
</div>
22+
<div
23+
className="flex min-h-48 flex-1 items-center justify-center bg-background p-6"
24+
role="status"
25+
aria-live="polite"
26+
>
27+
<div className="h-6 w-6 animate-spin rounded-full border-2 border-border border-t-foreground" />
2728
</div>
2829
);
2930
}

0 commit comments

Comments
 (0)