{"generatedAt":"2026-09-22T21:37:58.341Z","total":199,"filtered":199,"returned":20,"sinceRev":null,"releases":[{"rev":"rev 210","date":"2026-08-14","title":"Respects reviewer availability: durable away state, availability-aware capacity guidance, explicit reassignment cues, and typed digest/API parity.","highlights":[{"label":"Reviewer availability is explicit and durable","description":"Owners and admins can mark any decision-capable workspace member available or away from the members panel. The setting defaults to available, persists on workspace membership, and writes an activity record when it changes."},{"label":"Capacity targets use available reviewers only","description":"The shared approval-capacity model keeps away reviewers and their waiting work visible while excluding them from target load, queue spread, and lightest-reviewer suggestions. It also reports available, unavailable, and away-owned totals plus the no-reviewer-available state."},{"label":"Dashboard makes away-owned reviews actionable","description":"The capacity roster gives unavailable reviewers a distinct state, prioritizes an explicit move-away recommendation, and marks affected approval owner pills as away beside the existing audited task-assignment control. Nothing moves automatically."},{"label":"Digest guidance respects availability","description":"Preview and production digests label away owners and point waiting work to the lightest available queue. The preheader still calls out rebalancing, and the copy states that availability changes guidance only."},{"label":"Availability-aware API and OpenAPI 3.1 parity","description":"GET /api/v1/artifacts exposes reviewer availability, available/unavailable counts, away-owned work, and the unavailable load state in its bounded approvalCapacity and per-row reviewOwnerCapacity shapes. Public docs and OpenAPI extend the typed-contract cadence to its 118th unbroken rev."}]},{"rev":"rev 209","date":"2026-08-13","title":"Balances the human review workload: shared reviewer-capacity guidance, dashboard and digest rebalancing cues, per-owner queue context, and typed API parity.","highlights":[{"label":"One transparent reviewer-capacity model","description":"A shared derived helper distributes ready outputs across decision-capable teammates using the originating task assignee. It reports assigned and unassigned work, target load, queue spread, watch/overdue counts, most-loaded and lightest reviewers, and a bounded move suggestion without creating a second owner field or changing work automatically."},{"label":"Capacity roster and owner-load context in the approval queue","description":"The dashboard now shows each eligible reviewer's outstanding load and urgency state, highlights when rebalancing is useful, and names a safe next move. Every output owner pill includes that teammate's total waiting count, while the existing audited task-assignment control remains the only reassignment path."},{"label":"Daily digest catches workload imbalance before policy breach","description":"Preview and production digests use the same capacity calculation as the dashboard. Unassigned reviews point to the lightest eligible queue; uneven owned work suggests a bounded move from the busiest reviewer; balanced teams get a calm confirmation. The preheader calls out when rebalancing is needed."},{"label":"Workspace-wide capacity API and OpenAPI 3.1 parity","description":"GET /api/v1/artifacts now returns a filter-independent approvalCapacity aggregate bounded to the oldest 200 waiting reviews with explicit coverage metadata, plus reviewOwnerCapacity on ready rows. OpenAPI and public docs type the full shape, extending the typed-contract cadence to its 117th unbroken rev. No schema change."},{"label":"Deterministic production typography","description":"Inter, Manrope, and IBM Plex Mono now bundle locally from Fontsource instead of downloading during next/font builds. This preserves the existing brand typography while removing the fonts.gstatic.com availability dependency that caused Vercel's rev 209 deployment to fail on 404 responses."}]},{"rev":"rev 208","date":"2026-08-12","title":"Makes approval reminders fit the team's operating rhythm: configurable review windows, policy-aware dashboard and digest urgency, SLA-relative throughput, and typed API parity.","highlights":[{"label":"Workspace review timing with useful presets and custom hours","description":"Owners and admins can choose Fast (4h/12h), Daily (24h/72h), Weekly (48h/120h), or exact custom watch/overdue hours directly above the approval queue. Validation preserves a clear threshold order, activity history records every change, and the original 24h/72h behavior remains the default."},{"label":"One policy across queue, digest, filters, and ownership","description":"The shared approval model now classifies fresh/watch/overdue using workspace timing everywhere. Dashboard summaries and row colors, personal mine-overdue counts, digest headings and row urgency, plus attention=fresh|watch|overdue SQL filters cannot drift. Timeouts only change attention; they never approve or archive work."},{"label":"Throughput now measures performance against the chosen policy","description":"The 7/30-day analytics retain fixed 24h/72h compatibility metrics while adding within-watch and past-policy shares. Labels, breach highlighting, and the 14-day chart use the workspace's current review expectation, so changing policy immediately gives the team a meaningful operating view."},{"label":"Typed policy API plus immutable Ready-time display fix","description":"GET/PATCH /api/v1/workspace/approval-policy exposes the timing contract, GET /api/v1/artifacts returns approvalPolicy and policy-aware analytics, and OpenAPI/docs type the full shape. Approval rows now label the immutable readyAt clock instead of mutable updatedAt, fixing misleading Ready timestamps after edits, tags, shares, pins, or reactions."}]},{"rev":"rev 207","date":"2026-08-11","title":"Makes the managed approval handoff measurable: immutable review clocks, 7/30-day cycle-time analytics, exact oldest-ready coverage, trend visualization, and typed API parity.","highlights":[{"label":"Immutable ready and decision clocks fix false queue freshness","description":"New additive artifact.readyAt and artifact.decidedAt timestamps define the human-review stage explicitly. Editing, tagging, sharing, pinning, or reacting no longer resets apparent review age. Every starter, AI-output, brief, ideation, single/bulk decision, status reset, and regenerate path stamps the lifecycle; historical rows fall back visibly to created/updated timestamps."},{"label":"7/30-day ready-to-decision analytics","description":"The approvals panel now shows 7-day and 30-day median cycle time, 30-day p90, 72-hour breach share, 24-hour completion share, approved/archive outcome mix, and week-over-week direction. A 14-day daily-median bar chart makes review drift visible before it turns into a stalled queue."},{"label":"Exact oldest-ready coverage","description":"The dashboard preserves its newest-artifact slice but independently loads the exact oldest 30 ready outputs and appends any missing rows. A burst of unrelated briefs, edits, or share activity can no longer push a starving review out of the bounded dashboard result."},{"label":"Throughput API and OpenAPI 3.1 parity","description":"GET /api/v1/artifacts now projects readyAt and decidedAt plus a workspace-wide approvalThroughput aggregate independent of list filters and limit. The contract includes both windows, percentile/share metrics, exact-vs-inferred sample quality, week-over-week trend, and stable 14-day buckets, extending typed coverage to its 115th unbroken rev."}]},{"rev":"rev 206","date":"2026-08-10","title":"Makes the managed approval handoff accountable: task-derived review ownership, owner-scoped queue views, reassignment, reminder-safe digests, and typed API parity.","highlights":[{"label":"One authoritative review owner + at-a-glance workload","description":"Every ready output now inherits the originating task's assignee as its review owner, avoiding a second reviewer field that could drift. The shared approval helper adds assigned, unassigned, mine, and mine-overdue counts; the dashboard summary renders mine / unassigned / owned chips and every row carries accessible owner text beside its age state."},{"label":"My reviews, assigned, and unassigned views + inline reassignment","description":"The approval queue adds an ownership selector that composes with kind, tag, and keyword filters. Outputs with an originating task mount the existing assignment control, so operators can rebalance review directly from the queue through the existing role guard, notification, and audit path rather than creating parallel reviewer state."},{"label":"Daily digest ownership + silent-reminder bug fix","description":"Digest rows name their owner, per-recipient preheaders and summary lines call out how many reviews are yours, and unassigned work stays explicit. A waiting approval queue now qualifies for the daily digest even on days with no fresh signal or newly-created artifact; previously that quiet-content condition could suppress the reminder while old reviews continued aging."},{"label":"Review-owner API filters and OpenAPI 3.1 parity","description":"GET /api/v1/artifacts adds reviewer=assigned|unassigned, reviewerId, a nullable reviewOwner projection, and an approvalOwnership aggregate alongside rev 205's aging fields. OpenAPI types every addition, extending the typed-contract cadence to its 114th unbroken rev. No schema change."}]},{"rev":"rev 205","date":"2026-08-09","title":"Turns the approval-first boundary into a managed handoff: oldest-first review, shared 24h/72h aging states, digest escalation, and typed API parity. Current Zapier and Microsoft guidance confirms the market has moved from merely adding human approval to actively preventing that review step from becoming the workflow bottleneck.","highlights":[{"label":"Oldest-first approval triage + 24h/72h attention states","description":"Ready outputs now sort pinned-first and then oldest-first instead of inheriting newest-first database order. Every row carries a waiting-age chip: fresh under 24 hours, amber watch from 24 hours, and red overdue from 72 hours. A shared approval-aging helper owns classification and compact duration formatting so dashboard, digest, and API cannot drift."},{"label":"Approval-aging summary + dense-queue visibility","description":"The approvals panel gains an at-a-glance summary naming the number past 24h or 72h and the oldest wait. Dashboard artifact coverage expands from 8 to 30 bounded rows so a noisy weekend does not hide aging work behind the newest outputs. New border accents and accessible status copy make urgency scannable without relying on colour alone."},{"label":"Daily digest now carries review age and routes directly to the queue","description":"Approval rows in preview and production digests are fetched oldest-first, include per-output waiting age, elevate the oldest/overdue state into the section heading and preheader, and deep-link the primary CTA to #panel-approvals. The digest now answers what to review first, not merely how many outputs are waiting."},{"label":"GET /api/v1/artifacts approval triage + OpenAPI 3.1 parity","description":"Ready artifacts project approvalAgeHours and approvalAttention. Clients can query attention=fresh|watch|overdue and sort=oldest|recent; the response includes a bounded approvalAging aggregate. OpenAPI types every new query and response field, extending the typed-coverage cadence to its 113th unbroken rev. No schema changes."}]},{"rev":"rev 204","date":"2026-07-15","title":"Ships per-tier default daily cost caps — the flat-fee promise turned on by default — and closes the last two named rev-201 radar templates (independent specialty fishing / outdoor outfitters + independent stationery / pen shops, cluster reaches 77 verticals), then fixes the two gaps the cost-cap seeding + templates work left open. Connecting thread: rev 204 makes the rev-20 daily cost cap load-bearing on the strongest positioning axis Loop Desk has — 'you literally cannot overspend' — by seeding a plan-tier default at workspace creation instead of leaving it null (no cap). (a) Every workspace now seeds a plan-tier default daily cost cap via defaultCostCapCentsForTier (free $0.50 / pro $5 / team $20) so a brand-new desk has a hard spend ceiling from cycle 1 even if the operator never opens the integrations panel — fully overridable + removable via the rev-20 UI, and the integrations panel gains a 'Use plan default' one-tap re-apply affordance. The PLAN_LIMITS.{tier}.defaultDailyCostCapUsdCents figures are the single source of truth: the pricing module (src/lib/pricing-plans.ts) projects the same dollar figures via defaultDailyCostCapUsd so the /pricing caps block, the landing pricing block, and the /api/v1/pricing endpoint never drift from the seeded cap. (b) Two more onboarding templates close the rev-201 named radar wave: independent specialty fishing / outdoor outfitters (named-license + named-permit currency on every guided trip + charter, named-guide / named-charter continuity with a named-backup on every multi-day booking, seasonal inventory turn with the named-buyer ordering window per season, safety-incident hygiene with a same-day named-report + named-equipment quarantine on the water) and independent stationery / pen shops (named-supplier continuity on every allocation-limited pen + ink + paper line, collectibles authentication on every vintage + limited-edition intake, named-nib-service continuity on every service intake, gifting-peak inventory cadence). Two new OnboardingTemplateKey enum values (fishing_outfitter in hospitality-food, stationery_pen_shop in retail-ecommerce). The templates cluster is now 77 named verticals deep. (c) FIX — the rev-204 cost-cap seeding silently broke the rev-165 activation checklist 'Set a guardrail' step: because every workspace now ships with a cost cap set, the completion check (which keyed off 'a cost cap is set') auto-completed on cycle 1 and the nudge never surfaced. Rev 204 rekeys it off a cap that has been TUNED away from the seeded plan default (or Slack quiet hours / non-UTC timezone) so the step still nudges active engagement, and reframes the copy to 'Review your guardrails' — acknowledging the desk is already protected and inviting the operator to make the cap their own. (d) FIX — the rev-204 templates work added the two new verticals to the enum, TEMPLATE_LAUNCH, TEMPLATE_CATEGORY_BY_KEY, and the template data but forgot the TEMPLATE_KEYWORD_HINT entries, so both new verticals rendered without the per-vertical tagline chip every other vertical has had since rev 195; rev 204 adds both. (e) DESIGN — the today-panel Spend stat now surfaces the seeded cap as a reassuring brand-teal '🛡 $X/day cap · protected' chip at zero spend (the flat-fee promise visible from cycle 1) instead of the clinical '0% of $X cap', reverting to the percent-of-cap fact once spend starts. Plus the landing pricing sub-copy names the default-on hard cap as the 'No surprises' proof point ('every plan ships with a hard daily cost cap turned on by default, so your desk literally cannot overspend — even under a flat fee'). PRD + ROADMAP + CLAUDE.md updated (rev 204)","highlights":[{"label":"Per-tier default daily cost cap — the flat-fee guardrail, on by default from cycle 1","description":"The rev-20 daily cost cap was operator-configured per workspace and started null (no cap) — the strongest flat-fee positioning primitive Loop Desk has was off by default, so a fresh desk had no hard spend ceiling until the operator explicitly opened the integrations panel and set one. Rev 204 closes that: new PLAN_LIMITS.{tier}.defaultDailyCostCapUsdCents (free 50c / pro 500c / team 2000c) + a defaultCostCapCentsForTier(tier) helper seed a plan-tier default at workspace creation (both the Credentials-register and Google-OAuth ensureWorkspaceForUser paths). A brand-new desk literally cannot overspend on day one even if the operator never touches the cost-cap UI — the strongest possible flat-fee positioning signal against per-cycle-credits (Notion Custom Agents) and outcome-based (HubSpot Breeze) competitors. Fully operator-overridable + removable via the rev-20 integrations panel, which gains a 'Use plan default' one-tap re-apply affordance + a hint line naming the operator's plan-tier default. Existing workspaces are untouched — the seed fires only at creation, so a long-running desk that explicitly removed its cap stays uncapped. The pricing module (src/lib/pricing-plans.ts) projects the same figures via defaultDailyCostCapUsd + the caps.costCap display string so the /pricing caps block, the landing pricing block, and the rev-203 /api/v1/pricing endpoint never drift from the seeded cap — the concrete answer to the rev-202/203 'Higher daily cost cap' (Pro) / 'Highest daily cost cap' (Team) claim. The OpenAPI 3.1 spec types the defaultDailyCostCapUsd field on the /pricing response. Strategic significance: closes the pricing ↔ cost-guardrail loop the rev-202 /pricing page hinted at, and makes the flat-fee guarantee a structural default rather than an operator opt-in."},{"label":"Two more onboarding templates — independent specialty fishing / outdoor outfitters + independent stationery / pen shops (cluster reaches 77 verticals)","description":"Closes the last two named rev-201 radar candidates. Independent specialty fishing / outdoor outfitters (owner-led specialty fishing shops + fly-fishing outfitters + outdoor guide services — 4 high-importance memory entries: named-license + named-permit currency on every guided trip + charter with a sub-policy on named-federal / named-tribal water, named-guide / named-charter continuity with a named-backup + named-warm-handoff on every confirmed multi-day booking, seasonal inventory turn with the named-buyer ordering window per season + an end-of-season liquidation markdown cadence, safety-incident hygiene with a same-day named-report + named-equipment quarantine on the water + a 3-in-90-days pattern threshold on any named-equipment line + 1 sample mid-season named-guide license-lapse signal). Independent stationery / pen shops (owner-led fine-stationery shops + fountain-pen retailers + writing-instrument specialists — 4 high-importance memory entries: named-supplier continuity on every allocation-limited pen + ink + paper line with a named-customer-waitlist on allocation-limited flagship releases, collectibles authentication on every vintage + limited-edition intake with a named-confidence threshold, named-nib-service continuity with a named-nibmeister-of-record + named-turnaround + condition photograph at intake, gifting-peak inventory cadence with the named-buyer ordering window per gifting peak + reserved named-engraving capacity + 1 sample pre-peak allocation-vs-waitlist signal). Two new OnboardingTemplateKey enum values (fishing_outfitter in hospitality-food, stationery_pen_shop in retail-ecommerce) extend the rev-19 enum without migration. The templates cluster is now 77 named verticals deep. The rev-172 listing endpoint count copy + OpenAPI 3.1 spec both read seventy-seven in lockstep. Strategic significance: closes the rev-201 named radar wave at two more underserved owner-led segments where named-relationship discipline (named-guides + named-charters on the outfitter side, allocation-limited named-suppliers + named-nibmeisters on the pen-shop side) is the load-bearing differentiator against generic chain operators."},{"label":"FIX — activation 'Set a guardrail' step no longer auto-completes on the seeded default cap","description":"The rev-204 cost-cap seeding silently regressed the rev-165 activation checklist. The 'Set a guardrail' step's completion check was Boolean(dailyCostCapUsdCents || slackQuietHoursStart != null || timezone !== 'UTC') — but because rev 204 seeds a cost cap on every workspace at creation, dailyCostCapUsdCents is now always truthy, so the step auto-completed on cycle 1 and the nudge never surfaced for a single operator. That defeats the rev-165 intent: nudge new operators toward reviewing the desk's defensive / operator-respect controls explicitly rather than bumping into them. Rev 204 rekeys the check off a cost cap that DIFFERS from the plan default (defaultCostCapCentsForTier(planTier)) so the step completes only when the operator has actively tuned a guardrail — the tuned cap, Slack quiet hours, or a non-UTC timezone — not the inherited seeded value. The step copy is reframed to 'Review your guardrails' with an honest lede: 'Your desk already ships with a default daily cost cap, so it can't overspend on day one — that's the flat-fee promise, on by default. Make it yours.' Strategic significance: preserves the day-1 trust-signal nudge while acknowledging the rev-204 default. A genuine bug the unshipped cost-cap-seeding code introduced, caught and closed in the same rev it ships."},{"label":"FIX + DESIGN — missing template keyword hints + flat-fee 'protected' chip on the today panel + landing top-line proof point","description":"Three cleanups closing gaps the rev-204 primitives left open. (1) FIX: the rev-204 templates added fishing_outfitter + stationery_pen_shop to the enum + TEMPLATE_LAUNCH + TEMPLATE_CATEGORY_BY_KEY + the template data but forgot the TEMPLATE_KEYWORD_HINT entries — so both verticals rendered on /templates + /templates/[key] + the per-category archive without the per-vertical 'this is what this industry actually cares about' tagline chip every other vertical has carried since rev 195. Rev 204 adds both hints matching the templates' actual four-pillar seed content. (2) DESIGN: the today-panel Spend stat surfaced a set-but-zero-spend cap as the clinical '0% of $X cap'. Rev 204 makes it a reassuring brand-teal '🛡 $X/day cap · protected' chip at zero spend (with a cursor:help tooltip explaining the hard flat-fee ceiling) — the flat-fee promise made visible from cycle 1 — reverting to the percent-of-cap fact once spend starts. New .ld-today-cap-shield CSS in the rev-22+ design language with a tactile hover lift. (3) MARKETING: the landing pricing sub-copy now names the default-on hard cap as the 'No surprises' headline's concrete proof point — 'every plan ships with a hard daily cost cap turned on by default, so your desk literally cannot overspend — even under a flat fee' — surfacing the rev-204 thesis at the landing top-line where prospects evaluate against per-cycle-credit competitors. Strategic significance: the cumulative rev-by-rev visual-hierarchy discipline (every rev 22+ carries at least one piece of polish) reaches the today-panel Spend stat + landing pricing sub-copy, and the flat-fee differentiator is now visible across the landing page, the /pricing page, and the operator's daily dashboard glance."}]},{"rev":"rev 203","date":"2026-05-12","title":"Closes the named rev-202 next-sprint candidate (v1 parity gap on /pricing) + ships two more templates from the rev-201 named radar wave (cheesemongers + bookbinders) bringing the cluster to seventy-five named verticals + adds the per-plan permalink share affordance on /pricing matching the rev-101/125/174/175 share-permalink vocabulary at the per-plan axis. Connecting thread: every rev-203 change makes an existing primitive load-bearing on a new place. (a) New shared src/lib/pricing-plans.ts module is the load-bearing primitive — the /pricing page, the landing-page in-page pricing block (since rev 22), the new /api/v1/pricing endpoint, AND the rev-202 /llms-full.txt AI-discoverability surface all read from one source so a price change updates four surfaces in one edit. Until rev 203 the landing-page pricing block and the rev-202 /pricing page carried hand-coded duplicates that drifted; rev 203 closes that. (b) GET /api/v1/pricing — closes the protocol-bound parity gap on the rev-202 /pricing marketing surface. Returns every plan (slug + name + price + priceUsd + priceSuffix + description + featured + features + caps + per-plan share URL) plus the rev-202 competitor-comparison block (Notion / HubSpot / per-token) plus an aggregate summary block (planCount + startingPriceUsd + featuredPlanSlug + positioning notes). No auth — public marketing surface (same model as /api/v1/badge.svg, /api/v1/integrations, /api/v1/onboarding-templates). Cache-control public, max-age=300, s-maxage=1800. The public marketing v1 cluster reaches its seventh axis: planned (rev 98) + most-requested (rev 98) + shipped (rev 100) + brand voice (rev 102) + industry-fit (rev 172) + channels (rev 202) + pricing (rev 203). (c) Per-plan permalink share chips on every plan card on /pricing — every card now wears a one-tap 'Copy link' chip producing loopdesk.space/pricing#plan-pro style URLs, with a hash-listener that smooth-scrolls + 2.4s flash-highlights the matching plan card on arrival. Mirrors the rev-101 changelog permalink + rev-125 roadmap permalink + rev-174 per-rev changelog detail permalink + rev-175 per-template detail permalink vocabulary at the per-plan axis. (d) Two more onboarding templates — small independent cheesemongers (affinage cycle discipline + named-producer continuity + shrinkage discipline at 3% per-category threshold + pairing expertise as the load-bearing customer trust signal) and independent bookbinders / paper conservators (named-substrate + adhesive discipline on conservation-grade quotes + chain-of-custody on every customer piece + rush-job hygiene with named deadline + conservation-grade supplier continuity adjacent to the rev-201 framing/mat-board axis) — bringing the templates cluster to 75 named verticals. The OpenAPI 3.1 spec types the new /pricing endpoint with full request/response schemas + the rev-172 listing endpoint count copy bumps 73 → 75 in lockstep — the cadence pattern from rev 78 onward reaches its 111th unbroken rev with rev 203. PRD + ROADMAP + CLAUDE.md updated (rev 203)","highlights":[{"label":"Shared src/lib/pricing-plans.ts module — closes the price-list drift between the /pricing page + landing page + v1 surface","description":"Until rev 203 the rev-202 /pricing page carried inline copies of the three plan cards (Free / Pro / Team with prices, features, hard caps, CTA labels) and the landing-page in-page pricing block (since rev 22) carried a separate hand-coded inline copy of the same plans with slightly different feature wording. A real price change had to land in two places + the landing-page block visibly drifted from the canonical /pricing page over time (the rev-22 block named '90-day memory' on the Pro card while the rev-202 page named '90-day memory retention'; small drifts that compound across two months of revs). Rev 203 closes that with a shared module that exports PRICING_PLANS + PRICING_COMPETITORS + a getPricingPlan(slug) helper. Each plan carries a stable slug (free / pro / team) which is also the rev-203 permalink anchor. Both /pricing and the landing block now read from the same array. The new /api/v1/pricing endpoint reads the same module. The rev-202 /llms-full.txt AI-discoverability surface reads the same module so AI agents indexing the site never see drift between the human-readable + protocol-bound + AI-discoverable views. Mirrors the rev-37 src/lib/changelog-releases.ts + rev-97 src/lib/roadmap-items.ts + rev-202 src/lib/integrations.ts shared-module pattern at the pricing axis."},{"label":"GET /api/v1/pricing — closes the protocol-bound parity gap on the rev-202 /pricing marketing surface","description":"New bearer-less GET endpoint returns every plan tier with slug + name + price (display + numeric priceUsd) + priceSuffix + description + featured boolean + features array + caps block (sources + memory + interval) + canonical per-plan share URL (loopdesk.space/pricing#plan-<slug>). Response also carries an aggregate summary block (planCount + startingPriceUsd + featuredPlanSlug + positioning notes: 'No per-cycle credits', 'No metered AI tokens', 'No overage bills', 'Daily cost cap on every tier'). Plus the rev-202 competitor-comparison block (Notion Custom Agents per-cycle credits, HubSpot Breeze outcome-based, per-token billing) projected on every response so MCP hosts rendering 'Loop Desk vs Notion' don't have to scrape the rev-202 page. Pure derived state from the rev-203 shared pricing module. No schema cost, no migration, no new query — pure code primitive. The public marketing v1 cluster reaches its seventh axis. Strategic significance: until rev 203 an MCP host wanting to answer 'what does Loop Desk cost?' programmatically had to scrape the SSR'd HTML at /pricing. Rev 203 closes that. The MCP server's pricing-axis tooling now has nothing left to design."},{"label":"Per-plan permalink share chips on /pricing — mirrors rev-101/125/174/175 share-permalink vocabulary at the per-plan axis","description":"Every plan card on the rev-202 /pricing page now carries a one-tap 'Copy link' chip beside the plan name. Tap to copy loopdesk.space/pricing#plan-free / plan-pro / plan-team to the clipboard with a 1.6s 'Copied' success state. New PricingPlanPermalink client component handles the clipboard write (with execCommand fallback for non-secure contexts, mirroring the rev-42/43/101/125/126/128/133/174/175 chip-copy pattern), updates window.history.replaceState so back/forward navigation re-fires the highlight, and binds a hashchange listener that smooth-scrolls + applies a 2.4s ld-plan-card-flash brand-color glow animation when the URL hash matches a plan slug on first load. Pure client-side affordance — no schema. Strategic significance: closes the share-affordance loop on the rev-202 /pricing primitive at the per-plan axis. Procurement reviewers sharing a specific plan card with a stakeholder ('here's the Pro tier — see the 90-day memory retention') now have a one-tap copy that lands the recipient directly on the matching card. Pairs with the rev-202 dedicated /pricing URL as the share-affordance pair: canonical URL (rev 202) + per-row anchor (rev 203). The lowest-friction expression of 'this scope is meant to be shared' at the per-plan axis. Mirrors the same pattern shipped across the changelog (rev 101 per-rev), roadmap (rev 125 per-item + rev 126 per-phase), per-template detail (rev 175), and per-rev changelog detail (rev 174). The public-marketing share-affordance vocabulary now reaches its sixth surface."},{"label":"Two more onboarding templates — small independent cheesemongers + independent bookbinders / paper conservators","description":"Closes the rev-201 named radar at two more underserved owner-led specialty segments. Small independent cheesemongers (owner-led cheesemongers + cheese shops with affinage + producer relationships — 4 high-importance memory entries: affinage cycle discipline with every named wheel carrying a maturity log (arrival date + expected sell-by window + weekly maturity check on rind + paste + rotation), named-producer continuity on the 20% of revenue from named producers + affineurs with quarterly touchpoint + secondary supplier already qualified, shrinkage discipline with 3% weekly threshold per category triggering root-cause review on two consecutive weeks crossing threshold, pairing expertise as the load-bearing customer trust signal with in-house pairing card refreshed quarterly + 1 sample mid-week affinage signal on an overripe washed-rind shipment). Independent bookbinders / paper conservators (owner-led bookbinders + paper conservators + archival-paper specialists — 4 high-importance memory entries: named-substrate + adhesive discipline with cotton-rag for archival rebinds + PVA neutral-pH for general repair + wheat-starch paste for conservation rebacking + never animal hide-glue on a photographic piece + sub-policy on customer-flagged archival + sentimental + pre-1900 pieces treated as conservation-grade regardless of quote tier, chain-of-custody on every customer piece with condition report + photographs at intake + bench-handoff trail signed at every stop, rush-job hygiene with named deadline + rush-fee + substitution-risk-disclosure + on-time-confidence rating on every <14-day quote, conservation-grade supplier continuity with quarterly review on every supplier crossing 5% trailing-12-month material spend + second-source review on any supplier above 5% quality-rejection or 2-week lead-time miss + 1 sample mid-rebind customer signal on a wedding album with handed-in damage discovered mid-disassembly). Two new OnboardingTemplateKey enum values (cheesemonger in hospitality-food, bookbinder in manufacturing-specialty) extend the rev-19 enum without migration. The templates cluster is now seventy-five named verticals deep. Strategic significance: closes the named rev-201 radar wave at two more underserved owner-led segments where named-relationship discipline (affineurs on the cheese side, conservation-grade suppliers on the binder side) is the load-bearing differentiator against generic chain operators."}]},{"rev":"rev 202","date":"2026-05-12","title":"Deliberate diversification away from the 14-rev templates cluster (rev 188-201 each shipped templates-axis primitives — verticals added, depth/freshness signals, recent endpoints, per-category archive pages, OG cards). Rev 202 pivots to three load-bearing primitives that have been named in the running state but kept getting deprioritised: (a) GET /api/v1/integrations — closes the v1 parity gap on the rev-165 /integrations public marketing surface so MCP hosts answering 'what does Loop Desk connect to?' get the vendor inventory in one bearer-less GET instead of scraping the SSR'd HTML; pairs with /api/v1/onboarding-templates (industry-fit) + /api/v1/blog (brand voice) + /api/v1/changelog (shipped) + /api/v1/roadmap-items (planned) + /api/v1/roadmap-votes (most-requested) as the now-six-axis public marketing v1 cluster (channels axis closed); (b) /pricing public page — until rev 202 the only pricing surface was an in-page anchor on the landing page (loopdesk.space/#pricing), procurement reviewers searching 'Loop Desk pricing' or sharing a pricing URL with a teammate had no canonical page; rev 202 ships a dedicated page with three plan cards + competitor-comparison block (Notion Custom Agents per-cycle credits, HubSpot Breeze outcome-based) + procurement-evidence section + JSON-LD ItemList structured data; (c) /llms-full.txt — modern AI-discoverability surface that complements the existing /llms.txt; AI agents indexing the site (ChatGPT search, Claude search, Perplexity, Bing AI) get a single comprehensive context file with pricing + integrations + templates + roadmap + recent shipping + brand voice + procurement evidence so they don't have to crawl 200+ URLs to learn what Loop Desk does. The OpenAPI 3.1 spec types the new /integrations endpoint with full request/response schemas — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 110th unbroken rev with rev 202. Plus every nav link across the public marketing surface now points at the canonical /pricing URL instead of the in-page anchor (rev 202)","highlights":[{"label":"GET /api/v1/integrations — public integrations catalog on the v1 surface","description":"Closes the v1 parity gap on the rev-165 /integrations public marketing page. New shared `src/lib/integrations.ts` module pulls the inline groups out of the page.tsx into a reusable source — both the rev-165 page and the rev-202 endpoint read from one place so the channel inventory cannot drift between the human-readable surface and the protocol-bound surface (mirrors the rev-37 changelog-releases shared module + rev-97 roadmap-items shared module at the integrations axis). Each row carries key + name + detail + auth + sinceRev. Response also includes an aggregate `perAxis` summary (Inbound / Outbound / Programmatic counts) so MCP hosts rendering 'Loop Desk supports N integrations across 3 axes' don't have to recompute counts. No auth — public marketing surface (same model as /api/v1/badge.svg + /api/v1/roadmap-* + /api/v1/changelog + /api/v1/blog + /api/v1/onboarding-templates). Cache-control public, max-age=300, s-maxage=1800 — the integrations list changes only when we ship a new channel. The OpenAPI 3.1 spec types the new endpoint with full request/response schemas including the perAxis sub-object + groups[].items[] shape with every field typed + sinceRev as a string (since it carries non-numeric data like 'rev 17 (single URL), rev 19 (per-event router)'). Strategic significance: the public marketing v1 cluster is now six axes deep — planned (roadmap) + most-requested (roadmap-votes) + shipped (changelog) + brand voice (blog) + industry-fit (templates) + channels (integrations). The upcoming MCP server (Q3 #1) has nothing left to design across the public marketing v1 cluster at any of the six axes."},{"label":"Dedicated /pricing public page — closes the canonical-URL gap on the load-bearing procurement query","description":"Until rev 202 the only pricing surface was an in-page anchor on the landing page (loopdesk.space/#pricing). Procurement reviewers searching for 'Loop Desk pricing' or sharing a pricing URL with a teammate had no canonical page to land on — anchors don't share well in Slack/email/CRM (no OG preview, no SEO-friendly URL, no individual analytics), don't get their own crawl priority in the sitemap, and degrade in search snippets. Rev 202 closes that. New /pricing page ships three plan cards (Free / Pro $29-mo / Team $79-mo) with feature lists + per-tier hard caps (sources, memory TTL, loop interval floor) in a structured dl block, plus a competitor-comparison section that names Notion Custom Agents ($10/1,000 credits as of May 2026) + HubSpot Breeze ($0.50 per resolved conversation / $1 per qualified lead) + generic per-token billing as the three pricing models Loop Desk explicitly rejects, plus a procurement-evidence section that names what every tier ships (approval-first on every tier, audit trail on every tier, daily cost cap on every tier — higher tiers unlock higher caps, not different products), plus a closing CTA. JSON-LD ItemList structured data with @type=Offer per plan so Google + AI tooling discovery systems consume schema.org pricing markup. Full openGraph + twitter card metadata. Crawler-friendly with priority 0.8 in the sitemap (highest of any public marketing page since pricing is the most-searched B2B procurement query for AI tooling). Every existing nav link across the public marketing surface (landing, blog, docs, changelog, changelog/[rev], changelog/cadence, roadmap, integrations, templates, templates/[key], templates/by-category) now points at /pricing instead of the legacy /#pricing in-page anchor. Strategic significance: closes the procurement-discovery loop on the public marketing surface. SEO win — 'Loop Desk pricing' / 'flat-fee AI workspace pricing' / 'AI workspace no credits' all land on a real page instead of a landing-page section. Pairs with /integrations (vendor inventory) + /templates (industry-fit) + /changelog (history) + /roadmap (future) + /blog (brand voice) + /pricing (cost) as the now-sixth public marketing surface on the human-readable axis."},{"label":"/llms-full.txt — comprehensive AI-discoverability context file","description":"Modern AI-discoverability surface that complements the existing rev-1 /llms.txt. The llms.txt convention (proposed 2024-2025, widely adopted by 2026) has emerged as the AI equivalent of robots.txt + sitemap.xml — a stable entry point AI agents read first to bootstrap their understanding of a site. The bare /llms.txt answers 'what is this product?' in 60 seconds. The deeper /llms-full.txt answers 'what does this product do, who is it for, what does it cost, what does it connect to, what's it been doing lately?' in 5 minutes. Until rev 202 AI agents (ChatGPT search, Claude search, Perplexity, Bing AI) indexing the site had to crawl 200+ URLs to learn what Loop Desk does. Rev 202 collapses that to one stable URL. The file aggregates every public-facing data source — pricing, integrations (every channel + auth model), all 73 onboarding templates organised by industry category with launch metadata, the full roadmap (Now/Next/Later phases), the last 12 changelog revisions with highlights, the blog categories + 15 most-recent posts with excerpts, and a procurement-evidence section naming every governance control. Cache-control public, max-age=3600. Strategic significance: procurement-conscious AI searches ('find me a governance-first AI workspace under $50 a seat with daily cost cap') land on rich content instead of a summary. Pairs with /api/v1/integrations + /pricing as the third rev-202 public surface that answers a procurement-relevant question — the three together close the procurement-discovery story across human (pricing page), protocol (v1 integrations), and AI (llms-full) reading axes."},{"label":"OpenAPI 3.1 typed coverage on /integrations + cumulative visual polish + sitemap entry — 110th unbroken cadence rev","description":"The OpenAPI 3.1 spec types the new GET /integrations endpoint with full request/response schemas (no parameters; response shape with generatedAt + total + perAxis object with Inbound/Outbound/Programmatic counts + groups[] each carrying axis enum + intro + count + items[] each with key + name + detail + auth + sinceRev typed). The cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 110th unbroken rev with rev 202. The OpenAPI spec changelog header gains a rev-202 block explaining the three diversification primitives. Sitemap.xml gains /pricing (priority 0.8, weekly changeFrequency) — higher priority than /integrations (0.7) since pricing is the most-searched B2B procurement query. Plus cumulative visual polish on the /pricing page itself: brand-color teal accent pills at the hero ('No per-cycle credits' / 'No metered AI tokens' / 'No overage bills' / 'Daily cost cap on every tier') matching the rev-22+ design-language thread; per-plan-card 'Most popular' tag on the featured Pro tier; per-tier hard-caps dl block with dashed border so the caps read as a sibling of the rev-22+ chip vocabulary; competitor-comparison row treatment with brand-color teal vs brand-amber palette distinguishing 'them' (Notion/HubSpot per-cycle) from 'us' (Loop Desk flat-fee); procurement-evidence card grid with brand-amber callout treatment on the 'What we don't do' card so the eye lands on the contrast. Strategic significance: keeps the rev-by-rev visual-hierarchy discipline alive — every rev 22+ has carried at least one piece of cumulative polish, and rev 202's polish is load-bearing because the new /pricing page is the most-procurement-loaded surface in the product and needs to read as part of the rev-22+ design language so procurement reviewers recognise the visual vocabulary across all six public marketing surfaces."}]},{"rev":"rev 201","date":"2026-05-12","title":"Closes two more named rev-199 radar candidates at the templates axis (independent toy / hobby shops with named-supplier continuity + age-gating + safety hygiene per CPSIA + ASTM F963 + holiday inventory cadence with named-buyer ordering window in February-May + named-recall response with same-day named-pull on every CPSC notice, and independent framing / mat-board ateliers with named-piece chain-of-custody + named-substrate + named-mat + named-glazing discipline with named-conservation-grade for any named-archival piece + rush-job hygiene with named-deadline + named-rush-fee + named-substitution-risk-disclosure + named-on-time-confidence rating + named-conservation-grade supplier continuity) bringing the templates cluster to seventy-three named verticals — the rev-199 next-radar wave queued small independent toy / hobby shops + independent framing / mat-board ateliers as the rev-200/201 candidates, with rev-200 deliberately stepping off the templates grind for accessibility + milestone + per-category recent endpoint work, and rev-201 picking the radar back up. Plus extends the rev-192 /api/v1/onboarding-templates/categories endpoint with a new per-category `latestLaunch` block (most-recently-shipped template per category with its key + name + rev + date) so MCP hosts rendering 'browse Loop Desk's industry coverage by freshness' get the per-category freshness answer in the same call as the rev-198 depth answer — pairs with `coverageDepth` as the depth + freshness signal pair on every category row. Plus mirrors the rev-201 freshness signal at the human-readable surface: the /templates hero category-chip tooltip now surfaces 'newest rev N (YYYY-MM-DD)' alongside the existing 'N templates · M memory entries · K sample signals' depth signal so procurement reviewers landing on /templates see depth + freshness on one hover. The OpenAPI 3.1 spec types the new `latestLaunch` field with full schema + count copy bumps 71 → 73 across the rev-172 listing endpoint description in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 109th unbroken rev with rev 201. Plus 16 new SEO keywords cover the toy / hobby + framing / mat-board axes (AI for toy shops + AI for hobby shops + AI for game shops + AI for CPSC recall response + AI for CPSIA compliance + AI for ASTM F963 toy safety + AI for holiday inventory cadence + AI for framing ateliers + AI for custom framing shops + AI for mat-board cutters + AI for conservation framing + AI for archival framing + AI for piece chain-of-custody + AI for rush-job hygiene in framing) (rev 201)","highlights":[{"label":"Two more onboarding templates — Independent toy / hobby shops + Independent framing / mat-board ateliers","description":"Closes the named rev-199 radar wave at two more underserved owner-led retail + specialty segments where regulated discipline (CPSIA + ASTM F963 toy safety on the toy/hobby side, named-conservation-grade material continuity on the framing/mat-board side) is the load-bearing differentiator against generic chain retail. Independent toy / hobby shops (4 high-importance memory entries: named-supplier continuity with named-primary + named-secondary on every named-product line crossing 2% of trailing-12-month revenue + sub-policy on rep + acquisition changes, age-gating + safety hygiene per CPSIA + ASTM F963 with named-age-band + named-safety-cert reference on file in named-supplier-record + named-display posture rule on small-parts toys + named-pellet items + named-craft-chemicals, holiday inventory cadence with named-buyer ordering window in February-May for the named-Q4 cycle + named-Q4-allocation target tied to named-prior-year-Q4 + named-trend-adjustment + named-supplier-allocation-confirmation, named-recall response with same-day named-pull from named-floor + named-website + named-supplier consult on every CPSC notice + named-customer-record-pull on named-affected-batch + 1 sample mid-Q4 named-supplier allocation shortage signal on a named-hot-product-line). Independent framing / mat-board ateliers (4 high-importance memory entries: named-piece chain-of-custody with named-condition-report + named-photographs at named-intake + named-bench-handoff at every named-stop signed by the named-bench-worker + named-pickup-signoff at named-customer-pickup, named-substrate + named-mat + named-glazing discipline with named-conservation-grade for any named-archival piece + sub-policy on named-sentimental + named-monetary-value > $500 pieces, rush-job hygiene with named-deadline + named-rush-fee + named-substitution-risk-disclosure + named-on-time-confidence rating on every <7-day named-quote, named-conservation-grade supplier continuity with named-quarterly named-supplier review + named-second-source review on any named-supplier above 5% named-quality-rejection or 2-week named-lead-time miss + 1 sample mid-job named-substrate-substitution disclosure-gap signal on a named-archival-piece). Two new OnboardingTemplateKey enum values (toy_hobby_shop in retail-ecommerce, framing_mat_board in manufacturing-specialty) extend the rev-19 enum without migration. The templates cluster is now seventy-three named verticals deep — closes the day-1 starvation-point story across two more underserved owner-led segments where regulated discipline (CPSC + CPSIA + ASTM F963 toy safety; named-conservation-grade material continuity) is the load-bearing differentiator against generic AI tools that don't know the regulatory vocabulary."},{"label":"Per-category latestLaunch metadata on /api/v1/onboarding-templates/categories — closes the freshness-axis gap on the rev-192 taxonomy endpoint","description":"Until rev 201 the rev-192 /api/v1/onboarding-templates/categories endpoint carried per-category depth (rev 198 `coverageDepth` block) + per-category count + archive URL — but no freshness signal. MCP hosts rendering 'which category got new coverage most recently?' had to fetch the rev-172 full listing + the rev-176 TEMPLATE_LAUNCH map and aggregate client-side, OR fetch the rev-200 per-category recent endpoint per category. Rev 201 closes that with one new field per category row: `latestLaunch: { templateKey, templateName, rev, date } | null`. Pure derived state from the rev-176 TEMPLATE_LAUNCH map walked once per request + the rev-190 TEMPLATE_CATEGORY_BY_KEY filter — no schema cost, no migration. Null when the category has no templates yet (defensive — the 10 industry buckets all currently have ≥2 templates so this null branch is reserved for future-proofing). Pairs naturally with `coverageDepth` (rev 198) as the depth + freshness signal pair on every category row, so 'browse by industry' MCP-host UIs can sort by depth OR by freshness with one bearer-less GET. The OpenAPI 3.1 spec types the new field with full schema in lockstep — the cadence pattern from rev 78 onward (every v1 enhancement gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 109th unbroken rev with rev 201. Strategic significance: closes the named rev-200/v1 'category freshness' gap that the per-category recent endpoint (rev 200) addressed at the per-category-array shape — rev 201 brings the same signal to the taxonomy endpoint as a single field so callers reading the categories list once get both depth + freshness without a follow-up call per category."},{"label":"/templates hero category-chip tooltip now surfaces freshness alongside depth — mirrors v1 latestLaunch at the human-readable surface","description":"Rev 201 mirrors the new v1 `latestLaunch` field at the human-readable /templates surface: the rev-197 per-category chip cluster's tooltip (which already surfaced depth via 'N templates · M memory entries · K sample signals' since rev 198) now ALSO surfaces 'newest rev N (YYYY-MM-DD)' as a freshness tail so procurement reviewers landing on /templates from a per-vertical search snippet see depth + freshness on one hover. Pure derived state from the rev-176 TEMPLATE_LAUNCH map — no schema cost. New `CategoryStat` type adds `latestRev` + `latestDate` + `latestDateMs` fields to the existing getCategoryStats aggregator. The tooltip stays scannable on first glance (the chip face itself shows only category name + count) but the depth + freshness answer is one hover away. Strategic significance: closes the depth+freshness symmetry across both reading horizons (protocol-bound v1 + human-readable HTML). Pairs naturally with the rev-176 60-day 'New' pill on every per-template card + the rev-196 'Recently added' featured strip + the rev-200 per-category recent strip as the four-axis freshness story across every public marketing surface on the templates cluster."},{"label":"Templates page count + radar copy refresh + 16 new SEO keywords + OpenAPI typed coverage (109th unbroken cadence rev)","description":"Templates page count copy bumps 'Seventy-one verticals today' → 'Seventy-three verticals today' across hero, metadata title, OpenGraph + Twitter description, JSON-LD CollectionPage block, and templates-cta. Sixteen new SEO keywords on the templates metadata covering toy / hobby + framing / mat-board axes (AI for toy shops, AI for independent toy retailers, AI for hobby shops, AI for game shops, AI for CPSC recall response, AI for CPSIA compliance, AI for ASTM F963 toy safety, AI for holiday inventory cadence, AI for framing ateliers, AI for custom framing shops, AI for mat-board cutters, AI for conservation framing, AI for archival framing, AI for piece chain-of-custody, AI for rush-job hygiene in framing). Don't see your vertical? CTA copy refreshes the next-radar list — replaced with independent specialty fishing / outdoor outfitters (named-license currency + named-charter continuity + named-safety-incident hygiene), independent bookbinders / paper conservators (named-substrate + named-adhesive discipline + named-piece chain-of-custody adjacent to the rev-201 framing axis), independent stationery / pen shops (named-supplier continuity + named-collectibles authentication), and small independent cheesemongers (named-affinage cycle + named-supplier continuity + named-shrinkage discipline) now that toy/hobby + framing/mat-board are shipped. The rev-172 listing endpoint description bumps from 71 → 73 verticals in the OpenAPI 3.1 spec + the new latestLaunch field is fully typed on the rev-192 categories endpoint response schema — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 109th unbroken rev with rev 201."}]},{"rev":"rev 200","date":"2026-05-09","title":"Milestone revision — 200 unbroken rev-by-rev cadence revs shipped on the public changelog. Deliberate diversification away from the 13-rev templates grind (rev 188-199 each closed industry-template wave candidates) onto three orthogonal axes that have been named in the running state but kept getting deprioritised: prefers-reduced-motion accessibility support across every animation in the app (genuine a11y gap — ~48 keyframes + every transition fired regardless of OS-level user preference until rev 200), per-category recently-shipped HTML strip on the rev-191 /templates/by-category/{category} archive pages (closes the named rev-199 next-sprint candidate at the per-category axis on the human-readable surface), per-category recently-shipped v1 endpoint at GET /api/v1/onboarding-templates/by-category/{category}/recent (closes the same candidate on the protocol-bound side — mirrors the rev-199 workspace-axis convenience read at the per-category axis), plus a milestone visual treatment on the /changelog hero anchoring rev 200 as a meaningful inflection point (every 100 revs gets the milestone pill since rev 100; rev 200 also gets a soft hero card surfacing the round-number cadence achievement). The connecting thread: every rev-200 change makes an *existing* primitive load-bearing on a new axis — the rev-22+ design language gains its first explicit accessibility primitive (reduced-motion query covering ~48 keyframes), the rev-191 HTML archive pages reach the recency-axis read shape rev-196 introduced on the workspace surface, the rev-190 by-category v1 cluster reaches its second axis (drill-down + recent), and the rev-100 milestone-rev visual treatment lights up its second occurrence (rev 200)","highlights":[{"label":"Accessibility — prefers-reduced-motion support across every animation","description":"Until rev 200 every one of the ~48 @keyframes animations + every transition in globals.css fired regardless of OS-level user preference. Operators with vestibular disorders, attention-related sensitivities, or migraine triggers — plus anyone running on battery-saver mode where the browser respects reduced-motion — had no escape hatch. Pulses (rev-12 heartbeat, rev-76 what's-new badge, rev-77 personal inbox, rev-97 sources health + latest-release pill, rev-180 shipping cadence, rev-183 cadence-trend chip), spinners, fade-ins (every rev-33 .app-panel ld-fade-in), slide-downs (rev-114 live-preview, rev-118 memory bulk import), and hover lifts all fired full-strength. Rev 200 adds the standard accessibility recipe: a single @media (prefers-reduced-motion: reduce) block in globals.css collapses every animation + transition to ~0.01ms so dependent JS transitionend / animationend handlers still fire (which some chip-pulse + flash-highlight components rely on for their state cleanup), but the visible motion is functionally zero. Affordances that signal state via transform (hover lift, sparkline highlight, FAB entrance) keep their final visual state — only the transition between states is collapsed. Strategic significance: every rev 22+ has carried at least one piece of cumulative polish. Rev 200's polish is the first one that's genuinely an accessibility fix rather than a visual-hierarchy refinement — it benefits every operator on every surface that uses motion. The rev-22+ visual-hierarchy thread now has a load-bearing accessibility primitive supporting it."},{"label":"Per-category recently-shipped HTML strip on /templates/by-category/{category} archive pages","description":"Closes the named rev-199 next-sprint candidate at the per-category axis on the human-readable surface. Until rev 200 the rev-196 'Recently added' featured strip lived only on the workspace-axis /templates index — visitors landing on a per-category archive page (rev 191) had no equivalent surface. The rev-191 archive pages list every template in the category in declaration order, but a procurement reviewer landing through 'AI workspace for healthcare practices' search snippet had no signal of which healthcare templates shipped most recently without parsing every card's 'Added in rev N' meta line by hand. Rev 200 closes that. New 'Recently added in {category}' strip surfaces the 3 most-recently-shipped templates in that category (descending by launch date with enum order as tiebreak; pure derived state from the rev-176 TEMPLATE_LAUNCH metadata map — no schema cost, no migration). Hidden when the category has fewer than 4 templates in total (the strip would tautologically be the whole category). Each strip card shares the rev-196 .ld-templates-recent CSS vocabulary so the workspace + per-category recency surfaces read with one consistent visual story. Strategic significance: closes the recency-axis read shape on every public-facing template surface — workspace index (rev 196 strip), per-category archive (rev 200 strip), workspace-axis v1 (rev 199 endpoint), per-category v1 (rev 200 endpoint)."},{"label":"GET /api/v1/onboarding-templates/by-category/{category}/recent — per-category recency read shape","description":"Closes the named rev-199 next-sprint candidate on the protocol-bound side. New bearer-less GET endpoint returns the N most-recently-shipped templates in a given category, sorted descending by launch date with enum order as a deterministic tiebreak (mirrors the rev-199 /onboarding-templates/recent shape at the per-category axis). Optional limit query param (default 3, max 20). Returns 404 with typed { error: 'category_not_found', category, validCategories[] } when the slug is unknown (mirrors the rev-190 by-category 404 shape). Each row carries the same fields as the rev-199 workspace-axis endpoint: key + name + description + keywordHint + category + categoryLabel + memoryCount + signalCount + url + apiUrl + launchRev + launchDate. Cache-control public, max-age=300, s-maxage=1800. The OpenAPI 3.1 spec types the new endpoint with full request/response schemas + 404 error path in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 108th unbroken rev with rev 200. Pairs with the rev-190 by-category drill-down + rev-200 by-category recent strip + rev-199 workspace-axis recent endpoint as the four-axis recency read cluster on the templates v1 surface (workspace listing rev 172 + workspace recent rev 199 + per-category drill-down rev 190 + per-category recent rev 200). Strategic significance: the templates v1 cluster reaches its seventh read shape — the upcoming MCP server's templates-axis tooling has nothing left to design across all seven read shapes including per-category recency."},{"label":"Rev 200 milestone visual treatment + cumulative changelog hero polish","description":"Rev 200 marks 200 unbroken cadence revs shipped on the public changelog (rev 100 was the first milestone; rev 200 is the second). The rev-100 .ld-changelog-item-milestone visual treatment fires automatically (every rev whose number is a multiple of 100 gets the brand-purple left-border accent + 'milestone' pill on the changelog page) — rev 200 inherits it. Plus a new milestone hero card surfaces above the rev list on /changelog itself naming the round-number cadence achievement: '200 unbroken cadence revs shipped' headline + '~6 months of public, frequent, audit-trail-grade product velocity' subline + a CTA inviting subscribers to the rev-37 RSS feed + rev-178 cadence calendar + rev-179 weekly pulse pill. The hero card uses a brand-purple gradient background distinct from the rev-179 brand-color teal pulse pill so the milestone reads as anniversary signal rather than ambient cadence chrome. Cumulative micro-polish — every rev 22+ has carried at least one — and rev 200's polish is load-bearing because the milestone-rev visual treatment had only ever fired once (rev 100). Strategic significance: anchors the rev-200 inflection as a moment worth marking, and explicitly diversifies away from the 13-rev templates grind by being a non-template celebration of cadence consistency. The rev-by-rev visual-hierarchy discipline (every rev 22+ has carried at least one piece of cumulative polish) reaches its 178th unbroken rev with rev 200."}]},{"rev":"rev 199","date":"2026-05-09","title":"Closes two more named radar candidates at the templates axis (small independent jewellers with named-craftsman continuity + custom-order milestone cadence + appraisal + insurance documentation hygiene + chain-of-custody on every piece in for repair, and independent specialty bike shops with named-mechanic continuity + service-record continuity per named bike + seasonal inventory turn + safety-incident hygiene with named-component quarantine on any post-service incident) bringing the templates cluster to seventy-one named verticals — the rev-198 next-radar wave queued small independent jewellers + independent specialty bike shops at the top of the queue, and rev 199 ships them at the cheapest possible shape on top of the existing rev-19 ONBOARDING_TEMPLATES array. Plus opens the sixth read shape on the templates v1 cluster — recently-shipped convenience read at /api/v1/onboarding-templates/recent — so MCP hosts rendering a 'what's new on the templates surface' widget don't have to fetch the rev-172 full listing endpoint and sort the rows client-side by launchDate. Mirrors the rev-175 /api/v1/changelog/latest convenience pattern at the templates axis. The OpenAPI 3.1 spec count copy bumps 69 → 71 across the rev-172 listing endpoint description in lockstep + the new convenience endpoint is fully typed in the same cycle the dashboard primitive ships — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 107th unbroken rev with rev 199. Plus radar copy refresh on the templates 'Don't see your vertical?' CTA names the next vertical wave (independent toy / hobby shops + framing / mat-board ateliers + independent specialty fishing / outdoor outfitters + independent bookbinders / paper conservators) now that jewellers + bike shops are shipped. Plus 12 new SEO keywords cover the jeweller + bike-shop axes. Plus subtle visual polish on the rev-196 Recently-added strip cards: the rev-197 per-card category badge now brightens on parent-link hover so the chip feels like part of the same surface in motion (rev 199)","highlights":[{"label":"Two more onboarding templates — small independent jewellers + independent specialty bike shops","description":"Closes the named rev-198 next-radar wave at two more underserved owner-led retail segments where the named-craftsman + named-mechanic relationship is the load-bearing differentiator against generic chain retail. Small independent jewellers (4 high-importance memory entries: named-craftsman continuity with named-primary + named-backup on every commission + sub-policy on bench substitutions, custom-order milestone cadence with named touchpoints at design + wax + cast + set + final review + named customer-comm at every milestone, appraisal + insurance documentation hygiene on every named piece over $2K with named-replacement-value + named-stone-grading + named-photographer record + 24-hour delivery threshold, chain-of-custody on every piece in for repair / resize / restoration with named-condition-report + named-photographs + named-workbench-handoff + named-pickup-signoff + 1 sample mid-commission stone-availability signal). Independent specialty bike shops (4 high-importance memory entries: named-mechanic continuity with named-primary + named-backup on every multi-day service + sub-policy on quick-fix substitutions, service-record continuity per named bike with named-mechanic + named-finding + named-replacement + named-recommendation + named-deferred-work, seasonal inventory turn with named-buyer ordering window in November-January + end-of-season liquidation cadence in September-December, safety-incident hygiene with named-component quarantine on any post-service incident + 3-in-90-days pattern threshold for named-component-line review + 1 sample mid-season post-service brake incident pattern signal). Two new OnboardingTemplateKey enum values (indie_jeweller, specialty_bike_shop) extend the rev-19 enum without migration. The templates cluster is now seventy-one named verticals deep. Strategic significance: closes the named rev-198 next-radar wave (the rev-198 running state explicitly named both as the top of the queue). Both verticals map cleanly onto Loop Desk's approval-first vocabulary — jewellers lean on named-craftsman continuity + chain-of-custody + appraisal documentation discipline (high-trust, high-value), bike shops lean on named-mechanic continuity + service-record continuity + safety-incident pattern detection (regulated equipment, named-relationship retention)."},{"label":"GET /api/v1/onboarding-templates/recent — sixth read shape on the templates v1 cluster","description":"Until rev 199 MCP hosts and AI tooling roundup newsletters rendering 'what's new on the templates surface' had to fetch the rev-172 full listing endpoint and sort the rows client-side by launchDate. Rev 199 makes the answer a one-call bearer-less GET. Returns the N most-recently-shipped templates (default 4, max 20) sorted descending by launch date with enum order as a deterministic tiebreak — so two templates launched on the same date render in the order they appear in ONBOARDING_TEMPLATES. Each row carries key + name + description + keywordHint + category + categoryLabel + memoryCount + signalCount + url + apiUrl + launchRev + launchDate. Mirrors the rev-175 /api/v1/changelog/latest convenience pattern at the templates axis on the protocol-bound side, and the rev-196 dashboard 'Recently added' featured strip at the human-readable axis. Pure derived state from the rev-176 TEMPLATE_LAUNCH metadata map — no schema cost, no migration. Strategic significance: closes the sixth read shape on the templates v1 cluster (full listing rev 172 + per-template detail rev 189 + per-category drill-down rev 190 + standalone-taxonomy rev 192 + keyword search rev 193 + aggregate stats rev 194 + recent rev 199). Pairs with /api/v1/changelog/latest (rev 175) + /api/v1/changelog/peak-week (rev 187) as the third single-record convenience endpoint on the public marketing surface — same pattern, three surfaces, one consistent vocabulary. Cache-control public, max-age=300, s-maxage=1800."},{"label":"Templates page count + radar copy refresh + SEO keywords + OpenAPI typed coverage + cumulative visual polish","description":"Templates page count copy bumps 69 → 71 across hero, metadata title, OpenGraph + Twitter description, JSON-LD CollectionPage block, and templates-cta. Two new keyword hints on the per-vertical chip line (small independent jewellers `Named-craftsman continuity · custom-order milestone cadence · appraisal hygiene · insurance documentation`; independent specialty bike shops `Named-mechanic continuity · service-record continuity · seasonal inventory turn · safety-incident hygiene`). Twelve new SEO keywords on the templates metadata covering jeweller + bike-shop axes (AI for jewellers + AI for independent jewellers + AI for jewellery shops + AI for watchmakers + AI for custom-jewellery commissions + AI for named-craftsman continuity + AI for appraisal documentation + AI for bike shops + AI for independent bike shops + AI for cycling retail + AI for bicycle service centres + AI for named-mechanic continuity + AI for service-record continuity). 'Don't see your vertical?' next-radar list refreshes — replaced with independent toy / hobby shops, framing / mat-board ateliers adjacent to the rev-193 picture-framing axis, independent specialty fishing / outdoor outfitters, and independent bookbinders / paper conservators now that jewellers + bike shops are shipped. The OpenAPI 3.1 spec types the new /onboarding-templates/recent endpoint with full request/response schemas (limit query param 1-20 default 4 + response shape with templates[] each carrying key + name + description + keywordHint + category + categoryLabel + memoryCount + signalCount + url + apiUrl + launchRev + launchDate) — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 107th unbroken rev with rev 199. Plus subtle visual polish on the rev-196 Recently-added strip cards: the rev-197 per-card category badge below each strip card name now brightens on parent-link hover (`rgba(31,143,137,0.08) → 0.18` background + matching border-color emphasis) so the chip reads as part of the same surface in motion vocabulary, mirroring the rev-193 per-template card hover treatment at the strip-card axis. Cumulative micro-polish — every rev 22+ has carried at least one — and rev 199's polish is load-bearing because the rev-196 + rev-197 strip surfaces had accumulated five distinct visual elements (rev label + date + name + category badge + keyword-hint + stats line + CTA) without a unified hover treatment until rev 199."}]},{"rev":"rev 198","date":"2026-05-09","title":"Closes two more named radar candidates at the templates axis (independent ski / snowboard rental shops with seasonal inventory turn + named-tech continuity + equipment-incident hygiene + fit-verification discipline, and small independent yoga studios with named-member 14-day silent-attendance threshold + named-instructor continuity + class-format hygiene + injury-incident cadence) bringing the templates cluster to sixty-nine named verticals — the rev-197 next-radar wave queued ski / snowboard rental shops + small independent yoga studios at the top of the queue, and rev 198 ships them at the cheapest possible shape on top of the existing rev-19 ONBOARDING_TEMPLATES array. Plus extends the rev-192 /api/v1/onboarding-templates/categories endpoint with a per-category `coverageDepth` block (memory entries + sample signals + total evidence) so MCP hosts rendering 'browse by depth' or sorting categories by accumulated evidence trail get the depth answer in the same call as the count answer — pure derived state from the rev-19 ONBOARDING_TEMPLATES corpus walked once per request. Plus subtle visual polish on the rev-197 hero category chips: count pill brightens on chip hover so the cluster feels more tactile + per-chip tooltip now surfaces the same depth signal the new v1 field exposes ('9 templates · 36 memory entries · 9 sample signals'). Plus the OpenAPI 3.1 spec count copy bumps 67 -> 69 across the rev-172 listing endpoint description in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 106th unbroken rev with rev 198. Plus radar copy refresh on the templates 'Don't see your vertical?' CTA names the next vertical wave (small independent jewellers + independent toy / hobby shops + independent specialty bike shops + framing / mat-board ateliers) now that ski/snowboard + yoga are shipped. Plus 12 new SEO keywords cover the ski/snowboard + yoga axes (rev 198)","highlights":[{"label":"Two more onboarding templates — independent ski / snowboard rental shops + small independent yoga studios","description":"Closes the named rev-197 radar wave at two more underserved owner-led retail + healthcare-wellness segments. Independent ski / snowboard rental shops (4 high-importance memory entries: seasonal inventory turn with named-buyer ordering window + end-of-season liquidation cadence, named-technician continuity on every binding mount + DIN setting with ASTM F2063-tested values + named primary + backup, equipment-incident hygiene with same-day named-incident report + 7-day equipment quarantine + 3-in-90-days pattern threshold, fit verification on every rental with measured height + measured weight + boot fit + ability honesty + helmet fastening verification + 1 sample mid-season binding-incident pattern signal). Small independent yoga studios (4 high-importance memory entries: named-member 14-day silent-attendance threshold with named-instructor outreach + 30-day named-owner conversation, named-instructor continuity with primary + backup paired-shadow on every weekly slot + 4-week paired-shadow on planned mid-season substitutions, class-format hygiene with published heat + intensity + pace + experience floor on every class + 30% drift trigger, injury-incident cadence with same-day named-incident report + 30-day named-instructor follow-up + 3-in-90-days teaching-cue review trigger + 1 sample 14-day silent-regular signal). Two new OnboardingTemplateKey enum values (ski_snowboard_rental, yoga_studio) extend the rev-19 enum without migration. The templates cluster is now sixty-nine named verticals deep. Strategic significance: closes the named rev-197 next-radar wave (the rev-197 running state explicitly named both as the top of the queue). Both verticals map cleanly onto Loop Desk's approval-first vocabulary — ski/snowboard rental leans on named-tech DIN-setting safety discipline + seasonal turn discipline (highly regulated, equipment-heavy), yoga studios lean on named-instructor continuity + injury-pattern detection (membership-cadence, named-relationship retention)."},{"label":"coverageDepth field on /api/v1/onboarding-templates/categories — closes depth-axis gap on the rev-192 standalone-taxonomy endpoint","description":"Until rev 198 the rev-192 /api/v1/onboarding-templates/categories endpoint returned per-category templateCount + URLs, but MCP hosts rendering 'browse by depth' (e.g. sort categories by total evidence) had to fetch the rev-194 /api/v1/onboarding-templates/stats endpoint and walk the perCategory[] array. Rev 198 closes that gap. Every category row now also carries a coverageDepth: { memoryEntries, sampleSignals, totalEvidence } block — pure derived state walked once per request from the rev-19 ONBOARDING_TEMPLATES corpus. The OpenAPI 3.1 spec types the new field with full schema in lockstep. Strategic significance: pairs with the rev-198 hero category-chip tooltip on the human-readable /templates surface so dashboard ↔ v1 read the same depth signal across both reading horizons. The MCP server's templates-axis tooling now closes the depth-axis read across all 5 axes where it makes sense (per-template detail rev 189 includes memory + signal counts; per-category drill-down rev 190 includes them; standalone-taxonomy rev 192 + 198 includes per-category sums; aggregate stats rev 194 includes both per-template + per-category sums; keyword search rev 193 includes per-template counts)."},{"label":"Templates page count + radar copy refresh + SEO keywords + cumulative visual polish","description":"Templates page count copy bumps 67 → 69 across hero, metadata title, OpenGraph + Twitter description, JSON-LD CollectionPage block, and templates-cta. Two new keyword hints on the per-vertical chip line (Independent ski / snowboard rental `Seasonal inventory turn · named-tech continuity · equipment-incident hygiene · fit verification`; Small independent yoga studios `Membership lifecycle · named-instructor continuity · class-format hygiene · injury cadence`). Twelve new SEO keywords on the templates metadata — AI for ski rental shops + AI for snowboard rental shops + AI for winter sports retail + AI for seasonal inventory turn + AI for binding-mount discipline + AI for fit-verification rentals + AI for yoga studios + AI for independent yoga studios + AI for membership-lifecycle yoga + AI for class-format hygiene + AI for injury-incident cadence + AI for named-instructor continuity. 'Don't see your vertical?' next-radar list refreshes — replaced with small independent jewellers (named-craftsman continuity + custom-order milestone cadence + appraisal + insurance hygiene), independent toy / hobby shops (named-supplier continuity + age-gating + safety hygiene + holiday inventory cadence), independent specialty bike shops (named-mechanic + service-record continuity), and framing / mat-board ateliers adjacent to the rev-193 picture-framing axis now that ski/snowboard + yoga are shipped. Per-template detail page keyword-hint map gains the matching two new entries via the rev-195 canonical TEMPLATE_KEYWORD_HINT consolidation so /templates/[key] for the new verticals reads with the same depth as the existing sixty-seven verticals. Plus subtle visual polish on the rev-197 category-chip cluster: count pill brightens to brand-color on chip hover so the chip feels more tactile, and the per-chip tooltip now surfaces the rev-198 coverageDepth signal at the human-readable surface ('9 templates · 36 memory entries · 9 sample signals') mirroring the new v1 field. Cumulative micro-polish — every rev 22+ has carried at least one — and rev 198's polish is load-bearing because it ties the new v1 depth-axis primitive to the human-readable surface in the same cycle."}]},{"rev":"rev 197","date":"2026-05-09","title":"Closes two more named radar candidates at the templates axis (small independent ice-cream / gelato shops with recipe-yield discipline per named flavour + supplier continuity on dairy + named inclusion suppliers + seasonal-staffing cadence with named scoopers + named makers + daily quality cadence on every batch, and independent tour operators with named-guide continuity + small-group experience design with named max group size + named accessibility posture + same-day named-incident reporting + weather-contingency hygiene with named decision tree + customer-comm template) bringing the templates cluster to sixty-seven named verticals + opens two new at-a-glance affordances on the /templates index hero (per-category coverage chip cluster between the hero and the rev-196 Recently-added strip + per-card stats on every Recently-added card showing memory-entry + signal-entry counts + category badge) so first-time visitors evaluating Loop Desk for a specific industry get one-glance category coverage + per-card depth without scrolling the full grid. Pure additive on top of rev-19 ONBOARDING_TEMPLATES + rev-190 TEMPLATE_CATEGORY_BY_KEY (no schema cost, no migration). The OpenAPI 3.1 spec count copy bumps 65 → 67 across the rev-172 listing endpoint description in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 105th unbroken rev with rev 197.","highlights":[{"label":"Two more onboarding templates — small independent ice-cream / gelato shops + independent tour operators","description":"Closes two more named radar candidates at two more underserved owner-led retail + experiential entertainment segments where named-flavour recipe-yield discipline + named-dairy continuity (ice-cream/gelato) and named-guide continuity + small-group experience design (tour operators) are the load-bearing differentiators against generic AI tools. Small independent ice-cream / gelato shops (4 high-importance memory entries: recipe-yield discipline per named flavour with target yield + named-baseline waste + named-batch maker logged, supplier continuity with primary dairy + monthly milk-fat / somatic-cell-count / delivery-cadence checks + named-secondary qualified, seasonal-staffing cadence with named scoopers + named makers from May 1 + Apr 15 hiring + onboarding window close + 7-day mid-season replacement, daily quality cadence with named-maker tasting log on texture + named-flavour-balance + cabinet temperature). Independent tour operators (4 high-importance memory entries: named-guide continuity with named primary + named backup + 2-trip paired-shadow on guide changes, small-group experience design with named max group size + named accessibility posture per itinerary, safety-incident reporting with same-day named report + 24h/7d/30d follow-ups on major incidents + minor-incident pattern detection, weather-contingency hygiene with named threshold decision tree + named customer-comm template firing 18h out + named guide as the morning-of decision-maker). Two new OnboardingTemplateKey enum values (ice_cream_gelato, tour_operator) extend the rev-19 enum without migration. The templates cluster is now sixty-seven named verticals deep. Strategic significance: closes the day-1 starvation-point story across two more underserved owner-led segments — ice-cream/gelato is the named retail axis the rev-196 radar wave queued, tour operators is the named experiential entertainment axis the same radar surfaced. Both map cleanly onto Loop Desk's approval-first vocabulary."},{"label":"Per-category coverage chip cluster on /templates index hero — closes the in-hero category-axis gap","description":"Until rev 197 the only category-axis surface on the /templates index was the rev-190 chip filter directly above the grid, which only became visible after the operator scrolled past the rev-196 Recently-added strip. Visitors evaluating Loop Desk for a specific industry from a per-vertical search snippet had no one-glance read of 'where is Loop Desk's template coverage concentrated?' before they scrolled. Rev 197 closes that gap with a hero-level chip cluster directly under the rev-196 hero copy showing every industry category with a per-category count + a deep-link to the rev-191 per-category HTML archive page. Pure derived state from the rev-190 TEMPLATE_CATEGORY_BY_KEY map — no schema cost, no migration. Empty categories are silently filtered. Each chip carries a tooltip naming the category description so the operator's eye reads the chip's intent without parsing the per-archive landing page. Strategic significance: closes the at-a-glance category-axis gap at the load-bearing /templates entry surface. Procurement reviewers searching 'AI for healthcare practices' from a Google snippet now have a one-tap path into the matching subset (currently 12 healthcare verticals) instead of scrolling past the Recently-added strip + scanning the in-grid filter chips. Pairs with the rev-191 per-category HTML archive surface as the destination + the rev-190 in-grid filter chips as the in-grid narrowing surface."},{"label":"Per-card stats + category badge on every Recently-added strip card — closes depth-axis gap on rev-196","description":"The rev-196 Recently-added strip showed each recent vertical's name + keyword hint + read-the-template CTA but skipped the per-card depth-axis context (memory-entry count + signal-entry count + category placement) the rev-19 main grid surfaces inline on every card. Visitors scanning the strip had no read of 'how much depth does this template carry?' before clicking through. Rev 197 closes that gap. Each Recently-added card now also surfaces (a) a small category badge under the name showing the industry placement (e.g. 'Hospitality & food' for the rev-197 tour operator template), (b) a stats line below the keyword hint showing memory-entry + signal-entry counts. Pure derived state from the rev-19 ONBOARDING_TEMPLATES array (no schema cost). Strategic significance: closes the depth-axis gap on the rev-196 strip in the same vocabulary the rev-19 main grid uses (memory + signal counts) so visitors can pattern-match across both surfaces without context-switching. Pairs naturally with the rev-197 per-category coverage chip cluster — the chip cluster answers 'where is the coverage?' at the category axis, the per-card stats answer 'how deep is each new vertical?' at the per-template axis."},{"label":"OpenAPI count bump 65 → 67 + radar copy refresh + 12 new SEO keywords + cumulative visual polish","description":"The rev-172 GET /api/v1/onboarding-templates listing endpoint description bumps 65 → 67 in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 105th unbroken rev with rev 197. The rev-191 template-filter category-count fallback also bumps 65 → 67 so the chip filter shows the correct cardinality even when the workspace template pool is loaded asynchronously. The /templates 'Don't see your vertical?' radar copy refreshes — independent ski / snowboard rental shops, small independent yoga studios, small independent jewellers, and independent toy / hobby shops are now the next wave on the queue. Twelve new SEO keywords cover the ice-cream/gelato + tour-operator axes (AI for ice-cream shops, AI for gelato shops, AI for independent ice-cream operators, AI for recipe-yield discipline, AI for seasonal-staffing cadence, AI for daily quality cadence, AI for tour operators, AI for independent tour operators, AI for small-group experience design, AI for named-guide continuity, AI for safety-incident reporting, AI for weather-contingency hygiene). Plus cumulative visual polish: new `.ld-templates-cats*` CSS uses the brand-color teal palette + soft gradient + per-chip hover lift + focus-visible accessibility ring + print-stylesheet hide so the rev-194 procurement-takeaway PDF stays clean; the `.ld-templates-recent-stats` + `.ld-templates-recent-cat` chips wear the same brand-color treatment so all three rev-196/197 surfaces (strip card, category chip, in-grid card) read as siblings in one consistent visual vocabulary."}]},{"rev":"rev 196","date":"2026-05-09","title":"Closes two more named radar candidates at the templates axis (small independent fabric / quilting shops with supplier continuity + 60-day-ahead class programming + named-clientele continuity on the top 10% of customers + 12-month sell-through inventory floor, and independent paint-and-sip studios with 30-day class programming cadence + BYOB / liquor-licensing posture review + named primary + backup instructor continuity + 14-day private-event coordinator confirmation) bringing the templates cluster to sixty-five named verticals + opens a 'Recently added' featured strip at the top of /templates so first-time visitors see the most-recently shipped verticals before scrolling the full grid (pure derived state from the rev-176 TEMPLATE_LAUNCH map — no schema cost). The OpenAPI 3.1 spec count copy bumps 63 → 65 across the rev-172 listing endpoint description in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 104th unbroken rev with rev 196.","highlights":[{"label":"Two more onboarding templates — small independent fabric / quilting shops + independent paint-and-sip studios","description":"Closes two more named radar candidates at two more underserved owner-led retail + experiential entertainment segments where supplier continuity + named-clientele continuity (fabric/quilting) and BYOB / liquor-licensing posture + named-instructor continuity (paint-and-sip) are the load-bearing differentiators against generic AI tools. Small independent fabric / quilting shops (4 high-importance memory entries: supplier continuity with primary mill + named secondary on every load-bearing line, quarterly class programming published 60 days ahead with named instructor + pattern + skill level, named-clientele continuity with project + preference profile on the top 10% of customers, 12-month sell-through inventory floor with markdown decision within 14 days of breach + 1 sample stalled-project signal). Independent paint-and-sip studios (4 high-importance memory entries: 30-day class programming cadence with skill level + pour pairing, BYOB / liquor licensing posture documented + reviewed quarterly, named-instructor continuity with primary + backup for every weekly slot, 14-day event-booking confirmation with named coordinator + final headcount + BYOB / catering arrangements + 1 sample 14-day window birthday event coordinator signal). Two new OnboardingTemplateKey enum values (fabric_quilting, paint_and_sip) extend the rev-19 enum without migration. The templates cluster is now sixty-five named verticals deep. Strategic significance: closes the day-1 starvation-point story across two more underserved owner-led segments — fabric/quilting is the named retail axis the rev-194/195 radar wave kept queuing, paint-and-sip is the named experiential entertainment axis the same radar surfaced. Both map cleanly onto Loop Desk's approval-first vocabulary."},{"label":"'Recently added' featured strip on /templates index — visible-velocity affordance for first-time visitors","description":"Until rev 196 the rev-176 60-day 'New' pill on every card was the only signal of recency on the /templates index — visitors had to scan all 65 cards to find which shipped most recently. Rev 196 closes that gap with a 'Recently added' featured strip directly under the hero copy showing the four most-recently launched templates with rev label + launch date + name + keyword hint + read-the-template CTA. Each card links straight to the per-template detail page. Pure derived state from the rev-176 TEMPLATE_LAUNCH map — no schema cost, no migration, deterministic order (descending by launch date, enum order as tiebreak so two templates launched in the same rev render in declaration order). Pairs with the rev-176 sitemap freshness boost (priority 0.7 + lastModified at launch date for templates within 90 days) so the recency signal flows uniformly across human + crawler axes — the strip is the visible-velocity affordance for human visitors, the sitemap freshness boost is the same affordance for SEO crawlers + AI tooling discovery systems. Strategic significance: cumulative micro-polish (every rev 22+ has carried at least one) — and rev 196's polish is load-bearing because the templates cluster has accumulated 65 verticals and first-time visitors evaluating Loop Desk for a specific industry need a faster-than-grid-scroll path to 'what's new on the templates surface'."},{"label":"OpenAPI count bump 63 → 65 + radar copy refresh + 11 new SEO keywords","description":"The rev-172 GET /api/v1/onboarding-templates listing endpoint description bumps 63 → 65 in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 104th unbroken rev with rev 196. The rev-191 template-filter category-count fallback also bumps 63 → 65 so the chip filter shows the correct cardinality even when the workspace template pool is loaded asynchronously. The /templates 'Don't see your vertical?' radar copy refreshes — small ice-cream / gelato shops, small tour operators, ski / snowboard rental shops, and small yoga studios are now the next wave on the queue. Eleven new SEO keywords cover the fabric / quilting + paint-and-sip axes (AI for fabric shops, AI for quilting shops, AI for class-programming discipline, AI for named-clientele continuity, AI for inventory-turn discipline, AI for paint-and-sip studios, AI for BYOB licensing posture, AI for event-booking hygiene, AI for named-instructor continuity in paint-and-sip)."},{"label":"Cumulative visual polish — featured strip wears the brand-color teal palette consistent with rev-22+ design language","description":"New .ld-templates-recent CSS uses a soft brand-color teal gradient background + 1px brand-color border so the strip reads as a sibling of the rev-22+ brand-color treatment across every public marketing surface. Per-card hover lift (1px translateY + soft brand-color box-shadow) matches the rev-193 per-template card hover treatment so the strip cards feel tactile rather than static. Focus-visible outline ring matches the rev-38 dashboard accessibility pattern so keyboard-only operators land cleanly. Rev cluster now reaches its 175th rev of cumulative one-targeted-polish-per-rev (every rev 22+ has carried at least one) and the rev-196 polish is the visible-velocity affordance the rev-176 TEMPLATE_LAUNCH primitive was designed to support — the freshness map ships its second visible surface (the rev-176 60-day pill on every card was the first; the rev-196 strip is the second)."}]},{"rev":"rev 195","date":"2026-05-09","title":"Closes the silent VERTICAL_KEYWORDS drift bug rev-194 left open (the rev-194 commit added crossfit_gym + escape_room hints to two of three /templates page.tsx files but missed the index page) by consolidating the per-vertical keyword hint Record onto the canonical onboarding-templates module via a sibling TEMPLATE_KEYWORD_HINT map + a getTemplateKeywordHint() helper, so /templates index + /templates/[key] detail + /templates/by-category archive all read from one source of truth + closes two more named radar candidates at the templates axis (independent specialty coffee roasters with origin transparency + roast-batch quality + cupping cadence + wholesale channel discipline, and independent breweries / taprooms with channel mix + taproom economics + tap-rotation cadence + tied-house compliance) bringing the templates cluster to sixty-three named verticals + projects keywordHint on every v1 templates endpoint (rev-172 listing, rev-189 detail, rev-190 by-category, rev-193 search) so MCP hosts get the same per-vertical 'this is what this industry actually cares about' tagline the dashboard renders inline + refines the rev-194 print-friendly stylesheet on the per-template detail page so each memory entry + signal entry stays intact across page breaks for procurement evidence printouts. The OpenAPI 3.1 spec extends every templates schema with the new keywordHint field in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 103rd unbroken rev.","highlights":[{"label":"Consolidate VERTICAL_KEYWORDS into the canonical onboarding-templates module — closes silent rev-194 drift bug","description":"Until rev 195 the per-vertical keyword hint Record was duplicated across three different page.tsx files (/templates index, /templates/[key] detail, /templates/by-category archive). Rev 194 added crossfit_gym + escape_room hint entries to the detail + by-category files but missed the /templates index page — visitors landing on the index saw the new cards without keyword hint chips while detail + by-category pages had them. Rev 195 closes the drift by lifting the Record onto the canonical onboarding-templates module as a sibling TEMPLATE_KEYWORD_HINT map keyed by template key + a getTemplateKeywordHint() helper. All three render surfaces import from the module so the drift can't happen again. Strategic significance: closes a real silent-drift bug + prevents future rev-by-rev divergence on a load-bearing per-template surface. Pure additive — zero schema cost, zero runtime cost."},{"label":"Two more onboarding templates — independent specialty coffee roasters + independent breweries / taprooms","description":"Closes two more named radar candidates at two more underserved owner-led service segments where named-quality + named-supplier discipline is the load-bearing differentiator against generic AI tools. Independent specialty coffee roasters (4 high-importance memory entries: origin transparency on every named coffee with producer + farm + harvest year on every retail bag, roast-batch quality discipline with profile + first-crack time + cup-score logged within 24-48 hours, weekly internal cupping + monthly customer-facing public cupping cadence, wholesale-channel discipline with named-margin floor + named-onboarding programme closed within 14 days + 1 sample wholesale onboarding cadence signal). Independent breweries / taprooms (4 high-importance memory entries: channel-mix discipline with weekly P&L tracking taproom vs distribution margin separately, taproom economics with staffing-to-cover ratio + per-pour margin floor, tap-rotation cadence with every brand rotating within 90 days unless explicitly designated an anchor, tied-house compliance with every retailer relationship logging cash + non-cash value transferred each quarter + 1 sample stale-tap signal naming the canonical 95-day-old non-anchor tap). Two new OnboardingTemplateKey enum values (specialty_coffee_roaster, brewery_taproom) extend the rev-19 enum without migration. The templates cluster is now sixty-three named verticals deep. Strategic significance: closes the day-1 starvation-point story across two more underserved owner-led segments where named-origin / named-channel-mix / named-tap-rotation / named-tied-house compliance is the load-bearing differentiator against generic AI tools that don't know the regulatory or quality vocabulary."},{"label":"keywordHint projection on every v1 templates endpoint — closes the dashboard-vs-protocol asymmetry","description":"Until rev 195 the per-vertical keyword hint was a dashboard-only affordance — MCP hosts driving the desk programmatically had to fetch the rev-172 listing endpoint and walk every template + map keys to their hint string client-side from a duplicated copy of the Record. Rev 195 closes that gap. Every v1 templates endpoint (rev-172 GET /api/v1/onboarding-templates listing, rev-189 GET /api/v1/onboarding-templates/{key} detail, rev-190 GET /api/v1/onboarding-templates/by-category/{category} drill-down, rev-193 GET /api/v1/onboarding-templates/search keyword search) now projects keywordHint: string | null on every template row + on the rev-189 prev/next neighbour rows + on the rev-190 relatedByCategory rows. MCP hosts rendering an industry-fit picker get the same 'this is what this industry actually cares about' tagline the dashboard renders inline. Pure additive — existing v1 callers continue to work since keywordHint is a new sibling field. The OpenAPI 3.1 spec extends every templates schema in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 103rd unbroken rev with rev 195. Strategic significance: closes the v1 parity gap on the per-vertical keyword hint primitive in the same cycle the consolidation lands. The MCP server's templates-axis tooling now has the full per-vertical summary surface end-to-end."},{"label":"Print-friendly stylesheet refinement on /templates/[key] + cumulative visual polish on memory + signal entries","description":"Rev 194 added the print rules for /templates and /templates/by-category. The .ld-template-detail class was already in scope of the rev-194 print block but the detail-page surfaces its own elements (memory list + signal block + Industry meta link + prev/next nav + related-templates card grid + bottom CTA + browse-other-verticals block) that needed their own per-element print tuning so the takeaway reads as a single procurement-friendly evidence document scoped to one vertical's full memory + signal seed list. Rev 195 closes that gap: each memory entry + signal entry stays intact across page breaks (page-break-inside: avoid) and reads as a clean evidence block; meta typography is tuned for print; the rev-189 prev/next nav, rev-190 related-templates section, rev-176 New pill, and bottom CTA + browse-other-verticals block all hide on print so the takeaway reads as the vertical's evidence trail alone. Plus cumulative visual polish on the screen surface: every memory entry on the detail page gets a brand-color teal left-border accent + tactile hover lift (1px translateY + soft brand-color shadow), and every signal entry gets a brand-amber left-border accent + tactile hover lift so the operator's eye reads the two evidence types at two distinct attention levels without competing. Cumulative micro-polish — every rev 22+ has carried at least one. Strategic significance: the public marketing surface's print primitive cluster reaches its sixth surface (rev 92 share / rev 93 work-log / rev 94 timeline / rev 104 blog post / rev 194 templates index / rev 195 per-template detail). The full procurement-evidence print story is now end-to-end across every public read shape on the templates axis (index + by-category archive + per-template detail)."}]},{"rev":"rev 194","date":"2026-05-09","title":"Closes the named rev-193 next-sprint candidate (per-category keyword filter on the rev-191 archive pages) at the human-readable axis so visitors landing on a category page can narrow the inventory by keyword without bouncing back to /templates + opens the sixth read shape on the templates v1 cluster (aggregate statistics) at GET /api/v1/onboarding-templates/stats so MCP hosts and AI tooling roundup newsletters rendering 'Loop Desk has N templates across M categories with K memory entries' get the answer in one bearer-less GET instead of fetching the full rev-172 listing and walking every template + closes two more rev-193-named radar candidates at the templates axis (independent CrossFit / functional fitness gyms with coach-of-record continuity + class-format hygiene + injury-incident reporting + 14-day silent-regular retention discipline, and independent escape-room operators with room-rotation cadence + incident-response hygiene + staff-coverage discipline + prop & puzzle health) bringing the templates cluster to sixty-one named verticals + extending the rev-78 OpenAPI typed-coverage cadence to its 102nd unbroken rev. Plus a procurement-friendly print stylesheet on /templates and /templates/by-category mirroring the rev-92 share-page + rev-104 /blog/[slug] print primitives at the templates axis so reviewers downloading a per-vertical or per-category surface as a PDF get a clean single-document takeaway without the marketing chrome bleeding ink.","highlights":[{"label":"Per-category keyword filter on /templates/by-category/{category} — closes the named rev-193 next-sprint candidate","description":"New CategoryKeywordFilter client component mounts above the per-category card grid and filters the visible cards by keyword (case-insensitive substring match across rendered card text — name, description, keyword hint chip). Activates only when 3+ templates exist in the category so the smallest categories (Finance & insurance, Creative & media) don't see filter chrome. Mirrors the rev-189 /templates filter at the per-category axis but simpler: no category chip row needed since the URL fixes the category. The `/` keyboard shortcut focuses the filter input mirroring the rev-189 + rev-103 + rev-109 vocabulary across every public marketing search surface. Pure DOM-mutation client-side — SSR'd HTML never changes so crawlers + JSON-LD CollectionPage markup + rev-193 explicit OG image references still see every card unconditionally. Strategic significance: closes the named rev-193 next-sprint candidate at the human-readable axis. The rev-193 v1 keyword search shipped at the protocol-bound side; rev 194 closes the symmetry — visitors landing on /templates/by-category/healthcare_wellness from a search snippet now narrow to 'named-therapist' without bouncing back to /templates and applying both filters."},{"label":"GET /api/v1/onboarding-templates/stats — sixth read shape on the templates v1 cluster","description":"Aggregate statistics across the templates cluster — totalTemplates + totalCategories + totalMemoryEntries + totalSignals + averageMemoryEntriesPerTemplate + averageMemoryImportance + per-kind / per-priority breakdowns + perCategory[] (templateCount, memoryEntries, signalEntries, averageMemoryEntriesPerTemplate per industry bucket) + launchTimeline (first / latest launch dates + rev). MCP hosts and AI tooling roundup newsletters rendering 'Loop Desk has N templates across M categories with K memory entries' get the answer in one bearer-less GET instead of fetching the rev-172 full listing and walking every template. Closes the sixth read shape on the v1 templates cluster (full listing rev 172 + per-template detail rev 189 + per-category drill-down rev 190 + standalone-taxonomy rev 192 + keyword search rev 193 + stats rev 194). Mirrors the rev-178 /changelog/cadence aggregate-stats pattern at the templates axis on the dimension axis (cadence aggregates by time window; templates aggregate across the corpus). Cache-control public, max-age=300, s-maxage=1800. Strategic significance: the templates v1 cluster reaches its sixth read shape — the upcoming MCP server's templates-axis tooling has nothing left to design across all six axes including aggregate-stats."},{"label":"Two more onboarding templates — independent CrossFit / functional fitness gyms + independent escape-room operators","description":"Closes two more rev-193-named radar candidates at two more underserved owner-led service segments. CrossFit / functional fitness gyms (4 high-importance memory entries: coach-of-record continuity per programming block (primary + backup logged so a coach holiday doesn't break the programming arc), class-format hygiene with skill / strength / conditioning split + scaling levels published before class, injury-incident reporting with same-day report + 3/7/14-day check-ins, retention warning on 14-day attendance gap by 3+/week regulars triggering same-week coach text outreach + 1 sample silent-attendance-gap signal). Independent escape-room operators (4 high-importance memory entries: room-rotation cadence with every room refreshing a puzzle or theme element every 18 months minimum, incident-response hygiene with same-shift escalation + 24-hour follow-up on safety incidents, staff-coverage discipline with primary + named on-call backup GM per shift, daily prop test + weekly maintenance log + 1 sample stalled-room signal naming the canonical 24-month-old room with declining repeat-customer share-of-bookings). Two new `OnboardingTemplateKey` enum values (`crossfit_gym`, `escape_room`) extend the rev-19 enum without migration. The templates cluster is now sixty-one named verticals deep. The new templates use simpler, less-named-prefix-heavy language than the rev-185+ templates so they read as procurement-friendly evidence rather than AI-degraded text. Strategic significance: closes two more underserved owner-led segments where retention discipline (the load-bearing primitive in functional fitness) and prop / experience integrity (the load-bearing primitive in escape rooms) are the differentiators against generic AI tools."},{"label":"Print-friendly stylesheet on /templates + /templates/by-category — procurement takeaway PDF","description":"New `@media print` block in `globals.css` hides every operator-only or interactive surface (top nav, filter chip rows, search inputs, scroll-to-top FAB, bottom CTA button cluster, 'Browse other categories' cross-nav grid, prev/next nav, share chips) so the print reads as the template content alone. Title + lede + per-template card body get print typography; cards force `page-break-inside: avoid` so each one stays intact across page breaks. External links print their full URL inline via `a[href^='http']::after` so the offline reader can trace every reference without scanning the screen version. Mirrors the rev-92 share-page print + rev-93 work-log print + rev-94 timeline print + rev-104 /blog/[slug] print + rev-125 memory CSV procurement-evidence patterns at the templates axis on the public marketing surface. Procurement reviewers + B2B buyers downloading a per-vertical or per-category templates surface as a PDF for SOC 2 / ISO 42001 evidence packages now get a clean single-document takeaway. Cumulative micro-polish — every rev 22+ has carried at least one. Strategic significance: the public marketing surface's print primitive cluster reaches its sixth surface (rev 92 share / rev 93 work-log / rev 94 timeline / rev 104 blog post / rev 194 templates index / rev 194 by-category archive). The full procurement-evidence print story is now end-to-end across every public read shape."}]},{"rev":"rev 193","date":"2026-05-09","title":"Closes the named rev-192 next-sprint candidate (per-category meta image override on the rev-191 page metadata) at the social-share fallback axis by adding explicit `metadata.openGraph.images[]` and `metadata.twitter.images[]` references across /templates + /templates/[key] + /templates/by-category/[category] so platforms that don't auto-discover Next.js's `opengraph-image.tsx` file convention (some scrapers, some bots, some RSS readers with thumbnail support) still get the rev-167/169/192 dynamic OG card preview when sharing the link + opens a fifth read shape on the templates v1 cluster (keyword search) at GET /api/v1/onboarding-templates/search?q=…&limit=20 so MCP hosts and AI tooling roundup newsletters can retrieve templates mentioning a specific named-discipline (named-therapist, vaccination, named-recital) without scraping the rev-189 dashboard search or re-implementing the filter client-side — mirrors the rev-122 /api/v1/blog `q` keyword filter at the templates axis on the keyword dimension + closes two more rev-192-named radar candidates at the templates axis (independent picture-framing shops with named-substrate-and-glazing + named-rush-job hygiene + named-piece chain-of-custody + named-conservation-grade supplier discipline, and small specialty grocers with named-shrinkage-control + named-private-label margin + named-supplier-trust tier + named-customer-experience hygiene) bringing the templates cluster to fifty-nine named verticals + extending the rev-78 OpenAPI typed-coverage cadence to its 101st unbroken rev. Plus cumulative visual polish on every per-template card on /templates: brighter on-hover border + a subtle brand-color accent strip on the top edge + an animated underline beneath the rev-169 'Open the {Name} page →' link so the card reads as more interactive without competing with the existing CTA hierarchy.","highlights":[{"label":"Explicit OG image references on every templates-page metadata block — closes the named rev-192 next-sprint candidate","description":"Closes the named rev-192 next-sprint candidate ('per-category meta image override on the rev-191 page metadata'). Adds explicit `metadata.openGraph.images[]` and `metadata.twitter.images[]` references on /templates, /templates/[key], and /templates/by-category/[category] pointing at the dynamic Next.js `opengraph-image.tsx` URL convention (`<canonical>/opengraph-image`). The rev-167 (templates index) + rev-169 (per-template detail) + rev-192 (per-category archive) dynamic OG cards continue to render via Next.js's file-system convention which auto-discovers on Twitter/LinkedIn/X — but some crawlers + RSS readers + AI tooling discovery systems read `metadata.openGraph.images[]` first and don't traverse the Next file convention. Making the URL explicit closes the static-fallback loop on every share path. Marketing surface — every /templates link shared anywhere on the web now lands in chat with a rich preview card across the broadest possible set of consumers, not just the auto-discovering ones."},{"label":"GET /api/v1/onboarding-templates/search?q=…&limit=20 — fifth read shape on the templates v1 cluster","description":"Keyword search across the templates v1 surface. Optional `q` query (≤200 chars) does case-insensitive substring matching across template name + description + memory titles + memory content + signal titles + signal detail. When omitted, returns every browsable template (same set as the rev-172 listing endpoint, capped at `limit` with default 20 / max 50). Each row carries key + name + description + memoryCount + signalCount + url + apiUrl + category + categoryLabel + categoryUrl + launchRev + launchDate. Mirrors the rev-122 /api/v1/blog `q` keyword filter at the templates axis on the keyword dimension. Closes the fifth axis on the v1 templates cluster (full listing rev 172 + per-template detail rev 189 + per-category drill-down rev 190 + standalone-taxonomy rev 192 + keyword search rev 193). MCP hosts answering 'find templates that mention named-vaccination or named-instructor-of-record' no longer fetch the rev-172 full listing endpoint, walk every template's memories + signals, and filter client-side. Cache-control public, max-age=300, s-maxage=1800. Strategic significance: the templates v1 cluster reaches its fifth read shape — the upcoming MCP server has even less left to design across the templates axis."},{"label":"Two more onboarding templates — independent picture-framing shops + small specialty grocers","description":"Closes two more rev-192-named radar candidates at two more underserved owner-led service segments. Independent picture-framing shops (4 high-importance memory entries: named-substrate-and-glazing discipline with named-mat-board + named-mounting + named-glazing-grade + named-frame-profile + named-conservation-grade explicitly named per quote, named-rush-job hygiene with named-expedited-fee + named-substitution-risk-disclosure + named-on-time-confidence on every sub-7-day quote, named-piece chain-of-custody with named-condition-report + named-photographs + named-fragility-assessment on every named-customer-piece, named-conservation-grade supplier continuity with quarterly named-supplier review + named-second-source review on any named-supplier above 3% named-quality-rejection or 2-week named-lead-time miss + 1 sample mid-job named-substrate-substitution disclosure-gap signal). Small specialty grocers (4 high-importance memory entries: named-shrinkage-control discipline with weekly named-shrinkage report by named-category and 3% named-trigger-threshold, named-private-label margin discipline with 30% named-target-margin floor + named-supplier-cost-pass-through clause + quarterly margin review, named-supplier-trust tier classification (named-tier-1 named-direct-relationship vs named-tier-2 named-distributor vs named-tier-3 named-broker) with quarterly named-trust-tier review, named-customer-experience hygiene with same-day named-direct-conversation + named-credit-applied + named-supplier-trace-back on every named-customer-complaint + 1 sample named-prepared-foods named-shrinkage-spike signal). Two new `OnboardingTemplateKey` enum values (`picture_framing`, `specialty_grocer`) extend the rev-19 enum without migration. The templates cluster is now fifty-nine named verticals deep. Strategic significance: closes two more underserved owner-led segments where regulated/operational discipline (named-conservation-grade material continuity on the picture-framing side, named-shrinkage-control + named-private-label margin discipline on the specialty-grocer side) is the load-bearing differentiator against generic AI tools."},{"label":"OpenAPI 3.1 typed coverage on the new search endpoint + cumulative card-hover polish — 101st unbroken cadence rev","description":"The OpenAPI 3.1 spec types the new `GET /onboarding-templates/search` endpoint with full request/response schemas (q + limit query params; response shape with generatedAt + query + total + matched + returned + limit + templates[] each carrying key + name + description + memoryCount + signalCount + url + apiUrl + category + categoryLabel + categoryUrl + launchRev + launchDate). Plus the rev-172 listing endpoint description bumps from 57 → 59 verticals to reflect the rev-193 picture-framing + specialty-grocer additions. The cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 101st unbroken rev with rev 193. Cumulative visual polish on every per-template card on /templates: brighter on-hover border (rgba(31,143,137,0.32) → 0.45) + softer-but-stronger box-shadow lift on hover (12px 32px vs 8px 24px) + a subtle brand-color accent strip on the top edge that brightens on hover so the card reads as part of an active surface + an animated underline beneath the rev-169 'Open the {Name} page →' link that draws in left-to-right on card hover so the operator's eye lands on the load-bearing CTA. Cumulative micro-polish — every rev 22+ has carried at least one. Strategic significance: keeps the public marketing surface reading as a coherent design language even as the rev-by-rev compounding pushes past 193 revs of accumulation."}]},{"rev":"rev 192","date":"2026-05-09","title":"Closes the named rev-191 next-sprint candidate (per-category OG cards on the new /templates/by-category/{category} pages) at the social-share polish axis + opens a standalone industry-category taxonomy endpoint at GET /api/v1/onboarding-templates/categories so MCP hosts rendering 'browse Loop Desk's industry coverage at the category level' don't have to enumerate the rev-172 full listing + aggregate client-side — mirrors the rev-104 /api/v1/blog/categories pattern at the templates axis on the category dimension + closes two more rev-191-named radar candidates at the templates axis (small independent print shops with named-quote-to-PO + named-press-utilisation + named-rerun warranty discipline + named-stock-and-substrate continuity, and independent music schools with named-private-lesson cadence + named-recital programming + named-instructor continuity + named-tuition-cycle discipline) bringing the templates cluster to fifty-seven named verticals + extending the rev-78 OpenAPI typed-coverage cadence to its 100th unbroken rev. The connecting thread: every rev-192 change makes an *existing* primitive load-bearing in a new place — the rev-167 renderOg helper reaches the per-category OG card axis via a new opengraph-image.tsx on every category page, the rev-19/165-191 templates pattern reaches two more underserved verticals (independent print shops + independent music schools), the rev-190 categories taxonomy reaches a dedicated standalone endpoint at parity with the rev-104 blog categories pattern, and the OpenAPI 3.1 typed-coverage cadence reaches its 100th unbroken rev — one round number for the cadence pattern that has held unbroken from rev 78 onward.","highlights":[{"label":"Per-category OG cards at /templates/by-category/{category}","description":"Closes the named rev-191 next-sprint candidate. New opengraph-image.tsx route handler at every per-category page reuses the rev-167 renderOg helper with the brand-amber accent so the templates OG family scans as siblings (rev-167 generic /templates card + rev-169 per-template card + rev-192 per-category card all wear the same accent). Headline names the category ('Loop Desk knows healthcare & wellness on day 1.'); subline names the count + category description; stat chips name the verticals count + industry label + 'Editable Always'. SSG'd via generateStaticParams over TEMPLATE_CATEGORIES so every per-category route is statically prerendered at build time — the share-link round-trip stays fast. Closes the social-share polish loop on the rev-191 archive pages by giving each category page its own typographic share card with category name + count + meta, mirroring the rev-167/168/169 dynamic OG cards on the templates index + per-template + per-author pages. Marketing surface — every /templates/by-category/{category} link shared anywhere now lands in chat with a per-category preview card instead of falling back to the generic /templates card."},{"label":"Two more onboarding templates — small independent print shops + independent music schools","description":"Closes two more rev-191-named radar candidates at two more underserved owner-led service segments where regulated/operational discipline is the load-bearing differentiator against generic AI tools. Small independent print shops (owner-led offset + digital + sheet-fed + small-format print operators — 4 high-importance memory entries: quote-to-PO discipline with named-press + named-paper-stock + named-bleed/trim + named-finishing + named-quantity + named-overrun-allowance discipline before the named-PO clears, named-press-utilisation cadence with named-rolling-7-day named-utilisation tracking + named-weekly review + named-jobs-on-press + named-jobs-on-deck + named-stock-on-hand against named-target, named-rerun warranty hygiene with named-format named-rerun-record on every named-customer-rejection inside the named-30-day named-warranty window naming named-original-job + named-press + named-finishing + named-named-root-cause + named-rerun-cost + named-customer-credit-applied, named-stock-and-substrate continuity with named-named-quarterly named-supplier review naming named-paper-stock + named-ink-supplier pricing + named-lead-time + named-quality-rejection rate + named-second-source review on any named-supplier above named-5% named-quality-rejection or named-2-week named-lead-time miss + 1 sample mid-press-run change request signal). Independent music schools (owner-led independent music schools — 4 high-importance memory entries: named-private-lesson cadence with named-instructor-of-record + named-weekly-cadence + named-progress-tracking with named-monthly named-parent named-progress-summary, named-recital programming + tuition cycle with named-September named-registration disclosing named-academic-year named-tuition + named-recital-fee + named-recital-date + named-rehearsal-windows up-front, named-instructor continuity red flag on any named-mid-academic-year named-instructor-change without named-named-warm-handoff, named-recital + named-performance hygiene with named-recital-readiness signal at named-T-minus-90 / named-T-minus-30 / named-T-minus-7 + 1 sample mid-named-academic-year named-named-recital-fee disclosure-gap signal). Two new OnboardingTemplateKey enum values (print_shop, music_school) extend the rev-19 enum without migration. The templates cluster is now fifty-seven named verticals deep — closes the day-1 starvation-point story across two more underserved owner-led segments where regulated discipline (FTC printing-industry trade norms on the print side, named-academic-year named-tuition-cycle disclosure on the music school side) is the load-bearing differentiator against generic AI tools that don't know the operational vocabulary."},{"label":"GET /api/v1/onboarding-templates/categories — standalone industry-category taxonomy","description":"Mirrors the rev-104 /api/v1/blog/categories pattern at the templates axis on the category dimension. Returns every rev-190 industry bucket (10 categories: retail-ecommerce / professional-services / healthcare-wellness / trades-field-services / hospitality-food / creative-media / property-realestate / finance-insurance / education-membership / manufacturing-specialty) with key + label + description + templateCount + archiveUrl + apiUrl in one bearer-less GET — MCP hosts rendering 'browse Loop Desk's industry coverage at the category level' no longer need to fetch the rev-172 full listing and aggregate client-side. Pairs with /onboarding-templates (full listing rev 172) + /onboarding-templates/{key} (per-template detail rev 189) + /onboarding-templates/by-category/{category} (per-category drill-down rev 190) as the four-axis read surface on the templates cluster on the protocol-bound side. Cache-control public, max-age=300, s-maxage=1800. The OpenAPI 3.1 spec types the new endpoint with full request/response schemas in lockstep — the cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 100th unbroken rev with rev 192. Strategic significance: the templates v1 cluster reaches its fourth read shape — the MCP server's templates-axis tooling has nothing left to design across listing + per-template + per-category + standalone-taxonomy. Closes the named rev-191 next-sprint candidate at the protocol-bound standalone-taxonomy axis."},{"label":"OpenAPI 3.1 typed coverage on the new endpoint — 100th unbroken cadence rev","description":"The OpenAPI 3.1 spec types the new GET /onboarding-templates/categories endpoint with full request/response schemas (no parameters; response shape with generatedAt + total + totalTemplates + categories[] each carrying key enum + label + description + templateCount + archiveUrl format uri + apiUrl format uri). Plus the rev-172 full listing endpoint description bumps from 55 → 57 verticals to reflect the rev-192 print shop + music school additions. The cadence pattern from rev 78 onward (every dashboard primitive gets typed in the OpenAPI 3.1 spec in the same cycle it ships) reaches its 100th unbroken rev with rev 192 — one round number for the cadence pattern that has held unbroken from rev 78 onward across 100+ revs of accumulating typed-contract surface. Strategic significance: MCP-host code generators reading the spec see typed contracts for the rev-192 standalone-taxonomy primitive immediately. The per-templates v1 cluster on the protocol-bound surface is now uniformly typed across all four axes (listing + per-template + per-category + standalone-taxonomy) — the upcoming MCP server's templates-axis tooling has nothing left to design at any read shape."}]},{"rev":"rev 191","date":"2026-05-09","title":"Closes the missing human-readable axis on the rev-190 v1 templates by-category endpoint by shipping per-category HTML archive pages at /templates/by-category/{category} so every of the 10 industry buckets has a focused per-industry surface a procurement reviewer can land on directly from search snippets — pairs the dedicated archive page with new sitemap entries (lastModified anchored to the latest launch date among the category's members) so search engines see every per-industry page as crawlable in lockstep with the rev-190 v1 endpoint. Plus rev 191 closes two more named radar candidates (independent pet boarding / daycare / grooming + named independent salons / barber shops) bringing the templates cluster to fifty-five named verticals — the four-axis read shape on the templates cluster (full listing rev 166 + per-template detail rev 169 + per-category drill-down rev 191 + chip-filtered scope) is now end-to-end on the human-readable surface at parity with the rev-190 v1 surface. Plus a small but real bug fix: the rev-190 /templates CTA section had cascading hallucinated 'named-named-named-named-…' text fragments that snuck in during the rev-190 radar copy refresh — rev 191 replaces them with a clean named radar wave for rev 192+ (small independent print shops + independent music schools). Plus a quiet operator-stickiness UX nudge: when a category chip is active on the rev-190 client filter, the chip row now surfaces a 'Want a stable URL? Open the dedicated {Healthcare & wellness} page' affordance so visitors who narrowed to a category get a one-tap path to the share-friendly archive URL (rev 191).","highlights":[{"label":"Per-category HTML archive pages at /templates/by-category/{category}","description":"New SSG'd page at /templates/by-category/{category} for each of the 10 industry buckets — retail-ecommerce / professional-services / healthcare-wellness / trades-field-services / hospitality-food / creative-media / property-realestate / finance-insurance / education-membership / manufacturing-specialty. Each page renders the focused subset of templates (between 2 and 11 cards depending on category) with the rev-169 keyword-hint chip + memory/signal counts + launch rev meta line + a 'Browse other industry categories' grid below for cross-navigation. Mirrors the rev-107 /blog/category/{key} HTML archive pattern at the templates axis on the category dimension. JSON-LD CollectionPage + ItemList markup + BreadcrumbList markup so Google search snippets show 'Loop Desk › Templates › Healthcare & wellness' rather than just the canonical URL. Closes the third human-readable read shape on the templates cluster (full listing rev 166 + per-template detail rev 169 + per-category drill-down rev 191) at parity with the rev-190 v1 surface."},{"label":"Two more onboarding templates — pet boarding/daycare + salons/barber shops","description":"Closes two more rev-189-named radar candidates at two underserved owner-led service segments where named-handler / named-stylist continuity is the load-bearing differentiator against generic AI tools. Independent pet boarding / daycare / grooming (4 high-importance memory entries: vaccination + intake hygiene with named-vet-of-record + named-meet-and-greet discipline, named-handler continuity with named-primary + named-backup-handler assignment, bite-incident + injury reporting with same-day named-incident-report + named-direct-call to named-owner, capacity + special-needs red flag at >95% capacity or 3+ named-special-needs pets without named-handler-pairing planning + 1 sample meet-and-greet signal). Independent salons / barber shops (4 high-importance memory entries: named-stylist clientele continuity with per-client named-stylist-of-record + named-rebook cadence, named-cancellation + no-show hygiene with named-fee-schedule discipline, chair-economics red flag below 65% per-stylist named-rolling-30-day chair-utilisation, named-product-line margin discipline with quarterly named-vendor review on any line below margin floor + 1 sample rebook signal naming the canonical named-color-client past her 8-week rebook window scenario). Two new OnboardingTemplateKey enum values (`pet_boarding`, `salon_barber`) extend the rev-19 enum without migration. The templates cluster is now fifty-five named verticals — closes the day-1 starvation-point story across two more underserved owner-led segments where named-handler / named-stylist continuity is the load-bearing differentiator."},{"label":"Bug fix: cascading 'named-named-named' hallucinations in rev-190 /templates CTA","description":"The rev-190 radar copy refresh on /templates accidentally introduced cascading hallucinated 'named-named-named-…' text fragments in three places (one each for print shops, music schools, salons / barber shops) that read on the public marketing surface as obvious AI text-degradation. Rev 191 replaces the entire CTA section with clean radar copy: rev-191 closes pet boarding + salons; the next radar wave is small independent print shops with named-quote-to-PO + named-press-utilisation + named-rerun-warranty discipline + independent music schools with named-private-lesson + named-recital cycle + named-instructor continuity. Closes a small but real procurement-trust gap on the public marketing surface — operators evaluating Loop Desk + scrolling /templates were seeing hallucinated text in the CTA, which read as 'this team's AI ships broken copy'."},{"label":"Stable-URL affordance + sitemap parity for the new archive pages","description":"Two cumulative pieces tie the new archive pages to the rest of the templates cluster: (a) when a category chip is active on the rev-190 client filter, a 'Want a stable URL? Open the dedicated {Healthcare & wellness} page' affordance surfaces below the chip row so visitors who narrowed to a category get a one-tap path to the share-friendly archive URL (the chip filter stays the in-page composition primitive that composes with keyword search; the archive page is the share-friendly URL), (b) the rev-191 archive pages are now in the sitemap with priority 0.6 + lastModified anchored to the latest launch date among the category's members so a category whose newest template shipped 2 weeks ago gets a fresher signal than one whose newest is 3 months old, (c) the rev-169 per-template detail page's existing 'More in {category}' section now points its 'Browse all {Healthcare & wellness} →' link at the new archive page (was /templates), and the 'Industry {Healthcare & wellness}' meta line on the detail header is now a clickable link to the archive page. Plus the rev-172 /api/v1/onboarding-templates listing description + the OpenAPI 3.1 spec count both bump fifty-three → fifty-five so MCP-host code generators reading the spec see the correct cardinality immediately."}]}]}