Skip to content

[RACC] INKSPIRE — Marketplace premium de tatuajes en Chile 🇨🇱✨#265

Open
rchamycruz wants to merge 67 commits into
LIDR-academy:mainfrom
rchamycruz:feature-entrega2-RACC
Open

[RACC] INKSPIRE — Marketplace premium de tatuajes en Chile 🇨🇱✨#265
rchamycruz wants to merge 67 commits into
LIDR-academy:mainfrom
rchamycruz:feature-entrega2-RACC

Conversation

@rchamycruz

Copy link
Copy Markdown

🎨 INKSPIRE — La vitrina digital del tatuaje

Autor: Rodrigo A. Chamy Cruz (RACC)
Proyecto final — AI4Devs Master


🚀 ¿Qué es INKSPIRE?

INKSPIRE es un marketplace premium de tatuajes que conecta clientes con artistas certificados en Chile. Desde la búsqueda hasta el pago del depósito, todo en una sola plataforma — sin DMs, sin sorpresas.

🏗️ Stack tecnológico

Capa Tecnología
Frontend Angular 20 · TypeScript · SCSS · Material M3 (tema oscuro/dorado)
Backend .NET 10 Web API · Entity Framework Core · PostgreSQL 16 + PostGIS
Pagos Flow.cl (sandbox validado e2e con Webpay)
Infraestructura Docker Compose · GitHub Actions CI
IA Chatbot cotizador con estimación de precios en tiempo real

✨ Funcionalidades implementadas (13 US · 80 Story Points)

🔐 Autenticación

  • Login/registro con JWT · Roles cliente/artista

🔍 Descubrimiento

  • Vitrina principal con artistas destacados, estilos populares y carruseles
  • Búsqueda y filtros avanzados: estilo, comuna, precio, rating, certificación, premios
  • Mapa interactivo con geolocalización (Leaflet + PostGIS)
  • Favoritos con persistencia local

💬 Cotización inteligente

  • Chatbot IA de cotización por pasos (zona, tamaño, estilo, color, cover-up)
  • Modo general (promedio de artistas) y modo específico por artista
  • Estimación instantánea con factores de precio desglosados

📅 Reserva y pago

  • Calendario semanal con slots disponibles en tiempo real
  • Hold de 5 minutos con TTL automático
  • Pago de depósito vía Flow (integración real validada contra sandbox Webpay)
  • Resumen de reserva y confirmación

⭐ Post-sesión

  • Historial de reservas con estados (pendiente → confirmada → completada)
  • Confirmación de asistencia
  • Calificación en 4 dimensiones (técnica, higiene, trato, puntualidad)
  • Badges: verificado, certificación sanitaria, premiado, auspiciado

📊 Métricas del proyecto

Métrica Valor
User Stories completadas 13/13 (9 Must-Have + 4 Should-Have)
Story Points entregados 80 SP
Tests backend 109 ✅
Tests frontend 126 ✅
Artistas seed 14 (con coordenadas reales en Santiago)
Issues resueltos 19 documentados en fixs/
PRs internos 25

🎨 Diseño

Rediseño completo basado en prototipo Figma con tema oscuro premium:

  • Paleta: #0D0D0D fondo · #D4AF37 dorado · #161616 tarjetas
  • Tipografía: Inter + Geist
  • Mobile-first responsive
  • Navegación con blur y nav inferior móvil

📁 Estructura del repositorio

├── backend/          # .NET 10 Web API
├── frontend/         # Angular 20 SPA
├── docs/             # Documentación técnica, US, estándares
├── fixs/             # Issues documentados + diseño Figma de referencia
├── prompts/          # Registro completo de prompts IA utilizados
├── ai-specs/         # Skills y agentes IA del proyecto
└── docker-compose.yml

🏃 Cómo ejecutar

# 1. Infraestructura (PostgreSQL + PostGIS)
docker-compose up -d

# 2. Backend (migra + seed + API en :5000)
cd backend && dotnet run --seed

# 3. Frontend (SPA en :4200)
cd frontend && npm ci && npm start

Login de prueba: camila.rojas@example.cl / Test1234!

📚 Documentación completa

  • readme.md — Ficha del proyecto y guía de entrega
  • ARCHITECTURE.md — Arquitectura del sistema
  • docs/documentacion.md — Lean Canvas, casos de uso, C4
  • docs/api-spec.yml — Especificación OpenAPI 3.0
  • docs/data-model.md — Modelo de datos (13 entidades)
  • PROJECT_STATUS.md — Estado actual del proyecto
  • prompts/00-all-prompts.md — Registro de prompts IA

Desarrollado con 💛 y mucha IA por Rodrigo A. Chamy Cruz (RACC) — AI4Devs 2026

rchamycruz and others added 30 commits June 10, 2026 01:03
Se crea la estructura base para la entrega 1 Documentación del proyecto final + gitignore inicial + readme con lo solicitado del proyecto
Se corrige el readme.md con lo solicitado.
Se instala openspec y se inicializa con openspec init para Claude y Github Copilot
Correccion openspec
Inicializa Specboot de LIDR
… for OpenSpec

- Introduced `opsx-explore.prompt.md` to facilitate exploration of ideas and problem-solving without implementation.
- Created `opsx-propose.prompt.md` for proposing new changes and generating necessary artifacts in one step.
- Added `opsx-sync.prompt.md` to sync delta specs from changes to main specs, allowing for intelligent merging.
- Implemented `openspec-apply-change` skill to manage task implementation from OpenSpec changes.
- Developed `openspec-archive-change` skill for archiving completed changes in the experimental workflow.
- Established `openspec-explore` skill to guide users through exploration and clarification of requirements.
- Created `openspec-propose` skill for generating complete proposals with design and tasks.
- Added `openspec-sync-specs` skill to update main specs with changes from delta specs.
- Introduced a configuration file `config.yaml` for project context and artifact rules.
- Changed language standards in base-standards.md to require Spanish for all technical artifacts.
- Updated data-model.md to reflect the new application name (INK-LINK) and modified comments accordingly.
- Revised development_guide.md to align with the INK-LINK project.
- Adjusted documentation-standards.md to mandate Spanish for all documentation.
- Updated frontend-standards.md to reflect the transition from LTI to INK-LINK, including changes in technology stack from React to Angular 20.
- Added a new prompt for modifying backend and frontend developer specifications to adopt the new tech stack (NetCore 10 C#, PostgreSQL, Angular 20).
…del documentation

- Introduced a new agent `tech-lead` to facilitate the decomposition of user stories into detailed implementation tasks, including guidelines for task structure and methodology.
- Added comprehensive data model documentation for the INK-LINK application, detailing entity descriptions, field definitions, relationships, and an entity-relationship diagram.
- Added `cancelled_at` field to Booking entity in data model.
- Revised CU-03 in documentation to clarify client review process without automatic notifications.
- Updated project stack references to .NET Core 10 and Angular 20 across documentation.
- Removed placeholder content from API spec file and marked videos and before/after pairs as Won't-Have for MVP.
- Documented inconsistencies in a new issue file and outlined execution plan for resolution.
- Adjusted anti no-show feature to Won't-Have in both readme and documentation.
… filtering artists, searching artists, viewing artist profiles, filtering by certification, booking slots, payment process, reservation history, chatbot quoting, interactive map, rating artists, and displaying brand sponsorships
- Enhanced the prompt registry in `00-all-prompts.md` with detailed metadata for each prompt executed during sessions.
- Added a new file `all-us.md` containing a comprehensive backlog of user stories, including descriptions, acceptance criteria, and technical notes for each story.
- Organized user stories into Must-Have and Should-Have categories with corresponding story points.
- Enhanced API specification with detailed endpoints for authentication, artist listings, bookings, reviews, and payments.
- Added comprehensive schemas for user authentication, artist profiles, bookings, reviews, and payment processes.
- Updated data model to remove deprecated fields from the Review entity and added relationship_type to Sponsorship.
- Revised development guide to reflect accurate setup instructions for the INK-LINK project.
- Addressed documentation coherence issues and clarified user story scopes.
- Created issues for resolving gaps in dependencies and ensuring alignment with user stories.
…king, and review functionalities

- Add backend support for searching artists with full-text search capabilities (US0005).
- Create a frontend search bar with autocomplete for artists (US0005).
- Implement backend endpoint for fetching complete artist profiles by slug (US0006).
- Develop frontend artist profile page displaying portfolio and reviews (US0006).
- Create reusable certification badge component for artists (US0007).
- Implement backend availability endpoints for booking slots (US0008).
- Develop frontend weekly calendar and booking summary components (US0008).
- Integrate payment processing with Flow Chile for booking deposits (US0009).
- Create frontend payment flow and confirmation screens (US0009).
- Implement backend endpoints for user booking history and attendance confirmation (US0010).
- Develop frontend "My Reservations" page with booking details and confirmation options (US0010).
- Add backend quote calculation endpoint for tattoo pricing (US0011).
- Create frontend chatbot for guided tattoo quoting process (US0011).
- Implement geospatial artist search endpoint using PostGIS (US0012).
- Develop interactive map view for exploring artists with Leaflet (US0012).
- Create backend review submission endpoint with rating recalculation (US0013).
- Develop frontend review form for multi-dimensional artist ratings (US0013).
- Implement sponsorship section in artist profiles and badges in artist cards (US0014).
…mentos permanentes y skill prompt-registry

- fixs/issue-004.md: informe de inconsistencias (api-spec, README, docs obsoletas, infra) + decisiones pendientes
- Nuevos documentos permanentes: PROJECT_STATUS, DEVELOPMENT_PLAN, ARCHITECTURE, CONTRIBUTING, PROMPT_REGISTRY
- Nueva skill prompt-registry (ai-specs/skills) con symlinks .claude/.cursor
- development_guide.md: bloque duplicado eliminado + nota de estado objetivo
- Registro de prompts actualizado (sesión 5) y MASTER_BOOTSTRAP_PROMPT versionado

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…MVP, README completo

- api-spec.yml regenerado (v2.0.0): numeración US corregida, schemas alineados a data-model,
  nuevos endpoints /showcase, /artists/{id}/availability, /bookings/hold, /quotes/calculate,
  pagos renombrados a /payments/create|confirm|return y regla 409 corregida (pending_payment)
- US0010: CA10-CA11 cancelación como alcance MVP (us0010.md + all-us.md)
- readme.md: secciones 2-7 completadas enlazando la documentación existente
- base-standards.md: §5 modelo recomendado (no obligatorio), §7 OpenSpec opcional/futuro
- issue-004 §G: registro de decisiones aplicadas; PROJECT_STATUS desbloqueado
- Registro de prompts actualizado (prompt 45)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…y CI

- backend/: Web API .NET 10 por capas (Controllers/Domain/Application/Infrastructure/Seed),
  health endpoint, xUnit + WebApplicationFactory (1/1 test verde), puerto 5000,
  CORS para localhost:4200, appsettings.Development.example.json
- frontend/: workspace Angular 20 (scss, sin SSR), environments con apiUrl,
  fileReplacements producción, build y tests verdes (2/2)
- docker-compose.yml: PostgreSQL 16 + PostGIS, MinIO con bucket inklink-images;
  perfil 'full' para stack completo dockerizado (api + web con nginx)
- Dockerfiles multi-stage backend y frontend
- .github/workflows/ci.yml: build + tests de ambos proyectos en cada PR
- global.json fija SDK 10.0.302; .gitignore ampliado (.NET, Angular, secretos)
- Microsoft.OpenApi fijado en 2.10.0 (corrige vulnerabilidad NU1903 transitiva)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… seed completo

- 13 entidades del modelo de datos con enums como VARCHAR (HasConversion<string>)
- InkLinkDbContext: Fluent API con índices únicos (email, slug, booking_id),
  índices de consulta (commune, is_published, rating_avg, booking_date, status,
  is_active), JSONB para reference_images, snake_case naming, TIMESTAMPTZ
- Migración InitialSchema generada
- DatabaseSeeder: 3 clientes + 5 artistas + 1 admin (bcrypt Test1234!),
  12 estilos, perfiles completos con coordenadas reales de Santiago,
  12 items de portafolio c/u, agenda Ma-Sa 10-19, 3 certificaciones,
  2 premios, 2 auspicios. Idempotente. Activable con dotnet run --seed
- Test de integración TestContainers (postgis:16-3.4): migración + seed +
  query por email + coherencia de datos — 2/2 tests verdes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- AuthService: email case-insensitive, verificación BCrypt, null genérico
  ante cualquier fallo (sin revelar existencia del email)
- JwtTokenGenerator: HS256, claims user_id/email/role/first_name,
  artist_profile_id solo para artistas, expiración 24h configurable
- AuthController: POST /api/auth/login (200/400/401) + GET /api/auth/me
  protegido con [Authorize]
- FluentValidation para LoginRequest; rate limiting 5 req/min por IP en login
- JWT Bearer configurado; secret vía configuración (override Jwt__Secret)
- 7 tests unitarios escritos antes de implementar (red-green): login ok,
  password/email inválidos, case-insensitive, claims, artist_profile_id, 24h
- Verificado E2E contra PostgreSQL dockerizado con datos seed

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- AuthService Angular con signals (currentUser, isAuthenticated), localStorage
  con expiración, logout que limpia sesión y redirige
- LoginComponent standalone: formulario reactivo Material (email+password),
  validaciones, error genérico 'Credenciales inválidas', toggle visibilidad,
  redirect a returnUrl post-login, mobile-first
- authGuard funcional: redirige a /login?returnUrl= si no hay sesión
- authInterceptor: adjunta Bearer a requests del API; 401 => logout
- Página protegida /mi-cuenta (demuestra CA6/CA7) + toolbar con sesión
- Angular Material 20 + animations + tema azure-blue
- 9/9 tests unitarios verdes (AuthService, authGuard, LoginComponent, App)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…pts actualizados

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
[Docs] Preparación Entrega 2 — análisis, documentos permanentes y api-spec v2.0.0
[Fase 0] Fundaciones — scaffolding .NET 10 + Angular 20, Docker y CI
rchamycruz and others added 26 commits July 14, 2026 21:34
Create a shared skill that enforces INK·LINK's dark premium design
system across all frontend work. Ensures visual consistency by
documenting:

- CSS custom property tokens (--ink-* palette)
- Typography rules (Inter + Playfair Display)
- Component patterns (navbar, cards, hero, forms, account)
- Layout grid system and responsive breakpoints
- Animation standards and accessibility guidelines
- Explicit prohibitions and per-component checklist

Skill is available to:
- Claude via .claude/skills/ symlink to ai-specs/
- Copilot via .github/skills/ SKILL.md
- Copilot prompts via .github/prompts/ quick-reference

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[DOCS] Add UI/UX Design System Skill for Claude & Copilot
Add prompt registry entries for:
- Session 6: US0003 backend/frontend, MinIO seed, UI/UX dark theme
- Session 7: UI/UX design system skill, PR creation, plan analysis

Total: 7 sessions, 53 prompts documented.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[DOCS] UI/UX Design System Skill + Registro de prompts sesiones 6-7
TASK0001 - Backend GET /api/artists con filtros combinados:
- ArtistQueryService con query builder dinámico (AND logic)
- Filtros: style, minPrice, maxPrice, minRating, certified, available, type
- Paginación con page/pageSize (máx 50)
- ArtistsController con validación de inputs
- 10 tests TDD con TestContainers (todos en verde)

TASK0002 - Frontend panel de filtros reactivo:
- ArtistFilterService con signals, debounce en precio (300ms)
- FilterPanelComponent: estilos (checkboxes), precio (range), rating (stars),
  certificación/disponibilidad (toggles), tipo (radio)
- ArtistsPageComponent: sidebar desktop / bottom-sheet mobile, contador de
  resultados, skeleton loading, estado vacío, sync query params URL
- 27 tests en verde

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add 'Artistas' nav link in toolbar (visible to all users)
- Add 'Explorar y filtrar artistas' CTA between hero and sections
- Fix 'Ver más' links in showcase sections to route to /artistas
- Verify ArtistCard works in artists page context

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add Material Icons font to index.html (fixes 'star' text instead of icon)
- Override MDC label text color vars for checkbox/radio/slide-toggle
  (fixes black text invisible on dark background)
- Change style filter from single-select to multi-select (styles: string[])
  with OR logic — artists matching any selected style are returned
- Backend: ArtistFilterRequest.Styles is now string[]?, query uses
  slugs.Contains() for OR filtering
- Add test: MultipleStyleFilters_Returns_Artists_With_Any_Of_The_Styles
- Remove star rating number label, keep icon only
- Fix radio button label color with .mat-mdc-radio-button override

Backend: 27/27 tests ✅  Frontend: 27/27 tests ✅

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The seed uses JPEG photos as fake brand logos. The previous CSS applied
filter: brightness(0) invert(1) which turned JPEGs to solid white —
invisible on dark background.

Fix: wrap each logo in a translucent white pill (rgba 12% opacity) with
border, remove brightness/invert filter. Works with any image format.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
[US0004] Filtrar artistas por estilo, precio, rating y certificación
* docs: update PROJECT_STATUS + prompt registry for US0004 done / US0005 start

- PROJECT_STATUS: US0004 Done (PR #8 merged), US0005 En desarrollo
- prompts/00-all-prompts.md: Session 8 registered (prompts 54-58)
  covers US0004 impl, nav fixes, dark theme fixes, multi-select,
  sponsor logos fix, PR and merge

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(us0005): text search for artists — backend ILIKE + frontend SearchBar

Backend:
- ArtistFilterRequest: add Search field
- ArtistQueryService: ILIKE filter on name/bio/commune/style + GetSuggestionsAsync
- ArtistsController: GET /api/artists/suggestions?q= endpoint
- ArtistSearchTests: 9 new TDD integration tests (36/36 pass)

Frontend:
- ArtistFilters: add search?: string
- ArtistSuggestionsResponse interface
- ArtistFilterService: search in buildParams + hydrateFilters + clearFilters
- SearchBarComponent: debounce 300ms, suggestions dropdown, dark theme
- ArtistsPageComponent: SearchBar integrated in hero section
- URL sync for search param

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: search dropdown stacking context — move to own section with z-index

Move <app-search-bar> out of hero into dedicated __search-section
with position: relative; z-index: 20 to create proper stacking context.
Dropdown now appears correctly above results without overlap issues.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: search dropdown uses position:fixed to bypass sticky sidebar stacking context

Root cause: position:sticky on sidebar creates a CSS stacking context that
paints on top of the dropdown regardless of z-index. Fix: dropdown now uses
position:fixed with JavaScript-calculated top/left/width from
getBoundingClientRect(). z-index: 9999 ensures it always floats above
everything. Repositions on scroll and resize events.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…views (#10)

* docs: update PROJECT_STATUS + prompt registry for US0005 done / US0006 start

- PROJECT_STATUS: US0005 Done (PR #9 merged), US0006 En desarrollo
- prompts/00-all-prompts.md: Session 9 registered (prompts 59-63)
  covers US0005 impl, search dropdown fixes, PR merge, US0006 kickoff

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat(us0006): artist profile page — GET /api/artists/{slug} + ArtistProfileComponent

Backend:
- ArtistsDtos: PortfolioItemDto, CertificationDto, AwardDto, AvailableSlotDto,
  ArtistProfileDto, ReviewDto, ReviewListResponse
- ArtistQueryService: GetArtistBySlugAsync + GetArtistReviewsAsync (eager load, no N+1)
- ArtistsController: GET /api/artists/{slug} + GET /api/artists/{slug}/reviews
- ArtistProfileTests: 11 new TDD integration tests (47/47 pass)

Frontend:
- artist-profile.models.ts: all DTO interfaces
- ArtistProfileService: getArtistProfile + getArtistReviews
- ArtistProfileComponent: hero + portfolio grid + lightbox + tarifas + certs
  + awards + sponsors + availability preview + paginated reviews
- app.routes.ts: /artista/:slug route (lazy)
- 4 component tests (37/37 pass)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* feat: use real tattoo images from docs/tattoo-styles.yml in seed data

Add TattooImageCatalog.cs with 12 style arrays (120+ real URLs) sourced
from Wikimedia Commons and Flickr (CC BY, CC BY-SA, CC BY-NC-ND, Public Domain).
Update DatabaseSeeder to use TattooImageCatalog.GetUrl(style, index) for
all 12 portfolio items per artist. Falls back to picsum if style not found.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: artist card images + awards badge in home and /artistas

Backend:
- ArtistCardDto: add FeaturedImageUrl (featured portfolio item) + HasAwards
- ArtistQueryService.ToArtistCard: populate FeaturedImageUrl from portfolio,
  HasAwards from Awards.Any(), include Awards in all queries
- ShowcaseService.ToArtistCard: same additions for consistency

Frontend:
- ArtistCard model: add featuredImageUrl + hasAwards fields
- ArtistCardComponent.cardImage: uses featuredImageUrl before profilePhotoUrl
- ArtistCardComponent: add cardHasAwards computed signal
- artist-card.html: add award badge (emoji_events icon, gold color, right:36px)
- artist-card.scss: __badge--award modifier (gold, offset from certified badge)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: artist card shows portfolio image + awards badge

Backend:
- ArtistCardDto: add FeaturedImageUrl (first portfolio item) + HasAwards bool
- ArtistQueryService.ToArtistCard: map FeaturedImageUrl + HasAwards, include Awards
- ShowcaseService.ToArtistCard: same fields for consistency
- Both Available and non-Available paths include Awards

Frontend:
- ArtistCard model: add featuredImageUrl? + hasAwards? fields
- cardImage computed: fallback chain item.imageUrl -> featuredImageUrl -> profilePhotoUrl
- artist-card.component.html: add trophy badge (emoji_events) when hasAwards
- artist-card.component.scss: split badge into --certified (green) and --award (gold)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Crea CertificationBadgeComponent standalone (sm/md) con aria-label
- Integra badge en ArtistCard (body, debajo de meta info)
- Integra badge en ArtistProfileComponent (sidebar certificaciones, size=md)
- Reemplaza div manual 'cert-badge' en perfil con el componente
- 5 tests TDD → 42/42 frontend tests en verde
- Actualiza PROJECT_STATUS.md: US0007 Done
- Registra sesiones 10-11 en prompts/00-all-prompts.md (prompts 64-69)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* docs: actualiza PROJECT_STATUS y HANDOFF — US0007 mergeada, US0008 en desarrollo

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0008): TASK0001 — endpoints de disponibilidad semanal y hold temporal

- GET /api/artists/{id}/availability?week= genera slots desde la grilla
  semanal excluyendo bookings confirmados, holds activos, blocked dates
  y horarios pasados
- POST /api/bookings/hold crea booking pending_payment con TTL de 5 min,
  deposito = min_session_price * deposit_percentage / 100
- Race condition serializada con SELECT FOR UPDATE por artista
- Limpieza lazy de holds expirados al crear un nuevo hold
- 12 tests de integracion (Testcontainers) en verde; suite completa 59/59

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0008): TASK0002 — calendario semanal y resumen de reserva con countdown

- WeeklyCalendarComponent: vista semanal con navegacion solo a futuro,
  slots disponibles/ocupados, skeleton y reintento en error
- BookingSummaryComponent (ruta /reserva, authGuard): artista, fecha,
  hora, duracion, rango de precio, deposito y countdown de 5 minutos;
  al expirar deshabilita el pago y ofrece volver a elegir horario
- Integracion en perfil de artista: seleccion de slot crea el hold;
  sin sesion redirige a login con returnUrl y slot preseleccionado
  en query params (CA5); 409 muestra mensaje de horario tomado
- BookingService con signal currentBooking para el resumen
- 12 tests nuevos; suite frontend 54/54 en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(us0008): cierre de US — PROJECT_STATUS, HANDOFF y registro de prompts (sesión 12)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(artist-profile): widget de disponibilidad usaba 0=domingo en vez de 0=lunes

El modelo de datos define day_of_week con 0=lunes...6=domingo, pero el
widget del sidebar (US0006) mapeaba los indices con el array partiendo
en domingo, mostrando lunes-viernes cuando el seed define martes-sabado.
El calendario de reserva (US0008) ya usaba la convencion correcta, lo
que hacia evidente la incongruencia. Test de regresion agregado; suite
frontend 55/55.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
#13)

* feat(us0009): TASK0001 — integración Flow (crear orden + webhook) mock-first

- IFlowClient con FlowClient real (firma HMAC-SHA256 sobre parámetros
  ordenados según API de Flow) y MockFlowClient activo mientras no haya
  credenciales sandbox (Flow:UseMock=true)
- POST /api/payments/create: valida owner (403), booking pagable (409),
  crea Payment pending con platform_fee 7% configurable y artist_amount;
  el retry reutiliza el Payment con una orden Flow nueva (CA5)
- POST /api/payments/confirm (webhook idempotente): pago OK → Payment
  completed + Booking confirmed sin aprobación del artista (CA3, CA9);
  rechazo mantiene pending y el TTL del hold libera el slot (CA6)
- GET /api/payments/return: sincroniza estado y redirige a la SPA
  (/reservas/{id}?status=success|failed)
- POST /api/payments/mock-outcome (solo UseMock): simula el resultado
  del checkout y dispara el webhook como lo haría Flow
- GET /api/bookings/{id} (owner-only) para la pantalla de confirmación;
  BookingDto ahora refleja status y hasReview reales
- 9 tests de integración; suite backend 68/68 en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0009): TASK0002 — flujo de pago y pantalla de confirmación

- BookingSummary: 'Pagar depósito' llama a /payments/create y redirige
  al checkout de Flow (CA1); error muestra mensaje y permite reintentar
- PaymentReturnComponent (/reservas/:bookingId, authGuard): confirmación
  con nº de reserva, artista, fecha, hora y monto pagado (CA4); rechazo
  muestra error con 'Reintentar pago' que crea una orden nueva (CA5);
  confía en el estado real del booking si el webhook llega tarde
- MockCheckoutComponent (/pago-simulado): checkout simulado mientras no
  haya credenciales sandbox de Flow; botones de pago exitoso/rechazo
- BookingService: getBooking, createPayment, sendMockOutcome, redirectTo
- 7 tests nuevos; suite frontend 61/61 en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(us0009): cierre de US — PROJECT_STATUS, HANDOFF y registro de prompts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: corrige comando de infra local — los servicios son db y storage, no postgres/minio

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(i18n): registra locale es-CL — las fechas de DatePipe salían en inglés

La app nunca registró un locale, por lo que DatePipe usaba en-US por
defecto ('Thursday 16 July 2026' en el resumen de reserva). Se registra
es-CL globalmente en app.config.ts; afecta a todas las fechas de la app
(resumen, confirmación, reseñas).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs: registra como pendiente diferido la integración Flow real con sandbox

Decisión 2026-07-15: US0009 queda mock-first; la conexión con la cuenta
sandbox de Flow se retomará más adelante (credenciales + UseMock=false +
prueba e2e). No bloquea el resto del backlog.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…14)

* feat(us0010): TASK0001 — historial de bookings, confirmar asistencia y cancelar

- GET /api/bookings/me: historial paginado del cliente autenticado con
  filtro por status; próximas primero (asc), luego pasadas (desc);
  incluye resumen del artista y flag hasReview (CA1-CA3, CA6)
- POST /api/bookings/{id}/complete: confirmed + sesión terminada →
  completed; 403 si no es owner, 409 si futura o estado inválido (CA8-CA9)
- POST /api/bookings/{id}/cancel: confirmed + fecha futura → cancelled
  con cancelled_at; el slot vuelve a estar disponible; sin reembolso
  automático en el MVP (CA10-CA11)
- Refactor: mapeo Booking→DTO compartido en BookingMapper; GetBooking
  movido de AvailabilityService a BookingService
- 11 tests de integración; suite backend 79/79 en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0010): TASK0002 — página Mis Reservas con acciones por estado

- MyBookingsComponent (/mis-reservas, authGuard): listado paginado con
  skeleton, estado vacío con CTA a vitrina (CA7) y toast de feedback
- BookingCardComponent: artista clickeable, fecha/hora, badge por estado
  (confirmada=azul, completada=verde, cancelada=rojo, CA4), detalle
  expandible (CA5), confirmación inline antes de completar/cancelar
  recordando la política de cancelación (CA10); CTA Calificar visible en
  completadas sin reseña, deshabilitado hasta US0013 (CA6)
- Enlace 'Mis reservas' en el menú autenticado (CA1); el CTA de la
  confirmación de pago ahora apunta a /mis-reservas
