Skip to content

docs: Comprehensive documentation reorganization#9

Merged
Perafan18 merged 2 commits intomasterfrom
docs/comprehensive-documentation
Dec 30, 2025
Merged

docs: Comprehensive documentation reorganization#9
Perafan18 merged 2 commits intomasterfrom
docs/comprehensive-documentation

Conversation

@Perafan18
Copy link
Owner

@Perafan18 Perafan18 commented Nov 23, 2025

Summary

Complete documentation overhaul with new docs/ folder structure containing comprehensive guides, tutorials, API documentation, and architecture details.

📁 Documentation Structure

docs/
├── README.md                              # Documentation index
├── getting-started/                       # 3 tutorial files
│   ├── installation.md
│   ├── quick-start.md
│   └── first-blockchain-tutorial.md
├── architecture/                          # 4 architecture files
│   ├── overview.md
│   ├── proof-of-work.md
│   ├── data-models.md
│   └── security-design.md
├── api/                                   # 3 API files
│   ├── reference.md
│   ├── examples.md
│   └── rate-limiting.md
├── guides/                                # 4 developer guides
│   ├── development-setup.md
│   ├── testing-guide.md
│   ├── deployment-guide.md
│   └── troubleshooting.md
└── [CHANGELOG, CONTRIBUTING, SECURITY, CLAUDE].md

📚 What's New

Getting Started (3 files)

  • Installation Guide - Step-by-step setup for macOS, Linux, and Docker
  • Quick Start - Create your first blockchain in 5 minutes
  • Complete Tutorial - Comprehensive walkthrough with mining examples

Architecture Documentation (4 files)

  • System Overview - High-level architecture with diagrams
  • Proof of Work Deep Dive - Mining algorithm explained with examples
  • Data Models - Complete MongoDB schema documentation
  • Security Design - Threat model and security layers

API Documentation (3 files)

  • API Reference - Complete endpoint documentation (moved + enhanced)
  • Code Examples - Integration examples in Python, JavaScript, Ruby, curl
  • Rate Limiting Guide - Best practices and retry logic

Developer Guides (4 files)

  • Development Setup - Complete environment configuration
  • Testing Guide - RSpec, coverage, CI/CD workflows
  • Deployment Guide - Production deployment (moved from root)
  • Troubleshooting - Solutions to common issues

🔄 Changes

