Ctrl K
ComunidadGuías…

CHANGELOG.md

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# Changelog

Every released version of the Aglyn platform, newest first. A version names a
commit that was **promoted to `production` and verified deployed** — see
[docs/RELEASING.md](docs/RELEASING.md) for how one is cut.

This is the engineering record. The customer-facing changelog is published as
content on the marketing site and is written separately.

<!-- releases below -->

## v1.20.2 — 2026-11-11

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/5c50d2ed7...v1.20.2)

### Fixed

- **ai:** a redesign's link to form on a page with no form goes to the site's form page ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a refused redesign link names only the destinations its page has ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **google-reviews:** a profile with no reviews shows only the review link ([AGL-4212](https://linear.app/aglyn/issue/AGL-4212))
- **console:** visible tab asks a background cache holder at boot ([AGL-4204](https://linear.app/aglyn/issue/AGL-4204))
- **data:** the Data page shows loading, not the empty state, until the server answers ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketing:** a refused campaign create keeps the sharing chosen, reason beside it ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** install-picture read phase and switched-off sites in the list caption ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **console:** a plugin's page says loading, never "not installed", while its pins load ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** the listing reads the org pin under the hub's org, waits for pins ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **console:** the Plugins list names a site that switched a plugin off ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** plugin pages and Data wait for the server before saying none
- **commerce:** a test Stripe account on a live store reads as not ready, and Set up payments replaces it with a live one ([AGL-2471](https://linear.app/aglyn/issue/AGL-2471))

### Performance

- **marketplace:** load a plugin review's detail page lazily ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

## v1.20.1 — 2026-11-09

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.20.0...v1.20.1)

### Fixed

- **tools:** declare the log-drain receiver's own host ([AGL-1921](https://linear.app/aglyn/issue/AGL-1921))
- **email:** the operator tick stops logging a Resend 401 every 15 minutes ([AGL-1921](https://linear.app/aglyn/issue/AGL-1921))
- **accounting:** post a day's later summary under its own reference ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))
- **ops:** the log-drain receiver's deploy is checked, and two false pages stop ([AGL-1921](https://linear.app/aglyn/issue/AGL-1921))

## v1.20.0 — 2026-11-08

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.19.0...v1.20.0)

### Added

- **native:** a marketplace install for every site can leave sites out
- **native:** sell a card reader at the booth register ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **native:** sign a waiver on the customer display ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **native:** a rider's waiver status at check-in ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **native:** check people in at the register ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **native:** today's check-ins on iPhone and iPad ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **native:** today's check-ins on Android
- **native:** port a stay's guest count rules
- **native:** port the check-in day and rain-check rules
- **native:** mark a site that switched a marketplace plugin off
- **native:** choose where a built-in plugin runs from its page
- **native:** port where a plugin runs across the workspace's sites
- **native:** the CRM default can share new records with all sites except some
- **native:** choose all sites except for a dataset through set-sharing
- **native:** say all sites except on datasets, media and campaigns
- **native:** port the all-sites-except sharing rules to the apps
- **marketplace:** install to all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** start a quote from an Inbox request or a CRM contact on Android ([AGL-4098](https://linear.app/aglyn/issue/AGL-4098))
- **native:** start a quote from an Inbox request or a CRM contact on iOS ([AGL-4098](https://linear.app/aglyn/issue/AGL-4098))
- **crm:** default sharing all sites except some, and apply to existing records ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **plugins:** run a built-in plugin on all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **crm:** share records and sharing rules with all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **campaigns:** share a campaign with all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** a quote's conversation and replies in both apps ([AGL-4207](https://linear.app/aglyn/issue/AGL-4207))
- **media:** share files and folders with all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** the Android quote proofs and revisions ([AGL-4096](https://linear.app/aglyn/issue/AGL-4096))
- **native:** iOS quote proofs and revisions, and a signed upload in both kits ([AGL-4096](https://linear.app/aglyn/issue/AGL-4096))
- **native:** the console's quote proof rules in both contracts ([AGL-4096](https://linear.app/aglyn/issue/AGL-4096))

### Fixed

- **ci:** three main-gate reds after the media and campaign sharing change
- **commerce:** the gate coverage names the quote route as a reader, not a door ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** a links block with every link hidden draws no card on Android
- **native:** the iPhone register searches as you type
- **analytics:** keep the first-touch runtime off every published page
- **analytics:** cap page params at GA4's own limits, not 100
- **analytics:** name the click-id set outside the marketing plugin's vocabulary
- **analytics:** keep a URL's query in GA events, minus personal data
- **native:** a moved rain check takes the day the picker shows
- **native:** a logged activity is marked under the all-sites-except CRM default
- **native:** show Runs on unless sites are built out of the plugin
- **native:** no second Shared with label under the schema's heading
- **native:** name the sites a dataset leaves out, and dim switched-off menu items
- **crm:** new records stamped All sites except carry the marker ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** campaign edit and delete follow the workspace's verdict
- **native:** org automations keep all sites except some on save
- **marketplace:** installed-sites lists show a site that switched a plugin off ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **accounting:** an app removed inside Xero asks to reconnect ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))
- **plugins:** a site's own switch stops a marketplace plugin there ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **accounting:** the Xero daily summary posts through the clearing bank account ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))
- **accounting:** retry re-reads the ledger's currencies before refusing ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))
- **accounting:** a cancelled paid order still posts its sale ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))
- **accounting:** a failed payout or backfill read no longer stops posting ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))

### Documentation

- **crm:** new leads and logged activities follow the default sharing ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

<details>
<summary>Also in this release: 2 test, 6 chore</summary>

- **rules:** media sharing is route-only in the rules matrix ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **tools:** raise the Linear id floor to AGL-4213 ([AGL-4213](https://linear.app/aglyn/issue/AGL-4213), [AGL-4211](https://linear.app/aglyn/issue/AGL-4211), [AGL-4212](https://linear.app/aglyn/issue/AGL-4212), [AGL-4210](https://linear.app/aglyn/issue/AGL-4210))
- **native:** a plugin's link opens its page on both apps
- **native:** dataset sharing goes through set-sharing
- **crm:** default sharing all sites except some ready to land ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **plugins:** carry main into where a built-in plugin runs ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **plugins:** where a built-in plugin runs, ready to land ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **crm:** all sites except some on grants ready to land ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **media:** all sites except some ready to land ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

</details>

## v1.19.0 — 2026-11-07

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/7accf93eb...v1.19.0)

### Added

- **native:** send a quote and its pay link in both apps ([AGL-4097](https://linear.app/aglyn/issue/AGL-4097))
- **native:** the console's quote send and pay link rules in both contracts ([AGL-4097](https://linear.app/aglyn/issue/AGL-4097))
- **native:** the Android quote editor, from New quote and Edit ([AGL-4093](https://linear.app/aglyn/issue/AGL-4093))
- **native:** iOS quote editor, from New quote and Edit ([AGL-4093](https://linear.app/aglyn/issue/AGL-4093))
- **native:** a quote's product line priced as the console prices it ([AGL-4093](https://linear.app/aglyn/issue/AGL-4093))
- **native:** the console's quote editor totals and tax in both apps' contracts ([AGL-4093](https://linear.app/aglyn/issue/AGL-4093))
- **besigner:** repeat any element over a plugin connection's record, and hide a part per record ([AGL-4212](https://linear.app/aglyn/issue/AGL-4212))
- **google-reviews:** every part of the Google reviews display is an element you can style ([AGL-4212](https://linear.app/aglyn/issue/AGL-4212))
- **workflows:** org automations run on all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Fixed

- **commerce:** a product-page template previews a real product ([AGL-4211](https://linear.app/aglyn/issue/AGL-4211))
- **commerce:** the gate coverage names the quote route as a reader, not a door ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))

## v1.18.0 — 2026-11-07

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.17.0...v1.18.0)

### Added

- **native:** the quote notice asks the server whether customers can pay ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **commerce:** the quote route answers whether customers can pay, for the apps ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** the Android quotes list and quote, and Quotes on Orders in both ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** iOS Quotes list and read-only quote, from the Store hub ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** the console's quote rules in both apps' contracts ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))

### Fixed

- **ai:** type the improved words tally's lines as lines with words ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a redesign opens on its own photo; stock only where the site names its world ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a page whose redesign fell back shows each call to action once ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the facts ledger takes no ordinary word for a name, and holds a name in any form ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a picture named only by its file is described by its page ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** mend a site plan where the mend is mechanical, before any re-ask ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a site plan that falls back keeps why on the job's record ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **release-flags:** direct-charges help names in-person sales as direct

## v1.17.0 — 2026-11-07

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.16.0...v1.17.0)

### Added

- **legal:** pin Legal v25, in-person card sales on a store's own Stripe account
- **native:** product add-ons, priced by size and shown on the website ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162), [AGL-4100](https://linear.app/aglyn/issue/AGL-4100))
- **native:** the Selling tabs and workspace menu reach the publish forms ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))
- **commerce:** release_direct_charges on by default for every store
- **data:** the dataset rail is ordered and searched by name on the server ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** an add-on choice's picture, note and combo, as the console's ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))

### Fixed

- **commerce:** no workspace 4G charge for a store on its own Stripe account
- **console:** app-bar publish puts the canvas live, not the stored version ([AGL-4209](https://linear.app/aglyn/issue/AGL-4209))
- **lockdown:** a site lock's cache drop is durable and the verdict keeps an hour bound ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **ai:** a filled button on a dark band wears the site's one primary, light or dark ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **renderer:** a control can go back to the visitor's scheme inside a pinned band ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **commerce:** the Besigner Preview loads storefront products ([AGL-4210](https://linear.app/aglyn/issue/AGL-4210))
- **marketplace:** wrapped README list items and inline code render ([AGL-4197](https://linear.app/aglyn/issue/AGL-4197))
- **commerce:** deleting a draft quote removes its messages ([AGL-4207](https://linear.app/aglyn/issue/AGL-4207))
- **native:** iOS add-on rows reached by id, prices by size on their own row ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** downloads, the dataset head and site-only screens on tablets ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **ai:** a redesign's calls to action once each, in place; no mark as its opening ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a brand's mark never fills a redesign's photo slot ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a header button that asks to be contacted goes to the contact page ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **tenant:** the preview bar sits under the admin bar, not over it ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **commerce:** product names on storefront cards wrap to two lines

### Documentation

- **commerce:** payments docs describe a store's own Stripe account

<details>
<summary>Also in this release: 2 tests, 3 chores</summary>

- **marketplace:** pin the plugin cache drop at every security call site ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **console:** publish guard specs read the shared save-and-publish step ([AGL-4209](https://linear.app/aglyn/issue/AGL-4209))
- **data:** skip CI on the dataset rail name-order head ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **tools:** raise the Linear id floor to AGL-4210 ([AGL-4210](https://linear.app/aglyn/issue/AGL-4210))
- **budgets:** re-baseline commerce for two-line product names on storefront cards

</details>

## v1.16.0 — 2026-11-06

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.15.2...v1.16.0)

### Added

- **commerce:** reply to a quote's customer and let them write on the quote page ([AGL-4207](https://linear.app/aglyn/issue/AGL-4207))
- **commerce:** deliberate proof approval, reject with changes, proof sign-in control ([AGL-4206](https://linear.app/aglyn/issue/AGL-4206))
- **commerce:** product builder on storefront product pages ([AGL-4205](https://linear.app/aglyn/issue/AGL-4205))
- **commerce:** a storefront line takes up to 9,999, not 99 ([AGL-4205](https://linear.app/aglyn/issue/AGL-4205))
- **commerce:** in-person card payments on the store's own Stripe account
- **besigner:** table rows, columns and cell formatting on the canvas ([AGL-4203](https://linear.app/aglyn/issue/AGL-4203))
- **commerce:** a Photo fit setting on the Product grid and Related products
- **native:** publishers set a listing's connection credentials in the apps ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **billing:** the Connect destination carries direct-charge sale events

### Fixed

- **commerce:** sales, restocks and verified reviews drop the cached storefront ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **commerce:** quote messages take a platform id; catalogs and Linear floor regenerated ([AGL-4207](https://linear.app/aglyn/issue/AGL-4207))
- **commerce:** customer message notice names no product ([AGL-4207](https://linear.app/aglyn/issue/AGL-4207))
- **commerce:** price quote editor add-on labels for the picked size ([AGL-4206](https://linear.app/aglyn/issue/AGL-4206))
- **commerce:** product builder back inside the plugin budget; declare its image sinks ([AGL-4205](https://linear.app/aglyn/issue/AGL-4205))
- **commerce:** back-in-stock alert in its own chunk ([AGL-4205](https://linear.app/aglyn/issue/AGL-4205))
- **commerce:** refund a direct sale that carried no platform fee
- **commerce:** payments card describes Stripe billing a direct store
- **deps:** upgrade DOMPurify to 3.4.17 for the SAFE_FOR_TEMPLATES bypass advisory ([AGL-4204](https://linear.app/aglyn/issue/AGL-4204))
- **console:** preview snapshots expire after a day and stay under 1 M characters ([AGL-4204](https://linear.app/aglyn/issue/AGL-4204))
- **console:** a background tab hands the shared Firestore cache to the visible tab ([AGL-4204](https://linear.app/aglyn/issue/AGL-4204), [AGL-3788](https://linear.app/aglyn/issue/AGL-3788))
- **marketplace:** realm plugin row reads the configured brand ([AGL-4197](https://linear.app/aglyn/issue/AGL-4197))
- **marketplace:** installed plugins read as on; listings name the plan ([AGL-4197](https://linear.app/aglyn/issue/AGL-4197))
- **ai:** redesigns say why they fell back; contact pages and kept pictures pass ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **besigner:** a signed plugin's own elements replace its generic entry ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **native:** connection screens match Figma and say all of a failed sync ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **marketplace:** connection card copy and picker labels read right ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **tools:** emulated console seals connections and signs realm trust locally ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))

### Performance

- **tenant:** change-driven tenant cache on a seven-day backstop ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **tenant:** tenant pages take a one-day ISR ceiling ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **tenant:** stop the per-request middleware trace reaching the log drain ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **tenant:** project the realm-install join to the fields it uses ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **tenant:** read the org once in the lockdown verdict, masked elsewhere ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **outreach:** the sync job reads an organization's watched enrollments once per run ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))

<details>
<summary>Also in this release: 4 test, 5 chore, 2 docs</summary>

- **console:** the table-footer owed list drops the Inbox replies, now a shared thread ([AGL-4207](https://linear.app/aglyn/issue/AGL-4207))
- **commerce:** connect-mode gate coverage follows the shared account lookup
- **native:** regenerate the contracts for the quote-message email ([AGL-4207](https://linear.app/aglyn/issue/AGL-4207))
- **native:** regenerate the contracts for the product builder fields ([AGL-4205](https://linear.app/aglyn/issue/AGL-4205))
- **commerce:** picture cards, combos and free mockup requests ([AGL-4205](https://linear.app/aglyn/issue/AGL-4205))
- **native:** regenerate the contracts for the direct-charge payment fields
- **self-host:** name AGLYN_DEBUG_MIDDLEWARE in the environment reference ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **console:** the video-upload gate spec reads the org through a field-masked getAll ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **tenant:** close the preview bar inventory declaration
- **tenant:** declare the preview bar's height style in the image-sink inventory ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **commerce:** close the Photo fit setting

</details>

## v1.15.2 — 2026-11-06

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.15.1...v1.15.2)

### Fixed

- **console:** a booting page keeps checking for another tab's lock ([AGL-4201](https://linear.app/aglyn/issue/AGL-4201))

## v1.15.1 — 2026-11-06

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/6515249f8...v1.15.1)

### Added

- **marketplace:** declared connections for marketplace plugins ([AGL-4193](https://linear.app/aglyn/issue/AGL-4193))
- **marketplace:** where a declared connection's synced record lives ([AGL-4192](https://linear.app/aglyn/issue/AGL-4192))
- **marketplace:** sites show declared connection records, variables and image hosts; signed elements read their own connection record ([AGL-4195](https://linear.app/aglyn/issue/AGL-4195))
- **commerce:** site sales are direct charges on the store's own Stripe account
- **besigner:** edit table cells in place on the canvas ([AGL-4202](https://linear.app/aglyn/issue/AGL-4202))
- **marketplace:** a connection card for sites and a credentials form for publishers; connection records and variables in the Besigner and Preview ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **native:** a site's plugin connections on iOS and Android ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **marketplace:** a Google reviews example plugin with a declared Google connection ([AGL-4197](https://linear.app/aglyn/issue/AGL-4197))
- **legal:** Terms v24, a store can sell on its own Stripe account

### Fixed

- **billing:** a re-quote carries the proposal's code until its answer lands ([AGL-4199](https://linear.app/aglyn/issue/AGL-4199))
- **marketplace:** plugin connection keys reach the native contracts ([AGL-4193](https://linear.app/aglyn/issue/AGL-4193))
- **marketplace:** the permission guard sees the plugin-connections site key ([AGL-4193](https://linear.app/aglyn/issue/AGL-4193))
- **plugins:** validatePluginManifest keeps a valid config block ([AGL-4193](https://linear.app/aglyn/issue/AGL-4193))
- **mui,commerce:** menu panels drop their trigger's text styles; cart icon inherits color ([AGL-4200](https://linear.app/aglyn/issue/AGL-4200))
- **console:** a page opened while another tab holds the cache loads in seconds ([AGL-4201](https://linear.app/aglyn/issue/AGL-4201), [AGL-3428](https://linear.app/aglyn/issue/AGL-3428), [AGL-4135](https://linear.app/aglyn/issue/AGL-4135), [AGL-4090](https://linear.app/aglyn/issue/AGL-4090))
- **mui:** over-hero sticky header stays pinned; dropdown panels stay on screen ([AGL-4200](https://linear.app/aglyn/issue/AGL-4200))
- **commerce:** a trial's subscription row no longer says $0.00 paid so far ([AGL-4191](https://linear.app/aglyn/issue/AGL-4191))
- **commerce:** no checkout offers buy-now-pay-later, and every sale passes through the card rate, 2.9% + 30¢, never below what Stripe charges ([AGL-4198](https://linear.app/aglyn/issue/AGL-4198))
- **sites:** published pages stop loading the plugin manifest validators ([AGL-4201](https://linear.app/aglyn/issue/AGL-4201))
- **privacy:** a workspace export shows a listing's OAuth app, never its secrets ([AGL-4193](https://linear.app/aglyn/issue/AGL-4193))
- **marketplace:** a changed or removed connection record reaches site pages ([AGL-4195](https://linear.app/aglyn/issue/AGL-4195))
- **besigner:** typing in Search title or description no longer redraws the editor
- **accounting:** the bound QuickBooks company id is sealed at rest ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))
- **commerce:** static seller-account import and brand-neutral flag copy
- **commerce:** a product grid's cap counts the products it shows ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **marketplace:** the listing-field guard reads only listing documents ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **native:** the iOS connections card loads, and the plugin pages fill their slots ([AGL-4196](https://linear.app/aglyn/issue/AGL-4196))
- **ai-sites:** a generative redesign no longer falls back, with logo, hero and card fixes ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

### Documentation

- **plugins:** connections docs describe only what runs today ([AGL-4193](https://linear.app/aglyn/issue/AGL-4193))
- **plugins:** what a declared connection shows on a site ([AGL-4195](https://linear.app/aglyn/issue/AGL-4195))

## v1.15.0 — 2026-11-06

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.14.0...v1.15.0)

### Added

- **commerce:** subscriptions list with recurring revenue, renewal and invoices ([AGL-4191](https://linear.app/aglyn/issue/AGL-4191))
- **commerce:** anyone can buy card readers, prompted to add the point of sale ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** hardware orders are received and set up before they ship ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **data:** dataset pickers tell two of one name apart ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** online store sale of card readers becomes a hardware order ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **data:** a dataset record opens on its own page beneath its tab ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **data:** the Data page lists datasets as vertical tabs at their own address ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** hardware card terms acceptance, goods tax code, one price ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** plain card reader names with the model, everywhere ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **data:** every dataset writer stamps nameLower, with backfill and index ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **video:** youtube's own still as the poster of a poster-less film, behind a flag ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **ai:** an AI starter's style and fonts reach the site job ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **legal:** pin Legal v23, terms 4.24 prices projects from the Site Care list
- **commerce:** a product's members videos can be opened to buyers of other products ([AGL-4188](https://linear.app/aglyn/issue/AGL-4188))
- **ai:** hold generated pictures to the meter's wall ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** write generative Improve it's docs and its eval harness, not run ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** show Your new site before a generative import builds ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** plan a generative import once, and fill its slots in order ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** hold a redesign to its ledger and design lines, red to green on replays ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** redesign a page from its ledger behind the generative flag ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** per-org flag for generative Improve it, off by default ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

### Fixed

- **data:** dataset and record tabs name what they show, with card help
- **billing:** keep the proposal's code on the pay card opened from the menu ([AGL-4199](https://linear.app/aglyn/issue/AGL-4199))
- **commerce:** quotes and invoices pay by card or wallet at the card rate ([AGL-4198](https://linear.app/aglyn/issue/AGL-4198))
- **auth:** log a password reset for an unknown address as info
- **loyalty:** add the loyaltyMembers index the program totals need
- **billing:** a Stripe refusal on staff coupons is a 400, not a 502
- **ops:** don't page on a closed site's 503 notice ([AGL-1921](https://linear.app/aglyn/issue/AGL-1921), [AGL-4110](https://linear.app/aglyn/issue/AGL-4110))
- **ops:** retry GitHub's 5xx inside the scheduler dispatcher
- **commerce:** look the buyer's account up by a static import ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **data:** the org Data page's route segment is a plain id ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** say a paid file is being checked, and name it in the question ([AGL-4189](https://linear.app/aglyn/issue/AGL-4189))
- **media:** add the photoLinks hostId+expiresAt index the photo-link list needs ([AGL-3957](https://linear.app/aglyn/issue/AGL-3957), [AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **site:** maintenance wording says the team still sees the site ([AGL-4178](https://linear.app/aglyn/issue/AGL-4178))
- **ai:** the long-page answer lives in its spec, and the axe guard skips the eval's recordings as the eval spec does ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

### Performance

- **data:** load the org datasets card lazily, back under the plugin budget ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Changed

- **ai:** keep blocks typed, no casts, in the generative redesign ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

### Documentation

- **site:** reshoot the Error pages card with the new maintenance label ([AGL-4178](https://linear.app/aglyn/issue/AGL-4178))
- **pricing:** site care project price list on /pricing, and its publish script

<details>
<summary>Also in this release: 6 test, 6 chore</summary>

- **guards:** the emulator sweep runs the commerce plugin's hardware-order spec ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **guards:** classify the subscriptions list, dataset rail and Improve it prompt
- **linear:** raise the issue ceiling to AGL-4199, read from the workspace ([AGL-4199](https://linear.app/aglyn/issue/AGL-4199))
- **selfhost:** allow the Site Care price publish script's preview link
- **budgets:** re-baseline the data plugin after the dataset tabs and record pages ([AGL-4191](https://linear.app/aglyn/issue/AGL-4191))
- **legal:** i.ytimg.com published on the subprocessors page november 5, 2026 ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **commerce:** type the set-up units fixture ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** regenerate the native staff screens for the setup steps token ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **video:** the thumbnail flag waits for the subprocessors publish, with no lead ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **legal:** hold - i.ytimg.com subprocessor entry, lands with the subprocessors publish ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **ai:** the pictures switch reads on by default, and the plan's cached text grows by its roles ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the generative eval runs in node, where the provider batch has fetch ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

</details>

3 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.14.0 — 2026-11-05

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.13.0...v1.14.0)

### Added

- **native:** dataset screens follow the placement verdict and new data keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** integration screens ask their permission keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **datasets:** share a dataset with all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** webhooks per site, export for key holders, Import names its key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **crm:** erase notes, plugin sources as audiences and menus, dead sort flags ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))

### Fixed

- **console:** a stalled landing still provisions the sign-up's workspace ([AGL-4117](https://linear.app/aglyn/issue/AGL-4117))
- **ai:** a gallery is drawn as its photos in their columns; the fidelity holds it ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a group of pictures alone is read as marks or a gallery, in its columns ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a quote and a figure keep their links; a quote in a heading costs no heading ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** every row of a section stands in its columns, and a kept opening stays centered ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the fidelity goes red on a hidden picture or a stray label a build draws ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a page laid on one placed grid reads in its columns and its parts ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a read leaves out what a visitor cannot see; a text block keeps its paragraphs ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **rules:** closed deal creates, colleagues' templates key, marked docs keep scope ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Changed

- **crm:** the plugin source check lives with the capture contract ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))

### Documentation

- **datasets:** what's new, and deleting a site a marked dataset reached ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **datasets:** a marked dataset answers as on several sites ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **crm:** the erase dialog's kept-as-they-are row ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))

<details>
<summary>Also in this release: 1 test, 2 chore</summary>

- **datasets:** all sites except some ready to land ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **crm:** deal gaps and marker freeze ready to merge ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **datasets:** pin the marker off exports without marking the shared seeds ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

</details>

## v1.13.0 — 2026-11-05

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.12.0...v1.13.0)

### Added

- **sharing:** sweep keeps all-except sharing current as sites change ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **data:** hub's dataset Import switches off naming the key rather than hiding ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **sites:** a site's Permissions button also opens for site.manage, as its route does ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **email:** sending domain actions ask org.sendingDomains, as the domains route does ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **media:** org library writes switch off naming org.media; temporary link stays on ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **sharing:** pure helpers for sharing with all sites except some ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** the other nine integrations ask keys, not site roles ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** integrations and gift card import ask keys, not site roles ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **ai:** the import reads a form defined in data ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **data:** dataset Import switches off naming the key rather than hiding ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketing:** empty-list Create and row Delete switch off naming the key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **settings:** workspace export moves to Import & export so a key holder reaches it ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **workflows:** org webhooks list asks site.sensitive per site, as the rule does ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **media:** sharing controls switch off naming the media key; default sharing names its key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** an order says it was rung offline and what to check ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** stays set Only N left and guests; a stored 1 stays a number ([AGL-4044](https://linear.app/aglyn/issue/AGL-4044), [AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **native:** per-site permissions and the register asks managePos ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** download and email an order's invoice on iOS and Android ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** register and kiosk price modifiers on the picked variant ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** inbox quote requests and files, named notifications ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **native:** content, media, sites and shell gates ask their permission keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** the erase card prints plugin notes, and kiosks search the menu ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** settings, billing and plugin screens ask their permission keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** crm, email and inbox gates ask their permission keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Fixed

- **sharing:** a scope sweep document is named by a resource id, as every platform document is ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** card specs read the refusal; a locked connect form keeps its label ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **ai:** an element's --primary or --secondary says its button; a skip link is no call to action ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a bare read never leaves an imported site in the stock theme ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the import reads every stylesheet a site links, to a byte budget ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a page placed on a grid reads in the order and columns a visitor sees ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **permissions:** copy names the permission, not a role; rename useCanManageSite ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **workflows:** Add on a site stays as it was; the create route asks its own key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** a refusal stays on an iOS spec screen until dismissed ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))
- **inbox:** the workspace leads screen stops its member read when it goes away ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **besigner:** saving stays closed until the page has loaded ([AGL-4174](https://linear.app/aglyn/issue/AGL-4174))

### Documentation

- **ai:** the import's stylesheet budget, look fallback and data forms ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **permissions:** name the permission; state a site member's reach, spec it true ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** catalog says row deletes ask Manage data, whole deletes the erase key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

<details>
<summary>Also in this release: 1 test, 2 chore</summary>

- gates round 2 ready to land ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **docs:** regenerate the Assist docs index ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **ai:** the job spec's site exists, since the look pass always draws it a theme ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

</details>

9 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

### Added while this release was open

- feat(commerce): add a quote proof from the media library, and send one before a price ([AGL-4184](https://linear.app/aglyn/issue/AGL-4184))
- feat(sharing): rules freeze the all-sites-except marker, no one-site verdict on it ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- feat(data): hub Import switches off naming the key; a dataset's asks its placement ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- feat(sites): a site's role picker, Remove and Add also open for site.manage ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- feat(media): upload, folders, replace, file info, usage scan answer to the library key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- fix(native): order, shift and message times show device time, not UTC ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- fix(native): a stay's Only N left follows Sleeps, as the console's dialog has it ([AGL-4044](https://linear.app/aglyn/issue/AGL-4044))
- fix(native): the role editor and gates know the four dataset permissions ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- fix(plugins): a refused integration card keeps its help link ([AGL-2213](https://linear.app/aglyn/issue/AGL-2213))
- fix(settings): Import & export holds while permissions load, spelled as the gate sweep reads it ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- fix: media URLs keep working under all sites except, and legacy paths name the site ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- docs: media, site users and import pages say which permission each control takes ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- test(permissions): refusal specs read the permission's name; the refusal sweep pairs each site door's key with the key it names ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- test(console): setup mocks gain the entitlements subscription; the nav spec reads screens, not permission keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

## v1.12.0 — 2026-11-05

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.11.0...v1.12.0)

### Added

- **marketing:** campaign create and edit switch off without the key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **crm:** CRM and audience writes ask permission keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **console:** workspace plugin settings form follows org.settings ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** screens and plugin gates ask catalog keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** Buy off with the reason for a publisher's members elsewhere ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **crm:** share controls switched off with the permission named, specs ask the key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** own listings install free only on the publisher's own sites ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **rules:** people, list, AI billing and hardware order reads ask the key alone ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** Payouts, Verified and Review status controls ask the same keys; docs ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** payouts, the Verified ask and version history ask publisher keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **rules:** publisher, listing and Sequences reads ask stamped keys, not roles ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** seller controls ask the publisher keys and name them; docs ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** the publisher profile and listing doors ask their own keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **console:** pin as many sites as you like in a workspace ([AGL-4165](https://linear.app/aglyn/issue/AGL-4165))

### Fixed

- **crm:** name the source option type so core declares no CRM domain word ([AGL-3680](https://linear.app/aglyn/issue/AGL-3680))
- **crm:** the contact Source filter offers any plugin's source, Sources sorts by label ([AGL-3680](https://linear.app/aglyn/issue/AGL-3680))
- **rules:** a client update cannot change where a deal stands ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **ai:** Also improve my wording quotes about 25 more credits, as the live wave measured ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **storefront:** waivers fit any trade, and compare-at prices are readable ([AGL-4180](https://linear.app/aglyn/issue/AGL-4180))
- **accounting:** handle what real QuickBooks and Xero refuse ([AGL-3614](https://linear.app/aglyn/issue/AGL-3614))
- **android:** the Listings refusal sits under the rows, as elsewhere ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** the Verified buyer badge on reviews is readable ([AGL-4179](https://linear.app/aglyn/issue/AGL-4179))
- **tenant:** a site's team sees the site while it is in maintenance mode ([AGL-4178](https://linear.app/aglyn/issue/AGL-4178))
- **commerce:** a collection page lists only that collection's products ([AGL-4177](https://linear.app/aglyn/issue/AGL-4177))
- **apple:** the Selling listings menu opens, and no site is not a refusal ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **site:** the announcement bar no longer covers a header over the hero ([AGL-4176](https://linear.app/aglyn/issue/AGL-4176))
- **seed:** demo data uses the shapes the product reads ([AGL-4175](https://linear.app/aglyn/issue/AGL-4175))
- **besigner:** saving waits until a saved draft has loaded ([AGL-4174](https://linear.app/aglyn/issue/AGL-4174))
- **crm:** register the settings key through declarations only, within budget ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** quote dialog and response notice state the tax charged ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- **rules:** site allotment arm asks a collaborator as its route does; CRM key docs ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **shared-ui-jsx:** a same-page #link no longer opens the loading overlay ([AGL-4173](https://linear.app/aglyn/issue/AGL-4173))
- **commerce:** storefront grid and related products print two-decimal prices ([AGL-4167](https://linear.app/aglyn/issue/AGL-4167))
- **crm:** a name lookup no longer keeps one failed read until the page reloads ([AGL-4164](https://linear.app/aglyn/issue/AGL-4164), [AGL-1440](https://linear.app/aglyn/issue/AGL-1440))

### Documentation

- name the permission and its default holders, not a role ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** a listing is free on its publisher's own sites only ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

<details>
<summary>Also in this release: 4 test, 8 chore</summary>

- **crm:** main merged, contact Source filter ready to merge ([AGL-3680](https://linear.app/aglyn/issue/AGL-3680))
- **crm:** contact Source filter and Sources sort ready to merge ([AGL-3680](https://linear.app/aglyn/issue/AGL-3680))
- **native:** regenerate contract cases after merging main ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **marketplace:** the Selling gates read the member's stamp ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** regenerate contract cases after merging main ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **besigner:** the draft state fixture names sharedDraftLoading ([AGL-4174](https://linear.app/aglyn/issue/AGL-4174))
- **docs:** regenerate the assistant's docs index for the CRM settings key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **rules:** allow and deny rows for the readers that now ask the key alone ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** the plugin-key enforcement guard reads dotted keys too ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **docs:** regenerate the docs index for main's console tour edit ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **tools:** the demo seeds leave the hand-built demo sites' pages alone ([AGL-4166](https://linear.app/aglyn/issue/AGL-4166))
- **docs:** the pricing table's single sign-on row names SSO ([AGL-4126](https://linear.app/aglyn/issue/AGL-4126))

</details>

6 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

### Added while this release was open

- docs(ai): Keep my site's look measures, and what a button too light for white words does ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- feat(ai): the reader keeps each button style's case, the outlined color, the soft fill and a page's dark scheme from its CSS ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- feat(commerce): product CSV carries add-ons, check-in, quick key ([AGL-4060](https://linear.app/aglyn/issue/AGL-4060))
- feat(native): a role and a member's permissions cover the whole catalog ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- feat(privacy): plugins say what a person erasure keeps on the Erase a person card ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- fix(ai): Keep my site's fidelity fails what the eye fails: the opening's place, grounds in both schemes, fill, case per style, outline ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- fix(ai): Keep my site's measures read the theme's own roles, and the 11/5 Home is held red to green; the look line prints paper, outline and text case ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- fix(ai): Keep my site's theme holds the source's paper, its fill under a label that reads, and its outlined and text buttons over the base ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- fix(ai): a light band is read against its page's ground, and a dark fill only where the dark scheme changes it; Improve it reads as before ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- fix(ai): an answer of none opens a kept page as the source's own too, and the set of heroes an answer could pick goes ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- fix(ai): under Keep my site the opening is the source's own hero, whatever the answer asks, its heading held to the source's measure ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- fix(apple): the app model imports the contracts for the plugin list ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- fix(commerce): the kiosk reaches the whole catalog past its first 200 ([AGL-4060](https://linear.app/aglyn/issue/AGL-4060))
- fix(site): the members page header is whole, Markdown reads _italics_, Minimal's quiet text is readable ([AGL-4182](https://linear.app/aglyn/issue/AGL-4182))
- fix(themes): tabs stay inside the page on a phone ([AGL-4181](https://linear.app/aglyn/issue/AGL-4181))
- test(ai): a page's dark scheme is read from its media queries and root marks, and none from aglyn.com's Home ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- test(ai): aglyn.com's Home recorded as it read on 11/5, with the answer that import took ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- test(outreach): the rules drift spec reads the key the read now asks ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- test: count the campaign member read, and widen a flaky rate-limit deadline ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047), [AGL-2404](https://linear.app/aglyn/issue/AGL-2404))

- [AGL-4047](https://linear.app/aglyn/issue/AGL-4047): a one-site campaign adds the site's verdict at the rule
- [AGL-4047](https://linear.app/aglyn/issue/AGL-4047): console follows the one-site campaign verdict; Delete names the permission
- [AGL-4047](https://linear.app/aglyn/issue/AGL-4047): regenerate the Assist docs index for the campaign permission note
- feat(native): data, transfer, AI billing and copy ask keys, not roles ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- fix(ai): Bring my site reads pages, not every address of them ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- fix(data): a site's Data page lists its own datasets; write controls name the key ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- fix(native): read an unpaid quote from stored fields, not the decoded order ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- fix(native): the Orders lists leave out unpaid quotes under every sort ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))
- fix(native): the transfer screens' generator asks data.manage, as #2343 meant ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

- fix(besigner): a stale cached page no longer reads as someone else saving ([AGL-4183](https://linear.app/aglyn/issue/AGL-4183))
- fix(native): a site's Data lists only what that site can use ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- test(besigner): the cached-copy spec reads what reached the canvas ([AGL-4183](https://linear.app/aglyn/issue/AGL-4183))
- test(tenant): declare the crawl fixture's three new image markers ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

## v1.11.0 — 2026-11-04

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.10.0...v1.11.0)

### Added

- **billing:** staff net MRR takes a base-price-only coupon off the base price only ([AGL-4161](https://linear.app/aglyn/issue/AGL-4161), [AGL-4159](https://linear.app/aglyn/issue/AGL-4159))
- **billing:** a plan switch on a live subscription applies the offer's promotion code ([AGL-4160](https://linear.app/aglyn/issue/AGL-4160))
- **tools:** the store-review workspace seeds quotes and invoices ([AGL-3812](https://linear.app/aglyn/issue/AGL-3812), [AGL-4093](https://linear.app/aglyn/issue/AGL-4093))
- **billing:** staff coupons can take their discount off one plan's base price ([AGL-4159](https://linear.app/aglyn/issue/AGL-4159))
- **commerce:** quotes say what Pay waits on, older quotes pay under the store's tax, and the page offers only a Pay that works ([AGL-4162](https://linear.app/aglyn/issue/AGL-4162))

### Fixed

- **crm:** a record picker names a linked record outside its window, never its id ([AGL-4163](https://linear.app/aglyn/issue/AGL-4163))
- **billing:** the billing layout spec accepts the quote card's new guard, which also skips a subscriber's own plan ([AGL-4160](https://linear.app/aglyn/issue/AGL-4160))

## v1.10.0 — 2026-11-04

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/4cbc8c1f0...v1.10.0)

### Added

- **native:** Aglyn AI credits are a 0–30 block stepper on Apple and Android, in the console's words ([AGL-4155](https://linear.app/aglyn/issue/AGL-4155))
- **ai:** Also improve my wording rewrites as a copywriter would, every fact still held ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a reworded page is quoted on the AI page row, and named in its wave's quote ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** a main page's lines are reworded under Also improve my wording, every fact held ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** rule 14 judges a reworded line again, and fidelity shares its fact tokens ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the fidelity report scores and prints each page's finish and words ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** fidelity scores a page as Keep my site or Improve it, and improved words ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** keep pins a source's grounds, button case and own fill; improve pins colors ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the reader keeps a source's dark ground, button case and hero measure ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the read and the job page ask how the new site should look, before each wave ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** an import keeps Keep my site or Improve it and stamps each wave with it ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** Bring my site's compile reads Keep my site or Improve it ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the site compiler draws a page brought in kept as it is or improved ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the types Bring my site's Keep my site or Improve it choice rides on ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

### Fixed

- **native:** a prompt with a preview check confirms after the check answers, never half-filled in the sheet ([AGL-4155](https://linear.app/aglyn/issue/AGL-4155))
- **android:** NavShellUiTest reads the shell's writes from a copy-on-write list, so the kotlin check no longer flakes ([AGL-4155](https://linear.app/aglyn/issue/AGL-4155))
- **billing:** a never-billed workspace keeps its link's promotion code ([AGL-4157](https://linear.app/aglyn/issue/AGL-4157))
- **pricing:** retired plan names are out of customer and operator strings; the staff base-plan pickers offer Custom, Pro and Starter; Custom's saved forms are unlimited ([AGL-4158](https://linear.app/aglyn/issue/AGL-4158))
- **ai:** an improved page keeps its questions and plans; a reworded line takes no other's words ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** Keep my site's lanes agree: the hero measure, held boxes and a fill no label reads ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

### Documentation

- **docs:** the Figma pricing frames and the pricing-tables reconciler follow the live page: Hobby and Enterprise labels, the Pro card's copy, the Enterprise strip, the FAQ, the calculator and the usage-pricing section ([AGL-4126](https://linear.app/aglyn/issue/AGL-4126))
- **ai:** the Bring my site guide says which words Also improve my wording keeps ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the Bring my site guide says Keep my site or improve it ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

<details>
<summary>Also in this release: 4 test</summary>

- **console:** the subprocessor gate names Bring my site's wording eval as a key it only mentions ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the wording eval runs in node, where the provider batch has fetch ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the wording eval, by the real model, on the eight recorded main pages ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the start and job page specs read what the wording switch adds on the page row ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))
- **ai:** the slate page's markup moves to an html fixture, as the site-layout pages are ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152))

</details>

## v1.9.1 — 2026-11-04

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.9.0...v1.9.1)

### Fixed

- **firestore:** a tab whose Firestore queue fails reloads onto the memory cache ([AGL-4156](https://linear.app/aglyn/issue/AGL-4156), [AGL-3428](https://linear.app/aglyn/issue/AGL-3428))
- **console:** cap coupon names at Stripe's 40 characters

## v1.9.0 — 2026-11-04

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.8.0...v1.9.0)

### Added

- **native:** plan screens list Free, Starter and Pro and name the top plan Custom ([AGL-4150](https://linear.app/aglyn/issue/AGL-4150))
- **ios:** sign-up links sell Starter and Pro, the top plan reads Custom ([AGL-4150](https://linear.app/aglyn/issue/AGL-4150))
- **android:** sign-up links sell Starter and Pro, the top plan reads Custom ([AGL-4150](https://linear.app/aglyn/issue/AGL-4150))
- **console:** sell Free, Starter and Pro and name the top plan Custom ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **billing:** workflow and action runs past the bands bill at $0.02 per 1,000 ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **pricing:** pricing v4 plan catalog: Free, Starter, Pro and Custom ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **billing:** Aglyn AI credits are one add-on sold by the block ([AGL-4144](https://linear.app/aglyn/issue/AGL-4144))
- **legal:** pin Legal v22, Terms 4.1 names Free, Starter, Pro and Custom ([AGL-4149](https://linear.app/aglyn/issue/AGL-4149))
- **staff:** override a workspace's daily transactional ceiling ([AGL-4145](https://linear.app/aglyn/issue/AGL-4145))
- **email:** a daily per-workspace ceiling on a site's transactional mail ([AGL-4145](https://linear.app/aglyn/issue/AGL-4145))
- **crm-native:** Kotlin Log activity names who and what, roles, New contact opt-in ([AGL-4142](https://linear.app/aglyn/issue/AGL-4142))
- **crm-native:** Apple Log activity names who and what, roles, New contact opt-in ([AGL-4142](https://linear.app/aglyn/issue/AGL-4142))
- **crm:** Related To rows and contact role rules become pure modules the apps replay ([AGL-4142](https://linear.app/aglyn/issue/AGL-4142))

### Fixed

- **tenant:** internal redirects keep the query string without a 500 ([AGL-4153](https://linear.app/aglyn/issue/AGL-4153))
- **billing:** a standing proposal's bundle and code are priced without its link ([AGL-4154](https://linear.app/aglyn/issue/AGL-4154))
- **native:** automation steps name Pro on the webhook and custom JS steps ([AGL-4150](https://linear.app/aglyn/issue/AGL-4150))
- **native:** the overage screen meters Pro's API requests, API keys name Pro ([AGL-4150](https://linear.app/aglyn/issue/AGL-4150))
- **billing:** read the run counts off the declared bands, not the plugin's meters ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **console:** staff broadcast and coupon rating read the v4 plans ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **ai:** the live fidelity report finds a page's photos in its library ([AGL-4109](https://linear.app/aglyn/issue/AGL-4109))
- **ai:** wave rows count the old page's own words, and say when they are in preview ([AGL-4084](https://linear.app/aglyn/issue/AGL-4084))
- **ai:** an imported film's card keeps the source's width; words under it stay under ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140), [AGL-4138](https://linear.app/aglyn/issue/AGL-4138))
- **ai:** an imported page keeps each photo's size, so it is framed at its own shape ([AGL-4138](https://linear.app/aglyn/issue/AGL-4138))
- **crm:** a mobile-only person every door writes is found by the mobile ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **crm:** a Properties card save keeps the mobile as the number a contact is found by ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **crm-native:** Apple Add contact opens from the record screen, in the form's own header ([AGL-4142](https://linear.app/aglyn/issue/AGL-4142))

### Documentation

- **pricing:** self-host price names and the v4 decision carry the AI block ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **pricing:** the docs describe pricing v4, four plans and AI credits by the block ([AGL-4148](https://linear.app/aglyn/issue/AGL-4148))

<details>
<summary>Also in this release: 4 test, 7 chore</summary>

- **pricing:** the plan specs read v4's bands, with Starter as the bounded plan ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **native:** regenerate the staff screens' plan names, enterprise reads Custom ([AGL-4150](https://linear.app/aglyn/issue/AGL-4150))
- **native:** an entitlement load names Pro as the plan with gift cards ([AGL-4150](https://linear.app/aglyn/issue/AGL-4150))
- **pricing:** the feature matrix and the staff plan pickers name the Custom plan ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **workflows:** pin the Pro plan suffix on the webhook and custom-JS steps ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **pricing:** reconcile the pricing tables against the v4 Figma frames ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **pricing:** move the pricing v4 pins, Stripe script, tables and records ([AGL-4143](https://linear.app/aglyn/issue/AGL-4143))
- **linear:** raise the id ceiling to AGL-4152 ([AGL-4152](https://linear.app/aglyn/issue/AGL-4152), [AGL-4145](https://linear.app/aglyn/issue/AGL-4145), [AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **billing:** transactional sends reach the org cost meter ([AGL-4145](https://linear.app/aglyn/issue/AGL-4145))
- **pricing:** the v4 Figma Pricing frames, extracted ([AGL-4148](https://linear.app/aglyn/issue/AGL-4148))
- **crm-native:** Name, Related To, contact roles and the opt-in land on main ([AGL-4142](https://linear.app/aglyn/issue/AGL-4142))

</details>

## v1.8.0 — 2026-11-03

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.7.0...v1.8.0)

### Added

- **ai:** a video on an imported page is a video on the new page ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **mui:** the Video element plays YouTube and Vimeo links, poster first ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))

### Fixed

- **ai:** a film the import plays from the old site's address is approved for the site ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **ai:** an imported mega menu keeps the source's columns, tiles and featured card, and opens on hover ([AGL-4139](https://linear.app/aglyn/issue/AGL-4139))
- **ai:** an imported site's eyebrows wear the source's own color, with no dash before them ([AGL-4138](https://linear.app/aglyn/issue/AGL-4138))
- **ai:** an imported page draws its pictures, eyebrows, statement, cards and steps as the source does ([AGL-4138](https://linear.app/aglyn/issue/AGL-4138))
- **uptime:** a health door that times out alone is asked once more ([AGL-4137](https://linear.app/aglyn/issue/AGL-4137))
- **beacon:** a bridge injected before the page moved on the client is dropped ([AGL-4068](https://linear.app/aglyn/issue/AGL-4068))
- **console:** the first-site door names its workspace name as derived ([AGL-4117](https://linear.app/aglyn/issue/AGL-4117))

### Performance

- **core:** the video hosts' declarations are a file of their own, off every published page ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))

### Changed

- **ai:** the frame's color ranking is aiSiteImportFrameColorRole, apart from the page compile's ([AGL-4139](https://linear.app/aglyn/issue/AGL-4139))

### Documentation

- **ai:** how an imported site's menus, footer and icon come in ([AGL-4139](https://linear.app/aglyn/issue/AGL-4139))
- **ai:** Bring my site draws pictures, labels, statements, cards and steps as your page does ([AGL-4138](https://linear.app/aglyn/issue/AGL-4138))
- the members-only page names member accounts apart from gated content ([AGL-4141](https://linear.app/aglyn/issue/AGL-4141))

<details>
<summary>Also in this release: 3 test, 3 chore</summary>

- **tenant:** declare the import reader's video markers and the import step's icon reader ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **ai:** pin the import's films, its play button and its unchanged design text ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))
- **ai:** name the frame's color roles apart from member roles, and regenerate the Assist docs index ([AGL-4139](https://linear.app/aglyn/issue/AGL-4139))
- **docs:** regenerate Assist's docs index for the Bring my site guide ([AGL-4138](https://linear.app/aglyn/issue/AGL-4138))
- **ai:** an import's pictures are scored on their framing, over a blog listing that crops its own ([AGL-4138](https://linear.app/aglyn/issue/AGL-4138))
- **linear:** raise the id ceiling to AGL-4140 ([AGL-4140](https://linear.app/aglyn/issue/AGL-4140))

</details>

## v1.7.0 — 2026-11-03

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.6.0...v1.7.0)

### Added

- **ai:** weekly insights become an analyst note: what it meant, why and what next ([AGL-4131](https://linear.app/aglyn/issue/AGL-4131))

### Fixed

- **ai:** the weekly note calls a page publish an update too, and a steady source never explains a move ([AGL-4131](https://linear.app/aglyn/issue/AGL-4131))
- **ai:** a weekly note's reason never rests on a source that held steady ([AGL-4131](https://linear.app/aglyn/issue/AGL-4131))
- **uptime:** a run where every answer was slow retries its silent rows ([AGL-4137](https://linear.app/aglyn/issue/AGL-4137))

<details>
<summary>Also in this release: 3 chores</summary>

- **linear:** raise the id ceiling to AGL-4137 ([AGL-4137](https://linear.app/aglyn/issue/AGL-4137))
- **release:** a hotfix promotion the sweep merges still publishes to npm
- **libs:** package READMEs install the current release, not the beta

</details>

## v1.6.0 — 2026-11-03

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.5.1...v1.6.0)

### Added

- **setup:** an Assist address shows everywhere, and agents read the site's one email ([AGL-4136](https://linear.app/aglyn/issue/AGL-4136))
- **setup:** a site's business details live in one place, on Setup → Business profile ([AGL-4136](https://linear.app/aglyn/issue/AGL-4136))

### Fixed

- **console:** workspace plugin settings wait on the org's read alone ([AGL-4135](https://linear.app/aglyn/issue/AGL-4135))
- **console:** the console's guarded saves wait on their own read ([AGL-4135](https://linear.app/aglyn/issue/AGL-4135))
- **crm:** the rest of the CRM's guarded saves wait on their own read ([AGL-4135](https://linear.app/aglyn/issue/AGL-4135))
- **plugins:** each plugin's guarded save waits on its own read ([AGL-4135](https://linear.app/aglyn/issue/AGL-4135))
- **firestore:** useDocData hands its listener to the save it seeds ([AGL-4135](https://linear.app/aglyn/issue/AGL-4135))

## v1.5.1 — 2026-11-03

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.5.0...v1.5.1)

### Fixed

- **domains:** a connected domain's www or bare partner redirects to it for good ([AGL-4134](https://linear.app/aglyn/issue/AGL-4134))
- **crm:** the stages and add-to-list dialogs keep what is entered through a snapshot ([AGL-4132](https://linear.app/aglyn/issue/AGL-4132))
- **crm:** a record's save waits on its own read, not every listener on the page ([AGL-4135](https://linear.app/aglyn/issue/AGL-4135))
- **firestore:** a tab waiting on another tab's cache is not cycled or reloaded ([AGL-4135](https://linear.app/aglyn/issue/AGL-4135))

## v1.5.0 — 2026-11-03

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.4.0...v1.5.0)

### Added

- **weekly-summary:** the free email takes the insights layout, links and all ([AGL-4131](https://linear.app/aglyn/issue/AGL-4131))

### Fixed

- **health:** the billing door stops reading pending Stripe events as failures ([AGL-4133](https://linear.app/aglyn/issue/AGL-4133))
- **crm:** the Edit deal drawer shows its links and writes only what changed ([AGL-4132](https://linear.app/aglyn/issue/AGL-4132))
- **console:** a typed workspace name survives a missed claim ([AGL-4117](https://linear.app/aglyn/issue/AGL-4117))

<details>
<summary>Also in this release: 1 test, 1 chore</summary>

- **console:** the Google door's create names its name as derived ([AGL-4117](https://linear.app/aglyn/issue/AGL-4117))
- **linear:** raise the id ceiling to AGL-4131 ([AGL-4131](https://linear.app/aglyn/issue/AGL-4131))

</details>

## v1.4.0 — 2026-11-02

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.3.0...v1.4.0)

### Added

- **marketplace:** pin the Publisher Agreement at 2026-11-02.1, site starters ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049), [AGL-4130](https://linear.app/aglyn/issue/AGL-4130))
- **ai:** weekly insights read at a glance, one section a topic with figures and links ([AGL-4130](https://linear.app/aglyn/issue/AGL-4130))
- **ai:** a job's page says what the job is for and what it left ([AGL-4130](https://linear.app/aglyn/issue/AGL-4130))

### Fixed

- **aglyn:** a character reference in author HTML stays one character ([AGL-4130](https://linear.app/aglyn/issue/AGL-4130))

## v1.3.0 — 2026-11-02

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.2.0...v1.3.0)

### Added

- **ai:** a form on a page brought in is rebuilt as the site's own form ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083), [AGL-4084](https://linear.app/aglyn/issue/AGL-4084))
- **native:** the pick's note holds the foot of the sheet, and the Apple drive ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **native:** publish a site starter, and pick one in Create site ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the apps ask what a starter publish would capture ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** charging the saved card takes billing.manage ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **native:** Create site takes a logo, a dark logo and a favicon ([AGL-4119](https://linear.app/aglyn/issue/AGL-4119))
- **marketplace:** the publish form asks the server whether a workspace sells as the platform ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** Buy pays in the console, the card form moves to a lib, Stripe stays lazy ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **native:** Create site asks a style before it creates anything ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the pay door, an invoice on the card on file; the webhook records it as a session ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the platform org at the staff waiver sells with no transfer and no payout account ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** Publish as a starter, its theme chosen and each setup step said first ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))

### Fixed

- **tenant:** a site's notice goes out as a 503 with its page in the body ([AGL-4110](https://linear.app/aglyn/issue/AGL-4110))
- **ai:** the measured import records its whole run of copied pages ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083))
- **ai:** an import never ends with pages left, and fits one document for its whole run ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083))
- **ai:** plan cards, rows and page widths are drawn as the source draws them ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083), [AGL-4084](https://linear.app/aglyn/issue/AGL-4084))
- **marketplace:** the plan lock sentence keeps its console specs, and the style name is allowed ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** the fidelity report reads the look a site wears, and import credits are what was measured ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083), [AGL-4109](https://linear.app/aglyn/issue/AGL-4109))
- **ai:** a stock photo names its world, and alt text reads as a plain description ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **billing:** Stripe fields follow the color scheme actually on screen ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **crm:** a person with no address reads cleanly in the merge dialog ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **billing:** a usage sweep lists its orgs and sites once, not on every chunk ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **native:** a new site opens on its Home, and Create site stays closed ([AGL-4129](https://linear.app/aglyn/issue/AGL-4129))
- **native:** the full-screen panel runs under the system bars, a taller Mac sheet ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** on a listing, a starter's Buy asks for hosts.create, as the pay door does ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the pay panel has its own surface, and a starter's Buy asks for hosts.create on the listing too ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** read the measurement id by dot, so Next inlines it ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** a partial address reads as a missing one at the quote, as test mode answers it ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** Publish as a starter holds its host listen itself, through the console's hook; specs follow the moved card form ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **native:** the domain sentence sits under the fields, a filled check on the picked card ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **console:** the site style pictures reach the native apps ([AGL-4127](https://linear.app/aglyn/issue/AGL-4127))

### Changed

- **marketplace:** resolveSale holds what a sale decides before Stripe ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))

### Documentation

- **ai:** the guide says what happens when an import stops before it finishes ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083))
- **marketplace:** site starters in the Aglyn app ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the pay door's comments read as written ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** paying in the console, the receipt, and the platform org marker ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** name the Figma section Publish as a starter is drawn in ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** Publish as a starter, its section and shot on the seeded emulator ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))

<details>
<summary>Also in this release: 6 test, 3 chore</summary>

- **ai:** a rebuilt form is among an import's outputs ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083))
- **ai:** the import specs read a form rebuilt on a page ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083))
- **native:** the starter cases name no real host ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the starter specs typecheck ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **release:** a new major version waits for the owner, semver stays
- **aglyn:** the status list's documented copy moved with the payment method reader ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **console:** the card spec stands in for the console's useHost ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **commerce:** the money door list names where the marketplace sale is decided ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **tools:** raise the Linear id floor to AGL-4127, read off the workspace ([AGL-4127](https://linear.app/aglyn/issue/AGL-4127))

</details>

## v1.2.0 — 2026-11-01

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.1.0...v1.2.0)

### Added

- **crm-native:** a contact needs no email, and native activity rolls up to the company ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))
- **crm-native:** the deals section reads Deals / Opportunities in the apps ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))
- **crm-native:** Kotlin CRM creates with no site, optional source, real activity marks ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))
- **crm-native:** Apple CRM creates with no site, optional source, real activity marks ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))

### Fixed

- **crm:** what the live check found on company roles, pickers and Known by ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **crm-native:** a contact's edit shows at once on the polling reader ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))
- **crm-native:** a required Site field reads Choose, not None, on Apple ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))
- **crm-native:** a new contact's Source site says them, as the console does ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))

<details>
<summary>Also in this release: 1 chore</summary>

- **crm-native:** land on main ([AGL-4124](https://linear.app/aglyn/issue/AGL-4124))

</details>

## v1.1.0 — 2026-11-01

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0...v1.1.0)

### Added

- **console:** the failure notice stays until it is read, and a docs shot of the fields ([AGL-4119](https://linear.app/aglyn/issue/AGL-4119))
- **console:** Create site takes a logo, a dark logo and a favicon ([AGL-4119](https://linear.app/aglyn/issue/AGL-4119))
- **crm:** contact roles on a company, and the label reads Deals / Opportunities ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **crm:** the rollup reads the organization's own facet ([AGL-4123](https://linear.app/aglyn/issue/AGL-4123), [AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **crm:** activity rolls up to the company, with Name and Related To ([AGL-4123](https://linear.app/aglyn/issue/AGL-4123))
- **crm:** the whole-org migration, honest deal totals while loading, and the API's blank address ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **crm:** a contact needs no site and no email, and an address can come later ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **marketplace:** docs shot of the starter queue, and the starter page names its source site ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** report an import's fidelity score, from the recordings or a built site ([AGL-4109](https://linear.app/aglyn/issue/AGL-4109), [AGL-4114](https://linear.app/aglyn/issue/AGL-4114))
- **console:** an AI pick continues to the questions; its site takes the guided path ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** an AI starter's answers fill the Start with AI questions, its style chosen ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** an AI starter's answers, behind the search's gates, read once it is picked ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))

### Fixed

- **crm:** the contact form follows the document until it is edited, so a page drawn from the cache can't write old values back over newer ones ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **ai:** the chat is told what a thread changed, apart from what it said ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))
- **marketplace:** each starter review card has its own help ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **crm:** keep the eager bundle inside its budget, and regenerate the native contracts for the label ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **console:** the workspace logo hint names no brand, and the published prune has a spec ([AGL-4119](https://linear.app/aglyn/issue/AGL-4119))
- **ai:** the fidelity report takes the default app, says when nothing was scored, and lists a frame's shortfalls ([AGL-4109](https://linear.app/aglyn/issue/AGL-4109))

### Documentation

- **claude:** a promotion title follows the version, now the beta series has ended ([AGL-4051](https://linear.app/aglyn/issue/AGL-4051))
- **ai:** the two AI starter screenshots, shot on the seeded emulator ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** say what reading a served source again needs in the fidelity report ([AGL-4109](https://linear.app/aglyn/issue/AGL-4109))
- **ai:** start from an AI starter and its look; shots defined, not yet taken ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))

<details>
<summary>Also in this release: 3 test, 2 chore</summary>

- **crm:** regenerate the plugin titles for the Deals / Opportunities label ([AGL-4122](https://linear.app/aglyn/issue/AGL-4122))
- **tools:** raise the Linear id floor to AGL-4125, read off the workspace ([AGL-4125](https://linear.app/aglyn/issue/AGL-4125))
- **tenant:** a measured Storage body stays open until it is wired ([AGL-4125](https://linear.app/aglyn/issue/AGL-4125))
- **ai:** read the fidelity source without its photos by name ([AGL-4109](https://linear.app/aglyn/issue/AGL-4109))
- **ai:** hold the import's fidelity score and a tab panel's row to the recorded pages ([AGL-4109](https://linear.app/aglyn/issue/AGL-4109), [AGL-4114](https://linear.app/aglyn/issue/AGL-4114))

</details>

4 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0 — 2026-11-01

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.297...v1.0.0)

### Fixed

- **ai:** AI page changes open on their draft; Assist reads the whole page ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))
- **console:** a save waits for the server instead of being refused with "We could not confirm", and a slow page no longer disconnects a working tab ([AGL-4120](https://linear.app/aglyn/issue/AGL-4120))

### Changed

- **legal:** pin Legal v21: Terms and EULA GA wording, §4.30 console return requests for shipped hardware, §4.32 per-store 4G billed monthly in arrears; members who accepted v20 see one re-acceptance banner ([AGL-4053](https://linear.app/aglyn/issue/AGL-4053), [AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **functions:** scheduled wrappers run on a quarter vCPU ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **monitoring:** short Cloud Run jobs become request-billed services, and the drain filter is recorded ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **health:** the funnel probe, the signup-volume marker and the edge admission sampler read less, with no timing or coverage change ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **emails:** dormant accounts are asked about once a day, everyone else hourly ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))
- **commerce, lists, crm:** cart and restock scans, dynamic list sweeps and CRM task reminders stop re-reading unchanged data ([AGL-4121](https://linear.app/aglyn/issue/AGL-4121))

### Documentation

- **billing:** remove the pre-release pricing note ([AGL-4051](https://linear.app/aglyn/issue/AGL-4051))

<details>
<summary>Also in this release: 1 chore, 1 test</summary>

- **release:** v1.0.0-beta.298 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **console:** the Besigner page specs mock the open-draft hook, so the promotion's test shards pass ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))

</details>

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.298 — 2026-11-01

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.297...v1.0.0-beta.298)

### Fixed

- **ai:** AI page changes open on their draft; Assist reads the whole page ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.297 — 2026-10-30

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.296...v1.0.0-beta.297)

### Fixed

- **ai:** an edit keeps a change to an element it moved out of what it then removes ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))

## v1.0.0-beta.296 — 2026-10-30

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.295...v1.0.0-beta.296)

### Added

- **crm:** the deal Stage card draws the whole path through to a closing step
- **crm:** log a text, WhatsApp, Messenger, Instagram or LinkedIn message as its own activity kind

### Fixed

- **ai:** an edit sees the whole page and lands in its draft on every plan ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))
- **crm:** the deal board folds empty stages and pages sideways with arrows

## v1.0.0-beta.295 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/7016b756b...v1.0.0-beta.295)

### Added

- **ai:** a page change from Assist is a draft of that page with a Besigner link ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))

### Fixed

- **ai:** Assist keeps a thread per site and sends AI jobs to the site's page ([AGL-4116](https://linear.app/aglyn/issue/AGL-4116))

## v1.0.0-beta.294 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.293...v1.0.0-beta.294)

### Added

- **console:** a version's preview offers Publish and the Besigner; AI jobs lead there ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))

### Fixed

- **besigner:** a click on a repeated copy outlines that copy ([AGL-4115](https://linear.app/aglyn/issue/AGL-4115))
- **console:** the review bar sits under toasts, and its Publish confirm over it ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **ai:** an edit job binds a repeat to the site's datasets, never to nothing ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))

### Documentation

- a job that changed one page opens its preview, and a preview can publish ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **pricing:** the pricing calculator quotes Site Care ([AGL-3954](https://linear.app/aglyn/issue/AGL-3954))
- **pricing:** the pricing calculator prices Aglyn AI as tiers ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))

<details>
<summary>Also in this release: 1 chore</summary>

- **tools:** raise the Linear id floor to AGL-4115, read off the workspace ([AGL-4115](https://linear.app/aglyn/issue/AGL-4115))

</details>

## v1.0.0-beta.293 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.292...v1.0.0-beta.293)

### Added

- **ai:** an imported header is the source's menu, menus and buttons, drawn with no model ([AGL-4108](https://linear.app/aglyn/issue/AGL-4108))
- **ai:** build every imported page through the site compiler ([AGL-4107](https://linear.app/aglyn/issue/AGL-4107))
- **console:** offer Choose your starter only where its picker has starters to show ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **console:** Choose your starter in Create site, the create from it, the way back ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the starter seed carries each style's picture and name ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **native:** seller and publish screens tick the publisher agreement ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))
- **marketplace:** an agreement box above every publisher save button ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))
- **marketplace:** every publisher route requires and records the agreement ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))
- **ai:** Bring my site reads the source's layout, menu and footer ([AGL-4106](https://linear.app/aglyn/issue/AGL-4106), [AGL-4109](https://linear.app/aglyn/issue/AGL-4109))
- **console:** Create site asks a style before it creates anything ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** starter search route, query model and Create site shelf ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **permissions:** datasets ask Manage data alone, in routes and rules ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **native:** Year founded in a site's Business profile, checked by the console's rule ([AGL-4102](https://linear.app/aglyn/issue/AGL-4102))
- **permissions:** the delivery register asks the POS keys alone ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Fixed

- **console:** /signin holds the auth layout until a new Google account's consent bounce has run ([AGL-4113](https://linear.app/aglyn/issue/AGL-4113), [AGL-1497](https://linear.app/aglyn/issue/AGL-1497), [AGL-3578](https://linear.app/aglyn/issue/AGL-3578))
- **native:** the Mac card's hairline takes no clicks, so Delete site opens its confirm ([AGL-4112](https://linear.app/aglyn/issue/AGL-4112), [AGL-4113](https://linear.app/aglyn/issue/AGL-4113))
- **marketplace:** read the measurement id by name so the browser bundle gets it ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **console:** the sign-up page claims provisioning before it creates, so a second tab's backstop stands down ([AGL-4079](https://linear.app/aglyn/issue/AGL-4079))
- **ai:** the import's look reads past our edge and wears the source's colors and font ([AGL-4108](https://linear.app/aglyn/issue/AGL-4108))
- **marketplace:** the registered starter source answers describe too ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** agreement acceptances take a platform-minted id ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))
- **marketplace:** a publisher agreement acceptance is named by a platform id ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))
- **ai:** a page's layout is a value the Firestore job document holds ([AGL-4106](https://linear.app/aglyn/issue/AGL-4106))
- **ai:** the style look source imports core statically, and the guards know the style ids ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** photos refuse another city's street, keep a drink its own, show a team racing ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **apple:** emulator debug builds launch again, placeholder API key in a real key's shape ([AGL-4104](https://linear.app/aglyn/issue/AGL-4104))
- **tenant:** site search and collection feeds close while a site is in maintenance ([AGL-4111](https://linear.app/aglyn/issue/AGL-4111), [AGL-4110](https://linear.app/aglyn/issue/AGL-4110))
- **tenant:** maintenance mode and preview send the 503 page as an HTTP 503 ([AGL-4110](https://linear.app/aglyn/issue/AGL-4110))
- **marketplace:** the starter card names the platform's own by its brand name ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **commerce:** a customer's unsent quote files are swept a day later ([AGL-4096](https://linear.app/aglyn/issue/AGL-4096))
- **delivery-apps:** a sign-in check that breaks stays a 5xx, rethrown ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Changed

- **ai:** a source's icon is admitted by the icon library's own path check ([AGL-4108](https://linear.app/aglyn/issue/AGL-4108), [AGL-4107](https://linear.app/aglyn/issue/AGL-4107))

### Documentation

- **console:** name the Figma section Choose your starter is drawn in, and refresh the Assist index ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** Bring my site brings your menu, buttons, footer, colors and font ([AGL-4108](https://linear.app/aglyn/issue/AGL-4108))
- **console:** shoot Choose your starter on the seeded emulator, its starters listed for the shot ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **guides:** the newsletter band example offers product news, not early-access news
- **console:** Choose a style shot, and the AI Style step reshot with nothing chosen ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **delivery-apps:** the register keys that take delivery orders ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

<details>
<summary>Also in this release: 8 test</summary>

- **tenant:** declare Bring my site's compiler and frame source in the image-sink inventory ([AGL-1725](https://linear.app/aglyn/issue/AGL-1725), [AGL-4107](https://linear.app/aglyn/issue/AGL-4107))
- **ai:** the import compile over the recorded pages; listing, card copy and guide ([AGL-4107](https://linear.app/aglyn/issue/AGL-4107))
- **ai:** classify the layout reader's image fields and its aglyn.com fixture origin ([AGL-4106](https://linear.app/aglyn/issue/AGL-4106))
- **console:** the client build screen expects the starter's style option ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **console:** the client build screen's starter call carries its style option ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **console:** the client build's starter call carries the style it was given ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** pin the layout, menu and stylesheet readers over recorded pages ([AGL-4106](https://linear.app/aglyn/issue/AGL-4106))
- **marketplace:** classify main's starter search route as no publisher save ([AGL-4105](https://linear.app/aglyn/issue/AGL-4105))

</details>

5 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.292 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.291...v1.0.0-beta.292)

### Added

- **commerce:** add-ons priced on the storefront, and no silent cut at 100 variants ([AGL-4100](https://linear.app/aglyn/issue/AGL-4100))

### Fixed

- **commerce:** quote, invoice and request-confirmation emails carry a conversation root in References, so replies stay in one conversation ([AGL-4097](https://linear.app/aglyn/issue/AGL-4097))
- **console:** Create site waits under the console loading overlay, not a spinner dialog ([AGL-4103](https://linear.app/aglyn/issue/AGL-4103))
- **commerce:** a fresh pay link after a new quote version, and the "updated quote" wording only for a new revision ([AGL-4097](https://linear.app/aglyn/issue/AGL-4097))
- **forms:** the request confirmation names the conversation, not the form's name ([AGL-4098](https://linear.app/aglyn/issue/AGL-4098))
- **console:** a preview whose read is slow says so, never that the page has nothing saved ([AGL-4101](https://linear.app/aglyn/issue/AGL-4101))

### Documentation

- **assist:** regenerate the docs index for the add-ons sections ([AGL-4100](https://linear.app/aglyn/issue/AGL-4100))

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.291 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/554f125c9...v1.0.0-beta.291)

### Added

- **forms,commerce:** a quote from a request links to the lead or contact it was filed as ([AGL-4098](https://linear.app/aglyn/issue/AGL-4098))
- **forms,commerce:** request a quote form with files, a confirmation email and Start a quote ([AGL-4098](https://linear.app/aglyn/issue/AGL-4098))
- **commerce:** email a quote in the customer's conversation ([AGL-4097](https://linear.app/aglyn/issue/AGL-4097))

### Fixed

- **commerce:** the Product and options field says what it lists on the canvas ([AGL-4098](https://linear.app/aglyn/issue/AGL-4098))

### Changed

- **aglyn:** name the site's contact email helper siteContactEmail, outside the CRM's words ([AGL-4097](https://linear.app/aglyn/issue/AGL-4097))

<details>
<summary>Also in this release: 1 test, 1 chore</summary>

- **forms,crm,ai:** keep the site bundles in budget and the AI palette current ([AGL-4098](https://linear.app/aglyn/issue/AGL-4098))
- **tenant:** declare the quote email's proof images as off-tenant image sinks ([AGL-4097](https://linear.app/aglyn/issue/AGL-4097))

</details>

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.290 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.289...v1.0.0-beta.290)

### Fixed

- **crm:** every new account becomes a contact in the operator's own CRM

<details>
<summary>Also in this release: 1 chore</summary>

- **tools:** backfill the operator's CRM contact for existing accounts

</details>

2 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.289 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.288...v1.0.0-beta.289)

### Added

- **ai:** import keeps every word, takes the site's look and lands in its preview ([AGL-4084](https://linear.app/aglyn/issue/AGL-4084), [AGL-4083](https://linear.app/aglyn/issue/AGL-4083), [AGL-4086](https://linear.app/aglyn/issue/AGL-4086))
- **console:** the Preview switch, Start in preview at every create, page preview ([AGL-4086](https://linear.app/aglyn/issue/AGL-4086))
- **tenant:** a site or page in preview shows the public its notice and its team the site ([AGL-4086](https://linear.app/aglyn/issue/AGL-4086))
- **ai:** import reads the whole site and says what it found ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083))

### Fixed

- the import and preview branches' reds, after main ([AGL-4084](https://linear.app/aglyn/issue/AGL-4084))
- **ai:** a wave that lands in the preview says so in its review ([AGL-4084](https://linear.app/aglyn/issue/AGL-4084))
- **ai:** import copy reads the configured brand name ([AGL-4083](https://linear.app/aglyn/issue/AGL-4083))

### Documentation

- **ai:** a reviewed wave is in the site's preview, public by the Preview switch ([AGL-4084](https://linear.app/aglyn/issue/AGL-4084))
- **site-protection:** keep a site to your team with Preview; native switch and status ([AGL-4086](https://linear.app/aglyn/issue/AGL-4086))

<details>
<summary>Also in this release: 1 chore</summary>

- **deps:** bump systeminformation from 5.33.14 to 5.33.18

</details>

6 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.288 — 2026-10-29

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.287...v1.0.0-beta.288)

### Added

- **ai:** the year founded is a business profile field ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **permissions:** suppressions, lists, inbox replies and sender ask keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** org automations and workspace domains are plugin keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** installing and publishing on a site are marketplace keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** funnels and email campaigns are plugin keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** fonts, page publishing, live chat and Zapier ask site keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** refunds, POS approvals and webhooks are workspace-only keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Fixed

- **ai:** stock photos fit the thing, the place and the trade ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **ai:** rule 14 and a plan's section names leave a missing fact out ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **stock-photos:** keep up to 30 of a Pixabay hit's tags ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **ai:** an Assist build never asks for placeholders ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **ai:** a dataset sample never tells the owner what to add ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))

### Performance

- **console:** a new tab skips the wait once another has seen the Firestore cache locked ([AGL-4090](https://linear.app/aglyn/issue/AGL-4090), [AGL-3428](https://linear.app/aglyn/issue/AGL-3428), [AGL-3788](https://linear.app/aglyn/issue/AGL-3788))

### Documentation

- **ai:** reshoot Setup -> Business profile with the Year founded field ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))
- **ai:** no bracket, no instruction, and the year founded ([AGL-4092](https://linear.app/aglyn/issue/AGL-4092))

<details>
<summary>Also in this release: 1 test, 1 chore</summary>

- **console:** the community-naming spec reads boot declarations from declarations.ts ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **deps:** bump re2js from 2.8.6 to 2.9.1

</details>

## v1.0.0-beta.287 — 2026-10-28

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.286...v1.0.0-beta.287)

### Added

- **marketplace:** the starter seed holds its pages to the starter rule ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** check a built-in starter theme as the site wears it ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **redirects:** keep the visitor's query string on a site redirect ([AGL-4081](https://linear.app/aglyn/issue/AGL-4081))
- **waivers:** the paired display authorizes signing on it, no grant or timer ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **permissions:** co-editing and the edit bar ask Edit site content per site ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** orders and gift cards are keys with site-role presets ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** site routes and writers ask the site keys, not the site role ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** core site keys whose preset is the site role ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **ai:** chat builds propose a theme change and search photos with business words ([AGL-4077](https://linear.app/aglyn/issue/AGL-4077))
- **ai:** chat sees open AI jobs and the plan, reads docs in English, 2,048 ceiling ([AGL-4075](https://linear.app/aglyn/issue/AGL-4075))
- **ai:** one plan reminder a day after a plan is ready, never a second ([AGL-4076](https://linear.app/aglyn/issue/AGL-4076))
- **permissions:** walk-ins and stays are keys whose preset is the site role ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **waivers:** match a rider by the birth date on their CRM contact ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **waivers:** e-sign consent v2, the business contact and a copy to download ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **commerce:** booth buyers accept the terms of sale on the display or tablet ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** request a return of a shipped online reader order; S710 4G copy ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **marketplace:** publish a site as a site starter, the publish-starter door ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** the core.site-starters source, search and resolve ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **aglyn:** the site starter node rule, a whole site kept safe ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** site starter listing fields, rules deny-list and search indexes ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **commerce:** turn on 4G for a store's Stripe Reader S710s, billed monthly ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **waivers:** display signing lasts until closed; screens draw apart ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042), [AGL-4048](https://linear.app/aglyn/issue/AGL-4048))
- **ai:** sites you like is on — flag defaults on, guide drops its rolling-out note ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975))
- **sites:** create a site from a starter picked from the marketplace ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **tenant:** the documents a site created from a starter starts with ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **aglyn:** a site starter's theme, planned against the empty host it creates ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **marketplace:** seed the platform's own site starter listings ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **legal:** pin Legal v20, hardware sales and waivers ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038), [AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **ai:** vary trades and fitness layouts; no three bare bands in a row ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **commerce:** keep hardware buyers' name and address on the sale record ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **aglyn:** an optional installed() on the site starter source seam ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **aglyn:** site starter page links by slug across publish and install ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **commerce:** booth shows the buyer's whole email and takes the store address ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **permissions:** narrowing per site is a control on roles and members ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** in-store products' reviews show marked Sold in store, or hide ([AGL-4060](https://linear.app/aglyn/issue/AGL-4060))
- **commerce:** staff hardware cancels and refunds can email the buyer ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** warn before a closure cancels unshipped hardware orders ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** fold the operator's own sales into tax return Items 1-2 ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **waivers:** match riders by email, else name and birth date together ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **commerce:** staff change a stay's guest count after booking ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **commerce:** in-person reader returns: register, staff refund, buyer request ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** in-person readers onto the buyer's store, serials, booth, setup ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** look up and attach an in-person reader buyer, invite, claim ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **waivers:** every signed waiver follows the store's retention period ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **commerce:** record in-person hardware sales, To attach list, tax once ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **permissions:** narrower site access narrows its register and waivers ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** in-person hardware model, kiosk offer choice, seller gates ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **waivers:** sign on the customer display through a generic core seam ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **permissions:** move API keys, privacy requests and holds to catalog keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** the register's keys decide alone; buying hardware stands on its own ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** a saved workspace logo reaches card readers at once ([AGL-4048](https://linear.app/aglyn/issue/AGL-4048))
- **waivers:** pick the waiver a Sign waiver element signs in the Besigner ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **commerce:** check stays in once per stay or once per guest ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **waivers:** adult age per waiver, keep waivers on erasure, store-site links ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **commerce:** pass use dates and rain checks at the check-in window ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **commerce:** hardware closure refunds, 7-year sale records, tax return ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** walk-ins need the reservations plan and say which roles book ([AGL-4046](https://linear.app/aglyn/issue/AGL-4046))
- **commerce:** let the store set when "Only N left" shows for a resource ([AGL-4044](https://linear.app/aglyn/issue/AGL-4044))
- **commerce:** count order-dialog and Stripe refunds of register sales in day totals ([AGL-4037](https://linear.app/aglyn/issue/AGL-4037))
- **permissions:** console gates and waivers ask permission keys, not roles ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** finer point of sale keys under managePos ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **permissions:** per-member and per-site permission overrides ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))

### Fixed

- **abuse:** refuse site names that read as our servers, like www-2 and com ([AGL-4082](https://linear.app/aglyn/issue/AGL-4082))
- **marketplace:** a starter publish asks Publish site content, not a site role ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **aglyn:** the starter theme planner names its input source, not listing ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **commerce:** the 4G monthly charge id comes from a named key function ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** register refund record ids come from named key functions ([AGL-4037](https://linear.app/aglyn/issue/AGL-4037))
- **tools:** the staged docs-registry hook reads a large merge's diff ([AGL-3707](https://linear.app/aglyn/issue/AGL-3707))
- **notifications:** name a workspace by its orgName, not as one you left ([AGL-2915](https://linear.app/aglyn/issue/AGL-2915))
- **waivers:** name the waiverTitles path literally so the host sweeps see it ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **ai:** settle dead links and repeated styles instead of stopping a job ([AGL-4076](https://linear.app/aglyn/issue/AGL-4076))
- **ai:** a question about the workspace's own plan or AI jobs is never a docs quote ([AGL-4075](https://linear.app/aglyn/issue/AGL-4075))
- **ai:** hand the business words to a build's pages only, never its layout or items ([AGL-4077](https://linear.app/aglyn/issue/AGL-4077))
- **tools:** carry the posHardwareSales TTL policy in the declared list ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **console:** one provisioning reader per new account ([AGL-4079](https://linear.app/aglyn/issue/AGL-4079), [AGL-4021](https://linear.app/aglyn/issue/AGL-4021))
- **ai:** job photo and logo reads ask the plugins' image function ([AGL-4048](https://linear.app/aglyn/issue/AGL-4048))
- **console:** closure notices answer a locked workspace's 423 ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **ai:** a band "in pictures" or "in photos" is a gallery of picture slots ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **marketplace:** the starter seed takes --org with a space, as documented ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **ai:** photos fit the trade and no empty gallery bands ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** a row's icons follow its items' meaning; towns share one marker ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** fit a hero eyebrow around its town, never through a name ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** a store's newsletter band is the platform's sign-up field, never a form ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** a store whose brief names only kinds of product starts with marked samples ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** seed AI starts with marked sample rows, never placeholders, one list per value ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **marketplace:** the seeds' browsability copy reviews site starters too ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))
- **commerce:** offline card fee flag names the monthly invoice, not a brand ([AGL-4039](https://linear.app/aglyn/issue/AGL-4039))
- **commerce:** flag an offline sale whose discount the member's role does not allow ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** offline card sync checks the account, settles fees, refunds and alerts ([AGL-4039](https://linear.app/aglyn/issue/AGL-4039))
- **commerce:** a changed logo reaches card readers without opening the POS devices card ([AGL-4048](https://linear.app/aglyn/issue/AGL-4048))
- **crm:** a waiver signer's source reads "Waiver signed", not the raw word ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **commerce:** a new product keeps its quick key and modifier groups ([AGL-3607](https://linear.app/aglyn/issue/AGL-3607))
- **commerce:** a new product keeps its check-in setting ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **commerce:** offline card mode writes the site's one reader configuration safely ([AGL-4039](https://linear.app/aglyn/issue/AGL-4039))
- **commerce:** the Buy now door refuses a draft or archived product, as the cart does ([AGL-4060](https://linear.app/aglyn/issue/AGL-4060))
- **commerce:** the hardware shop lists all 14 Stripe items and flags the WisePOS E ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))

### Performance

- **ai:** the insight step's two calls send one tool list, so the answer reads the cache ([AGL-4076](https://linear.app/aglyn/issue/AGL-4076))
- **commerce:** keep the check-in window and POS helpers out of commerce's eager bytes ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))

### Changed

- **theme:** font read and write move to shared-util-tools so the core can set fonts ([AGL-4049](https://linear.app/aglyn/issue/AGL-4049))

### Documentation

- **ai:** a question about your own workspace gets a written answer ([AGL-4075](https://linear.app/aglyn/issue/AGL-4075))
- add a WhatsApp button guide, and say who on your side is told about an order ([AGL-4078](https://linear.app/aglyn/issue/AGL-4078))
- **ai:** chat answers in your language, sees AI jobs; right-to-left not supported yet ([AGL-4075](https://linear.app/aglyn/issue/AGL-4075))
- **ai:** photos fit the business and empty picture bands are left out ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** name the AGL-4065 decisions by their question, not by who made them ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** sample rows and sample products in AI starts, the newsletter band ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **waivers:** matching a rider by name and date of birth at check-in ([AGL-4042](https://linear.app/aglyn/issue/AGL-4042))
- **commerce:** change a stay's guests after booking ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **commerce:** the in-person reader sale at the register and for staff ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **permissions:** register keys, hardware buyers, settings keys, reader logos ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** stays checked in per stay or per guest, and guest counts ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **commerce:** passes for a day the buyer picks, and rain checks ([AGL-4043](https://linear.app/aglyn/issue/AGL-4043))
- **commerce:** cards taken offline in the Aglyn POS app settle like online cards ([AGL-4039](https://linear.app/aglyn/issue/AGL-4039))
- **commerce:** what's new for reader logos, waiver sources, product fields and Buy now ([AGL-4048](https://linear.app/aglyn/issue/AGL-4048), [AGL-4042](https://linear.app/aglyn/issue/AGL-4042), [AGL-3607](https://linear.app/aglyn/issue/AGL-3607), [AGL-4043](https://linear.app/aglyn/issue/AGL-4043), [AGL-4060](https://linear.app/aglyn/issue/AGL-4060))

<details>
<summary>Also in this release: 12 test, 7 chore</summary>

- raise the Linear id ceiling to AGL-4086 ([AGL-4086](https://linear.app/aglyn/issue/AGL-4086))
- **permissions:** re-anchor three rules and field guards on the site keys ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **tools:** raise the linear id ceiling to 4081, which exists ([AGL-2500](https://linear.app/aglyn/issue/AGL-2500), [AGL-4081](https://linear.app/aglyn/issue/AGL-4081))
- **console:** stock photo job-title words count 4 in the role-name ratchet ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** the AI guided start's sample mark is a server-stamped product field ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **native:** regenerate contracts for the product sample flag ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** a live spec that the insight answer call reads the cache ([AGL-4076](https://linear.app/aglyn/issue/AGL-4076))
- **marketplace:** tax return source spec reads its one section ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **commerce:** gift cards surface spec holds the commerce.giftCards key gate ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **commerce:** checkout specs seed an active product, as Buy now now requires ([AGL-4060](https://linear.app/aglyn/issue/AGL-4060))
- **tools:** raise the linear id ceiling to 4080, which exists ([AGL-2500](https://linear.app/aglyn/issue/AGL-2500), [AGL-4079](https://linear.app/aglyn/issue/AGL-4079), [AGL-4080](https://linear.app/aglyn/issue/AGL-4080))
- **console:** the site-switch spec mocks the permissions hook the switchboard reads ([AGL-4047](https://linear.app/aglyn/issue/AGL-4047))
- **ai:** a live check of the chat's honest answers, run only when asked ([AGL-4075](https://linear.app/aglyn/issue/AGL-4075))
- raise the Linear id ceiling to AGL-4078 ([AGL-4078](https://linear.app/aglyn/issue/AGL-4078))
- **ai:** re-render the four style previews the new layout choices change ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **ai:** replay the booth kit's eyebrows, icons, layouts and bare bands offline ([AGL-4065](https://linear.app/aglyn/issue/AGL-4065))
- **commerce:** spec the register card reader buyer step ([AGL-4038](https://linear.app/aglyn/issue/AGL-4038))
- **tools:** raise the linear id ceiling to 4074, which exists ([AGL-2500](https://linear.app/aglyn/issue/AGL-2500), [AGL-4068](https://linear.app/aglyn/issue/AGL-4068), [AGL-4069](https://linear.app/aglyn/issue/AGL-4069), [AGL-4072](https://linear.app/aglyn/issue/AGL-4072), [AGL-4073](https://linear.app/aglyn/issue/AGL-4073), [AGL-4074](https://linear.app/aglyn/issue/AGL-4074))
- **billing:** health fixtures carry the offline card payment_intent events ([AGL-4039](https://linear.app/aglyn/issue/AGL-4039))

</details>

## v1.0.0-beta.286 — 2026-10-27

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.285...v1.0.0-beta.286)

### Fixed

- **signup:** the workspace backstop records a sign-up's acquisition after the host hop ([AGL-3706](https://linear.app/aglyn/issue/AGL-3706), [AGL-4021](https://linear.app/aglyn/issue/AGL-4021))

## v1.0.0-beta.285 — 2026-10-26

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.284...v1.0.0-beta.285)

### Added

- **ads:** stage lists beside the account-holder audience ([AGL-4072](https://linear.app/aglyn/issue/AGL-4072))

### Fixed

- **health:** one Identity Platform 503 no longer turns Ways in red ([AGL-4073](https://linear.app/aglyn/issue/AGL-4073))

## v1.0.0-beta.284 — 2026-10-25

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/ec3ea7daa...v1.0.0-beta.284)

### Added

- **native:** both apps report crashes, errors and Analytics to Firebase ([AGL-4067](https://linear.app/aglyn/issue/AGL-4067))

### Fixed

- **besigner:** phone toolbar above the keyboard; handle drags keep the edit ([AGL-4069](https://linear.app/aglyn/issue/AGL-4069))
- **console:** every sign-in lands in sign-in history, including a browser signed back in from its session cookie, which staff sign-in history now labels ([#2012](https://github.com/aglyn/aglyn/pull/2012), [#2013](https://github.com/aglyn/aglyn/pull/2013))

## v1.0.0-beta.283 — 2026-10-25

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.282...v1.0.0-beta.283)

### Added

- **media:** a Stock photos tab in the media picker ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))
- **media:** a stock photo search and import route for the media picker ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))
- **media:** the media ingest can file into the workspace's shared library ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))
- **stock-photos:** a search result's preview, fetched by the server from the library's own hosts ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))

### Fixed

- **native:** an empty or over-30 list filter no longer aborts the Apple apps; empty matches nothing, longer lists take the first 30 ([AGL-4011](https://linear.app/aglyn/issue/AGL-4011))
- **functions:** run Cloud Functions on Node 24 before Node 20 is retired ([AGL-4028](https://linear.app/aglyn/issue/AGL-4028))
- **beacon:** reCAPTCHA's own timeout is watched by rate, not paged singly ([AGL-4068](https://linear.app/aglyn/issue/AGL-4068))
- **besigner:** a second click on a closing confirm dialog no longer throws ([AGL-4068](https://linear.app/aglyn/issue/AGL-4068))
- **console:** typing a logo URL in profile settings no longer crashes the page ([AGL-4068](https://linear.app/aglyn/issue/AGL-4068))
- **native:** the CRM glance card's closed-lead filter sends status strings, so opening a site no longer crashes the Mac app; Aglyn POS release builds leave out the development-only Tap to Pay entitlement ([AGL-4011](https://linear.app/aglyn/issue/AGL-4011))
- **media:** stock photo copy names no brand; re-baseline the stock-photos plugin budget for previews ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))

### Documentation

- **media:** search and place stock photos from the media picker ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))

<details>
<summary>Also in this release: 1 test, 1 chore</summary>

- **media:** type the stock photo picker specs for core's strict spec config ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))
- **tools:** raise the linear id ceiling to 4066, which exists ([AGL-4066](https://linear.app/aglyn/issue/AGL-4066))

</details>

## v1.0.0-beta.282 — 2026-10-25

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.281...v1.0.0-beta.282)

### Added

- **health:** watch the daily Site Care reconciliation on /api/health/crons ([AGL-4030](https://linear.app/aglyn/issue/AGL-4030))

### Fixed

- **ai:** a liked site's numbers section is followed only when the brief gives figures ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975))
- **site-care:** reconcile extra time against our own ledger too ([AGL-4031](https://linear.app/aglyn/issue/AGL-4031))
- **theme:** typography paints a palette path color like text.secondary again ([AGL-4034](https://linear.app/aglyn/issue/AGL-4034))
- **ai:** an anchor two section names share goes to the section it titles ([AGL-4032](https://linear.app/aglyn/issue/AGL-4032))
- **site-care:** match a sender's aliases to their Site Care workspace ([AGL-4031](https://linear.app/aglyn/issue/AGL-4031))
- **ai:** a page bot protection refuses is left out as blocked, not unreadable ([AGL-4029](https://linear.app/aglyn/issue/AGL-4029))
- **release:** CHANGELOG.md drops a commit's directive ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))

### Documentation

- add "Make your site private" page so docs search and Assist can answer it ([AGL-4033](https://linear.app/aglyn/issue/AGL-4033))
- **uptime:** record the twelve-hour grace on the daily GitHub row ([AGL-4030](https://linear.app/aglyn/issue/AGL-4030))
- **ai:** say what to do when a site's bot protection turns aglynbot away ([AGL-4029](https://linear.app/aglyn/issue/AGL-4029))

<details>
<summary>Also in this release: 3 chore</summary>

- **deps-dev:** bump fast-uri from 3.1.8 to 3.1.9
- **deps-dev:** bump serialize-javascript from 7.1.2 to 7.1.4
- **deps-dev:** bump the dev-minor-patch group with 11 updates

</details>

## v1.0.0-beta.281 — 2026-10-23

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.280...v1.0.0-beta.281)

### Fixed

- **functions:** run Cloud Functions on Node 20 while Google's Node 22 base image fails to start ([AGL-4028](https://linear.app/aglyn/issue/AGL-4028))
- **e2e:** the signup canary prints its whole failure, trace included ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **e2e:** the signup canary says what the page shows when the account step stalls ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))

<details>
<summary>Also in this release: 1 chore</summary>

- **tools:** raise the Linear id ceiling to AGL-4028, read from the workspace ([AGL-4028](https://linear.app/aglyn/issue/AGL-4028))

</details>

## v1.0.0-beta.280 — 2026-10-22

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.279...v1.0.0-beta.280)

### Added

- **handoff:** a completed handoff emails the new owner and the previous owner (AGL-4023) ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **billing:** staff pick the Aglyn AI tier a bundle link carries, and POS registers show on every plan ([AGL-4025](https://linear.app/aglyn/issue/AGL-4025))
- **billing:** What you will pay always shows a total, switches cadence, and counts the link's add-ons ([AGL-4026](https://linear.app/aglyn/issue/AGL-4026))

### Fixed

- **ci:** auto-merge reads the latest run of each check; the gate report retries its status write ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **native:** workspace logos drawn crisp and at Figma's tile size, centered by their ink ([AGL-4027](https://linear.app/aglyn/issue/AGL-4027))
- **admin:** lazy-load the hand-off emails to break an import cycle ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **email:** platform mail replies to the support mailbox; addresses stay text ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **signup:** retry a derived sign-up workspace address under a suffix on 409 ([AGL-4024](https://linear.app/aglyn/issue/AGL-4024))
- **console:** the Aglyn AI switch lines up with the other add-on switches ([AGL-4025](https://linear.app/aglyn/issue/AGL-4025))

### Changed

- **privacy:** guard client identifiers by digest in files, commit messages and PR text ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **monitoring:** keep real client pages out of the canary and render monitor source ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))

### Documentation

- **billing:** the bundle link's Aglyn AI tier, and POS registers on the staff bundle ([AGL-4025](https://linear.app/aglyn/issue/AGL-4025))
- **console:** name the Figma frames of the bundle link card and the tier field ([AGL-4025](https://linear.app/aglyn/issue/AGL-4025))
- **billing:** What you will pay lists only the link's add-ons, with counts, cadence and a total before tax ([AGL-4026](https://linear.app/aglyn/issue/AGL-4026))

### Tests

- **admin:** import the onboarding deep link statically in the bundle-links spec ([AGL-4025](https://linear.app/aglyn/issue/AGL-4025))
- **privacy:** replace real client names and ids in fixtures, comments and docs ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **email:** two host-email specs expect addresses as text, not mailto links ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **handoff:** neutral fixtures in the handoff and invite specs ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))

## v1.0.0-beta.279 — 2026-10-22

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.278...v1.0.0-beta.279)

### Added

- **invites:** invitations take effect on their own, no Accept step (AGL-4023) ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **legal:** pin Legal v19, Syria leaves Terms §3.6 and the console geo-block

### Fixed

- **auth:** signing in keeps the page's query string ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **invites:** a refused join is told to its sender, never the invitee ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **ci:** beta.279's three reds: Syria spec, staff screens, Linear ceiling ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))
- **invites:** the access-pending card links its help ([AGL-4023](https://linear.app/aglyn/issue/AGL-4023))

### Changed

- **console:** the app→libs sweep slices 3–5 (#1896, #1897, #1898) landed on `main` and were reverted by #1899, so nothing from them ships in this release ([AGL-52](https://linear.app/aglyn/issue/AGL-52))

2 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.278 — 2026-10-22

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.277...v1.0.0-beta.278)

### Fixed

- **besigner:** rich text everywhere text is edited, and repeats that explain themselves ([AGL-1304](https://linear.app/aglyn/issue/AGL-1304))

### Changed

- **console:** six site-data hooks join tenant-feature-instance
- **console:** six generic hooks and helpers leave the app for their libs

<details>
<summary>Also in this release: 1 build</summary>

- **deps-dev:** vitest 4.1.12, clearing two @vitest/mocker advisories

</details>

## v1.0.0-beta.277 — 2026-10-21

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.276...v1.0.0-beta.277)

### Added

- **console:** edit a page's name and description in place; Edit in Besigner; Preview
- **besigner:** click a part of a shared layout to edit it in a new tab, or restyle it here

### Fixed

- **besigner:** repeat copies sit in the parent's own layout; hover keeps them dashed
- **preview:** repeated items fill in from their dataset, as on the live page ([AGL-3496](https://linear.app/aglyn/issue/AGL-3496))
- **besigner:** a click on a repeated copy selects the element it repeats; copies outlined in grey
- **besigner:** "Start hidden until an interaction shows it" wraps in the element menu
- **besigner:** the Attributes info sections span the panel; Interactions shares its edges
- **besigner:** canvas labels stay dark in dark mode, and the action strip centres on phones
- **besigner:** double-tap text on a phone opens it for editing, with the keyboard
- **besigner:** the drop marker shows exactly where a drag will land
- **console:** the Besigner page reads its theme via useTheme; the page-view layout spec knows the Name & description card

### Changed

- **besigner:** the repeat expansion Preview uses lives in the designer lib

## v1.0.0-beta.276 — 2026-10-21

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.275...v1.0.0-beta.276)

### Added

- **outreach:** an answer's links go out as tracked short links (AGL-4022) ([AGL-4022](https://linear.app/aglyn/issue/AGL-4022))

### Fixed

- **signup:** a phone Google sign-up always lands in its workspace (AGL-4021) ([AGL-4021](https://linear.app/aglyn/issue/AGL-4021))

## v1.0.0-beta.275 — 2026-10-21

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/b537dd527...v1.0.0-beta.275)

### Added

- **outreach:** reply in thread from the enrollment's own mailbox (AGL-4020) ([AGL-4020](https://linear.app/aglyn/issue/AGL-4020))

### Fixed

- **crm:** keep the email actions zone token out of the eager bundle (AGL-4020) ([AGL-4020](https://linear.app/aglyn/issue/AGL-4020))

<details>
<summary>Also in this release: 1 chore</summary>

- **linear:** raise the citation ceiling to AGL-4020, read off Linear ([AGL-4020](https://linear.app/aglyn/issue/AGL-4020))

</details>

## v1.0.0-beta.274 — 2026-10-21

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.273...v1.0.0-beta.274)

### Fixed

- **email:** usage, budget and SSO-lapse emails draw their own parts (AGL-4019) ([AGL-4019](https://linear.app/aglyn/issue/AGL-4019), [AGL-3897](https://linear.app/aglyn/issue/AGL-3897))
- **native-release:** remove the Xcode export staging folder after each upload
- **console:** a Free first site's own create no longer trips the one-site limit ([AGL-4017](https://linear.app/aglyn/issue/AGL-4017))

## v1.0.0-beta.273 — 2026-10-20

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.272...v1.0.0-beta.273)

### Added

- **legal:** pin Legal v18, Terms §8.9 Importing a Website ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976), [AGL-3974](https://linear.app/aglyn/issue/AGL-3974))
- **data:** the dataset draft writer revises a seeded record's values ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))

### Fixed

- **release:** the site changelog drops a commit's CI-skip directive ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **ai:** an SEO listing a few characters too long is fitted, not failed ([AGL-4016](https://linear.app/aglyn/issue/AGL-4016))
- **ai:** the empty-site sweep keeps the AI job it marks ([AGL-4015](https://linear.app/aglyn/issue/AGL-4015))
- **ai:** the guided start's step timeline spans the whole dialog ([AGL-4014](https://linear.app/aglyn/issue/AGL-4014))
- **ai:** a site start's page never shows a photo twice; the late pass fills it ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **marketing:** the /managed first-run script gives its films caption-free posters ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **marketing:** the /managed republish gives each film player a caption-free poster ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **ai:** a late photo pass fills a site start's starters before it goes live ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **ai:** a guided start's publish sets the site's share image from its home hero ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **ai:** a site start's page offers its own photos and records each starter it leaves ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))

### Documentation

- **ai:** a new site's page never shows a photo twice while it fills its starters ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **ai:** regenerate the Assist docs index after merging main ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **pricing:** /managed version MuMb5a8jki, films with caption-free posters ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **ai:** how a guided start fills its starter photos and sets its Social image ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))

<details>
<summary>Also in this release: 1 test, 1 chore</summary>

- **tenant:** declare AGL-3988's four image markers in the sink inventory ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **release:** v1.0.0-beta.273 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))

</details>

## v1.0.0-beta.272 — 2026-10-20

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.271...v1.0.0-beta.272)

### Added

- **console:** pin sites the way workspaces are pinned ([AGL-4005](https://linear.app/aglyn/issue/AGL-4005), [AGL-3762](https://linear.app/aglyn/issue/AGL-3762), [AGL-3943](https://linear.app/aglyn/issue/AGL-3943))
- **marketing:** the /managed republish shows a site in the hero and separates the FAQ band ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **console:** the Site Care card and Request a change name the support address ([AGL-3997](https://linear.app/aglyn/issue/AGL-3997))
- **site-care:** requests arrive at the support address, with no care address ([AGL-3997](https://linear.app/aglyn/issue/AGL-3997))
- **email:** received mail says when a machine sent it ([AGL-3997](https://linear.app/aglyn/issue/AGL-3997))
- **marketing:** a script republishes /managed with no prices, its film poster rows playing the films ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **console:** the bundle link card starts on the client build's bundle too ([AGL-3995](https://linear.app/aglyn/issue/AGL-3995))
- **domains:** open Get a domain with the name Billing sends in ?domain= ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** let a staff preclearance stand in for the 72 h payment gate, once ([AGL-3955](https://linear.app/aglyn/issue/AGL-3955))
- **domains:** answer core.domain-search with the card's own search and prices ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **ai:** a client build's contact details fill the guided start's details ([AGL-3995](https://linear.app/aglyn/issue/AGL-3995), [AGL-3979](https://linear.app/aglyn/issue/AGL-3979))
- **console:** hand off opens on the client build's bundle ([AGL-3995](https://linear.app/aglyn/issue/AGL-3995), [AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **native:** the demo seed carries this month's usage, so meters read real fills ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **apple:** grouped forms fill their column on the Mac, on the content edges ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** the plan card is a slow carousel of usage meters, the screen's own first ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **native:** the Kotlin plan card is a slow carousel of usage meters, context first ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **native:** the Kotlin plan card mapping replays the console's planCard cases ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **native:** one plan card mapping for both apps: meters, context, order ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **ai:** the "Bring my site" card, its import job page and guide, behind the flag ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976))
- **ai:** import job brings a proved site in, in reviewed waves, behind the flag ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976), [AGL-3974](https://linear.app/aglyn/issue/AGL-3974))
- **ai:** site-import ownership and crawl doors behind release_ai_site_import ([AGL-3974](https://linear.app/aglyn/issue/AGL-3974), [AGL-3973](https://linear.app/aglyn/issue/AGL-3973))
- **ai:** add the AglynBot site-import crawler and an untrusted-text fence ([AGL-3974](https://linear.app/aglyn/issue/AGL-3974), [AGL-3973](https://linear.app/aglyn/issue/AGL-3973))
- **domains:** website ownership claims by DNS, meta tag or emailed code ([AGL-3974](https://linear.app/aglyn/issue/AGL-3974), [AGL-3973](https://linear.app/aglyn/issue/AGL-3973))

### Fixed

- **ai:** the crawler's user agent names the Bring my site guide, not a /bot page ([AGL-3983](https://linear.app/aglyn/issue/AGL-3983))
- **sites:** deleting a site erases its own datasets, AI insights and Assist chats ([AGL-4003](https://linear.app/aglyn/issue/AGL-4003))
- **marketing:** the /managed first-run script's hero matches the live page ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **marketing:** the /managed republish puts a live site in the hero, with no prices in it ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **marketing:** the /managed record pours the hero's site and the white FAQ band ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **marketing:** the /managed first-run script carries no figures, and places the films ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **ai:** the client note says only what the review's rows do not ([AGL-3995](https://linear.app/aglyn/issue/AGL-3995))
- **ai:** a client build's towns are the place only until an address is given ([AGL-3995](https://linear.app/aglyn/issue/AGL-3995))
- **native:** a phone's Menu opens a sectioned area with its section chips ([AGL-3993](https://linear.app/aglyn/issue/AGL-3993))
- **apple:** two more views could never start their read; the Group sweep sees every shape ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **native:** the plan card fills with Figma's bg/surface, not the theme's grey canvas ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **native:** the plan card never cuts its figures, and reads its meters at once ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **apple:** a brand picture that fails to load is tried again ([AGL-3991](https://linear.app/aglyn/issue/AGL-3991))
- **apple:** the Automation hub's section column sits on the content edge ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** debug builds are "Aglyn Debug" and "Aglyn POS Debug", never the shipped ids ([AGL-3994](https://linear.app/aglyn/issue/AGL-3994))
- **apple:** the plan card cross-fades in place and never cuts its figures ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **native:** the snapshot tool's sweep filter matches #1842's line ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** the snapshot tool can name sweep states, and passes them otherwise ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **native:** a section tab strip starts its first label on the content edge E ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** the plan card matches the reworked Figma 98:1048 ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **apple:** scroll views and selectable lists keep their own edges under the list look ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** default lists, card grids and pickers sit on the content edge ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **native:** the plan card's campaign meter is emailSends, the entitlement's word ([AGL-3992](https://linear.app/aglyn/issue/AGL-3992))
- **native:** a workspace logo sits on Figma's paper plate at the 70% slot ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** the content area brings every screen to the one edge E ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** a workspace logo sits on its rail tile's plate at Figma's size ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **ai:** a wave read the clock cuts short resumes, and pages keep their own names ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976))
- **ai:** the site-import crawler names the operator's bot page, from an env var ([AGL-3983](https://linear.app/aglyn/issue/AGL-3983))
- **ai:** the "Bring my site" card names the configured brand, not a literal ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976))

### Changed

- **email:** retire the Site Care sender-not-recognized email ([AGL-3997](https://linear.app/aglyn/issue/AGL-3997))

### Documentation

- **release:** beta.272 changelog carries #1860 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **release:** beta.272 changelog line for #1859 reads cleanly ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **release:** beta.272 changelog carries #1847 #1851 #1853 #1854 #1855 #1856 #1858 #1859 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **pricing:** /managed version IO02sEaW0U, and a picture can state a price ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **pricing:** /managed is no longer a pricing surface ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998), [AGL-3960](https://linear.app/aglyn/issue/AGL-3960))
- **site-care:** requests by email arrive at the support address ([AGL-3997](https://linear.app/aglyn/issue/AGL-3997))
- **staff-console:** the hand-off and the bundle link card open on the client build's bundle ([AGL-3995](https://linear.app/aglyn/issue/AGL-3995))
- **release:** beta.272 changelog carries #1850 and #1852 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **ai:** the Start with AI guide's Sites you like section, marked rolling out ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975))
- **ai:** re-shoot the Style step with the new cards ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **ai:** the import job's resumable wave read and page names, in AI_JOBS.md ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976))

<details>
<summary>Also in this release: 4 test, 2 chore, 1 ci</summary>

- **tools:** run the marketing film helper's tests ([AGL-3998](https://linear.app/aglyn/issue/AGL-3998))
- **crm:** email capture never files mail to the support address ([AGL-3997](https://linear.app/aglyn/issue/AGL-3997))
- **release:** v1.0.0-beta.272 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **native:** production-shaped seed workspace and list tests on both apps ([AGL-3993](https://linear.app/aglyn/issue/AGL-3993))
- **native:** spell SectionTabs' comment the American way, drop unused tab imports ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **console:** the egress sweep skips fixtures folders, as its own doc says ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976))
- **tenant:** the image-sink inventory names the site import's crawler and fixtures ([AGL-3976](https://linear.app/aglyn/issue/AGL-3976))

</details>

## v1.0.0-beta.271 — 2026-10-19

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.270...v1.0.0-beta.271)

### Added

- **ai:** each style preview on a photo of its own kind of business ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **ai:** one credited Unsplash photo per style for the style previews ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **ai:** the preview script reads its own credited photos, apart from the starters ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **ai:** every style preview opens on its signature hero and carries a photo ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **ai:** each style's header arrangement, and the model told how its pages open ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **ai:** 21 layout signatures and six new heroes, so no two styles read alike ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985), [AGL-3899](https://linear.app/aglyn/issue/AGL-3899), [AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **console:** search the DAM by ID or link; Choose media shows a file before using it ([AGL-3989](https://linear.app/aglyn/issue/AGL-3989))
- **native:** one content edge E per column, and every screen fills its column ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** the phone's Menu leads with the workspace and its menu ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** seed a white-label agency workspace ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **shared-ui:** option cards read on a gray page, the picked one unmistakable ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **kotlin:** the plan card is Figma 98:1048's meter from the console's figures ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** the order detail column as Figma draws it, one More per head ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **crm:** the Kotlin apps create currency fields and read each at its own minor unit ([AGL-3971](https://linear.app/aglyn/issue/AGL-3971))
- **pricing:** the ai tiers are live on /pricing, with the tier faq and site care link ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **crm:** the Apple apps create currency fields and read each at its own minor unit ([AGL-3971](https://linear.app/aglyn/issue/AGL-3971))
- **console:** "Charge for work" on the staff org page, projects on Billing ([AGL-3970](https://linear.app/aglyn/issue/AGL-3970))
- **site-care:** project invoices, payments, reversals and reconciliation ([AGL-3970](https://linear.app/aglyn/issue/AGL-3970))
- **site-care:** the flat project quote, its split and its record ([AGL-3970](https://linear.app/aglyn/issue/AGL-3970))
- **ai:** a guided start's site listing replaces the seeded default when untouched ([AGL-3979](https://linear.app/aglyn/issue/AGL-3979))
- **billing:** tier migration dry run counts before minting, aiTier rules test, docs ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **besigner:** log "Published the screen" on a successful Save & publish ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **billing:** finish Aglyn AI tiers on any paid plan, one credit pool, tier picker ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **ai:** entity logo, contact type, business details and photo alts for AI sites ([AGL-3979](https://linear.app/aglyn/issue/AGL-3979))
- **kotlin:** desktop menu rows are Figma's Menu/Row, 30 tall ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** calm Data with one start-here action; the AI offer is the promo card ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** list rows match Figma for Orders and Sites; opening a site drills in ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **staff:** one-screen client build with domain step, paused ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **billing:** bundle link and one-action hand-off, wip paused ([AGL-3955](https://linear.app/aglyn/issue/AGL-3955))
- **kotlin:** on Windows the tab row draws minimize, maximize and close ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** site and order rows to Figma's list rows, custom domain subtitle ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **console:** dashboards draw a locked CRM card on plans without it ([AGL-3977](https://linear.app/aglyn/issue/AGL-3977), [AGL-3973](https://linear.app/aglyn/issue/AGL-3973))
- **console:** show paid features locked on Free, with the plan and an upgrade link ([AGL-3977](https://linear.app/aglyn/issue/AGL-3977), [AGL-3973](https://linear.app/aglyn/issue/AGL-3973))
- **kotlin:** the title bar's search is a real field with its dropdown under it ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **shared:** one plan-lock pattern for paid features on Free ([AGL-3977](https://linear.app/aglyn/issue/AGL-3977), [AGL-3973](https://linear.app/aglyn/issue/AGL-3973))
- **ai:** take structure and style signals from the sites a person likes, behind a flag ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975), [AGL-3973](https://linear.app/aglyn/issue/AGL-3973), [AGL-3941](https://linear.app/aglyn/issue/AGL-3941))
- **kotlin:** upgrade notices, Upgrade plan, the plan card, calm Orders ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **android:** register inbox.sidebar-count, the Inbox row's unread count ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** the orders list heads its own column as Figma draws it ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** an area screen can head its own list column ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **kotlin:** white-label Home tab mark, double-click the tab row to zoom ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** a site drills in with its switcher, indented groups, dividers and motion ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** inline search, Figma sidebar metrics, plan card, own tab state ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** seed promotions, returns, stays, funnels, AI jobs, sequences, books ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966), [AGL-3972](https://linear.app/aglyn/issue/AGL-3972))
- **kotlin:** the Home tab is the mark, the rail starts at PINNED, datasets copy ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** site drill-in, grouped-row indent, dividers and sidebar motion, first pass ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** pushed screens name themselves, New actions keep ⌘N on the Mac ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** calm Orders, Products and Data lists ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** window buttons in the tab row, pushed-screen heads, Home mark tab ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** upgrade notices and the add-on promo card where the console shows them ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** the Mac in-app browser's controls sit in its screen head ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** plugin and site screens put their actions in the screen head ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** two-row window chrome, list scaffold, content heads ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** recent history beside back and forward, the rail mark at its size ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** one list scaffold for Sites and Orders, the page star in the title row ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** two-row window chrome, the switcher toggle and the brand mark on the rail ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** breadcrumbs head every page and the workspace header matches Figma ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** the shell matches Figma's Compact and Touch sizes ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** the shell drawn to Figma's Compact and Touch sizes ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** create new lists the site's items, then the workspace's ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** port deriveThemeFromPreview over THEME_FIGMA_BASE ([AGL-3950](https://linear.app/aglyn/issue/AGL-3950))
- **apple:** themes derive from their previews over THEME_FIGMA_BASE ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** themes, accents and role grants from the theme contract ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945), [AGL-3950](https://linear.app/aglyn/issue/AGL-3950))
- **kotlin:** the brand's theme reads its contract palette like the rest ([AGL-3950](https://linear.app/aglyn/issue/AGL-3950))
- **kotlin:** template strip on pages, grid or list in the marketplace ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** themes, accents, densities and role grants from the contract ([AGL-3950](https://linear.app/aglyn/issue/AGL-3950))
- **kotlin:** marketplace home, plan card, breadcrumbs and shared screen patterns ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** whole-app theming from the account's theme ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** manifest create menu, help docs per screen, calmer records ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** the logo kit's light and dark alternate app icons ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** help docs opens the docs page of the row on screen ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** the create menu comes from the manifest's create lists ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** the logo kit's light and dark alternate app icons ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** tabs, help menu and a docked AI panel on kotlin wide windows ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** needs-you lines, the assist slot, workspace CRM and Marketing ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** needs-you lines and the assist panel from the plugins ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** calmer order, product, contact and page screens ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** nav phase 2: one box, starred and recents, needs you, create, bell ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** whole-app theming, the plan card and breadcrumbs ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** tabs, the AI panel and the help menu ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** one box, title-bar history, bell popover, stars, Create new and Home ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))

### Fixed

- **console:** declare invoice.stripe.com, the Site Care invoice pay link ([AGL-3970](https://linear.app/aglyn/issue/AGL-3970))
- **native:** every embed task and the Windows check read JSON as LF ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** embed contract JSON with LF on every platform, so Windows compiles ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **ai:** whole listing title, a/an agreement, honest form note, named welcome email ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **native:** draw a logo mark or favicon whole instead of cropping it to the badge ([AGL-3991](https://linear.app/aglyn/issue/AGL-3991))
- **apple:** one content edge per column; Home, Analytics and notices fill it ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** spec zones read their conditional screens, so a zone row never waits ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **ai:** fold like columns with a button or no heading into one group, not a refusal ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **ai:** a guided start never links a page it did not put live; pages keep site order ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **e2e:** reap Chrome bundle copies that killed or crashed Chromes leave ([AGL-3904](https://linear.app/aglyn/issue/AGL-3904))
- **ai:** a failed photo takes the job's own photo, never an office; plain alts ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988), [AGL-3831](https://linear.app/aglyn/issue/AGL-3831), [AGL-3856](https://linear.app/aglyn/issue/AGL-3856))
- **stock-photos:** wait out Pixabay's 429 on photo downloads, two at a time ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **native:** a tab keeps its screen's name whole and wears the screen's icon ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** a plain detail column's totals rows are Figma's 40, not 36 ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** views that load in a task draw once loaded, Inbox's count first ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** the site sheet counts the workspace's sites as the console's dialog does ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** the Aglyn theme's accent token is Figma's #0073AE, not its #00B0FF seed ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **tools:** canary passes a candidate a newer deploy replaced before serving ([AGL-3986](https://linear.app/aglyn/issue/AGL-3986))
- **billing:** an ai:<tier> entry on a bundle link sells that Aglyn AI tier ([AGL-3955](https://linear.app/aglyn/issue/AGL-3955), [AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **native:** the order detail matches Figma 13:483 / 13:2167 and Apple's ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **site-care:** mint project ids with createResourceUid ([AGL-3970](https://linear.app/aglyn/issue/AGL-3970), [AGL-3079](https://linear.app/aglyn/issue/AGL-3079))
- **native:** the splash icon holds the mark on Android 12-13; the draw-in moves to 14+ ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** a workspace picked from All workspaces opens on its Home ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** desktop HTTP client speaks HTTP/1.1 so console calls and logos load ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** a list's detail column shows its own page's crumbs, never another tab's ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **site-care:** mint request, message and history ids with createResourceUid ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959), [AGL-3079](https://linear.app/aglyn/issue/AGL-3079))
- **billing:** mint the bundle link id with createResourceUid ([AGL-3955](https://linear.app/aglyn/issue/AGL-3955), [AGL-3079](https://linear.app/aglyn/issue/AGL-3079))
- **console:** a site collaborator's new invite is named by the platform's id ([AGL-3984](https://linear.app/aglyn/issue/AGL-3984), [AGL-3086](https://linear.app/aglyn/issue/AGL-3086))
- **console:** a site collaborator's pending invite gains the site, never a second invite ([AGL-3984](https://linear.app/aglyn/issue/AGL-3984), [AGL-1111](https://linear.app/aglyn/issue/AGL-1111), [AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** the order's tax and refund notes line up with its totals on the Mac and iPad ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **crm:** contacts-create judges and keeps the custom values sent with it ([AGL-3971](https://linear.app/aglyn/issue/AGL-3971))
- **apple:** the site sheet states the plan limit up front, one Address label ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** the order says its refunds as the console does, with no payments fold ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** a detail column's folds keep their chevron at the content's edge ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **ci:** the emulator guards wait for a ready Auth emulator, and log one that is not ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** the order detail's rows, totals and head line up with Figma 13:483 ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **kotlin:** the brand accent needs whiteLabel; breadcrumbs head the detail column ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** only a white-label workspace's brand color becomes the accent ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** only a white-label brand color is the accent; edge to edge after the splash ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** what the seeded pairs showed: accent, Starred, list head, bag ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** list rows keep Figma's 64, desktop snapshots open any workspace's site ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **android:** what the 60 fps launch recordings turned up on the tablet ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** a write over REST re-reads at once, so an editor shows its own save ([AGL-3971](https://linear.app/aglyn/issue/AGL-3971))
- **apple:** the Mac tab row and switcher as Figma: icons, titles, close, lights, anchor ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** iPhone top bar and tab bar as Figma 22:499, with the Inbox count ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** the search dropdown shows each group's best match, as Figma's 118:15773 ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** the Customer texts row shows where the store is on ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **native:** the seeded workspace lists its sites, so the site limit counts them ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** order status chips take the console's colors ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** a click in the site switcher no longer opens the search dropdown ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** the seeded collaborator is a real member; the seed uses the console's bucket ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** the card grid never traps on an unbounded width; Marketing opens on the Mac ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **native:** the seed gives the workspace a logo and every site a favicon ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **ai:** offer only the parts a start builds; the liked site's order leads the home ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975), [AGL-3755](https://linear.app/aglyn/issue/AGL-3755), [AGL-3899](https://linear.app/aglyn/issue/AGL-3899))
- **apple:** site switcher, header and More row as Figma; Create site says what stops it ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** the toolbar hairline sits under its 44-pt row, as Figma's 79-pt title bar ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **console:** a locked card opens a Locked features docs section of its own ([AGL-3977](https://linear.app/aglyn/issue/AGL-3977))
- **apple:** a Mac tab drags out to its own window again ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **domains:** the Domain Connect templates carry the official logo kit lockup ([AGL-3963](https://linear.app/aglyn/issue/AGL-3963))
- **android:** a first launch hands the splash to the intro, mark held, wordmark wiped in ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** full-screen tab row, focus-only search, scopes open at their roots ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **site-care:** idempotent corrections, case-kept reply ids, pooled sender lookup ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **kotlin:** search results and the site switcher keep Figma's 44 rows ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** sidebar header, rows and list controls measure as Figma's Compact ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **billing:** blame only the code's own refusal on a link's coupon ([AGL-3955](https://linear.app/aglyn/issue/AGL-3955))
- **staff:** the starter flag is saved only once the starter site exists ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **apple:** phone Orders draws Figma 22:499's title row, toolbar and flush rows ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **staff:** name the client build preview row in the staff audit trail ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **email:** count the client build preview email and regenerate staff constants ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **staff:** a client build given the starter site resumes at the send step ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **native:** the workspace Automation row opens the organization's hub ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **native:** seeded teammates get verified emulator accounts ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **kotlin:** a search result's glyph falls back to its group heading ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **android:** the window under both apps is the splash's ground from the first frame ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** what the P11 and P12 walk turned up on the tablet ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** the nav lists leave out plugins not released to the workspace ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** starred stays open at rest, phone search rows as Figma 69:744 ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** the Create tab draws its tile, phone Menu grounds and hairlines, record icons ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** one More per head, the orders column's ⋯ is icon-only on iPad ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** unreleased plugins leave the sidebar, failed screens keep their ground ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **native:** the seed releases Accounting to the demo workspace ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** one sidebar selection, only the active group open, phone Menu to Figma ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** iPad rail 68, sidebar 248 and a 30-point search field, as Figma's iPad frames ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** fixes from driving the shell on Mac, iPad and iPhone ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** the title-bar search is 480 wide with its footer ground, as Figma ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** the sign-up screen survives its own account appearing ([AGL-3981](https://linear.app/aglyn/issue/AGL-3981))
- **apple:** the list column's title row is Figma's 28 points ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **staff:** client build names the product by the configured brand ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **kotlin:** the launch intro is one motion with no flash ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **ai:** the inspiration plan block names the platform's parts, not the brand ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975))
- **ai:** read the inspiration flag statically and keep recorded pages as html and css ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975))
- **ai:** a tracking change with no pixel ID waits in needs_input for it ([AGL-3978](https://linear.app/aglyn/issue/AGL-3978))
- **apple:** disabled create actions say why, phone More and spinner restored ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** one continuous launch intro, mark holds then the wordmark wipes in ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **console,tenant-data-admin,ai:** site lists stop lagging the site's name and icon ([AGL-3972](https://linear.app/aglyn/issue/AGL-3972), [AGL-3806](https://linear.app/aglyn/issue/AGL-3806))
- **apple:** stacked screen-head modifiers merge instead of replacing each other ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** every tab keeps its own place while another is in front ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **ai:** a Free plan past its section budget is trimmed to it, never refused ([AGL-3969](https://linear.app/aglyn/issue/AGL-3969))
- **data:** the empty datasets line says what to do, not a binding syntax ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **kotlin:** every window tab keeps its own workspace and site ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** the switcher's pin shortcuts are not shown on a phone ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** the Mac title bar shows Search or jump to as a labeled toolbar button ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** the create lists' plan features reach the apps' plan defaults ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** what driving both apps on the phone and tablet turned up ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** the create lists' plan features reach the apps' plan defaults ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** the Mac title bar's search field takes the automatic toolbar run ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** create gates read resolved features; record heads drawn whole ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** a long sign-in title keeps one line, Create account above it ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** notifications are asked for in the app, never on the sign-in screens ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** pushes open in their own account; the regenerated manifests ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))

### Changed

- **native:** name the shelf seed listings.mjs, as core files avoid plugin names ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **apple:** use the scaffold's chrome merge and test ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))

### Documentation

- **release:** beta.271 changelog carries #1831 and the invoice host fix ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **release:** beta.271 changelog carries the full Windows embed fix ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **release:** beta.271 changelog carries the Windows contract embed fix ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **release:** beta.271 changelog carries Site Care (#1840, #1820) merged in from main ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **release:** beta.271 changelog carries everything merged in from main ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **ai:** what a failed page and a failed photo come to on a guided start ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **ai:** each style's layout, and the style cards' new pictures ([AGL-3985](https://linear.app/aglyn/issue/AGL-3985))
- **decision-log:** record the Site Care time constants ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **domains:** list the Buy a domain guide for domain go-live ([AGL-3964](https://linear.app/aglyn/issue/AGL-3964))
- **site-care:** staff runbook for Charge for work, owner Projects on Billing ([AGL-3970](https://linear.app/aglyn/issue/AGL-3970))
- **decision-log:** the AI tiers entry matches its Drive entry and records the go-live ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **billing:** regenerate the feature matrix, generation on every paid plan ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **site-care:** staff runbook, owner statement, self-host variables and card help ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **staff:** client build screen walkthrough, What's New, domain search reference ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))

<details>
<summary>Also in this release: 26 test, 6 chore, 1 style</summary>

- **native:** the nav manifest spec knows the Customer texts row is gated on commerce ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **ai:** record the Pixabay tag words colour and colours in the spelling baseline ([AGL-3988](https://linear.app/aglyn/issue/AGL-3988))
- **tools:** raise the Linear id floor to AGL-3991, read off the workspace ([AGL-3991](https://linear.app/aglyn/issue/AGL-3991), [AGL-3986](https://linear.app/aglyn/issue/AGL-3986), [AGL-3989](https://linear.app/aglyn/issue/AGL-3989), [AGL-3984](https://linear.app/aglyn/issue/AGL-3984))
- **release:** v1.0.0-beta.271 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))
- **apple:** the phone's Workspace settings opens on Team, its first row ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **native:** both apps' create body nests custom values in minor units ([AGL-3971](https://linear.app/aglyn/issue/AGL-3971))
- **kotlin:** the sign-up test reads its call logs thread-safely ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **console:** the pricing publish script is no screen create; the AI excerpt fits ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **ai:** the Anthropic and image-sink inventories name Sites I like's files ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975))
- **native:** the plan change says the AI tier is not sold on Free ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965))
- **kotlin:** the desktop test run shoots the tablet's Touch shell to measure it ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **pricing:** the figma frames carry the ai tiers, and a script publishes them ([AGL-3965](https://linear.app/aglyn/issue/AGL-3965), [AGL-3615](https://linear.app/aglyn/issue/AGL-3615))
- **ai:** a live eval of Sites I like on recorded pages, held to a spend cap ([AGL-3975](https://linear.app/aglyn/issue/AGL-3975))
- **ai:** the live site-plan eval plans a start given every business detail ([AGL-3979](https://linear.app/aglyn/issue/AGL-3979))
- **rules:** prove every client is refused on a project record and its history ([AGL-3970](https://linear.app/aglyn/issue/AGL-3970))
- **native:** regenerate staff constants for the Site Care emails ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **rules:** prove every client is refused on the Site Care paths ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **site-care:** cover the arithmetic, records, Stripe calls, requests and routes ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **ai:** the More details section is rounded and outlined like the build page's plan ([AGL-3979](https://linear.app/aglyn/issue/AGL-3979))
- **ai:** the layout language's cached span is up 19 and 20 for phone and email links ([AGL-3979](https://linear.app/aglyn/issue/AGL-3979))
- **invites:** pin hand off and propose as one act ([AGL-3956](https://linear.app/aglyn/issue/AGL-3956))
- **billing:** pin the bundle link doors, bundle checkout and the boot-time waiver ([AGL-3955](https://linear.app/aglyn/issue/AGL-3955))
- **email:** count the hand-off-with-a-plan email among the editable ones ([AGL-3956](https://linear.app/aglyn/issue/AGL-3956))
- **billing:** mock the router the Billing page now reads ([AGL-3955](https://linear.app/aglyn/issue/AGL-3955))
- **staff:** type the domain search slot stub so the spec config compiles ([AGL-3958](https://linear.app/aglyn/issue/AGL-3958))
- **kotlin:** a double-click on the tab row zooms the window ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **linear:** raise the issue ceiling to AGL-3981, which exists ([AGL-3981](https://linear.app/aglyn/issue/AGL-3981))
- **site-care:** wip requests, timer, approvals and audit, paused ([AGL-3959](https://linear.app/aglyn/issue/AGL-3959))
- **kotlin:** the theme test counts writes after the accent's own lands ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** editor actions reach the screen head beside the list's primary ([AGL-3966](https://linear.app/aglyn/issue/AGL-3966))
- **kotlin:** the sign-up test waits for the pending workspace write ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** the plugins' declared widgets include their needs-you and assist slots ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** nav snapshots shoot tabs, AI panel, theme states and marketplace ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))

</details>

2 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.270 — 2026-10-19

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.269...v1.0.0-beta.270)

### Added

- **console:** deal catalog, ai credits, payment methods, products, org sites state needs ([AGL-3982](https://linear.app/aglyn/issue/AGL-3982))
- **console:** kiosk pairing and AI finish-store state payment prerequisites ([AGL-3982](https://linear.app/aglyn/issue/AGL-3982))
- **legal:** v17, Terms, Privacy and Subprocessors: domain names and Site Care ([AGL-3964](https://linear.app/aglyn/issue/AGL-3964), [AGL-3954](https://linear.app/aglyn/issue/AGL-3954))
- **commerce:** publish its order events and order history as contracts ([AGL-3980](https://linear.app/aglyn/issue/AGL-3980))
- **plugins:** a contracts entry point per plugin, a uses field and the boundary guard ([AGL-3980](https://linear.app/aglyn/issue/AGL-3980))
- **marketing:** managed landing page, campaign and per-event utm ([AGL-3960](https://linear.app/aglyn/issue/AGL-3960))
- **pricing:** site care is live on /pricing with the extra-time rate and project floors ([AGL-3954](https://linear.app/aglyn/issue/AGL-3954), [AGL-3959](https://linear.app/aglyn/issue/AGL-3959), [AGL-3970](https://linear.app/aglyn/issue/AGL-3970))
- **domains:** one-click DNS through Domain Connect ([AGL-3963](https://linear.app/aglyn/issue/AGL-3963), [AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** the Get a domain card on the Custom Domain page ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** buy, connect and renew a domain unattended ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** the domains plugin, its registrar seam and Vercel's driver ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** connect a domain through one server function, with its www twin ([AGL-3961](https://linear.app/aglyn/issue/AGL-3961), [AGL-1311](https://linear.app/aglyn/issue/AGL-1311))
- **billing:** site care add-on at a flat $49/mo on every paid plan ([AGL-3954](https://linear.app/aglyn/issue/AGL-3954))
- **media:** a site photo link drops phone photos in the library; the AI uses them first ([AGL-3957](https://linear.app/aglyn/issue/AGL-3957))
- **console:** staff comp a client's workspace as they create it ([AGL-3952](https://linear.app/aglyn/issue/AGL-3952))
- **native:** export the Figma base palettes the preview derivation starts from ([AGL-3950](https://linear.app/aglyn/issue/AGL-3950))
- **native:** the Aglyn theme is the console's shipping scheme; tokens, roles, docs ([AGL-3950](https://linear.app/aglyn/issue/AGL-3950))
- **native:** theme palettes, accent derivation and role grants as contracts ([AGL-3950](https://linear.app/aglyn/issue/AGL-3950))
- **kotlin:** port resolveCreateList, a push tap opens in its own account ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** create menus and help docs in the nav manifest ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943))
- **native:** a push names its recipient account, uid in MobilePushData ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943))
- **kotlin:** home opens the site picker, invitations join from the picker ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **kotlin:** the workspace scope opens crm, inbox, emails and marketing ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **apple:** workspace views for Inbox, Emails, Marketing and CRM ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **apple:** workspace rail, scope sidebar, pickers and Add account ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** nav shell phase 1: rail, scoped sidebar, pickers, menus, add account ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **console:** one-box search route, nav manifest drift spec and nav doc ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943), [AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **kotlin:** port the nav manifest, account preferences and one-box rules ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))
- **native:** nav manifest, account preferences and one-box contracts ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943))
- **kotlin:** sign-in on the Facets ground, the button system and the splash hand-over ([AGL-3934](https://linear.app/aglyn/issue/AGL-3934))
- **apple:** sign-in on the Facets ground, the button system and the launch intro ([AGL-3934](https://linear.app/aglyn/issue/AGL-3934))
- **native:** one sign-in and launch theme for Apple, Kotlin and the launch art ([AGL-3934](https://linear.app/aglyn/issue/AGL-3934))

### Fixed

- **commerce:** kiosk readiness reads pay-at-counter itself, off the eager chunk ([AGL-3982](https://linear.app/aglyn/issue/AGL-3982))
- **ai:** credits notice reads the AI features, not a brand literal ([AGL-3982](https://linear.app/aglyn/issue/AGL-3982))
- **marketing-platforms:** send no Stripe test-mode order to a merchant's email platform ([AGL-3980](https://linear.app/aglyn/issue/AGL-3980))
- **print-on-demand:** take commerce's order shape, and read test mode from livemode ([AGL-3980](https://linear.app/aglyn/issue/AGL-3980))
- **domains:** punctuate the registrations export note ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** the export note names no brand ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** self-hosts link their own terms; the export names both collections ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** serve the Domain Connect template logo from the public repo ([AGL-3963](https://linear.app/aglyn/issue/AGL-3963))
- **domains:** no free first year; every year is paid at cost + 30% ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** charge and email nothing for a workspace locked for security or abuse ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** boot the domains declarations without the server data layer ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **tools:** grade deployed functions by source stamp, not deploy time ([AGL-3968](https://linear.app/aglyn/issue/AGL-3968))
- **media:** photo link page is web-only, dialog mounts on open, excerpt check reads code ([AGL-3957](https://linear.app/aglyn/issue/AGL-3957))
- **data:** datasets empty state names no template syntax
- **console:** pending invites stop re-reading on every tab flip ([AGL-3953](https://linear.app/aglyn/issue/AGL-3953))
- **ai:** pages a build adds to a site move in the site's own motion style ([AGL-3949](https://linear.app/aglyn/issue/AGL-3949))
- **native:** sign-in fixes from the device drive, and a sign-in title override ([AGL-3934](https://linear.app/aglyn/issue/AGL-3934))
- **plugins:** the one box's search sources live on globalThis ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943), [AGL-3947](https://linear.app/aglyn/issue/AGL-3947))
- **ai:** a form field's placeholder is never a bracketed marker ([AGL-3942](https://linear.app/aglyn/issue/AGL-3942))
- **ai:** stock alt texts read plainly; mountain sites skip beaches; show the work ([AGL-3942](https://linear.app/aglyn/issue/AGL-3942))

### Performance

- **tenant:** the render's org read stops holding every page at a 60s ISR window ([AGL-3951](https://linear.app/aglyn/issue/AGL-3951))

### Changed

- **plugins:** fourteen plugins take commerce's shapes from its contracts ([AGL-3980](https://linear.app/aglyn/issue/AGL-3980))
- **native:** plugins declare their nav rows, the generator assembles them ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943))

### Documentation

- what the kiosk, payment methods, deals, ai credits and org sites need first ([AGL-3982](https://linear.app/aglyn/issue/AGL-3982))
- **legal:** v17 was published at 08:07 Central, not 08:35 ([AGL-3964](https://linear.app/aglyn/issue/AGL-3964))
- **marketing:** managed campaign routing is on, env 16 recorded ([AGL-3960](https://linear.app/aglyn/issue/AGL-3960))
- **decision-log:** the owner confirmed every site care figure on 2026-10-19 ([AGL-3954](https://linear.app/aglyn/issue/AGL-3954))
- **domains:** connect a domain automatically, unlisted until it is live ([AGL-3963](https://linear.app/aglyn/issue/AGL-3963))
- site care add-on decision of 2026-10-18 in the decision log index ([AGL-3954](https://linear.app/aglyn/issue/AGL-3954), [AGL-3960](https://linear.app/aglyn/issue/AGL-3960))

<details>
<summary>Also in this release: 8 test, 6 chore</summary>

- name the managed landing script as a screen door, and unflake the photo link secret check ([AGL-3960](https://linear.app/aglyn/issue/AGL-3960), [AGL-3957](https://linear.app/aglyn/issue/AGL-3957))
- **native:** await the held workspace name instead of racing the verification email
- **domains:** the repo-wide sweeps name the domains plugin ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** the domains package rides the repo version, beta.270 ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **pricing:** the figma pricing frames carry the site care card ([AGL-3954](https://linear.app/aglyn/issue/AGL-3954))
- **domains:** gate spec mocks the shared release helper the detach route now calls ([AGL-3961](https://linear.app/aglyn/issue/AGL-3961))
- **domains:** guards and generated files for the domains plugin ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **domains:** the Stripe product and environment for selling domains ([AGL-3962](https://linear.app/aglyn/issue/AGL-3962))
- **docs:** regenerate the feature matrix for the site care rows ([AGL-3954](https://linear.app/aglyn/issue/AGL-3954))
- **apple:** a workspace without a plan reads as Free in its logo row ([AGL-3945](https://linear.app/aglyn/issue/AGL-3945))
- **tools:** the launch logo spec checks the mark PNGs at 1x-3x ([AGL-3934](https://linear.app/aglyn/issue/AGL-3934))
- **console:** the licenses section spec reads the shared section-id constant ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943))
- **tools:** the Licenses section id's baseline row moves with it ([AGL-3943](https://linear.app/aglyn/issue/AGL-3943))
- **kotlin:** accounts and account preferences keep each account apart ([AGL-3946](https://linear.app/aglyn/issue/AGL-3946))

</details>

## v1.0.0-beta.269 — 2026-10-18

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.268...v1.0.0-beta.269)

### Added

- **native:** in-app browser is a pushed screen, not a sheet ([AGL-3935](https://linear.app/aglyn/issue/AGL-3935))
- **ai:** each site's look chooses its motion style ([AGL-3941](https://linear.app/aglyn/issue/AGL-3941), [AGL-3838](https://linear.app/aglyn/issue/AGL-3838))

### Fixed

- **native:** leave the tab bar to the system on the iPhone browser screen ([AGL-3935](https://linear.app/aglyn/issue/AGL-3935))
- **plugins:** eleven registries the boot fills are one per process ([AGL-3947](https://linear.app/aglyn/issue/AGL-3947), [AGL-3412](https://linear.app/aglyn/issue/AGL-3412), [AGL-3868](https://linear.app/aglyn/issue/AGL-3868))
- **console,e2e:** home page never drops the plan-intent read; launch smoke green ([AGL-3948](https://linear.app/aglyn/issue/AGL-3948), [AGL-1514](https://linear.app/aglyn/issue/AGL-1514), [AGL-2590](https://linear.app/aglyn/issue/AGL-2590), [AGL-3594](https://linear.app/aglyn/issue/AGL-3594), [AGL-2575](https://linear.app/aglyn/issue/AGL-2575))
- **ai:** "about" as a preposition is no portrait; typed-world words held to the kind ([AGL-3923](https://linear.app/aglyn/issue/AGL-3923))
- **ai:** a page with a library keeps one neutral starter, never another business's ([AGL-3923](https://linear.app/aglyn/issue/AGL-3923), [AGL-3831](https://linear.app/aglyn/issue/AGL-3831))
- **ai:** every kind's own common photos, no placeholder search words ([AGL-3923](https://linear.app/aglyn/issue/AGL-3923), [AGL-3831](https://linear.app/aglyn/issue/AGL-3831))

<details>
<summary>Also in this release: 2 test</summary>

- **console:** exempt the nonprofit kind's 'community' photo words from AGL-975 ([AGL-975](https://linear.app/aglyn/issue/AGL-975), [AGL-3923](https://linear.app/aglyn/issue/AGL-3923))
- **ai:** live layout eval hands pages the look's motion style ([AGL-3941](https://linear.app/aglyn/issue/AGL-3941))

</details>

## v1.0.0-beta.268 — 2026-10-18

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.267...v1.0.0-beta.268)

### Added

- **ai:** a removed start's Start again opens Create site with its answers ([AGL-3936](https://linear.app/aglyn/issue/AGL-3936))
- **ai:** remove the empty site a stopped guided start left, an hour later ([AGL-3936](https://linear.app/aglyn/issue/AGL-3936))
- **console:** core.site-erase runs the delete route's own path for a server removal ([AGL-3936](https://linear.app/aglyn/issue/AGL-3936))
- **native:** app versions follow the repo's package.json version ([AGL-3924](https://linear.app/aglyn/issue/AGL-3924))

### Fixed

- **stock-photos:** name a photo by its bytes; one refused photo never stops a page ([AGL-3923](https://linear.app/aglyn/issue/AGL-3923))
- **native:** logos and favicons through one core resolver, pinned sidebar lockup ([AGL-3931](https://linear.app/aglyn/issue/AGL-3931))
- **ai:** answered steps and review answers act; dead clicks count real content only ([AGL-3930](https://linear.app/aglyn/issue/AGL-3930))
- **native:** release script passes the Android versionName ([AGL-3924](https://linear.app/aglyn/issue/AGL-3924))
- **native:** product photos in the detail header, even kiosk tiles, library logos ([AGL-3925](https://linear.app/aglyn/issue/AGL-3925))
- **native-android:** kiosk tile names hold two lines, so every row is even ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **native:** polish found while shooting store screenshots ([AGL-3922](https://linear.app/aglyn/issue/AGL-3922))

### Documentation

- **ai:** the empty site a stopped start left, and the issue ceiling to AGL-3938 ([AGL-3938](https://linear.app/aglyn/issue/AGL-3938), [AGL-3936](https://linear.app/aglyn/issue/AGL-3936))
- **native:** console parity ticks record what was driven on each device ([AGL-3653](https://linear.app/aglyn/issue/AGL-3653))

<details>
<summary>Also in this release: 1 test, 2 chore</summary>

- **deps:** lib peer ranges admit firebase 13 ([AGL-3940](https://linear.app/aglyn/issue/AGL-3940))
- **console:** the empty-site sweep reads screens and creates none ([AGL-3936](https://linear.app/aglyn/issue/AGL-3936))
- **deps:** Bump the firebase group across 1 directory with 2 updates

</details>

## v1.0.0-beta.267 — 2026-10-18

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.266...v1.0.0-beta.267)

### Changed

- **firestore:** background work writes once per run, not once per job ([AGL-3932](https://linear.app/aglyn/issue/AGL-3932))
- **monitoring:** the render monitor and the production canary take turns over the pages, instead of each reading every page on every run ([AGL-3928](https://linear.app/aglyn/issue/AGL-3928))
- **notifications:** every staff notification (new account, workspace and site, subscriptions, plan changes, failed payments) emails every staff account by default ([AGL-3929](https://linear.app/aglyn/issue/AGL-3929))

### Fixed

- **health:** the sign-up landing check grades whether a new owner reached the console, not whether they made a site ([AGL-3927](https://linear.app/aglyn/issue/AGL-3927))
- **uptime:** the probe tries a request once more when the runner's own network failed it ([AGL-3927](https://linear.app/aglyn/issue/AGL-3927))
- **ai:** widen a picture's search past an unknown world so pages keep photos ([AGL-3923](https://linear.app/aglyn/issue/AGL-3923), [AGL-3856](https://linear.app/aglyn/issue/AGL-3856), [AGL-3831](https://linear.app/aglyn/issue/AGL-3831))
- **stock-photos:** a Pixabay download that fails says why, by host and status, never by its signed address ([AGL-3923](https://linear.app/aglyn/issue/AGL-3923))

<details>
<summary>Also in this release: 1 chore</summary>

- **guards:** record the AGL-3923 fixture's recorded Pixabay tag text in the spelling baseline ([AGL-3923](https://linear.app/aglyn/issue/AGL-3923))

</details>

## v1.0.0-beta.266 — 2026-10-18

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.265...v1.0.0-beta.266)

### Added

- **activity:** plugins word their prose activity rows; workflows says its runs ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892), [AGL-3412](https://linear.app/aglyn/issue/AGL-3412), [AGL-3868](https://linear.app/aglyn/issue/AGL-3868))
- **pos-android:** add and manage receipt printers natively in Aglyn POS ([AGL-3909](https://linear.app/aglyn/issue/AGL-3909))
- **apple:** pick the notification sound in Aglyn's notification settings ([AGL-3890](https://linear.app/aglyn/issue/AGL-3890))
- **native-android:** notification sound channels and picker ([AGL-3890](https://linear.app/aglyn/issue/AGL-3890))
- **console:** org activity route says each entry's action in words for the apps ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **commerce:** a test-mode smart reader can be tapped from the POS card step ([AGL-3849](https://linear.app/aglyn/issue/AGL-3849))
- **commerce:** a typed card goes into the POS app's own native card fields ([AGL-3848](https://linear.app/aglyn/issue/AGL-3848))
- **native:** the POS card readers screen finds, connects, updates and forgets readers ([AGL-3849](https://linear.app/aglyn/issue/AGL-3849))

### Fixed

- **ai:** gallery and record covers show the moment, not a photographer or camera; teachers are shown teaching ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856), [AGL-3921](https://linear.app/aglyn/issue/AGL-3921))
- **ai:** each category section lists only its own category's records, and photo alts drop leftover abstract words ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856), [AGL-3921](https://linear.app/aglyn/issue/AGL-3921))
- **apple:** no minus on zero refunds, no empty actions card, one-line token values ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **native:** quiet filter toolbar actions, empty tax period sentence, one-line id values ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native:** phone walk fixes for stat rows, metric cards, settings and shift reports ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native-android:** order actions, the Funnels header and unchanged Save buttons ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **pos-apple:** the printer connect step's Done carries an identifier for UI tests ([AGL-3909](https://linear.app/aglyn/issue/AGL-3909))
- **auth:** the sign-up subtitle is sentence case on the console and both apps ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **workflows:** an event no plugin labels reads as a word in run activity ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native-android:** one colors argument on the upsell's tonal button ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native-android:** tonal buttons and CRM record actions follow the spec ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native-android:** kiosk tiles keep one picture band, photo or initial ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **pos-apple:** the kiosk's chips clear the Staff control and its tiles line up ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **apple:** a workflow run's activity row names its trigger in words ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **apple:** back from the Besigner, a page's Published and Updated times read again ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **console:** a page's save and publish reports once, not four toasts deep ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **pos-apple:** a removed printer leaves the list at once; a refusal stays in its form ([AGL-3909](https://linear.app/aglyn/issue/AGL-3909))
- **bookings-apple:** the week grid takes the full width where the detail cannot fit ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **apple:** the Home site card keeps the address on one line beside a wide status ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **native-seed:** real photos in the Storage emulator, so POS tiles show them ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **commerce:** the printers route signs a printer's URL before it writes ([AGL-3909](https://linear.app/aglyn/issue/AGL-3909))
- **billing:** a deleted item frees its plan slot, an archived one keeps it ([AGL-3918](https://linear.app/aglyn/issue/AGL-3918))
- **native-apple:** "Page deleted." stays on the list after a page leaves ([AGL-3907](https://linear.app/aglyn/issue/AGL-3907))
- **pos-android:** printer steps card and the last removal's notice ([AGL-3909](https://linear.app/aglyn/issue/AGL-3909))
- **native-android:** sheets clear the keyboard on tablets; chips, activity in words ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **pos-android:** the printer sheet shows the route's refusal ([AGL-3909](https://linear.app/aglyn/issue/AGL-3909))
- **apple:** a new workspace shows at once after sign-up ([AGL-3920](https://linear.app/aglyn/issue/AGL-3920))
- **pos-apple:** the pairing code stays open until Done ([AGL-3919](https://linear.app/aglyn/issue/AGL-3919))
- **pos-apple:** kiosk tiles show product photos; a photo never widens its tile ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **native-android:** the POS store name stays on one line on a phone ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **commerce:** the Mac reader menu shows one affordance, not ellipsis plus chevron ([AGL-3849](https://linear.app/aglyn/issue/AGL-3849))
- **native-android:** walk leftovers: keyboard, page, receipt, redirect, quota, titles ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native:** android POS readers connect (OkHttp 4 pin), keep found readers, phone layout ([AGL-3849](https://linear.app/aglyn/issue/AGL-3849))
- **apple:** list rows that open or pick answer a touch and the pointer ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **pos-apple:** the receipt preview pins TOTAL's amount to the paper's right edge ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **native-android:** long forms and the Register sheet get room; new products open ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native-android:** human words for referrers, email states, reasons, categories ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native:** referrer addresses, POS device copy, one email word ([AGL-3914](https://linear.app/aglyn/issue/AGL-3914), [AGL-3915](https://linear.app/aglyn/issue/AGL-3915), [AGL-3916](https://linear.app/aglyn/issue/AGL-3916))
- **native:** an AI job link opens on its own site, or says the job isn't here ([AGL-3911](https://linear.app/aglyn/issue/AGL-3911))
- **native-apple:** the last eight sheets keep their minimum size to the Mac ([AGL-3908](https://linear.app/aglyn/issue/AGL-3908))
- **native-android:** aglyn POS loads remote pictures through the image loader ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **native-apple:** sheets keep their minimum size to the Mac, not wider than a phone ([AGL-3908](https://linear.app/aglyn/issue/AGL-3908))
- **native-apple:** a page deleted on a phone leaves, and its notices show ([AGL-3907](https://linear.app/aglyn/issue/AGL-3907))
- **native-android:** register and kiosk tiles show product photos ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **commerce:** the Android POS connects a reader while the search still runs ([AGL-3849](https://linear.app/aglyn/issue/AGL-3849))
- **commerce:** a reader found by a running search can be connected in the POS app ([AGL-3849](https://linear.app/aglyn/issue/AGL-3849))
- **commerce:** fast typing in the POS card fields lands in the next field ([AGL-3848](https://linear.app/aglyn/issue/AGL-3848))
- **commerce:** the reader search keeps the POS app open; the address keys the Location ([AGL-3849](https://linear.app/aglyn/issue/AGL-3849))
- **commerce:** the POS card fields keep every keystroke and name Stripe's switch ([AGL-3848](https://linear.app/aglyn/issue/AGL-3848))
- **commerce:** the POS apps always offer a typed card, keyed by the intent's answer ([AGL-3848](https://linear.app/aglyn/issue/AGL-3848))

### Reverted

- **console:** leave automation-run activity words to a plugin seam ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **native-android:** drop the deleted-workflows quota note ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892), [AGL-3918](https://linear.app/aglyn/issue/AGL-3918))
- **native-android:** leave referrer, email state and sign-in words to #1739 ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))

<details>
<summary>Also in this release: 3 chore</summary>

- **realm:** regenerate realm host tables against @mui/material 9.5.0 ([AGL-3920](https://linear.app/aglyn/issue/AGL-3920))
- **realm:** regenerate realm host tables against @mui/material 9.5.0 ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **apple:** -AglynAppearance light|dark draws a Mac debug build in either mode ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))

</details>

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.265 — 2026-10-18

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.264...v1.0.0-beta.265)

### Added

- **pos-apple:** add and manage receipt printers natively in Aglyn POS ([AGL-3909](https://linear.app/aglyn/issue/AGL-3909))
- **apple:** Pages list reads its tree a level at a time, collapsed ([AGL-3896](https://linear.app/aglyn/issue/AGL-3896))
- **email:** curate every email for its own reader ([AGL-3897](https://linear.app/aglyn/issue/AGL-3897))
- **apple:** one in-app web sheet for live sites, previews and plain links ([AGL-3893](https://linear.app/aglyn/issue/AGL-3893))
- **native-android:** pages tree starts collapsed and reads as far as it shows ([AGL-3896](https://linear.app/aglyn/issue/AGL-3896))
- **email:** polish the form submission email; buttons name what they open ([AGL-3897](https://linear.app/aglyn/issue/AGL-3897))
- **ai:** draw the compiler's hero, group style and photo sections at even odds ([AGL-3899](https://linear.app/aglyn/issue/AGL-3899))
- **ai:** tell a site plan its home arc, where the form goes, and varied item counts ([AGL-3899](https://linear.app/aglyn/issue/AGL-3899))
- **ai:** home arcs per site kind, drawn by the job's seed ([AGL-3899](https://linear.app/aglyn/issue/AGL-3899))
- **native-android:** one in-app web sheet for sites, previews and links ([AGL-3893](https://linear.app/aglyn/issue/AGL-3893))
- **ai:** the guided start asks one decision a step, styles shown as pictures ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **ai:** the guided start reports its funnel and where people struggle ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **shared-ui:** the option card grid draws a picture card, lazy and fixed-size ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **ai:** real style previews for the guided start's style cards ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **email:** polish every system and site email; staff alerts say who and how ([AGL-3897](https://linear.app/aglyn/issue/AGL-3897))
- **notifications:** pick your notification sound for the console and app pushes ([AGL-3890](https://linear.app/aglyn/issue/AGL-3890))

### Fixed

- **ai:** a new site never reuses another site's dataset records ([AGL-3912](https://linear.app/aglyn/issue/AGL-3912))
- **data:** a record photo of a deleted site is left out, never drawn broken ([AGL-3912](https://linear.app/aglyn/issue/AGL-3912))
- **ai:** people photos show adults in the role, and alt text reads as a phrase ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))
- **mui:** the search box honors its style settings, so starter headers fit on phones ([AGL-3917](https://linear.app/aglyn/issue/AGL-3917))
- **apple:** an AI job link opens on its own workspace and site ([AGL-3911](https://linear.app/aglyn/issue/AGL-3911))
- **ai:** each guided-start style previews its own kind of page ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **console:** the subprocessor gate knows the guided-start run's stub mode ([AGL-3910](https://linear.app/aglyn/issue/AGL-3910))
- **e2e:** emulated servers also get a placeholder Firebase app id ([AGL-3910](https://linear.app/aglyn/issue/AGL-3910))
- **e2e:** the local guided-start run walks the stepped form with Next ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **health:** false reds — signupLanding counts people, /signin door sees Google bounces ([AGL-3913](https://linear.app/aglyn/issue/AGL-3913), [AGL-3724](https://linear.app/aglyn/issue/AGL-3724))
- **e2e:** emulated servers start the Admin SDK without app env files ([AGL-3910](https://linear.app/aglyn/issue/AGL-3910))
- **native-android:** medium windows keep a short rail; plan offer spans the window ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **apple:** order and CRM record pages open on the shared detail head ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **native-android:** product header and menu, even quick actions, no page id ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **apple:** a spec form's Save row keeps its section's card ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **apple:** no window tab bar on the Mac; a quota readout never sits on "checking" ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **apple:** a Pages search says when nothing matches and draws no chevrons ([AGL-3896](https://linear.app/aglyn/issue/AGL-3896))
- **apple:** split screens' title no longer sits over scrolling rows on iPad ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **apple:** a failed or refused split list folds its detail column ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **console:** leave the web notifications bell out of the apps ([AGL-3894](https://linear.app/aglyn/issue/AGL-3894))
- **email:** keep sample hosts generic and the store named in receipts ([AGL-3897](https://linear.app/aglyn/issue/AGL-3897))
- **apple:** receipt TOTAL spans the paper; whole discount row; plain price copy ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **ai:** the guided start's header comment fits the sweep specs; Try again opens on the review ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **pos:** register tiles show the product's photo, not its initial ([AGL-3906](https://linear.app/aglyn/issue/AGL-3906))
- **apple:** tooltips on the notifications toolbar; first run card radius token ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **native-apple:** deleting a product on a phone returns to the list ([AGL-3905](https://linear.app/aglyn/issue/AGL-3905))
- **native:** a confirm dialog no longer repeats the screen's earlier error ([AGL-3903](https://linear.app/aglyn/issue/AGL-3903))
- **android:** Besigner web view fills its screen so CSS vh is not 0 ([AGL-3850](https://linear.app/aglyn/issue/AGL-3850))
- **ai:** a nonprofit's gallery arc says the people it serves, never community ([AGL-3899](https://linear.app/aglyn/issue/AGL-3899))
- **ai:** settle a stray home form onto the contact page, never by refusing ([AGL-3899](https://linear.app/aglyn/issue/AGL-3899))
- **tools:** the plugin budget bundle emits a webp a plugin imports as a file ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **native:** email cases read a details panel as label then value ([AGL-3897](https://linear.app/aglyn/issue/AGL-3897))
- **notifications:** the signature sound is named Signature, not the brand ([AGL-3890](https://linear.app/aglyn/issue/AGL-3890))

### Documentation

- **ai:** the guided start's steps are sections the Assist index answers from ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **ai:** shoot the guided start's kind, style and review steps on the emulator stack ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))
- **ai:** home arcs, the form on the contact page and even design odds ([AGL-3899](https://linear.app/aglyn/issue/AGL-3899))
- **ai:** the guided start's steps, style pictures and funnel events ([AGL-3898](https://linear.app/aglyn/issue/AGL-3898))

<details>
<summary>Also in this release: 4 test, 9 chore</summary>

- **ai:** the guided-start local e2e is a mentions-only key file ([AGL-3913](https://linear.app/aglyn/issue/AGL-3913))
- **deps:** resync the cloud/functions lockfile so npm ci installs ([AGL-3913](https://linear.app/aglyn/issue/AGL-3913))
- **linear:** raise the issue ceiling to AGL-3913, read off Linear ([AGL-3913](https://linear.app/aglyn/issue/AGL-3913), [AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **deps-dev:** Bump the functions-minor-patch group across 1 directory with 2 updates
- **native:** regenerate contracts on today's main ([AGL-3897](https://linear.app/aglyn/issue/AGL-3897))
- **native:** the Besigner shows no browser chrome in the Mac app ([AGL-3894](https://linear.app/aglyn/issue/AGL-3894))
- **native-seed:** a 3-level, 60-row page tree on the seeded cafe site ([AGL-3896](https://linear.app/aglyn/issue/AGL-3896))
- **ai:** prove AI homes vary and the form stays on its own page ([AGL-3899](https://linear.app/aglyn/issue/AGL-3899))

- **ai:** the cancel watch spec waits for the abort instead of racing a 1 ms timer ([AGL-3913](https://linear.app/aglyn/issue/AGL-3913))
- **deps:** Bump the mui-emotion group with 7 updates
- **deps-dev:** Bump the nx-workspace group across 1 directory with 16 updates
- **deps-dev:** Bump the linters group across 1 directory with 5 updates
- **deps:** regenerate the realm host MUI tables for @mui/material 9.5.0 ([AGL-3913](https://linear.app/aglyn/issue/AGL-3913))

</details>

## v1.0.0-beta.264 — 2026-10-17

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.263...v1.0.0-beta.264)

### Added

- **apple:** product header + grouped toolbar, upsells, alerts, one Save, polished sign-in ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **native:** mark the apps' web views and name the Besigner natively ([AGL-3894](https://linear.app/aglyn/issue/AGL-3894))
- **native-android:** material 3 list rows, quiet placeholders, tooltips, dialogs ([AGL-3892](https://linear.app/aglyn/issue/AGL-3892))
- **apple:** one soft selection on every list; quiet pick placeholders ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))
- **apple:** shared selection style, sidebar lockup + switcher footer ([AGL-3891](https://linear.app/aglyn/issue/AGL-3891))

### Fixed

- **e2e:** stop headless Chrome leaving 1.4 GB code_sign_clone copies ([AGL-3904](https://linear.app/aglyn/issue/AGL-3904))
- **console:** /auth/native reads its query when used, not at render ([AGL-3902](https://linear.app/aglyn/issue/AGL-3902))
- **ai:** a nonprofit's photo words say charity, never community ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856), [AGL-975](https://linear.app/aglyn/issue/AGL-975))
- **native:** the register never asks for notifications it is never sent ([AGL-3901](https://linear.app/aglyn/issue/AGL-3901))
- **auth:** let the sign-up canary pass the SSO domain rule by plus tag ([AGL-3877](https://linear.app/aglyn/issue/AGL-3877))
- **pos:** the register's orders zone takes no room when it draws nothing ([AGL-3900](https://linear.app/aglyn/issue/AGL-3900))
- **console:** keep the Besigner's browser chrome out of the apps ([AGL-3894](https://linear.app/aglyn/issue/AGL-3894))
- **e2e:** the guided-start run loads again; products start at the default price ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **ai:** no empty picture card ships; an unknown business is searched by its kind ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))
- **ai:** a record's cover alt says what its photo shows, never its title ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))
- **ai:** stock photos read a gym by its name, never a railway; alts are phrases ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))
- **ai:** take a photo cover with no photo out, so its section shows its band ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))

## v1.0.0-beta.263 — 2026-10-17

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.262...v1.0.0-beta.263)

### Added

- **mui:** a secondary text color setting for List Item Text ([AGL-3886](https://linear.app/aglyn/issue/AGL-3886))
- **notifications:** one weekly summary per site plus a workspace overview ([AGL-3867](https://linear.app/aglyn/issue/AGL-3867))
- **ai:** weekly insights cover last Monday to Sunday, like the free summary ([AGL-3867](https://linear.app/aglyn/issue/AGL-3867))

### Fixed

- **ai:** list text on a colored band reads in the band's own color ([AGL-3886](https://linear.app/aglyn/issue/AGL-3886))
- **ai:** a site start plans no customer-words section it cannot fill ([AGL-3887](https://linear.app/aglyn/issue/AGL-3887))
- **ai:** a built section that promises its content later is settled ([AGL-3887](https://linear.app/aglyn/issue/AGL-3887))
- **notifications:** weekly summary colors come only from the email palette ([AGL-3867](https://linear.app/aglyn/issue/AGL-3867))
- **native:** pin the POS change due; an owner never reads as a raw uid ([AGL-3895](https://linear.app/aglyn/issue/AGL-3895))
- **console,native:** smoke-walk copy that read as code or dangled ([AGL-3884](https://linear.app/aglyn/issue/AGL-3884))
- **android:** the share sheet can read an exported file ([AGL-3883](https://linear.app/aglyn/issue/AGL-3883))
- **android:** read the Analytics traffic days by id ascending ([AGL-3882](https://linear.app/aglyn/issue/AGL-3882))
- **console,native:** an email canceled before it went out says so, not Sent to 0 ([AGL-3881](https://linear.app/aglyn/issue/AGL-3881))
- **native:** a deal row names its stage, never the stage id ([AGL-3880](https://linear.app/aglyn/issue/AGL-3880))
- **native:** the theme library lists own and marketplace themes by kind ([AGL-3879](https://linear.app/aglyn/issue/AGL-3879))
- **native:** list a Commerce settings service only where its console card draws ([AGL-3878](https://linear.app/aglyn/issue/AGL-3878))
- **ai:** "your site is live" names the site and gives its address ([AGL-3889](https://linear.app/aglyn/issue/AGL-3889))
- **notifications:** native push is immediate, never cut off, and sent once ([AGL-3888](https://linear.app/aglyn/issue/AGL-3888))
- **native-apple:** the launch restore never refreshes behind a fresh sign-in ([AGL-3885](https://linear.app/aglyn/issue/AGL-3885))
- **auth:** refuse an @aglyn.com account outside SSO before it is created ([AGL-3877](https://linear.app/aglyn/issue/AGL-3877), [AGL-1993](https://linear.app/aglyn/issue/AGL-1993))
- **native-apple:** a notice's trailing closure is its close button again ([AGL-3876](https://linear.app/aglyn/issue/AGL-3876))
- **native-apple:** a notification opens the screen the console opens ([AGL-3875](https://linear.app/aglyn/issue/AGL-3875))
- **native-android:** bookings open on Upcoming; list header titles keep their width ([AGL-3874](https://linear.app/aglyn/issue/AGL-3874))
- **native-screens:** a spec screen's refusal stays until dismissed or the next action ([AGL-3873](https://linear.app/aglyn/issue/AGL-3873))

<details>
<summary>Also in this release: 1 test</summary>

- **functions:** run the SSO domain creation test with test:functions ([AGL-3877](https://linear.app/aglyn/issue/AGL-3877))

</details>

## v1.0.0-beta.262 — 2026-10-16

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.261...v1.0.0-beta.262)

### Added

- **notifications:** free weekly summary email for every workspace ([AGL-3867](https://linear.app/aglyn/issue/AGL-3867))
- **notifications:** email on by default for AI jobs, billing and alerts ([AGL-3866](https://linear.app/aglyn/issue/AGL-3866))
- **ops:** a health check still degraded keeps paging, Must know from 2 h ([AGL-3860](https://linear.app/aglyn/issue/AGL-3860), [AGL-3857](https://linear.app/aglyn/issue/AGL-3857))
- **native:** order and product filters, sorts, the customer CRM link and products zones ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))
- **native:** create with AI beside Create on the site's lists ([AGL-3854](https://linear.app/aglyn/issue/AGL-3854))
- **ai:** the apps' door and follow view for Create with AI ([AGL-3854](https://linear.app/aglyn/issue/AGL-3854))
- **native:** orders and products match the console's dialogs and row actions ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))
- **commerce:** the order dialog's rules and the product row routes for the apps ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))
- **native:** print slips, invoices, shipping and product labels; Import opens the hub ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))

### Fixed

- **notifications:** native push reaches the senders boot registered ([AGL-3868](https://linear.app/aglyn/issue/AGL-3868))
- **figures:** read referring hosts back with their dots; reword the site link ([AGL-3867](https://linear.app/aglyn/issue/AGL-3867))
- **native-apple:** delete the redirect or funnel the dialog showed ([AGL-3865](https://linear.app/aglyn/issue/AGL-3865))
- **ai:** a strength gym's photos never show another sport's ball ([AGL-3864](https://linear.app/aglyn/issue/AGL-3864))
- **ai:** a plan isn't refused for color words in names or for a form named like a dataset ([AGL-3864](https://linear.app/aglyn/issue/AGL-3864))
- **ios:** read the Analytics traffic days by id ascending ([AGL-3863](https://linear.app/aglyn/issue/AGL-3863))
- **ios:** the sidebar leaves out quick actions that carry params ([AGL-3862](https://linear.app/aglyn/issue/AGL-3862))
- **native-apple:** a stored null is no value, never the text "<null>" ([AGL-3861](https://linear.app/aglyn/issue/AGL-3861))
- **native:** what the iPhone and iPad smoke test of Create with AI found ([AGL-3854](https://linear.app/aglyn/issue/AGL-3854))
- **native:** what driving orders and products on devices turned up ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))
- **native:** what the Android smoke test of Create with AI found ([AGL-3854](https://linear.app/aglyn/issue/AGL-3854))
- **ai:** open a drafted form through the record-route seam ([AGL-3854](https://linear.app/aglyn/issue/AGL-3854))
- **native:** the Kotlin label sheet reads the contract values through Contracts ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))

### Performance

- **commerce:** the order dialog's own rules stay out of the storefront's bundle ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))

### Changed

- **figures:** each reader words its own weekly summary line ([AGL-3867](https://linear.app/aglyn/issue/AGL-3867))

### Documentation

- **mobile:** tick Orders, products, stock, sales on Apple and Kotlin ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))
- **native:** create with AI in the console parity checklist ([AGL-3854](https://linear.app/aglyn/issue/AGL-3854))

<details>
<summary>Also in this release: 3 test</summary>

- **ai:** the eval's in-memory collection takes a limit, so site context reads ([AGL-3661](https://linear.app/aglyn/issue/AGL-3661))
- **tenant:** a Weglot site admits Weglot's hosts in connect-src and img-src ([AGL-3700](https://linear.app/aglyn/issue/AGL-3700))
- **commerce:** the packing slip's escaping guard reads the shared builder ([AGL-3841](https://linear.app/aglyn/issue/AGL-3841))

</details>

## v1.0.0-beta.261 — 2026-10-16

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.260...v1.0.0-beta.261)

### Added

- **ai:** pages move in more than one way; splits slide in from their sides ([AGL-3858](https://linear.app/aglyn/issue/AGL-3858))

### Fixed

- **ai:** a plan's references to nothing come out before the rules read it ([AGL-3845](https://linear.app/aglyn/issue/AGL-3845))
- **console,ai:** no site is created until its start is admitted ([AGL-3859](https://linear.app/aglyn/issue/AGL-3859), [AGL-3761](https://linear.app/aglyn/issue/AGL-3761))
- **health:** the app check sampler counts only its own six hours ([AGL-3857](https://linear.app/aglyn/issue/AGL-3857))
- **events-calendar:** a cover keeps its words; the place line names a host once ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))
- **ai:** stock photos fit their slot and are described by their own words ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))
- **ai:** a section that is the form itself keeps its undeclared form for the re-ask ([AGL-3845](https://linear.app/aglyn/issue/AGL-3845))
- **ai:** a section's undeclared creation is declared as a form or taken out ([AGL-3845](https://linear.app/aglyn/issue/AGL-3845))

<details>
<summary>Also in this release: 1 chore</summary>

- **ai:** record the verbatim British tags the photo matcher reads ([AGL-3856](https://linear.app/aglyn/issue/AGL-3856))

</details>

## v1.0.0-beta.260 — 2026-10-16

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.259...v1.0.0-beta.260)

### Added

- **console:** plan- and plugin-gated pieces say what unlocks them ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **shipping:** the Buy label button asks for a ship-from address first ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **commerce,bookings:** draft orders, reservations and paid services ask for Stripe ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **commerce:** the register says to connect Stripe instead of hiding card tenders ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **native:** components, layouts and templates sort by column and print the plan's count ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** import records into a dataset on every native platform ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** report someone else's review, in the console's words ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the licenses page lists your own purchases beside the workspace's ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668), [AGL-2331](https://linear.app/aglyn/issue/AGL-2331))
- **native:** publish a component or layout to the marketplace from its own page ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** publish a plugin, state the take rate, gate every publish ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** spec files send their bytes, choices explain themselves, take rate loads ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** a listing's preview image, screenshots and logo come from the media library ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the media chooser uploads from this device and picks what it uploaded ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** selling on the marketplace: profile, listings, payouts and sales
- **native:** the seller panel's money rules, replayed from the console's
- **native:** a publish hub lists what a site and its workspace can publish
- **native:** publish a layout, component, theme, dataset schema or email to the marketplace

### Fixed

- **ios:** the Besigner takes the whole phone screen, with a smoke test from the app ([AGL-3850](https://linear.app/aglyn/issue/AGL-3850))
- **native:** a refused refresh token signs Android out instead of crashing ([AGL-3855](https://linear.app/aglyn/issue/AGL-3855))
- **native:** the publish hub lists what was read, and spec blocks never share an identity ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the Besigner opens signed in and its exits return to the app ([AGL-3850](https://linear.app/aglyn/issue/AGL-3850))
- **console:** the apps open the Besigner through a page that signs their web view in ([AGL-3850](https://linear.app/aglyn/issue/AGL-3850))
- **native:** the dataset records, schema and record screens load on iPhone, iPad and Mac ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **health:** lower the App Check floor to 0.75 so native test runs stop paging ([AGL-2402](https://linear.app/aglyn/issue/AGL-2402))
- **native:** signing out of an SSO account returns the auth instance to the project pool ([AGL-3844](https://linear.app/aglyn/issue/AGL-3844))
- **firewall:** declare the plugin webhook bypass the console now carries ([AGL-3846](https://linear.app/aglyn/issue/AGL-3846))
- **native:** the publisher profile's logo is picked from the media library ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the marketplace's slot spec declares every screen it registers ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))

### Documentation

- **commerce:** grayed, the American spelling, in the setup-step notes ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **commerce:** the POS, orders, stays, services and labels name their setup step ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **native:** the components lists sort and count; Publish to marketplace is left ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **commerce:** help desks, inventory sync, Flexport, print on demand and loyalty accounts are live ([AGL-3847](https://linear.app/aglyn/issue/AGL-3847))

<details>
<summary>Also in this release: 5 test, 2 chore</summary>

- **commerce:** specs that draw the register or orders stub the payments hook ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **console:** the Besigner entry page adopts the app's sign-in, not a new login ([AGL-3850](https://linear.app/aglyn/issue/AGL-3850))
- **console:** the Besigner entry page adopts the app's sign-in, not a new login ([AGL-3850](https://linear.app/aglyn/issue/AGL-3850))
- **linear:** raise the issue ceiling to AGL-3853, read off Linear ([AGL-3853](https://linear.app/aglyn/issue/AGL-3853))
- **native:** the spec sweep knows the listing screen; the hub test reads queries ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **marketplace:** the native publish spec types a field's label and options ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **linear:** raise the issue ceiling to AGL-3847, read off Linear ([AGL-3847](https://linear.app/aglyn/issue/AGL-3847), [AGL-3846](https://linear.app/aglyn/issue/AGL-3846))

</details>

## v1.0.0-beta.259 — 2026-10-16

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.258...v1.0.0-beta.259)

### Added

- **ai:** set, change or remove an element's animation from Assist and the edit kind ([AGL-3838](https://linear.app/aglyn/issue/AGL-3838))
- **ai:** pages and templates the AI builds move in a look-aware motion set in code ([AGL-3838](https://linear.app/aglyn/issue/AGL-3838))
- **aglyn:** entrance motion pass for code-built pages; new home and starters move ([AGL-3838](https://linear.app/aglyn/issue/AGL-3838))

### Fixed

- **console:** one sign-in mints one console session and one device row ([AGL-3843](https://linear.app/aglyn/issue/AGL-3843))
- **console:** "Use a different account" in the native sign-in sheet ends the session ([AGL-3842](https://linear.app/aglyn/issue/AGL-3842))
- **ai:** a partly failed build job's alert names the kind once ([AGL-3683](https://linear.app/aglyn/issue/AGL-3683))
- **theme:** every theme's links and buttons read the console's link and button slots ([AGL-3840](https://linear.app/aglyn/issue/AGL-3840))
- **email:** bare addresses in email text link in the theme's link color ([AGL-3839](https://linear.app/aglyn/issue/AGL-3839))
- **aglyn:** the first section's heading and largest picture stay still for LCP ([AGL-3838](https://linear.app/aglyn/issue/AGL-3838), [AGL-3581](https://linear.app/aglyn/issue/AGL-3581))
- **ai:** an over-length plan search title or description is clipped at a word ([AGL-3837](https://linear.app/aglyn/issue/AGL-3837), [AGL-3813](https://linear.app/aglyn/issue/AGL-3813), [AGL-3828](https://linear.app/aglyn/issue/AGL-3828))

### Documentation

- pages that already move, and Assist animation edits ([AGL-3838](https://linear.app/aglyn/issue/AGL-3838))

<details>
<summary>Also in this release: 1 test, 1 chore</summary>

- **ai:** the live edit spec asks for two entrance animations ([AGL-3838](https://linear.app/aglyn/issue/AGL-3838), [AGL-3844](https://linear.app/aglyn/issue/AGL-3844), [AGL-3837](https://linear.app/aglyn/issue/AGL-3837))
- **native:** regenerate the email HTML cases for the theme link color ([AGL-3840](https://linear.app/aglyn/issue/AGL-3840))

</details>

## v1.0.0-beta.258 — 2026-10-15

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.257...v1.0.0-beta.258)

### Added

- **console:** new-site staff notification links the live site ([AGL-3829](https://linear.app/aglyn/issue/AGL-3829))

### Fixed

- **console:** run the native sign-in hand-off on the auth origin ([AGL-3836](https://linear.app/aglyn/issue/AGL-3836))
- **native:** let the APNs device token reach the app on iOS ([AGL-3835](https://linear.app/aglyn/issue/AGL-3835))
- **ai:** insights name every published page and read an unsubmitted form as 0 ([AGL-3834](https://linear.app/aglyn/issue/AGL-3834))
- **ai:** an Assist follow-up waits for its canvas and never re-offers the open draft ([AGL-3833](https://linear.app/aglyn/issue/AGL-3833))
- **ai:** a menu item is built without a page that failed, not skipped ([AGL-3832](https://linear.app/aglyn/issue/AGL-3832))
- **ai:** a build's page planned from a copy is generated from its plan ([AGL-3832](https://linear.app/aglyn/issue/AGL-3832), [AGL-3596](https://linear.app/aglyn/issue/AGL-3596))
- **ai:** a caterer's hero gets a catering photo, never a mislabeled starter ([AGL-3831](https://linear.app/aglyn/issue/AGL-3831))
- **ai:** placeholder tokens never reach a page ([AGL-3827](https://linear.app/aglyn/issue/AGL-3827), [AGL-3056](https://linear.app/aglyn/issue/AGL-3056))
- **firewall:** declare the native app API bypass on the console ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **ai:** a cut never ends on a dangling word in Spanish and other languages ([AGL-3828](https://linear.app/aglyn/issue/AGL-3828))
- **media:** read site icons and lazy regeneration through the Storage listener budget ([AGL-3826](https://linear.app/aglyn/issue/AGL-3826), [AGL-3795](https://linear.app/aglyn/issue/AGL-3795))

### Performance

- **ai:** production AI jobs cache prompts for an hour ([AGL-3830](https://linear.app/aglyn/issue/AGL-3830))

### Documentation

- **ai:** a shared tool prefix per job is rejected, with the measurements ([AGL-3830](https://linear.app/aglyn/issue/AGL-3830))
- **ai:** a placeholder never reaches a page ([AGL-3827](https://linear.app/aglyn/issue/AGL-3827))

<details>
<summary>Also in this release: 1 test, 1 chore</summary>

- **ai:** record the fixture's verbatim Pixabay "centre" in the baseline ([AGL-3831](https://linear.app/aglyn/issue/AGL-3831))
- **ai:** the eval reads template placeholders in copy and grades them ([AGL-3827](https://linear.app/aglyn/issue/AGL-3827))

</details>

## v1.0.0-beta.257 — 2026-10-15

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.256...v1.0.0-beta.257)

### Added

- **forms:** date and time pickers as form fields, from MUI X ([AGL-3825](https://linear.app/aglyn/issue/AGL-3825))
- **help-desks:** buyers, orders and form tickets in the merchant's own help desk ([AGL-3824](https://linear.app/aglyn/issue/AGL-3824))

### Fixed

- **mui:** one shared form-controls import, so the pickers never read it half-loaded ([AGL-3825](https://linear.app/aglyn/issue/AGL-3825))

### Performance

- **forms:** load the date and time pickers from inside form-controls ([AGL-3825](https://linear.app/aglyn/issue/AGL-3825))

<details>
<summary>Also in this release: 2 chore</summary>

- **help-desks:** package versions follow main to 1.0.0-beta.256 ([AGL-3824](https://linear.app/aglyn/issue/AGL-3824))
- **help-desks:** regenerate the native contracts for the new plugin row ([AGL-3824](https://linear.app/aglyn/issue/AGL-3824))

</details>

## v1.0.0-beta.256 — 2026-10-15

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.255...v1.0.0-beta.256)

### Added

- **calculator:** a Calculator reads the site's own form fields placed inside it ([AGL-3825](https://linear.app/aglyn/issue/AGL-3825))
- **native:** passkeys on for release builds now aglyn.com serves the association files ([AGL-3817](https://linear.app/aglyn/issue/AGL-3817))
- **native,console:** console-minted App Check for the Windows app's session ([AGL-3816](https://linear.app/aglyn/issue/AGL-3816))
- **native:** workspace invitations answered in the apps, and their link opens them ([AGL-3819](https://linear.app/aglyn/issue/AGL-3819), [AGL-851](https://linear.app/aglyn/issue/AGL-851))
- **native,console:** single sign-on and the desktop through a console hand-off ([AGL-3816](https://linear.app/aglyn/issue/AGL-3816), [AGL-1415](https://linear.app/aglyn/issue/AGL-1415))
- **tools:** upload Android bundles to Play testing tracks without a key file ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **fulfillment-networks:** add flexport as a fulfillment network ([AGL-3822](https://linear.app/aglyn/issue/AGL-3822))
- **inventory-sync:** add Ordoro, synced on the merchant's own API key ([AGL-3823](https://linear.app/aglyn/issue/AGL-3823))

### Fixed

- **tools:** allow the release script's Play package name in the self-host ratchet ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **console:** sign-up, verify, reset and recovery links open the apps ([AGL-3817](https://linear.app/aglyn/issue/AGL-3817), [AGL-3819](https://linear.app/aglyn/issue/AGL-3819))
- **fulfillment-networks:** flexport paths without a leading slash ([AGL-3822](https://linear.app/aglyn/issue/AGL-3822))
- **console:** stop the bell inbox re-reading its last page ([AGL-3821](https://linear.app/aglyn/issue/AGL-3821))

### Documentation

- **fulfillment-networks:** flexport section, rolling out ([AGL-3822](https://linear.app/aglyn/issue/AGL-3822))

## v1.0.0-beta.255 — 2026-10-15

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.254...v1.0.0-beta.255)

### Added

- **native:** continue with Google and Sign in with Apple, at sign-in and sign-up ([AGL-3816](https://linear.app/aglyn/issue/AGL-3816))
- **native:** sign-up, email verification and account recovery in the apps ([AGL-3819](https://linear.app/aglyn/issue/AGL-3819))
- **web:** aglyn.com and app.aglyn.com serve apple-app-site-association and assetlinks.json from env, for the native apps' passkeys and links ([AGL-3817](https://linear.app/aglyn/issue/AGL-3817))
- **native:** android App Check through Play Integrity, Kotlin token plumbing ([AGL-3818](https://linear.app/aglyn/issue/AGL-3818))
- **native:** apple apps send Firebase App Check tokens via App Attest and DeviceCheck ([AGL-3818](https://linear.app/aglyn/issue/AGL-3818))
- **tools:** seed the store-review workspace with the Juniper Street data ([AGL-3812](https://linear.app/aglyn/issue/AGL-3812))
- **native:** workspace settings pick logo and zone, open a notice, manage installs ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** workspace settings say and do what the console's sections do ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** screen actions can follow a console path; the SSO rehearsal rows are shared ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** take a typed card in Aglyn POS on iPhone, iPad and Android ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** a typed card at the register, Stripe's card form behind one seam ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** the import wizard reads files and finishes the way the console's does ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the export dialog is the console's: presets, field order, scope and BOM ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** sign in with a passkey, as the console's sign-in page offers ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** publish the site as a template on iPhone, iPad and Mac ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** a plugin's own import steps: the gift card total and the list permission ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** publish the site as a template from Backup & restore, with its agreement ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** connect Google to the account on Android and Windows ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** set up a passkey from the account screen on iPhone, iPad, Mac and Android ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** import a site package step by step, with item diffs and merge choices ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** populate-from picker, Show more on site lists, Staff row ticked ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **android:** lookup field, Show more, one Firebase app per pool ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **ios:** lookup field and Show more for Firestore lists ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** sign in as a customer or owner, abuse session logs ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **android:** support sessions, sign in as a customer with a way back ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **ios:** support sessions, sign in as a customer with a way back ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** show what usage past the plan costs this month, as the console does ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff list columns, header sorts and plugin column zone ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** print a receipt on the device's print sheet, Apple and Android ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** import records from the data hub, step by step, as the console does ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** delivery-app orders at the register, a native delivery-apps plugin ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651))
- **native:** keep the Android screen on for the kiosk and the customer display ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** staff session logs, armed maintenance runs and FULL banner ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** session log, armed runs, email HTML and a country picker in spec screens ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** list every plugin's records in the data hub and export them ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff site move searches the destination workspace by name ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff org usage table shows cost, change, bands and recorded meters ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff AI cards read their routes, give credits back, and show AI requests ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** spec actions put the attempt key in a body; report when reads per row ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** export, import and undo workspace packages from the data hub ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff Assist signal board reads its route ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff email test asks for each variable the template takes ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff audit log, fleet margin, entitlements and gateway ledger ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** change the plan with the proration preview and over-limit warning ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** connect Google to the account on iPhone, iPad and Mac ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff churn, do-not-contact and disabled files read their routes ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** disconnect a sign-in method from the account screen ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff sales tax return and filing setup ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** the organization's storage band on Usage ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** back up, export and restore a site from the app ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff person page on the console's cards ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** save the workspace's business profile defaults as the console does ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** a site overrides a plugin's workspace settings from the app ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff site page cards, late loads and server counts ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** allotments choose their models, and a collaborator shows their site credits ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the forum filters its threads by category and offers the route's categories ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff org override editor, erasure request, media library and activity ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff workspace, site and people lists filter like the console ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff flags, support queue, coupons, alerts and audit log read their routes ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff revenue rebuilt, margin rows, list flatten ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** assign the sign-in, sign-up and recovery pages from the Accounts page ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff system emails catalog, suppressions, import and message ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff abuse reports and DMCA counter-notices, load filters ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff Locks rebuilt, body $if and $afterHours ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** plan meters on Usage and per site, and workspace-wide traffic ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** staff plugin reviews and signing, marketplace reports, overview ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff org actions, lock reasons, subscription cancel, person email ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** staff health probes, drift, erasure queue, stuck claims, maintenance ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** spec actions send headers; staff enterprise billing; staff gap audit ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))

### Fixed

- **native:** regenerate the staff screens for the soft-bounce suppression reason ([AGL-3820](https://linear.app/aglyn/issue/AGL-3820))
- **native:** stripe terminal ships only in aglyn pos, and the guard holds it there ([AGL-3815](https://linear.app/aglyn/issue/AGL-3815))
- **tools:** pin the review store's product photos and leave existing docs' list fields ([AGL-3812](https://linear.app/aglyn/issue/AGL-3812))
- **email:** name the soft-bounce staff label without the brand ([AGL-3814](https://linear.app/aglyn/issue/AGL-3814))
- **email:** any bounce on Aglyn's own mail suppresses the address ([AGL-3814](https://linear.app/aglyn/issue/AGL-3814))
- **ai:** a clipped search title takes off a dangling "and" or comma ([AGL-3813](https://linear.app/aglyn/issue/AGL-3813))
- **console:** close-account refusal names the operator's legal contact ([AGL-3802](https://linear.app/aglyn/issue/AGL-3802))
- **attentive:** subscribe only people Attentive does not know yet, by email alone ([AGL-3810](https://linear.app/aglyn/issue/AGL-3810))
- **native:** release archives may register the build Mac with the team ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **ai:** settle a section that places its page's layout in code ([AGL-3807](https://linear.app/aglyn/issue/AGL-3807), [AGL-3750](https://linear.app/aglyn/issue/AGL-3750))
- **docs:** the Codat accounting guide is held to the release_accounting rules ([AGL-3776](https://linear.app/aglyn/issue/AGL-3776))
- **firewall:** declare the store review + app verification bypass rules ([AGL-3804](https://linear.app/aglyn/issue/AGL-3804))
- **native:** a failed release build releases its build lock ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **ai:** describe a placed stock photo by what it shows, not the model's caption ([AGL-3805](https://linear.app/aglyn/issue/AGL-3805))
- **ai:** send a get-in-touch call to action to the form's own page, not Home ([AGL-3805](https://linear.app/aglyn/issue/AGL-3805))
- **native:** release builds sign for distribution, which needs no registered device ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **native:** release archives skip coverage mapping, as CI's builds do ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **console:** closing an account no longer reports success when an address is shared ([AGL-3802](https://linear.app/aglyn/issue/AGL-3802))
- **native:** a sign-in is never undone by the stored session read at launch ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **console:** the staff audit log reads adminAudit by path, so the stamp sweep holds ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667), [AGL-3321](https://linear.app/aglyn/issue/AGL-3321))
- **native:** one comparison rule in spec conditions, and optionsFrom `filter` everywhere ([AGL-3653](https://linear.app/aglyn/issue/AGL-3653))
- **native:** the workspace business profile save uses the shared owner-write rule ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the workspace settings tests run on the main actor, where core specs live ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the custom token sign-in test compares the paths it asked, not their queries ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the marketplace spec's real file lives in the iOS resources, like the others ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** billing keeps one plans list and one Manage block after the landing merge ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** a preview check is never a file, so the merged outcome switches stay exhaustive ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** drop the headers test the merge duplicated ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** sales tax copy reads the configured brand name ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** data exports are downloaded and saved, not "emailed" ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** now keeps quarter and ms beside the new month keys ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))

### Performance

- **ai:** a plan caches its own conversation; prompt cache audit round 3 ([AGL-3809](https://linear.app/aglyn/issue/AGL-3809))

### Changed

- **console:** one module for the impersonation reason bounds ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))

### Documentation

- **native:** app Check providers per platform, what is done and what is owed ([AGL-3818](https://linear.app/aglyn/issue/AGL-3818))
- **native:** how a mac new to the team gets registered for release archives ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **attentive:** the guide says Aglyn subscribes only people Attentive lacks ([AGL-3810](https://linear.app/aglyn/issue/AGL-3810))
- **commerce:** list the labels, own-accounts and Attentive guides as Rolling out ([AGL-3808](https://linear.app/aglyn/issue/AGL-3808))
- how to close your Aglyn account and what happens to your data ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **native:** the new field kinds and the plugin pages; tick Workspace settings ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the typed card, and the POS row without its open item ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** the export dialog, upload field, hooks, gates and passkey sign-in ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** tick the AI, Site admin and Billing and usage rows ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** tick the POS row on both platforms, the typed card noted ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** tick Support on both platforms ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))

<details>
<summary>Also in this release: 2 test, 3 chore</summary>

- **native:** seed the emulator as Juniper Street Co., a real small bakery ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **linear:** raise the issue-id ceiling to AGL-3807, read off Linear ([AGL-3807](https://linear.app/aglyn/issue/AGL-3807), [AGL-3799](https://linear.app/aglyn/issue/AGL-3799), [AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **ai:** the live site-plan eval plans a Free blog and reports its pages ([AGL-3798](https://linear.app/aglyn/issue/AGL-3798))
- **tools:** hold Stripe's card-entry SDK to Aglyn POS in check-mobile-isolation ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651))
- **native:** the commerce registration test declares the gift card import step ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))

</details>

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.254 — 2026-10-15

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.253...v1.0.0-beta.254)

### Added

- **native:** a file staff disabled says so in the library and on its page ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** release script archives, uploads and bundles the apps ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **native:** android upload signing, increasing versionCode and production defaults ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **native:** apple release signing, entitlements and the production config ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **ai:** a Free blog's guided start writes one first post ([AGL-3798](https://linear.app/aglyn/issue/AGL-3798))
- **native:** setup gets an integrations section for the plugins running on the site
- **native:** a film is read on the device before it is uploaded, so it has a poster
- **native:** a product's images, digital files and members videos ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** the AI plugin proposes SEO fixes under the SEO check

### Fixed

- **signup:** an unacknowledged Firestore write no longer holds a sign-up for a minute ([AGL-3806](https://linear.app/aglyn/issue/AGL-3806))
- **auth:** follow a peer tab's sign-in into the user's pool ([AGL-3803](https://linear.app/aglyn/issue/AGL-3803))
- **native:** the release script prints each output's size ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **native:** release lint passes, fragment 1.3+ for the activity result api ([AGL-3800](https://linear.app/aglyn/issue/AGL-3800))
- **seo:** render the Local business card's hours picker ([AGL-3801](https://linear.app/aglyn/issue/AGL-3801))
- **commerce:** the console walk-in refuses a stay the quote refuses ([AGL-3794](https://linear.app/aglyn/issue/AGL-3794))
- **native:** the image editor keeps its save buttons in view and has a UI test

### Changed

- **commerce:** paid media's words and rules in the model, for the apps to replay ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))

<details>
<summary>Also in this release: 1 chore, 1 ci, 1 legal</summary>

- **legal:** declare www.apple.com as a plist DTD identifier, never fetched (AGL-3800)
- **native:** both apps share one package build; self-host skips script-only PRs ([AGL-3783](https://linear.app/aglyn/issue/AGL-3783))
- **linear:** raise the issue ceiling to AGL-3799, read off Linear ([AGL-3799](https://linear.app/aglyn/issue/AGL-3799), [AGL-3798](https://linear.app/aglyn/issue/AGL-3798))

</details>

## v1.0.0-beta.253 — 2026-10-14

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.252...v1.0.0-beta.253)

### Added

- **legal:** v16, Privacy discloses ad conversion reporting on merchant sites ([AGL-3799](https://linear.app/aglyn/issue/AGL-3799))
- **native:** start from a template and save as a template ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** an email block starts as a header or footer ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** a site's theme shows what it changed, with a reset for each ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** a component's icon is picked from the icon set and saved with its details ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **ai:** templates and theme ask medium effort, text low, from the golden A/B ([AGL-3781](https://linear.app/aglyn/issue/AGL-3781))
- **ai:** a paid site plan asks medium effort, layout-language pages and frames low ([AGL-3781](https://linear.app/aglyn/issue/AGL-3781))

### Fixed

- **media:** a storage read stops tripping MaxListenersExceededWarning ([AGL-3795](https://linear.app/aglyn/issue/AGL-3795))
- **forms:** finish the manager notification before answering a submission ([AGL-3793](https://linear.app/aglyn/issue/AGL-3793))
- **tenant:** a site's 404 names itself in the tab in the site's language ([AGL-3791](https://linear.app/aglyn/issue/AGL-3791), [AGL-3771](https://linear.app/aglyn/issue/AGL-3771))
- **ai:** a non-English site's search listing sets no English around its answers ([AGL-3792](https://linear.app/aglyn/issue/AGL-3792))
- **ai:** the AI lib's other word matches read letters in any script ([AGL-3791](https://linear.app/aglyn/issue/AGL-3791))
- **ai:** a word in any script stays whole, so a Spanish heading keeps its last "a" ([AGL-3791](https://linear.app/aglyn/issue/AGL-3791))
- **ai:** a slow batch keeps its answers, arm recordings get short names, live runs print ([AGL-3781](https://linear.app/aglyn/issue/AGL-3781))

<details>
<summary>Also in this release: 1 test</summary>

- **ci:** nx-ci-setup retries the root npm ci on transient failures (AGL-3797)
- **ci:** manifests cached in the scratch path; xcodebuild says what it rebuilt (AGL-3783)
- **marketing:** the conversions card spec loads its module once, outside any test's budget

</details>

## v1.0.0-beta.252 — 2026-10-14

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.251...v1.0.0-beta.252)

### Added

- **native:** rewards sentence, home glance, batch label total, row filters ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** the shipping page says what its zones and rates cover ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** turn a product's related products on and off ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** site setup hosts the business profile and SEO zones, filled by the AI plugin ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** edit an image: rotate, flip, crop and shrink, then replace it or save a copy ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** uploaded filters and the cover film's poster ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **legal:** v15 — Privacy and Subprocessors: hashed email matching for Aglyn's own ads ([AGL-3780](https://linear.app/aglyn/issue/AGL-3780))
- **ai:** serve the fast tier from Haiku 5.5, retire Haiku 4.5 and Sonnet 5 ([AGL-3781](https://linear.app/aglyn/issue/AGL-3781))
- **ai:** bill the fast tier at the platform's 1.5x markup ([AGL-3781](https://linear.app/aglyn/issue/AGL-3781))
- **native:** pick setup and cover images on apple
- **native:** a product's details: address, supplier, tags, tax, billing, search ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** book a walk-in at the front desk, priced and checked like the console's ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** a send and a gift card issue say only what happened ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** buy labels for several ticked orders, from the orders list ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** mark several orders fulfilled from the orders list ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** pickup hours and delivery windows are picked from a week, not typed ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** lists fed by a Firestore query load more, as the console's lists page ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** export the store's records from specs, with an export action ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** sales wait for commerce analytics and grow to 30 days on Apple ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** rewards natively, program to adjustments, with a key per press ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** an order's services: pickup, returns, labels, couriers and more ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** store settings, taxes, payments, shipping and the Store hub ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** recovery and alerts, pickup and delivery queue, reservations ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** discounts, coupons and gift cards, with server sums and plan gates ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** stock movements and catalog organization screens ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** returns and RMA screens, with the grammar they need ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** spec writes can drop the site's cached pages as the console does ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** spec grammar for typed money, gathered rows and plain amounts ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** pick setup and cover images from the library
- **native:** site settings, date windows and chained prompts for console parity ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** media library filters on apple and android
- **native:** the Business profile setup section on Apple and Android ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** shipping screens; fields listed from data, row replace, fresh ids ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** the SEO check and target keywords on Apple and Android ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** accounting screens ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** review platforms card; forms no longer send hidden fields ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** opening hours are picked by clicking on Apple and Android ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** live chat, Zapier and ad conversions cards ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** couriers card ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** inventory and ERP card ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** delivery apps card ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** email, sales channel, marketplace and print-on-demand cards ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **console:** settings pages take couriers, review platforms and AI links ([AGL-3713](https://linear.app/aglyn/issue/AGL-3713), [AGL-3736](https://linear.app/aglyn/issue/AGL-3736))
- **console:** rail section groups; Products > Settings splits into pages ([AGL-3713](https://linear.app/aglyn/issue/AGL-3713))

### Fixed

- **e2e:** the signup canary presses Confirm when shown, so it works on either verify page ([AGL-3786](https://linear.app/aglyn/issue/AGL-3786))
- **marketplace:** a plugin's page uninstall runs the impact check ([AGL-3790](https://linear.app/aglyn/issue/AGL-3790))
- **auth:** verify-email link waits for a press before redeeming ([AGL-3786](https://linear.app/aglyn/issue/AGL-3786))
- **billing:** every staff refund carries a Stripe reason derived from ours ([AGL-3786](https://linear.app/aglyn/issue/AGL-3786))
- **billing:** a fraud refund tells Stripe it is fraudulent ([AGL-3786](https://linear.app/aglyn/issue/AGL-3786))
- **console:** the Sites list asks the server before believing a site is gone ([AGL-3789](https://linear.app/aglyn/issue/AGL-3789), [AGL-3788](https://linear.app/aglyn/issue/AGL-3788), [AGL-1190](https://linear.app/aglyn/issue/AGL-1190))
- **console:** the tab handoff never takes a live Firestore lease ([AGL-3788](https://linear.app/aglyn/issue/AGL-3788))
- **notifications:** link notification emails sent from the site app ([AGL-3787](https://linear.app/aglyn/issue/AGL-3787))
- **forms:** use the american spelling in the submission email docs ([AGL-3785](https://linear.app/aglyn/issue/AGL-3785))
- **forms:** form submission email lists the submitted answers ([AGL-3785](https://linear.app/aglyn/issue/AGL-3785))
- **console:** the workspace switcher shows every workspace's logo ([AGL-3784](https://linear.app/aglyn/issue/AGL-3784))
- **console:** compact card actions stay top right; tile cards share a row's height ([AGL-3784](https://linear.app/aglyn/issue/AGL-3784))
- **native:** put back the commerce tabs the main merge dropped from the config ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **console:** settings sections as literals; page specs stub the zone plugins ([AGL-3713](https://linear.app/aglyn/issue/AGL-3713))
- **native:** accounting declares the deep links its paths register ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **email,marketing:** a live list's members are mailed on their contact's opt-in

### Performance

- **ai-eval:** replay, the hour cache and batches in every live run, effort arms ([AGL-3781](https://linear.app/aglyn/issue/AGL-3781))
- **ai-eval:** send the golden eval round as batches, briefs side by side ([AGL-3781](https://linear.app/aglyn/issue/AGL-3781))

### Changed

- **native:** one weekly hours model and one picker for every screen ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **tenant:** name the shared consent reader for what it reads, not a plugin

### Documentation

- **native:** parity rows follow the re-check of the content area ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** tick the commerce integration cards row on both platforms ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** spec grammar path projection, option filter, path comparison ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **email:** live audiences show the contact's opt-in and refresh hourly
- **commerce:** name each store settings page in place of Products > Settings ([AGL-3713](https://linear.app/aglyn/issue/AGL-3713))

<details>
<summary>Also in this release: 3 test, 1 chore, 4 ci</summary>

- **native:** only main saves the swift build cache; a PR restores it ([AGL-3783](https://linear.app/aglyn/issue/AGL-3783))
- **native:** judge a PR by its test merge, not a lagging base sha ([AGL-3783](https://linear.app/aglyn/issue/AGL-3783))
- **native:** key the swift build cache by runner image and cache manifests ([AGL-3783](https://linear.app/aglyn/issue/AGL-3783))
- **native:** refresh main's swift build cache after auto-merges too ([AGL-3783](https://linear.app/aglyn/issue/AGL-3783))
- **native:** drop the weekly hours module with the picker
- **native:** the commerce and rewards screen guards live in their plugins ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** plugin registration tests follow the screens each plugin now declares ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **tenant:** the retained-refusal reader the coverage spec tracks moved to consent-by-address

</details>

3 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.251 — 2026-10-14

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.250...v1.0.0-beta.251)

### Added

- **ai:** warn when a page is already being built on the site ([AGL-3765](https://linear.app/aglyn/issue/AGL-3765))
- **native:** logic rows, formula builder, test run and reference health on Android ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** buy and change plan add-ons in the app, as the console does ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** returns at the register on Apple and Kotlin ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** dataset image, page, page address and rating fields on Android ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668), [AGL-3763](https://linear.app/aglyn/issue/AGL-3763))
- **commerce:** pair displays and kiosks from the POS devices card ([AGL-3712](https://linear.app/aglyn/issue/AGL-3712))
- **native:** commerce settings and service cards from specs ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** store credit, room charge, QR payment and receipt printing at the register ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** self-service kiosk and its pay-at-counter queue ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** the customer display on the tablet, set up from sign-in; pair displays and kiosks and drive the display from the register ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651))
- **native:** product variants, part refunds and receipts by text on Apple ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** offline cash sales at the register on Apple and Kotlin ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** last-receipt reprint, and customer lookup and attach, at the register on Apple and Kotlin ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651), [AGL-3652](https://linear.app/aglyn/issue/AGL-3652))
- **native:** spec action request headers, with a per-press key ([AGL-3667](https://linear.app/aglyn/issue/AGL-3667))
- **native:** a collaborator opens to their AI access and allotment ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** delete a workspace through the same leave flow as the console ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the account screen shows how you sign in and if the email is confirmed; account sign-in operations and profile fields ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** cancel the plan through the console's retention flow ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** usage history and the budget's spend on the Usage screen ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the theme editor's Style components choices on Apple and Android ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the Marketplace and Logic plugins on iPhone, iPad and Mac ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** dataset fields take image, page, page address and rating types on Apple; Apple datasets, records and schema screens ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **admin:** nightly hashed-email ad audience sync to Meta, Google and LinkedIn, off until `release_ad_audience_sync` ([AGL-3780](https://linear.app/aglyn/issue/AGL-3780))

### Fixed

- **ai:** a failed sibling-form or band-date lookup leaves the form refusal as it was ([AGL-3765](https://linear.app/aglyn/issue/AGL-3765))
- **ai:** a form unit refused at the band places a sibling build's form, or fails as ours ([AGL-3765](https://linear.app/aglyn/issue/AGL-3765))
- **ai:** a business the table names leads a site's photo search, ahead of its photo words ([AGL-3779](https://linear.app/aglyn/issue/AGL-3779), [AGL-3769](https://linear.app/aglyn/issue/AGL-3769))
- **ai:** a site start in another language always ends up with English photo words ([AGL-3779](https://linear.app/aglyn/issue/AGL-3779), [AGL-3771](https://linear.app/aglyn/issue/AGL-3771))
- **native:** the issue report asks the console's per-kind questions ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **mui:** size images by their own % width; Grid cell fills a lone last row ([AGL-3715](https://linear.app/aglyn/issue/AGL-3715))
- **console:** plugin cards get their own Integrations rail section ([AGL-3711](https://linear.app/aglyn/issue/AGL-3711))
- **renderer:** release held server HTML when the scheme changes ([AGL-3772](https://linear.app/aglyn/issue/AGL-3772), [AGL-3581](https://linear.app/aglyn/issue/AGL-3581))
- **native:** create a site with the starter website ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** an audio upload asks for its rights confirmation on Apple and Android ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the plugin host keeps one maxScopeHosts, the contracts' ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **commerce:** route cart orders to their dropship suppliers ([AGL-3773](https://linear.app/aglyn/issue/AGL-3773))
- **commerce:** switch a discount on or off from the Discounts card ([AGL-3774](https://linear.app/aglyn/issue/AGL-3774))
- **marketing-platforms:** offer the Tag field only where the tag is sent ([AGL-3775](https://linear.app/aglyn/issue/AGL-3775))
- **accounting:** a Codat connection's help opens its own guide ([AGL-3776](https://linear.app/aglyn/issue/AGL-3776))
- **shipping:** keep carrier accounts and labels out of the listed docs ([AGL-3777](https://linear.app/aglyn/issue/AGL-3777))
- **docs:** anchored help tooltips quote their own section ([AGL-3778](https://linear.app/aglyn/issue/AGL-3778))
- **admin:** name the audience sync's Auth page reader listUserPage ([AGL-3780](https://linear.app/aglyn/issue/AGL-3780))

<details>
<summary>Also in this release: ci, docs, tests and chores</summary>

- **linear:** raise the issue-id ceiling to AGL-3782 ([AGL-3780](https://linear.app/aglyn/issue/AGL-3780))
- **ci:** build Swift tests once, cache from main, macOS only for Swift changes ([AGL-3783](https://linear.app/aglyn/issue/AGL-3783))
- **docs:** commerce setup guides for discounts, coupons, product reviews and dropship suppliers ([AGL-3714](https://linear.app/aglyn/issue/AGL-3714))
- **docs:** the register's tenders and receipt printing ([AGL-3651](https://linear.app/aglyn/issue/AGL-3651))
- **test:** the native AI access spec lives with the AI plugin; tooltip excerpts are data to the revenue guard; change-password spec awaits hoisted ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671), [AGL-3778](https://linear.app/aglyn/issue/AGL-3778))
- **chore:** untrack the data plugin's Package.resolved ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **env-isolation:** report only by owner decision, behind ENV_ISOLATION_ENFORCED ([AGL-2401](https://linear.app/aglyn/issue/AGL-2401))
- **console:** setup specs mock the zone's has-widgets hook ([AGL-3711](https://linear.app/aglyn/issue/AGL-3711))
- **ai:** re-record the page axe fixture for the Grid sx change ([AGL-3715](https://linear.app/aglyn/issue/AGL-3715))
- **native:** registration tests for commerce.settings ([AGL-3652](https://linear.app/aglyn/issue/AGL-3652))

</details>

2 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.250 — 2026-10-14

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.249...v1.0.0-beta.250)

### Added

- **billing:** automatic security hold when stripe flags a workspace's own payment ([AGL-3767](https://linear.app/aglyn/issue/AGL-3767), [AGL-1954](https://linear.app/aglyn/issue/AGL-1954))

### Fixed

- **tenant:** a site's 404 and error screen speak its language ([AGL-3771](https://linear.app/aglyn/issue/AGL-3771))
- **ai:** a page's last answer drops an empty section instead of the page ([AGL-3771](https://linear.app/aglyn/issue/AGL-3771))
- **ai:** a site in another language with no photo words searches by its kind ([AGL-3771](https://linear.app/aglyn/issue/AGL-3771))
- **ai:** a site start lists the workspace datasets its plan reuses ([AGL-3771](https://linear.app/aglyn/issue/AGL-3771), [AGL-3747](https://linear.app/aglyn/issue/AGL-3747))
- **json-editor:** the Raw JSON warning is a dismissible banner, never under Monaco ([AGL-3770](https://linear.app/aglyn/issue/AGL-3770))

<details>
<summary>Also in this release: 1 chore</summary>

- **release:** v1.0.0-beta.250 ([AGL-2089](https://linear.app/aglyn/issue/AGL-2089))

</details>

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.249 — 2026-10-13

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.248...v1.0.0-beta.249)

### Added

- **logic:** a function parameter's choices as rows, not "value: Label" text ([AGL-3768](https://linear.app/aglyn/issue/AGL-3768))

### Fixed

- **theme:** a recolored accent's tint follows its new main (AGL-3764) (#1455) ([AGL-3764](https://linear.app/aglyn/issue/AGL-3764))
- **ai:** a site's photo words are read subject first, so its hero is of its business ([AGL-3769](https://linear.app/aglyn/issue/AGL-3769), [AGL-3760](https://linear.app/aglyn/issue/AGL-3760))

### Documentation

- **legal:** describe Cloud Logging error reports by category, not by field ([AGL-3732](https://linear.app/aglyn/issue/AGL-3732))

<details>
<summary>Also in this release: 1 chore</summary>

- **env-isolation:** exempt live Stripe in console/tenant dev+preview by owner decision ([AGL-2401](https://linear.app/aglyn/issue/AGL-2401))

</details>

## v1.0.0-beta.248 — 2026-10-13

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.247...v1.0.0-beta.248)

### Fixed

- **billing:** a voided invoice no longer also raises "delivery changed nothing"
- **billing:** a voided never-paid sign-up invoice is a named skip, not an inert delivery
- **email:** a sending subdomain of the operator domain is not a health blocker

## v1.0.0-beta.247 — 2026-10-13

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.246...v1.0.0-beta.247)

### Added

- **ai:** the form job builds fields from mui's separate form elements
- **email:** name a separate mui form element by the label beside it
- **forms:** seeds, templates and presets build fields from mui's form elements
- **tools:** backfill every saved form field to mui's separate form elements
- **aglyn:** rebuild an all-in-one form field from mui's separate form elements
- **mui,forms:** every piece of a form field is its own Besigner element

### Fixed

- **mui:** an input's outline is on its own box, so Border and Corner fields reach it

### Changed

- **forms:** keep the form field converter in the forms plugin, not core

<details>
<summary>Also in this release: 1 chore</summary>

- **ai:** regenerate the palette now the form field has no presets

</details>

## v1.0.0-beta.246 — 2026-10-13

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.245...v1.0.0-beta.246)

### Added

- **ai:** the guided site start sets the site language from the brief ([AGL-3750](https://linear.app/aglyn/issue/AGL-3750))
- **commerce,ai:** builds and Assist set up store shipping, pickup, delivery and tax ([AGL-3749](https://linear.app/aglyn/issue/AGL-3749))
- **ai:** site settings op for builds and Assist ([AGL-3748](https://linear.app/aglyn/issue/AGL-3748))
- **crm,ai:** builds and Assist set up CRM pipelines, stages and custom fields ([AGL-3746](https://linear.app/aglyn/issue/AGL-3746), [AGL-3743](https://linear.app/aglyn/issue/AGL-3743))
- **redirects,ai:** builds and Assist create, change and remove redirects ([AGL-3745](https://linear.app/aglyn/issue/AGL-3745))
- **events-calendar,ai:** builds and Assist draft events and place the Event List ([AGL-3743](https://linear.app/aglyn/issue/AGL-3743))

### Fixed

- **ai:** a plan's header, navigation or footer section comes off the page ([AGL-3750](https://linear.app/aglyn/issue/AGL-3750))
- **commerce:** the store-setup role refusal names no brand ([AGL-3749](https://linear.app/aglyn/issue/AGL-3749))
- **commerce,ai:** only an admin or editor may change store setup through AI ([AGL-3749](https://linear.app/aglyn/issue/AGL-3749))
- **ai:** the settings step's cache-drop reason names no brand ([AGL-3748](https://linear.app/aglyn/issue/AGL-3748))
- **ai:** a guided blog's header link comes back when Try again posts it ([AGL-3747](https://linear.app/aglyn/issue/AGL-3747), [AGL-3660](https://linear.app/aglyn/issue/AGL-3660), [AGL-3739](https://linear.app/aglyn/issue/AGL-3739))
- **ai:** list cards link record pages the site already serves ([AGL-3747](https://linear.app/aglyn/issue/AGL-3747), [AGL-3727](https://linear.app/aglyn/issue/AGL-3727))
- **erase:** reap a deleted site's late beacon counters daily ([AGL-3744](https://linear.app/aglyn/issue/AGL-3744))

### Changed

- **ai:** a site start's header entries go in through the navigation op ([AGL-3747](https://linear.app/aglyn/issue/AGL-3747), [AGL-3728](https://linear.app/aglyn/issue/AGL-3728))

### Documentation

- **crm,ai:** document CRM setup by Assist builds and in the capability map ([AGL-3746](https://linear.app/aglyn/issue/AGL-3746))
- **env-isolation:** the Stripe publishable key must be stored plain to be readable (AGL-2401) (#1415) ([AGL-2401](https://linear.app/aglyn/issue/AGL-2401))

<details>
<summary>Also in this release: 2 test</summary>

- **redirects:** the screen-create sweep names the AI redirect writer as not a door ([AGL-3745](https://linear.app/aglyn/issue/AGL-3745))
- **erase:** the staff erasure spec mocks the host remnant reap ([AGL-3744](https://linear.app/aglyn/issue/AGL-3744))

</details>

## v1.0.0-beta.245 — 2026-10-12

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.244...v1.0.0-beta.245)

### Added

- **ai:** re-land the navigation menu op ([AGL-3728](https://linear.app/aglyn/issue/AGL-3728), [AGL-3737](https://linear.app/aglyn/issue/AGL-3737))
- **ai:** navigation menu op for builds and Assist (AGL-3728) (#1398) ([AGL-3728](https://linear.app/aglyn/issue/AGL-3728))
- **beacon:** a client error report names its coarse browser family (AGL-3732) (#1399) ([AGL-3732](https://linear.app/aglyn/issue/AGL-3732))
- **ai:** a store's AI-built products are priced by what they are ([AGL-3733](https://linear.app/aglyn/issue/AGL-3733))
- **ai:** dataset list cards link each record's page ([AGL-3727](https://linear.app/aglyn/issue/AGL-3727), [AGL-3475](https://linear.app/aglyn/issue/AGL-3475))

### Fixed

- **ai:** a paid site start's estimate counts its paid plan and first products ([AGL-3739](https://linear.app/aglyn/issue/AGL-3739))
- **ai:** a guided blog's retried posts are published ([AGL-3739](https://linear.app/aglyn/issue/AGL-3739))
- **ai:** a build's Try again publishes the pages it rebuilt ([AGL-3739](https://linear.app/aglyn/issue/AGL-3739), [AGL-3730](https://linear.app/aglyn/issue/AGL-3730))
- **beacon:** a mismatch on a translated page is dropped, read when marked ([AGL-3738](https://linear.app/aglyn/issue/AGL-3738))
- **ai:** settle a Free plan's small wall overrun instead of re-asking ([AGL-3737](https://linear.app/aglyn/issue/AGL-3737))
- **ai:** a heading-only footer column heads the heading-less links after it ([AGL-3735](https://linear.app/aglyn/issue/AGL-3735))
- **ai:** no hollow footer heading or column; store links under the store heading ([AGL-3735](https://linear.app/aglyn/issue/AGL-3735))
- **sites:** the busy answer reads no hardcoded brand name ([AGL-3734](https://linear.app/aglyn/issue/AGL-3734))
- **sites:** a create that claimed its site is finished on retry, never a dead end ([AGL-3734](https://linear.app/aglyn/issue/AGL-3734), [AGL-3689](https://linear.app/aglyn/issue/AGL-3689))
- **beacon:** a cancelled request is not an unhandled failure ([AGL-3734](https://linear.app/aglyn/issue/AGL-3734))

### Reverted

- **ai:** navigation menu op (AGL-3728) until its live plan eval passes ([AGL-3728](https://linear.app/aglyn/issue/AGL-3728))

### Documentation

- **guides:** build a newsletter sign-up band from a saved form, a live audience and a component (+ US spelling) (#1401)
- **firewall:** the Shipping connector bypass is live, not just declared (AGL-3633) (#1403) ([AGL-3633](https://linear.app/aglyn/issue/AGL-3633))

<details>
<summary>Also in this release: 2 test</summary>

- **activity:** a replayed create's ALREADY_EXISTS is the entry, not a drop ([AGL-3734](https://linear.app/aglyn/issue/AGL-3734))
- **ai:** the catalog card spec expects suggested prices ([AGL-3733](https://linear.app/aglyn/issue/AGL-3733))

</details>

## v1.0.0-beta.244 — 2026-10-12

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.243...v1.0.0-beta.244)

### Added

- **health:** a sign-up that gets a workspace and no site goes red (AGL-3725) (#1392) ([AGL-3725](https://linear.app/aglyn/issue/AGL-3725), [AGL-3724](https://linear.app/aglyn/issue/AGL-3724))

### Fixed

- **ai:** usage notice counts AI credits net of returns; Free copy never reads as billing ([AGL-3726](https://linear.app/aglyn/issue/AGL-3726))

## v1.0.0-beta.243 — 2026-10-11

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.242...v1.0.0-beta.243)

### Fixed

- **ai:** weak product photos borrow their category's; no saunas, colognes or dispensers ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))

## v1.0.0-beta.242 — 2026-10-11

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.241...v1.0.0-beta.242)

### Fixed

- **ai:** store product and hero photos fall back to the shop's own craft ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **console:** reCAPTCHA never renders into a container that's gone ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))

<details>
<summary>Also in this release: 1 chore</summary>

- **ai:** baseline the Saltmarsh recordings' Pixabay tags "spelt" and "mould" ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))

</details>

## v1.0.0-beta.241 — 2026-10-10

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.240...v1.0.0-beta.241)

### Added

- **ai:** a store build adds Account and policy links to the site's own layout as a draft ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **ai:** an Assist build that makes a store adds its account, cart and policy pages ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **ai:** a store's account and cart pages are unlisted, so search engines skip them ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **ai:** dataset records the AI seeds carry photos, so lists stay image-led (AGL-3616) (#1375) ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **ai:** stores built by AI get account, cart, order and policy pages ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))

### Fixed

- **admin:** erasing a site removes every holder's hostMemberships row
- **console:** a deleted site's pages say it's gone instead of loading forever
- **ai:** bare "body" is not nudity, so body lotion photos still fill ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **ai:** stock photos skip hands, sensitive imagery and unnamed products ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **commerce:** the product grid keeps equal columns on a phone ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))

<details>
<summary>Also in this release: 4 chore, 1 ci</summary>

- **deps-dev:** Bump the linters group across 1 directory with 4 updates
- **deps-dev:** Bump @types/node
- **deps:** Bump the mui-emotion group with 2 updates
- **deps:** Bump actions/cache from 4 to 6 in the actions group
- **deps-dev:** Bump eslint-config-next

</details>

## v1.0.0-beta.240 — 2026-10-10

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.239...v1.0.0-beta.240)

### Fixed

- **ai:** the Assist usage strip moves with the build plan's spend ([AGL-3722](https://linear.app/aglyn/issue/AGL-3722))
- **beacon:** a hydration report names the translator that rewrote the page
- **console:** the all sites page shows the list instead of jumping to the last site
- **ai:** an eagerly loading image below the first is fixed in code, never refuses a page ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **staff:** row menus use the Besigner menu items, icons on the left

## v1.0.0-beta.239 — 2026-10-10

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.238...v1.0.0-beta.239)

### Added

- **ai:** the forms Aglyn AI builds write to its datasets ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **ai:** site starts create and use datasets for structured content ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **data:** a dataset draft writer and build operation for Aglyn AI ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))

### Fixed

- **ai:** a form's dataset copy uses American spellings ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **ai:** the Assist usage strip stays current while jobs spend ([AGL-3722](https://linear.app/aglyn/issue/AGL-3722))
- **ai:** a site plan past its datasets is settled in code, never re-asked ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **ai:** another plugin's draft opens where its owner lists it ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **data:** datasets open via the record-route registry; seeded records take minted ids ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))

### Documentation

- **ai:** the capability map says how datasets are routed and what is left ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **ai:** map every documented capability against what Aglyn AI can do ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))

<details>
<summary>Also in this release: 1 test</summary>

- **ai:** 230 of 300 is below the warn line ([AGL-3722](https://linear.app/aglyn/issue/AGL-3722))

</details>

## v1.0.0-beta.238 — 2026-10-10

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.237...v1.0.0-beta.238)

### Added

- **ai:** cancel an AI job from its page, the jobs list and Assist ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **forms:** a sign-up form's submission is its opt-in (+ AI draft field list) (#1353)
- **ai:** store sites built by AI are real storefronts ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **commerce:** a store's product page, grid and reviews read as a designer storefront ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))

### Fixed

- **console:** typing in Assist no longer loops renders ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616), [AGL-3423](https://linear.app/aglyn/issue/AGL-3423))
- **ai:** the Free usage strip's lines stay inside the plugin's load budget ([AGL-3722](https://linear.app/aglyn/issue/AGL-3722))
- **staff:** drop the duplicate live-site icon from the sites row
- **ai:** the Assist usage strip reads the Free allowance the prompt quotes ([AGL-3722](https://linear.app/aglyn/issue/AGL-3722))
- **ai:** estimates and the credits prompt state the real numbers ([AGL-3722](https://linear.app/aglyn/issue/AGL-3722))
- **console:** the guided start picks Music & bands for a band's site ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **ai:** storefront icon code clears the image-sink and community sweeps ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676), [AGL-975](https://linear.app/aglyn/issue/AGL-975))
- **ai:** stock photos match what they illustrate ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **ai:** a section collecting answers gets its form placed instead of failing the build ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))

### Documentation

- **ai:** explain canceling an AI job ([AGL-3616](https://linear.app/aglyn/issue/AGL-3616))
- **commerce:** couriers, ShipMonk fulfillment and ad conversions are live in What's new ([AGL-3695](https://linear.app/aglyn/issue/AGL-3695))

<details>
<summary>Also in this release: 1 test, 2 chore</summary>

- **linear:** the fallback ceiling is AGL-3723, read off Linear ([AGL-3723](https://linear.app/aglyn/issue/AGL-3723))
- **spellings:** stock-photo filler words accept both cosy and favourite ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **ai:** the live site-plan eval plans the Willow Wick store and reports its storefront ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))

</details>

## v1.0.0-beta.237 — 2026-10-09

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.236...v1.0.0-beta.237)

### Fixed

- **ai:** stock photos match their captions and never repeat in a job ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))
- **ai:** a store's Shop page is its storefront, with or without products ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **ai:** store products keep library photos as CDN paths, our refusals refunded ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **console:** the activity cards each open their own docs section ([AGL-3707](https://linear.app/aglyn/issue/AGL-3707))

### Performance

- **console:** a new visible tab takes the Firestore lease from a hidden one ([AGL-3660](https://linear.app/aglyn/issue/AGL-3660))

<details>
<summary>Also in this release: 1 chore</summary>

- **remote-config:** align the template file with production

</details>

## v1.0.0-beta.236 — 2026-10-09

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/99362d865...v1.0.0-beta.236)

### Fixed

- **auth:** no workspace claim starts while the console is leaving ([AGL-3690](https://linear.app/aglyn/issue/AGL-3690))
- **canary:** a missing workspace reports the held name and the page trace ([AGL-3690](https://linear.app/aglyn/issue/AGL-3690))

## v1.0.0-beta.235 — 2026-10-09

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.234...v1.0.0-beta.235)

### Added

- a store or blog start lists its real products and posts (AGL-3676) (#1283) ([AGL-3676](https://linear.app/aglyn/issue/AGL-3676))
- **email:** getting-started emails, sent once per crossing by an hourly sweep (AGL-3692) (#1269) ([AGL-3692](https://linear.app/aglyn/issue/AGL-3692), [AGL-3691](https://linear.app/aglyn/issue/AGL-3691), [AGL-3690](https://linear.app/aglyn/issue/AGL-3690), [AGL-1131](https://linear.app/aglyn/issue/AGL-1131), [AGL-1122](https://linear.app/aglyn/issue/AGL-1122), [AGL-1881](https://linear.app/aglyn/issue/AGL-1881), [AGL-1993](https://linear.app/aglyn/issue/AGL-1993))
- **native:** install a site's own fonts on iPhone, iPad and Mac ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the customer texts switch is native on Apple and Kotlin ([AGL-3669](https://linear.app/aglyn/issue/AGL-3669))
- **native:** built-in themes and a searchable font browser on iPhone, iPad and Mac ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **native:** the Plugins screens switch workspace and site plugins natively ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** spec writes go through FirestoreWriter; domain names the badge ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))

### Fixed

- **native:** the Kotlin contract values split into parts under the JVM's 255-slot limit ([AGL-3703](https://linear.app/aglyn/issue/AGL-3703))
- **commerce:** declare firebase for the tax card, regenerate native contracts ([AGL-3693](https://linear.app/aglyn/issue/AGL-3693), [AGL-3702](https://linear.app/aglyn/issue/AGL-3702))
- **commerce:** tax card says when Stripe Tax leaves it unused; Faire gets label cost ([AGL-3693](https://linear.app/aglyn/issue/AGL-3693), [AGL-3631](https://linear.app/aglyn/issue/AGL-3631), [AGL-3638](https://linear.app/aglyn/issue/AGL-3638))
- **native:** the AI plugin's spec opens in Xcode; Kotlin knows the power icons ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))

<details>
<summary>Also in this release: 2 test, 1 chore</summary>

- **console:** the community sweep knows the native Support screens' forum link ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** the list-plan tests read every declared query ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))
- **native:** regenerate contracts for the inventory-sync plugin ([AGL-3671](https://linear.app/aglyn/issue/AGL-3671))

</details>

1 commit(s) did not parse as conventional commits (merge commits and the like) and did not contribute to the version bump.

## v1.0.0-beta.234 — 2026-10-08

[Compare with the previous release](https://github.com/aglyn/aglyn/compare/v1.0.0-beta.233...v1.0.0-beta.234)

### Added

- **uptime:** the probe tells Slack when a red target recovers ([AGL-3690](https://linear.app/aglyn/issue/AGL-3690))
- **native:** content collections and entries on iPhone, iPad and Mac ([AGL-3668](https://linear.app/aglyn/issue/AGL-3668))
- **staff:** send any system email, or a written follow-up, from an account's staff page (AGL-3691) (#1265) ([AGL-3691