- BookingService: getMyBookings, completeBooking, cancelBooking
- 13 tests nuevos; suite frontend 74/74 en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(us0010): cierre de US — PROJECT_STATUS, HANDOFF y registro de prompts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(us0010): holds expirados no aparecen en el historial; los vivos permiten retomar el pago

Caso borde reportado: un hold que expiraba sin pagar quedaba visible en
Mis Reservas como 'Pendiente de pago' sin acción posible (reserva zombi).
El slot sí se liberaba correctamente (la disponibilidad ignora holds
expirados y el próximo hold los elimina), el problema era solo de listado.

- GET /bookings/me excluye pending_payment con expires_at vencido
- Los pending_payment con hold vivo ahora muestran 'Continuar pago'
  (nueva orden Flow + redirect al checkout); si expira justo al hacer
  click, se recarga la lista con aviso
- Tests de regresión backend (12) y frontend (78) en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(us0013): calificar artista post-sesion backend y frontend

* docs: login-samples + issue-005 foto reseña pendiente

- login-samples.md: credenciales de ejemplo del seed (todos usan Test1234!)
- fixs/issue-005.md: foto de tatuaje en reseña no persiste (tattooPhotoUrl
  siempre null; upload presigned-URL pendiente, CA5 US0013 no cumplida)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* feat(us0012): explorar artistas en mapa interactivo

TASK0001 — Backend:
- GET /api/artists/geo?lat&lng&radiusKm — PostGIS ST_DWithin via raw
  NpgsqlConnection (evita conflictos con naming conventions de EF Core)
- GeoFilterRequest DTO con filtros opcionales de US0004
- GeoService: max 100 resultados, ordenados por distancia, filtros
  combinables (estilos, precio, rating, certificado, tipo)
- ArtistsController: endpoint /geo + validacion IsValidGeoRequest
- 5 tests TDD: dentro/fuera de radio, no-publicados, filtro certified, 400

TASK0002 — Frontend:
- leaflet + leaflet.markercluster instalados; CSS en angular.json
- MapService: GET /api/artists/geo
- MapViewComponent (ruta /mapa):
  - Geolocalización con fallback a Santiago (-33.4489, -70.6693)
  - Mapa Leaflet + OpenStreetMap tiles
  - Clustering automático con MarkerClusterGroup
  - Marcadores con thumbnail del artista (circle fallback)
  - Popup por artista: foto, nombre, rating, estilo, comuna, CTAs Ver perfil / Reservar
  - Selector de radio: 1km / 5km / 10km / Ciudad
  - Toggle vista mapa ↔ lista (ArtistCardComponent reutilizado)
  - Filtros de US0004 integrados (estilos, rating, certified, tipo)
- app.routes.ts: ruta /mapa lazy-loaded
- app.html: link Mapa en navegacion principal
- GeoFilters interface en artist-filter.models.ts
- 9 tests en verde

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(us0012): fix map render - remove Angular Material, keep container always in DOM

- Rewrote MapViewComponent without @angular/material (not installed)
- Moved #mapContainer outside @if so ViewChild(static:true) resolves correctly
- Use CSS map-wrapper--hidden class to toggle visibility instead of *ngIf
- Use setViewMode() replacing onViewModeChange(MatButtonToggleChange)
- Fixed SCSS: removed orphaned blocks and dead mat-* class references
- Updated tests: spy initializeMap to prevent Leaflet errors in headless env
- 9/9 frontend tests pass, build succeeds

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(us0012): constrain map to viewport height - prevent overflow

- Changed .map-page from min-height to height: calc(100vh - 64px) with overflow:hidden
- Set .map-wrapper min-height:0 so flex:1 computes height correctly for absolute child
- Set .list-wrapper overflow-y:auto for scrollable list within constrained page

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(us0012): CSS de Leaflet vía styles.scss, reemplazo de imagen seed y cierre de documentación

- Mueve los CSS de Leaflet/MarkerCluster de angular.json a src/styles.scss
  (el dev server no recarga angular.json; ver fixs/issue-006.md + issue-map.png)
- Reemplaza imagen seed de lettering (Flickr CC BY-NC-SA) por Corpus_Vile.JPG
  (Wikimedia Commons, dominio público) en TattooImageCatalog y tattoo-styles.yml
- Refactor de map-view.component.html sin Angular Material (pendiente de sesión anterior)
- Actualiza PROJECT_STATUS, HANDOFF y registro de prompts (sesión 13)
- Suites en verde: backend 93/93, frontend 101/101

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* feat(us0014): TASK0001 — backend alinea perfil con api-spec: sponsorships con relationshipType

GET /api/artists/{slug} ahora devuelve sponsorships[] (id, brandName,
brandLogoUrl, relationshipType en minúsculas según enum de api-spec)
en lugar de sponsorBadges sin tipo. ArtistCard no cambia.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0014): TASK0001 — seed con los 3 tipos de relación de auspicio

- Matías: Eternal Ink (ambassador) + Cheyenne (certified); Fernanda: Dynamic Color (sponsored)
- docker-compose y seed-images.ps1 suben los 3 logos de marca a MinIO
- Test de seed exige 3 sponsorships cubriendo los 3 tipos

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0014): TASK0001 — sección "Auspiciado por" en perfil y badges de marca en cards

- SponsorshipSectionComponent: logo + nombre + tipo de relación como badge
  (Embajador/Auspiciado/Certificado), fallback con inicial si el logo falla,
  oculta la sección sin sponsors (CA1, CA2, CA4)
- SponsorBadgesComponent compartido para cards: máx 3 logos + "+N más",
  fallback a nombre de marca (CA3)
- Modelos alineados a api-spec: ArtistProfileDto.sponsorships con relationshipType
- 11 tests nuevos; suite frontend 112/112

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(us0014): cierre de US — estado, handoff, registro de prompts y fix seed-images

- PROJECT_STATUS y HANDOFF: US0012 ✅ Done (PR #16), US0014 🟣 en revisión
- CAs de us0014.md y criterios de done de task0001.md marcados
- Registro de prompts: prompt 80 (sesión 13)
- scripts/seed-images.ps1: fix del fallback Docker en Windows (alias mc no
  persistía entre contenedores efímeros y --network host no funciona en
  Docker Desktop; ahora un solo contenedor unido a la red del compose)
- Suites en verde: backend 94/94, frontend 112/112

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(us0014): referencia al PR #17 en PROJECT_STATUS y HANDOFF

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…egún cotización (#18)

* docs(us0011): decisión depósito-según-cotización (issue-007) y CA9

- fixs/issue-007.md: inconsistencia depósito fijo vs chatbot; decisión del
  usuario: el hold recalcula la cotización server-side y el depósito usa
  máx(mínimo cotizado, min_session_price) como base; sin cotización, fallback actual
- CA9 agregado en us0011.md y all-us.md; nota técnica de servicio único
- api-spec: QuoteResponse.factors (aditivo) y descripción de depositAmount con piso

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0011): TASK0001 — POST /api/quotes/calculate con fórmula determinística

- QuoteCalculatorService: base = max(min_session_price, hourly_rate × horas
  por tamaño coin=1/palm=2/hand=4/arm=6); factores multiplicativos cover-up
  +30%, color +20%, zona difícil +15%; rango [base×0.8, base×1.3]
- depositAmount con piso min_session_price (CA9 / issue-007)
- Endpoint público con validaciones: artista publicado (404), estilo (404), tamaño (422)
- 10 tests de integración

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0011): hold calcula estimado y depósito desde la cotización (CA8-CA9)

Con sizeReference válido el hold recalcula la fórmula server-side (nunca
acepta montos del cliente) y el booking hereda el rango cotizado; depósito
con piso min_session_price (issue-007). Sin datos de cotización o tamaño
no reconocido, fallback al comportamiento previo. 3 tests nuevos (15/15).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0011): GET /api/styles — catálogo público de estilos (id, name, slug)

El chatbot necesita resolver los slugs de estilos del artista a ids para
QuoteRequest. Agregado a api-spec.yml (aditivo). Test de integración (11/11).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(us0011): TASK0002 — chatbot wizard conversacional de cotización

- QuoteChatbotComponent: overlay con 5 pasos (zona, tamaño, estilo del
  artista, referencias opcionales, color/cover-up), conversación derivada
  del estado (atrás = limpiar respuesta, CA6), rango + depósito + factores
  al final (CA3), CTA reservar que salta al calendario (CA5)
- QuoteService: calculate/getStyles + draft en memoria y localStorage si
  autenticado (CA7); el hold envía los datos de la cotización (CA8)
- CTAs del hero "Cotizar"/"Reservar" ahora funcionales (CA1)
- 14 tests nuevos; suite frontend 126/126

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(us0011): cierre de US — CAs, estado, handoff y registro de prompts

- CAs de us0011.md marcados (CA8 con nota: referencias solo preview local,
  upload a storage pendiente como issue-005)