New Files (17 files)

  • docs/README.md - Main documentation index
  • docs/getting-started/*.md (3 files)
  • docs/architecture/*.md (4 files)
  • docs/api/examples.md
  • docs/api/rate-limiting.md
  • docs/guides/*.md (4 files)

Moved Files

  • API_DOCUMENTATION.mddocs/api/reference.md
  • DEPLOYMENT.mddocs/guides/deployment-guide.md
  • CHANGELOG.mddocs/CHANGELOG.md
  • CLAUDE.mddocs/CLAUDE.md
  • CONTRIBUTING.mddocs/CONTRIBUTING.md
  • SECURITY.mddocs/SECURITY.md

Updated Files

  • README.md - Concise with links to comprehensive docs

✨ Documentation Features

  • 📚 Comprehensive - Covers all aspects from installation to deployment
  • 🎓 Educational - Clear explanations with examples
  • 💻 Code Examples - Multiple programming languages
  • 🔗 Cross-Linked - Easy navigation between documents
  • 📖 Well-Organized - Logical structure with clear categories
  • Professional - Follows documentation best practices

📊 Statistics

  • Total Documentation Files: 21 files
  • New Content: ~21,000 lines of documentation
  • Languages Covered: Python, JavaScript, Ruby, Bash
  • Sections: 4 main categories (Getting Started, Architecture, API, Guides)

🎯 Benefits

  1. Easier Onboarding - New users can quickly get started
  2. Better Understanding - Architecture docs explain how everything works
  3. Faster Integration - Code examples in multiple languages
  4. Troubleshooting - Common issues documented with solutions
  5. Professional Structure - Industry-standard documentation organization

📝 Test Plan

  • Verify all documentation links work
  • Check markdown rendering
  • Ensure code examples are correct
  • Validate cross-references between docs
  • Confirm moved files are accessible
  • Test navigation from README

🔍 Review Checklist

  • All documentation files created
  • Existing files properly moved
  • Links updated in README
  • Cross-references working
  • Code examples tested
  • Structure follows best practices
  • English language throughout

📖 Documentation Highlights

Installation Guide

Complete setup instructions for:

  • macOS (rbenv/rvm)
  • Linux (Ubuntu/Fedora)
  • Docker deployment
  • Troubleshooting common issues

Quick Start Tutorial

Get running in 5 minutes:

  • Install dependencies
  • Start server
  • Create first blockchain
  • Mine blocks

Architecture Deep Dive

  • System architecture diagrams
  • Data flow visualization
  • Proof of Work algorithm explained
  • Security threat model
  • MongoDB schema details

API Documentation

  • Complete endpoint reference
  • Request/response examples
  • Error handling patterns
  • Rate limiting strategies
  • Code examples in 4 languages

Developer Guides

  • Development environment setup
  • Testing with RSpec
  • CI/CD pipeline
  • Production deployment
  • Common troubleshooting

🤖 Generated with Claude Code

Summary by CodeRabbit

Notas de la Versión

  • Documentación
    • Se reorganizó completamente la documentación del proyecto en una estructura nueva y centralizada bajo docs/.
    • Se añadieron guías comprehensivas: inicio rápido, instalación, tutoriales, configuración de desarrollo, pruebas y resolución de problemas.
    • Se mejoró la documentación de API con ejemplos en múltiples lenguajes y detalles sobre limitación de velocidad.
    • Se reposicionó el proyecto como recurso educativo en lugar de producción.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Nov 23, 2025

Walkthrough

Se reestructura la documentación del proyecto ChainForge, desplazando contenido de la raíz del repositorio a una nueva carpeta docs/ con subcarpetas especializadas. Se actualizan archivos de configuración (rack_attack.rb) y referencias en múltiples archivos para apuntar a las nuevas rutas de documentación. El README pasa de un enfoque de producción a uno educativo.

Changes

Cohort / File(s) Summary
README restructure
README.md
Reemplaza disclaimer de producción con enfoque educativo, reorganiza secciones de características, simplifica instalación rápida eliminando pasos detallados, introduce estructura centrada en docs con enlaces a documentación externa.
Documentation root
docs/README.md, docs/CHANGELOG.md, docs/CONTRIBUTING.md
Añade índice general de documentación y metadatos del proyecto v2.0.0; actualiza referencias de API_DOCUMENTATION.md a docs/api/reference.md y nombre del servicio docker-compose de mongodb a db.
API documentation
docs/api/examples.md, docs/api/rate-limiting.md
Documenta ejemplos de uso multilenguaje (curl, Python, JavaScript, Ruby) y sistema de rate limiting basado en Rack::Attack con tres niveles de límites, implementación con Redis y manejo de errores.
Architecture documentation
docs/architecture/overview.md, docs/architecture/data-models.md, docs/architecture/proof-of-work.md, docs/architecture/security-design.md
Documenta arquitectura de tres capas, esquemas MongoDB, algoritmo PoW, análisis de SHA256 con dificultad por ceros iniciales, y estrategia de seguridad multicapa con threat modeling.
Getting started guides
docs/getting-started/quick-start.md, docs/getting-started/installation.md, docs/getting-started/first-blockchain-tutorial.md
Proporciona guías paso a paso para inicio rápido, instalación local/Docker con troubleshooting, y tutorial completo de blockchain desde génesis hasta validación.
Developer guides
docs/guides/development-setup.md, docs/guides/testing-guide.md, docs/guides/troubleshooting.md
Documenta configuración de desarrollo con rbenv/rvm/Docker, framework de pruebas RSpec con ejemplos de coverage, y troubleshooting categorizado por tema.
Configuration and meta files
config/rack_attack.rb, .gitignore, CLAUDE.md
Actualiza rutas Rack::Attack a /api/v1/chain y /api/v1/chain/.+/block; añade tasks/ a .gitignore; actualiza referencias de documentación en CLAUDE.md.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Áreas que requieren atención especial:

  • config/rack_attack.rb: Validar que las nuevas rutas de API /api/v1/chain coincidan con las rutas reales del servidor (verificar que no haya desalineación entre configuración y endpoints)
  • docs/CONTRIBUTING.md: Confirmar que el cambio de mongodb a db en docker-compose refleja el archivo docker-compose.yml actual
  • Consistencia de referencias cruzadas en todos los archivos de documentación para evitar enlaces rotos

Possibly related PRs

Poem

🐰 Con saltos de documentación, ¡qué felicidad!
Carpetas nuevas en docs/ organizadas con claridad.
PoW, seguridad, tutoriales sin fin,
Del README al docs, ¡la estructura mejoró sin parir!
Educativo, completo, un blockchain sin vanidad. 📚✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed El título describe claramente el cambio principal: una reorganización integral de documentación. Es conciso, específico y directamente relacionado con los cambios del PR que incluyen nuevas estructuras de documentación en la carpeta docs/ y reorganización de contenido.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch docs/comprehensive-documentation

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 and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

🧹 Nitpick comments (55)
tasks/private/05-pagination-search.md (5)

146-162: Verificar que los índices de MongoDB sean apropiados para los patrones de consulta.

Los índices definidos parecen apropiados para los endpoints:

  • Línea 146-147: Índices en timestamps para ordenamiento
  • Línea 157-159: Índices compuestos para queries frecuentes (blockchain_id + otros campos)
  • Línea 160: Índice de texto para búsqueda

Sin embargo, falta verificar si el índice compuesto en línea 158 (blockchain_id: 1, index: 1) es realmente necesario dado que existe en línea 157 (blockchain_id: 1, created_at: -1). MongoDB podría usar ambos o consolidarlos.

Considerar consolidar índices para reducir overhead de mantenimiento:

  index({ blockchain_id: 1, created_at: -1 })
  index({ blockchain_id: 1, index: 1 })
  index({ blockchain_id: 1, difficulty: 1 })

Si index es un campo secuencial, puede ser redundante con created_at. Revisar los patrones de consulta reales.


249-267: Tests para GET /api/v1/chains: Verificar que las aserciones sean completas.

Los tests verifican estructura de respuesta y límites máximos, lo cual es correcto. Sin embargo, falta verificar:

  • Orden de resultados (¿se respeta el parámetro sort?)
  • Casos edge como page=0 o page=999
  • Respuesta cuando no hay chains

Agregar tests para casos edge:

it 'returns default limit when not specified' do
  get '/api/v1/chains'
  data = JSON.parse(last_response.body)
  expect(data['pagination']['limit']).to eq(20)
end

it 'clamps page to minimum 1' do
  get '/api/v1/chains?page=0'
  data = JSON.parse(last_response.body)
  expect(data['pagination']['page']).to eq(1)
end

269-297: Tests para GET /api/v1/chain/:id/blocks: Considerar agregar validaciones de respuesta.

Los tests cubren escenarios importantes: paginación, filtrado por difficulty, y ordenamiento. Sin embargo, se podría mejorar:

  • Verificar que los bloques retornados correspondan a la chain especificada
  • Validar el formato de respuesta incluya chain_id

Verificar chain_id en respuesta:

it 'includes chain_id in response' do
  get "/api/v1/chain/#{chain.id}/blocks"
  data = JSON.parse(last_response.body)
  expect(data['chain_id']).to eq(chain.id.to_s)
end

338-360: Script de migración: Considerar agregar verificación de estado de índices.

El script crea índices correctamente, pero podría mejorar:

  • Verificar si los índices ya existen antes de crearlos
  • Agregar logging más detallado del progreso
  • Manejar errores de conexión a MongoDB

Mejorar el script de migración:

 #!/usr/bin/env ruby

 require_relative '../config/mongoid'

 puts "Adding pagination indexes..."

+begin
  Blockchain.create_indexes
  Block.create_indexes

  puts "✓ Indexes created successfully"

  # Verificar indexes
  puts "\nBlockchain indexes:"
  Blockchain.collection.indexes.each do |index|
    puts "  - #{index['name']}"
  end

  puts "\nBlock indexes:"
  Block.collection.indexes.each do |index|
    puts "  - #{index['name']}"
  end
+rescue => e
+  puts "✗ Error creating indexes: #{e.message}"
+  exit 1
+end

432-437: Consideraciones de performance: Aclarar trade-offs de cursor vs offset.

Las notas sobre performance mencionan cursor-based pagination para futuras versiones. Esto es perspicaz, pero convendría documentar mejor:

  • Offset es más simple pero ineficiente con datasets grandes
  • Cursor es más eficiente pero requiere estado
  • Considerar implementar ambos según el caso de uso

Ampliar las consideraciones de performance:

## Consideraciones de Performance

1. **Indexes**: Críticos para performance con datasets grandes
2. **Límite máximo**: 100 para prevenir queries pesados
3. **Count caching**: Considerar cachear totals en Redis (Task 10)
4. **Cursor-based pagination**: Para futuras versiones, considerar cursor en lugar de offset
   - Offset: O(n) - más lento con páginas altas
   - Cursor: O(1) - consistente pero requiere estado
5. **Full-text search**: Usar MongoDB text indexes en lugar de regex
tasks/private/14-websocket-support.md (6)

47-85: Configuración de Faye: Validación de suscripción incompleta

La clase ServerAuth en línea 64-79 valida las suscripciones, pero solo permite canales que coincidan con el patrón /blockchain/ o /meta/subscribe. Esto podría ser demasiado restrictivo para extensiones futuras. Considere:

  1. Parametrizar patrones permitidos como configuración
  2. Documentar explícitamente qué canales son válidos
  3. Agregar autenticación basada en tokens (actualmente no la hay)

100-135: Método publish_block: Truncamiento de datos sensibles

En línea 126-128, se truncan el hash y la dirección del minero:

hash: block.hash[0..15] + '...',
miner: block.miner[0..12],

Esto es bueno para privacidad en el canal global, pero:

  • No está documentado por qué se trunca (solo 15 caracteres del hash)
  • Debería ser configurable según necesidades de seguridad
  • Considere usar una función de anonimización dedicada

196-198: Manejo de errores en publish: Falla silenciosa

El método publish (línea 188-194) captura todas las excepciones y solo registra:

rescue => e
  LOGGER.error "Failed to publish to WebSocket", ...
end

Esto es apropiado, pero considere:

  • Implementar un mecanismo de reintento para fallos transitivos
  • Distinguir entre errores de conexión y de validación
  • Documentar comportamiento esperado cuando Redis/Faye está caído

275-308: Cliente JavaScript: Manejo de desconexión

El cliente en línea 295-305 maneja eventos transport:down y transport:up, pero:

  • No hay lógica de reconexión explícita ni backoff exponencial
  • Faye ya incluye reintentos por defecto, pero está subutilizado
  • El indicador visual se actualiza, pero no hay feedback de intentos de reconexión

Recomendación: Agregar contador visible de intentos de reconexión.


379-393: Almacenamiento de suscripciones: Riesgo de memory leak

La estructura subscriptions es un Map que crece indefinidamente:

this.subscriptions.set(subscriptionKey, { ... });

Consideraciones:

  • En SPA con navegación frecuente, las suscripciones antiguas pueden no limpiarse
  • No hay TTL o limite de tamaño
  • El evento beforeunload limpia al cerrar, pero no en cambios de ruta

Recomendación: Implementar método cleanup() llamado antes de nuevas suscripciones.


704-742: Docker: Faye sin persistencia configurada

El servicio Faye en línea 723-732:

faye:
  build: .
  command: bundle exec rackup config/faye.ru -p 9292

Problemas:

  • No hay volume para persistencia de estado
  • Perdería mensajes pendientes si se reinicia
  • Con múltiples réplicas, los clientes pueden reconectarse a una instancia distinta

Recomendación: Para producción, considerar Redis backend para Faye (ya está configurado en línea 57-59 del archivo).

tasks/private/04-openapi-sdks.md (1)

189-207: Parámetros: Formato ObjectId no estándar

Se usa format: objectid en línea 196 y 204:

schema:
  type: string
  format: objectid

Problema: objectid no es un formato OpenAPI 3.0 estándar. Los formatos válidos son: date-time, email, hostname, ipv4, ipv6, uri, uuid, etc.

Recomendación:

format: custom  # O simplemente omitir format
pattern: '^[a-f0-9]{24}$'  # Añadir patrón MongoDB ObjectId
tasks/private/00-INDEX.md (2)

94-106: Breaking Changes: Impacto potencial no completamente documentado

Se declaran 4 breaking changes principales, pero falta claridad sobre:

  1. Línea 96: "De data: String a transactions: Array" - ¿Hay migración automática de datos existentes? ¿Script incluido?
  2. Línea 97: "POST block puede retornar job_id" - ¿Se mantiene endpoint sincrónico como fallback?
  3. Línea 98: "Redis Requerido" - ¿Sin Redis no funciona nada, o solo características específicas?
  4. Línea 99: "API Response Format" - Se mencionan nuevos campos pero no se especifican todos

Recomendación: Crear sección "Migration Path" más detallada con ejemplos antes/después de cada cambio.


108-128: Métricas de Éxito: Objetivos vagos

Los criterios no son SMART (Específicos, Medibles, Alcanzables, Relevantes, Acotados en tiempo):

  • Línea 110-111: ">90% coverage" - ¿De qué archivos? ¿Excluyendo tests?
  • Línea 120-121: "API response times <200ms" - ¿P50? ¿P95? ¿P99? ¿Con qué carga?
  • Línea 122: "Block Explorer carga en <2s" - ¿Primera carga? ¿Con cuántos bloques?
  • Línea 125: "Enseña 8+ conceptos" - ¿Quién valida? ¿Cómo se mide?

Recomendación: Ser más específico. Ejemplo:

- P95 API response time <200ms under 1000 req/s load
- Test coverage >90% in src/, test/* excluded
- First meaningful paint <2s on Chrome Fast 3G
tasks/private/02-health-metrics.md (1)

94-119: Métricas Prometheus: Buckets para mining_duration_seconds son conservadores

Línea 99:

buckets: [0.1, 0.5, 1.0, 5.0, 10.0, 30.0, 60.0, 300.0]

Con difficulty variable y mining asincrónico (Task 11), el tiempo de mining puede variar enormemente. Consideraciones:

  1. 0.1s es demasiado pequeño si difficulty ≥ 2
  2. Falta bucket para >300s (10+ minutos en casos extremos)
  3. Demasiados buckets intermedios, mejor tener 4-5 buckets lógicos

Recomendación para Task 12 (performance): Hacer buckets dinámicos basados en dificultad histórica.

tasks/private/01-structured-logging.md (2)

75-101: RequestLogger Middleware: Correlation ID puede colisionar

Línea 77:

correlation_id = request.env['HTTP_X_REQUEST_ID'] || SecureRandom.uuid

Problemas:

  1. Confía en header HTTP del cliente sin validación (pueden enviar IDs duplicados/malformados)
  2. SecureRandom.uuid genera UUIDv4 (aleatorio), no UUIDv7 (time-based) → dificulta debugging temporal
  3. No hay log del cambio de correlation_id si el cliente envía uno

Recomendación:

provided_id = request.env['HTTP_X_REQUEST_ID']
correlation_id = SecureRandom.uuid

if provided_id && /^[\w\-]{8,}$/.match?(provided_id)
  correlation_id = provided_id
  LOGGER.debug("Using client-provided correlation_id", client_id: provided_id)
end

162-195: Logging en modelos: Acceso a logger requiere mixin

Línea 129 declara include SemanticLogger::Loggable para acceder a logger, pero:

  • No está claro si esto es opcional o mandatorio
  • Modelos sin este mixin no tendrán logging consistente
  • Mejor hacerlo automático en base class

Sugerencia: En archivo de initialización:

Mongoid::Document.module_eval do
  include SemanticLogger::Loggable
end
tasks/private/10-redis-integration.md (2)

195-214: CacheHelper: cache_fetch puede causar N+1

Línea 196-214 implementa patrón cache-aside, pero cuando hay miss:

value = yield  # Ejecuta bloque (potencialmente query)
REDIS.with do |redis|
  redis.setex(key, ttl, value.to_json)
end

Si se llama en loop:

users.each { |u| cache_fetch("user:#{u.id}") { User.find(u.id) } }

Causaría 1 query por usuario miss. Mejor:

# Cache-aside con batch loading
cache_fetch_batch(['user:1', 'user:2'], ttl: 300) do |missing_keys|
  ids = missing_keys.map { |k| k.split(':')[1] }
  User.where(id: ids).map { |u| ["user:#{u.id}", u] }.to_h
end

444-444: RSpec test: Limpieza incompleta de Redis

Línea 427:

before { REDIS.with { |r| r.flushdb } }

Problema: FLUSHDB solo limpia la DB actual (db 0). Si hay múltiples test databases o si Redis está compartido con otros servicios, puede haber contaminación.

Recomendación:

before { REDIS.with { |r| r.flushdb(async: true) } }  # Redis 4.0+

# O más seguro, usar DB separada para tests
# config/redis.rb:
# db: ENV['REDIS_DB'] || (ENV['RACK_ENV'] == 'test' ? 1 : 0)
tasks/private/12-performance-optimization.md (2)

45-63: Índices Blockchain: Índice compuesto sub-óptimo

Línea 50:

{ key: { created_at: -1, total_blocks: -1 } }  # Compound index

Problema: Este índice probablemente no es útil:

  • Ordenar por created_at luego total_blocks es raro
  • total_blocks cambia frecuentemente (causa invalidación de índices)
  • Mejor tener indices simples separados

Pregunta: ¿Cuál es el query pattern que justifica este índice? Sin contexto, parece especulativo.

Recomendación: Dejar solo:

{ key: { created_at: -1 } }
{ key: { total_blocks: -1 } }

Agregar índices compuestos solo basado en query patterns reales medidos.


666-805: Benchmark Suite: Falta baseline y regresión tracking

El suite en línea 674-799 mide performance absoluta, pero:

  1. Sin baseline histórico, difícil saber si es mejora o regresión
  2. No hay forma de fallar el build si performance degrada
  3. Benchmarks dependen de hardware/carga actual → resultados varían
  4. Datos "Before/After" en línea 884-906 son ficticios (10x improvement es optimista)

Recomendación:

  • Guardar resultados en archivo JSON
  • Comparar con baseline anterior
  • Fallar CI si regresión >5%
  • Usar benchmark-ips gem para resultados más estables
tasks/private/11-async-mining-sidekiq.md (3)

247-274: MiningWorker: Actualización de progreso cada 10k intentos puede causar lag

Línea 258-260:

if attempt % update_interval == 0
  progress = [30 + (attempt / 100_000), 95].min  # Progress from 30% to 95%
  at(progress, "Mining: #{attempt} attempts, #{(Time.now - start_time).round(2)}s")
end

Con difficulty bajo (2-3), update_interval = 10_000 puede significar:

  • En máquina rápida: actualizaciones cada 0.5-1 segundo (muchas)
  • En máquina lenta: actualizaciones cada 10+ segundos (pocas)
  • Cálculo attempt / 100_000 asume tasa fija de hashing → impreciso

Recomendación: Actualizar por tiempo, no por intentos:

last_update = Time.now
update_interval_sec = 2  # Cada 2 segundos

loop do
  # ... mining logic ...
  
  if (Time.now - last_update) > update_interval_sec
    progress = [30 + (time_elapsed / total_estimated_time * 65), 95].min
    at(progress, "...")
    last_update = Time.now
  end
end

579-603: GET /api/v1/jobs/:job_id: Fallback a Sidekiq status es débil

Línea 584-603:

mining_job = MiningJob.find_by(job_id: job_id)

if mining_job
  mining_job.full_info.to_json
else
  # Fallback to Sidekiq status
  status_data = Sidekiq::Status.get_all(job_id)
  halt 404 unless status_data
  # ...
end

Problemas:

  1. Si MongoDB está caído, buscar primero causa retraso
  2. Si Sidekiq status expiró pero MiningJob no existe → 404 en ambos (correcto pero tardío)
  3. No hay synchronization: status_data de Sidekiq puede diferir de mining_job si ambos existen

Mejor: Consultar Sidekiq primero (más rápido), sincronizar a MongoDB si es reciente:

status = Sidekiq::Status.get_all(job_id)
halt 404 unless status

mining_job = MiningJob.find_by(job_id: job_id)
mining_job ||= MiningJob.create_from_job(job_id, ...) if status

# Return merged view

809-820: Docker: Réplicas hardcodeadas

Línea 821:

replicas: 3  # Run 3 workers

Problema: Hardcodeado a 3 workers. En producción necesitarás:

  • Escalar automáticamente según carga (Kubernetes HPA)
  • Configurar por ambiente (dev=1, prod=N)
  • Monitorear workers activos vs queued jobs

Recomendación:

deploy:
  replicas: ${WORKER_REPLICAS:-1}  # O use docker-compose scale
tasks/private/07-merkle-trees.md (4)

1-25: Revisa la ortografía y usa terminología consistente en español.

El documento mezcla términos en inglés ("transactions", "blocks", "proofs") con español. Mientras que es aceptable para términos técnicos establecidos en blockchain, se sugiere:

  • Línea 12: "transactions" → "transacciones" o mantener como "transactions" consistentemente
  • Línea 16: "Blocks contienen" → "Los bloques contienen"
  • Considerar crear un glosario de términos en inglés si se usan términos técnicos en inglés

Esto mejorará la consistencia del documento.


59-181: Excelente implementación de MerkleTree. Verifica casos edge y duplicación de código.

La clase MerkleTree está bien estructurada. Observaciones positivas:

  • ✅ Manejo correcto de árboles con número impar de hojas (duplicación del último nodo)
  • ✅ Generación de proofs con posiciones (left/right) correcta
  • ✅ Verificación de firma resistente a tampering

Sin embargo, hay duplicación de código: los métodos hash_data y hash_pair existen tanto como instancia como clase (líneas 150-163 vs 165-178). Simplifica refactorizando a métodos de clase únicamente.


216-252: Advierte sobre ciclo infinito potencial y cálculo incorrecto de merkle_root.

Línea 221: Se asigna merkle_root dentro de mine_block, pero también se llama a calculate_merkle_root en el callback before_save (línea 214). Esto puede causar:

  1. Doble cálculo innecesario
  2. Posible inconsistencia si el merkle_root cambia entre asignación y guardado

Recomendación: Asigna el merkle_root en before_validation en lugar de dentro de mine_block, o verifica que no hay doble inicialización.


636-644: Los tests de Merkle verifican correctamente el comportamiento.

Los tests en merkle_tree_spec.rb son comprehensivos:

  • ✅ Verifican árboles con poder de 2, número impar, y un solo elemento
  • ✅ Verifican determinismo
  • ✅ Verifican detección de tampering

Considera agregar test para:

  • Árbol muy grande (100+ transacciones) para verificar rendimiento
  • Proofs serialización/desserialización (JSON round-trip)
tasks/private/06-dynamic-difficulty.md (2)

36-90: Algoritmo simplificado es apropiado para educación, pero documenta limitaciones.

La implementación usa ajuste escalonado (±1) en lugar del enfoque proporcional de Bitcoin. Esto es correcto para educación, pero:

  • Línea 49-65: El comentario "Approach Avanzado" está bien, pero considera mencionar por qué se elige lo simplificado
  • La decisión es educativamente válida: enseña el concepto sin complejidad de point arithmetic

Recomendación: Agrega un comentario explicando la simplificación pedagogía.


355-379: RuboCop check: Considera formateo de bloques de código.

Línea 19 en static_analysis_hints: "Fenced code blocks should have a language specified". La sección de configuración (línea 28) usa triple backticks sin especificar ruby.

Actualiza:

29-29: ```ruby  (en lugar de ```)
tasks/private/09-digital-signatures.md (2)

216-260: Verifica que create_signable_message sea determinístico y resistente a replay.

Línea 245-259: El método crea un mensaje incluyendo timestamp. Esto es bueno para replay protection.

⚠️ Potencial issue: El mensaje NO incluye nonce. Para protección completa contra replay en la misma transacción, considera:

  • Línea 253: Agregar un nonce field (generado client-side)
  • O incluir más contexto del transaction (block number, etc.)

Sin embargo, para educación, timestamp es suficiente. Documentar esta limitación.


355-453: CLI commands están bien diseñados. Verifica manejo de excepciones.

Línea 393-395: Catch de WalletError es correcto. ✅

⚠️ Línea 431-433: El rescue => e genérico es muy amplio. Considera ser más específico (e.g., rescue Net::HTTPError).

Recomendación: Simplifica a errores esperados solamente, deja otros propagarse para debugging.

tasks/private/08-structured-transactions.md (2)

155-244: Mempool está bien diseñado con protecciones.

Línea 187-191: Ordenamiento por fee (highest first). ✅ Correcto para blockchain real.

Línea 194-217: Función remove_transactions es idempotente (usa find, no assume índice). ✅ Bueno.

⚠️ Línea 220-222: El check de existencia es O(n) - para muchas transacciones, considera usar Set o índice.

Para educación, esto está bien. Para producción, optimiza.


379-399: balance_of calcula correctamente pero es O(n) en blockchain size.

Línea 384-386: Itera sobre todas las transacciones y suma received/sent. Esto es correcto pero ineficiente para blockchains grandes.

Para educación, está bien. Para producción, implementaría índice por address o UTXO set.

Documenta esta limitación en el método o en architecture.

docs/getting-started/installation.md (1)

248-252: Especifica lenguaje en bloque de código para mejor renderizado.

Línea 248-252: El bloque de salida del servidor no tiene lenguaje especificado. Debería ser bash o text:

== Sinatra (v4.0.0) has taken the stage on 1910 for development with backup from Puma

Cambiar:

248-248: ```text (en lugar de ```)
docs/guides/development-setup.md (2)

19-19: Especifica lenguaje en 4 bloques de código sin formateo.

Líneas 19, 210, 235, 310 (según markdownlint hints): Bloques de configuración/output sin lenguaje especificado.

Ejemplos de correcciones necesarias:

  • Línea 19: bash (en lugar de )
  • Línea 210: ````bash (configuración)
  • Línea 235: ````bash (output)
  • Línea 310: ````bash (output)

Aunque sea opcional, mejora legibilidad y syntax highlighting.

Also applies to: 210-210, 235-235, 310-310


374-386: Verifica que rerun gem está en Gemfile.

Línea 434-437: Se sugiere instalar rerun gem para auto-reloading. Pero no se ve en el documento si está en el Gemfile.

Recomendación: Agrega nota sobre agregar a Gemfile:

gem 'rerun', group: :development

O usa bundle exec rerun directamente (más seguro).

docs/api/examples.md (1)

350-414: Verifica que JavaScript examples usan try/catch correcto.

Línea 400-414: El cliente de ejemplo usa promesas directamente sin error handling en el uso. La clase ChainForgeClient está bien, pero el uso debería tener try/catch:

Línea 401-414 sería mejor como:

(async () => {
  try {
    const client = new ChainForgeClient();
    // ... etc
  } catch (error) {
    console.error("Error:", error);
  }
})();

Esto es un detalle menor pero educativamente importante mostrar error handling. Está parcialmente hecho (línea 359 tiene checks), pero el ejemplo de uso principal podría ser más claro.

docs/guides/troubleshooting.md (1)

447-450: Especificar el lenguaje del bloque de código en la línea 447.

El bloque de código en before do debe incluir el identificador de lenguaje ruby después de los tres acentos invertidos para mejorar la legibilidad y el resaltado de sintaxis.

-```
+```ruby
 before do
   content_type :json
 end
-```
+```
docs/guides/testing-guide.md (3)

45-51: Especificar lenguaje en bloque de código de la tabla de contenidos (línea 45).

El bloque de código debe indicar que es un árbol de directorios o usar un lenguaje específico (incluso plaintext es preferible a dejarlo sin especificar).

-```
+```
 spec/
 ├── spec_helper.rb        # RSpec configuration
 ├── block_spec.rb         # Block model tests
 ├── blockchain_spec.rb    # Blockchain model tests
 └── api_spec.rb           # API integration tests
-```
+```

202-203: Usar headings en lugar de énfasis para secciones de ejemplo.

Las líneas 202, 254, 303 y 359 usan **Example:** cuando deberían usar headings Markdown (por ejemplo, ### Example: ...). Esto mejora la estructura del documento y la navegación.

Por ejemplo, cambiar:

-**Example: Hash Calculation**
+### Example: Hash Calculation

Aplicar el mismo patrón a todas las secciones similares (Mining, Chain Integrity, API Endpoints, etc.).

Also applies to: 254-255, 303-304, 359-360


531-535: Especificar lenguaje en bloque de código de tabla JSON (línea 531).

El bloque en la línea 531 necesita un language specifier. En este caso, parece ser una salida de cobertura, podría ser plaintext o dejar en blanco si es simplemente texto.

-```
+```plaintext
 COVERAGE: 94.23% -- 147/156 lines in 5 files
 
 File                      | % Coverage | Lines | Relevant Lines | Lines Missed
docs/getting-started/first-blockchain-tutorial.md (1)

151-167: Especificar lenguaje para bloques de código sin especificar (líneas 151, 284, 379, 387, 392, 402).

Múltiples bloques de código en este archivo no tienen identificador de lenguaje:

  • Línea 151: Pseudocódigo del proceso de mining → usar ```pseudo o ```text
  • Línea 284: Diagrama de estructura de blockchain → usar ```text
  • Línea 379-387: Pseudocódigo de cambio de datos → usar ```pseudo
  • Línea 392-402: Pseudocódigo de re-mining → usar ```pseudo
-```
+```pseudo
 Target: Hash must start with "0" (one leading zero)
 
 Attempt 1: nonce=0

Aplicar el mismo patrón a los bloques restantes sin language specifier.

docs/architecture/security-design.md (1)

21-33: Especificar lenguaje para bloques de código sin especificar (líneas 21, 313, 456, 470).

Varios bloques de código carecen de identificador de lenguaje:

  • Línea 21: Diagrama ASCII → usar ```text
  • Línea 313: Pseudocódigo de validación → usar ```pseudo
  • Línea 456: Escenario de ataque → usar ```text
  • Línea 470: Comparación de Bitcoin → usar ```text
-```
+```text
 ┌────────────────────────────────────────┐
 │  Layer 5: Application Logic Security  │ ← Chain integrity validation
docs/architecture/proof-of-work.md (2)

50-74: Especificar lenguaje para múltiples bloques de código sin especificar.

Este archivo tiene múltiples bloques de código sin identificador de lenguaje (líneas 50, 61, 151, 247-305, 259-303, 379-416). La mayoría son pseudocódigo, diagramas de texto, o ejemplos de Ruby que deberían incluir language specifiers para mejor legibilidad.

Ejemplo de corrección:

-```
+```pseudo
 Input: block (with index, data, previous_hash, difficulty)
 Output: nonce that produces valid hash
 
 1. target ← generate string of N zeros (N = difficulty)

Recomendación: Revisar y especificar language specifiers para todos los bloques. Usar:

  • ruby para código Ruby
  • pseudo para pseudocódigo
  • text para diagramas ASCII

Also applies to: 151-167, 247-305, 379-416


259-303: Considerar usar headings para "Attempt N:" en lugar de énfasis.

Las líneas 259, 270, 281, 294 y similares usan **Attempt N: nonce = ...** cuando sería más claro usar headings Markdown (p.ej., #### Attempt N: nonce = ...). Esto mejora la estructura del documento.

-**Attempt 1: nonce = 0**
+#### Attempt 1: nonce = 0
docs/api/rate-limiting.md (1)

54-84: Especificar lenguaje para bloques de código sin especificar (líneas 54, 65, 76, 165, 604).

Varios bloques de código carecen de language specifier:

  • Línea 54: Ejemplo de curl → ```bash
  • Línea 65: Ejemplo con salida → ```bash
  • Línea 76: Ejemplo con salida → ```bash
  • Línea 165: Tabla de headers → ```text o ```plaintext
  • Línea 604: Ejemplo de respuesta HTTP → ```http o ```text
-```
+```bash
 
 response=$(curl -s -w "\n%{http_code}" -X POST http://localhost:1910/api/v1/chain)

Aplicar a todos los bloques sin language specifier.

tasks/private/03-cli-tool.md (1)

16-35: Especificar lenguaje bash para bloques de comandos de CLI (línea 21).

El bloque de comandos de CLI debe incluir ```bash para mejor resaltado de sintaxis.

-```
+```bash
 # Gestión de chains
 chainforge create                    # Crear nueva chain
 chainforge list                      # Listar chains
docs/getting-started/quick-start.md (2)

248-248: Especificar lenguaje para bloque de código cerrado.

El bloque de código falta especificar el lenguaje. Debería ser bash o similar.

-```
+```bash
curl -X POST http://localhost:1910/api/v1/chain/<id>/block \

332-332: Moderación de signos de exclamación.

El documento usa 9 signos de exclamación en ~5600 caracteres, lo que puede parecer excesivo. Considera reducir algunos para mantener un tono más equilibrado y profesional.

docs/architecture/data-models.md (4)

19-19: Especificar lenguaje para bloque de código Ruby.

-```
+```ruby
 class Blockchain

210-210: Especificar lenguaje para bloque de código Ruby.

-```
+```ruby
 field :_hash, type: String, as: :hash

235-235: Especificar lenguaje para bloque de código bash.

-```
+```bash
 # .env

310-310: Especificar lenguaje para bloque de código Ruby.

-```
+```ruby
 block.difficulty = 3
tasks/private/13-block-explorer-ui.md (1)

953-1035: Tests de features RSpec cobertura apropiada.

Los tests de features cubren homepage, listado de blockchains, detalles de blockchain, detalles de bloque y búsqueda. La estructura RSpec.describe y helpers como create y create_list sugieren uso de factory_bot, que es apropiado.

Verifica que los factories para blockchain y block estén correctamente definidos con los nombres Test Chain y propiedades requeridas. ¿Te gustaría que genere especificaciones completas de factory para asegurar compatibilidad?

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
README.md (1)

58-77: Ejemplo de inicio rápido es útil, pero clarifica el formato de respuesta.

El flujo de ejemplo (crear cadena → extraer bloque → ver resultado) es lógico y demuestra bien el concepto de PoW con nonce y dificultad. Sin embargo, las líneas 70-76 presentan la respuesta como comentarios, lo cual podría confundir a usuarios sobre si es la salida real o solo una documentación. Considera usar un bloque json separado o aclarar que es un formato de respuesta esperado.

Opcionalmente, reformatea para mayor claridad:

- # Returns: {
- #   "chain_id": "674c8a1b2e4f5a0012345678",
+ # Response:
+ ```json
+ {
+   "chain_id": "674c8a1b2e4f5a0012345678",
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b747056 and 66fbc91.

📒 Files selected for processing (1)
  • README.md (2 hunks)
🔇 Additional comments (7)
README.md (7)

3-10: Introducción y descripción del proyecto claras y apropiadas.

La nueva descripción posiciona correctamente ChainForge como proyecto educativo enfatizando Proof of Work, REST API y conceptos criptográficos fundamentales. El tagline es conciso y establece claramente el propósito de aprendizaje.


14-19: Sección de características reorganizada efectivamente.

La lista condensada de características es clara y destaca lo esencial: Proof of Work, API REST, integridad de cadena, seguridad, pruebas y CI/CD. Mejora legibilidad manteniendo la información relevante.


124-189: Secciones de Desarrollo, Contribución y Proyecto Educativo bien equilibradas.

Las instrucciones de desarrollo son prácticas (testing, coverage, linting), la sección educativa es clara sobre limitaciones ("NOT for production"), y las directrices de contribución remiten apropiadamente a docs/CONTRIBUTING.md manteniendo el README legible. El énfasis repetido en uso educativo es apropiado.


79-110: La estructura de documentación está correctamente implementada y todos los enlaces son válidos.

Se ha verificado la existencia de los 18 archivos de documentación referenciados en el README. La reorganización en categorías (Getting Started, Architecture & Design, API Documentation, Developer Guides, Project Information) está implementada correctamente y sigue una estructura lógica y coherente.


111-122: Verifica que los límites de velocidad coincidan con la configuración de Rack::Attack

Los límites de velocidad en la tabla están correctamente alineados con la configuración en config/rack_attack.rb:

  • POST /api/v1/chain: 10/min ✓ (configurado como limit: 10)
  • POST /api/v1/chain/:id/block: 30/min ✓ (configurado como limit: 30)
  • GET /chain/:id/block/:block_id y POST /chain/:id/block/:block_id/valid: 60/min ✓ (utilizan el límite global de limit: 60)

La tabla proporciona una referencia clara de los endpoints principales con sus métodos, descripción y límites de velocidad aplicables. La redirección a docs/api/reference.md para documentación completa es apropiada para mantener el README conciso.


31-48: Las instrucciones de instalación son correctas: .env.example existe en la raíz del repositorio.

La verificación confirma que el archivo .env.example existe con las variables de configuración esperadas (MONGO_DB_NAME, MONGO_DB_PORT, MONGO_DB_HOST, ENVIRONMENT, DEFAULT_DIFFICULTY). El paso en línea 40 del README es válido y los pasos de instalación están documentados correctamente.


199-207: Verificación de versionado completada: consistencia confirmada.

La versión 2.0.0 en la línea 201 de README.md es consistente con toda la documentación del proyecto. Se encontró el mismo número de versión referenciado en docs/CHANGELOG.md ([2.0.0] - 2025-11-09), docs/SECURITY.md (Version: 2.0.0) y docs/README.md (Current Version: 2.0.0). No se encontraron inconsistencias de versionado.

## Summary
Complete documentation overhaul with new docs/ folder structure containing
comprehensive guides, tutorials, API documentation, and architecture details.

## Changes
- Created docs/ folder with organized documentation structure
- Moved existing documentation files to docs/
- Added getting-started/ guides (installation, quick-start, tutorial)
- Added architecture/ documentation (overview, PoW, data models, security)
- Added api/ documentation (reference, examples, rate limiting)
- Added guides/ documentation (dev setup, testing, deployment, troubleshooting)
- Updated root README.md to be concise with links to comprehensive docs
- Fixed rate limiting paths to use /api/v1/* endpoints
- Fixed Docker service name references (mongodb → db)
- Updated references to moved files
- Added tasks/ to .gitignore

## New Documentation Files (17 files)
**Getting Started:**
- docs/getting-started/installation.md - Complete installation guide
- docs/getting-started/quick-start.md - 5-minute quick start tutorial
- docs/getting-started/first-blockchain-tutorial.md - Comprehensive walkthrough

**Architecture:**
- docs/architecture/overview.md - System architecture and data flow
- docs/architecture/proof-of-work.md - Mining algorithm deep dive
- docs/architecture/data-models.md - MongoDB schema and relationships
- docs/architecture/security-design.md - Security layers and threat model

**API Documentation:**
- docs/api/reference.md - Complete endpoint documentation (moved from root)
- docs/api/examples.md - Code examples (Python, JS, Ruby, curl)
- docs/api/rate-limiting.md - Rate limiting guide with best practices

**Developer Guides:**
- docs/guides/development-setup.md - Development environment setup
- docs/guides/testing-guide.md - RSpec, coverage, and CI/CD
- docs/guides/deployment-guide.md - Production deployment (moved from root)
- docs/guides/troubleshooting.md - Common issues and solutions

**Documentation Index:**
- docs/README.md - Main documentation navigation and overview

## Moved Files
- API_DOCUMENTATION.md → docs/api/reference.md
- DEPLOYMENT.md → docs/guides/deployment-guide.md
- CHANGELOG.md → docs/CHANGELOG.md
- CLAUDE.md → docs/CLAUDE.md
- CONTRIBUTING.md → docs/CONTRIBUTING.md
- SECURITY.md → docs/SECURITY.md

## Fixes
- Updated config/rack_attack.rb to use /api/v1/* paths for rate limiting
- Fixed Docker service name from 'mongodb' to 'db' in all documentation
- Updated file references to use new docs/ structure
- Fixed bare URL in README for markdown compliance

## Documentation Features
- 📚 Comprehensive coverage of all aspects
- 🎓 Educational with clear explanations
- 💻 Code examples in multiple languages
- 🔗 Cross-linked for easy navigation
- 📖 Professional documentation structure
- ✅ Follows best practices

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@Perafan18 Perafan18 force-pushed the docs/comprehensive-documentation branch from 66fbc91 to 34432b4 Compare November 23, 2025 06:11
- Move CLAUDE.md from docs/ to root
- Update references in README.md and docs/README.md
- CLAUDE.md should remain in root as it's a special file for Claude Code
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 8

🧹 Nitpick comments (6)
docs/getting-started/installation.md (1)

248-252: Añade especificador de lenguaje al bloque de código.

El bloque de código que muestra la salida esperada del servidor debería incluir un especificador de lenguaje para un renderizado correcto.

Aplica este diff:

-```
+```text
 == Sinatra (v4.0.0) has taken the stage on 1910 for development with backup from Puma
 Puma starting in single mode...
 * Listening on http://0.0.0.0:1910

</blockquote></details>
<details>
<summary>docs/guides/troubleshooting.md (1)</summary><blockquote>

`785-785`: **Formatea la URL como enlace markdown.**

La URL desnuda debería formatearse como un enlace markdown para mejorar la presentación y seguir las mejores prácticas de markdown.



Aplica este diff:

```diff
-1. **Search existing issues:** https://github.com/Perafan18/chain_forge/issues
+1. **Search existing issues:** [GitHub Issues](https://github.com/Perafan18/chain_forge/issues)
docs/getting-started/first-blockchain-tutorial.md (1)

151-167: Considera añadir especificadores de lenguaje a los bloques de pseudocódigo.

Varios bloques de código que muestran pseudocódigo conceptual (proceso de minería, estructura de cadena, escenarios de manipulación) no tienen especificadores de lenguaje. Aunque son aceptables tal como están por ser contenido educativo, añadir text como especificador mejoraría el renderizado.

Ejemplo para el bloque de minería (línea 151):

-   ```
+   ```text
    Target: Hash must start with "0" (one leading zero)
    
    Attempt 1: nonce=0

Aplica el mismo cambio a los otros bloques de pseudocódigo en las líneas 284 y 379.

Also applies to: 284-316, 379-404

docs/architecture/data-models.md (1)

430-449: Use headings en lugar de énfasis para subsecciones.

Las líneas 430 y 451 utilizan énfasis de negrita (texto) para separaciones lógicas que funcionan como encabezados de subsección. Cambiar a encabezados Markdown (###) mejoraría la estructura y la navegabilidad del documento, especialmente para lectores que dependen de índices generados automáticamente.

-**Blockchain → Blocks (One-to-Many)**
+### Blockchain → Blocks (One-to-Many)

Also applies to: 451-469

docs/architecture/proof-of-work.md (1)

111-111: Considere alternativas a "completely" y "in difficulty".

Las sugerencias de estilo de LanguageTool para fortalecer la redacción:

  • Línea 111, 151, 162: "completely different hash" podría ser "entirely different" o simplemente "different"
  • Línea 332: "increment in difficulty" podría acortarse a "per difficulty level increment"

Estos son cambios menores de estilo que mejoran la concisión, no son bloqueos.

Also applies to: 151-151, 162-162, 332-332

docs/architecture/overview.md (1)

173-173: Compuesto adjetivo: use guion en "Rate-Limiting Configuration".

La frase "Rate Limiting Configuration" (línea 173 en encabezado de sección 5) funciona como modificador de nombre compuesto. Según las pautas de estilo en inglés, se recomienda: "Rate-Limiting Configuration". Este es un cambio menor de estilo.

-### 5. Rate Limiting Configuration (`config/rack_attack.rb`)
+### 5. Rate-Limiting Configuration (`config/rack_attack.rb`)
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 66fbc91 and 34432b4.

📒 Files selected for processing (19)
  • .gitignore (1 hunks)
  • README.md (2 hunks)
  • config/rack_attack.rb (1 hunks)
  • docs/CHANGELOG.md (1 hunks)
  • docs/CLAUDE.md (4 hunks)
  • docs/CONTRIBUTING.md (3 hunks)
  • docs/README.md (1 hunks)
  • docs/api/examples.md (1 hunks)
  • docs/api/rate-limiting.md (1 hunks)
  • docs/architecture/data-models.md (1 hunks)
  • docs/architecture/overview.md (1 hunks)
  • docs/architecture/proof-of-work.md (1 hunks)
  • docs/architecture/security-design.md (1 hunks)
  • docs/getting-started/first-blockchain-tutorial.md (1 hunks)
  • docs/getting-started/installation.md (1 hunks)
  • docs/getting-started/quick-start.md (1 hunks)
  • docs/guides/development-setup.md (1 hunks)
  • docs/guides/testing-guide.md (1 hunks)
  • docs/guides/troubleshooting.md (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • .gitignore
🚧 Files skipped from review as they are similar to previous changes (2)
  • docs/CHANGELOG.md
  • docs/guides/testing-guide.md
🧰 Additional context used
🪛 LanguageTool
docs/README.md

[style] ~58-~58: Consider replacing this word to strengthen your wording.
Context: ...hainForge is a learning-focused project and is NOT intended for production use. It ...

(AND_THAT)

docs/getting-started/quick-start.md

[style] ~332-~332: Using many exclamation marks might seem excessive (in this case: 9 exclamation marks for a text that’s 5603 characters long)
Context: ...e walkthrough with detailed explanations!

(EN_EXCESSIVE_EXCLAMATION)

docs/architecture/security-design.md

[uncategorized] ~10-~10: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...Security Layers 4. Rate Limiting 5. [Input Validation](...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~114-~114: Use a hyphen to join words.
Context: ...ted in development:** HTTP only ### Out of Scope Threats ChainForge is educatio...

(QB_NEW_EN_HYPHEN)


[grammar] ~114-~114: Use a hyphen to join words.
Context: ... in development:** HTTP only ### Out of Scope Threats ChainForge is educational...

(QB_NEW_EN_HYPHEN)


[uncategorized] ~273-~273: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...ovements:** - Use Redis for distributed rate limiting - Implement permanent bans for abuse - ...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[style] ~414-~414: Consider using a different adverb to strengthen your wording.
Context: ...valanche Effect**: Small input change = completely different hash - Deterministic: Sam...

(COMPLETELY_ENTIRELY)

docs/guides/troubleshooting.md

[style] ~482-~482: The adverb ‘sometimes’ is usually put before the verb ‘pass’.
Context: ...randomly (flaky) Symptoms: - Tests pass sometimes, fail other times Solutions: **1....

(ADVERB_WORD_ORDER)


[grammar] ~714-~714: Use a hyphen to join words.
Context: ...n blockchain_id **2. Check for rate limiting delays:**bash # Rate limiti...

(QB_NEW_EN_HYPHEN)


[uncategorized] ~790-~790: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...al "db.version()"`) - Error message (full stack trace) - Steps to reproduce 3. **Che...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

docs/api/rate-limiting.md

[uncategorized] ~3-~3: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...rstanding and working with ChainForge's rate limiting system. ## Table of Contents 1. [Over...

(EN_COMPOUND_ADJECTIVE_INTERNAL)


[grammar] ~624-~624: Use a hyphen to join words.
Context: ...Why? - Tests run faster without rate limiting delays - Predictable test execu...

(QB_NEW_EN_HYPHEN)


[grammar] ~626-~626: Use a hyphen to join words.
Context: ...est execution - No flaky tests from rate limit state ### Testing Rate Limits ``...

(QB_NEW_EN_HYPHEN)

docs/architecture/proof-of-work.md

[style] ~111-~111: Consider using a different adverb to strengthen your wording.
Context: ... avalanche effect (small input change = completely different hash) ### Hash Calculation i...

(COMPLETELY_ENTIRELY)


[style] ~151-~151: Consider using a different adverb to strengthen your wording.
Context: ...che Effect Changing even one character completely changes the hash: ```ruby input1 = "He...

(COMPLETELY_ENTIRELY)


[style] ~162-~162: Consider using a different adverb to strengthen your wording.
Context: ...5a3bf4f1b2b0b822cd15d6c15b0f00a08" ``` Completely different hashes! ### Why SHA256? **A...

(COMPLETELY_ENTIRELY)


[style] ~332-~332: ‘in difficulty’ might be wordy. Consider a shorter alternative.
Context: ...tially with difficulty - Each increment in difficulty multiplies attempts by ~16 ### Average...

(EN_WORDINESS_PREMIUM_IN_DIFFICULTY)

docs/architecture/overview.md

[uncategorized] ~173-~173: If this is a compound adjective that modifies the following noun, use a hyphen.
Context: ...Source:* /src/validators.rb ### 5. Rate Limiting Configuration (config/rack_attack.rb)...

(EN_COMPOUND_ADJECTIVE_INTERNAL)

docs/getting-started/first-blockchain-tutorial.md

[style] ~48-~48: Consider using a different adverb to strengthen your wording.
Context: ... each input - Changing even 1 character completely changes the hash - Impossible to revers...

(COMPLETELY_ENTIRELY)


[style] ~364-~364: Consider using a different adverb to strengthen your wording.
Context: ...sh + 7)2. Calculated hash:9xyz...(completely different!) 3. Stored hash:0a1b2c...`...

(COMPLETELY_ENTIRELY)


[style] ~368-~368: Consider using a different adverb to strengthen your wording.
Context: ...** Changing even one character produces a completely different hash! ## Part 6: Immutabilit...

(COMPLETELY_ENTIRELY)

🪛 markdownlint-cli2 (0.18.1)
docs/guides/development-setup.md

453-453: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/getting-started/quick-start.md

45-45: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


202-202: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


254-254: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


303-303: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)

docs/api/examples.md

9-9: Link fragments should be valid

(MD051, link-fragments)

docs/architecture/security-design.md

21-21: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


313-313: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


456-456: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


470-470: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/guides/troubleshooting.md

21-21: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


62-62: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


83-83: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


102-102: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


153-153: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


170-170: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


213-213: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


232-232: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


252-252: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


273-273: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


299-299: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


318-318: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


405-405: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


457-457: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


534-534: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


572-572: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


605-605: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


693-693: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


785-785: Bare URL used

(MD034, no-bare-urls)

docs/api/rate-limiting.md

53-53: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


54-54: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


64-64: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


65-65: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


75-75: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


76-76: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


165-165: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


604-604: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/architecture/proof-of-work.md

9-9: Link fragments should be valid

(MD051, link-fragments)

docs/architecture/data-models.md

397-397: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


430-430: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


451-451: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


561-561: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


577-577: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/architecture/overview.md

19-19: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


210-210: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


235-235: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


310-310: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/getting-started/first-blockchain-tutorial.md

151-151: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


284-284: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


379-379: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


387-387: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


392-392: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


402-402: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/getting-started/installation.md

248-248: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🔇 Additional comments (21)
config/rack_attack.rb (1)

9-16: ¡Excelente alineación con la estructura de API versionada!

Las actualizaciones de las rutas de limitación de tasa son correctas y consistentes con la estructura de API /api/v1 documentada en todo el PR. Los cambios incluyen tanto las rutas exactas como los patrones regex, y los comentarios también se han actualizado apropiadamente.

docs/CLAUDE.md (1)

353-353: Actualizaciones correctas de referencias a documentación.

Las referencias a la documentación de la API se han actualizado correctamente de API_DOCUMENTATION.md a docs/api/reference.md, y se ha añadido la referencia a docs/api/rate-limiting.md. Esto es consistente con la nueva estructura de documentación reorganizada.

Also applies to: 373-373

docs/CONTRIBUTING.md (1)

179-179: Referencias de documentación actualizadas correctamente.

Las actualizaciones de las referencias de documentación de la API de API_DOCUMENTATION.md a docs/api/reference.md son correctas y consistentes con la nueva estructura de documentación reorganizada introducida en este PR.

Also applies to: 252-252

docs/getting-started/quick-start.md (1)

1-332: ¡Excelente guía de inicio rápido!

Esta guía de inicio rápido es completa, bien estructurada y fácil de seguir. Incluye:

  • Instrucciones claras paso a paso
  • Ejemplos de curl con respuestas esperadas
  • Explicaciones de conceptos clave (minería, integridad de cadena)
  • Sección de resolución de problemas
  • Referencias cruzadas apropiadas a otra documentación

Todas las referencias a endpoints de API utilizan correctamente el prefijo /api/v1, y el contenido es consistente con el resto de la documentación.

docs/architecture/data-models.md (1)

1-15: Estructura y tabla de contenidos bien ejecutadas.

El documento está bien organizado con tabla de contenidos clara, secciones lógicas (Overview, Blockchain Model, Block Model, MongoDB Schema, etc.), y referencias cruzadas apropiadas a otros documentos de arquitectura. El nivel de detalle es apropiado para un proyecto educativo.

docs/architecture/proof-of-work.md (2)

5-15: Valide fragmentos de enlace en tabla de contenidos.

El marcador del linter MD051 sugiere que el fragmento "link-fragments" en línea 9 puede no ser válido. Verifique que todos los enlaces de la tabla de contenidos correspondan exactamente a los encabezados reales en el documento (requiere coincidencia exacta con ID de encabezado generados automáticamente).

Ejecute el siguiente comando para verificar fragmentos de enlace:

#!/bin/bash
# Verificar que todos los enlaces en la tabla de contenidos tienen encabezados correspondientes
grep -E '^\[.*\]\(#' docs/architecture/proof-of-work.md | while read line; do
  fragment=$(echo "$line" | sed 's/.*(\(#[^)]*\)).*/\1/' | tr -d '#')
  if ! grep -q "^## $fragment\|^### $fragment" docs/architecture/proof-of-work.md; then
    echo "Fragmento no encontrado: #$fragment"
  fi
