v1.0.0-beta.118
Released to production on September 12, 2026 at 00:39 CDT. See every commit in this release on GitHub
New
- Console: name the records band for what the plan has
- Security rules: refuse every CRM client write on a plan without the CRM
- Console: export and erase a workspace's people from Settings, on every plan
- API: refuse /v1 contacts on a plan without the CRM
- Console: lock the whole CRM on a plan without it, beside the shell's notice
- CRM: refuse every crm/* read and write on a plan without the CRM
- Tooling: check a push in seconds for the classes that most often reached main
- Media library: pause tenant video uploads behind release_video_uploads
- CRM: open the CRM on read-only Leads and lock Contacts without the suite
- CRM: refuse every contact edit on a plan without the CRM suite
- Video: play a Wistia film behind a click-to-play poster
- Sites: file a lead from every live form on a plan without the CRM suite
- Video: own player controls in the lightbox, so Escape closes it from every stop
- Besigner: a Screen Link can target a content collection's listing page
- CRM: open the CRM to every workspace and name its flag release_crm
- Marketing site: the Datasets product deck, with job openings as its sample data
- Monitoring: dispatch the canary from a GitHub App, not an expiring PAT
- Media library: let replace swap a PDF, a film or a document, not only an image
- Monitoring: run the edge sampler in GCP, with no stored credential
- Video: serve the renditions the producer makes, by asking for them
- Releases: tag a release that shipped without one
- Monitoring: wire the outage alerts to a second route off the mailbox
Fixed
- Tests: the besigner spec drives the row menu and a divergent save
- Tooling: refuse to serve a worktree whose node_modules links out of it
- Legal: date the Meta Pixel row by its change-log entry
- Console: give the Privacy settings route its payload entry
- Media library: build the DAM search magnifier once, not per render
- UI components: a help tip follows its content, so a late excerpt cannot push it off screen
- Sites: a social card's dimensions follow the asset, not the pick
- Tests: write the private-port emulator config beside the rules it names
- Besigner: the canvas and Preview reserve a replaced image's box from its asset
- CRM: answer an ID-token outage 5xx, not 401, from plugin server handlers
- Media library: count CDN deliveries per caller, and refuse past a measured ceiling
- Media library: stream CDN deliveries rather than holding each file whole in memory
- Pricing: re-extract the /pricing frames and reconcile the paid-only CRM rows
- Sites: file a lead only from a routed form, whatever the plan
- Tooling: new-worktree copies the tenant's .env, where its Firebase config lives
- Tests: the emulated dev servers hold no Stripe, Vercel or Resend credential
- Tests: grant the seeded org release_video_uploads, so the DAM e2e's films land
- Tests: the page connects to the emulators its server was started with
- Console: preview draws a replaced film from its asset, not its pick
- Besigner: the canvas draws a replaced film from its asset, not its pick
- Datasets: index values.email so updateDataset's lookup can run
- Legal: hold the brand baseline to the reworded Wistia reason
- Tooling: exempt the pre-push suite's synthetic ids, and fail a push citing one
- Legal: word the Wistia inventory reason without the product brand
- Commerce: write the gated player's abort note in American English
- Commerce: expire a paid download's link and keep its file private
- Build checks: count the Wistia note's two company-name mentions in the brand baseline
- Console: name the links to a collection's listing before it is deleted
- Media library: a placed image takes its intrinsic size from the replaced asset
- Console: prune the multi-tab records the Firestore SDK strands in localStorage
- CI: run Main Gate's guards even when typecheck or lint is red
- Commerce: expire the gated video's delivery link and keep its file private
- Billing: name the CRM suite row as /pricing does
- Console: scan a component's Link property default for where-used links
- CRM: ask the permission catalog for data.manage, not resolveOrgPermissions' map
- Console: answer 500, not 401, when a shared helper cannot check a token
- CI: lint with --quiet and grade the log, so a red lint prints its error
- Legal: declare the Wistia embed host in the egress inventory
- Security rules: refuse a lead's delete on a plan without the CRM suite
- Video: a placed film takes its length, shape and poster from the asset
- Media library: a published reference renders the stable URL, so a replace reaches it
- Documentation: name the Assist helper without the product brand in its evidence
- Documentation: cite the subprocessors page by path, not by Aglyn's hostname
- Video: let the lightbox film shrink so a short screen keeps its controls
- Scripts: point the activity guard at the lead conversion writer and run it in CI
- Security rules: a client may only remove a contact's consent entries, never grant one
- API: refuse a contact's suite fields over /v1 on a plan without the CRM suite
- Security rules: a contact is created by the server, never by a client
- CRM: move every write to a contact's facets behind the CRM routes
- Console: show Assist readers fixed copy, not the model provider's error text
- Media library: stop counting a media CDN HEAD as a full-size serve
- Accounts: log the link-mint throttle as a throttle, not an internal error
- Console: a folder or SSO 5xx answers fixed copy, never the thrown message
- Console: answer 401, not 5xx, when any console route gets a refused ID token
- Sites: write form records only where the page signed, not where the body says
- Documentation: stop telling customers Aglyn Assist is rolling out when it is live
- Console: load plugin field types before a console record write validates
- Sites: load the datasets a page repeats over, not the first fifty the site can see
- Security rules: the CRM suite's collections ask the plan on create and update
- CRM: lock the CRM suite's actions on Contacts for a plan without it
- CRM: refuse the CRM suite's routes to a plan without the suite
- Sites: render a repeat's first records in editor order, not an id sample
- Billing: measure dataset warnings against the limit a create is refused at
- Console: offer only datasets the site can see in the page-editor picker
- Console: refuse an unstorable media sharing choice, and guard the widening
- Data: refuse a sharing choice the dataset cannot store instead of widening it
- Sites: record a dataset step that saved nothing as failed, not saved
- Workflows: offer every current dataset in the Actions dataset picker
- Marketing site: say which plan limits refuse and which meter, and who owns datasets
- Console: say pages past the publish cap catch up within the hour
- API: describe /v1 write bodies, deletes and creates the way the handlers answer
- UI components: a locked hub section names its lock to assistive technology
- Tooling: keep the renditions an earlier run made when --webm adds one
- UI components: a locked hub section is laid out like every other tab
- Tests: emulate Storage in the emulated serve scripts, not only Auth and Firestore
- Video: send the play beacon the collector has been waiting for
- Tooling: describe the canary's App Check secret without naming the variable
- Console: declare the Monitoring and Cloud Run hosts the setup scripts call
- Errors: drop stacks thrown wholly under iabjs:// or extension schemes
- Console: answer 401, not 500, when the edit-hint mint gets a revoked token
- Releases: verify every manual deploy target on a promotion, not only the range's
- Console: declare the Monitoring and Run admin APIs the setup scripts call
- Monitoring: describe the canary's App Check debug token instead of naming it
- Marketing site: the Explore grid's slot count follows the copy, not a fixed seven
- Commerce: send the entitlement hop to a delivery copy, not the master
- Tooling: build the alert policy names from configuration, and re-read the id ceiling
- Media library: measure the storage band when a signed replace is minted, not only at finalize
- Documentation: clear the baselined British spellings from published copy
- AI agents: resolve a screen link in the Markdown wherever its value is stored
- Monitoring: keep an unprovisioned address out of the alerting script
- Documentation: drop the British spellings from the Besigner styling pages
- CRM: log a create from the org hub to the org, not to the picked site
Reverted
- CRM: drop the read-only Leads mode built for Free
Documentation
- Releases: record AGL-2863 in the beta.118 entry
- Self-hosting: give the browser's three emulator hosts a row in the reference
- Sites: the stored card pair is the fallback, and what the card costs is counted
- Documentation: capture the Assist panel help tip, A15's flag having shipped
- Media library: say exactly which CDN requests the per-caller limit counts
- CRM: drop the claims that Free keeps the CRM's contacts from code comments
- CRM: say the CRM starts at Starter and Free has none of it
- Video: point the paused-upload note at Wistia-hosted video
- CRM: say Free opens the CRM on read-only Leads and Contacts join the suite
- Video: place a Wistia video with the Video element
- CRM: the contacts table's Set stage announces Contact changed stage
- Billing: say the bandwidth meter counts page views, not what a page weighs
- CRM: say exactly what Free gets from the CRM
- Datasets: correct validation, sharing, quota and navigation claims
- API: describe dataset endpoints, scopes and usage bands as they behave
- Brand: write down how Aglyn is pronounced, where a reader and Assist both meet it
Behind the scenes
- Site data: let the CDN response double forget a representation
- Site data: pin that a plugin catch answering 401 classified the throw
- Tooling: keep the full-access domains key's name out of the emulated-env self-test
- Console: transcribe the send-from-your-domain row the page already carries
- Tests: drive the Free CRM as locked, with the privacy door and a Starter control
- Console: pin the one paid-only CRM row the pricing page publishes
- Platform: allowlist the gated-media backfill's first-party apexes
- CRM: pin the shipped rail's plan split in the plugin, not the console
- CI: sweep every push to main as one queued unit, not an hourly debounce
- Console: give the host setup specs the real release-flag registry
- Tests: drive the Free CRM as read-only Leads with Contacts locked
- Console: pin /pricing's view-only leads row and the suite row with contacts
- Console: prove record writes load plugin field types without importing an add-on
- Console: declare the datasets banner as an indirect quota surface
- Console: give the email properties spec the scope tokens its picker reads
- UI components: run the hub rail spec, so check:test-wiring stops failing main
- Tests: write the DAM spec's preflight media document through putMediaDocument
- Tests: drive the CRM plan gate on a Free workspace, with a Starter control
- Tests: fill the contact record's Phone field, not the Call button's tooltip
- Tests: drive the DAM, the video pipeline and the lightbox end to end
- Console: expect the American Licenses copy the marketplace renders
- Console: sweep the /v1 upload door in both storage-gate inventories
- Console: count the replace route's mint-leg storage gate as the fifth door
- Console: count replace's sign-time storage gate as the fifth door
- Console: assert the Licenses copy, and let its absence checks fail again
- Console: re-inject the false comment opener the stripper spec measures
Share this article
We're building the open web platform. Follow along as we ship — and tell us what you need.