- PROJECT_STATUS y HANDOFF: US0014 ✅ Done (PR #17), US0011 🟣 en revisión
- Registro de prompts: 81-82 (sesión 13)
- Suites en verde: backend 108/108, frontend 126/126

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(us0011): referencia al PR #18 y conteos de tests actualizados

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…os (#19)

* chore(flow): configuración segura de credenciales sandbox de Flow

- backend.csproj: UserSecretsId para `dotnet user-secrets` (secretos locales
  fuera del repo)
- appsettings.Development.example.json: sección Flow alineada a FlowSettings
  (UseMock/ApiBaseUrl/FrontendBaseUrl)
- docker-compose: Flow__UseMock/ApiKey/SecretKey desde .env (gitignored)
- .env.example nuevo con las variables documentadas

Las claves nunca se commitean: user-secrets o appsettings.Development.json
(gitignored) en local; variables de entorno en producción.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(us0008): limpieza de holds expirados fallaba si el hold inició un pago

La limpieza perezosa borraba el booking expirado sin borrar antes su fila
de payments (FK violation), dejando bloqueados todos los holds futuros del
artista. Detectado probando el sandbox de Flow. Ahora se eliminan primero
los pagos pendientes de esos holds. Test de regresión (13/13).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* feat(flow): FlowClient expone el cuerpo del error de Flow en fallos HTTP

Antes EnsureSuccessStatusCode ocultaba el motivo (p. ej. code 1620 email
inválido); ahora la excepción incluye el JSON de error de Flow.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(flow): guía de pruebas del sandbox — levantar proyecto, tarjetas y flujo e2e

- docs/flow-sandbox-testing.md: cómo levantar el proyecto, configurar
  credenciales sin exponerlas, flujo de prueba completo (email real del
  pagador, tarjetas Webpay de integración, confirm manual del webhook en
  local por la limitación de localhost) y verificación
- readme.md §2.6: comandos de arranque/tests + tarjetas de prueba + enlace
- development_guide.md: puntero a la nueva guía

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(tests): PaymentTests fuerzan Flow:UseMock=true (hermeticidad)

WebApplicationFactory corre en entorno Development y cargaba el
appsettings.Development.json local; con credenciales sandbox configuradas
(UseMock=false) los 5 tests de pago intentaban pegarle a Flow real.
Suite backend 95/95.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ro de prompts (#20)

* docs: register session 14 prompts (87-94) - US0012 map fixes

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs: sincroniza estado tras merges de PR #18 y #19 — backlog completo

- PROJECT_STATUS: 13/13 US ✅ (backlog 80 SP completo), bloqueo #3 de Flow
  resuelto (validado e2e contra sandbox), sin bloqueos activos, conteos
  109/126, próximos pasos → entrega final
- HANDOFF: estado detallado con la validación del sandbox, hallazgos del
  PR #19 y contexto de BD dev (email real de la clienta seed)
- Nota de trazabilidad actualizada: prompts de US0012 recuperados en la
  sesión 14 (registro de Copilot)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* docs(entrega): consolida readme para la entrega final

- §7 Pull requests: tabla completa de los 20 PRs mergeados + 3 documentados
  en detalle (#13 Flow mock-first, #18 chatbot + decisión issue-007, #19
  validación sandbox e2e)
- §2.4: infraestructura real (CI GitHub Actions existente, secretos por
  entorno, alcance de despliegue)
- §2.6: 235 tests en verde (109 backend + 126 frontend), frameworks reales
- §4: endpoints /styles y availability agregados a la tabla
- §0.4: nota de alcance de despliegue
- Registro de prompts: sesión 15 (prompt 95)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* docs(entrega): completa prompts.md — registro curado de las 15 sesiones

Secciones 2.4/2.5/2.6/6/7 que estaban "PENDIENTE" completadas con los
prompts más representativos (máx 3 por sección, verbatim, sin eliminar
existentes); §4 actualizada con la spec v2.0.0 como fuente de verdad y la
decisión de issue-007. Nota obsoleta de §4 retirada.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…4 B5) (#22)

- Nota de vigencia global: la visión v1 se acotó a flujo 100% cliente;
  backlog vigente all-us.md y contrato api-spec.yml
- CU-01: sin registro ni notificaciones; depósito según cotización (issue-007)
- CU-02: artista = datos seed, fuera del MVP (issue-003)
- CU-03: US0013 sin foto de curación 90 días ni respuesta del artista
- C4 nivel 3: nota as-built remitiendo a ARCHITECTURE.md
- Apéndice stack: Angular Material + SCSS (no Tailwind)
- Registro de prompts: 97

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…pts (#23)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…9) (#24)

* docs(rediseno): plan de rediseño Figma + código de referencia exportado desde Figma Make

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB

* style(rediseno): fase 0 — tokens Figma, tema Material oscuro/dorado y rebrand INKSPIRE

- Variables CSS globales actualizadas a la paleta del prototipo (#0D0D0D / #D4AF37 / #1E1E1E, radio 16px)
- Tema Angular Material M3 oscuro con tokens de sistema fijados a la marca (reemplaza azure-blue)
- Playfair Display reemplazada por var(--ink-font-display) (Inter/Geist) en todos los componentes
- Marca visible INK·LINK renombrada a INKSPIRE (título, meta, nav, títulos de página, spec)
- Claves de localStorage inklink_* intactas para no invalidar sesiones

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB

* style(rediseno): fase 0 — ajustes de nav y rebrand INKSPIRE en login

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB

* feat(rediseno): home con estructura del prototipo Figma (VistaHome)

- Shell global: nav fija transparente con blur al hacer scroll, nav movil inferior y footer INKSPIRE
- Hero full-viewport con buscador funcional (search + estilo via query params al listado), tags rapidos y stats
- Secciones: confianza, carrusel top_rated, estilos populares, banner, cerca de ti, como funciona, premiados, resenas de comunidad, newsletter y CTA final
- Tarjeta de artista redisenada segun TarjetaArtista del prototipo (badges, rating, chips de estilo, precio/hr)
- Utilidades compartidas (btn-gold, chips, gold-label, icon-tile) movidas a styles.scss
- Budget anyComponentStyle ajustado a 10kB/20kB por la landing completa
- Specs de showcase-page actualizados a la nueva estructura; 126/126 tests en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB

* feat(rediseno): perfil de artista con estructura del prototipo Figma (VistaPerfilArtista)

- Hero backdrop con obra destacada + header con avatar dorado, badges (verificado/sanitario/premiado/auspiciado), rating y chips de estilos
- Tabs Portafolio / Resenas / Info & tarifas segun el prototipo
- Resenas: resumen agregado con barras de 4 dimensiones + tarjetas por resena
- Info: sobre mi, grid de tarifas y politicas, certificaciones, premios, auspicios y panel de ubicacion
- Booking card sticky en desktop (precio/hr, deposito, Cotizar con IA, Reservar) y booking bar fija en movil
- Flujos intactos: chatbot cotizador, calendario semanal de reserva, hold de slot y lightbox
- 126/126 tests en verde

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ACbKPTZukaGQNFgr9FpzB

* docs(rediseno): estado del rediseno Figma en PROJECT_STATUS y HANDOFF

* feat(rediseno): listado de artistas con filtros Figma + favoritos + datos seed ampliados

- Filtro de comuna (select dropdown) en panel de filtros del listado
- Filtro 'Solo premiados' (toggle, client-side sobre hasAwards)
- Slider de precio máx. por hora en vez de inputs min/max
- FavoritesService con persistencia en localStorage
- Botón favorito (corazón) en tarjeta de artista
- Seed ampliado: 14 artistas con reviews, certificaciones, premios y auspicios
- Filtro de comuna en Home conectado a /artistas via queryParam search
- 126/126 tests en verde; ng build producción OK

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* docs(rediseno): actualizar HANDOFF con estado de fase 3 completada

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(rediseno): corregir 4 issues del Home Figma

- fix-001: Portfolio images ya no se repiten entre artistas (offset * 12 + picsum fallback)
- fix-002: Estilos populares muestra 12 estilos (uno por estilo, no solo el más popular)
- fix-003: Botón 'Cotiza con IA' navega al perfil del artista top con ?cotizar=1 y auto-abre chatbot
- fix-004: Botón 'Cerca de mí' agregado al Home con estilo dorado, navega a /mapa

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(seed): reemplazar imágenes Flickr/Wikimedia por Unsplash del Figma

- TattooImageCatalog reescrito con 12 imágenes Unsplash del prototipo Figma
- Rotación por artista (mismo enfoque que Figma) para portfolios variados
- Creado fixs/figma-images.yml como referencia única de imágenes del diseño
- Creado fixs/issue-008.md documentando el problema de imágenes incorrectas
- Tests actualizados para reflejar 14 artistas (23 usuarios) en seed expandido
- ShowcaseTests: popular_styles tiene su propio límite fijo (1 por estilo)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: resolve 7 issues (009-015) — chatbot, carousel, scroll, payment, map, account, reviews

- fix-009: Cotizar con IA opens general chatbot modal (no artist required)
- fix-010: Estilos populares carousel single-row (removed flex-wrap)
- fix-011: Scroll restoration on route change (withInMemoryScrolling)
- fix-012: Flow payment mock enabled in Development config
- fix-013: PostGIS extension auto-created before migrations
- fix-014: Account page text visible with theme CSS variables
- fix-015: Reviewable bookings seeded (completed without reviews)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: chatbot general quote, carousel arrows, better hold errors (016-018)

- fix-016: QuoteCalculatorService handles Guid.Empty by averaging all artists
- fix-017: Popular styles carousel with wrapper, padding, and arrow buttons
- fix-018: Booking hold shows specific error messages per HTTP status

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: handle stale JWT after DB reseed (500 on hold)

Root cause: after dropping/reseeding the DB, existing JWTs contain
user IDs that no longer exist, causing FK violation on bookings insert.

- AvailabilityService: validate client exists before creating hold
- Artist profile: show HTTP status code in hold error message
- Add console.error for debugging hold failures

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(chatbot): send Guid.Empty instead of empty string for general quote

Empty string '' cannot deserialize to Guid, causing 400. Now sends
'00000000-0000-0000-0000-000000000000' which the backend handles
via CalculateGeneralAsync (averaging all published artists).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix(chatbot): ocultar botón reservar en modo general + docs y reglas de trazabilidad

- fix-019: botón 'Reservar' oculto cuando chatbot es general (sin artista)
- docs/base-standards.md §8: nueva sección de trazabilidad de issues
  (registro en fixs/, plan con checks, actualización obligatoria de docs)
- PROJECT_STATUS.md: tabla de issues 008-019 resueltos
- HANDOFF.md: estado detallado actualizado con todos los cambios de sesión

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Renombrado de marca en 27 archivos: readme, arquitectura, contributing,
handoff, project status, plan de rediseño, api-spec, data model,
documentación técnica, user stories, issues, prompts, agents y skills.

Namespaces de código (InkLink.Api, InkLinkDbContext) se mantienen como
identificadores técnicos internos — no son visibles al usuario.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@coderabbitai

coderabbitai Bot commented Jul 19, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 453 files, which is 353 over the limit of 100.

To get a review, narrow the scope:
• coderabbit review --committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 8019bd27-2b3f-4509-8080-d602181b68ae

📥 Commits

Reviewing files that changed from the base of the PR and between bcde5c4 and fb419f7.

⛔ Files ignored due to path filters (5)
  • ai-specs/skills/writing-skills/graphviz-conventions.dot is excluded by !**/*.dot
  • fixs/figma-design/src/imports/WhatsApp_Image_2026-07-17_at_3.10.09_PM.jpeg is excluded by !**/*.jpeg
  • fixs/issue-map.png is excluded by !**/*.png
  • frontend/package-lock.json is excluded by !**/package-lock.json
  • frontend/public/favicon.ico is excluded by !**/*.ico
📒 Files selected for processing (453)
  • .claude/agents/backend-developer.md
  • .claude/agents/frontend-developer.md
  • .claude/agents/product-strategy-analyst.md
  • .claude/skills/adversarial-review
  • .claude/skills/code-auditing
  • .claude/skills/commit
  • .claude/skills/enrich-us
  • .claude/skills/explain
  • .claude/skills/meta-prompt
  • .claude/skills/openspec-apply-change/SKILL.md
  • .claude/skills/openspec-explore/SKILL.md
  • .claude/skills/openspec-sync-specs
  • .claude/skills/prompt-registry
  • .claude/skills/show-spec-working
  • .claude/skills/sync-agent-symlinks
  • .claude/skills/ui-ux-design-system
  • .claude/skills/update-docs
  • .claude/skills/using-git-worktrees
  • .claude/skills/writing-skills
  • .cursor/agents/backend-developer.md
  • .cursor/agents/frontend-developer.md
  • .cursor/agents/product-strategy-analyst.md
  • .cursor/rules/use-base-rules.mdc
  • .cursor/skills/adversarial-review
  • .cursor/skills/code-auditing
  • .cursor/skills/commit
  • .cursor/skills/enrich-us
  • .cursor/skills/explain
  • .cursor/skills/meta-prompt
  • .cursor/skills/openspec-sync-specs
  • .cursor/skills/prompt-registry
  • .cursor/skills/show-spec-working
  • .cursor/skills/sync-agent-symlinks
  • .cursor/skills/update-docs
  • .cursor/skills/using-git-worktrees
  • .cursor/skills/writing-skills
  • .env.example
  • .github/agents/backend-developer.agent.md
  • .github/agents/frontend-developer.agent.md
  • .github/agents/product-strategy-analyst.agent.md
  • .github/agents/tech-lead.agent.md
  • .github/agents/technical-product-owner.agent.md
  • .github/prompts/opsx-apply.prompt.md
  • .github/prompts/opsx-archive.prompt.md
  • .github/prompts/opsx-explore.prompt.md
  • .github/prompts/opsx-propose.prompt.md
  • .github/prompts/opsx-sync.prompt.md
  • .github/prompts/ui-ux-design-system.prompt.md
  • .github/skills/openspec-apply-change/SKILL.md
  • .github/skills/openspec-archive-change/SKILL.md
  • .github/skills/openspec-explore/SKILL.md
  • .github/skills/openspec-propose/SKILL.md
  • .github/skills/openspec-sync-specs/SKILL.md
  • .github/skills/ui-ux-design-system/SKILL.md
  • .github/workflows/ci.yml
  • .gitignore
  • .vscode/settings.json
  • AGENTS.md
  • ARCHITECTURE.md
  • CLAUDE.md
  • CONTRIBUTING.md
  • DEVELOPMENT_PLAN.md
  • GEMINI.md
  • HANDOFF.md
  • PROJECT_STATUS.md
  • PROMPT_REGISTRY.md
  • ai-specs/agents/backend-developer.md
  • ai-specs/agents/frontend-developer.md
  • ai-specs/agents/product-strategy-analyst.md
  • ai-specs/scripts/code_review.sh
  • ai-specs/skills/adversarial-review/SKILL.md
  • ai-specs/skills/code-auditing/SKILL.md
  • ai-specs/skills/code-auditing/references/audit-methodology.md
  • ai-specs/skills/code-auditing/references/dead-code-methodology.md
  • ai-specs/skills/commit/SKILL.md
  • ai-specs/skills/enrich-us/SKILL.md
  • ai-specs/skills/explain/SKILL.md
  • ai-specs/skills/meta-prompt/SKILL.md
  • ai-specs/skills/openspec-sync-specs/SKILL.md
  • ai-specs/skills/prompt-registry/SKILL.md
  • ai-specs/skills/show-spec-working/SKILL.md
  • ai-specs/skills/sync-agent-symlinks/SKILL.md
  • ai-specs/skills/ui-ux-design-system/SKILL.md
  • ai-specs/skills/update-docs/SKILL.md
  • ai-specs/skills/using-git-worktrees/SKILL.md
  • ai-specs/skills/writing-skills/SKILL.md
  • ai-specs/skills/writing-skills/anthropic-best-practices.md
  • ai-specs/skills/writing-skills/examples/CLAUDE_MD_TESTING.md
  • ai-specs/skills/writing-skills/persuasion-principles.md
  • ai-specs/skills/writing-skills/render-graphs.js
  • ai-specs/skills/writing-skills/testing-skills-with-subagents.md
  • ai-specs/specboot-instructions.md
  • backend/.dockerignore
  • backend/Application/.gitkeep
  • backend/Application/Dtos/ArtistsDtos.cs
  • backend/Application/Dtos/AuthDtos.cs
  • backend/Application/Dtos/BookingsDtos.cs
  • backend/Application/Dtos/QuotesDtos.cs
  • backend/Application/Dtos/ShowcaseDtos.cs
  • backend/Application/Validators/LoginRequestValidator.cs
  • backend/Controllers/ArtistsController.cs
  • backend/Controllers/AuthController.cs
  • backend/Controllers/AvailabilityController.cs
  • backend/Controllers/BookingsController.cs
  • backend/Controllers/HealthController.cs
  • backend/Controllers/PaymentsController.cs
  • backend/Controllers/QuotesController.cs
  • backend/Controllers/ReviewsController.cs
  • backend/Controllers/ShowcaseController.cs
  • backend/Controllers/StylesController.cs
  • backend/Dockerfile
  • backend/Domain/Entities/.gitkeep
  • backend/Domain/Entities/ArtistProfile.cs
  • backend/Domain/Entities/ArtistStyle.cs
  • backend/Domain/Entities/Availability.cs
  • backend/Domain/Entities/Award.cs
  • backend/Domain/Entities/BlockedDate.cs
  • backend/Domain/Entities/Booking.cs
  • backend/Domain/Entities/Certification.cs
  • backend/Domain/Entities/Payment.cs
  • backend/Domain/Entities/PortfolioItem.cs
  • backend/Domain/Entities/Review.cs
  • backend/Domain/Entities/Sponsorship.cs
  • backend/Domain/Entities/TattooStyle.cs
  • backend/Domain/Entities/User.cs
  • backend/Domain/Enums/Enums.cs
  • backend/Domain/Services/ArtistQueryService.cs
  • backend/Domain/Services/AuthService.cs
  • backend/Domain/Services/AvailabilityService.cs
  • backend/Domain/Services/BookingMapper.cs
  • backend/Domain/Services/BookingService.cs
  • backend/Domain/Services/GeoService.cs
  • backend/Domain/Services/PaymentService.cs
  • backend/Domain/Services/QuoteCalculatorService.cs
  • backend/Domain/Services/ReviewService.cs
  • backend/Domain/Services/ShowcaseService.cs
  • backend/Infrastructure/Data/.gitkeep
  • backend/Infrastructure/Data/InkLinkDbContext.cs
  • backend/Infrastructure/External/FlowClient.cs
  • backend/Infrastructure/Security/JwtSettings.cs
  • backend/Infrastructure/Security/JwtTokenGenerator.cs
  • backend/Migrations/20260714215718_InitialSchema.Designer.cs
  • backend/Migrations/20260714215718_InitialSchema.cs
  • backend/Migrations/InkLinkDbContextModelSnapshot.cs
  • backend/Program.cs
  • backend/Properties/launchSettings.json
  • backend/Seed/.gitkeep
  • backend/Seed/DatabaseSeeder.cs
  • backend/Seed/TattooImageCatalog.cs
  • backend/Tests/ArtistFilterTests.cs
  • backend/Tests/ArtistProfileTests.cs
  • backend/Tests/ArtistSearchTests.cs
  • backend/Tests/AuthServiceTests.cs
  • backend/Tests/AvailabilityTests.cs
  • backend/Tests/BookingHistoryTests.cs
  • backend/Tests/DatabaseMigrationAndSeedTests.cs
  • backend/Tests/GeoArtistTests.cs
  • backend/Tests/HealthEndpointTests.cs
  • backend/Tests/PaymentTests.cs
  • backend/Tests/QuoteTests.cs
  • backend/Tests/ReviewCreationTests.cs
  • backend/Tests/ShowcaseTests.cs
  • backend/Tests/backend.Tests.csproj
  • backend/appsettings.Development.example.json
  • backend/appsettings.json
  • backend/backend.csproj
  • backend/backend.http
  • backend/backend.slnx
  • backend/dotnet-tools.json
  • codex.md
  • docker-compose.yml
  • docs/api-spec.yml
  • docs/backend-standards.md
  • docs/base-standards.md
  • docs/data-model-sample.md
  • docs/data-model.md
  • docs/development_guide.md
  • docs/documentacion.md
  • docs/documentation-standards.md
  • docs/flow-sandbox-testing.md
  • docs/frontend-standards.md
  • docs/openspec-tasks-mandatory-steps.md
  • docs/plan-rediseno-figma.md
  • docs/pr-entrega-final.md
  • docs/tattoo-styles.yml
  • docs/us/all-us.md
  • docs/us/us0001/task0001.md
  • docs/us/us0001/task0002.md
  • docs/us/us0001/task0003.md
  • docs/us/us0001/us0001.md
  • docs/us/us0003/task0001.md
  • docs/us/us0003/task0002.md
  • docs/us/us0003/us0003.md
  • docs/us/us0004/task0001.md
  • docs/us/us0004/task0002.md
  • docs/us/us0004/us0004.md
  • docs/us/us0005/task0001.md
  • docs/us/us0005/task0002.md
  • docs/us/us0005/us0005.md
  • docs/us/us0006/task0001.md
  • docs/us/us0006/task0002.md
  • docs/us/us0006/us0006.md
  • docs/us/us0007/task0001.md
  • docs/us/us0007/us0007.md
  • docs/us/us0008/task0001.md
  • docs/us/us0008/task0002.md
  • docs/us/us0008/us0008.md
  • docs/us/us0009/task0001.md
  • docs/us/us0009/task0002.md
  • docs/us/us0009/us0009.md
  • docs/us/us0010/task0001.md
  • docs/us/us0010/task0002.md
  • docs/us/us0010/us0010.md
  • docs/us/us0011/task0001.md
  • docs/us/us0011/task0002.md
  • docs/us/us0011/us0011.md
  • docs/us/us0012/task0001.md
  • docs/us/us0012/task0002.md
  • docs/us/us0012/us0012.md
  • docs/us/us0013/task0001.md
  • docs/us/us0013/task0002.md
  • docs/us/us0013/us0013.md
  • docs/us/us0014/task0001.md
  • docs/us/us0014/us0014.md
  • fixs/figma-design/ATTRIBUTIONS.md
  • fixs/figma-design/README.md
  • fixs/figma-design/default_shadcn_theme.css
  • fixs/figma-design/guidelines/Guidelines.md
  • fixs/figma-design/index.html
  • fixs/figma-design/package.json
  • fixs/figma-design/pnpm-workspace.yaml
  • fixs/figma-design/postcss.config.mjs
  • fixs/figma-design/src/app/App.tsx
  • fixs/figma-design/src/app/components/figma/ImageWithFallback.tsx
  • fixs/figma-design/src/app/components/ui/accordion.tsx
  • fixs/figma-design/src/app/components/ui/alert-dialog.tsx
  • fixs/figma-design/src/app/components/ui/alert.tsx
  • fixs/figma-design/src/app/components/ui/aspect-ratio.tsx
  • fixs/figma-design/src/app/components/ui/avatar.tsx
  • fixs/figma-design/src/app/components/ui/badge.tsx
  • fixs/figma-design/src/app/components/ui/breadcrumb.tsx
  • fixs/figma-design/src/app/components/ui/button.tsx
  • fixs/figma-design/src/app/components/ui/calendar.tsx
  • fixs/figma-design/src/app/components/ui/card.tsx
  • fixs/figma-design/src/app/components/ui/carousel.tsx
  • fixs/figma-design/src/app/components/ui/chart.tsx
  • fixs/figma-design/src/app/components/ui/checkbox.tsx
  • fixs/figma-design/src/app/components/ui/collapsible.tsx
  • fixs/figma-design/src/app/components/ui/command.tsx
  • fixs/figma-design/src/app/components/ui/context-menu.tsx
  • fixs/figma-design/src/app/components/ui/dialog.tsx
  • fixs/figma-design/src/app/components/ui/drawer.tsx
  • fixs/figma-design/src/app/components/ui/dropdown-menu.tsx
  • fixs/figma-design/src/app/components/ui/form.tsx
  • fixs/figma-design/src/app/components/ui/hover-card.tsx
  • fixs/figma-design/src/app/components/ui/input-otp.tsx
  • fixs/figma-design/src/app/components/ui/input.tsx
  • fixs/figma-design/src/app/components/ui/label.tsx
  • fixs/figma-design/src/app/components/ui/menubar.tsx
  • fixs/figma-design/src/app/components/ui/navigation-menu.tsx
  • fixs/figma-design/src/app/components/ui/pagination.tsx
  • fixs/figma-design/src/app/components/ui/popover.tsx
  • fixs/figma-design/src/app/components/ui/progress.tsx
  • fixs/figma-design/src/app/components/ui/radio-group.tsx
  • fixs/figma-design/src/app/components/ui/resizable.tsx
  • fixs/figma-design/src/app/components/ui/scroll-area.tsx
  • fixs/figma-design/src/app/components/ui/select.tsx
  • fixs/figma-design/src/app/components/ui/separator.tsx
  • fixs/figma-design/src/app/components/ui/sheet.tsx
  • fixs/figma-design/src/app/components/ui/sidebar.tsx
  • fixs/figma-design/src/app/components/ui/skeleton.tsx
  • fixs/figma-design/src/app/components/ui/slider.tsx
  • fixs/figma-design/src/app/components/ui/sonner.tsx
  • fixs/figma-design/src/app/components/ui/switch.tsx
  • fixs/figma-design/src/app/components/ui/table.tsx
  • fixs/figma-design/src/app/components/ui/tabs.tsx
  • fixs/figma-design/src/app/components/ui/textarea.tsx
  • fixs/figma-design/src/app/components/ui/toggle-group.tsx
  • fixs/figma-design/src/app/components/ui/toggle.tsx
  • fixs/figma-design/src/app/components/ui/tooltip.tsx
  • fixs/figma-design/src/app/components/ui/use-mobile.ts
  • fixs/figma-design/src/app/components/ui/utils.ts
  • fixs/figma-design/src/imports/pasted_text/ink-link-design-spec.md
  • fixs/figma-design/src/main.tsx
  • fixs/figma-design/src/styles/fonts.css
  • fixs/figma-design/src/styles/globals.css
  • fixs/figma-design/src/styles/index.css
  • fixs/figma-design/src/styles/tailwind.css
  • fixs/figma-design/src/styles/theme.css
  • fixs/figma-design/vite.config.ts
  • fixs/figma-images.yml
  • fixs/issue-001.md
  • fixs/issue-002.md
  • fixs/issue-003.md
  • fixs/issue-004.md
  • fixs/issue-005.md
  • fixs/issue-006.md
  • fixs/issue-007.md
  • fixs/issue-008.md
  • fixs/issue-009.md
  • fixs/issue-010.md
  • fixs/issue-011.md
  • fixs/issue-012.md
  • fixs/issue-013.md
  • fixs/issue-014.md
  • fixs/issue-015.md
  • fixs/issue-016.md
  • fixs/issue-017.md
  • fixs/issue-018.md
  • fixs/issue-019.md
  • frontend/.dockerignore
  • frontend/.editorconfig
  • frontend/.gitignore
  • frontend/.vscode/extensions.json
  • frontend/.vscode/launch.json
  • frontend/.vscode/tasks.json
  • frontend/Dockerfile
  • frontend/README.md
  • frontend/angular.json
  • frontend/nginx.conf
  • frontend/package.json
  • frontend/src/app/app.config.ts
  • frontend/src/app/app.html
  • frontend/src/app/app.routes.ts
  • frontend/src/app/app.scss
  • frontend/src/app/app.spec.ts
  • frontend/src/app/app.ts
  • frontend/src/app/core/guards/auth.guard.spec.ts
  • frontend/src/app/core/guards/auth.guard.ts
  • frontend/src/app/core/interceptors/auth.interceptor.ts
  • frontend/src/app/core/models/artist-filter.models.ts
  • frontend/src/app/core/models/artist-profile.models.ts
  • frontend/src/app/core/models/auth.models.ts
  • frontend/src/app/core/models/booking.models.ts
  • frontend/src/app/core/models/quote.models.ts
  • frontend/src/app/core/models/showcase.models.ts
  • frontend/src/app/core/services/auth.service.spec.ts
  • frontend/src/app/core/services/auth.service.ts
  • frontend/src/app/core/services/favorites.service.ts
  • frontend/src/app/features/account/account.component.ts
  • frontend/src/app/features/artist-profile/artist-profile.component.html
  • frontend/src/app/features/artist-profile/artist-profile.component.scss
  • frontend/src/app/features/artist-profile/artist-profile.component.spec.ts
  • frontend/src/app/features/artist-profile/artist-profile.component.ts
  • frontend/src/app/features/artist-profile/components/sponsorship-section/sponsorship-section.component.html
  • frontend/src/app/features/artist-profile/components/sponsorship-section/sponsorship-section.component.scss
  • frontend/src/app/features/artist-profile/components/sponsorship-section/sponsorship-section.component.spec.ts
  • frontend/src/app/features/artist-profile/components/sponsorship-section/sponsorship-section.component.ts
  • frontend/src/app/features/artist-profile/services/artist-profile.service.ts
  • frontend/src/app/features/artists/artist-filter.service.spec.ts
  • frontend/src/app/features/artists/artists-page.component.html
  • frontend/src/app/features/artists/artists-page.component.scss
  • frontend/src/app/features/artists/artists-page.component.spec.ts
  • frontend/src/app/features/artists/artists-page.component.ts
  • frontend/src/app/features/artists/components/filter-panel/filter-panel.component.html
  • frontend/src/app/features/artists/components/filter-panel/filter-panel.component.scss
  • frontend/src/app/features/artists/components/filter-panel/filter-panel.component.spec.ts
  • frontend/src/app/features/artists/components/filter-panel/filter-panel.component.ts
  • frontend/src/app/features/artists/components/search-bar/search-bar.component.html
  • frontend/src/app/features/artists/components/search-bar/search-bar.component.scss
  • frontend/src/app/features/artists/components/search-bar/search-bar.component.spec.ts
  • frontend/src/app/features/artists/components/search-bar/search-bar.component.ts
  • frontend/src/app/features/artists/services/artist-filter.service.ts
  • frontend/src/app/features/auth/login/login.component.html
  • frontend/src/app/features/auth/login/login.component.scss
  • frontend/src/app/features/auth/login/login.component.spec.ts
  • frontend/src/app/features/auth/login/login.component.ts
  • frontend/src/app/features/booking/booking-summary/booking-summary.component.html
  • frontend/src/app/features/booking/booking-summary/booking-summary.component.scss
  • frontend/src/app/features/booking/booking-summary/booking-summary.component.spec.ts
  • frontend/src/app/features/booking/booking-summary/booking-summary.component.ts
  • frontend/src/app/features/booking/components/weekly-calendar/weekly-calendar.component.html
  • frontend/src/app/features/booking/components/weekly-calendar/weekly-calendar.component.scss
  • frontend/src/app/features/booking/components/weekly-calendar/weekly-calendar.component.spec.ts
  • frontend/src/app/features/booking/components/weekly-calendar/weekly-calendar.component.ts
  • frontend/src/app/features/booking/mock-checkout/mock-checkout.component.html
  • frontend/src/app/features/booking/mock-checkout/mock-checkout.component.scss
  • frontend/src/app/features/booking/mock-checkout/mock-checkout.component.ts
  • frontend/src/app/features/booking/my-bookings/booking-card/booking-card.component.html
  • frontend/src/app/features/booking/my-bookings/booking-card/booking-card.component.scss
  • frontend/src/app/features/booking/my-bookings/booking-card/booking-card.component.spec.ts
  • frontend/src/app/features/booking/my-bookings/booking-card/booking-card.component.ts
  • frontend/src/app/features/booking/my-bookings/my-bookings.component.html
  • frontend/src/app/features/booking/my-bookings/my-bookings.component.scss
  • frontend/src/app/features/booking/my-bookings/my-bookings.component.spec.ts
  • frontend/src/app/features/booking/my-bookings/my-bookings.component.ts
  • frontend/src/app/features/booking/payment-return/payment-return.component.html
  • frontend/src/app/features/booking/payment-return/payment-return.component.scss
  • frontend/src/app/features/booking/payment-return/payment-return.component.spec.ts
  • frontend/src/app/features/booking/payment-return/payment-return.component.ts
  • frontend/src/app/features/booking/review-form/review-form.component.html
  • frontend/src/app/features/booking/review-form/review-form.component.scss
  • frontend/src/app/features/booking/review-form/review-form.component.spec.ts
  • frontend/src/app/features/booking/review-form/review-form.component.ts
  • frontend/src/app/features/booking/services/booking.service.ts
  • frontend/src/app/features/booking/services/review.service.ts
  • frontend/src/app/features/map/map-view.component.html
  • frontend/src/app/features/map/map-view.component.scss
  • frontend/src/app/features/map/map-view.component.spec.ts
  • frontend/src/app/features/map/map-view.component.ts
  • frontend/src/app/features/map/map.service.ts
  • frontend/src/app/features/quote-chatbot/quote-chatbot.component.html
  • frontend/src/app/features/quote-chatbot/quote-chatbot.component.scss
  • frontend/src/app/features/quote-chatbot/quote-chatbot.component.spec.ts
  • frontend/src/app/features/quote-chatbot/quote-chatbot.component.ts
  • frontend/src/app/features/quote-chatbot/services/quote.service.spec.ts
  • frontend/src/app/features/quote-chatbot/services/quote.service.ts
  • frontend/src/app/features/showcase/showcase-page/showcase-page.component.html
  • frontend/src/app/features/showcase/showcase-page/showcase-page.component.scss
  • frontend/src/app/features/showcase/showcase-page/showcase-page.component.spec.ts
  • frontend/src/app/features/showcase/showcase-page/showcase-page.component.ts
  • frontend/src/app/features/showcase/showcase.service.spec.ts
  • frontend/src/app/features/showcase/showcase.service.ts
  • frontend/src/app/shared/components/artist-card/artist-card.component.html
  • frontend/src/app/shared/components/artist-card/artist-card.component.scss
  • frontend/src/app/shared/components/artist-card/artist-card.component.spec.ts
  • frontend/src/app/shared/components/artist-card/artist-card.component.ts
  • frontend/src/app/shared/components/certification-badge/certification-badge.component.html
  • frontend/src/app/shared/components/certification-badge/certification-badge.component.scss
  • frontend/src/app/shared/components/certification-badge/certification-badge.component.spec.ts
  • frontend/src/app/shared/components/certification-badge/certification-badge.component.ts
  • frontend/src/app/shared/components/showcase-section/showcase-section.component.html
  • frontend/src/app/shared/components/showcase-section/showcase-section.component.scss
  • frontend/src/app/shared/components/showcase-section/showcase-section.component.ts
  • frontend/src/app/shared/components/sponsor-badges/sponsor-badges.component.html
  • frontend/src/app/shared/components/sponsor-badges/sponsor-badges.component.scss
  • frontend/src/app/shared/components/sponsor-badges/sponsor-badges.component.spec.ts
  • frontend/src/app/shared/components/sponsor-badges/sponsor-badges.component.ts
  • frontend/src/app/shared/components/star-rating/star-rating.component.html
  • frontend/src/app/shared/components/star-rating/star-rating.component.scss
  • frontend/src/app/shared/components/star-rating/star-rating.component.spec.ts
  • frontend/src/app/shared/components/star-rating/star-rating.component.ts
  • frontend/src/environments/environment.production.ts
  • frontend/src/environments/environment.ts
  • frontend/src/index.html
  • frontend/src/main.ts
  • frontend/src/styles.scss
  • frontend/tsconfig.app.json
  • frontend/tsconfig.json
  • frontend/tsconfig.spec.json
  • global.json
  • login-samples.md
  • openspec/config.yaml
  • prompts.md
  • prompts/00-all-prompts.md
  • prompts/01-descripcion-general.md
  • prompts/02-cambiar stack tech.md
  • prompts/MASTER_BOOTSTRAP_PROMPT.md
  • prompts/initial.md
  • prompts/master-prompt-docs-plan.md
  • prompts/master-prompt-docs.md
  • readme.md
  • scripts/seed-images.ps1

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2822002927

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

confirmationUrl: $"{_flowSettings.ApiBaseUrl}/api/payments/confirm",
cancellationToken);

payment.FlowTransactionId = order.Token;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve Flow tokens across retries

When a client opens checkout, clicks retry, and then completes the first Flow page, this assignment has already overwritten the only stored token with the newer order token. The webhook/return for the paid earlier token is then treated as unknown in ConfirmAsync, so the user can be charged while the booking remains unconfirmed; either keep every outstanding Flow token/order or cancel/reuse the existing one instead of replacing it.

Useful? React with 👍 / 👎.

Comment thread .github/workflows/ci.yml
dotnet-version: 10.0.x

- name: Restore
run: dotnet restore

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Specify the backend solution in CI

In this workflow the backend steps run from backend/, which contains both backend.csproj and backend.slnx; Microsoft documents MSB1011 as Specify which project or solution file to use when more than one exists (https://learn.microsoft.com/en-us/visualstudio/msbuild/errors/msb1011). The restore step will fail before build/test unless the workflow passes backend.slnx or a specific project path.

Useful? React with 👍 / 👎.

}

var now = DateTime.UtcNow;
if (request.BookingDate.ToDateTime(start, DateTimeKind.Utc) <= now)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Compare booking times in local time

For same-day appointments in Chile, the DateOnly/TimeOnly values represent local shop time, but this converts them as if they were already UTC. For example, at 08:30 in Santiago, a 10:00 local slot is compared as 10:00 UTC and can be rejected as past even though it is still bookable locally; use the configured business timezone before comparing with UtcNow.

Useful? React with 👍 / 👎.

Comment thread docker-compose.yml
Comment on lines +87 to +90
api:
build: ./backend
container_name: inklink-api
profiles: ["full"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Run migrations in the full Docker stack

When the documented full profile is started against a fresh db_data volume, this API service uses the Dockerfile entrypoint without passing --seed, while Program.cs only calls Database.MigrateAsync() inside the args.Contains("--seed") block. The container can start successfully but every database-backed endpoint then hits missing tables, so the compose service needs a migration/seed command or startup migration path.

Useful? React with 👍 / 👎.

…tivo

El puerto 5432 chocaba con otro contenedor Postgres local (otro proyecto
AI4Devs), causando fallos de autenticación al conectar por localhost.
Se remapea inklink-db a 5434 en docker-compose y appsettings.

También se agrega la sección 1.3.1 de análisis competitivo LatAm en la
documentación técnica.
Título y body listos para usar al abrir el PR de cierre del proyecto.
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