done

1-50: Excelente análisis técnico de Proof of Work.

El documento proporciona una explicación clara y exhaustiva del algoritmo PoW, incluyendo ejemplos paso a paso, análisis de complejidad computacional (O(2^(4*difficulty))), escenarios de ataque, y comparación con Bitcoin. La tabla de complejidad temporal (Dificultad 1-10 con tiempos estimados) es particularmente útil para desarrolladores que trabajan en el proyecto.

docs/guides/development-setup.md (2)

1-50: Guía de desarrollo integral y clara.

La estructura está bien organizada con tabla de contenidos, secciones claramente delimitadas para diferentes sistemas operativos (macOS, Linux, Docker), y opciones alternativas (rbenv vs. rvm). Las instrucciones paso a paso son accesibles para desarrolladores nuevos en Ruby. La inclusión de múltiples IDEs (RubyMine, VS Code, Sublime) es un punto fuerte.

Also applies to: 51-110


513-633: Sección de solución de problemas excepcional.

La sección de Troubleshooting (líneas 513-633) aborda escenarios comunes (versión Ruby, conexión MongoDB, fallos de bundle, puertos en uso, fallos de tests, errores RuboCop) con soluciones claras y verificables. Esto es particularmente valioso para nuevos desarrolladores.

docs/architecture/overview.md (1)

1-110: Arquitectura bien documentada con justificación clara de decisiones de diseño.

El documento proporciona una visión integral del sistema: diagrama de tres capas, tabla de stack de tecnología, componentes bien identificados, y flujos de datos detallados. La sección "Design Decisions" (líneas 461-547) es particularmente valiosa: explica no solo qué se eligió, sino por qué (MongoDB por flexibilidad, Sinatra por simplicidad, SHA256 por estándar de la industria, etc.), lo que es excelente para un proyecto educativo.

Also applies to: 461-547

docs/README.md (3)

1-34: Hub de documentación bien estructurado.

El archivo docs/README.md sirve efectivamente como punto de entrada a toda la documentación, con navegación clara organizada por audiencia (nuevos usuarios, desarrolladores, contribuidores). La sección "Quick Navigation" categoriza explícitamente las secciones por función. Los enlaces relativos a secciones (getting-started/, architecture/, etc.) parecen alinearse con la nueva estructura de carpetas.


56-72: Aviso educativo claro y prominente.

El blockquote de "Educational Project Notice" (líneas 56-72) es claro y prominente, estableciendo correctamente expectativas sobre lo que ChainForge es y no es. La división entre "Use ChainForge to" (casos educativos) y "Do NOT use ChainForge for" (restricciones) es pedagógicamente efectiva.


90-112: Sección "Core Concepts" educativa.

Las explicaciones de Blockchain Basics, Proof of Work, y Chain Integrity (líneas 90-112) proporcionan contexto suficiente para que usuarios nuevos comprendan conceptos clave sin necesidad de leer documentación más profunda. Están bien integradas en esta página de inicio.

docs/architecture/security-design.md (2)

1-125: Análisis de seguridad integral y honesto.

El documento security-design.md es excepcional por su enfoque integral:

  1. Modelo de amenazas claro (líneas 41-124): Identifica actores de amenaza reales (usuario malintencionado, atacante interno con acceso BD, atacante de red), sus capacidades, objetivos y mitigaciones.
  2. Vulnerabilidades conocidas documentadas (líneas 482-604): 8 vulnerabilidades listadas honestamente (sin autenticación, sin cifrado en reposo, HTTP-only, rate limiting en memoria, etc.) con evaluaciones de riesgo y mitigaciones propuestas.
  3. Separación clara: Desarrollo vs Producción, con checklist explícito para cada (líneas 770-793).

Esta honestidad sobre limitaciones refuerza que es un proyecto educativo.


667-760: Recomendaciones de seguridad para producción bien detalladas.

La sección "Production Security" (líneas 667-760) proporciona ejemplos de código Ruby práctico para:

  • HTTPS/TLS (Rack::SSL)
  • JWT authentication con validación
  • MongoDB con URI segura y SSL
  • Redis para rate limiting distribuido
  • Security headers (X-Frame-Options, HSTS, etc.)
  • Logging y monitoreo
  • Sanitización de entrada

Estos ejemplos de código son valiosos como referencias para quien quiera llevar ChainForge a producción (aunque se desaconseja).

docs/api/rate-limiting.md (2)

1-150: Guía de rate limiting práctica y completa.

El documento cubre efectivamente tanto para usuarios de la API como para operadores:

  1. Para usuarios API: Explicación clara de límites por endpoint, ejemplos de cliente en 4 lenguajes (curl, Python, JS, Ruby), manejo de 429 con retry
  2. Para practicantes: Sección Best Practices (líneas 291-404) con exponential backoff, batching, caching, y monitoreo
  3. Para operadores: Sección Production Considerations (líneas 472-601) con limitaciones de almacenamiento en memoria, Redis, IP whitelisting, bans permanentes, alertas, y API keys

Esta estructura de "para quién es cada sección" es pedagógicamente efectiva.

Also applies to: 291-404


436-470: Clase APIMetrics es excelente ejemplo de monitoreo.

La clase APIMetrics (líneas 436-470) proporciona un patrón práctico para rastrear uso de API. El ejemplo incluye:

  • Contador de requests totales
  • Rastreo de hits de rate limit
  • Cálculo de porcentaje de rate limits
  • Impresión de estadísticas

Este tipo de ejemplo de código es valioso para desarrolladores que integran con la API.

README.md (4)

79-122: Reorganización de documentación excelente y coherente.

