feat(assessment): slice Challenge structured-answer — el learner por fin HACE algo #11

Merged
mane merged 1 commit from feat/challenge-structured-answer into main 2026-06-29 18:10:35 +00:00
Owner

Primera entidad jugable del producto, sin LLM ni sandbox (grading determinista):

  • Dominio: Challenge + ChallengeSpec (structured-answer) + StructuredQuestion;
    proyección pública (toPublic) que NUNCA filtra correct/rationale al cliente.
  • Grader puro y determinista (grade-structured-answer): conjunto exacto = correcto,
    score 0..1, passed ≥0.7, oficial = isOfficialEligible (decisión 1a). 5 unit tests.
  • Persistencia: tabla challenges (id texto, spec jsonb), migración incremental 0002,
    DrizzleChallengeRepository (byId/list).
  • Use case GradeStructuredAttempt: carga → califica → persiste attempt → emite
    AttemptGraded → learning_engine avanza el paso (lazo "hacer algo y progresar" cerrado).
  • Endpoints: GET /assessment/challenges, GET /:id (público sin respuestas),
    POST /:id/attempt (grading server-side, revela el porqué en el verdict).
  • Seed: 3 challenges de CRITERIO (no trivia) — elegir runtime, cuándo aplicar un
    patrón, IA para orquestar. Borradores para el SME. challenge-bun-101 liga el path_step.
  • CI: smoke de integración (listar, no-fuga de respuestas, grading, avance de ruta).

Verificado en Postgres desechable: migración 0002 incremental, seed idempotente,
smoke OK (score=1/passed/oficial, attempts=1, step_completions=1, sin fuga), 31 tests,
tsc/biome limpios.

TODO(auth): userId va por body (consistente con el módulo); derivar de sesión + rol luego.

Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

Primera entidad jugable del producto, sin LLM ni sandbox (grading determinista): - Dominio: Challenge + ChallengeSpec (structured-answer) + StructuredQuestion; proyección pública (toPublic) que NUNCA filtra `correct`/`rationale` al cliente. - Grader puro y determinista (grade-structured-answer): conjunto exacto = correcto, score 0..1, passed ≥0.7, oficial = isOfficialEligible (decisión 1a). 5 unit tests. - Persistencia: tabla `challenges` (id texto, spec jsonb), migración incremental 0002, DrizzleChallengeRepository (byId/list). - Use case GradeStructuredAttempt: carga → califica → persiste attempt → emite AttemptGraded → learning_engine avanza el paso (lazo "hacer algo y progresar" cerrado). - Endpoints: GET /assessment/challenges, GET /:id (público sin respuestas), POST /:id/attempt (grading server-side, revela el porqué en el verdict). - Seed: 3 challenges de CRITERIO (no trivia) — elegir runtime, cuándo aplicar un patrón, IA para orquestar. Borradores para el SME. challenge-bun-101 liga el path_step. - CI: smoke de integración (listar, no-fuga de respuestas, grading, avance de ruta). Verificado en Postgres desechable: migración 0002 incremental, seed idempotente, smoke OK (score=1/passed/oficial, attempts=1, step_completions=1, sin fuga), 31 tests, tsc/biome limpios. TODO(auth): userId va por body (consistente con el módulo); derivar de sesión + rol luego. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
feat(assessment): slice Challenge structured-answer — el learner por fin HACE algo
Some checks failed
CI / quality (pull_request) Failing after 24s
CI / integration (pull_request) Failing after 29s
58ab511148
Primera entidad jugable del producto, sin LLM ni sandbox (grading determinista):

- Dominio: Challenge + ChallengeSpec (structured-answer) + StructuredQuestion;
  proyección pública (toPublic) que NUNCA filtra `correct`/`rationale` al cliente.
- Grader puro y determinista (grade-structured-answer): conjunto exacto = correcto,
  score 0..1, passed ≥0.7, oficial = isOfficialEligible (decisión 1a). 5 unit tests.
- Persistencia: tabla `challenges` (id texto, spec jsonb), migración incremental 0002,
  DrizzleChallengeRepository (byId/list).
- Use case GradeStructuredAttempt: carga → califica → persiste attempt → emite
  AttemptGraded → learning_engine avanza el paso (lazo "hacer algo y progresar" cerrado).
- Endpoints: GET /assessment/challenges, GET /:id (público sin respuestas),
  POST /:id/attempt (grading server-side, revela el porqué en el verdict).
- Seed: 3 challenges de CRITERIO (no trivia) — elegir runtime, cuándo aplicar un
  patrón, IA para orquestar. Borradores para el SME. challenge-bun-101 liga el path_step.
- CI: smoke de integración (listar, no-fuga de respuestas, grading, avance de ruta).

Verificado en Postgres desechable: migración 0002 incremental, seed idempotente,
smoke OK (score=1/passed/oficial, attempts=1, step_completions=1, sin fuga), 31 tests,
tsc/biome limpios.

TODO(auth): userId va por body (consistente con el módulo); derivar de sesión + rol luego.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
mane merged commit 64a9cf315f into main 2026-06-29 18:10:35 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
mane/dev-platform!11
No description provided.