Status: Draft approved in conversation, pending user review of written spec
Define a long-term naming system for this repository so it can evolve from a single OutlookReport implementation into an ability-center that hosts multiple business capabilities. The first capability domain is exam-sprint, and within that domain the system will support multiple report types, starting with outlook and later achievement.
ability-service to ability-center.exam-sprint.exam-sprint is the bounded context.report.outlook and achievement are report types, not top-level domain names.exam-sprint reports.ExamSprintReport.OUTLOOK represents the 临考突击展望报告.ACHIEVEMENT represents the 临考突击成果报告.ExamSprintReportType, not by inventing a new top-level domain.ability-center
├── ability-center-runtime
├── ability-center-kernel
└── abilities
└── exam-sprint
├── contracts
├── application
├── domain
└── infrastructure
ability-center-runtimePurpose:
This module should not become a place for business rules.
ability-center-kernelPurpose:
This module must not contain exam-sprint specific request, response, state, or rendering concepts.
abilities/exam-sprint/contractsPurpose:
This module describes interfaces, not adapters.
abilities/exam-sprint/applicationPurpose:
This module answers: how is a use case executed?
abilities/exam-sprint/domainPurpose:
This module answers: what is correct in business terms?
abilities/exam-sprint/infrastructurePurpose:
This module answers: how does the system talk to external systems?
The naming stack must follow this order:
exam-sprintreportoutlook, achievementThe naming stack must not follow this order:
cn.yunzhixue.microservice.abilitycn.yunzhixue.ability.centermicroservice should be removed from the primary package identity because it describes a deployment style, not a stable business model.
cn.yunzhixue.ability.center
├── kernel
├── examsprint
│ ├── contracts
│ │ └── report
│ ├── application
│ │ └── report
│ ├── domain
│ │ └── report
│ ├── infrastructure
│ │ └── report
│ └── adapter
│ └── http
Type-specific rendering or handling belongs below the report capability, for example:
cn.yunzhixue.ability.center.examsprint.infrastructure.report.rendering.outlook
cn.yunzhixue.ability.center.examsprint.infrastructure.report.rendering.achievement
This keeps outlook and achievement visible where they are truly relevant, without allowing them to dominate the whole bounded context.
Public APIs should expose the resource as report, not task.
POST /api/exam-sprint/reportsGET /api/exam-sprint/reports/{reportId}GET /api/exam-sprint/reports/{reportId}/downloadGET /api/exam-sprint/reports/downloads?storageKey=...storageKey is an infrastructure detail and must not be a public resource lookup mechanism.
Use a stable request that supports multiple report types:
CreateExamSprintReportRequestRecommended fields:
reportTypepayloadExamSprintReportType
OUTLOOKACHIEVEMENTCreateExamSprintReportResponseExamSprintReportDetailResponseExamSprintReportGenerationStatusRecommended common response fields:
reportIdreportTypegenerationStatuscreatedAtupdatedAt where applicableexpiresAtdownloadUrlfailureReasonreportId instead of taskIdtaskId reveals processing mechanics. reportId reflects the business resource that the client actually owns.
OutlookReportTaskRecordExamSprintReportOutlookReportTaskRepositoryExamSprintReportRepositoryRecommended internal terms:
reportIdreportTypegenerationStatusstorageObjectKeyfileNamefailureReasonIf the system keeps an internal generation workflow object separate from the public report aggregate later, that internal split must still preserve ExamSprintReport as the stable business-facing root concept.
Recommended target names:
ExamSprintReportController for the runtime HTTP entrypointExamSprintReportApplicationServiceExamSprintReportGenerationDispatcherAsyncExamSprintReportGenerationDispatcherExamSprintReportGenerationWorkerExamSprintReportRetentionSchedulerThe public-facing HTTP controller should not expose task in its name. Internal asynchronous and retention mechanics may still use generation, dispatcher, worker, and scheduler where that precision adds clarity.
Recommended target names:
ExamSprintReportStorageAzureBlobExamSprintReportStorageInMemoryExamSprintReportStorageExamSprintReportPdfGeneratorPlaywrightExamSprintReportPdfGeneratorExamSprintReportRendererClasspathOutlookExamSprintReportRendererClasspathAchievementExamSprintReportRendereroutlook and achievement should appear in infrastructure names when differentiating type-specific rendering or handler implementations.
The current OutlookReport request payload should become a type-specific payload instead of a top-level API request.
CreateOutlookReportTaskRequestOutlookExamSprintReportPayloadreportMetadatareadinessOverviewsyllabusMasteryProfilepastPaperVocabularyProfilehighFrequencyVocabularyProfilevocabularyFrequencyBandssprintPlanOptionsdiagnosticCaseStudyReportMetadataReadinessOverviewSyllabusMasteryProfileVocabularyProfileDimensionScoreVocabularyFrequencyBandSprintPlanOptionDiagnosticCaseStudyReportMetadatareportVersionLabellearnerNametargetExamNamesprintPeriodLabelauthorNamereportTitle is rejected because the current meaning is closer to a version or label than the document's actual primary title.
ReadinessOverviewsummarycurrentStagekeyInsightreadinessScoreSyllabusMasteryProfilemasteryPercentdiagnosisrecommendationdimensionScoresVocabularyProfilemasteredWordCounttotalWordCountmasteryPercentdiagnosisrecommendationsampleWordsexamVocabulary → target pastPaperVocabularyProfilecommonVocabularyMastery → target highFrequencyVocabularyProfilecommonVocabularyMastery is rejected because it mixes a vague scope (common) with a narrow metric word (mastery) while actually representing a full profile object.
VocabularyFrequencyBandbandLabelmasteryPercenttargetPercentSprintPlanOptionplanNamecadenceLabelfocusactionItemsexpectedOutcometagLabel (recommended addition)cycleLabel is rejected as a long-term field name because it currently mixes at least two meanings: cadence text and recommendation-style tagging.
DiagnosticCaseStudytitlecontextdiagnosisstrategykeyTakeawayWhen a new report type is introduced, apply these rules:
ExamSprintReportType value./api/exam-sprint/reports.report capability.The following names should be retired from the long-term primary naming system:
ability-servicemicroservice in the root package prefixOutlookReportTask... as a primary resource familytaskId in public contractsstorageKey in public contractsVocabularyModulecommonVocabularyMasterycycleLabel as a single overloaded field/api/reports/outlook/tasks/downloads?storageKey=...The long-term naming language should prioritize:
ability-centerexam-sprintreportreportTypeoutlookachievementgenerationretentionstoragerendererkernelThis design is about naming direction, not implementation sequencing. The migration can happen incrementally, but every incremental step should converge on the same final vocabulary:
No intermediate rename should introduce a second temporary vocabulary that conflicts with this target system.