August 2026
Everything that reached production in August 2026. See every commit from this month on GitHub
The releases announced at the time:
- Local drafts — The builder keeps a local draft, so a crash or a stray reload cannot take unsaved work with it.
- Plugins in the palette — A plugin can declare canvas elements that show up as real entries in the element palette.
- Content security — The console enforces its content security policy for every session, not just an opted-in one.
- Verified publishers — Marketplace publishers can request verification, and staff can decline it.
- Components with props — A reusable component can declare props that vary per instance, so one component serves many pages without becoming a fork of itself.
- Link containers — A container that is itself the link, instead of a link wrapped awkwardly around one.
- Apex domains — A bare domain like example.com can now be connected directly, not just the www subdomain.
- Domain headroom — See how many domains your plan allows, and how many you have used.
- Search visibility — Decide what search engines may index, site-wide or page by page.
- Themes on the marketplace — Publish or install a site theme, applied as a patch over the publisher’s rather than a copy of it.
- Long-form documents — Write a page as markdown and get a contents list built from its own headings.
- Live co-editing — See other people’s changes, cursors and selections in the builder as they happen.
- Media references — Page elements store a reference to an asset rather than a fixed URL, so an image stays connected to the library that manages it.
New
- Staff: erase an account from the staff console
- Billing: charge tax — Stripe automatic_tax on
- Account: close your own account, from Manage Account
- Billing: say when invoices use a different address than the form
- Accounts: send the auth emails ourselves — no Firebase templates left
- Signup: say which plan the visitor picked
- Signup: a Google sign-up keeps the plan it came for
- Marketplace: rejections carry a category, not just prose
- Marketplace: a changelog buyers can read, and only for approved versions
- Support: plans commit to a response time, and the clock is real
- Support: ticket support starts at Pro; the gates read the ladder
- Operations: health endpoints and an uptime probe, before any SLA number
- Operations: a status page that survives the outage it reports
- Sites: publishing drops that page's cache instead of waiting it out
- Sites: measure the render path instead of guessing at the cold start
- Console: publishing a layout now drops every screen inside it
- Sites: apply scheduled publishes on a beat instead of waiting for a visitor
- Besigner: make the layout slot look and read like the design
- Themes: rotate the palette so primary is the accent
- Besigner: a Screen Link can render as a link, not only as a button
- Besigner: a border on one edge, not all four
- Besigner: grid, box, paper and card become first-class elements
- Besigner: accordion, tabs, image list, pagination and breadcrumbs
- Besigner: register the new elements and document the catalog
- Besigner: copy an element in one document and paste it into another
- Console: preview every besigner document, and preview locally
- Console: orgs set up enterprise SSO themselves, proving the domain first
- Sites: measure the boot that happens before our code loads
- Besigner: the File menu's "New version" now creates one
- Marketplace: a takedown strips the Verified badge
- Besigner: dimension attributes get a number box and a unit picker
- Besigner: style lengths get a number box and a unit picker too
- Media library: page elements store a reference to the asset, not a URL for it
- Marketplace: publishers can ask to be verified, and staff can decline
- Csp: collect the violations the report-only policy has been discarding
- UI components: add Link Container — a container that is itself the link
- Domains: report headroom against the plan's domain ceiling
- Security: the console CSP enforces script-src for everyone, not one armed session
- Billing: move the Stripe keys off the org doc, out of a collaborator's reach
- Billing: stop mirroring the Stripe keys back onto the org doc
- Billing: add --dry-run so the env block can be refreshed without creating prices
- Marketplace: own the patch — resolve an installed artifact as base ⊕ patch
- Themes: a host theme can set toolbar height, the only lever MUI leaves open
- Console: nav height is editable per breakpoint in the theme editor
- Marketplace: a site's theme is publishable and installable, with two ways back
- Themes: a site's theme changes are a patch over the publisher's, not a fork
- Marketplace: uninstall says what it breaks before it breaks it
- Sites: a closed host.* namespace so publisher templates fill themselves in
- Sites: business contact details, and a preview of what they fill in
- Email: sent emails resolve host.* from the site that sends them
- Plugins: a manifest can declare how its props are edited
- Plugins: publish a pinned plugin's declared props to the editor
- Besigner: a placed plugin's settings are fields, not a JSON textarea
- Designer: insert host variables from the binding picker
- Plugins: a plugin version can declare canvas elements
- Plugins: declared elements become real palette entries
- Besigner: an empty screen inside a layout gets a real drop target
- Components: a reusable component can declare props that vary per instance
- Besigner: the Attributes panel edits a component instance's declared props
- Components: declare a component's props from the component editor
- Besigner: a component instance renders its content on the canvas
- Console: land a no-op service worker so the offline shell has a baseline
- Console: cache the static shell, and nothing that belongs to a user
- Console: ask before swapping the build out from under a live page
- Besigner: keep a local draft so a crash can't take unsaved work
- Console: a branded offline page, and sign-out takes the caches with it
- Sites: a customer installs THEIR site, not ours
- Besigner: live co-editing — changes, cursors and selections in real time
- Besigner: a reusable component can carry its own icon, shown on every instance
- Besigner: author a long document as markdown, with a contents list built from it
- SEO: decide what search engines may index — site-wide, and per page
- Domains: an apex domain can finally be connected
- Sites: a site with a custom domain answers to one address, not two
- Marketing site: extract the solutions and use-case copy from Figma
- Marketing site: extract the pricing copy from all four Figma frames
- Marketing site: generate the pricing tables from plan-entitlements, not Figma
- Marketing site: generate the scale-strip and the design's Enterprise column
- UI components: opt-in lazy tab panels so big tab sets stop shipping every panel
- Sites: withhold node definitions for lazy panels that never mount
- Sites: fetch withheld lazy-panel nodes on demand instead of shipping them
- Billing: honor the marketing plan deep-link end to end
- Themes: back-fill dark-scheme node slices, dry run by default
- Sites: cache the render path's firestore reads behind publish-busted tags
- Sites: tag-cache the sitemap and rss payloads, restore cdn cache headers
- Besigner: refuse a stale save server-side and stamp-proof the guard
- Console: guarded saves + co-editing in layout, component, template, email editors
- Site data: signed edit-access tokens for the tenant admin bar
- Feature flags: release_edit_bar gates the tenant admin bar, dark by default
- Console: first-party edit-access broker for the tenant admin bar
- Sites: edit-access admin bar on published sites, lazy and flag-gated
- UI components: image elements get decorative, tooltip and loading controls beside alt text
- Platform: mergeNodeSx merges an sx override with cascade semantics
- Themes: palette shade derivation is scheme-aware and aa-aware
- Besigner: instance root style overrides render on every surface
- Besigner: the Styles panel styles an instance via its override layer
- Besigner: an instance offers edit-component, opening its besigner in a new tab
- UI components: tab panels mount on first selection by default, with an ssrPanels escape hatch
- Platform: map a grafted instance leaf back to the declared prop that feeds it
- Besigner: double-click edits a component instance's prop-fed text and image inline
- Staff: resolve org-detail uids to people and label the summary card
- Console: in-place "sign in again" re-auth modal keeps the route on session loss
- Console: security alert email on new-device sign-in; passkey alert ready
- Console: passkey (WebAuthn) sign-in via the custom-token bridge
- Marketplace: publisher profile logo, support contact and social links
- Console: staff org detail carries override, suspend and erasure, plus metered usage
- Console: per-site plugin enablement behind one resolver, and a host Admin area
- Markdown lite: > blockquotes parse and render in all five renderers
- Markdown lite: 1. ordered lists parse and render in all five renderers
- Console: let an admin delete a collection nothing depends on
- Plugin UI: give Form Field the placeholder the frames' label-above forms need
- Sites: filter a collection listing by category at /{collection}/category/{slug}
- Plugin UI: let a Tabs tab carry a screen link so a content-tabs row navigates
- Besigner: style any element inside a component instance, not just its root
- Besigner: a gradient control for the Styles panel, and no more silent drops
- Console: lead the apex with an ALIAS so no customer zone pins one edge address
- SEO: a social image per screen and per site, emitted absolute with its size
- Besigner: a Link property picks a screen, so a prop-driven link survives a rename
- Billing: meter only usage beyond a plan's included bands, and stop walling forms
- Billing: give the metered price a yearly twin so annual plans bill overage
- Tooling: catch an App Router graph crossing at review time, not at build
- Console: surface fromCache, and guard the writes staleSession could never reach
- Console: give tickets and the forum a surface each, still under Support
- Tooling: lint the link-element invariant, derived from what each component declares
- Themes: name the three tile tints as a first-class palette entry
- Platform: let a component hide the parts a page does not want
- Console: unfurl a marketplace listing as itself, not as the console
- Console: put the social image on the screen detail page's SEO card
- Console: claim a console domain and its twin in ONE transaction
- Sites: re-subscribe the three listener hooks when the session heals
- Accounts: seal setPersistence on the instance, not on six call sites
- Sites: surface {{pagination.*}} so an authored list template can build a pager
- Tooling: lint the listener-row spread so there is never a fifth
- Media library: opt-in ?download=1 forces a real download off the CDN
- Besigner: let a node change containers by clicking
- Console: tell the author the network dropped before a save does
- UI components: let a Screen Link wear the button styling without announcing as a button
- UI components: let an author emphasize a phrase inside a sentence
- Tooling: teach no-unguarded-loading-hook the hook that needed it most
- Tooling: fail when a marketing page brings back a retired color
- Console: pin a custom console domain to ONE org, and drop it on downgrade
- Sites: put the site's own favicon in the tab
- Billing: meter email sends and workflow runs per org — record, don't price
- Console: make "is a template" a property of the screen
- UI components: let a Button wear its own styling without announcing as a button
- Billing: count every email for cost, cap only the campaigns
- Tooling: name the node when a retired color comes back, and stop minting one
- Tooling: re-derive the marketing container census instead of re-counting it
- Plugins: give Related Posts a cover toggle and a card grid
- Plugins: give Entry Meta a byline, an avatar and a date format
- Console: let the DAM take documents, from one allowlist
- Console: make a DAM delete undoable, which needs a tombstone
- Platform: give a media folder a path, so a picker can tell two Covers apart
- Console: meter org-library bytes, and leave the charge switchable
- Console: sanctions/OFAC geo-block on the console surface
- Console: clickwrap acceptance at every signup door
- Fbserver: env override for the admin firestore database
- Sites: visitor consent tool with geo modes
- Console: legal document set v2 — republished pages archived and pinned
- Console: backup state answers on /api/health/backups
- Site data: the media CDN answers Range, so video rides it too
- Console: the panic button — four-scope lockdown
- Tooling: fail when live Firebase rules drift from HEAD
- Console: every org-scoped route answers the 423, or says why not
- Plugin UI: collection entries can search the page it rendered
- Platform: feature-scope lockdown
- Console: subscription updates and reused customers collect tax too
- Console: alarm on org-creation volume
- Console: first-party error beacon to Error Reporting
- Platform: take rate from entitlements + sale-time gates
- Marketplace: collect sales tax on marketplace purchases
- Console: legal document set v3 — registered agent live, clickwrap re-pinned
- Platform: typed GA4 event taxonomy
- Console: the lockdown audit trail records the expiry
- Platform: the deferred CTA, outbound and SSO events
- Console: legal v4 — disclose phone collection and its outreach/dunning uses
- Documentation: the documentation site reports to the consolidated property
- Console: a do-not-contact list §11 can actually keep
- Console: staff can see the verdict they can never receive
- Platform: send first_publish
- Platform: quarantine one file, not the host
- Besigner: edit the Markdown element's document with the WYSIWYG
- Platform: freeze the writes, keep serving
- Besigner: edit a Markdown element in place on the canvas
- Analytics: stamp internal traffic on staff and impersonation sessions
- Platform: declare the consent-mode default behind the gate
- Console: per-org release flag overrides
- Platform: tell both audiences a form is paused
- Console: show a disabled file as disabled
- Commerce: close the merchant's funnel with a storefront purchase
- Console: give asset quarantine a staff form
- Csp: measure an img-src before enforcing one
- Platform: alert on a rate-limiter degraded window
- Platform: publish the publisher agreement and re-open acceptance
- Console: show the member phone staff already collect, with its opt-out
- Csp: give published sites a collector, then measure img-src
- Console: render the quarantine deny list, and release by key
- Tooling: seed a multi-site demo org from brand packs
- Commerce: report the shipping the shopper paid
- Site data: name the must-already-exist write
- Platform: audit staff org overrides with a reason
- Console: measure what the script-src https: blanket is covering
- Console: gate the staff org override server-side
- Commerce: show a merchant which destinations their zones refuse
- Commerce: tell a merchant which money was taken and which they gave back
- Tooling: compare the Firestore index file against the live project
- Commerce: put a canceled order's stock back on the shelf
- Console: enterprise provisioning charges sales tax
- Console: record every own-account charge so a tax return can be filed
- CI: give the seven homeless tools guards an active workflow
- Commerce: give the flagged restock its answer buttons
- Commerce: re-ask the fulfill and delivered transitions under the write
- Console: hint cookie + silent edit-access probe for the admin bar
- Sites: auto-arm the admin bar from the console's presence hint
- Sites: top-fixed admin bar with real context
- Sites: count honeypot hits so the form bot rate is measurable
- Documentation: first-party error beacon on docs.aglyn.com
- Sites: brand the admin bar with the real Aglyn mark
- Sites: link the admin bar's connected-as identity to the console account page
- Platform: warn the Styles panel author of a third-party url() host
- Sites: collapse the admin bar into phone-width chrome
- Console: surface per-host form refusals on the staff org view
- Marketplace: pin publisher-agreement acceptance to the snapshot bytes
- Console: surface the honeypot spam counter beside the staff refusal flag
- Console: persist CSP violations as bounded daily counters
- Console: staff read-back for the durable CSP counters
- Commerce: mint an order per physical subscription cycle
- Tooling: reconstruct pre-AGL-1711 buy-now order records from Stripe
- Tooling: reconstruct unrecorded subscription sale amounts
- Tooling: backfill the missing subscription invoice ledger
- Tooling: rebuild contact RFM by SET from every sale source
- Platform: show the honeypot catch count in the owner's inbox
- Legal: doc-vs-live drift checker for the legal Google Docs
- Legal: ready-to-paste markdown-lite block + TOC preview for legal updates
- Commerce: reverse the seller's share of a lost dispute
- Site data: edit-hint tokens + ONE shared edit-access gate
- Console: login-time bounce plants the .aglyn.app editor hint
- Sites: silent admin-bar auto-arm on *.aglyn.app via hint exchange
- Sites: put today's first-party analytics on the admin bar
- Commerce: draft orders claim the attempt — a retry replays the one payment link
- Sites: show the site's own favicon on the admin bar
- Commerce: reserve claims the attempt — a retry replays the session URL
- Sites: user menu + chrome polish on the admin bar
- Commerce: cart checkout claims the attempt with one derived key per Stripe object
- Commerce: buy-now claims the attempt — a retried subscribe cannot double-enroll
- Console: weekly Firestore GCS export + separately-labeled exports health check
- Console: the subscription checkout gets its idempotency key
- Analytics: beacon captures utm source/medium/campaign, capped per day
- Analytics: real-user Core Web Vitals -> GA4 on console + tenant surfaces
- Analytics: cookieless approximate visitors, counted once per tab per day
- Console: utm breakdown + pro-gated per-screen comparison table on host analytics
- Analytics: 400-day ttl retention on analytics day docs; rollups decided against
- Analytics: ga4 refund + subscription_canceled events
- Marketplace: full refund reverses the ga4 purchase at platform net
- Console: org_plan + org_role ga user properties for the active workspace
- Analytics: content_group stamps the surface — marketing, docs, console
- Analytics: qualify a cta's content_id with the destination plan
- Console: downgrades wait for the period end — upgrades stay instant
- Console: a quarterly TX return is computable, and erasure can never eat it
- Marketplace: a lost chargeback revokes, nets GA, and pulls back the seller share
- Console: the leave path runs through a funnel — survey, downsell, bounded winback
- Console: docs-grounded in-console assist helper, phase 1
- Console: a customer can actually reach the retention funnel
- Commerce: tell a merchant when a lost dispute claws back their payout
- Console: both leave paths run the funnel, and a scheduled downgrade is visible
- Console: the retention funnel reports itself to GA4
- Console: tier visibility is asymmetric — upgrades lead, lower tiers fold away
- Console: the TX return's Webfile view — figures, verdict, working papers
- Console: the Texas sales tax return gets a staff page
- Plugin UI: the prose case is a Container preset at stock MD
- Plugin UI: the prose case is a Container preset at stock MD
- Platform: the POS register add-on is a POOL, allocated per site
- Console: /v1 serves orders, products and media
- Commerce: decompose storefront tax, measured not inferred
- Console: overage protection and a warnable org library, before any bill
- Console: help tips on the three surfaces that shipped without one
- Commerce: record storefront tax where a return can see it
- Commerce: record storefront tax where a return can see it
- Monitoring: a heartbeat makes error-beacon silence detectable
- Console: the health probes get a screen — Staff → Health
- Tooling: repeatable Stripe webhook health assertion
- Monitoring: a heartbeat makes error-beacon silence detectable
- Console: the health probes get a screen — Staff → Health
- Tooling: repeatable Stripe webhook health assertion
- Console: the rollup states its own billing semantics
- Console: the return reports storefront tax, in its own three buckets
- Console: the org library's own allowance, on the card
- Monitoring: billing gets a standing alarm, with Stripe as the denominator
- Console: the filing surface cannot be filed past storefront tax
- Console: the health screen gains the two probes it was missing
- Monitoring: a missing metered price is now a 503, not a silent skip
- Console: purchased POS register seats get somewhere to go
- Console: a refused signup is now counted, not just refused
- Console: invite sending is rate limited — the free spam cannon
- Assist: the Anthropic subprocessor precondition is a red test, not a note
- Commerce: the storefront takes payment on the merchant's own site
- Commerce: the shopper pays without leaving the merchant's page
- Sites: a stranger can finally tell us a site is phishing
- Security rules: the abuse-report queue is staff-read and nobody-write
- Console: the abuse queue reaches staff, and the report reaches the queue
- Console: a saved profile image reaches the org roster
- Console: staff user erasure gets the button its own CLI promised
- Platform: the $512 put-back clock and strike ledger, as arithmetic
- Erase: a deletion instruction now survives a restore
- Assist: the level-2 view registry, and a proposal that cannot write
- Sites: a locked-out customer can answer a takedown
- Assist: level 2 guides from the current screen, and cannot write
- Console: personal-data export, held in step with erasure by a guard
- Assist: the prose expires, the signal does not
- Assist: the two-depth answer and a confirm card that only navigates
- Site data: ask what a domain is DOING, not whether the POST worked
- Console: the put-back clock and the strike ledger, in the queue that caused them
- Console: the counter-notice queue and the strike count, on the page
- Console: the domain card says which of five states it is in
- Console: metered storage gets the opt-in switch it kept pointing at
Fixed
- Accounts: read SSO names from sign_in_attributes, where SAML puts them
- Erase: the erasure audit under-reported what it deleted
- Account: the Close-account card drew with no title
- Console: stop telling people to sign in again when that cannot help
- Accounts: expire the sign-out tombstone after a day, not fourteen
- Organizations: await the workspace-domain attach, and bound it
- Accounts: six more surfaces could not see an SSO user
- Staff: price an enterprise deal from measured cost, not $2 a site
- Accounts: five more places read a name claim SAML never sends
- Signup: reject an org name that cannot become a workspace
- Commerce: an SSO seller was never told they made a sale
- Staff: "Inherit" now actually removes a feature override
- Staff: take two rule-gated LISTs off the client
- Commerce: print from the opener, not an injected inline script
- Data: the dataset dialog's site list was denied, not partial
- Support: the community forum was labeled "Marketplace forum"
- Operations: the uptime probe names the service it is reporting on
- Support: scope every support call to the CURRENT org
- Console: the chooser was skipped on a cached org list, and an unknown slug span forever
- Build: the bundle analyser was disabled in the only build worth analyzing
- Console: stop offering org rows on pages that name no org
- Console: support tickets and forum never loaded — a GET carried a body
- Cloud functions: add the bookings index its scheduled job has always needed
- Console: the bare /layouts URL 404'd instead of opening the layout list
- Console: stop charging the screen allowance for screens nobody authored
- Console: the Free plan card promised a price we can still change
- Themes: customizing one color no longer repaints the whole palette
- Themes: the selected tab was near-invisible in dark mode
- Console: the usage meter counted screens the plan never charges for
- Console: the theme editor invented its defaults instead of reading them
- JSON editor: fill the viewport and follow the app's color scheme
- Themes: deep-merge component overrides so a leaf edit keeps the rest
- Console: return the preview's variant demos to the theme color
- Console: the 'Renders inside' label sat on top of its value
- Themes: default the remaining accent components to secondary in dark
- Themes: the override whitelist had fallen behind the components we style
- Console: a denied read only blames the session when the evidence says so
- Themes: rotate palette TOKEN references too, not just color props
- Console: heal a tombstoned host that vanishes from a non-empty list
- Besigner: canvas chrome follows the slate, not the accent
- Besigner: promoting a component left its own document on a frozen copy
- Besigner: hide Screen Link's button-only attributes in Text link mode
- Marketplace: stop filtering browse on a mutable field
- Besigner: a menu label is navigation, so stop shouting it
- Besigner: the per-edge border labels don't fit at quarter width
- Besigner: settle every canvas-chrome surface on the slate
- Besigner: the List family and Drawer were missing props MUI has had for years
- Console: type the promotion spec's mocks so main typechecks again
- Marketplace: heal a tombstoned dataset on the scoped browse queries
- Besigner: the canvas and preview painted MUI blue, not the brand
- Besigner: the color picker's Secondary tokens handed back Primary
- Sites: the render ran twice per request and timed out cold
- Preview: graft reusable components so shared chrome renders
- Icons: persist the picked icon's SVG path so it renders off the editor
- Csp: send the nonce under both header names, and measure what arrives
- Csp: enforce a nonce policy on the console, and stop shadowing the nonce
- Csp: default script-src back to report-only, enforceable per session
- Media library: pick the stable CDN path, not the raw storage URL
- Besigner: keep field values and menu labels inside their boxes
- Besigner: graft reusable components into the canvas layout chrome
- Marketplace: a revoked version stopped claiming a human had read it
- Account: stop offering to save over a profile we could not read
- Publishing: record a refused schedule instead of leaving it due forever
- Sites: say when the revalidate cap drops paths instead of discarding them
- Besigner: the selection outline goes back to pink, the chrome stays slate
- Besigner: the styles panel's promised ? appears, on the five fields it can help
- Forms: a color field's help tip rendered nothing at all
- Console: where-used decodes compressed nodes instead of answering "used nowhere"
- Email: a picked image resolves to an absolute URL so it renders in the inbox
- SEO: the sitemap and feed name the site's own origin, not the caller's host
- SEO: bound the sitemap and feed caches to the same 60 s every page uses
- Marketing site: the copy applier stripped every heading's component prop
- Publishing: publishing a component drops the cache of every screen that shows it
- Marketing site: a copy-review note tripped the price-permanence guard by quoting it
- Sites: interactions authored inside a reusable component now bind on the live site
- UI components: a cleared button color 500'd every /product/* page on the live site
- Vercel: stop the plugins project deploying on every push to main
- Vercel: diff the whole push range, not just the tip commit
- Marketing site: the stat band published "stat" as the figure on all eight product pages
- Besigner: the Drawer placeholder reserved 280px in a row it ships nothing into
- Besigner: lift the Drawer canvas chip out of the design surface
- Besigner: the Drawer marker still budgeted space in the nav row
- Plugins: say why realm plugins are off locally instead of returning silently
- Billing: a dead price id says which env var, not 'Stripe checkout failed'
- UI components: the Link Container dropped every style it was given
- Themes: make the Toolbar honor disableGutters
- Rendering: every Accordion on every published site had an empty panel
- UI components: the Image element discarded every style the author gave it
- Sites: drop the report-only CSP that could never be satisfied
- Staff: confirm the org read before rendering an org as empty
- Plugins: refuse to save settings seeded from a stale cached read
- Console: keep MUI's short-landscape toolbar rule when a host sets nav height
- Themes: resetting an overridden field left the editor showing the old value
- Console: a partial toolbar mixin dropped the breakpoints it did not name
- Console: the dirty check could not see a key-order change that alters the CSS
- Staff: serve org detail from the Admin SDK, not a rule-gated client read
- Console: the three new cards were missing their help affordance
- Console: refuse four more writes seeded from a stale cached read
- Besigner: restore the GridList import the barrel no longer re-exports
- Sites: raise the revalidate path cap, and say when a publish leaves pages stale
- Tests: make the pooled-Buffer fixture deterministic instead of luck-dependent
- Preview: give plugin blocks the site they render on, and refuse their writes
- Data: a partial write to a version doc no longer wipes its nodes
- Accounts: a refused session mint no longer leaves a sign-out tombstone standing
- Csp: allow 'unsafe-eval' in development only, so React can debug
- Billing: count team seats server-side so the banner stops showing a denied number
- Billing: a seat count nobody could read is not zero, and not a client roster list
- Preview: a form submitted from Preview was a real submission
- Co-editing: start App Check on the presence app, and key presence per tab
- Co-editing: an SSO colleague was listed by email, not by name
- Console: adopt a waiting service worker on load instead of nagging forever
- Console: a cold-loaded editor deep link failed, and Try again re-failed it
- Accounts: an empty duplicate __session cookie no longer shadows the real one
- Billing: stamp the workspace on Stripe customers, and reuse one per org
- Billing: tag invoices with the org, and make the backfill runnable
- Besigner: an instance is labeled by its component, not "Reusable Component"
- Console: preview and screen view could hang on a read that never settles
- Besigner: an unacknowledged write was adopted as "saved", killing Save
- Domains: apex verification only knew the host's legacy address
- Besigner: the empty-screen dropzone lines up with the document it stands for
- Sites: a collection's template screen is not a page of the site
- Console: publishing a collection template named a route it does not have
- Sites: the store's PDP and collection templates were still pages
- Sites: point the canonical-redirect spec at the renamed template-screens module
- Marketing site: the host-limit claim said 25 where Agency allows 100
- UI components: tabs and tab panel silently discarded the author's sx
- Themes: a site only goes dark if it has a dark design
- Billing: only a stated interval moves the toggle
- Themes: a foreground only lifts when its own surface went dark
- Themes: pin text on gradient panels instead of flipping it
- Blog: promote the entry title to h1
- Marketing site: put the CTA band back on paper, per the design
- Marketing site: put the brand blue on a palette token that passes AA
- Marketing site: give /pricing one content width instead of three
- Themes: collapse the accidental one-digit magenta split in dark mode
- Plugins: stable link element and hydration-clean rich text
- Console: the domain wizard and docs stop saying apex domains are impossible
- Console: the platform-subdomain redirect keeps the query string
- Console: view-live resolves a template through the collection that renders it
- Besigner: the conflict banner names the document kind the author is in
- Sites: drop the inert next/head blocks the App Router never rendered
- Console: each dns record line shows the name shape it applies to
- Console: create component goes through the resources api, not a denied setDoc
- Besigner: the App Bar theme-color Default persists as MUI's default sentinel
- Console: a dead org read errors with a retry instead of an endless spinner
- UI components: keep @emotion/server out of client bundles so the CSP eval probe disappears
- Console: the DAM sends big PDFs/zips past Vercel's 4.5MB cap via signed upload
- Console: raise jest testTimeout so starved parallel workers stop flaking RTL specs
- Besigner: a style edit was not undoable, and undo silently ate work
- Dependencies: restore the @eslint-community scope in the functions lockfile and patch js-yaml
- Plugin UI: declare the sx these elements already merge at runtime
- Shared ui: type the theme and form-mapper reads so their consumers compile
- Sites: render ordered lists and blockquotes in the entry body, a SIXTH renderer
- Sites: escape the NUL that made a 29KB route unreviewable to git
- Console: the domain wizard and the verify route read one DNS source of truth
- Console: view-live picks one collection when two designate the same template
- Site runtime: static-import the admin lib so one spec stops failing 14 others
- Markdown lite: a list may interrupt a paragraph, as CommonMark allows
- Besigner: detach bakes the instance's resolved props and root styles into the copy
- Besigner: a stacked background opens as raw CSS instead of losing a layer
- Plugin UI: give the All label a cleared value, so clearing it can omit the pill
- Plugins commerce: the catalog delete dialog describes the refusal, not a cascade
- Accounts: pin recovery link origin to the console, not a request header
- Console: let an org admin revalidate their own site's pages
- Billing: derive PAID_PLANS so Scale and Agency add-ons survive the read-back
- Billing: match the plan item by price and keep the monthly meter off annual
- Plugin UI: split a linked accordion summary into label + chevron toggle
- Besigner: drop undefined props where save and publish both serialize
- Besigner: let an instance override Background Fill, so Solid clears the gradient
- Plugins: compose the author's sx last, and lint the shape that dropped it
- Console: add the 23 Stripe var names missing from the dev env example
- SEO: a screen's own SEO title is the whole title, not a prefix to the site's
- UI components: name the emotion cache key both root layouts render under
- SEO: a collection list screen's own SEO reaches the head, not just its body
- Console: keep the client barrel out of the billing routes' server graph
- Besigner: the Styles panel reads and clears the props.sx no click could unwrite
- Billing: correct the metered rates so "cost + 30%" is true, not just claimed
- Billing: the annual metered caption states cadence, not absence
- SEO: resolve the Article cover to an absolute URL, like og:image already does
- SEO: absolutize the Event cover where the site's origin is actually known
- Billing: meter the subscriptions our own routes never built
- Security rules: deny the entitlement-bearing org keys the client could still write
- Console: confirm a cache-served entitlement doc, not just a cache-served miss
- Console: let listeners feed the stale-session verdict
- Plugin UI: a linked accordion header keeps its element when the screen does not resolve
- Console: stop Manage Account overwriting a profile with stale cached values
- Plugins: refuse whole-document writes seeded from an unconfirmed read
- Console: keep the brand suffix on the routes now nested under Support
- Console: guard the twins that were copied without their guard
- Console: count the webhook cap on the server, not from a listener
- Security rules: deny the server-owned fields the host and listing lists never learned
- Platform: stop a node leaving its parent's child list but not the node map
- Console: refuse the five widest whole-document writes
- Console: import the cap through the workspace alias, not across the boundary
- Security rules: deny the host counters the quotas and the invoice are computed from
- Console: the subdomain redirect needs a bare hostname, not a URL
- Plugins: guard the marketing surfaces that write a whole map from a listener seed
- Platform: require a live parent to put a node in the map
- Plugins: refuse the logic and workflow rewrites seeded from an unconfirmed read
- Plugins: guard the store settings, reservations and catalog writes
- Console: gate version creation server-side, not in the canvas save
- Plugins: guard the four plugin console pages, and give events a signal to guard with
- Console: meter the org against the org's band, like the invoice does
- Console: refuse the three site cards that write from a listener seed
- Console: refuse the screen rename and SEO writes seeded from the same listener
- Sites: carry the denied-listen verdict on its own signal, not on status
- Console: stop publishing a site-size cap no plan can reach
- Plugins: delete the fourth copy of the retry-reset instead of repairing it
- Commerce: stop a category rename from deleting the fields the form never sends
- Redirects: stop an edit from silently re-enabling a disabled rule
- Console: stop the SSO card answering "Not set up" before it has asked
- Console: stop offering an SSO activation the server will refuse
- Commerce: stop four writes persisting the listener's synthetic $id
- Sites: emit the branded auth origin, with its scheme
- Console: store an allow-list on the host create routes, not a deny-list
- Console: stop nine surfaces answering a plan or security question before asking
- Billing: count screens by what the site routes, not by the screen's own claim
- Sites: the RSS feed only answered to a host spelling nobody could know
- Platform: stop a Markdown block swallowing every element dropped into it
- Sites: the Entry Meta block gated three switches over values nothing supplied
- Billing: a collection's list template is a page, so charge the plan for it
- Console: store an import bundle through an allow-list, the last of the three
- Console: decode a version's nodes on the way out, so a backup restores
- Billing: enforce screensPerHost where the count changes, not only at create
- Tooling: move the lint rules out of nx's convention so lint stops printing a stack
- Marketing site: a designed campaign mailed an empty body to real customers
- Sites: decode a screen version's nodes before the search walks them
- Marketplace: decode the nodes the besigner writes before publishing
- Console: decode the client Bytes, and stop publish mangling it
- Console: enforce screensPerHost on site import, whole bundle or none
- Console: enforce the remaining resource caps on site import
- Plugin UI: guard the five components that SSR-500 on a cleared prop
- Sites: resolve media references in coverImage and logoUrl renderers
- Console: force Google's account chooser at every provider site
- Console: let the org switcher yield so the top bar stops overflowing on mobile
- Console: hint the SSO account and stop blaming the admin
- Console: stop swallowing the passkey rejection that means 'no passkey'
- Marketplace: one arithmetic for every install count on a listing
- Marketplace: derive install counts from the pins, and cache the answer
- Console: a restored publish schedule fires, and its folders and components resolve
- Console: scan the whole corpus before telling an author a file is unused
- Tooling: convert the media fields the node back-fill never reached
- Besigner: stop the editor offering a plugin the site switched off
- Console: stop refusing a paying org while its plan is still loading
- Console: decide the thirteen sites the rule now names, one at a time
- Marketplace: resolve a media reference in a listing's preview image
- Console: put the site's OWN media library in the bundle, tree and all
- Console: resolve a favicon reference, and never decline in silence
- Console: stop the cache presenting a refused read as live
- Plugin UI: stop the Container "Default" width from rendering full-bleed
- Sites: strip unpersisted keys before the branch picks an SDK call
- Console: measure site size in one unit, whatever form the nodes are stored in
- Marketplace: deny the install counters a coverage guard could not see
- Sites: resolve the unpersisted-key list on use, not at import
- Sites: type the fake setDoc payload the converter receives
- Console: stop the coupon preview approving what the route refuses
- Console: stop the org media library reading a host that never exists
- Security rules: grant the org media library the analytics day-doc it reads
- Console: bound the screen documents no plan cap counts
- Console: stop the besigner inventing a social image it was never given
- Site data: take the org's API credentials with the erasure
- Sites: the seed-guard refusal names the remedy that actually works
- Site data: take the org's SSO and console routing with the erasure
- Site data: take every org-keyed index with the erasure
- Console: two save paths CALL the seed guard instead of re-implementing it
- Console: put the bucket CORS rule the signed PUT needs in the repo
- Plugins: merge the node's style slice instead of spreading it away
- Plugin UI: close the '' option shape, and make it fail a test
- Plugin UI: make every option value persistable, per prop
- Site data: leave a durable trace when an erasure aborts
- Console: type the email mock so the run-erasures spec compiles
- Console: give every non-image DAM type an icon instead of a blank card
- Console: let the DAM delete where it is decided, and say what went
- Besigner: let the flexbox toggles read the key they write
- Console: stop a DAM delete from re-reading the library, and add ⇧-click
- Media library: make a failed variant generation say so
- Console: make DAM search cover the library, and say what it covered
- Console: ship the library sharp opens, not just the addon
- Console: stop an uploaded SVG executing on our own origin
- Console: a new media folder is stored with the scope the dialog claims
- Console: stop a bulk move reporting a partial success as a total failure
- Console: fetch the bytes the signed upload never handed over
- Site data: stop an erasure leaving a copy of what it erased
- Console: give the scope backfill a caller it never had
- Console: the details drawer says what a file's sharing actually is
- Data: the schema dialog says what a collection's sharing actually is
- Tooling: make the manual erasure the served one
- Console: delete the fourth media writer instead of repairing it
- Sites: no cached document bodies on a customer origin
- Tooling: rules deploys refuse a dirty source file so no session ships another's edits
- Console: no ref falls back to a rules-denied sentinel id
- Platform: no 'use client' directive in the shared consent banner
- Tooling: the prod-smoke gate survives preferRest — warmup off against the emulator
- Console: staff org suspend toggle goes through the lockdown core
- Cloud functions: the org suspended* family is Admin-SDK-only — even for super staff
- Site data: a locked org's media stops serving
- Console: the metered estimate card prices the org library like the invoice does
- Console: a verification click may not be navigated away from mid-apply
- Console: signup org provisioning works on the password door
- Console: make the two import-free gate specs modules so tsc passes
- Console: rate-limit /api/orgs/create under the signup grace
- Platform: marketplace-installs lockdown also refuses paid checkout
- Marketplace: a full refund revokes the purchase entitlement
- Marketplace: request Connect capabilities explicitly at onboarding
- Sites: render tenant pages into the ssr shell so hydration never waits on raf
- Sites: mount analytics and consent above the plugin gate
- Console: render the 423 lock notice
- Console: accept every v1 Stripe signature so a secret roll stays zero-downtime
- Console: a template-started site gets a home page
- Console: the panic page states a verified lock state
- Platform: the authored analytics step goes through the sanitizer
- Console: resolve the ToS consumer contradiction in v4 — 19.12 and 18.2
- Site runtime: a scheduled first publish is reachable
- Console: the lockdown 423 keeps the rate-limit budget
- Platform: one begin_checkout shape
- Console: keep staff-only chrome out of published screenshots
- Console: render the lockdown support contact and expiry inline on billing
- Sites: isolate the page body from analytics when the plugin gate throws
- Platform: delete the GA cookies a consent withdrawal allowed
- Tooling: make the aglyn.com alias probe able to fail
- Marketplace: type the GA4 capture sink so the spec project typechecks
- Platform: silence the resident gtag on a consent withdrawal
- Console: correct the v4 privacy analytics and outreach disclosures
- Platform: give quarantine a digest it can trust
- Tooling: cover the plugin origin alias with a check that can fail
- Console: don't invoice an audience band nobody can reach
- Console: let a per-org Contacts grant reach the invoice too
- Console: stop quoting an audience overage the invoice won't carry
- Platform: cap what a form flood can bill a paying customer
- Platform: never collect acceptance of an unpublished agreement
- Besigner: satisfy ElementPropsFormProps in the Markdown attribute spec
- Www: strip HubSpot, Visitor Queue and the ad-tech preconnects
- Cloud functions: deny client-created form submissions past the meter
- Platform: refuse quarantined bytes at the door
- Marketplace: capture ga_client_id at checkout so purchases attribute
- Marketplace: report platform net as GA revenue, not tax-inclusive gross
- Console: close the add-on purchase path when its release flag is off
- Console: report an unknown billing_interval as absent, not monthly
- Commerce: render the POS card QR locally
- Platform: point release_marketplace at the nav tab that exists
- Aglyn markdown editor: the image button reaches the media library
- Platform: bucket rollouts on the org, and only the org
- Besigner: the in-place canvas editors follow canvas scroll
- Commerce: settle a POS sale on the first tap
- Console: make the plugin kill switch stop depending on the caller
- Console: stop hashing member emails to gravatar
- Console: enforce the published API quota globally
- Console: let the verdict probe say that reads still pass
- CI: compare live rules against the promoted SHA, not main
- Console: finish the read-only intent audit
- Console: don't invoice a lead inbox nobody can open
- Commerce: dedupe a POS sale on a retry, not just on a double tap
- Console: one console page_view, with a real URL
- Marketing site: make the popup bait the form honeypot instead of satisfying it
- Tooling: find the Ready build by filter, not by scanning a paged list
- Marketplace: one refund-aware purchase gate for every install path
- Console: refuse a second subscription checkout for a subscribed org
- Commerce: stop a retried refund sending the money out twice
- Plugin UI: resolve a media reference in markdown
- Console: don't quote staff an overage the org won't be billed
- Commerce: store the shipping the shopper paid
- Platform: hold listing artwork to first-party media
- Marketplace: stop selling the same component to a buyer twice
- Contacts: read the audience head-count as a server aggregate
- Sites: stamp form submissions taken under a degraded limiter
- Console: make the REST API's idempotency key actually dedupe
- Commerce: charge the shipping the merchant configured
- Console: count member seats from the server, not the page window
- Platform: stop the write-deny scanner counting method calls as fields
- Tooling: delete the probe's nested role with update, not a merged set
- Console: stop enterprise provisioning billing a deal twice
- Tooling: regenerate the stale Next tsconfigs
- Commerce: record what the buy-now shopper actually bought
- Tooling: guard the plugin manifests against silent drift
- Console: guard the enforcing CSP, not the count of headers
- Console: carry the pricing CTA's plan across the verification wall
- Platform: refuse an http: image src in markdown-lite
- Commerce: charge buy-now the shipping the cart already charges
- Data: count datasets and records from the server, not the windows
- Console: store a media reference in the three markdown writers
- Platform: refuse insecure url() in author CSS
- Commerce: count the catalog from the server, not the page window
- Site runtime: drop http: collection covers, the second http path
- Sites: give the analytics mock the SDK's real arity
- Plugins contacts: stop the head-count doubles changing identity per render
- Logic: count variables and functions from the server
- Platform: annotate the null sx leaf that blocked typecheck
- Workflows: count workflows and locations from the server
- Console: raise the comment-stripper span bound, and stop it blaming the regex
- Commerce: record what a subscription sale actually sold
- Commerce: export the money the merchant was actually paid
- Sites: don't prefer REST against the Firestore emulator
- Commerce: stop tracking stock on subscription-only products
- Commerce: record every subscription renewal
- Commerce: count an in-store sale in lifetime value
- Commerce: make a payment-link buyer a contact at all
- Commerce: send a purchase for a storefront subscription sale
- Commerce: count a paid stay and a paid booking in lifetime value
- Commerce: attribute a folio sale to the stay's named guest
- Commerce: refuse a folio sale against a stay that does not exist
- Commerce: refuse to mint a cart from the cookie a member chose
- Console: refuse a subscription that names no workspace
- Console: refuse a staff retarget of a site that does not exist
- Commerce: reconstruct a subscription a renewal arrives for, never stub it
- Site data: stop a host revoke from re-creating the membership
- Commerce: refuse a cart cookie that names a path, never mint an empty cart
- Console: refuse a version verdict on a listing that no longer exists
- Console: refuse an org settings write for a workspace that is not there
- Marketing site: refuse a Resend open against a campaign the merchant deleted
- Commerce: refuse a redemption against a code that is gone, and record it
- Platform: bound visitor writes on the plugin dispatcher
- Console: let a retried DELETE say the record is already gone
- Platform: keep the register add-on's real ceiling next to the add
- Site data: give a host notification its own org
- CI: install cloud/functions deps so the type gate can see them
- Shared util fbclient: drop the never-called firebase/analytics import
- Console: let a folder-sharing preview answer under a read-only lock
- Commerce: stop one restock signup from killing back-in-stock email for everyone
- Marketing site: file a campaign where its merchant can see it
- Console: serve Monaco from our own origin
- CI: run the guards that guarded nothing
- CI: install the second package a root npm ci never reaches
- Console: commit a staff org override with its audit row
- Commerce: record a refund against the buyer
- Commerce: charge the shipping rate the destination actually has
- Platform: read the third CSP report wire format, the one Safari sends
- Commerce: reverse a shopper chargeback against the merchant's store
- Console: stop shipping a reporting pair that is silent over http
- Console: let a private media preview answer under a read-only lock
- Cloud functions: keep a live TTL policy an index deploy was about to delete
- Commerce: record the shipping a paid draft order was charged
- Cloud functions: index three cron scans that never ran
- Commerce: mark the shipping rate row checkout silently drops
- Tooling: subscribe the event AGL-1546's revocation needs, and report the drift
- Commerce: charge shipping on a draft order's payment link
- Console: delete the quota override a staff member cleared
- Commerce: flag the stock a reversed order left off the shelf
- Commerce: let a store with no orders draft its first one
- Cloud functions: make the override reason a boundary, not a dialog
- CI: give the rules-drift self-test a second home that actually runs
- Commerce: drive the cancel button through the cancel-order route
- Commerce: refuse to refund an order whose chargeback is still open
- Tooling: give every .mjs file the eslint rules it never had
- Commerce: charge a manual-tax store's tax on every subscription invoice
- CI: run the retired-color detector's self-test somewhere real
- Console: let a churned org resubscribe through tax id collection
- Commerce: agree the Refund button with the open-dispute refusal
- Console: stop the member drawer calling a chargeback a refund
- Cloud functions: deny staff client writes of the org commercial keys
- Commerce: log the ledger row the draft-link sale never wrote
- Events: refuse http: at the two raw free-text image sinks
- Commerce: drive Fulfill and Mark delivered through the fulfill-order route
- Commerce: decrement stock when a POS card sale pays
- Commerce: compound sibling POS lines of one product
- Commerce: alert low stock from every decrement, not just buy-now
- Commerce: compound sibling cart lines of one product
- Cloud functions: deny staff client writes of the vestigial billing and identity keys
- Commerce: count registers with a server aggregate, not the limit(25) window
- Cloud functions: deny client writes of an order's status
- Commerce: commit the cart quantity on settle, not per keystroke
- Site data: anchor firstPurchaseAtMs on a converted lead's first purchase
- Console: exempt the byte-pinned agreement snapshot from the naming guard
- Console: make the phone-disclosure spec a module so its globals stop colliding
- Sites: resolve collection routes on the admin bar, not 'Unrouted page'
- Sites: attach the no-img-element disable to the favicon img line
- Console: give the edit-hint routes their lockdown-423 markers
- Analytics: spoofed-host gate + bounded per-ip limiter on the collect beacon
- Console: heal the cross-agent interleave the gate caught
- Console: heal the last two interleave reds the re-gate caught
- Console: subscription purchase reports net of tax to GA4
- Commerce: close the two money doors that skipped the plan gate
- Console: four assist defects the claude-api skill surfaced
- Console: restore the typecheck baseline AGL-1323 established
- Console: two repo-wide invariants the retention route tripped
- Console: the assist docs index tripped the AGL-975 naming sweep
- Platform: backups check can go green again — aged-out NOT_AVAILABLE is not a failure
- Platform: backups check can go green again — aged-out NOT_AVAILABLE is not a failure
- Console: never register an analytics transport that cannot deliver
- Console: never register an analytics transport that cannot deliver
- Themes: text colors are COMPUTED, not hardcoded
- Console: share the cookie reader so an empty duplicate cannot disable idle logout
- CI: the two shallow checkouts fake the rules-drift baseline
- Accounts: brand the OAuth origin on every host, not just *.aglyn.com
- Console: the quota banner must not claim an org the URL never named
- Commerce: gate the commerce glance figures on commerceAnalytics
- Themes: restore the typecheck baseline AGL-1323 established, again
- Tooling: the webhook audit reported a window wider than its own data
- Security rules: a site editor could rewrite the registers the invoice reads
- Console: correct seven misattributed issue ids in code comments
- Tooling: the webhook audit can be pointed at test mode, and it finds a gap there
- Tooling: one clock reading, so the retention warning stops crying wolf
- Security rules: re-apply the registers write denial fcf1017eb reverted
- Themes: filled primary buttons carry WHITE text again
- Commerce: the dispute reversal double modeled Stripe backwards
- Console: meter the org the URL named, not the one that answered
- Console: starter templates start ON the container standard
- Commerce: every storefront path now states its tax decision
- Accounts: stop presence minting cross-pool tokens that forge shadow accounts
- Console: a role change stops nulling an SSO member's roster identity
- Sites: the app bar reads the avatar the user actually has
- Console: the invite rate-limit refusal logs a target — the route did not typecheck
- Security rules: a host-scope takedown now takes the site down
- Console: a conflicting analytics re-init no longer crashes the console
- Console: the other seven files of AGL-1964 — main was briefly broken
- Platform: the urgent-abuse notification type, and a label guard that could not fail
- Erase: an erased identity stops being world-readable
- Erase: support threads stop outliving the erasure
- Platform: the abuse-report spec reads the failure arm the compiler can see
- Sites: the analytics re-init spec types the provider it needs
- Console: the breach runbook is a key MENTION, not a new Anthropic data flow
- Cloud functions: a timed suspension now expires in rules, at both scopes
- Sites: drop a zero-width space from the shim comment
- Platform: name a winner for the ambiguous addBusinessDays re-export
- Retention: replay keys, churn free text and the 2021 privacy stub get periods
- Platform: the deny-coverage guards went blind on a path that quotes /*
- Console: a successful attach is not a serving domain, and the wizard stops saying it is
- Commerce: the storefront Connect account now asks for the capability its own checkout requires
- Console: Stack takes alignItems and flexWrap through sx, not as props
- Assist: restore the AGL-1972 exchange/signal assertions I reverted
- Console: a domain can be pointed at us AND wrong at the same time
- Console: the domain-status route answers to the lockdown
Performance
- Sites: stop shipping MUI X DataGrid to every published site
- Platform: stop two log lines from shipping the Firestore client to every site
- Sites: the compose pipeline issues its reads in one round trip, not three
- Sites: keep react-virtuoso out of every published page
- Sites: send only the withheld nodes, and say so while they load
- Sites: block first render on the page's plugins, not the org's
- Sites: narrow the blocking plugin set on collection and auth pages too
- Shared ui: prune the jsx barrel so published pages stop shipping besigner chrome
- Shared libraries: navigation-drawer leaves the barrel, collecting the deferred cut
- UI components: drop mui-shadow-dom's dead ssr branch so react-dom/server leaves the client
- Sites: overlap the plugin lookups with composition so pages render sooner
- Console: stop paying for reads nobody asked for
- Console: stop re-reading what one read already answered
- Console: serve thumbnails, not originals, and let a video 304
- Sites: pay Firestore transport establishment at boot, not on first visit
- Sites: a rules denial retries at 60s, not the 2s heal cadence
- Sites: the publish beat probes its next due time instead of asking every minute
- Site data: coalesce the per-call user-lockdown read
- Assist: make the cached prefix tenant-agnostic so one entry serves every workspace
Reverted
- Themes: give the owner his brand colors back, entirely
Changed
- Marketplace: the marketplace stops calling itself community
- Marketplace: drop the /api/community alias too
- Security rules: collapse the duplicated marketplace rule blocks
- Marketplace: the plugin registry still said community
- Platform: compress() no longer drags Firestore into the shared barrel
- Themes: use the shared deep-merge instead of a private one
- Console: the screen and layout lists move to the bare path, like components
- Console: take the host list off a predicated query so it cannot tombstone
- Timestamp: extend Date instead of the Firestore class
- Marketing site: group the compare table by row, not by cell
- Themes: put the last 16 dark-mode colors under design control
- Sites: move the stale-seed guard where the plugin cards can reach it
- Console: drop two dead keys the resources allow-list carried for a caller
- Aglyn markdown editor: give the markdown editor a lib home
- Platform: promote the POS attempt claim to a shared server util
- Platform: one live-subscription status list
- Site data: one owner for the document-id rule
- Site data: drop a browser Firebase re-export from a server barrel
- UI components: delete the orphaned Pages Router surface
- Tooling: setup-stripe reads the webhook event list from the shared lib
Documentation
- Accounts: an SSO account cannot link a second sign-in method
- Marketplace: say what the two listing badges promise
- Operations: the status page exists now, so stop listing it as missing
- Trust: a security page whose claims are all checkable
- Enterprise: link Trust and Status, and document SSO, support and availability
- Console: point the preview comments at AGL-1203, the issue that was filed
- Sites: note that preLoadBootMs is only meaningful on a lambda
- correct the issue references in the media and besigner UI fixes
- SSO: say that social linking is refused, not merely un-automatic
- Sites: the cold-start read falsifies the lambda-init guess — boot is 1.8 s
- Marketing site: the four 'unverified' plan gates all check out under different key names
- Csp: the tenant's report-only policy reports every script, not none
- SEO: the sitemap cache is 60 s and always was — the header is inert
- Vercel: record that the plugins branch config depends on a dashboard setting
- Components: document component properties
- Components: an instance renders its content — the page still said dashed box
- Components: screenshot the component-properties workflow
- Billing: the Event Calendar add-on is per org, not per host
- Commands: pin the marketing-site charter above every handoff
- Commands: rescind the all-routes ISR sweep recipe
- Domains: domain pages match the real card — apex records, retry-attach, disconnect
- SEO: exact per-screen fields, site-wide defaults, what the sitemap holds
- Content: entry scheduling in full, the categories dialog, and the real rss url
- Besigner: live co-editing, draft recovery, and the flagged live-site admin bar
- Besigner: component instance limits, versions as rollback, honest publish timing
- Content: forms monthly caps per plan and the inbox; media size, plan and folder limits
- Billing: scale and agency join the add-on table, full data-storage ladder
- Self hosting: the rules deploy joins the short version; optional keys get names
- Screenshots: capture plan for the seventeen shots the new content calls for
- Help: regenerate the registry — two new topics, refreshed anchors and excerpts
- Self hosting: record the AGL-909 decision against a provider abstraction
- Content: collection delete, and correct what tabs, gradients and categories do
- Billing: flag the annual metered caption that goes stale on the env flip
- Billing: §5 now documents both metered intervals, not the annual gap
- Accounts: design the cross-domain session handoff for custom console domains (AGL-1099a)
- Accounts: measure whether the two session-route defects are latent (AGL-1099a)
- Plugins: cite AGL-1240 where the Image sx fix actually came from
- Design: decide the six open marketing design-system items
- Design: ratify apex-primary — the model was already running, undecided on paper
- Billing: record why STRIPE_PRICE_* must stay non-sensitive
- Billing: decide the two unenforced plan caps — bandwidth is already metered
- Design: correct the AGL-1311 memo's diagnosis of the dropped query
- Design: prove the 1099a in-memory-persistence bet, and what it overstates
- Design: 1099d's three allowlists, answered — one is a manual click
- Email: correct a comment that called a live defect hypothetical
- Design: re-verify the AGL-1311 memo against production and refresh statuses
- Marketing site: retire the layer-name warnings the renames already answered
- firestore disaster-recovery runbook from a rehearsed restore
- Email: the DNS facts match what is actually served
- Analytics: one GA4 property across both domains
- Analytics: name the canonical property, stream and Firebase links
- Analytics: correct the follow-up issue reference
- Analytics: record the aglyn-f375b property as trashed
- Documentation: name Google Analytics as a subprocessor
- Documentation: stop getting-started from selling Free users a Pro step
- Documentation: correct three getting-started claims the console contradicts
- Documentation: refresh the stale getting-started shots and their alt text
- Documentation: point building-sites captions at the controls they name
- Documentation: mark Contacts coming soon, and drop the price on a dark page
- Documentation: scope the trust page's claims to what each control covers
- Documentation: tell staff to send the strong digest
- Documentation: point the quarantine runbook at the staff form
- Agent tooling: mark promote-and-enforce superseded and correct its deploy facts
- Agent tooling: strip standing promote grants from the command files
- Documentation: forms docs stop promising an unlimited endpoint
- Platform: stop normalizeScreenSlug's docstring describing a fix that breaks
- Agent tooling: record the batch-3 promotion to 867c963e7
- Commerce: say which order paths charge shipping, and why POS does not
- Agent tooling: record the batch-4/5 promotions, tax readiness and gate recipe
- Console: move the quarantine arc history into the runbook
- record the tenant consent-mode declarations in ANALYTICS.md
- Dr: note READY backups flip NOT_AVAILABLE at ~1 week old
- Agent tooling: /release — the Sept 1 release-readiness command (the owner's mandate)
- Analytics: record the coverage-pass additions
- Agent tooling: /release carries the owner's mandate verbatim + the browser/env access grant
- Agent tooling: /release workstream G — docs sync, visual screenshots, /v1 growth, guides, tooltips
- Agent tooling: /release workstream H — GA report building + dependabot cleanup
- Agent tooling: workstream H carries the owner's words verbatim, not a paraphrase
- Agent tooling: one canonical verbatim mandate block, fragments consolidated
- Agent tooling: handoff for the /release push
- Billing: the lifecycle page describes the funnel and the end-of-cycle downgrade
- Billing: sales tax exists, and add-ons do not ride the downgrade schedule
- Monitoring: backup-state's persistent-condition license needs a clearing event
- Monitoring: backup-state's persistent-condition license needs a clearing event
- Console: the dev env example carries the branded auth handler host
- API: reference pages for orders, products and media
- Documentation: the API on-ramp, the agency ICP, and the two plan gates
- Billing: the go-live runbook says how to assert the webhook
- Screenshots: shot list for the release docs, ready to run
- Billing: what shipped for org-library billing, and the one step left
- Billing: restore the webhook-assertion section AGL-1906 added
- Billing: the webhook audit follows the key's mode
- Monitoring: three new checks, the error-rate gap, and the real probe cost
- Monitoring: the probe-cost reading the bill settles, not the metric count
- Privacy: the retention schedule, reconciled against the published text
- Privacy: the DSAR runbook — executable, and honest about what it cannot do
- Security rules: the timed-suspension follow-up is AGL-1981, not AGL-1966
- Privacy: the breach runbook, starting from how we would actually find out
- Operations: the incident process, and the SLA decision laid out rather than made
- Operations: wire the new runbooks into the two files that had the open gaps
- Analytics: how the console's analytics boot is lost, and what it costs
- Commerce: in-page checkout has a surface, and the CSP claim was wrong
- Commerce: the lost-dispute split is GROSS, on evidence, and guarded
- Assist: level 2 in the docs, and a gate on the corpus it retrieves from
- Platform: point the stripComments note at AGL-2004, not a stranger
- Domains: the chip table, the ownership record, and the two different checks
- Privacy: the breach runbook can name a regulator now
- Legal: v6 — the gross clawback and the 180-day Assist expiry, recaptured
Behind the scenes
- Billing: pin the coupon badge at the org the form actually rates
- Security rules: a harness that answers "do the rules allow this?"
- Plugins: exercise the takedown chain against a real Firestore
- CI: re-trigger the production deploy for 67d4df3b5
- Tenancy: cover the workspace-domain attach, which nothing had run
- Agent tooling: retire the payments arc, add the tenant-performance command
- Repository: untrack the DAM upload scratch dir and ignore it
- Console: pin the org-jump redirect to server-confirmed data
- Sites: prove a taken-down plugin actually stops executing
- Tooling: place a marketplace plugin node on the demo site
- Vercel: only rebuild console and tenant when something could have changed them
- Console: prove promotion actually swaps the source for an instance
- Console: regenerate the docs help registry for the copy/paste page
- Sites: give the library a test target so its shared hooks can be tested
- Sites: wire the test target and the retry cases
- Agent tooling: add the self-serve-sso command for the next session
- Marketing site: seed the remaining aglyn-marketing screens from the SEO map
- Marketing site: the /product/* page skeleton, its copy applier and the Figma copy
- Sites: delete the dead Pages-Router leftovers
- Marketing site: the copy applier ignores layout chrome, so all 8 detail pages pour
- Agent tooling: add the promote-and-enforce command for the next session
- Marketing site: resolve 26 flagged copy claims against the owner's calls and the plan gates
- Agent tooling: add the deploy-and-flip command for the next session
- Agent tooling: the promotion landed — correct the handoff's premise
- Agent tooling: the canvas click-test passed — AGL-523 is ready to flip
- Agent tooling: flag the stranded AGL-1226 fix as the next session's first action
- Agent tooling: sharpen the commit-status trap into its two distinct faces
- Agent tooling: drop AGL-1160 from the queue — it closed by measurement
- Agent tooling: add the marketing-overview-and-chrome command for the next session
- Agent tooling: carry the deploy-quota verification into the next session
- Billing: script to drop the inline Stripe keys once the billing doc holds them
- Sites: cover the revalidate path cap, which reports truncation untested
- Agent tooling: add the marketing-design-audit command for the next session
- Agent tooling: add the override-layer command for the next session
- Dependencies: bump undici from 7.28.0 to 7.29.0
- Dependencies: bump undici from 7.28.0 to 7.29.0 in /apps/docs
- Sites: host tokens resolve inside the real compose pipeline
- Besigner: cover the internal editor keys an attribute rewrites to
- Agent tooling: add the component-props-and-home command for the next session
- Deploys: empty commit to re-fire the Vercel webhook
- Www: delete the orphaned PWA manifest and icons from the retired marketing app
- Agent tooling: add the drafts-and-co-editing command for the next session
- Sites: retire the static PWA assets the dynamic manifest replaced
- Console: cover the Support request helper that shipped a silent bug
- Agent tooling: add the marketing-site-finish command for the next session
- Dependencies: Bump fast-uri from 3.1.4 to 3.1.5
- Agent tooling: add the tenant-payload-deferral command for the next session
- Dependencies: bump mermaid from 11.16.0 to 11.16.1 in /apps/docs
- Scripts: remove the one-shot marketing data fixes, keep the reusable pair
- Besigner: a panel style write on an instance survives save, reload and the graft
- Besigner: chain the double-click prop edit through save, reload, compose and undo
- Console: pin resolveScreenLiveUrl's four template outcomes
- Besigner: preserve the UNVERIFIED MUI Menubar work-in-progress
- Besigner: preserve the menubar popup transition fix the agent left uncommitted
- Besigner: the menubar's keyboard behavior is exercised, not assumed
- Dependencies: bump dompurify from 3.4.12 to 3.4.13
- Marketing site: re-extract pricing-copy after the Figma frame drift fixes
- Dependencies: override js-yaml, nanoid and brace-expansion past their DoS advisories
- Dependencies: close five docs advisories via overrides; image-size has no fix upstream
- Console: exempt the third lockfile from the community sweep that corrupted it
- correct the spec assumptions behind the last typecheck failures
- Tooling: keep agent worktrees out of the workspace typecheck
- Plugin UI: pin the stable link element AGL-1268 shipped without
- Plugins commerce: run the route-registration spec on node, where next/cache loads
- Sites: pin why a denied listen never surfaces under the persistent cache
- Security rules: make an unclassified org field fail the build, not ship open
- Tooling: propose the tint repoint as a migration, and correct the memo's count
- Security rules: make an unclassified host or listing field fail the build
- Console: regenerate the docs help registry after a docs page edit
- Platform: export strip-undefined from the server barrel
- Console: pin the mediaCdn entitlement gate at its one enforcement point
- Console: put the "nothing uses this" claim behind a spec
- Tooling: refuse to start a dev server on a nearly full disk
- Platform: make the drop/render agreement a test, not an audit
- Tooling: point the default dev servers at the emulator
- Tooling: make firebase:emulate actually start
- Sites: let the media CDN emulator spec pass without the leaked .env
- Console: let the DAM wiring specs see the file they assert against
- Console: run the DAM claims that can be run
- Cloud functions: rules coverage for lockdowns, suspended* keys, legalAcceptances
- Console: drive the signup-volume health route in-process
- Platform: drop the personal phone from test fixtures
- Console: regenerate the docs help registry
- Console: drive the billing and AI-assist 423 notices
- Console: fail the build when docs sell a release-flagged-OFF feature
- Tooling: observe read-only lockdown on the wire
- Tooling: prove every starter serves at its site root
- Console: assert the delete-dialog ordering, not its latency
- Commerce: settle the head-count spec on the count, not on a tick budget
- Commerce: settle the locations head-count spec on the caption
- Logic: settle the logic head-count spec on the aggregate, not a tick budget
- Workflows: settle the workflows head-count spec on the aggregate
- Data: settle the Data head-count spec per aggregate, not on a call count
- Console: pin the revocation module read-only is trusted not to call
- Dependencies: bump deepmerge-ts from 7.1.5 to 8.0.0
- Console: drive the billing webhook to its GA purchase call
- Www: delete apps/www, apps/www-e2e and shared-util-fbclient
- Repository: drop the committed nx graph dump
- Repository: drop the dangling @/console and @/tenant path aliases
- Tooling: wire-prove the private media preview pair under org locks
- Tooling: delete the pre-AGL-237 contact backfill that writes a dead path
- Sites: justify the admin bar's plain <img> favicon to the linter
- Console: pin the tenant web-vitals mount now that it is committed
- Agent tooling: delete the 15 stale session-handoff commands — /release is the living one
- Console: the forever-coupon guard could not go red — it does now
- Console: prove the bounded-coupon guard is WIRED, not just present
- Plugin UI: pin the landing tab against a dead EARLIER link
- Scripts: ask production who a per-host register add-on would downgrade
- Site runtime: pin the entry fallback to the prose width
- CI: actions/checkout and setup-node off deprecated Node 20
- Site runtime: pin the entry fallback to the prose width
- CI: actions/checkout and setup-node off deprecated Node 20
- Console: the org library is warnable, and the ceiling is a bound
- Console: the org library is warnable, and the ceiling is a bound
- Console: the three storefront-tax guards, each forced red
- Console: the three storefront-tax guards, each forced red
- Console: reconcile two guards with what AGL-1886/1916 actually shipped
- Console: the tax-return route serves storefront tax as its own section
- Console: the storage refusal is actionable now, and still lands nothing
- Commerce: guard the draft-order tax and the POS tax witness
- Commerce: the Payment Element sale is fulfilled by the webhook, with no client in the room
- Console: clickwrap v5 — Terms §10 rewrite + Aglyn Assist disclosure
- Platform: publisher agreement 2026-08-18.1 — marketplace rename + EULA cross-reference
- Cloud functions: three TTL policies declared, documented and guarded
- Cloud functions: guard the §512 collections, and fix a parser that was reading a corrupted file
- Console: null-mock the storage-overage card in the lockdown spec
Share this article
We're building the open web platform. Follow along as we ship — and tell us what you need.