El README.md ha sido reestructurado correctamente para servir como puerta de entrada a la documentación reorganizada:

  1. Sección Getting Started (líneas 83-86): Quick Start, First Blockchain Tutorial
  2. Sección Architecture & Design (líneas 88-92): Overview, PoW Deep Dive, Data Models, Security
  3. Sección API Documentation (líneas 94-97): Reference, Examples, Rate Limiting
  4. Sección Developer Guides (líneas 99-103): Setup, Testing, Deployment, Troubleshooting
  5. Sección Project Information (líneas 105-109): CHANGELOG, CONTRIBUTING, SECURITY, CLAUDE

Esta estructura de navegación es clara, coherente con la jerarquía de carpetas (docs/getting-started/, docs/architecture/, docs/api/, docs/guides/), y permite que nuevos usuarios encuentren lo que necesitan rápidamente.


32-56: Quick Start simplificado es apropiado.

La sección Quick Start (líneas 32-56) ha sido simplificada de instrucciones detalladas a pasos esenciales:

  • Clone el repositorio
  • Instale dependencias
  • Configure entorno
  • Inicie MongoDB (con opción Docker)
  • Ejecute la aplicación

Para desarrolladores nuevos que quieren un arranque rápido, esto es efectivo. Los detalles se encuentran en docs/guides/development-setup.md, evitando duplicación.


156-174: Sección "Educational Project" clara y honesta.

La sección (líneas 156-174) establece claramente:

  1. ChainForge no es para producción
  2. Qué se puede aprender (blockchain, PoW, API security, Ruby, MongoDB, testing)
  3. Qué NO se debe hacer (producción, crypto, datos valiosos, sistemas distribuidos)
  4. Referencia a Bitcoin/Ethereum para producción

Este framing educativo honesto es apropiado y evita malentendidos sobre el propósito del proyecto.


189-203: Referencias actualizadas a nueva estructura de docs.

Las líneas 189 (CONTRIBUTING -> docs/CONTRIBUTING.md) y 203 (CHANGELOG -> docs/CHANGELOG.md) reflejan correctamente el movimiento de archivos de nivel raíz a la carpeta docs/, alineando el README con la nueva jerarquía de documentación.


