Skip to content

Feat/production readiness 2026 04 17#5

Open
EfeDurmaz16 wants to merge 34 commits intomainfrom
feat/production-readiness-2026-04-17
Open

Feat/production readiness 2026 04 17#5
EfeDurmaz16 wants to merge 34 commits intomainfrom
feat/production-readiness-2026-04-17

Conversation

@EfeDurmaz16
Copy link
Copy Markdown
Owner

No description provided.

EfeDurmaz16 and others added 30 commits April 18, 2026 20:36
The ThemeProvider in apps/web/src/app/layout.tsx is configured with
attribute="data-theme", but globals.css declared the Tailwind v4 dark
custom-variant against `.dark *` only. As a result, no `.dark` class
was ever applied to <html>, and all Tailwind dark:* utilities were
dead code — CSS variables flipped via [data-theme="dark"] selectors
but Tailwind utilities did not.

Extend the dark variant to match both selectors:
  @custom-variant dark (&:is([data-theme="dark"] *, .dark *));

Blast radius: unlocks ~445 previously-dead dark:* utility occurrences
across ~80 files. Also future-proofs a potential migration back to
attribute="class" (Next-Themes default) without breaking anything.
Replace the hardcoded 'placeholder' user_id in the timeline page with
the authenticated user's Convex id, resolved via useAuth + users.getByWorkOSId.
Gate the page with loading and sign-in redirect states so unauthenticated
visitors cannot observe another user's commit feed.
Replace the dead Manage Subscription placeholder with a button that
POSTs to /api/billing/portal and redirects to the Stripe-hosted
customer portal session URL. Surfaces loading and error states so
users get feedback when the portal cannot be opened (e.g. no billing
account yet).
Bulk-removed ~422 duplicate files and ~74 duplicate directories with
space+digit suffixes (e.g. ` 2.tsx`, ` 3.ts`, `[hash] 2/`) left behind
by macOS Finder / iCloud sync. Categories removed:

- API route duplicates (apps/web/src/app/api/**/{route,verify,webhooks} 2..6)
- Page/layout/globals/middleware/proxy duplicates in apps/web
- Mobile and desktop app duplicates
- services/api, services/agents, services/eval, services/model-router dupes
- packages/db, packages/shared-types, packages/aspendos-openclaw skill dupes
- infra/{docker,helm} 2..5 dirs
- docs concept and getting-started dupes
- klaros subproject dupes

Safety verified: zero static imports (`from '... [2-9]'`) and zero
dynamic imports/requires reference these paths. Typecheck run on
apps/web after deletion — no new errors introduced (pre-existing
unrelated errors in messaging/convex/prisma remain, none point to
a removed file).

Also eliminates an unintended attack surface: Next.js route folders
like `api/webhooks/slack 2/` were reachable as URL-encoded routes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- docs/launch/2026-04-17-production-readiness-plan.md: phased rollout
  plan synthesized from 5 parallel audit agents
- apps/web/src/app/login/layout.tsx, signup/layout.tsx: SEO metadata
  for WorkOS-backed auth pages (surviving the Clerk→WorkOS revert)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…tier

4 canonical SVG variants in /brand/:

- yula-mark.svg      — primary mark (color, innermost tier = orange #FF8A3D)
- yula-mark-mono.svg — theme-adaptive, uses currentColor everywhere
- yula-favicon.svg   — 32×32 optimized with bg, simplified for OS chrome
- yula-wordmark.svg  — mark + "yula" Manrope 800 lockup

Design rationale:
- Aspendos Roman theater cavea silhouette (Anatolian heritage tied to
  the product's origin). 3-tier amphitheater read as audience witnessing
  a stage — maps to the audit-log mental model.
- The innermost tier is filled with a warm accent (#FF8A3D) honoring
  the Old Turkic etymology of "yula" = torch/flame (Kutadgu Bilig 1070).
  Illustrative flame was tried and dropped — the tonal reference is
  cleaner and avoids literal-shape pitfalls.
- Brand-ownable. No other SaaS uses this silhouette.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds scripts/generate-brand-assets.ts (sharp + png-to-ico) that rasterizes
brand/yula-mark.svg and brand/yula-favicon.svg into the full production
asset set under apps/web/public/:
  - logo.png (512), logo.svg, favicon.svg, favicon.ico (16/32/48)
  - apple-touch-icon.png (180)
  - icons/icon-{72,96,128,144,152,192,384,512}.png (both suffixes)
  - og/home.png (1200x630 dark OG card with mark + YULA + tagline)
  - screenshots/chat-{desktop,mobile}.png placeholders to silence 404s

Run via `bun run brand:generate`.
Delete SiteDock, Dock UI primitive, and unused ShortcutsDock.
Strip SiteDock render from marketing layout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…/Llama 4

Replaces retired model IDs (gpt-4o, claude-3-*, gemini-2.0-flash, llama-3.*,
mixtral-8x7b-32768) with the current April 2026 lineup:
- OpenAI: gpt-5, gpt-5-mini (display: GPT-5.4)
- Anthropic: claude-sonnet-4-6, claude-haiku-4-5, claude-opus-4-7
- Google: gemini-2.5-pro, gemini-2.5-flash
- Groq: llama-4-maverick (70B class), llama-4-scout (8B class, router)

DEFAULT_* exports preserved. MODEL_REGISTRY, FALLBACK_CHAIN,
getModel/getRouterModel/getFallbackRouterModel signatures unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…odels

Replace retired llama-3.*, mixtral-8x7b-32768, gpt-4o, claude-3-* keys
with gpt-5/gpt-5-mini, claude-sonnet-4-6/haiku-4-5/opus-4-7, llama-4-maverick/scout.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces generic Phosphor glyphs (ChatTeardropDots, Envelope, Lock) in the
'Works everywhere' surfaces grid with real brand marks.

- Added apps/web/public/logos/ with 8 SVGs from iconify (logos:* for 6,
  simple-icons:googlechat + simple-icons:imessage for the two missing ones).
- New <PlatformIcon /> client component (apps/web/src/components/platform-icon.tsx):
  Brandfetch CDN primary (32px@2x), local SVG fallback via onError.
- next.config.ts: whitelisted cdn.brandfetch.io in images.remotePatterns.
- .env.example: NEXT_PUBLIC_BRANDFETCH_CLIENT_ID documented + optional.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace placeholder 'github.com/aspendos' (nonexistent org) with the actual
repo URL in landing CTAs and footer. structured-data.tsx / metadata.ts are
owned by the brand-assets agent and intentionally untouched here.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- useAutoRouting model registry, fallbacks, routing heuristics, reasoning strings
- lib/ai/router.ts: TIER_MODEL_MAP, constrainModelToTier default, fastRoute models,
  ROUTER_SYSTEM_PROMPT guidance examples
- lib/ai/memory.ts: gpt-4o-mini → gpt-5-mini
- lib/ai/generate.ts: createCodingCompletion (Claude Sonnet 4.6),
  createFastCompletion (gpt-5-mini), sentiment extractor (llama-4-scout)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Textarea min-h-16 -> min-h-10, max-h-48 -> max-h-40
- Wrapper padding p-3/sm:p-4 -> px-3 py-2 / sm:px-4 sm:py-2
- Caption mt-2 -> mt-1
- Header (attachments) now renders conditionally when files.length > 0

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ROUTER_MODEL → llama-4-scout, FALLBACK_ROUTER_MODEL → llama-4-scout.
Default model strings across streaming/completion wrappers updated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- PromptInputTools gap-1 -> gap-2
- Insert thin vertical divider between the attachment action menu
  and the Search/Council/Mode/Voice toolbar group

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
FeaturesIndexPage + CompareIndexPage hero / CTA copy previously pitched
'most advanced unified AI platform' — replaced with the deterministic-agent
positioning used on the landing hero (signed, logged, approval-aware,
reversible where supported). Model-name lists are untouched (owned by the
models-agent).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This 900-line component had 9+ hardcoded hex colors and is not
referenced anywhere in the app. Delete rather than tokenize — the
project uses ai-elements/prompt-input as the real composer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
REVERSIBILITY_CLASSES (R0-R4) previously hard-coded hex colors and rgba
backgrounds directly in the component, bypassing the theme. Moved to
--r0-* through --r4-* CSS variables in globals.css with dedicated dark-mode
overrides (slightly brighter/desaturated) so the badges read well in both
themes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- model-picker: Yula mode presets → GPT-5/Sonnet 4.6/Haiku 4.5/Gemini 2.5 Flash
- model-selector: default selectedModel → groq/llama-4-maverick
- add-models-modal: OpenAI (GPT-5.4 family), Anthropic (Opus 4.7/Sonnet 4.6/Haiku 4.5),
  Google (Gemini 2.5 Pro/Flash/Flash Lite). Removed retired SKUs (Opus 4/4.1/4.5,
  Sonnet 4/4.5, GPT-5.1/5.2 family, Gemini 3 previews).
- settings/page: defaultModel → gpt-5, model list refreshed
- yula-store: preferredModels → gpt-5 + claude-opus-4-7
- chat-input label GPT-4o → GPT-5
- computer-use + messaging/bot: claude-sonnet-4-20250514 → claude-sonnet-4-6
- use-gemini-live: gemini-2.0-flash-live → gemini-2.5-flash-live
- step-middleware jsdoc comment: openai('gpt-4o') → openai('gpt-5')

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace hardcoded white/zinc with semantic tokens (bg-card, border-border,
text-foreground, text-muted-foreground, bg-foreground/N) so the graph
renders correctly in both light and dark themes. Icons that sit on
colored category pills keep text-white — that's color-on-color and
theme-independent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The /yula page used hardcoded text-white/bg-white/5 styling that does
not flip with theme. It is not linked from anywhere in the app (only
mailto:support@yula.dev appears, unrelated). Deleting rather than
tokenizing a dead prototype.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- ai-providers: SUPPORTED_MODELS + FALLBACK_CHAIN + downgrades → GPT-5,
  Claude Opus 4.7 / Sonnet 4.6 / Haiku 4.5, Gemini 2.5 Pro/Flash, Llama 4 family
- model-fallback: same chains
- cost-tracker MODEL_PRICING + usage-ledger MODEL_PRICING_TABLE updated with
  recent-public pricing for new model IDs. NOTE: prices should be reviewed
  against live provider pages before production launch.
- context-compression router: llama-3.1-8b-instant → llama-4-scout
- webhook-events examples: gpt-4o → gpt-5, gemini-2.0-flash → gemini-2.5-flash,
  claude-sonnet-4-5 → claude-sonnet-4-6
- openapi-spec enum + examples refreshed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…dels

- commitment-detector, memory-agent, council default model IDs
- billing.service MODEL_PRICING refreshed (GPT-5/Claude 4.6+4.7+4.5/Gemini 2.5/Llama 4)
- council personas: Scholar→llama-4-maverick, Visionary→claude-sonnet-4-6,
  Pragmatist→llama-4-scout, Devil's Advocate→gpt-5 (cross-provider diversity)
- routes/chat, models, council, scheduler, admin default/fallback model IDs
- routes/models pinned list refreshed (groq/llama-4 + anthropic/claude-sonnet-4-6 + openai/gpt-5)
- validation/chat.schema multiModelSchema default array refreshed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…nt model IDs

- tiers.ts supportedModels: gpt-5-mini / claude-haiku-4-5 / gemini-flash
- cost-tracker.test: claude-sonnet-4-6, gemini-2.5-flash, llama-4-maverick keys
- metrics.test claude-3-5-haiku → claude-haiku-4-5
- Remaining test fixtures across middleware/__tests__, integration/,
  lib/__tests__, routes/__tests__ rewritten to GPT-5/Claude 4.6-4.7-4.5/
  Gemini 2.5/Llama 4 identifiers
- council.ts doc comments refreshed

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…rrent models

- README code example: gpt-4o → gpt-5
- packages/sdk JSDoc example: ['gpt-4', 'claude-3'] → ['gpt-5', 'claude-opus-4-7']
- services/eval package.json: gaia:groq → llama-4-maverick, gaia:gpt → gpt-5
- services/agents env.example DEFAULT_MODEL → gpt-5

Note: packages/sdk/README.md is gitignored; skipped.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace bg-white dark:bg-zinc-*, text-zinc-*, border-zinc-* pairs with
semantic tokens (bg-background, bg-card, bg-muted, border-border,
text-foreground, text-muted-foreground, bg-primary/text-primary-foreground).
Now that Wave A made dark: variants fire, these pages render correctly
in both themes. Icons on colored category pills keep text-white —
color-on-color is theme-independent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…gpt-5-mini)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace hardcoded white/zinc pairs with semantic tokens
(bg-card, bg-muted, border-border, text-foreground,
text-muted-foreground) across pac-settings, pac-notification,
PACNotifications, and ScheduledIndicator. Keep the one intentional
bg-feature-pac text-white pairing — that's a brand color swatch
with white icon on it, theme-independent.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace hand-rolled Y-monogram placeholders with the canonical
<LogoMark /> component so every branded surface shares one source of
truth (brand/yula-mark.svg).

Files changed:
- apps/web/src/components/chat/chat-sidebar.tsx  (header mark, 32px)
- apps/web/src/app/chat/page.tsx                 (EmptyState mark, 40px)
- apps/web/src/app/reset-password/page.tsx       (auth lockup, 28px mono)
- apps/web/src/app/forgot-password/page.tsx      (auth lockup, 28px mono)
- apps/web/src/app/verify-email/page.tsx         (auth lockup, 28px mono)

Auth pages use variant="mono" with text-zinc-900 dark:text-zinc-100 on
the wrapper so the mark inherits currentColor and keeps the existing
light/dark flip. Chat surfaces keep the default color variant (orange
inner tier) on text-foreground.

No interaction state was removed — the old elements were static
presentational <div>s with a <span>, matched 1:1 with the new mark.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
EfeDurmaz16 and others added 3 commits April 18, 2026 22:00
Updates Gemini model IDs across the codebase from stale 2.5/2.0 IDs to the
current April 2026 lineup verified against ai.google.dev/gemini-api/docs:

  gemini-2.5-pro      -> gemini-3.1-pro-preview       (display: Gemini 3.1 Pro)
  gemini-2.5-flash    -> gemini-3-flash-preview       (display: Gemini 3 Flash)
  gemini-2.0-flash    -> gemini-3-flash-preview
  (new)               -> gemini-3.1-flash-lite-preview (display: Gemini 3.1 Flash Lite)

Also adds gpt-5.4-codex to the OpenAI model list for the unified agentic
coding model, updates registry entries, fallback chains, and tier-aware
model maps accordingly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Gemini 3 pricing verified against ai.google.dev/gemini-api/docs/pricing
(April 2026, standard tier paid):

  gemini-3.1-pro-preview       $2.00 / $12.00 per 1M  (<=200k prompt)
  gemini-3-flash-preview       $0.50 / $3.00  per 1M
  gemini-3.1-flash-lite-preview $0.25 / $1.50 per 1M

OpenAI GPT-5.4 pricing could not be fetched from platform.openai.com/docs
(403). Using placeholder rates matching previous gpt-5 entries with a
TODO(pricing) comment to verify before launch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Updates GPT-4o/GPT-5.2/Gemini 1.5/Gemini 2.0 references in SEO structured
data, GEO content, privacy/terms pages, and competitor-comparison pages to
the current GPT-5.4 and Gemini 3.x model families.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 18, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
aspendos-deploy Error Error Apr 22, 2026 2:35pm

Request Review

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant