Skip to content

Sprint 5: 150 lições, conteúdo es-ES, tema Nord e validação de dificuldade - #27

Merged
iagommendes merged 1 commit into
mainfrom
cursor/sprint-5-content-i18n-8eb5
Jun 30, 2026
Merged

iagommendes merged 1 commit into
mainfrom
cursor/sprint-5-content-i18n-8eb5

Conversation

@iagommendes

Copy link
Copy Markdown
Owner

Summary

Completa o Sprint 5 (Content & i18n) do roadmap:

Type of change

  • New lesson(s) or track
  • UI / feature
  • Documentation
  • CI / tooling

Checklist

  • pnpm typecheck passes
  • pnpm test passes
  • pnpm validate-content passes (150 lessons)
  • pnpm validate-difficulty passes
  • pnpm check-i18n passes
  • Lesson IDs follow 001-slug pattern
  • New lessons added to content/manifest.json
  • No secrets, credentials, or offensive content in lesson text

Detalhes técnicos

Área Mudança
Conteúdo 90 novos arquivos JSON + manifest v1.2.0
Temas Nord palette + ThemeCard com preview de cores
CI pnpm validate-difficulty após validate-content
Docs ROADMAP, ADDING-LOCALE, ADDING-THEME atualizados

Closes #11, #12, #13, #14

Open in Web Open in Cursor 

…ficulty validation

- Add 90 new lessons (006-010 per module en/pt, 30 es-ES for programmers + technical-writers)
- Update manifest to v1.2.0 with 150 validated lessons
- Add Nord color theme with visual swatch gallery in Settings
- Add validate-difficulty-progression script and CI step
- Fix difficulty regressions in existing lesson catalog
- Update ROADMAP, ADDING-LOCALE, and ADDING-THEME docs

Closes #11, #12, #13, #14

Co-authored-by: Iago Mendes <iagommendes@gmail.com>
@github-actions

Copy link
Copy Markdown

CoderKeys content preview

Total lessons in repo: 150

Changed content files: 99

Lessons in this PR

