Appearance
Handoff: SVC-007-quiz-question-integration-contract course-service quiz/question integration contract
Scope
- Service/area:
course-service - Task pack:
docs/agents/service-tasks/course-service.md - Goal: complete the bounded
SVC-007quiz/question integration contract slice by adding a service-local contract endpoint and tests that name question-bank-service and exam-service as canonical owners while keeping course-service limited to course/progress state and future copied reference rows. - Non-goals: course lesson-question persistence, course quiz persistence, public
/api/courses*route promotion, wallet/payment paid-access changes, canonical question/exam ownership, live browser proof, or changes to legacy source under/Users/velikho/Desktop/WORKING/HOCTAPAZ/.
Docs Read
go-platform/docs/architecture/service-responsibility-matrix.mdgo-platform/docs/architecture/legacy-api-map.mdgo-platform/docs/agents/service-agent-execution-queue.jsongo-platform/docs/agents/service-agent-closeout-ledger.jsongo-platform/docs/agents/service-tasks/course-service.mdgo-platform/docs/agents/agent-handoff-format.mdgo-platform/docs/api/course-service.mdgo-platform/docs/api/question-bank-service.mdgo-platform/docs/api/exam-service.mdgo-platform/docs/qa/student-course-route-rehearsals.mdgo-platform/docs/qa/service-agent-goal-completion-audit.mdgo-platform/docs/qa/service-agent-readiness-smoke.md
Legacy Evidence Read
/Users/velikho/Desktop/WORKING/HOCTAPAZ/node-platform/apps/api/src/modules/courses/courses.controller.ts/Users/velikho/Desktop/WORKING/HOCTAPAZ/node-platform/apps/api/src/modules/courses/courses.service.ts/Users/velikho/Desktop/WORKING/HOCTAPAZ/node-platform/apps/api/src/modules/courses/courses.spec.ts/Users/velikho/Desktop/WORKING/HOCTAPAZ/node-platform/apps/api/src/modules/courses/**/Users/velikho/Desktop/WORKING/HOCTAPAZ/node-platform/apps/api/prisma/schema.prisma- Legacy source was read-only evidence only; no course quiz/question route parity is claimed.
Files Changed
go-platform/services/course-service/internal/domain/course.gogo-platform/services/course-service/internal/http/server.gogo-platform/services/course-service/internal/http/server_test.gogo-platform/services/course-service/internal/usecase/course_integration_contract.gogo-platform/services/course-service/internal/usecase/course_integration_contract_test.gogo-platform/contracts/openapi/services/course-service.yamlgo-platform/services/course-service/api/openapi.yamlgo-platform/services/course-service/README.mdgo-platform/docs/api/course-service.mdgo-platform/docs/agents/service-tasks/course-service.mdgo-platform/docs/agents/handoffs/SVC-007-quiz-question-integration-contract.mdgo-platform/docs/agents/service-agent-closeout-ledger.jsongo-platform/docs/agents/service-agent-closeout-ledger.md
Behavior Implemented
- Added
GET /v1/courses/integration-contracts/question-examas a service-local contract endpoint. - The contract names question-bank-service as canonical owner for question content, answers, solutions, taxonomy, and usage counters through
GET /v1/questions/{id}andPUT /v1/questions/usage-counts. - The contract names exam-service as canonical owner for exam/quiz definition, question snapshots, publish lifecycle, assignment, and runtime access through
GET /v1/exams/{id}andPUT|GET /v1/exams/{examId}/question-snapshots. - The contract states future course-owned rows may store only copied references such as
courseId,lessonId,questionId,examId, order, and optional copied display/title snapshots. - The contract explicitly forbids course-service from owning wallet ledger, payment order, canonical question content, canonical exam/attempt state, or analytics mastery rollups.
Tests And Verification
- Command:
GOTOOLCHAIN=go1.25.11 go test ./services/course-service/internal/usecase -run TestQuestionExamIntegrationContractPreservesOwnerBoundaries -count=1 -v - Result: passed.
- Evidence: usecase contract test verified schema/status, question-bank owner API, exam owner API, course-stored refs, and forbidden ownership boundaries.
- Command:
GOTOOLCHAIN=go1.25.11 go test ./services/course-service/internal/http -run TestQuestionExamIntegrationContractRoute -count=1 -v - Result: passed.
- Evidence: HTTP route returned the contract envelope and forbidden ownership list.
- Command:
GOTOOLCHAIN=go1.25.11 go test ./services/course-service/... -count=1 - Result: passed.
- Evidence: all course-service packages passed after the contract endpoint and docs/API mirror updates.
- Command:
make test-student-course-routes test-student-course-progress-routes - Result: passed.
- Evidence: default routes stayed legacy while non-default student course read/progress rehearsals remained exact and guarded.
- Command:
STUDENT_COURSE_BROWSER_SELF_TEST=1 make test-student-course-browser - Result: passed.
- Evidence: browser smoke harness self-test passed; live browser proof remains separate and not claimed.
- Command:
ruby -e 'require "yaml"; YAML.load_file("contracts/openapi/services/course-service.yaml"); YAML.load_file("services/course-service/api/openapi.yaml"); puts "course openapi yaml ok"' - Result: passed.
- Evidence: canonical and service-local OpenAPI YAML parsed successfully.
Route State
- Legacy route: default
/api/courses*,/api/student/courses*,/api/public/catalog*, wallet, question, exam, and fallback routes remain legacy-proxied. - Native route: only service-local
/v1/courses/integration-contracts/question-examwas added; no public gateway route table was changed. - Gateway state: student course read/progress non-default route guards passed; they do not promote quiz/question or default course routes.
- Rollback: keep
deploy/gateway/routes.jsonas the active route table; remove callers to the service-local contract endpoint if needed. Do not promote quiz/question course routes until owner API proof, legacy response parity, browser/runtime proof, and rollback evidence are attached.
Data Notes
- Tables touched: none; no CourseLessonQuestion or CourseQuiz table was added.
- Migration run: none.
- Validation report: not applicable because no live data was migrated or backfilled.
Risks / Blockers
- Course lesson-question and course quiz persistence remain deferred.
- Public course route promotion still requires live/browser proof, rollback proof, and response parity.
- Wallet/payment paid access stays legacy or future billing/wallet integration; no paid-access contract was added here.
- SVC-006 has accepted bounded evidence only and remains not complete.
Next Step
- Implement future course lesson-question and quiz reference persistence only after question-bank/exam owner APIs are proven against a non-default route rehearsal with response parity and rollback evidence.