Back to Home

Changelog

v0.32.0

Features

  • rate-limitlimiter.middleware() for $action, $job and $pipeline #E76 #Q2630940547f
  • rate-limitthe $rateLimit primitive on $actor, consume and refund #E76 #Q262408d74a7
  • actorreclaim expired state on Memory, Redis and Durable Objects #E76 #Q26233924e13
  • actorjittered backoff between Redis CAS conflict retries #E76 #Q2620bcbe530
  • actorstate-derived expiresAt, envelope v2, expired state reads as missing #E76 #Q261887113ba
  • actora transition that leaves the state unchanged commits nothing #E76 #Q2621020e91d
  • actorread() returns the default without persisting it #E76 #Q2617073ca90
  • coreAlepha#name, the app's namespace: APP_NAME, then the baked build name, then "app" #E77 #Q2631e9ef7db
  • infraCLI Cloudflare deploy uploads through WorkerCloudflareAdapter, not wrangler deploy #E75 #Q2612fdab08e
  • infraCloudflare credential from CLOUDFLARE_API_TOKEN first, wrangler only for login #E75 #Q26110f32065
  • cliscaffold explicit Cloudflare infra with init #E73 #Q25982aebcf4
  • cliexpose deploy and infra commands #E73 #Q25972c56de0
  • clireplace public platform API with infra #E73 #Q2596263224b
  • actorgenerate generic Durable Object build metadata and provisioning (#E74, #Q2604)5019c52
  • actorpersist workerd snapshots through shared host runtime (#E74, #Q2603)b1da64b
  • capacitor/clialepha capacitor init --ota wires the updater, ota-api, the device client, the admin and a publisher key pair (#E70, #Q1315)5e6112d
  • actorcommit distributed Redis transitions with exact-byte CAS (#E74, #Q2602)7f5d0d2
  • actordefine isolated synchronous reducers and Memory snapshots (#E74, #Q2601)6205f59
  • capacitor/clialepha capacitor release, sealed for the exact recorded native builds, with a dry run the admin uploads (#E70, #Q1314)5a47c8b
  • capacitor/ota-adminthe OTA back office, channels, bundles, kill switch, rollback and device overrides (#E70, #Q1313)689140e
  • capacitor/otathe device client, acknowledged on a healthy boot, applied on background, cancelled by the server (#E70, #Q1312)f653095
  • desktopadmission guards every request with a one-use bootstrap, a session cookie and origin checks (#E54, #Q2239)c1c68c8
  • capacitor/ota-apibundles, channels, exact-build selection, signed delivery and retention (#E70, #Q1303)1a4b5eb
  • desktopwritable data and logs live in per-user folders, resources stay read-only (#E54, #Q2238)a97db34
  • desktopcompile --desktop assembles, signs and verifies dist/<Name>.app (#E54, #Q2237)d51714f
  • clialepha compile --desktop compiles a shell and a bootstrapped server Worker (#E54, #Q2236)aeef364
  • capacitor/otapin the updater, the Capgo v2 envelope and the wire contract, proven on simulator and emulator (#E70, #Q2524)59b5617
  • desktopthe shell owns one native window and supervises its server Worker (#E54, #Q2235)d3f91ec
  • desktopa Worker host owns startup, readiness and graceful shutdown (#E54, #Q2521)f95c2af
  • api/paymentssaved cards, setup sessions and off-session charges, upstreamed from Club (#Q2593)702aeee
  • devtoolsgroup apps by repository and worktree, with git state (#E71, #Q2573)b1bb420
  • devtoolsrefuse a foreign Host or Origin (#E71, #Q2591)ff8d1ee
  • capacitorvariants, several installable apps from one, behind a bounded identity writer (#E9, #Q2476)1e6cfbb
  • devtoolsnpx @alepha/devtools, a standalone app listing every running app (#E71, #Q2572)494766d
  • capacitoricon and splash generator over sharp, run by init (#E9, #Q2563)7580f7e
  • capacitornative chrome, splash on the first settled screen, back button chain, safe areas (#E9, #Q1311)55d220d
  • clialepha build --inspect plus ALEPHA_INSPECT=1 makes a production build inspectable (#E71, #Q2570)46b1119
  • capacitoralepha capacitor dev, the app on a phone or emulator against the Vite dev server (#E9, #Q1307)efb2826
  • inspectorpublic client, discover() and connect() for third-party tools (#E71, #Q2571)c03f3af
  • inspectordead runs stay in the registry while their logs exist (#E71, #Q2569)9a9d27d
  • capacitorcustom-scheme deep links, cold and warm, and a router initial-URL resolver (#E9, #Q1867)5e519d3
  • inspectorserve the inspector over a per-process Unix socket (#E71, #Q2568)197254b
  • capacitornative token custody behind a ReactAuth transport seam (#E9, #Q1309)af0ca61
  • inspectorrun registry in ~/.alepha/run/<runId>.json (#E71, #Q2567)9a1615d
  • inspectormove devtools' server half into alepha/inspector (#E71, #Q2566)44f0a1c
  • server/corsCAPACITOR_ORIGINS, the two WebView origins of a native app (#E9, #Q1304)9e6adc1
  • react/routerboot health, a once-per-boot committed-screen outcome, and an opt-in offline boot (#E9, #Q2523)e63a34b
  • capacitornative providers with web and memory fallbacks, and an app-wide API origin for host-less clients (#E9, #Q1308)025bd7e
  • capacitoralepha capacitor sync, build and open, with the dev-residue guard and build records (#E9, #Q1306)773b826
  • capacitor@alepha/capacitor package, capacitor() plugin and alepha capacitor init (#E9, #Q1305)73714fe
  • clialepha build as an injectable pipeline, with a lean app-shell mode (#E9, #Q2561)1d8a9bc

Bug Fixes

  • climigrations create finds the ORM by name, so a saas scaffold freezes every table, not alepha_sequences alone #Q26410062384
  • clia breaking commit of any type reaches Breaking Changes, so refactor! and chore! breaks are no longer dropped #Q26408978ff8
  • api/usersbound the login audit rows written before the password compare #Q262226629c5
  • cacheRedis and KV caches live under <alepha.name>:cache:, and clear() stops wiping every app's Redis cache #E77 #Q2635b1aa762
  • infraAPI upload binds services and hyperdrive, refuses wrangler keys it cannot send #E75 #Q2615e50412b
  • clideploy installs wrangler as a development install, so devDependencies survive #Q2610b8c23ed
  • clivalidate published infra workflows #E73 #Q26009a97917
  • actorpreserve Durable Object lifecycle in both deploy transports (#E74, #Q2608)04279eb
  • capacitor/otadevice acceptance fixes, a foreground check for the kill switch, a builtin answer the updater accepts (#E70, #Q2553)12b25b0
  • react/headglobal heads merge htmlAttributes and bodyAttributes in the browser, as the server's early head does (#Q2594)2ae9402
  • capacitordev allows cleartext to its host in an Android network security config (#Q2525)c1bbdc1
  • react/routera push from the offline screen boots again (#Q2525)5b12c10
  • capacitorleave the config.xml cap sync writes out of the native fingerprint (#E9, #Q2525)4ad1d11
  • uiidentifier fields keep what was typed; the test app's account button signs in (#E9, #Q2525)b9ffd60
  • reactkeep the offline and failed-start screens clear of the status bar; let the test app's debug build trust a user CA (#E9, #Q2525)b4306e6
  • capacitorkeep the emulator's adb reverse alive, open a cold link that arrives before the first screen (#E9, #Q2525)5d9d2c0
  • emailCloudflareEmailProvider keeps the binding's messageId, so delivery events find their receipt #Q2560d4d3fd2

v0.31.0

Features

  • sigilthe lore binary carries its own alepha, and alepha is an optional peer #Q2579ed0e5fa
  • platformplatform({ project }) names resources <project>-<app>-<env> #Q2575f6f0cc3
  • ormevery update bumps db.version(), save() works on a copy, a mismatch answers 409 #E69 #Q2544aeff06d
  • clion D1 with replicas, a request that can write reads from the primary #E69 #Q25588ef98a9
  • ormDATABASE_TRANSACTIONS=false runs specs without transactions, as on D1 #E69 #Q25456967a9f
  • uiMyOrganizationInvitations is a DataTable #E68 #Q2534ccb618b
  • uiaccount Connected apps is a DataTable #E68 #Q2533933cc2b
  • uiaccount API keys is a DataTable with create in the toolbar #E68 #Q25321d6df0f
  • uiaccount Sessions is a DataTable #E68 #Q25311466ba9
  • uithe account area is a root NavShell with a floating sidebar, like AdminRouter #E68 #Q25309839b4d
  • uithe admin Files storage card toggles its bar between share of the quota and share of the total #Q2500c460ea3
  • uithe notifications dropdown's header sits on the chrome surface with its bevel #Q24970fe0bfc
  • uithe filter bar centres its +, names it when alone, gives every filter an icon, and lets options follow other filtersa639e99
  • uifields fill the row on mobile, the clear button floats over the value, and selects carry an icon0768b04
  • clialepha db migrations create formats the migrations it generates with oxfmt #Q2495d5827c3
  • uiButton takes Blueprint's intent x variant, and an hrefa498181

Bug Fixes

  • uiControlDate reads the current year from DateTimeProvider44e9376
  • api/parametersa shared load whose request was canceled no longer hangs every later get() #Q258882f2f10
  • ormraw SQL joins the open transaction on Postgres; ownership transfer is one guarded statement #E69 #Q25568a39621
  • uiMFA recovery codes close only on an explicit confirmation, and can be regenerated from the account page with a code #Q2518b80f9c0
  • uithe DataTable bulk bar draws no stray border on its buttons, and its close button is minimal #Q2499c6b364f
  • cligen changelog puts an `@word` in a code span, so a release mentions nobody #Q2494b63d90a
  • uithe active segment's count is readable on the blue primary6e98f72

v0.30.0

Features

  • loreHome is a greeting, a search across every project, and one column of recent projects09ce6dd
  • lorea first alepha platform up creates the Lore copy, on the estate one shared rule picks #E67 #Q2487e613fad
  • loreplatform status and down for a Lore copy, refusing an ephemeral one #E67 #Q2486ba129a8
  • lorea LoreAdapter, so alepha platform up builds, pushes, seals the secrets and deploys through Lore #E67 #Q2485c79f70c
  • platforman environment names its adapter by importing a factory, not by a string #E67 #Q2481328aefc
  • clilore releases cut + changelog, and alepha test --shard #Q24794023ebf
  • lorea Bay deploy names its copy and sends the stored project segment, so a project rename no longer moves a Bay instance #Q24757d413c3
  • lorefolio_create files an epic's folio beside the epic's other folios when no directory is given #Q24743438575
  • lorea copy's Cloudflare name is stored at its first deploy, so renaming a project moves nothing #Q247333a50aa
  • lorethe Environment tab is a DataTable of secrets and variables, with name autocomplete and a .env import #Q2467 #Q24684d72f3e
  • loreartifacts show every runtime they carry, named workerd rather than cloudflare #Q2463425595f
  • loreone archive is one registry row carrying its runtimes, and a deploy matches any slice #Q246259de2c8
  • bayBay reads its slice from runtimes only #Q2461648a614
  • climanifest.json v2: runtimes is the only runtime declaration, secrets and variables replace env and publicVars #Q2460 #Q24659615d1b
  • lorean app instance's breadcrumb reads "shop / production" as one crumb #Q24665fcce40
  • payments-stripesubscription checkout takes a trial, Stripe Tax and the VAT number; a subscription can change price (club quest #446)a0c1e0f
  • lore`lore apps redeploy` puts a stored build on every copy whose env ends with a suffix #Q2458f0aa1d2
  • api/userscreateUser takes a password, checked before anything is written #Q24510717e16
  • clialepha dev creates .env from .env.example when it is missing #Q2450b0890e5
  • uiuseInviteOrganizationMember forwards metadata #Q24489141405
  • cliretire --target, the build is described by what it produces #E63 #Q244191f4758
  • clialepha image --compile, and the libc pairing that actually works #E63 #Q2434314124b
  • security$owns gates a resource the request does not name #Q244649e0a21
  • clialepha image, a Dockerfile you own #E63 #Q24335d5adad
  • loreMCP tool calls get a chart, which the store is what makes possible #E65 #Q24437057dca
  • clialepha compile becomes its own command #E63 #Q243286cd158
  • clialepha pack moves to zstd, and the archive root becomes the contents #E63 #Q243152ffd06
  • lorebackfill fourteen days of activity, once, guarded by a row #E65 #Q244002f7d61
  • lorethe activity dataset, recorded beside every project audit row #E65 #Q24392cb8b9c
  • platformthe Worker uploads the workerd slice and nothing else #E63 #Q2429466261e
  • clialepha build emits one server slice per runtime #E63 #Q2428b5aee92
  • baythe slice layout, the flat archive root and zstd #E63 #Q24272e2fb16
  • clithe manifest declares every runtime slice it carries, in declared order #E63 #Q2426e43bfd3
  • securityEffectivePermissionsProvider, one effective permission set30b9c8e
  • lorethe daily sweeps declare retry, so a failed tick costs 15 minutes #Q2419a6d7826
  • uievery table gets the Funnel menu, and Lore opens on Status #Q24163551d6b
  • loreHome momentum is fourteen bars, not a curve #Q2415035c8f2
  • loreHome is a grid of rules, and its activity reads as eventsdf1c6df
  • uiDataTable gains `flat`, and its head closes with one rule5db11cd
  • uione border colour and one hover fill across the kitfdd9540
  • uithe storage tile reads once, and a segment opens a paneldb1b03a
  • api/filesthe total storage quota defaults to 10 GB60df22b
  • uithe admin console and the account area use ButtonSettingsfac0567
  • uiAdmin Files shows one storage tile, used of the quota, a bar by bucket (#Q2412)9bd7516
  • api/filesa total storage quota across every file (#Q2411)8919869
  • loreHome filters projects by ownership and activity, and New Project moves to the headera38aa12
  • uiButtonSettings folds language, theme and display mode into the account menu, and Lore's header uses itb653b6e
  • uiDataTable gains a collapsible summary panel and a help icon (#Q2409)54e0e8d
  • loreread through D1 replicas, with the Sessions API (#Q2403)f5fb8ad
  • uiDataTable appends added filters, marks the search in cells, and counts bulk actions (#Q2407)8a3440f
  • loreturn on Smart Placement for the production Worker (#Q2403)e95b440
  • lorerework the home pagea79bc1a
  • uiDataTable chrome, corner, padding and footer options38b381a
  • cliflatten the dev server's DevTools buttonccd6faa
  • loreadd epic activity tab #Q239908062de
  • uishowcase organization workspace #E62 #Q238375607e9
  • uiadd organization rank management #E62 #Q238173bcc4f
  • uiadd organization invitation screens #E62 #Q238094b2db6
  • uiadd organization members screen #E62 #Q2379c602505
  • lorehome is a projects table with momentum bars and an activity panel (#Q2402)9608dad
  • lorebackfill organizations (#E61 #Q2375)b0937f0
  • loreattach projects to organizations (#E61 #Q2374)ffc719f
  • securityadd organization key to owns gate (#E61 #Q2373)6bd21d4
  • payments-stripea connected account can sell subscriptions: checkout, schedule an end, read and cancel (#Q2396)780ea1e
  • loredownload stored builds from the artifact table (#Q2393)1a55cae
  • testingpublish the jsdom browser project as alepha/testing/vitest (#Q2389)258a039
  • testingpublish the e2e port allocator as alepha/testing/playwright (#Q2389)7f566e5
  • lorethe epic aside opens on an ID row and a Name row, and drops its truncated heading (#Q2352)50e957f
  • lorethe epic page offers Edit only while the epic is a draft or ready (#Q2353)f665416
  • lorethe project Artifacts table deletes artifacts, from a checkbox selection or a row's menu (#Q2356)76c2031
  • ui/tablefilter chips read "Status: Draft, Ready", "N values" and "None"01e5fcb
  • loreone ActionErrorToaster at the root, so a failed request toasts on every page (#E59, #Q2317)3dad06a
  • ui/tablefilters.schema is deleted, and the table's filter bar becomes internal (#E58, #Q2321)1cb75cf
  • ui/tablethe filter bar handles date ranges, a z.dateRange() field is a date filter (#E58, #Q2315)4181abb
  • ui/tablethe filter bar is AlephaTable's default, drawn from fields without render (#E58, #Q2314)538543b
  • ui/tableAlephaTable takes filters.fields, a flat record where each filter carries its own schema (#E58, #Q2313)ac85544
  • lorean agent writing as the key's owner can @mention that owner (#Q2348)29ed42a
  • lorethe Artifacts table's Pushed column reads as time ago, with the exact datetime on hover (#Q2335)b7bed26
  • lorean artifact's commit links to the project's repository, through the one CommitLink the quest rail uses (#Q2336)181d890
  • lorea blight's Page cell links out when it holds an http(s) page URL (#Q2337)789c0e4
  • lorethe Epics bulk bar marks a selection ready when every selected epic is a draft (#Q2339)2189a8d
  • lorea connected app reaches the project member groups and nothing under admin (#E44, #Q2307)93d34c2
  • api/keysa key can be restricted to client addresses and CIDR ranges (#E44, #Q2064)a60f0eb
  • uithe admin key table mints through the shared create dialog, and filters and shows keys by status (#E44, #Q2062)9bbb542
  • mcpadvertise MCP 2026-07-28 alongside 2025-11-25 (#E57 #Q2305)4a0dfc6
  • uiscope a key with the permission matrix @alepha/ui already has (#E44, #Q2059)1711850
  • uithe account key panel grows an expiry select, a status and a rotate button (#E44, #Q2060)b1a38b3
  • mcpmodern requests validate their headers strictly, unknown methods get 404, DELETE gets 405 (#E57 #Q2304)1e450d1
  • api/keysan audit trail for the api-key type (#E44, #Q2065)60aea34
  • mcpmodern results carry resultType, serverInfo and cache hints (#E57 #Q2303)26c8687
  • api/keyswarn a key's owner before it expires, once (#E44, #Q2063)6294b01
  • api/keysa key carries its own permission scope, capped twice (#E44, #Q2058)cf8e6a6
  • mcpserve server/discover and decide the protocol era per request (#E57 #Q2302)63af9f4
  • command,lorehelp as a word, and lore -h opens with the conventions no single command can teach (#E45, #Q2095)9c45fe4
  • api/keysGET /api-keys/options, the expiry policy and the caller's permission ceiling (#E44, #Q2057)3c59807
  • api/keysrotate a key, a new secret on the same row (#E44, #Q2056)2eea91d
  • uia job opens on its own page, with executions that sort, filter and delete, and a drawer for one run (#E55, #Q2279)27153bc
  • lorethe CLI closes the work loop: quest accept, quest objective set, and --waive / --commit on quest complete (#E45, #Q2300)ec1b4db
  • api/keysa retention window for dead keys, purged in bounded batches (#E44, #Q2055)ce9d7e0
  • bayBay applies _headers to the files it serves (#E49 #Q2171)0ed629d
  • serverthe app's own static server applies _headers, from disk or from the compiled binary (#E49 #Q2170)600e9ec
  • clithe build writes dist/public/_headers from helmetOptions, the author's public/_headers and the hash rules (#E49 #Q2169)b0d8f6c
  • api/users$realm stops gating jobs and audits, a flag gates a surface (#E44, #Q2096)f363b28
  • uithe admin jobs list shows the type as an icon, the retention rule, blank schedules and more filters (#E55, #Q2278)f821b1a
  • serverone _headers reader in TypeScript, and the conformance fixture Bay shares (#E49 #Q2168)41b559f
  • clialepha init scaffolds @alepha/ui's module paths, and e2e-cli builds a saas scaffold (#E50, #Q2178)57da7b3
  • lorelore project, quest and folio, ten commands over the actions Lore already has (#E45, #Q2094)33bb370
  • uiadmin pages are titled "Admin - <Page>" in the browser tab (#E55, #Q2277)c13b588
  • api/keysderived key status, a list that shows dead keys, and a name a revoke frees (#E44, #Q2054)febbeea
  • apithe job naming convention is enforced: name and description required, validated, checked (#E55, #Q2276)9e4dad1
  • lorethe CLI's output renders for a human by default, and as one JSON document when asked (#E45, #Q2088)76d42cd
  • lorethe Releases row menu offers the next versions by tag (#E56, #Q2286)53613ea
  • apiframework and commerce jobs take system.* names and a description each (#E55, #Q2274)2ef1a45
  • command,loggerevery Alepha CLI logs to stderr, so stdout carries only what a command prints (#E45, #Q2299)889253e
  • securityan OAuth grant's scopes narrow its token (#E44, #Q2307)4fe4747
  • apithe admin jobs API pages, sorts and filters executions server-side, and can delete them (#E55, #Q2273)1072b76
  • loreReleaseCreateDialog takes a pre-filled tag and a suggested placeholder (#E56, #Q2285)eb7c619
  • api$job retention v2 keeps history by how often a job runs, expires it by age, and shows the rule (#E55, #Q2272)ceabb04
  • command,lorerefusals exit with a code that says why, and a sentence naming the fix (#E45, #Q2089)f5e9a10
  • securityan OAuth access token is not a session either (#E44, #Q2306)c072743
  • lorereleaseBumps, the frontier rule for the next release, as pure functions (#E56, #Q2284)d3e3824
  • securityan API key is not a session (#E44, #Q2297)efb1258
  • command@file values on flags that opt in, and array flags that repeat (#E45, #Q2086)13da11a
  • lorebulk delete releases from the checkbox selection (#E56, #Q2288)eedceaa
  • securityevery permission reader honours permissionScope (#E44, #Q2075)79695b1
  • apirows of a job that no longer exists are purged, and the internal crons become system.jobs.* (#E55, #Q2271)f17e3e1
  • securitypermissionScope caps a credential below its roles, in SecurityProvider (#E44, #Q2052)9039103
  • api$job priority is removed (#E55, #Q2270)cce59af
  • api/keysexpiry presets and a maxExpiryDays policy the service enforces (#E44, #Q2051)9e7d5a5
  • loredelete a release from the Releases row menu (#E56, #Q2287)9faf19e
  • lorethe quests list compares: status is / is not, tags any / all / none of (#Q2310)5daa352
  • uiAlephaTableFilterBar puts the add-on-demand filter bar in AlephaTable, and filter rows wrap (#Q2308)651b4b6
  • uithe showcase filter bar adds filters on demand, with a staged clear/remove button and operators (#Q2308)315a386
  • clithe devtools launcher is a conic-gradient dial (#Q2293)7939ba5
  • clialepha init no longer scaffolds @alepha/devtools (#Q2280)b95c137
  • apithe default realm is named users, not default (#Q2264)c70e8dd
  • lorea quest is to do, in progress, on hold, shelved or completed (#Q2269)c44008a
  • lorea release's Artifacts tab lists one row per app, format and runtime, and workerd reads cloudflare (#Q2267)ed1f2b3
  • lorean epic starts as a draft, where it was planned (#Q2269)d31e780
  • uithe admin Parameters History panel collapses to a rail, the one Lore's folio panes use (#Q2265)334348a
  • loreSpotlight finds epics, releases and feedback by number, typed (#E52) or bare (52) (#Q2228)359ead1
  • uiadmin Files sorts by name, uploader, size, type and bucket (#Q2232)d301c13
  • uiadmin user, job and payment statuses are tinted chips with a glyph (#Q2247)e50d1fe
  • uithe account button draws the viewer's avatar in every @alepha/ui shell (#Q2229)06fad62

Bug Fixes

  • lorethe quest rail hides a reminder that cannot be set, puts Tags on its label's line, and holds every row to one height #Q2424aaeff9e
  • api/oauththe purge job keeps any client that ever received a token, and an unknown client_id gets a page saying how to reconnect #Q24134669099
  • clia vendored package builds under a strict consumer tsconfig, and a failed build fails vendor sync #Q24901a093d6
  • platformqueue and cron invocations read D1 from the primary, so a job claimed right after its write is never dropped #Q24786c0499e
  • lorethe job sweep runs every five minutes and calls a row lost after one, so a lost queue delivery waits ~6 min, not ~20 #Q247865695f2
  • payments-stripea subscription Checkout made can change price, off the inactive product Stripe created for it (club quest #452)2d88f75
  • servertolerate a socket without setNoDelay, so a node build streams SSR under Deno #Q2456a79c846
  • api/usersrefuse a realm the users API would otherwise drop #Q2453256e77d
  • cryptoan empty APP_SECRET counts as unset #Q24496dc18f3
  • lorethe extractor skips the ./ root entry every real tar writes #Q2447543c6de
  • lorethe missing-runtime-label refusal names alepha image #E63 #Q2441e0ca30d
  • devtoolsbuild:ui follows the retired --target #E63 #Q2441511c6c5
  • clialepha compile removes every slice's wrapper, from the manifest #E63 #Q24323344642
  • clievery remaining reader of the flat dist/index.js follows the slices #E63 #Q24306bce346
  • securityEffectivePermissionsProvider stops escaping its module, and its spec stops importing itself #Q2444e58a122
  • lorethe locale catalogs stop pinning 264 kB into the Worker's boot graph #Q242562d5a8b
  • lorequest reminders sweep hourly, so 50 a run stops meaning 50 a day #Q2418590e758
  • loreSigilJobs stops hiding from grep behind a literal NUL byte #Q242351e3353
  • lorethe mobile table e2e reaches Reset through the Funnel menu #Q2416d8823a7
  • lorethe project header's create button takes the icon cluster's gapd8a8bc1
  • uitext fields keep their width for text until a clear button is drawn, and text filters fit their placeholder (#Q2408)b5b3843
  • api/analyticsthe forward drops rows of a deleted sigil instead of failing the rollup (#Q2404)987ea3c
  • orm,api/analyticsthe hourly rollup stops failing on D1 (#Q2404)949070b
  • ui,lorean avatar whose picture is a URL draws the URL, not /api/files/<url> (#Q2406)d034e99
  • mcpa tool that refuses a call logs at warn, so real tool failures stand out (#Q2405)d361435
  • uismall and minimal selects lose the clear x and hover border23f1352
  • reactlay an animating page out as a column8343755
  • loreroute visitor cards by app instance #Q239500e1d71
  • clidb migrations create loads the app through Vite, and alepha drops tsx (#Q2400)811581a
  • api/paymentsan embedded payment records its PaymentIntent, so Stripe's webhook settles it and the sweep cancels it (#Q2398)8560efa
  • api/oauthshow the client claim on device approval (#Q2391)b072a05
  • api/paymentsthe stale-intent sweep reaches Connect sessions on their own account, and a capture after expiry still settles (#Q2397)dd891c9
  • payments-stripea scheduled subscription end is never prorated (#Q2396)94918f8
  • api/oauthauthenticate confidential device clients before consuming codes (#Q2390)44097b8
  • api/parametersrefresh the writer cache on every save (#Q2359)244402d
  • uithe table footer, the date controls and the admin tabs speak the page's language (#Q2392)88b2c96
  • api/oauththe device grant binds its session to the client it started as (#Q2388)ccd0dac
  • lorethe lore CLI refreshes an expired login instead of asking for lore login again (#Q2387)34555fc
  • uia segmented filter loses its inner frame and sizes its segments from their labels (#Q2361)1cacc30
  • ui$pageNav's JSDoc drops its two em dashes, so check:docs passes again (#Q2357)382b9bf
  • uiSegmented honours the arrow keys its radiogroup role promises6b1bcf2
  • orminsertBatchSize counts the values the driver binds, not the caller's keys0aefab9
  • coregetDefault stops reading zod's own .default method as a default valued438629
  • ormaggregate aliases every expression, so two conditional sums on one column stop collapsingcab2493
  • uishell exports $pageNav, so an app can hang a nav page off its own layoutfef27a8
  • reacta page loader that refuses logs at debug, so the 5xx underneath stay visiblee23461d
  • lorea mention at the end of a sentence reaches its member, and the full stop stays after the link (#Q2350)1d42001
  • devtoolsRows keeps its table rail and grid when a row opens, with the record nested under the table (#Q2351)fdc514c
  • lorethe wiki-link hover card follows its link when the folio scrolls, and closes once the link is out of sight (#Q2354)1f98e6e
  • lorea wiki-link resolves any quest or folio by its number, and the [[ picker closes a token once (#Q2355)3795299
  • reactan error its caller handles still reaches Sigil, but no longer toasts (#E59, #Q2345)f40e04e
  • react/routera $page remounts when its params change, and the Lore folio workspace keeps its tree in the /folios layout (#Q2349)32c6129
  • react/uia prerendered AppShell hydrates with the sidebar state it was rendered with, then adopts the cookie (#Q2347)160d23e
  • cligen changelog escapes a subject's emphasis markers, so oxfmt stops rewriting CHANGELOG.md (#Q2292)0733fde
  • uithe calendar marks today with a bar under the number, not the fill a picked day uses (#Q2334)1e3bd43
  • sigila form refusing what a person typed is no longer filed as a crash (#Q2343)53b3982
  • loredeploys.run declares a timeout, and the deploy timer cannot outlast the queue consumer (#Q2344)8bc9747
  • react/routerisActive compares paths decoded, so a %24 URL and a $ href are the same page (#Q2338)8c68ee8
  • uiui.alepha.dev sets its theme list on configure, the one hook its prerender runs (#Q2341)193e31b
  • api/oautha client may register a loopback IP redirect, matched on any port, and a refused registration answers 400 (#Q2342)53f89e6
  • cliprerendered pages are written under their decoded pathname, the name every host looks up (#Q2340)278be48
  • react/i18nl() is typed string, and both l() and tr() declare it (#Q2312)7a04c1a
  • mcpMcpUnauthorizedError and McpForbiddenError leave the JSON-RPC reserved range (#E57 #Q2309)5b86fa8
  • clia Docker image built with --image carries dist/public/_headers and its .br sidecars (#E49 #Q2172)4062317
  • api/usersbound the session purge before it runs where it never has (#E44, #Q2097)0faaf8d
  • platformLore deploys send _headers and _redirects as asset config instead of publishing them (#E49 #Q2167)83d7fb9
  • mcpa 2026-07-28 probe keeps its fallback 400, pinned by a spec and logged at INFO (#E57 #Q2301)2d685fb
  • uithe table e2e finds the showcase search by its plain "Search" placeholder (#Q2308)79e2efd
  • uithe filter bar fills a date trigger like every field beside it (#Q2295)b066978
  • lorethe prose-face assertion targets the prose root, not the paragraph (#Q2294)6dd2731
  • lorethemes get a heading face that is actually drawn (#Q2294)c6fb96e
  • uithe clear x follows its trigger's edge, not the field's (#Q2283)2b8b9c7
  • uithe 8px page frame belongs to the table pages only (#Q2291, #P2194)b6be6e9
  • uithe date controls draw the kit's field trigger, and clear like a select (#Q2282, #P2197)6ebdc48
  • security$basicAuth refuses an empty password (#Q2281)9550f53
  • uiadmin and Lore project pages frame their content at 8px, p-2 instead of p-6 and p-4 (#Q2266)24428fb
  • uiadmin Parameters reads System, Projects and Deployments, and no stored key is renamed (#Q2263)2a4fc17
  • api/usersremoving an avatar clears the row's picture, not just the blob (#Q2268)5724382
  • uiadmin filter bars share FilterSlot's width and the plain "Search" placeholder, like Lore's project pages (#Q2231)6744ffa
  • loreevery link that leaves Lore carries the trailing external-link icon (#Q2222)48bf2d1
  • uithe admin users list and detail page show each user's avatar, and the initial only when there is none (#Q2246)667307e
  • uithe admin Files bucket filter lists bare bucket names, without file counts (#Q2230)c3dc602
  • uithe password reveal button presses 1px like every other Button, instead of dropping by half its height (#Q2219)00ee69d
  • reactlet a query cache key serialize past 255 characters (#Q2262)a01ca39

v0.29.0

Features

  • lorea first deploy gives a copy APP_NAME = <project>-<app>-<env> (#Q2248)222cbf6
  • lore`lore login` asks for a `cli` scope of its own (#Q2244)2a1efdb
  • lorethe epic pages offer Mark as ready and Back to planning (#Q2223)c1c500f
  • lorean epic is planned, ready, in progress or completed (#Q2223)b772d1c
  • lorelore secrets sets a copy's secrets, one by one or from a dotenv file9627a7b
  • cliBuildCompileTask, one binary that carries its public/ (#Q2209)eff53c8
  • cli--compile [name] and build.compile, for bare as well as docker (#Q2208)264c001
  • reactserve the files a compiled binary embeds before any public/ on disk (#Q2207)8c28986
  • serverEmbeddedStaticFileSource and staticEmbeddedAtom (#Q2206)07cd3ac
  • serverSPIKE, serve public/ from inside a bun --compile binary7431740
  • lorepublishing the default release hands it to the next onee1b9c83
  • payments-stripetag a connected account, and read the tag backe7fa0d8
  • clia vendoring project can keep its packages as sourcec7e377c
  • clia *.client.tsx module does not exist on the server1515c26
  • cacheCloudflare defaults to the database cache, not KV9940992
  • sigilread the session for visitor identity, and an auth dimension72c89c0
  • lorethe robot menu reaches the Blights page31e32cb
  • lorea fifth prompt kind, looping the feedback inbox98b3ffd
  • loretell a reporter what happened to their reportabbd301
  • uione relative timestamp, with the exact date on hoverbda440b
  • commandbring back $command.exclusive, swept on pid liveness2fc1f42
  • clidelete the full verify lane and make CI the gate89ca723
  • lorethe docker pull line on the release page, and the release job that records the imagef09eaf4
  • lorethe dashboard takes the project root, Activity moves to /activity (#E46, #Q2104)8fba07d
  • loreevery surface that reads a variant learns about format9c2c60c
  • lorethe project board's empty state (#E46, #Q2102)e97f141
  • lorethe project dashboard page (#E46, #Q2103)489760e
  • lorelore artifacts push-image, a sibling verb with no runtime and no arch flag2757335
  • loreArtifactService.pushImage, its endpoint, and the impossible row it refuses8dc4d50
  • lorecompletion for one tag (#E46, #Q2108)f9e8019
  • lorethe release progress card (#E46, #Q2107)dd159db
  • lorea registry client that reads an image's own claims, and refuses what it cannote620742
  • lorethe epic progress card, and the scope kind reserved since #E4 (#E46, #Q2106)b5f9caf
  • lorethe project dashboard controller (#E46, #Q2101)491ac6a
  • loreartifacts gains format and reference, and the deploy gate stops picking an image810e41a
  • lorethe On hold card, and the number it must stay inside (#E46, #Q2105)fd8d986
  • lore`lore deploy`, and the environment taken from the app's own rowsa51b810
  • uiAlephaTable persists its facets one at a time, so Apps can keep its columns402a3c2
  • loreMCP reads and moves the default release77af1a0
  • lorethe default release in the UI, a chip that is not a state5dd9847
  • lorean epic begun with no release takes the default, and cascades itef3fbaf
  • lorea completed quest lands in the default release, unless it already has one4ad7d8d
  • loresetDefaultRelease, one statement and the three refusals around it6aa0f3c
  • lorethe resolve path learns epic and release (#E46, #Q2140)394fefd
  • lorethe metric catalogue learns which board may hold a metric (#E46, #Q2100)4e438e4
  • lorereleases.defaultSince, the column a project's default release lives on6ef054f
  • lorea dashboard card can belong to a project (#E46, #Q2099)514a4e9
  • clithe generated Dockerfile declares its runtime as a LABEL1c9608e
  • lorethe Apps table's Address is a link, the way the header already is64f7539
  • corez.dateRange(), a date range as one field and one control8153a0d
  • corez.dateRange(), a date range as one field and one control4c1fc58
  • uichrome surfaces wear the table header's foldbffa6fc
  • lorea folio is encrypted from the tree, where the reader decides it5663faa
  • platforma deploy with no domain answers on workers.dev, and says wherecdda054
  • lorea deploy says how far its asset upload has got9987444
  • lorea release is filled from the work, not from the release0622948
  • lorea release is set from the row, on both tables18e8e51
  • lorea deploy that stops reporting is closed by a sweep8653493
  • uian account area can say it does not offer a page87816e5
  • loreReports breaks quests down by tag, beside area and priority9319811
  • baya Lore deploy names its instance <project>-<app>-<env>05da3f6
  • loreheld quests get a sidebar entry, a count, and a working link9e00188
  • lorethe artifacts empty state links the guide instead of printing it568d9b2
  • lorea copy can declare at creation that its data goes with it5212ef0
  • bayan instance is one path segment, so a caller can widen it1ab642a
  • lorea URL opens one feedback item, and the quest badge is that link6556ff8
  • loredestroy takes the queue and the cache too, keeps D1 and R23b9eedf
  • lorea deploy names its resources <project>-<app>-<env>, and destroy keeps the data402d07d
  • loredestroy the resources a copy's deploys createdb0d4c0b
  • lorea deploy records what it provisioned in the estate229a663
  • apiconnected apps are apps, not authorizationscbeac47
  • lorea deploy gives a copy the sigil its build asks for631732b
  • lorethe registry keeps the manifest it already readbebe369
  • lorethe feedback footer leads with the primary and ends in an icon2ba9c0d
  • lore/account/projects says how many projects you own against the limit791d5ab
  • lorethe Agent Prompts menu gets a caret, icons and a line per itemba7213f
  • loremint the Cloudflare token from a prefilled link4e96e8b
  • lorea phone header keeps the work controls and drops the settings ones10535eb
  • lorethe create-estate dialog gets labels, icons, room and a real footer875ed8c
  • uithe account button can show the viewer's own facedea7152
  • lorea copy can be given its sigil as it is created8d3c92b
  • lorea feedback screenshot opens in the shared attachment lightboxae4d1ca
  • loreEstates takes the API keys layout, create row includedc06cb55
  • lorea deploy carries the two variables no operator should have to set64a3f00
  • lorethe empty space under the folio tree offers a folio or a directory05fbd3c
  • lorethe folio tree closes from its own header, and reopens from a rail3dbdb9a
  • lore@ autocomplete in the comment editor233e874
  • lorethe quest comment composer is a LoreEditor like everything else62d49bc
  • lorethe Apps table gets three more columns, hidden by defaultfb63b96
  • lorea created copy carries its address, which is what returns a URL2d6ce7d
  • lore@alepha/lore/client, for an app that provisions its own copies62a073c
  • lorean estate you own opens its Bay console from the project's list3a9623a
  • loreship the switch, and turn it on where an estate is already lent46585cf
  • loredeploy over MCP, with no way to name an estate5065bf8
  • lorethe Deploy tab, and a Version column that knows what runs287d54a
  • lorea deployed copy's environment, sealed at rest and never read back1e09239
  • lorea project holding no rank rows is given the three presets1cb7bb9
  • lorelore apps deploy, where the tag decides whether it builds15a76b9
  • lorelore apps build, and the line --env must not cross804a559
  • lorefast rollback via the Cloudflare version id20c62a7
  • lorea quest can be held, with a reason, and Held is a real status06d1e14
  • lorerefuse an artifact the estate cannot runf030f64
  • lorethe deploy gate, and the bounds a run lives insidef2bfdf4
  • loredeployments, the row a deploy is followed through4822dc7
  • lorethe Apps table filters on app, env and status54efa0b
  • lorea deploy runner that drives orchestrator.up() inside the Worker75da050
  • platforma Cloudflare adapter a Worker can bundle60267c5
  • loreMCP answers what an agent may do, not whether it is the owner42c3ab9
  • loreassign a rank, and hand the project onbf1844a
  • lorethe rank matrix, and the two built-ins that are not the same kindd15e656
  • uithe permission matrix, a table neither application owns6995bee
  • loreevery write control in the project UI asks the rank first281f2ef
  • lorethe UI asks the rank instead of asking who created the projectc2249e7
  • lorethe notification preferences paged5c9fb7
  • loreLore owns the notification preferencef1b167e
  • lorethe /:projectSlug/inbox page and its sidebar entrycf9bdcf
  • lorethe project loader seeds both inbox counts8ccbe60
  • lorethe bell rides ProjectView's before slot962f990
  • uiButtonInbox, the bell and what is behind it5736ec5
  • loreProjectRankResource, and the three presets a new project starts withc8c225c
  • loreunpack an artifact safely, and stop the build reading the host4e91e2e
  • lorea member's mention in a feedback thread reaches a personed0c33c
  • lorethe whole permission vocabulary, declared once with its labels73a5c40
  • loreAgent Prompts > Work on it on the feedback detail panelbf89988
  • platformdeploy a Worker to Cloudflare with no wrangler process0d3bddf
  • lorepublishing a release tells every memberdc60490
  • loremembers.rank, and the backfill that must never lock an owner outd78aaba
  • loreAgent Prompts > Work on it on both quest tables and the quest page5b2c6d3
  • lorea mention in a quest comment reaches a person44fb644
  • clikeep source maps out of the artifact, and beside it insteadfdd5da5
  • apialepha/api/ranks, a permission set held inside one scope900dfde
  • lorethe Agent prompt editors on the Work settings page7ac0faa
  • lorethe two inbox templates, and who an address belongs to56cb357
  • loreAgent Prompts replaces Review on both epic surfaces54ea20d
  • loreresolve app and env for the deploy commands, and the project default behind them63bee78
  • lorethe agentPrompts option, the prompts atom and useAgentPrompt24b2c39
  • api/notificationsa third retention clock, and the orphan half of the inboxaede84a
  • platformD1 migrations over the query API instead of wrangler8b28b06
  • api/notificationsthe inbox read side, in the frameworke9b0f86
  • serveraction.can() learns the scope it is being rendered incffa4fb
  • cliworker-safe entry points for the CLI build tasks and platform-lib3db24d0
  • loreproject_prompts, the table and the owner's write path972f398
  • api/notificationsthe inbox, as the third channel8f48924
  • securitythe permission registry reads back as an ordered catalogue52a698a
  • lorefour default prompts, one renderer, seven placeholders66baa30
  • api/notificationsa seam that turns one contact into a user8e66bd5
  • security$owns gains requires, the seam for what a member may do9a19737
  • api/notificationsa channel can decline before anything is rendered91f3606
  • uia row action can be a group, one level deepbcc77d6
  • uithe checkbox lights its border under the pointer3233d9b
  • uia link becomes a filtered table, and a filtered table becomes a link4a138bb
  • uia disabled button says so with the cursor43aa078
  • lorethe dashboard, the feed and the palette compose from capabilities088d322
  • loreproject_context omits the sections a project does not own5bbe3d3
  • loreApps has a baseline and two options, and Quality joins itbfb70d2
  • lorenine Features pages become four capability pagesd78a4c3
  • uia palette with a footer, bevelled buttons, and two controls that stop lyinge506f44
  • lorethe switches move to the console, and the drawer keeps cloudflare00ff199
  • lorethe queue gets a page, filters and the names behind it9819193
  • lorethe sidebar and the palette derive from the capability mapd89ffe0
  • lorethe buttons, and the true thing at each step56db80c
  • lorethe instance page, and the log payload both halves agree on9b93b16
  • lorethe apps table, and the row nothing else in Lore surfaces2e2cda9
  • lorethe series finally has a reader936eda2
  • loreroute guards and the create menu read the capability sete703579
  • lorethe overview says what the machine has, in bytes613d0df
  • lorethe wizard asks what the project is, then sets it upbf08a20
  • lorethe bay console gets a route, a shell and a reserved namea819900
  • uia Tree showcase block, three specimens deepf9a08b3
  • baythe machine answers a log tail, then acks7cb31a5
  • lorea log tail, answered over the seam that already fitsdd77f1b
  • lorethe folio tree rebuilds on @alepha/ui's TreeView3c363cb
  • bayone backup path, and it refuses an app with no database4ff4c25
  • loreone gate for capabilities, reached three ways23c5a7c
  • baya stop that survives a reboot, and a start to undo itf44a9b8
  • uithe pane resizer moves to @alepha/ui tooa5cfe36
  • lorethe estate dialogs ask for a Cloudflare token, and never show one back34eea7a
  • baya query is answered with an inventory, even mid-deployacb6013
  • uiuseTreeState, the state a tree needs and nobody should write twice4d1f303
  • lorethe project resource carries its capabilities, and one controller writes themb754edf
  • lorea refresh that asks the machine, without becoming a command7e3b2e1
  • uiTreeView renames inline, and takes a menu as a slot81efd50
  • lorethe owner's read, with the reconciliation done server-side9574856
  • lorea Cloudflare token is proved at creation and asked again every night64d1c47
  • uiTreeView drags and drops, when a consumer asks for it37345f5
  • lorestore what a machine reports, one row per estate5506aba
  • lorethe inventory frame, pinned from both sides of the wiref122694
  • uithe controlled TreeView core, with the geometry that was earned3a91d1c
  • loreone declaration per capability, and the read that serves itde3415a
  • baythe inventory goes out on connect, on the tick, and after a commandeceadde
  • uithe TreeView row contract, declared before it is built43975f9
  • lorea Cloudflare account is an estate, and its token is checked before the row existse9c5947
  • bayone implementation of the status arithmetic, for two readersd690d3c
  • uithe tree model moves to @alepha/ui, generic over a payloade3ee857
  • lorea project's capabilities live in their own tablefebcbab
  • baythe host gauge keeps the bytes it was throwing awaya61795d
  • lorean estate credential is sealed before anything can write onea74be12
  • uithe shell's nav groups open one at a time, and slide73184b2
  • uithe showcase opens on a hero, and every page has a palette426b6b0
  • uibevels, two empty states, pointer cursors and a hover borderdf96133
  • lorethe folio document reads at one of three sizescf44c2a
  • lorethe Artifacts sidebar entry moves under Appscbaa819
  • uithe Layout blocks become live specimens8cc80d0
  • lorea folio directory whose name says what it holds gets a badge3bde3eb
  • uiDiscord-style ||spoilers|| in MarkdownView4305acc
  • lorelore attachments push, and MCP stops carrying bytesd822267
  • loreMCP grows `app_instance_*`, and `sigil_*` keeps workingd2d83d6
  • lorethe sidebar stops listing apps9da5f6b
  • loreApps is one flat list, Name / Env / Address5c447e0
  • lorethe instance page, where tabs are unlocks77df77a
  • lorethe instance Settings tab, five rows over one instanceedfae08
  • loreNew app in the create menu, and the one create dialog9b1ac67
  • lorea sigil is an unlock on an instance, not the app itself300f63f
  • loreProject Settings keeps a switch and the ignore rulesf7c92dc
  • loreAppController, and /apps/:app/:env as two segments1aa1ce4
  • loreapp_instances, the deploy target that holds the sigil2fc4426
  • uia page per screen, for auth, account, control and AutoForm8b7cc9b
  • uia simulated viewport is a real one, and the preview scrolls alone1b07611
  • lorean agent can attach a file to a folio over MCP1c00679
  • uiAlephaTable column ordering, from the header and the pickerd4d15b2
  • api/auditsa burst of identical events coalesces into one row with a count59b092e
  • lorea project-level Artifacts page, between Folios and Releases937256c
  • uione Showcase per page, filling the frame05e6572
  • lorea repository link in the project topbar, when there is one to openb5adad9
  • uiAlephaTable puts its filters behind a button on a phonea247f8b
  • uibring back the props Showcase, six themes, and a tweakable shelle3501fb
  • baythe deploy action pulls by command id, verifies, and deploys8bf329c
  • baythe host gauge, pushed on the interval Lore names04d381b
  • baythe action vocabulary is closed, and restart is its first verb35dbfc8
  • bayone persistent connection, dialed to Lore and held open8446467
  • baybay connector set, show and clear enrol a machine as an estate1f87934
  • lorethe /account/estates page, and the admin list behind itd70899b
  • lorethe Release page gains a Flow tab, epics as clusters of their questlinesb6e7609
  • lorethe questline map gains drag to pan and cursor-anchored zoom5d4c228
  • lorethe artifact bytes and secret set a machine pulls by command idabd5939
  • uiadd the payments admin block, completing the admin surface7c52696
  • uiadd the notifications, parameters, dashboard and analytics blocks4c14da3
  • lorethe estate gauge on the row, and its series in analytics57e0a82
  • uiadd the sessions, API keys and files admin blocks86e95af
  • uishow the admin users, jobs and audit blocks from fixtures9875d8e
  • lorethe websocket a Bay estate holds open, authorized by its secret7b873b0
  • uiadd apps/ui, the component showcase at ui.alepha.dev2fb6acc
  • lorethe estate command queue, built before the endpoint that carries it0f36199
  • lorethe Epics list can filter by release, not only show it4c57422
  • lorelend an estate to a project, from the project's settings020848b
  • lorean admin action converts every stored reference to the typed grammarc60ae9a
  • lorethe epic page follows the lifecycle, two verbs and nothing offered that the API refuses1afe5c9
  • loreestates, a user-owned deploy destination with a minted secret07b475e
  • lorethe typed reference is what you copy, type and search fora1f0f6b
  • topicremove @alepha/mqtt and the emqx test service72811b8
  • lorean epic cannot conclude while a quest is unresolved044a5c4
  • websocket$websocket and $room gain a pre-accept authorize hook that names the room90c8fec
  • lorea bare #Q12 in a comment links, a bare #12 no longer does3560477
  • apiremove alepha/api/workflows, the durable workflow engine81c3b26
  • lorean epic cannot begin while its predecessor is not done9ec3015
  • loreevery screen labels a quest, epic, folio, feedback or release as #Q12fdb60fa
  • uithe jobs executions panel shows when a row is parked, its key and its payload3e84060
  • loresetEpicStatus is a one-way ratchet, planned to active to done6e6c84e
  • lorefeedback and releases are linkable as #P120 and #R12b74d777
  • lorethe plan freezes at activation, so quests attach, detach and delete only while plannede1076d6
  • loreaccept, assign, complete, reopen and unshelve refuse a quest whose epic is not active0321c57
  • loreEpicWorkflowService, one place for every epic phase rule and its refusal05ec1a6
  • loreboth link parsers read the typed #Q12 grammar, and the server skips code70a5d28
  • api$job gains reschedule, cancelByKey and a per-job retry backoff3194794
  • lorequest_list hides a planned epic's quests by default, like the UI49c8344
  • loreReview opens the prompt for editing instead of copying it blindaa42ae2
  • lorehover a feedback image attachment to preview it57c7340
  • uithread the date-picker caption props through Controlb59b53e
  • uilet ControlDate offer month/year dropdowns and a year rangec9a0927
  • loreApp Errors becomes stats, on a series the aggregate table cannot hold7a17fd0
  • loreReview copies an agent prompt for a planned epicf421953
  • lorethe epics list gets the selection bar, with bulk delete and add to releasef2dd21e
  • lorean optional Epic column on the quests table, anchored to the epic6a98c62
  • api/auditsscope audit rows, and make Lore's Activity page read them1c861b5
  • lorelet a quest carry any file type9d54366
  • api/notifications,uithe preview and the admin list stop knowing the channels by nameb456e80
  • loreresolve the project from -p then LORE_PROJECTa0d2a81
  • api/notificationsa sink channel fires at a destination, not at a person5b4a530
  • api/notificationsa NotificationChannel contract, and a registry that refuses a channel nothing provides2e4be19
  • loregive @alepha/lore a `lore` binary4bb94df
  • api/notificationsopen the channel columns to any channel name621f19e
  • loreadd a Claude theme, light and dark4f99517
  • lorean Activity page, and it is the project root instead of Questse734a20

Bug Fixes

  • lorethe Environment tab refuses Bay's own names on a Bay copy (#Q2250)57bacc3
  • lorea Bay machine's secret pull leaves out the names Bay writes itself (#Q2250)f36c57d
  • reacta disabled useQuery does not poll (#Q2224)0bf7458
  • lorethe sign-in bridge back into OAuth pages had never fired (#Q2217)1fa40c2
  • api/oauthserve the device approval page the grant advertised (#Q2217)fb4c2f7
  • cryptorequire APP_SECRET only in apps that use a secret (#Q2218)3712ed4
  • baycancelling the connector's Run closes its socket at once (#Q2214)e62b5fc
  • lorethe French epic prompt labels match Review Epic and Work on it (#Q2197)963ed37
  • lorethe empty project board is one centred empty state carrying Add card (#Q2195)6591bcd
  • loredashboard cards and the project switcher take Control's border and hover border (#Q2194)b24f2fa
  • uisidebar entries sink on press the way a Button does (#Q2196)f32013a
  • loreActivity's resource filter drops Epic and Release when their Work options are off (#Q2192)421afc9
  • loreActivity hides the Everyone filter on a one-member project (#Q2193)c8352af
  • loreepic prompts read Review Epic and Work on it, the verb quests and feedback use (#Q2197)e139315
  • loreagent prompt menus show the label alone, with no description line (#Q2198)9678639
  • bayredirect plain HTTP to HTTPS instead of serving every app in cleartext (#Q2165)39bb877
  • lorea deploy refused by the concurrency cap waits for a slot instead of being lost (#Q2189)0b40315
  • serversend an ArrayBuffer or typed-array reply body as bytes81c2681
  • api/keysan API key records the IP of the request it authenticates1fffb1f
  • api/jobsa manual trigger no longer runs a cron alongside its own tickf77aeac
  • lorethe Lore app is an optional peer, still declared58fd198
  • lore@alepha/lore installs outside the monorepoab5ac94
  • api/jobsa cron run that outlived its lock no longer frees the next holder's4641620
  • platforma destroy reports the Durable Object namespace gone with its Workerfa432eb
  • api/keysthe API key usage write outlives the response on Workersd606689
  • platforma teardown takes the dead-letter queue its deploy made7bde5ef
  • clia Lore deploy binds the queue consumer the build declares8b193a6
  • clia redeploy rebinds its queue consumer instead of creating a secondfdff064
  • emaila workerd entry for alepha/email/smtp, so a Worker ships no nodemailer3a16e74
  • clia queued job starts when it lands, not after a batch window4b91bed
  • uia date trigger takes its boundary from the field token231cf6f
  • clia vendored package builds itself, so Node can load it5537bc9
  • loreAgent Prompts and Edit go icon-only, and the labelled menu goes32eda96
  • lorethe loop prompt leaves the inbox toolbar for the footer menu00b0660
  • lorethe epic and release cards could not be added at all (#E46)953537d
  • lorefive dogfood quick-wins, and one measurement that says no2cd6f70
  • cliban TypeScript parameter properties, and clear the 445c28c68
  • uigive a control's boundary its own value, at 3:1b77cbbc
  • api/jobsthe reschedule spec asserted job:success after waiting on the delete74aadac
  • api/jobsa queue consumer buys wall clock, not CPU, and warn about untimed jobsc14550e
  • lorerun jobs through a Cloudflare Queue, off the 30s waitUntil budget8ad5b02
  • lorethe push-image spec must not trust the machine's LORE_PROJECTf2ae1ca
  • loreregenerate the dashboard-cards snapshot on top of the artifacts rebuild2b46ce4
  • loreregenerate the artifacts migration on top of maind9357a7
  • lorea filter that matches nothing stops offering to create the first app98ce0d6
  • lorethe kingdom, the party and the forge leave the empty states3032c8e
  • lorethe artifacts App column stops guessing which copy to open1868cd5
  • lorethe artifacts App column stops guessing which copy to opencc7424e
  • platformthe asset upload does what wrangler does63f357e
  • lorean epic's release reaches the quests the epic holdsc7b8e8f
  • lorea deploy streams its assets instead of unpacking them887fb6a
  • platforman uploaded asset carries the type it will be served with4176599
  • platforma Worker deploy ships the app's static assets0539541
  • react/routera root param page no longer answers for orphaned assetsc3da037
  • servera 403 says why, where the reference id can find ita197ac8
  • lorethe artifacts empty state takes its alignment from its frame1469d94
  • baythe current symlink is relative, so moving an instance cannot strand it11f04be
  • platforma websocket Durable Object is not a database, and destroy stops pretending it is7259617
  • lorethe kanban lane stack scrolls, so grouping reaches past the first lanec2dd461
  • lorea blocked decision belongs in the agent's reply, not only in Lore6bf0046
  • platforma copy's Durable Object storage is data, and destroy treats it as such111d5ac
  • lorethe instance fixtures the ephemeral column left behinddf4f2e3
  • loredestroy cannot be aimed at production by a forgotten flagc65bde1
  • lorea 500 from destroy hid a Worker and a database that were already gone02d01ce
  • lorethe teardown adapter comes from its own container, as the deploy's does36fbd9e
  • loredestroy 500'd because a $module was injected as a serviceb863bda
  • react/routeran application with two realms can say which door a denial belongs tofdbed5b
  • loreevery activity kind reads as a label, and App names one thingc71b336
  • loreanchor the feedback footers left, out from under the bubbleda0c940
  • lorethe artifacts command wraps instead of scrolling out of viewebdb242
  • loretoggling Preview no longer moves everything under the editor4191541
  • lorethe Cloudflare token guide links to the docs site, not to Lore4decb5a
  • lorechoosing a default environment no longer empties the sidebarc60b063
  • platformread the version list where Cloudflare actually puts it1385be3
  • lorelore apps build no longer copies dist into itself72db202
  • platformstore the version Cloudflare minted, not the script's nameed15ab2
  • platformcompose the Worker upload the way Cloudflare documents itf8dc6d3
  • platformthe worker upload names its entry the way the modules are named48a4478
  • lorethe tree's two create buttons name themselves to a pointer toob2d4d07
  • lorethe folio breadcrumb reads #F12, like an epic's and a quest's6610206
  • lorethe project quota counts what you own and still have77ee88f
  • loreArtifacts says Search, and its empty state is the table's5fb7275
  • lorethe inbox table fills the page, and its search says Searchbc02d4a
  • lorethe Notifications page gets its breadcrumb33bcb63
  • loreNotifications leaves the rail, and the bell is the only door1cb2fa2
  • lorethe default-env row asks the rank, not the membership flag628da1e
  • loredrop the propagation-delay banner from the capability sections56e8406
  • lorethe rank matrix stops listing permissions no rank can holdba9fa19
  • lorethe e2e suite fits its budget again, and two specs stop depending on orderc15e4c6
  • lorethe settings rail names each capability in one wordc1fc979
  • lorethe selection toolbar waits for the mouse to come upc2532c3
  • lorea shelved quest says so once, and the truncated title has a tooltip1ea73cb
  • lorethe editor's Preview toggle sits level with the format toolbare2b52a5
  • loreproject_name resolves a slug as well as a titlef21fdc9
  • platformD1 migrations go through the import flow, not the query APIb4bfb29
  • lorea tab's gate is its own capability option0494c38
  • lorecreateProject rolls back the project when the membership write fails5cbce89
  • lorethe bay console spec says its project does Appsecfbbbf
  • lorethe estates dialog spec builds its project through the fixture2df0e81
  • uibuttons stop overruling the hover their callers ask for91862ca
  • loresay so when an app sends feedback the project dropse6c8afc
  • clithe app loader's Vite server no longer wipes the dev cache8aeec95
  • lorethe Apps table columns share the widthe4e858f
  • uia selected value with no option to be selected from gets a row9fb3b8a
  • lorea directory holding the open folio can be collapsed again3423c14
  • lorebound the project-wide sigil reads under D1's parameter ceiling76511bf
  • uithe colour-mode toggle is a paint, not a render286392e
  • uithe showcase's dead controls, found by driving the built app44e9e01
  • uiEnter commits a text field, and the theme menu behaves like a menu88dcc7f
  • uithe clear x sits beside the chevron at every size, and reads quieterbf6e2c2
  • uiopening a table no longer freezes its columns foreverd402140
  • lorethe wiki-link picker waits for # and a character814a588
  • lorethe folio tree's indent guides are centred on the column they mark244982c
  • lorethe questline stat bar is one line, whatever it is given0ed2c4a
  • uithe shell and sidebar pages, and every dangling link a crawl found322b43a
  • uithe shell's overflow bound is real, so the admin page stops scrolling9ebee06
  • ormcreateMany sizes its batches by the driver's parameter ceilingc93c117
  • lorethe reference converter writes a page of rows per requesta612085
  • lorethe epic workflow's refusals speak the typed reference grammarb72820a
  • lorethe epic page's Quests table scrolls itself, not the tab around itca2a1c5
  • lorethe locale strings that put a hash before a numbercd82fc0
  • loredrop double-click-to-rename in the folio tree42bf9cf
  • uia clearable select names its empty state once, on the trigger316ea7b
  • lorethe [[ picker inserts #Q12, and stops offering attachmentse28d0af
  • lorethe folio tree keeps what the reader opened across the list-to-folio stepa2d1e0b
  • uitreat a changed persistenceKey as a changed scopecb93d0d
  • uia PlateLayout with no plate stops ruling off its tab bar2b7da0c
  • lorethe quality charts plot the day, not the commit hasha383d2b
  • lorestop opening tables on a page size their own picker does not offer293f5db
  • loremake the index migration idempotent so a retried apply can finish1a2d5c0
  • loregive QuestView a chunk boundary so the quest page preloadsd00f384
  • cliparse the source for $page preloads instead of scanning itdca19f6
  • react/uiload a theme's font where no theme picker is mounted2366f2c

v0.28.0

Features

  • cliaffected selection and caching are what yarn v does by defaultd31511d
  • commandRunOptions.cache skips a task that already passed on this treeec5b72e
  • cliyarn v --affected runs only what a change can reachc7be419
  • lorelet a completed quest still take feedbackId, area and tags33768e3
  • loremove the error budget off Analytics into its own app tab0b376ad
  • lorepage the feedback inbox at ten with a Show morebfb8288
  • clialepha test --project selects one or more vitest projects5989b3a
  • lorecreate, rename, recolour and delete a kanban column from the board80c40b8
  • api/usersan operator can manage another user's avatar76acabe
  • loreLore writes domain audits, so the log says who did whata17fe05
  • uia plate-and-tabs layout, and Release, Reports and the App view share ite21f9b2
  • lorethe owner removes a member, and both card kinds share one row menue0e7377
  • lorethe quests release filter can select what belongs to no release1bc1e01
  • lorethe rail's Commits row is short codes with the message on hover63836c7
  • lorea completed quest can still change release59ad4a4
  • uiControl takes a size and a minimal variant, and the rail's Release row uses botha37b4cd
  • securitya default realm is declared, not positional81a9e43
  • platformpush ghcr.io/alepha-dev/lore from the release job, multi-arch1d70e84
  • api/notificationsa $notification subject can be built from the variables0580352
  • lorebuild a self-hosted image that runs on a port and a volumedd43d55
  • loreemail is SMTP-only, and everything it gates is off until EMAIL_HOSTc42e653
  • api/usersbootstrapFirstUser makes the first account the administratorfccd95a
  • cliOCI labels gain source, title, description and licenses9c5f165
  • cryptoAPP_SECRET_FILE generates and persists the secret on first bootc0b1d7a
  • clithe docker target bakes env and volumes, and stops running as root40581c2
  • lorea fixed formatting bar above description fields, and the header's create control is one "+" menu7a8ac2d
  • loreepics status multi-select, create quest from the epic page, no more board landing, no member hover cardae9b7be
  • api/parametersthe tree says which nodes are orphans, hides them by default, and lets an operator delete one4d4e001
  • loreArtifacts is a tab of the app view, not a card on the Dashboard5ecc55e
  • lorethe quest tables' create, columns, bulk bar and release glyph, from the 2026-09-02 feedback4eb1409
  • cli`build --if-stale`, so a pipeline stops rebuilding what it just built08c899d
  • ormalepha db doctor reports rows whose storage class disagrees with their column2060e0d
  • lorebulk Shelve, Unshelve, Delete and Add to release on the quest list44af820
  • uia bulk action that opens a menu, with its items resolved on demanddd2c54a
  • clialepha lore releases publish, so a release job can publish its Lore releaseaa7ecc3
  • uia primary form for the table's toolbar action, so the create button is visibled9d89e0
  • lorea settings page for the Quality flag, so a pushed run can be seen13de941
  • api/analyticsa pinned scope, so the query builder serves one tenant72bc4f2
  • lorealepha lore login, and a credential order CI cannot trip overc5f05ce
  • lorethe invite link opens the register page and ends in the project325410c
  • lorethe release Artifacts tab reads the real registry0a69c6e
  • loreartifact_list and artifact_get over MCP54911b2
  • loreepics get dependsOn, so the roadmap draws the ordercf3c676
  • lorethe signed-out hero stops offering a signup that is closed8b647f2
  • loreartifacts on the app page34d4977
  • ormaggregate() takes conditional buckets, so a bucket is a column not a querye2efc91
  • api/invitationsthe invitation carries a signup token4c2a6dd
  • lorealepha lore artifacts push7ddb5c1
  • lorethe members roadmap, behind the same URL807036a
  • api/invitationsextract Lore's invitations into a framework module54e2c0a
  • lorelist artifacts grouped by tag, variants folded indd342aa
  • lorethe roadmap route, and the first anonymous read endpointecb954e
  • lorelatest is mutable, every other artifact tag is write-once1118416
  • api/usersa closed realm can let one address in17b521a
  • loreartifact registry, addressed by sha256a12dbf3
  • loreroadmap visibility, one switch with three positions246abf5
  • loreregistration is a runtime parameter, and it defaults open0bed3c8
  • uimulti-select renders a trigger, labelled value-then-countc7e13bc
  • lorealepha lore quality push07919c9
  • loreReports has a Quality taba2be6ab
  • api/analyticsthe admin page becomes a query builder5e4c20e
  • lore@alepha/lore/cli, the plugin shell and LORE_API_KEY auth7aebd0a
  • lorequality_runs, its own storage, and the push endpointb4f6261
  • lorethe release page becomes a plate over four tabs3b9a548
  • clialepha test --coverage writes the coverage and test JSON reports6b37f90
  • corebuild metadata on alepha.meta, served at GET /version4c4103c
  • lorefold the quest form's optional fields into an Advanced sectionb1b885c
  • lorecheck mermaid fences on write, and stop relying on the doc arriving30a30ae
  • api/oauththe consent screen says who is asking and what they get2862160
  • clivalidate the build manifest on both sides of the artifact contract010be98
  • corewas* assertion helpers on the remaining memory providersb64a327
  • lorea quest's commits link into the project's repositoryb1e049b
  • lorethe quest feed says what an edit changed07d68c0
  • uia typed prefix can select every match in a multi-select61acdf8
  • uifilters on the Admin Sessions page8347c96
  • loreCopy ID and Edit Quest in the quests table row actions32227f6
  • lorethe quests table takes several values per filter0a27f1a

Bug Fixes

  • uimount the navigation progress bar at the app root, not inside AppShell7c8e66d
  • loregive the landing page a project list below lg, and stop truncating the greeting7ab0590
  • lorecentre the quest rail rows so a control stops pushing its label up0dcbd84
  • loredrop the Apps heading and stop the Reports column stacking8de491d
  • loreroute every filter box through FilterSlot and settle on "Search"fb3fbf4
  • lorerun Reports full width and let only its body scroll60001a0
  • lorelet App Explore fill its plate4d7b3f9
  • uiclose the mobile nav sheet when a link inside it is followed826698a
  • loreorder every release list by version, at the source8bbf1a0
  • lorebring the dashboard and kanban icon targets up to 24pxb22b66b
  • lorewrap the kanban filter bar instead of clipping it off-screen4474b47
  • uistop DetailLayout's toolbar clipping its own tabs and actions95f1db2
  • loreimport the SMTP module dynamically, so it stays out of the Worker93a8627
  • lorederive the email-gated settings from any transport, not from EMAIL_HOST4ec80bb
  • serverthe link registry resolves permissions in the caller's realmbd24c6d
  • securitya token minted by one realm no longer authenticates in anotherff5ef8a
  • reactserver rendering keeps the caller's realm in the auth contextacbed7f
  • securitycreateRealm recognises its placeholder by identity, not by namedb30446
  • lorechunk every unbounded inArray, and classify D1's parameter ceilingd01915f
  • loreentry points say "New Quest" and "New Epic", like the rest of the menub7cf8b5
  • api/auditsthe admin action filter offers type:action pairs, so create no longer means create-anythingf2e29d2
  • lorethe release glyph reaches the epic aside, the quest rows and the epics list05b5769
  • lorethe Explore tab is registered with the shell's route tables, guarded by a spec over the router3cc702b
  • ormdev sync warns whenever the fallback left a table alone2e9cf83
  • uithe account shell supplies a dialog provider when none is above it, and labels its rail groupsb10d15e
  • serverthe tokens cookie carries its realm, so a refresh resolves the issuer that minted it7ecd563
  • ormdev sync resolves a rename drizzle-kit cannot ask about, and says when a table was left stale6a122db
  • serverthe tokens cookie carries its realm, so a refresh resolves the issuer that minted it84cdf84
  • lorea bare number in the palette finds the folio and directory carrying itebdd6b4
  • api/workflowsdispatch from the persisted stamp, and never drop a dispatch on the lock0d03a91
  • api/workflowsevery execution transition is a compare-and-set527d30f
  • uithe shell topbar must not push its controls off the screenb72081b
  • platformdb export survives a NUL byte, and no longer eats the dev DBfadf99a
  • uiAutoForm groups must not shrink under fillece5605
  • locka lock expiry stops holding the process open7ef82e4
  • cachea cache eviction stops holding the process open4951866
  • loreregenerate the artifacts migration on top of maina82dd80
  • lorethe merge resolution's other two files0e81262
  • api/invitationssatisfy oxlint on the merge resolution39b2200
  • lorequality runs carry totals only, one row per branch per day9396fcb
  • lorethe CLI specs stop reading the machine's environment1eec91a
  • uiControl's inputProps reaches a select's trigger7e4c2be
  • clithe prerender sees the build metadata tooeaa8b52
  • lorethe quest e2e specs open the Advanced block before reaching into it1972cdf
  • lorefeedback_get returns the context the reporter's browser capturedc722a2e
  • commanddrain the heartbeat before deleting the ticketb8e7b1c
  • reactreport hydration mismatches with their component stack93d3324
  • lorescrub the query strings already stored on blights and error groups030160b
  • sigila refusal is not a crash on the browser side eithera9f557b
  • uiname the user when clearing their second factora372db8
  • lorethe due date uses the kit's date picker, on the Tags rowc49c0da
  • loreAttach Quest moves into the table toolbar, and the rule is written down5f30e56
  • loredrop the Edit tooltip that only said Edit2c07553
  • serveranswer HEAD on every route that answers GETefd4d9b
  • uithe interaction state layer applies in dark too94675e9
  • lorethe Kanban filter bar uses the same controls as the quests tablec81a523
  • loreone tag chip for the board and the quest rail, colour included3e06d53
  • loresort releases by parsed version, not by creation order5adb8ea
  • lorethe release example is 0.1.0, not the version we happen to be ona6ba08e
  • lorea toolbar spinner goes last and never moves the rowe6af711
  • uimake the ghost button's dark hover as visible as its light oneaaad40d
  • uikeep a destructive row action red on hover4097b7b

v0.27.1

Features

  • lorecap a quest at 10 objectives5aac311
  • lorea Size column in the quests tablef7d19c8
  • lorebegin an epic from the list, and confirm before beginning one46d53d7
  • loreoffer New Release in the header create menuf3f8118
  • lorecreate a release from a dialogcf34d5e
  • lorerebuild the Releases page on AlephaTable67c467a
  • loresort the epics list by release, in version order2891b51
  • loredouble click a folio tree row to rename itfc34c6f
  • commandhold the exclusive slot per step, not per command439cc51
  • loreepic_delete over MCP, detaching quests and folios5699449
  • lorerelease detail page (#1559)a2deea1
  • loreMCP release tools (#1558)b6be121
  • lorereleases list page (#1557)5f68e8d
  • lorechangelog derived from the release contents (#1556)4e55784
  • lorerelease progress rollup (#1555)b37254d
  • loreReleaseContentService, one answer to what is in a release (#1554)fd794f9
  • servera credential on ClientScope, honoured by registry and callsbd318e8
  • loreattach quests to a release (#1553)8beeb78
  • server$client resolves against a remote Alepha app6898bf4
  • loreattach epics to a release (#1552)dddd045
  • lorerelease planning fields, tag and target date (#1551)87fc7d6
  • queuea due-time delay tier for Redis, so it stops declining delayse9b4177
  • security$owns chains its hops, and QuestCommentController needs ita8d1526
  • lore$ownsProject, the project rule stated once instead of sixty timesdc28cc2
  • security$owns reads its id from the query or the body, not only the pathc6c07a4
  • security$owns can hop to the row that actually holds ownershipccef99a
  • lorean owner can take an invitation back, and a failed read says socf174b2
  • api/jobsdelaySeconds on the dispatch interface, and real backoff1b23a7a
  • api/jobsinline, run the handler and hand the caller the outcomecf85d4c
  • sigilbrowser and OS, stamped beside deviceffc59df
  • lorean apps inventory, reachable from the crumb that used to be dead text1b8b0f0
  • lorean app can be renamedded61fa
  • lorevitals by page, the half of the tab that is actionablec87a3f7
  • lorethe analytics overview, Umami-shaped8a14eb9
  • lorea leaderboard's detail page, and the loop back to a filtered overviewfabd4f5
  • lorethe app dashboard answers what this thing is, and costs nothing5c232e6
  • lorevitals reports the range the histogram supports, not a boundary1d924ed
  • sigilan app reports the config it is actually running7761fc4
  • loreinsights takes dimension filters, and answers one dimension at a time6419371
  • uithe folio editor reads as a page, and Preview agrees with Edite097173
  • devtoolsshow the framework and app versions, and stop conflating themaca0fbc
  • lorelet any project member create and manage epics3877f6e
  • api/notificationsfilters, live preview and row actions in the admin3518a77
  • lore/kanbanwire the board component to every Kanban v2 changea240098
  • lore/kanbanlet a column declare which lifecycle state it maps toae299e9
  • lore/kanbanage cards by time in column, never by updatedAt23f79e7
  • lore/kanbangroup the board into swimlanes by area or epic1b1ce4e
  • lore/kanbanremember board filters, and add search, mine and due8a30ff0
  • lore/questsreopen a completed questae6840b
  • lore/kanbancompose a card inline at either end of a column06f14d4
  • lore/kanbanrank cards manually with a lexicographic boardRank3a3c2b9
  • lore/questslet a due date be set, from the form and from MCPd5167c3
  • lore/questsassign a quest to another member6a2c382
  • lore/kanbancolour quest tags on cards and give the area its dot5f2a498
  • lorereplace questsViewAtom with project.defaultSurface179bf37
  • lore/kanbanopen a card at /kanban/:shortIddd61cad
  • lore/kanbangive the board its own route and sidebar entry523e3a8
  • uidraw mermaid sequenceDiagram fences as themed diagrams8d9656d
  • api/notificationsdelivery hygiene, receipts and React email templates04facd5
  • websocketenforce maxConnectionsPerUser on Cloudflare too8a53fe0
  • commandadd an exclusive option to $commandb3a0f60
  • sigilshow where an enrolled app actually livesb5e193d
  • sigiltell readers from crawlers in Insightsa1f919d
  • sigilpublish, behind one export path instead of fourteen55c4093
  • commandhonour the -- terminator and add --no-flag negationb557aef
  • api/usersadd two-factor authentication with TOTP and email codesf0496a0

Bug Fixes

  • loreshow the release tag on the trigger, not its database iddd85c0d
  • clirun the DROP TABLE guard on every check, not once at generate12eaab5
  • serverstop HttpClient logging bodies verbatim, and paying for itf6d9f15
  • loregive the kanban area and tag filters their leading icons55e22a7
  • uilet the DetailLayout content column shrink horizontally571700e
  • loreshow a reporter their own attachment in the edit drawerda73f0d
  • ormroute both count paths through handleError6ec34ba
  • uiadmin user detail issues no request with an empty iddbf99f1
  • uithe count on an active segment keeps its contrasta6c7334
  • commandverify an exclusive claim after writing it4bf192b
  • ormunwrap D1 statements before handing them to batchb73e39b
  • server$.fetch keeps its scope, and a registry keeps its prefixe034842
  • emailrefuse header injection, not just reserved header namesb5c1691
  • api,cachethe DCR rate limiter cannot silently disappeare8e9565
  • clithe changelog can see a breaking change declared in a bodya152131
  • serveran outbound HttpClient no longer registers an HTTP listenerf81df08
  • lorethe completion dialog fits the viewport whatever the objective countdf320a9
  • lorea tree rename survives the editor's next savec9389ba
  • loredelete the rail's Questline row, which said only "Unlocks"0485b68
  • lorea long commit message stays inside its rail cell25cc415
  • loredress the editor's find panel as Lore chrome798a0a2
  • loreTab indents in the markdown editor instead of leaving it8f1b91e
  • loreCmd+D in the folio editor duplicates the line, not the folio6f7fdb9
  • devtoolsrelative times read the injected clock and refresh34a7ba7
  • securitythe memo spec added a security -> server/links cyclefb2e744
  • bayan app survives a reboot, and removing one uninstalls it583ed59
  • api/jobsbound the sweep batch, and give redispatch-stale a way outa4d7009
  • lorethe empty folio state keeps the shortcuts it advertisesfd0be4c
  • servera client the parser cannot place is called unknown, not Chrome on Windows3a73c91
  • lorethe /account area speaks French tooeea39d0
  • lorea failed save says so29c06b6
  • lorethe epic page shows the same status chip as everywhere else60e3e3a
  • uino hooks below a return, and a lint rule that says soea7847a
  • api/analyticspin the Analytics Engine slot map instead of deriving itb9f253d
  • lorea CSV import may only name people already in the project5e3b94f
  • lorerefuse a protection flip that arrives without its content9468dd1
  • devtoolsmove the dev UI off the benchmark's port, and check the band343dd6e
  • sigilstop the feedback button shipping tokens and a fingerprint994437d
  • smsmake the local outbox directory configurable, and read it in devtoolsaf37c06
  • devtoolscursor the log tail on a sequence, and drain burstse1bd8ec
  • uistop keying id-less table rows with Math.random39bee05
  • uilet the schema decide whether an object can be cleared6a674c0
  • uihide the Joined column by default, as its comment says4990b5d
  • reactrender crossorigin verbatim, and render links at all1369e53
  • systemcreateFile reports the file's mtime, not the clockbcaac6a
  • systemkill the process group, not just the shellfbd09d0
  • commandparse .env with dotenv's grammar92ab28c
  • systemmemory fs records a call only once it succeededbd0d227
  • clidev server fails fast on a taken port, and coalesces retriesa004a75
  • platformonly a 404 means "no secret store"8d47b35
  • api/jobsone sweep table, one staleness clock474fb51
  • api/jobsclaim the schedule instant, not just the job namee04c704
  • cacheincr() now applies the container defaultTtl0625390
  • websocketupdate the RoomManager spec for the removed readersdbdea9a
  • emailexport the two new services from the workerd barrela730f2e
  • loreregenerate the notification migration after merging main again684ab79
  • lorestop ordering the board by a text enum, which inverted prioritycb805ec
  • lore/kanbanwire the settings drag handle to reorderKanbanColumns3977736
  • lore/kanbandrop shelved quests from the board instead of advancing them4783ffa
  • ui/adminstop the profile form toasting an error the toaster shows0054192
  • corestop a logging option deciding what a failing hook throwse9cbebe
  • fakegive each provider its own faker instead of seeding the global76a4d1a
  • cacheone key contract for all four providersae3b308
  • api/oauthtell the truth in the metadata, and bound registrationc47c181
  • captchamake Turnstile read the whole siteverify answer01d78b4
  • serverkeep credentials out of the request logsaf30dd7
  • serverlet an explicit Authorization header beat the session cookiecb28eb9
  • servermake helmet's default CSP reachable and its off switch real469f4bb
  • react/formkeep an edit that puts a field back where it was273dfe7
  • websocketmake schema.roomId real, and drop the path optiona8a6113
  • mcpgive a non-object tool result a structuredContent it fits inb9bb5b0
  • api/filesmake a storage handle an actual boundary5e4814b
  • api/workflowsrestart from the stored row, not from the caller5cd5d89
  • api/workflowsgive a retried timeout a deadline it can meet7a6bdc1
  • bucketgive the local disk the name a file was uploaded underab9809d
  • cachestop two containers sharing a slot on Redis and KVeae8a08
  • corestop calling a defaulted field required5c4fa7c
  • reactanswer 404 from an app's own catch-all pagecb4ac6d
  • api/users,uistop offering a second factor the login gate ignores53c18f1
  • bayjudge backup staleness against the schedule that is runninge97890d
  • baystop two instances sharing one unix user2cf02f8
  • loreone owner for what a quest transition does to the sidebarf4550df
  • lorehonour ?dir= on the folios route, which two producers already buildd7409df
  • lorelet a broken wiki-link reach the DOM, so its hover card can existf5cdab6
  • loreno folio menu entry opens and does nothing any more6ca1b95
  • loreone invite hook, and put its toasts in the catalogce5b7ca
  • loremake the view bar on a quest detail actually go somewhere869bd61
  • loretell the feedback list when the quest sheet closes, not only when it submitsef5f013
  • loreenforce the three project caps that were only ever declaredadead89
  • loremake the folio namespace the rule it already claimed to be9be0f2b
  • lorestop the CSV export from handing a spreadsheet a formula48054da
  • lorereclaim a folio's attachments instead of stranding them5cf6b2f
  • sigilhold the server reporter off outside production885883f
  • sigilsplit the batch, and keep the page alive only on the way out9f3d25a
  • sigilfile each web vital under the page that measured it18759e4
  • api/paymentsstop a partial refund from undoing the whole saleacf7778
  • api/paymentsmake the confirmation page keep its own promisedfde5ab
  • uitranslate the job and workflow execution statuses788703b
  • uilet the admin and account shells follow the language83ba259
  • ui,reactlocalise the account kit, and make tr() defaults interpolatefdc6e37
  • uisync --check reported formatting as drift, so all 47 files driftedcc6d315
  • react/formdeclare POST, so a pre-hydration submit cannot leak fields into the URLe70220d
  • uisync clobbered nine local divergences, then died on its own output35d7078
  • uiautoFocus was documented on the controls and dropped on the floor8dfc7b0
  • reactan optional object was submitted with defaults it never got3184dc8
  • reactthe sitemap listed nested pages at urls that do not existe2c5a46
  • reacthtml lang announced English on every localised paged5ffa9b
  • climulti-app dev never told its children which mode to runb039e20
  • datetimetravel() lost short hops and kept intervals for goodaa805b8
  • lore/version reported the string "undefined"6e99975
  • routera route's param names are its own again9d35143
  • corea log listener that throws overflowed the stack6154c7e
  • ormpaginate() counted without the joins its where clause needsbb6532c
  • ormaggregate() turned every min and max into a number5085866
  • server/authone redirect validator, and a replay guard that runs76bfc8d
  • api/oauthdevice user codes could be guessed without a ceilingb3408f8
  • api/usersadmin deletion skipped the user:delete:before hookd7289f7
  • api/usersadmin update accepted realm and organizationId328b332
  • api/usersOAuth sign-up marked every new account emailVerified70c3dac
  • locka Redis release could delete the next holder's lock58a3642
  • securitya realm-less permission check scanned every realm80d6992
  • lore/mcpquest_list floored its offset to a page boundary823784c
  • bayenv files and systemd's EnvironmentFile disagreed on quotingf1c33b1
  • lore/foliosauto-lock left the editor believing it was unlocked9ade8b5
  • lore/queststwo mounted attachment rows both uploaded a pasted image0940dc4
  • lore/uiarea settings kept the previous area's state after a merge04ca03a
  • sigilone stamp per batch collapsed N visitors into the last oneff4e62b
  • reacta post-save refetch wiped edits typed meanwhile742f2d8
  • uiarray item inputs snapped back to their mount value330279e
  • reacta superseding keyed query joined the request it had just abortedf72fcc1
  • protobufz.integer() was emitted as int32, so large values wrapped320d695
  • clidb commands advertised a path argument nothing read23e7193
  • securitya $role declared before its $issuer was silently droppedd0de0e6
  • ormcreateDeep through a many-to-many overwrote the child's primary key5b23436
  • orma null relation filter was silently dropped, and guards were swallowed on write629bf88
  • captchathe accept-all memory provider was the production default1c0106a
  • server/corsa rejected origin still got Allow-Origin and Allow-Credentials517b20d
  • server/rate-limitnested run() calls shared one ip:unknown bucket17f6172
  • cli/inittreat Windows shell metadata as an empty directory79d2902
  • serverrequest.ip trusted the leftmost X-Forwarded-For entryc6034f4
  • server/etag$etag inside run() bound to the outer HTTP request70726be
  • lore/mcpproject_list told every member it owned the project2866f27

v0.27.0

Features

  • loresize quests on a 1-5 t-shirt scale0f4b461
  • lorefile folios under epics over MCP1e3dff1
  • clireplace Biome with oxlint and oxfmt7a0d7c8
  • api/usersshow when a session was last used, not just when it starteda12f9c7
  • loresplit the dashboard header and drawer the Add-card panel154922c
  • uidraw mermaid flowchart fences as themed diagrams5d41632
  • ormbound D1 queries and support the Sessions API3522e85
  • uilet AlephaTable take static databc02a7c
  • loremake the MCP surface safe for a second pair of handsd6ee29c
  • loremake the signed-in landing page a dashboard98839ca
  • loregive the estimate input a custom unit and tidy the create menu2189685
  • loreput the quest id in the table's title cellc183bcd
  • lorebring the quest log back to the quest detail routed08c88d
  • lorerebuild the quest view on the mockupbb926bd
  • loremake the quest's blocks collapse on one patternadf1ef0
  • lorerework the quest rail into a full-height bar62437f2
  • loregive the discussion one column and one rhythmd24179e
  • lorerebuild quest attachments as named chips with a viewerbfccfa1
  • loremake the shared markdown editor usable as a plain field106f6a6
  • loregive quests an optional due date8f79803
  • lorewiden quest attachment types and name them over the APId4969b6
  • loreput the epic's number in the breadcrumb, not its title7f3733c
  • loregive the quest log's argyle lattice its stylesheeteb0c74d
  • lorelay the mockup's dot grid over the content area25ff0b0
  • loreadd the strings the reworked quest view needsd08e691
  • uilet AppShell style its scrolling main3bcb86f
  • uigive AlephaTable a page-size picker and a sortable-column affordanced029589
  • uigive Badge a tint variant and a tone axis8fe2638
  • uibring the epics list and the questline dialog onto the quests table's shape761424b
  • lorereplace the epic flow graph with the questline map6369435
  • lorewiden the feedback list panel to 380pxf9d8ab0
  • loreput the quest id on the title and make it a real anchora58d126
  • lorelet agents read and write a quest's discussion over MCPbfe71e4
  • loreadd the comment composer, with @member and #quest references4644d8b
  • lorerebuild the quest timeline as one Discussion feed7324f54
  • loreadd quest comments, the Discussion's transport14e4f63
  • loregive the quest page a metadata rail and dissolve the action bar448808e
  • loremake the quest detail a full-width page1eb7a16
  • loregive the quest view a back arrow and two section setsdbd22f2
  • lorekeep the epic badge live after a mutation300067d
  • devtoolsrun Try It as the session, and keep logs across a restarta9c7e92
  • lorebadge the planned epics in the sidebar1bdc3d7
  • loreput the quest estimate behind a project toggle, off by default3326e90
  • lorerebuild the Epics surfaces and make wiki-links work on every elementf903601
  • ui/adminpark the built-in nav in a 1000+ band, add a dashboard at /admin70160b7
  • lorecarry area descriptions over MCP119a8f4
  • lorerework the areas settings list with real stats and bulk mergeed972db
  • loreadd the Area detail page3d4af04
  • loremake areas the single source of truth for quest areas9e8336e
  • loreadd AreaController, the HTTP surface for the new area modelde5dd0a
  • loreadd areas entity, AreaService, and backfill migration81122db
  • react/headlet a meta tag carry a media querydcb7dcf
  • loreadd the Epic detail page and its dependency flow737deb9
  • loreadd the Epics feature flag, list route and page5f26c28
  • loreexpose Epics over MCP and un-gate quest_listc704c82
  • sigil,lorereport referrer, arrivals, engagement, campaign and devicec41ca0b
  • loreadd EpicController for CRUD, status lifecycle, attach/detacha3d955c
  • loregate planned-epic quests out of the backlog listingsc1b487f
  • loreadd epics entity and epicId foreign keysd995a70
  • react/routeranswer browser navigations with HTML error pages5e12817
  • cliadd dev.port, bind it strictly, and fix dev with CSS modulesc497b37
  • cliflag secrets pushed before the last env edit, and say a deploy is needed079940b
  • platformwrite placeholder blobs on `db export`6f3c1d3
  • platformhonour `secret: false` when pushing Cloudflare bindings18efd6d
  • loredrop the folio TopBar, and remove folio tags entirelydc49479
  • reactgive every page its own canonical URL, og:url and twitter:url267eae3
  • loreseat the quest view on the page, and move #id onto its title5b435a7

Bug Fixes

  • api/workflowspublish a step's AbortController before the row says runningfebcafe
  • ormsqlite could not introspect its own case-insensitive index448bf6a
  • uiaccount cards were shaved by their own scroll columnbc89c8d
  • uithe settings rail's active entry matched nothing93455af
  • uisettings cards had drifted into four different edges1b6af5f
  • clireport database command failures without a stack traceac7d142
  • clia stray word on a leaf command was silently ignoredf1735bd
  • reactstatic assets were cached for 3.6 seconds, not an hour5b17801
  • uisettings cards drew a doubled edge next to the form card5aa7dbf
  • ormsqlite schema push was silently applying nothing02fa166
  • clistop the linter from rewriting the project's dependencies47ac5c7
  • devtoolsrender structured values as JSON, not [object Object]fe1c810
  • reactstop rebuilding accumulators inside loops8b3b9f3
  • websocketdecode fragmented frames instead of stringifying the list94b63d4
  • reactkeep parameterized pages out of sitemap.xmla26b464
  • climake a freshly scaffolded project work under yarn and pnpm842de36
  • lorestop the folio request-count e2e counting telemetry42617bd
  • lorerepair the milestone e2e the i18n sweep broke, finish the sweep514391d
  • coreread an empty env string as an absent structured value1e84a7a
  • loremake the section breadcrumb link back to its list3aa2a04
  • loreassert the token prefix by its rule, not by a fixed sliced5ba9a1
  • baystop an unreachable data root from reading as a readiness timeoutb89a7fd
  • platformlet the deploy name the artifact it packs7c534a1
  • uigive tooltips a classic open delay802d97e
  • loresurface a closed state on the feedback request form9bb7240
  • uireturn a stable singleton from useToastfdb2b2a
  • loreclose the area-rework's remaining review findingsec1235f
  • loreresolve e2e fallout on the areas settings row and its security spec39475b1
  • loreretire projects.areas, the last dual-write area sourceff52838
  • lorebound each area's description in the MCP payload9bc3748
  • lorefix the areas $action name collision and markdown/i18n bugs review foundff6fef9
  • loreforce-reload the Area detail page after a plain renamea8156c2
  • loreregister the area on the CSV upsert-import branch too59e51e1
  • loreregister the area when a quest is edited onto a new oned6301d6
  • orm,mcpmake a failed relational read diagnosable18d7099
  • lorestop deleting code from Markdown quest fields4499ef2
  • loreforce-delete merged source areas so their name can be reused8c51a71
  • lorerebase the epics migration onto main's sigil-analytics one7fddf0b
  • lorestop the backlog gate from hiding a planned epic's quests everywhere but the UI3fd560a
  • loregive Epics its own settings sub-page71422ff
  • lorefilter an epic's folios server-side and guard reload failuresdb0e91f
  • loredrop the epics list's status-transition column, use shared feature toggle12e6ec6
  • react/routerrestore scroll on back instead of jumping to the topb95e4e1
  • loreclose partial-write window on refused epic attach/detacheadc864
  • loregate EpicController.deleteEpic on quest:delete, not quest:created9f5600
  • loreexempt completed quests from the backlog gate in Reports40f1c58
  • react/formreplace the literal NUL byte in useFormQuerySync with \u0000c7e0902
  • loreuse --target=docker in build:docker and correct the --keepSql commenta293167
  • cliframe the init wizard's questions and trim its sign-offac52fd6
  • reactshow the auth slide in GettingStarted again0daa9e5
  • clihonour an absolute path in `alepha init`47f88c9
  • api/usersrefuse a realm that needs codes it cannot send74f67e9
  • api/parametersskip the ready preload under multi-tenancyc8ce820
  • ormstop paginate leaking an unhandled rejection when count scoping throwsaac3ef2
  • loremake the project switcher's rows real anchorsda0ee5b

v0.26.0

Features

  • lorecollapse the quest log, cap recent projects, and strip the folio header6f99d72
  • uimount the account area, and fix what the back office exposed88340ab
  • api/paymentsmake sweep cadences configurable, default to */151fa582e
  • ui,apifinish AutoForm's settings-card layout, and fix what adopting it exposed356bbd0
  • cliwire create-alepha to ask.choice/ask.confirm, drop dead Asker injection302d302
  • commandadd ask.multiChoice and the selection parser to Asker88646ed
  • lorereplace MDXEditor with a View/Edit markdown surface039d62f

Bug Fixes

  • clirewrite workerd chunks through the AST, not a regexdc6047d
  • uistop Segmented's thumb sitting one border-width off its segment33d2b20
  • devtoolsstop an unrepresentable atom schema breaking the whole UI3c81eab
  • climake pnpm scaffolds hoist the bundled toolchain19ef91b
  • uimake the account area work inside a clipped app shellee539e9
  • core,orm,cliclose the five defects a 0.25.2 release rehearsal turned upa5d3c63
  • ormrefuse to boot in production when entities have no migrations3fb97ae
  • cligenerate a baseline migration for ORM presets at init4cf4a44
  • cli,react,server,uiclose the gaps a two-preset init audit turned up6e09a2f

v0.25.2

Features

  • core,serverread env vars from aliases, and SERVER_PORT from PORTfe81013
  • api/workflows,uicontext propagation, repeat steps, cancelByKey, startEach, WorkflowTestKit64ac668
  • uishare one header-actions cluster, and give the account area a header00b2a53
  • cliadd --preset=saas to init065ef43
  • api/workflows,ui,api/paymentsresurrect the durable workflow engine, dogfooded end to end3eb1f94
  • ui,api/usersadd the account module, a user-facing counterpart to admin28bba64
  • systemattach files to a folio and export it as a zipc2462e7
  • ui/admin,apiname users on admin pages instead of bare UUIDs0085575
  • uiaddress projects by slug at the URL root8222c09
  • api/analytics,uifold analytics into alepha/api/analytics with an admin explorer2436b61
  • ui/admin"Add API key" toolbar action with one-time token reveal718e0bb
  • ui/adminopen three host-page seams on the admin shelled797a0
  • orm,cryptodefault primary key is an app-generated UUIDv7e241b37
  • uigive every table filter select a leading icon47986a2
  • systemprovider parity, structured shell results, memory-default tests405f20a
  • lore/admininstance-wide projects page0a5f04a
  • ui/adminadd adminPage() helper, migrate shop onto it173ed2f
  • loremigrate /admin onto the shared AdminRouterd7249bb
  • mcpclose out the module review — templates, streaming, stdio3ebcb93
  • ui/adminadd AdminRouter mounting the whole /admin surface1c18841
  • uiadd AdminLayout shell for AdminRouter6730e02
  • ui/adminadd AdminRouter boot-time options atom26cc480
  • ui/adminadd default export to admin-payments component42fd23c
  • loreprofile safety rails, feedback-form rework, and the App page79991ae
  • uia dropdown menu sizes to its content, not to its triggerfc631ed
  • platformauto-provision Cloudflare Analytics Engine through platform up3dbb3b9
  • uione select for every list, and the count only gates the search65baeac
  • lore⌘K switches projects off-project, and the header sheds its boxf45ceb7
  • uiweld AlephaTable's pagination row into the table paneleeb02a8
  • loreInsights states when its numbers are sampled estimates8d1e66c
  • loreInsights reads views and vitals through $analytics701d64f
  • lorerecord sigil views and vitals through $analytics alongside the existing tablesa09b880
  • api/analyticsthe hourly rollup and prune sweep2647e45
  • api/analyticsthe Analytics Engine provider and the workerd entry0b62aa7
  • api/analyticsthe $analytics primitive and its modulea3fc9be
  • api/analyticsrelational provider with raw and rolled tiers4435d8e
  • api/analyticsderive raw and rolled tables from a dataset descriptor53d92e1
  • api/analyticsthe provider seam, query types and the memory providere1b6868
  • api/analyticshour and day bucket arithmetice9db15e
  • lorethe folio title wraps, and the toolbar joins the documentb715018
  • api/analyticspackage scaffold and the Analytics Engine slot map31c3cb2
  • loremove the Quests view rail to the far left of the content area3bcab21
  • lorelive wiki-links in the folio editor, and file drops in the treec57d48b
  • loreuploaded files are back in the folio workspacebea2301
  • ormupsertMany, and vitals stop losing samples to a read-modify-writef3673f1
  • lorethe sigil analytics tables stop growing forever, and visitor hashes stop existing after 48h0383451
  • lorethe folio workspace keeps its menubar with nothing open, and fills the width againf7ee04e
  • lorethe kanban board is reachable again, and six smaller surfaces stop disagreeing with themselvesb4963bc
  • react/routera guarded page defaults to CSR, and guards refuse the same way on both sides11d7c60
  • lore⌘K opens search from anywhere, and the tree loses its own5beb3b7
  • loreone action that searches quests, folios and directories togetherce82d85
  • lore/folios opens the workspace, and the directory table is goneab5d090
  • lorethe folio workspace looks like the design it was built from691dd4a
  • lorethe folio panes step aside on a narrow screen, and ⌘. works8549b81
  • lore⌘F finds text in the open folio, without touching its document8b477c9
  • lorefolio menubar and toolbar rows with keyboard shortcuts1c20cc3
  • lorefolio workspace inspector — outline, history, links, pinned budgetf7c5182
  • lorefolio tree pane with drag & drop, inline rename, searchf6a1686
  • lorefill in the folio workspace document pane66184f0
  • loremerge folio view + editor into one always-editable workspace043efdb
  • loreadd renderToolbar prop to MarkdownEditorInner803ca2f
  • loreimplement folioMenubarModel for folio editor workspace74db7cd
  • loreadd folioTreeModel, the pure model for the folio tree pane0182902
  • lorefolio editor workspace typography foundation (Task 1)63ab74c

Bug Fixes

  • systemdrop node:path from MemoryFileSystemProvidere1a496e
  • api/workflowsnever complete a workflow while a step is still running9b77cea
  • loredownscale folio images on the editor upload path toob69f3a2
  • ormemit domain events after the outermost transaction commits4090a7d
  • ui/tabletooltip on the column picker, and chrome that reads in light modebbd12bd
  • uimake light-mode interaction states surface-relative8385499
  • ui/authlet password reset satisfy the captcha it is gated on90ac249
  • coreharden the kernel — parseEnv escaping, DI failure paths, env truthinessc8b7f55
  • datetime,schedulerkeep cron ticks anchored and clamp 32-bit timers14bee4e
  • ui/adminpoint AdminRouter's doc at adminPage instead of duplicating itda8e1a1
  • uiclose six review findings on AdminRoutera8d0f00
  • ui/adminthe user form demanded fields the realm never collects76e503a
  • lorefour fixes from adversarial review of the AdminRouter migration59ea5aa
  • lorewire up the shared AdminRouter (previous commit was incomplete)0c04594
  • ui/adminrename admin-router-options to .tsx, revert exports hack84a1dba
  • ui/admintype AdminRouter's action gate instead of stringly-naming it43b0b43
  • ui/admingate nav entries on action names, not permission alone5399059
  • corestop reporting a boot duration workerd cannot measure1c60235
  • api/filesbound the public-file edge cache at a week, not a year728c4b3
  • lorethe #189-#192 batch — placeholders, wiki-links, and the palettec50824c
  • cookiesthe browser and the server disagreed on every shared cookie namedb5d10c
  • react/routerapply the SSR payload before the first start hook807e0d4
  • lorethe #180-#188 UI batch — four mechanisms, nine reportsaf95028
  • api/analyticsGROUP BY takes a column name, not the expressionf16d875
  • api/analyticscount() takes no arguments on Analytics Enginef922de3
  • api/analyticsdeclare the prune-floor table on every runtime, not just workerd1940286
  • api/analyticslook the binding up by its own name, and expose the dataset at runtimeb85fe8d
  • api/analyticsrename the read token and quote the dataset name in FROM31577f7
  • lorerestack the analytics migration after main's34f68c9
  • api/analyticsscope the prune-floor table to WaeAnalyticsProvider onlyf9fedea
  • api/analyticsgive WaeAnalyticsProvider a durable prune floordfaa30c
  • api/analyticsnumeric dimensions on WAE, drop count aggregate, close validation gaps0245b5c
  • loredrop Radix-era CSS variables that resolve to nothing39a1952
  • uia collapsed sidebar's nav group is a dropdown, not a dead buttonc035c1a
  • api/analyticsrollup() had the identical raw-name splice as readOne, and the conformance suite's single-word fixture let both ship97aa548
  • lorethe board truncates at the column edge and the view switch moves up5058a30
  • api/analyticsresolve dimension/measure names to real columns in OrmAnalyticsProvider.readOneea9d75b
  • loresigil-jobs.spec.ts asserts against the store it actually sweepsf599e6a
  • loreFK sigilId in analytics datasets, isolate the dual-write25661ac
  • api/analyticsmerge Analytics Engine and cold on the read sidedf50d06
  • api/analyticswarn on unwired retention, reject cold<hot, isolate sweep failures5f290e6
  • api/analyticsforward Analytics Engine rows into cold before folding them333afb2
  • api/analyticsmake WaeAnalyticsProvider DI-constructible so it can be auto-selected264987d
  • api/analyticsreplace a stray NUL byte with a space in FakeAnalyticsEngine7d78e56
  • api/analyticsvalidate the dataset name in $analytics, pin registration orderingcdf4e0d
  • api/analyticseager dataset registration, reserve day/hour dimension namesd442dda
  • api/analyticsreserve time_bucket instead of bucket, guard column collisions83a3a20
  • api/analyticsdrop min/max, fix prune's tier scope, sharpen conformance suitea403a4e
  • api/analyticsescape composite grouping keys, cover count/min/max, fix JSDoc style5bc7a5e
  • api/analyticstype imports, tsconfig, error messages, and measures cap test15a4793
  • lorepicking Kanban no longer traps the project on the board22d7593
  • uia clearable Control keeps its clear label in full contrast44bff3d
  • react/routerstop importing a CSR page's component on the serverffa6521
  • security$secure checks permissions in the browser, and a denied page stops rendering04f9e86
  • lorefolio workspace chrome, from the first round of reviewf33d4b8
  • lorea folio you have not touched no longer claims unsaved changesec11275
  • loredeclare @testing-library/react, which lore's browser specs already importb069867
  • lorelet the editor keep ⌘B/⌘I/⌘E/⌘Z/⇧⌘Z/⌘K instead of intercepting thema334279
  • loreinspector round-2 review — revert no longer marks live edits as Saved1047b10
  • loreinspector round-1 review — outline unit tests, blob link fix, revert double-fetch0ef2595
  • lorethree review round-1 findings on the folio document paned76b705
  • lorefour review round-1 findings on the folio workspaceac43c09
  • lorefolioFindMatches must return offsets into original stringf1d7df7
  • loreaddress round 2 folio-menubar-model findingsde645f2
  • loreaddress folio-menubar-model review findingsee47177
  • loreexpose cycle-rewritten parentId so drag-to-root repairs it7659552
  • lorebreak parentId cycles in folioTreeModel instead of dropping them2ac864d
  • loreTask 1 Round 2 – correct subsetting: latin + latin-ext onlyd628a02
  • loreTask 1 font fix – variable fonts + unicode-range subsettingdda8a70

v0.25.1

Features

  • loreenrol an app through a dialog, not a project-wide Capabilities cardd88477a
  • loregive features.feedback its own settings page28f570c
  • loreeach app gets its own capability switches on its Settings tab56a1efa
  • lorethe sidebar hides Apps at zero, collapses past five, and derives Blights from enrolled apps213d647
  • lorethe per-app page URL carries the app's name, not its idc202040
  • lorea sigil's kinds can now be updated after creation31dee20
  • clisecrets ride the deploy, so an app never boots without themdfbcd5a
  • baygive a remote caller a way to set an app's own env, on stdin9a314c1
  • loresurface sigils as an Apps sidebar section with a per-app page858c77c
  • lorereshape sigils from app+environment to a single name9cfe583
  • loredrop the outpost, artifact and deployment tables6a9b7fd
  • clideploy to Bay over ssh instead of an admin panel03ab985
  • bayread the deploy artifact from stdin with -3e5ff4c
  • cliadd host to the platform environment config3001a04
  • systempipe stdin into argv shell commands9c6262f
  • protobufpublish @alepha/protobuf72e238d
  • protobufrestore @alepha/protobuf, on zodc59711f
  • clitell the agent about the devtools APIc9230e7
  • cliplatform push, and --tag on up and deploy57aa558
  • mqtt,uipublish @alepha/mqtt and @alepha/ui to npma871f0d
  • cliLoreAdapter deploys a tag, and reuses a pinned one rather than rebuilding itcfb01bd
  • loreartifact + deployment endpoints, legacy release path preservedb4c80a0
  • lorerebuild the Milestones page as a ledgere29d9c3
  • loredeployArtifact — one artifact, many environmentsbeeebd7
  • loreArtifactService — latest replaces, pinned tags are write-oncea5ab43a
  • loreartifacts entity, keyed on app+tag rather than environment10ad70a
  • baymint an x-request-id, so Bay's logs and the app's can be joinede73cd55
  • cliship a static site the framework did not render, and let Lore deploy one4ccc08c
  • bucketBay hands apps a bucket, and owns APP_NAMEbd30b2e

Bug Fixes

  • loresay when a per-app Feedback switch has no effectdb9ca96
  • lorekeep the blights inbox reachable after its last app goes1d1589b
  • loregate the blights e2e's inbox visit on features.sigilsc96a22a
  • lorepoll server state instead of an optimistic switch in the sigil e2e9ec4e13
  • loreturn Feedback on through its own settings page in the sigil e2e7f872af
  • lorea Beacon toggle left the analytics atom stale until a reload9499f9d
  • loreblights, beacon and vitals gate on the sigil's kinds alone84ae74a
  • loreconstrain app names to a URL-safe slugb9014e9
  • uia searchable select could be set, but never clearedac624fe
  • clian answered prompt kept stdin open, so the command never exited92ee7ab
  • api/oauththe refresh_token grant authenticated nobody8e688b5
  • api/usersthe login lockout was disabled on Workers, and fail-open besides2655ec3
  • cliBay could not take a secret from CI, where there is no .env filef7cd6ca
  • baythe Bay-owned refusal read 'owns that key and writes them itself'd7fdd2e
  • cliBayAdapter pushed no secrets at all, and said nothing about it3f13f43
  • clifour review follow-ups from the outpost-purge / sigil-apps plane45e2fa
  • loreclear review minors on the Apps page167eb83
  • loreretire the per-environment wording from the sigil UI copydc7b254
  • climake the Bay pre-flight actually reach the control socket2dcce30
  • clifix control-socket misdiagnosis, add --control-socket supporte8a4f4c
  • uimake the shadcn sync actually write files, and refresh the primitivesafdd0cb
  • apistop racing the wall clock in the parameter TTL teste93de2e
  • lorestop $etag serving a stale body to the user who just wrote it2c85f27
  • lorekeep the wire names out of the renameefc61ca
  • clistop reporting a domain the deploy did not choose280d8a5
  • serverdrop the body on null-body statuses, and centre the error paged8c6f2a
  • cli,commanda mistyped subcommand exited 0, and openapi refused to run without $swagger34f72a1
ready
│main│TypeScript
│UTF-8│/changelog.md│