1. [curl Examples](#curl-examples)
2. [Python Examples](#python-examples)
3. [JavaScript/Node.js Examples](#javascript-nodejs-examples)
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Corrige el fragmento de enlace para JavaScript/Node.js.

El fragmento de enlace #javascript-nodejs-examples no coincidirá con el ancla generado del encabezado en la línea 265. Los encabezados de Markdown generalmente eliminan o reemplazan las barras diagonales al crear anclas.

Aplica este diff para corregir el enlace:

-3. [JavaScript/Node.js Examples](#javascript-nodejs-examples)
+3. [JavaScript/Node.js Examples](#javascriptnodejs-examples)

Alternativamente, verifica cómo tu renderizador de Markdown genera el ancla para este encabezado específico.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
3. [JavaScript/Node.js Examples](#javascript-nodejs-examples)
3. [JavaScript/Node.js Examples](#javascriptnodejs-examples)
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

9-9: Link fragments should be valid

(MD051, link-fragments)

🤖 Prompt for AI Agents
In docs/api/examples.md around line 9, the link fragment
`#javascript-nodejs-examples` does not match the anchor generated for the header
at line 265; update the fragment to the exact slug your Markdown renderer
produces (e.g., remove or replace the `/` and `.` exactly as the renderer does)
by inspecting the rendered anchor at line 265 and replacing
`#javascript-nodejs-examples` with that exact anchor so the link correctly jumps
to the "JavaScript/Node.js Examples" header.

Comment on lines +53 to +84
**Example 1: Creating Blockchains**
```
Request: POST /api/v1/chain

Limits Applied:
✓ Global: 60 requests/minute
✓ Chain Creation: 10 requests/minute

Effective Limit: 10/minute (whichever is reached first)
```

**Example 2: Mining Blocks**
```
Request: POST /api/v1/chain/:id/block

Limits Applied:
✓ Global: 60 requests/minute
✓ Block Mining: 30 requests/minute

Effective Limit: 30/minute (whichever is reached first)
```

**Example 3: Reading Blocks**
```
Request: GET /api/v1/chain/:id/block/:block_id

Limits Applied:
✓ Global: 60 requests/minute

Effective Limit: 60/minute
```

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Use headings y especifique idioma para ejemplos de code blocks.

Las líneas 53, 64, 75 usan énfasis de negrita (Example 1, Example 2, Example 3) que funcionan como subsecciones. Estos deberían ser encabezados (####). Adicionalmente, los bloques de código en las líneas 54, 65, 76 carecen de especificadores de idioma.

-**Example 1: Creating Blockchains**
-\`\`\`
+#### Example 1: Creating Blockchains
+
+\`\`\`text
 Request: POST /api/v1/chain

Also applies to: 54-84, 65-84, 76-84

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

53-53: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


54-54: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


64-64: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


65-65: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


75-75: Emphasis used instead of a heading

(MD036, no-emphasis-as-heading)


76-76: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In docs/api/rate-limiting.md around lines 53 to 84, the examples currently use
bold text for subsection titles and code fences without language hints; change
"**Example 1/2/3**" to heading level 4 (e.g., "#### Example 1: Creating
Blockchains") and add a language specifier to each code block (use an
appropriate language such as "http" for the request/limits blocks or "text" if
preferred) so the three code fences at ~54, ~65, and ~76 include the language
tag and the titles are proper headings.

Comment on lines +165 to +188
```
Content-Type: application/json
```

### Client-Side Handling

#### curl Example

```bash
#!/bin/bash

response=$(curl -s -w "\n%{http_code}" -X POST http://localhost:1910/api/v1/chain)
http_code=$(echo "$response" | tail -n1)
body=$(echo "$response" | sed '$d')

if [ "$http_code" == "429" ]; then
echo "Rate limited! Waiting 60 seconds..."
sleep 60
# Retry
curl -X POST http://localhost:1910/api/v1/chain
else
echo "Success: $body"
fi
```
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Especifique idioma para bloques de código HTTP y JSON.

Líneas 165 y 604 contienen bloques de código sin especificadores de idioma:

  • Línea 165: Respuesta JSON (usar ```json)
  • Línea 604: Respuesta HTTP (usar ```http o ```plaintext)
 **Response Body:**
-\`\`\`
+\`\`\`json
 {
   "error": "Rate limit exceeded. Please try again later."
 }

Also applies to: 604-612

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

165-165: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In docs/api/rate-limiting.md around lines 165 and 604-612, the code blocks are
missing language specifiers; update the JSON response block at ~line 165 to use
```json and update the HTTP/plain response block at ~lines 604-612 to use
```http or ```plaintext so syntax highlighting and language tagging are correct;
ensure the opening fence includes the language token and the closing fence
remains ``` for each block.

Comment on lines +397 to +426
```
┌─────────────────────────────────┐
│ Blockchain │
│ ┌───────────────────────────┐ │
│ │ _id: ObjectId │ │
│ │ created_at: DateTime │ │
│ │ updated_at: DateTime │ │
│ └───────────────────────────┘ │
└──────────────┬──────────────────┘
│ 1
│ has_many :blocks
│ *
┌───────┴──────────────────────┐
│ │
┌──────▼───────────────┐ ┌───────────▼──────────┐
│ Block (Genesis) │ │ Block 1 │ ...
│ ┌──────────────────┐ │ │ ┌──────────────────┐ │
│ │ index: 0 │ │ │ │ index: 1 │ │
│ │ data: "Genesis" │ │ │ │ data: "..." │ │
│ │ previous_hash: 0 │ │ │ │ previous_hash: │ │
│ │ hash: abc123... │ │ │ │ abc123... ──────┼──┐
│ │ nonce: 0 │ │ │ │ hash: 00def4... │ │ │
│ │ difficulty: 0 │ │ │ │ nonce: 142 │ │ │
│ └──────────────────┘ │ │ │ difficulty: 2 │ │ │
└──────────────────────┘ │ └──────────────────┘ │ │
└──────────────────────┘ │
Hash Link ◄┘
```
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Especifique idioma para bloques de código ASCII.

Los bloques de código delimitados deben tener un especificador de idioma (por ejemplo, ```text o ```plaintext). Esto afecta a las líneas 397 (diagrama ERD) y las líneas 561 y 577 (diagramas de ciclo de vida). Aunque sean diagramas ASCII, especificar el idioma mejora la consistencia con markdown-linting.

-\`\`\`
+\`\`\`text
 ┌─────────────────────────────────┐
 │         Blockchain              │

Also applies to: 561-601

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

397-397: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In docs/architecture/data-models.md around lines 397 to 426 (and also apply to
the other ASCII diagrams at ~lines 561 and 577 / range 561-601), the fenced code
blocks containing ASCII diagrams lack a language specifier; update each
triple-backtick fence to include a language (e.g., ```text or ```plaintext) so
markdown linters treat them consistently—edit the opening ``` to ```text (or
```plaintext) for the ERD at ~397 and for both lifecycle diagrams in the 561–601
range and keep the existing closing ``` unchanged.

Comment on lines +19 to +55
```
┌─────────────────────────────────────────┐
│ Client Layer │
│ (HTTP Clients: curl, apps, browsers) │
└───────────────┬─────────────────────────┘
│ HTTP/JSON
┌─────────────────────────────────────────┐
│ Application Layer (Sinatra) │
│ ┌────────────────────────────────────┐ │
│ │ Rack::Attack (Rate Limiting) │ │
│ └──────────────┬─────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────┐ │
│ │ API Routes (/api/v1/*) │ │
│ └──────────────┬─────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────┐ │
│ │ Input Validation (dry-validation) │ │
│ └──────────────┬─────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────┐ │
│ │ Business Logic (Models) │ │
│ │ - Blockchain Model │ │
│ │ - Block Model (with PoW) │ │
│ └──────────────┬─────────────────────┘ │
└─────────────────┼─────────────────────────┘
│ Mongoid ODM
┌─────────────────────────────────────────┐
│ Data Layer (MongoDB) │
│ ┌────────────────┐ ┌────────────────┐│
│ │ Blockchains │ │ Blocks ││
│ │ Collection │ │ Collection ││
│ └────────────────┘ └────────────────┘│
└─────────────────────────────────────────┘
```
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Especifique idioma para bloques de diagrama ASCII.

Cuatro bloques de código ASCII delimitados carecen de especificadores de idioma:

  • Línea 19: Diagrama de arquitectura de tres capas
  • Línea 210: Diagrama de flujo (crear blockchain)
  • Línea 235: Diagrama de flujo (minar bloque)
  • Línea 310: Diagrama de flujo (validar datos de bloque)

Cambie ``` a ```text o ```plaintext para cumplir con MD040.

-\`\`\`
+\`\`\`text
 ┌─────────────────────────────────────────┐
 │          Client Layer                    │

Also applies to: 210-306, 235-306, 310-341

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

19-19: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In docs/architecture/overview.md around lines 19 to 55 (and similarly for the
other ASCII diagram blocks at roughly 210-306, 235-306, and 310-341), the ASCII
art code fences use plain ``` which triggers MD040; update each of those code
fences to include a language specifier such as ```text or ```plaintext (i.e.,
replace the opening triple backticks with ```text or ```plaintext and leave the
closing backticks unchanged) so the diagrams are properly marked as plain text
and the linter rule is satisfied.

Comment on lines +21 to +33
```
┌────────────────────────────────────────┐
│ Layer 5: Application Logic Security │ ← Chain integrity validation
├────────────────────────────────────────┤
│ Layer 4: Cryptographic Security │ ← SHA256 hashing, PoW
├────────────────────────────────────────┤
│ Layer 3: Input Validation │ ← dry-validation schemas
├────────────────────────────────────────┤
│ Layer 2: Rate Limiting │ ← Rack::Attack throttling
├────────────────────────────────────────┤
│ Layer 1: Transport Security │ ← HTTP (HTTPS in production)
└────────────────────────────────────────┘
```
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Especifique idioma para bloques de código en diagramas.

Cuatro bloques de código delimitados sin especificadores de idioma:

  • Línea 21: Diagrama de capas de seguridad
  • Línea 313: Diagrama de flujo de validación
  • Línea 456: Diagrama de escenario de ataque
  • Línea 470: Diagrama de comparación Bitcoin

Cambiar a ```text para cumplir con MD040.

-\`\`\`
+\`\`\`text
 ┌────────────────────────────────────────┐
 │  Layer 5: Application Logic Security  │

Also applies to: 313-341, 456-477, 470-476

🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

21-21: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
In docs/architecture/security-design.md around lines 21-33 (and also apply to
ranges 313-341, 456-477, 470-476), several fenced code blocks containing ASCII
diagrams lack a language specifier which triggers MD040; update each of those
backtick-fenced blocks to use ```text (e.g. replace the opening ``` with
```text) so Markdown linting recognizes them as plain text and the diagrams
render without language-specific highlighting.

Comment on lines +453 to +458
```
Name: ChainForge Server
Script: main.rb
Arguments: -p 1910
Working Directory: /path/to/chain_forge
```
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Especifique idioma para bloque de configuración JSON.

La línea 453 contiene un bloque de código JSON delimitado pero sin especificador de idioma. Cambie ```json para mejorar la consistencia de linting y el resaltado de sintaxis.

-{
+\`\`\`json
+{
   "ruby.useLanguageServer": true,
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

453-453: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
docs/guides/development-setup.md around lines 453 to 458: the fenced code block
for the configuration example is missing a language specifier; update the
opening fence from ``` to ```json so the block is marked as JSON (i.e., change
the code fence to include "json" immediately after the backticks) to enable
proper linting and syntax highlighting.

sudo systemctl start mongod

# Docker
docker-compose up -d db
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

Verifica consistencia del nombre del servicio Docker Compose.

Este comando usa docker-compose up -d db, pero en docs/getting-started/installation.md línea 306 se utiliza docker-compose up mongodb. Asegúrate de que el nombre del servicio de MongoDB en docker-compose.yml sea consistente en toda la documentación.

Ejecuta el siguiente script para verificar el nombre del servicio en docker-compose.yml y sus referencias en la documentación:


🏁 Script executed:

#!/bin/bash
# Verificar el nombre del servicio MongoDB en docker-compose.yml
echo "=== Servicio MongoDB en docker-compose.yml ==="
if [ -f docker-compose.yml ]; then
  grep -A 5 "mongodb\|db:" docker-compose.yml | head -20
else
  echo "docker-compose.yml no encontrado"
fi

echo ""
echo "=== Referencias a 'mongodb' en documentación ==="
rg -n "docker-compose.*mongodb" docs/

echo ""
echo "=== Referencias a 'db' en documentación ==="
rg -n "docker-compose.*\bdb\b" docs/

Length of output: 778


Actualiza referencias inconsistentes del servicio Docker Compose en la documentación.

La verificación confirma que el servicio se denomina db en docker-compose.yml. Aunque la línea 122 es correcta, existen referencias inconsistentes a mongodb en otros documentos que deben corregirse:

  • docs/getting-started/installation.md:306: cambiar docker-compose up mongodb a docker-compose up -d db
  • docs/guides/troubleshooting.md:613: cambiar docker-compose logs mongodb a docker-compose logs db
  • docs/guides/troubleshooting.md:643: cambiar docker-compose exec app ping mongodb a docker-compose exec app ping db
🤖 Prompt for AI Agents
In docs/guides/troubleshooting.md around line 122, and in other noted files,
there are inconsistent Docker Compose service names: the compose file defines
the service as `db` but some docs reference `mongodb`; update those references
to use `db` instead. Specifically, in docs/getting-started/installation.md at
~line 306 change the command from `docker-compose up mongodb` to `docker-compose
up -d db`; in docs/guides/troubleshooting.md at ~line 613 change `docker-compose
logs mongodb` to `docker-compose logs db`; and in docs/guides/troubleshooting.md
at ~line 643 change `docker-compose exec app ping mongodb` to `docker-compose
exec app ping db`.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
docs/README.md (1)

56-72: Refuerza la advertencia sobre propósito educativo.

La redacción en la línea 58 podría ser más contundente. Considera reemplazar "is NOT intended for production use" por una formulación más fuerte como "is NOT suitable for production use" o "is NOT appropriate for production use" para enfatizar con mayor claridad que el proyecto tiene únicamente fines educativos.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 34432b4 and f21ccb1.

📒 Files selected for processing (3)
  • CLAUDE.md (4 hunks)
  • README.md (2 hunks)
  • docs/README.md (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • CLAUDE.md
🧰 Additional context used
🪛 LanguageTool
docs/README.md

[style] ~58-~58: Consider replacing this word to strengthen your wording.
Context: ...hainForge is a learning-focused project and is NOT intended for production use. It ...

(AND_THAT)

🔇 Additional comments (12)
docs/README.md (3)

1-33: Estructura de navegación clara y bien organizada.

Las secciones de navegación rápida están bien diseñadas, con enlaces relativos correctos que facilitan el acceso a la documentación. La agrupación lógica (Getting Started, Architecture & Design, API Documentation, Developer Guides, Project Information) proporciona una experiencia de usuario intuitiva. Los enlaces mantienen la convención correcta de rutas relativas dentro de la carpeta docs/.


35-45: Descripción del proyecto coherente y centrada en el aprendizaje.

La descripción enfatiza adecuadamente que ChainForge es un proyecto educativo con características blockchain. El versionado (v2.0.0) y la lista de características clave están bien alineados con los objetivos del PR.


114-122: Stack tecnológico completo y preciso.

La sección de tecnología lista correctamente todas las herramientas del proyecto (Ruby 3.2.2, Sinatra 4.0, MongoDB, RSpec, etc.). Esta información es accesible y apropiada para el público objetivo.

README.md (9)

1-10: Encabezado actualizado apropiadadamente con enfoque educativo.

La descripción del proyecto en línea 3 refleja correctamente el cambio hacia un enfoque centrado en la educación. Los badges técnicos y la descripción breve son pertinentes.


12-20: Sección de características clara y consistente.

Las características listadas están alineadas con la descripción en docs/README.md y representan adecuadamente el proyecto v2.0.0. La estructura bulleted es fácil de escanear.


21-77: Guía de inicio rápido práctica y ejecutable.

La sección Quick Start proporciona pasos claros desde la instalación (con opciones para macOS, Docker) hasta ejemplos de uso real con curl. Los comandos muestran cómo crear una blockchain y minar un bloque, lo que es educativamente valioso. Los comentarios en los ejemplos de curl explican las respuestas esperadas, lo que mejora la comprensibilidad.


79-109: Transición a enfoque centrado en documentación bien ejecutada.

La sección de documentación establece vínculos claros a toda la estructura reorganizada de docs/. Todos los enlaces utilizan el prefijo docs/ correctamente para referencias desde la raíz del repositorio. La agrupación de subsecciones (Getting Started, Architecture & Design, API Documentation, Developer Guides, Project Information) coincide perfectamente con la estructura de docs/README.md. Esto proporciona a los usuarios una navegación consistente, ya sea que comiencen en el README raíz o en el hub de documentación.


111-122: Tabla de referencia rápida de endpoints mantiene utilidad.

La tabla de endpoints de API resume los principales puntos de entrada y los límites de velocidad. El enlace a API Reference en línea 122 dirige correctamente a la documentación completa. Esta tabla sirve como referencia rápida mientras que la documentación centralizada proporciona detalles exhaustivos.


124-147: Instrucciones de desarrollo y calidad de código mantenidas.

Las instrucciones para ejecutar pruebas, linting y CI/CD permanecen en el README raíz, lo cual es apropiado para contribuyentes inmediatos. Los comandos bundle exec rspec, COVERAGE=true, y rubocop están correctamente presentados.


156-174: Advertencia de proyecto educativo clara y consistente.

La sección "Educational Project" reitera apropiadamente que ChainForge no es para producción. El contraste entre lo que SÍ se debe hacer (aprender blockchain, PoW, seguridad de API, etc.) y lo que NO se debe hacer (aplicaciones de producción, implementación de criptodivisas, almacenamiento de datos valiosos, sistemas distribuidos) es educativamente valioso y establece expectativas claras.


176-189: Sección de contribución enfocada en el propósito educativo.

La guía de contribución en línea 189 ahora apunta correctamente a CONTRIBUTING, alineándose con la reorganización de documentación. Los pasos de contribución (1-8) son claros y apropiados para un proyecto de aprendizaje colaborativo.


79-109: Verifica que todos los archivos de documentación reorganizados sean accesibles y coherentes.

Asegúrate de que los siguientes archivos existan y sean accesibles en sus nuevas ubicaciones en la carpeta docs/:

  • docs/getting-started/ (installation.md, quick-start.md, first-blockchain-tutorial.md)
  • docs/architecture/ (overview.md, proof-of-work.md, data-models.md, security-design.md)
  • docs/api/ (reference.md, examples.md, rate-limiting.md)
  • docs/guides/ (development-setup.md, testing-guide.md, deployment-guide.md, troubleshooting.md)
  • docs/ (CHANGELOG.md, CONTRIBUTING.md, SECURITY.md)

También verifica que las rutas de CLAUDE.md sean correctas: en docs/README.md línea 33 usa ../CLAUDE.md, y en README.md línea 109 usa CLAUDE.md desde la raíz.

@Perafan18 Perafan18 merged commit c223be1 into master Dec 30, 2025
2 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.

1 participant