ID Track Locale Difficulty Preview
006-groupby-agg data-science en-US 3 df.groupby('region')['revenue'].agg(['sum', 'mean', 'count'])
007-sql-join data-science en-US 3 SELECT u.name, o.total FROM users u INNER JOIN orders o ON o.user_id = u.id;
008-pandas-merge data-science en-US 4 merged = users.merge(orders, on='user_id', how='left', validate='one_to_many')
009-sklearn-pipeline data-science en-US 4 pipe = Pipeline([('scale', StandardScaler()), ('clf', LogisticRegression())]) pi…
010-seaborn-plot data-science en-US 4 import seaborn as sns sns.scatterplot(data=df, x='latency', y='errors', hue='reg…
006-groupby-agg data-science pt-BR 3 df.groupby('region')['revenue'].agg(['sum', 'mean', 'count'])
007-sql-join data-science pt-BR 3 SELECT u.name, o.total FROM users u INNER JOIN orders o ON o.user_id = u.id;
008-pandas-merge data-science pt-BR 4 merged = users.merge(orders, on='user_id', how='left', validate='one_to_many')
009-sklearn-pipeline data-science pt-BR 4 pipe = Pipeline([('scale', StandardScaler()), ('clf', LogisticRegression())]) pi…
010-seaborn-plot data-science pt-BR 4 import seaborn as sns sns.scatterplot(data=df, x='latency', y='errors', hue='reg…
005-shell-pipeline devops en-US 3 curl -s https://api.example.com/health
006-docker-build devops en-US 3 docker build -t myapp:1.2.0 -f Dockerfile.prod . docker image ls myapp
007-kubectl-apply devops en-US 3 kubectl apply -f k8s/deployment.yaml kubectl rollout status deployment/api
008-helm-install devops en-US 4 helm upgrade --install api ./charts/api -n production --set image.tag=2.1.0
009-ansible-playbook devops en-US 4 ansible-playbook -i inventory/prod site.yml --tags deploy --check
010-journalctl devops en-US 4 journalctl -u api.service -f --since "10 min ago"
005-shell-pipeline devops pt-BR 3 curl -s https://api.example.com/health
006-docker-build devops pt-BR 3 docker build -t myapp:1.2.0 -f Dockerfile.prod . docker image ls myapp
007-kubectl-apply devops pt-BR 3 kubectl apply -f k8s/deployment.yaml kubectl rollout status deployment/api
008-helm-install devops pt-BR 4 helm upgrade --install api ./charts/api -n production --set image.tag=2.1.0
009-ansible-playbook devops pt-BR 4 ansible-playbook -i inventory/prod site.yml --tags deploy --check
010-journalctl devops pt-BR 4 journalctl -u api.service -f --since "10 min ago"
002-privacy-term legal-translators en-US 3 Personal data shall be processed lawfully, fairly, and in a transparent manner i…
005-ip-term legal-translators en-US 3 Licensee shall not sublicense, assign, or transfer any rights granted under this…
006-arbitration-clause legal-translators en-US 4 Any dispute arising from this agreement shall be resolved by binding arbitration…
007-nda-term legal-translators en-US 4 The receiving party shall not disclose confidential information except as requir…
008-force-majeure legal-translators en-US 4 Neither party shall be liable for delays caused by events beyond reasonable cont…
009-gdpr-notice legal-translators en-US 4 You may request access, correction, or deletion of your personal data by contact…
010-ip-assignment legal-translators en-US 4 The contractor hereby assigns all rights, title, and interest in the work produc…
002-termo-privacidade legal-translators pt-BR 3 Os dados pessoais serão tratados de forma lícita, leal e transparente em relação…
005-termo-pi legal-translators pt-BR 3 O licenciado não poderá sublicenciar, ceder ou transferir quaisquer direitos con…
006-arbitration-clause legal-translators pt-BR 4 Qualquer disputa decorrente deste acordo será resolvida por arbitragem vinculant…
007-nda-term legal-translators pt-BR 4 A parte receptora não divulgará informações confidenciais, exceto quando exigido…
008-force-majeure legal-translators pt-BR 4 Nenhuma parte será responsável por atrasos causados por eventos além do controle…
009-gdpr-notice legal-translators pt-BR 4 Você pode solicitar acesso, correção ou exclusão dos seus dados pessoais entrand…
010-ip-assignment legal-translators pt-BR 4 O contratado cede todos os direitos, títulos e interesses sobre o produto do tra…
006-destructuring programmers en-US 3 const { user: { name, address: { city } } } = payload; console.log(name, city);
007-optional-chaining programmers en-US 3 const label = config?.ui?.theme?.name ?? 'default'; return label.toUpperCase();
008-spread-rest programmers en-US 3 const merged = { ...defaults, ...overrides, version: 2 }; const all = [...items,…
009-regex-literals programmers en-US 4 const email = /^[\w.-]+@[\w.-]+.\w{2,}$/; const slug = /^[a-z0-9]+(?:-[a-z0-9]+…
010-generics programmers en-US 4 function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { return ke…
001-curly-basics programmers es-ES 1 const obj = { key: 'value' }; if (true) { console.log('hola'); }
002-array-brackets programmers es-ES 2 const items = [1, 2, 3]; const first = items[0]; items.push(items[items.length -…
003-pipe-chain programmers es-ES 2 const result = data
004-template-literals programmers es-ES 2 const msg = Usuario ${user.name} tiene ${user.score} puntos;
005-arrow-functions programmers es-ES 2 const doubled = values.map((n) => n * 2); const sum = values.reduce((a, b) => a …
006-destructuring programmers es-ES 3 const { user: { name, address: { city } } } = payload; console.log(name, city);
007-optional-chaining programmers es-ES 3 const label = config?.ui?.theme?.name ?? 'default'; return label.toUpperCase();
008-spread-rest programmers es-ES 3 const merged = { ...defaults, ...overrides, version: 2 }; const all = [...items,…
009-regex-literals programmers es-ES 4 const email = /^[\w.-]+@[\w.-]+.\w{2,}$/; const slug = /^[a-z0-9]+(?:-[a-z0-9]+…
010-generics programmers es-ES 4 function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { return ke…
006-destructuring programmers pt-BR 3 const { user: { name, address: { city } } } = payload; console.log(name, city);
007-optional-chaining programmers pt-BR 3 const label = config?.ui?.theme?.name ?? 'default'; return label.toUpperCase();
008-spread-rest programmers pt-BR 3 const merged = { ...defaults, ...overrides, version: 2 }; const all = [...items,…
009-regex-literals programmers pt-BR 4 const email = /^[\w.-]+@[\w.-]+.\w{2,}$/; const slug = /^[a-z0-9]+(?:-[a-z0-9]+…
010-generics programmers pt-BR 4 function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> { return ke…
006-performance-req technical-writers en-US 3 The search endpoint must return results within 200ms for 95% of requests under n…
007-security-req technical-writers en-US 3 All API tokens must expire after 24 hours and support immediate revocation by ad…
008-compliance-req technical-writers en-US 4 Personal data must be stored in the EU region and deleted within 30 days of acco…
009-migration-req technical-writers en-US 4 Legacy customer records must be migrated with zero data loss and a rollback plan…
010-observability-req technical-writers en-US 4 Each service must expose health, readiness, and latency metrics with alert thres…
005-commit-message technical-writers en-US 3 fix(auth): prevent token refresh loop when session cookie is missing
006-rate-limit-msg technical-writers en-US 3 You have exceeded the request limit. Please wait a minute and try again.
007-maintenance-notice technical-writers en-US 3 Scheduled maintenance will occur on Sunday from 02:00 to 04:00 UTC.
008-api-deprecation technical-writers en-US 4 This endpoint is deprecated and will be removed on 2026-12-01. Migrate to /v2/us…
009-support-reply technical-writers en-US 4 We reproduced the issue and deployed a fix. Please clear your cache and confirm.
010-release-notes technical-writers en-US 4 Version 2.4 adds dark mode, improves export performance, and fixes session timeo…
001-user-story technical-writers es-ES 2 Como administrador, quiero exportar informes en CSV para analizar métricas fuera…
002-acceptance-criteria technical-writers es-ES 2 Dado un usuario autenticado, cuando exporta un informe, entonces el archivo CSV …
003-given-when-then technical-writers es-ES 3 Dado que el carrito tiene artículos, cuando el usuario aplica un cupón válido, e…
004-api-requirement technical-writers es-ES 3 El endpoint GET /v1/users/{id} debe devolver 200 con el perfil del usuario o 404…
005-edge-case technical-writers es-ES 3 Si el usuario envía un archivo vacío, el sistema debe rechazar la carga con un m…
006-performance-req technical-writers es-ES 3 El endpoint de búsqueda debe devolver resultados en 200 ms para el 95% de las so…
007-security-req technical-writers es-ES 3 Todos los tokens de API deben expirar tras 24 horas y permitir revocación inmedi…
008-compliance-req technical-writers es-ES 4 Los datos personales deben almacenarse en la región de la UE y eliminarse en 30 …
009-migration-req technical-writers es-ES 4 Los registros heredados deben migrarse sin pérdida de datos y con plan de revers…
010-observability-req technical-writers es-ES 4 Cada servicio debe exponer métricas de salud, readiness y latencia con umbrales …
001-password-reset technical-writers es-ES 2 Hemos enviado un enlace para restablecer tu contraseña. Revisa tu bandeja de ent…
002-feature-request technical-writers es-ES 2 Los usuarios solicitan exportar datos en formato JSON además de CSV.
003-error-message technical-writers es-ES 2 El campo correo electrónico no es válido. Introduce una dirección con formato co…
004-onboarding-step technical-writers es-ES 3 Conecta tu repositorio para importar proyectos y empezar a practicar en minutos.
005-commit-message technical-writers es-ES 3 feat(auth): añadir inicio de sesión con proveedor OAuth2
006-rate-limit-msg technical-writers es-ES 3 Has superado el límite de solicitudes. Espera un minuto e inténtalo de nuevo.
007-maintenance-notice technical-writers es-ES 3 El mantenimiento programado será el domingo de 02:00 a 04:00 UTC.
008-api-deprecation technical-writers es-ES 4 Este endpoint está obsoleto y se eliminará el 2026-12-01. Migra a /v2/users.
009-support-reply technical-writers es-ES 4 Reprodujimos el problema y desplegamos una corrección. Borra la caché y confirma…
010-release-notes technical-writers es-ES 4 La versión 2.4 añade modo oscuro, mejora el rendimiento de exportación y corrige…
006-performance-req technical-writers pt-BR 3 O endpoint de busca deve retornar resultados em até 200ms para 95% das requisiçõ…
007-security-req technical-writers pt-BR 3 Todos os tokens de API devem expirar após 24 horas e suportar revogação imediata…
008-compliance-req technical-writers pt-BR 4 Dados pessoais devem ser armazenados na região da UE e excluídos em até 30 dias …
009-migration-req technical-writers pt-BR 4 Registros legados de clientes devem ser migrados sem perda de dados e com plano …
010-observability-req technical-writers pt-BR 4 Cada serviço deve expor métricas de health, readiness e latência com limiares de…
005-mensagem-commit technical-writers pt-BR 3 fix(auth): evitar loop de refresh de token quando o cookie de sessão está ausent…
006-rate-limit-msg technical-writers pt-BR 3 Você excedeu o limite de requisições. Aguarde um minuto e tente novamente.
007-maintenance-notice technical-writers pt-BR 3 Manutenção programada ocorrerá no domingo das 02:00 às 04:00 UTC.
008-api-deprecation technical-writers pt-BR 4 Este endpoint está obsoleto e será removido em 2026-12-01. Migre para /v2/users.
009-support-reply technical-writers pt-BR 4 Reproduzimos o problema e implantamos uma correção. Limpe o cache e confirme.
010-release-notes technical-writers pt-BR 4 A versão 2.4 adiciona modo escuro, melhora performance de exportação e corrige b…

Metadata changes

  • content/manifest.json

@iagommendes
iagommendes marked this pull request as ready for review June 30, 2026 22:13
@iagommendes
iagommendes merged commit 8e10d7c into main Jun 30, 2026
7 checks passed
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.

[Sprint 5] Lições es-ES — 30 lições em conteúdo

2 participants