Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4d8267da1 | ||
|
|
0b983b7fda | ||
|
|
13673b2c48 |
@@ -14,7 +14,7 @@ document of a type. `Primary File` may contain a glob (e.g.
|
|||||||
| BC | Business Case | docs/business-case.md | 002 |
|
| BC | Business Case | docs/business-case.md | 002 |
|
||||||
| SA | Stakeholder Analysis | docs/stakeholder-analysis.md | 002 |
|
| SA | Stakeholder Analysis | docs/stakeholder-analysis.md | 002 |
|
||||||
| PP | Project Plan | docs/project-plan.md | 002 |
|
| PP | Project Plan | docs/project-plan.md | 002 |
|
||||||
| MIL | Milestone / Gateway | docs/milestones/*.md | 008 |
|
| MIL | Milestone / Gateway | docs/milestones/*.md | 009 |
|
||||||
| UCD | Use Case Diagram | docs/use-case-diagram.md | 002 |
|
| UCD | Use Case Diagram | docs/use-case-diagram.md | 002 |
|
||||||
| US | User Story | docs/user-stories.md | 002 |
|
| US | User Story | docs/user-stories.md | 002 |
|
||||||
| UC | Use Case | docs/uc-*/uc.md | 002 |
|
| UC | Use Case | docs/uc-*/uc.md | 002 |
|
||||||
@@ -25,7 +25,7 @@ document of a type. `Primary File` may contain a glob (e.g.
|
|||||||
| DCD | Design Class Diagram | docs/dcd.md | 002 |
|
| DCD | Design Class Diagram | docs/dcd.md | 002 |
|
||||||
| DICT | Domain Dictionary | docs/dictionary.md | 002 |
|
| DICT | Domain Dictionary | docs/dictionary.md | 002 |
|
||||||
| ADR | Architecture Decision Record | docs/adr/adr-NNNN-*.md | 0004 |
|
| ADR | Architecture Decision Record | docs/adr/adr-NNNN-*.md | 0004 |
|
||||||
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 030 |
|
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 041 |
|
||||||
| TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 |
|
| TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 |
|
||||||
|
|
||||||
## Languages
|
## Languages
|
||||||
|
|||||||
@@ -11,7 +11,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | In Scope: choice of level (new request of S01) | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -52,6 +53,7 @@ A small, well-structured reference solution gives the Product Owner a language l
|
|||||||
- Reading the Malay to Danish list from `data/ms-da.csv` (semicolon separated, header `ms;da`).
|
- Reading the Malay to Danish list from `data/ms-da.csv` (semicolon separated, header `ms;da`).
|
||||||
- Saving the words still to learn to `data/words_to_learn.csv` and using that file on the next start.
|
- Saving the words still to learn to `data/words_to_learn.csv` and using that file on the next start.
|
||||||
- Optional spoken Malay word (text to speech) as an extra that can be installed.
|
- Optional spoken Malay word (text to speech) as an extra that can be installed.
|
||||||
|
- A choice of level (the first 100 words, the first 1000 words or all words of the frequency ordered word list) before learning starts.
|
||||||
- `pyproject.toml`, `.gitignore`, `Doxyfile`, virtual environment instructions, `pytest` tests and `constants.py`.
|
- `pyproject.toml`, `.gitignore`, `Doxyfile`, virtual environment instructions, `pytest` tests and `constants.py`.
|
||||||
- README from the framework template, screenshots, and a wiki in English, Danish and Bahasa Malaysia.
|
- README from the framework template, screenshots, and a wiki in English, Danish and Bahasa Malaysia.
|
||||||
- Repository description and topics on the git host.
|
- Repository description and topics on the git host.
|
||||||
@@ -147,3 +149,4 @@ Proceed — the scope is small, the risks are mitigated, and the result serves t
|
|||||||
|
|
||||||
[SA-001]: ./stakeholder-analysis.md
|
[SA-001]: ./stakeholder-analysis.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
+41
-8
@@ -9,7 +9,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added Level, Deck.within, the level argument and the level screen | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -30,6 +31,10 @@ package domain {
|
|||||||
+front_code : str
|
+front_code : str
|
||||||
+back_code : str
|
+back_code : str
|
||||||
}
|
}
|
||||||
|
class Level <<frozen>> {
|
||||||
|
+limit : int | None
|
||||||
|
+first(cards : Sequence[Card]) : tuple[Card, ...]
|
||||||
|
}
|
||||||
class Vocabulary <<frozen>> {
|
class Vocabulary <<frozen>> {
|
||||||
+language_pair : LanguagePair
|
+language_pair : LanguagePair
|
||||||
+cards : tuple[Card, ...]
|
+cards : tuple[Card, ...]
|
||||||
@@ -40,7 +45,8 @@ package domain {
|
|||||||
+from_vocabulary(vocabulary : Vocabulary) : Deck
|
+from_vocabulary(vocabulary : Vocabulary) : Deck
|
||||||
+cards : tuple[Card, ...]
|
+cards : tuple[Card, ...]
|
||||||
+is_empty : bool
|
+is_empty : bool
|
||||||
+draw(choose, exclude : Card | None) : Card
|
+within(cards : Sequence[Card]) : tuple[Card, ...]
|
||||||
|
+draw(choose, exclude : Card | None, among : Sequence[Card] | None) : Card
|
||||||
+remove(card : Card) : None
|
+remove(card : Card) : None
|
||||||
}
|
}
|
||||||
interface VocabularyRepository {
|
interface VocabularyRepository {
|
||||||
@@ -69,6 +75,7 @@ package application {
|
|||||||
-_deck : Deck
|
-_deck : Deck
|
||||||
-_progress : ProgressRepository
|
-_progress : ProgressRepository
|
||||||
-_speech : SpeechPort
|
-_speech : SpeechPort
|
||||||
|
-_level_cards : tuple[Card, ...]
|
||||||
+current_card : CardDto | None
|
+current_card : CardDto | None
|
||||||
+remaining : int
|
+remaining : int
|
||||||
+next_card() : CardDto | None
|
+next_card() : CardDto | None
|
||||||
@@ -94,6 +101,17 @@ package infrastructure {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
package presentation {
|
package presentation {
|
||||||
|
class LevelChoice <<frozen>> {
|
||||||
|
+label : str
|
||||||
|
+level : Level
|
||||||
|
}
|
||||||
|
class LevelViewModel {
|
||||||
|
+title : str
|
||||||
|
+choices : tuple[LevelChoice, ...]
|
||||||
|
}
|
||||||
|
class LevelView {
|
||||||
|
+choose(level : Level) : None
|
||||||
|
}
|
||||||
class FlashCardViewModel {
|
class FlashCardViewModel {
|
||||||
-_session : StudySession
|
-_session : StudySession
|
||||||
+side : Side
|
+side : Side
|
||||||
@@ -113,6 +131,8 @@ package presentation {
|
|||||||
}
|
}
|
||||||
Vocabulary "1" *-- "1..*" Card
|
Vocabulary "1" *-- "1..*" Card
|
||||||
Vocabulary "1" --> "1" LanguagePair
|
Vocabulary "1" --> "1" LanguagePair
|
||||||
|
Level ..> Card : selects the first
|
||||||
|
Deck ..> Level : filtered by the cards of
|
||||||
Deck "1" o-- "0..*" Card
|
Deck "1" o-- "0..*" Card
|
||||||
Deck ..> Vocabulary : built from
|
Deck ..> Vocabulary : built from
|
||||||
Deck ..> EmptyDeckError : raises
|
Deck ..> EmptyDeckError : raises
|
||||||
@@ -125,6 +145,7 @@ StudySession "1" --> "1" SpeechPort
|
|||||||
StudySession ..> CardDto : returns
|
StudySession ..> CardDto : returns
|
||||||
open_study_session ..> VocabularyRepository
|
open_study_session ..> VocabularyRepository
|
||||||
open_study_session ..> ProgressRepository
|
open_study_session ..> ProgressRepository
|
||||||
|
open_study_session ..> Level
|
||||||
open_study_session ..> StudySession : creates
|
open_study_session ..> StudySession : creates
|
||||||
CsvVocabularyRepository ..|> VocabularyRepository
|
CsvVocabularyRepository ..|> VocabularyRepository
|
||||||
CsvProgressRepository ..|> ProgressRepository
|
CsvProgressRepository ..|> ProgressRepository
|
||||||
@@ -132,6 +153,10 @@ GttsSpeech ..|> SpeechPort
|
|||||||
NullSpeech ..|> SpeechPort
|
NullSpeech ..|> SpeechPort
|
||||||
FlashCardViewModel "1" --> "1" StudySession
|
FlashCardViewModel "1" --> "1" StudySession
|
||||||
FlashCardView "1" --> "1" FlashCardViewModel
|
FlashCardView "1" --> "1" FlashCardViewModel
|
||||||
|
LevelViewModel "1" *-- "3" LevelChoice
|
||||||
|
LevelChoice "1" --> "1" Level
|
||||||
|
LevelView "1" --> "1" LevelViewModel
|
||||||
|
Main ..> LevelView : composes
|
||||||
Main ..> CsvVocabularyRepository : composes
|
Main ..> CsvVocabularyRepository : composes
|
||||||
Main ..> CsvProgressRepository : composes
|
Main ..> CsvProgressRepository : composes
|
||||||
Main ..> GttsSpeech : composes
|
Main ..> GttsSpeech : composes
|
||||||
@@ -145,24 +170,30 @@ Main ..> FlashCardView : composes
|
|||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| `Card` | Flash Card | Holds a word and its translation | `front`, `back` | none |
|
| `Card` | Flash Card | Holds a word and its translation | `front`, `back` | none |
|
||||||
| `LanguagePair` | Word List (first and second language) | Names the two languages of a word list by code | `front_code`, `back_code` | none |
|
| `LanguagePair` | Word List (first and second language) | Names the two languages of a word list by code | `front_code`, `back_code` | none |
|
||||||
|
| `Level` | Level | Names how many of the first words of the word list a session uses and selects them | `limit` | `first` |
|
||||||
| `Vocabulary` | Word List | Holds all cards of a language pair as delivered | `language_pair`, `cards` | none |
|
| `Vocabulary` | Word List | Holds all cards of a language pair as delivered | `language_pair`, `cards` | none |
|
||||||
| `Deck` | Words To Learn | Holds the cards still to learn and picks and removes cards | `language_pair`, `_cards` | `from_vocabulary`, `draw`, `remove` |
|
| `Deck` | Words To Learn | Holds the cards still to learn and picks and removes cards | `language_pair`, `_cards` | `from_vocabulary`, `within`, `draw`, `remove` |
|
||||||
| `VocabularyRepository` | Word List | Port: load the delivered word list | none | `load` |
|
| `VocabularyRepository` | Word List | Port: load the delivered word list | none | `load` |
|
||||||
| `ProgressRepository` | Words To Learn | Port: load and save the words to learn | none | `load`, `save` |
|
| `ProgressRepository` | Words To Learn | Port: load and save the words to learn | none | `load`, `save` |
|
||||||
| `StudySession` | Study Session | Runs one session: draws cards, marks cards known, saves progress, asks for speech | `_deck`, `_progress`, `_speech`, `_current` | `next_card`, `mark_known` |
|
| `StudySession` | Study Session | Runs one session: draws cards of the level, marks cards known, saves progress, asks for speech | `_deck`, `_progress`, `_speech`, `_level_cards`, `_current` | `next_card`, `mark_known` |
|
||||||
| `CardDto` | Flash Card | Plain data that crosses to the presentation layer | four text fields | none |
|
| `CardDto` | Flash Card | Plain data that crosses to the presentation layer | four text fields | none |
|
||||||
| `SpeechPort` | (none: external service) | Port: speak a text in a language | none | `speak` |
|
| `SpeechPort` | (none: external service) | Port: speak a text in a language | none | `speak` |
|
||||||
| `CsvVocabularyRepository`, `CsvProgressRepository` | Word List, Words To Learn | Adapters that read and write the semicolon separated CSV file | `_path` | `load`, `save` |
|
| `CsvVocabularyRepository`, `CsvProgressRepository` | Word List, Words To Learn | Adapters that read and write the semicolon separated CSV file | `_path` | `load`, `save` |
|
||||||
| `GttsSpeech`, `NullSpeech` | (none) | Adapters for speech: the gTTS service, and silence | none | `speak` |
|
| `GttsSpeech`, `NullSpeech` | (none) | Adapters for speech: the gTTS service, and silence | none | `speak` |
|
||||||
| `FlashCardViewModel` | Study Session | Exposes the side, language name and text of the card shown, and the three commands | `_session`, `side`, `language_name`, `text` | `next_card`, `flip_card`, `is_known` |
|
| `FlashCardViewModel` | Study Session | Exposes the side, language name and text of the card shown, and the three commands | `_session`, `side`, `language_name`, `text` | `next_card`, `flip_card`, `is_known` |
|
||||||
|
| `LevelChoice`, `LevelViewModel` | Level | Plain data and view model of the level screen: the title and the three choices with their labels | `title`, `choices` | none |
|
||||||
|
| `LevelView` | (none: user interface) | Draws the level screen and forwards the chosen level | buttons | `choose` |
|
||||||
| `FlashCardView` | (none: user interface) | Draws the window, forwards the buttons, owns the 3000 ms timer | `flip_timer`, widgets | `next_card`, `flip_card`, `is_known` |
|
| `FlashCardView` | (none: user interface) | Draws the window, forwards the buttons, owns the 3000 ms timer | `flip_timer`, widgets | `next_card`, `flip_card`, `is_known` |
|
||||||
|
|
||||||
## Method Traceability
|
## Method Traceability
|
||||||
|
|
||||||
| Method signature | Operation Contract / SD message |
|
| Method signature | Operation Contract / SD message |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `open_study_session(vocabulary_repository, progress_repository, speech, choose) -> StudySession` | [OC-001] `startStudySession`, [SD-001] sequence startStudySession (loads the words to learn) |
|
| `open_study_session(vocabulary_repository, progress_repository, speech, choose, level) -> StudySession` | [OC-001] `chooseLevel`, [SD-001] sequence chooseLevel (loads the words to learn and the level's cards) |
|
||||||
| `StudySession.next_card() -> CardDto \| None` | [OC-001] `startStudySession` (first card), `markUnknown`; [SD-001] |
|
| `Level.first(cards) -> tuple[Card, ...]`, `Deck.within(cards) -> tuple[Card, ...]` | [OC-001] `chooseLevel` postcondition (the level's cards); [SD-001] |
|
||||||
|
| `LevelViewModel.choices -> tuple[LevelChoice, ...]` | [OC-001] `startStudySession`; [SD-001] sequence startStudySession |
|
||||||
|
| `LevelView.choose(level) -> None` | [OC-001] `chooseLevel` (forwards the level to the composition root) |
|
||||||
|
| `StudySession.next_card() -> CardDto \| None` | [OC-001] `chooseLevel` (first card), `markUnknown`; [SD-001] |
|
||||||
| `StudySession.mark_known() -> None` | [OC-001] `markKnown` (remove and save); [SD-001] |
|
| `StudySession.mark_known() -> None` | [OC-001] `markKnown` (remove and save); [SD-001] |
|
||||||
| `FlashCardViewModel.next_card() -> None` | [OC-001] `markUnknown`; [SD-001] |
|
| `FlashCardViewModel.next_card() -> None` | [OC-001] `markUnknown`; [SD-001] |
|
||||||
| `FlashCardViewModel.is_known() -> None` | [OC-001] `markKnown`; [SD-001] |
|
| `FlashCardViewModel.is_known() -> None` | [OC-001] `markKnown`; [SD-001] |
|
||||||
@@ -176,8 +207,9 @@ Main ..> FlashCardView : composes
|
|||||||
| Repository | `VocabularyRepository`, `ProgressRepository`, CSV adapters | The domain does not know the CSV file |
|
| Repository | `VocabularyRepository`, `ProgressRepository`, CSV adapters | The domain does not know the CSV file |
|
||||||
| Ports and adapters | `SpeechPort`, `GttsSpeech`, `NullSpeech` | Speech is an optional extra; the core runs without it |
|
| Ports and adapters | `SpeechPort`, `GttsSpeech`, `NullSpeech` | Speech is an optional extra; the core runs without it |
|
||||||
| Null Object | `NullSpeech` | No `if speech:` checks in the use case |
|
| Null Object | `NullSpeech` | No `if speech:` checks in the use case |
|
||||||
| MVVM | `FlashCardView`, `FlashCardViewModel` | Behaviour is tested without Tkinter ([ADR-0002]) |
|
| MVVM | `FlashCardView`, `FlashCardViewModel`, `LevelView`, `LevelViewModel` | Behaviour is tested without Tkinter ([ADR-0002]) |
|
||||||
| Composition root | `app.main` | The one place that names the adapters |
|
| Composition root | `app.main` | The one place that names the adapters and shows the level screen |
|
||||||
|
| Value object | `Level`, `Card`, `LanguagePair` | Immutable data with its own rule (`Level.first`) |
|
||||||
|
|
||||||
## Dependency Check
|
## Dependency Check
|
||||||
|
|
||||||
@@ -192,3 +224,4 @@ Imports point inward: `domain` imports nothing from the other packages; `applica
|
|||||||
[SD-001]: ./uc-001/sd.md
|
[SD-001]: ./uc-001/sd.md
|
||||||
[ADR-0002]: ./adr/adr-0002-clean-architecture-and-mvvm.md
|
[ADR-0002]: ./adr/adr-0002-clean-architecture-and-mvvm.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
+4
-1
@@ -11,7 +11,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added the term Level | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ Maps each Product Owner (PO) term to its professional IT term. PO language: Engl
|
|||||||
| Word list | en | `Vocabulary` | The complete set of flash cards of one language pair, as delivered with the program. | DM, UC, US | DCD |
|
| Word list | en | `Vocabulary` | The complete set of flash cards of one language pair, as delivered with the program. | DM, UC, US | DCD |
|
||||||
| Words to learn | en | `Deck` | The flash cards the learner does not yet know; it starts as the word list and only gets smaller. | DM, UC, US | DCD |
|
| Words to learn | en | `Deck` | The flash cards the learner does not yet know; it starts as the word list and only gets smaller. | DM, UC, US | DCD |
|
||||||
| Study session | en | `StudySession` | One run of the program in which the learner is shown cards one by one. | DM, UC, US | DCD |
|
| Study session | en | `StudySession` | One run of the program in which the learner is shown cards one by one. | DM, UC, US | DCD |
|
||||||
|
| Level | en | `Level` | The number of the most frequent words of the word list that a study session uses: 100, 1000 or all. | DM, UC, US | DCD |
|
||||||
| Language pair | en | `LanguagePair` | The two languages of a word list, the language learned and the language of the translation. | DM, UC | DCD |
|
| Language pair | en | `LanguagePair` | The two languages of a word list, the language learned and the language of the translation. | DM, UC | DCD |
|
||||||
| Progress file | en | `ProgressRepository` | The file `words_to_learn.csv` that keeps the words to learn between runs. | UC, US | DCD |
|
| Progress file | en | `ProgressRepository` | The file `words_to_learn.csv` that keeps the words to learn between runs. | UC, US | DCD |
|
||||||
| Spoken word | en | `SpeechPort` | The Malay word read aloud when its card is shown. | UC, US | DCD |
|
| Spoken word | en | `SpeechPort` | The Malay word read aloud when its card is shown. | UC, US | DCD |
|
||||||
@@ -43,3 +45,4 @@ Maps each Product Owner (PO) term to its professional IT term. PO language: Engl
|
|||||||
[SA-001]: ./stakeholder-analysis.md
|
[SA-001]: ./stakeholder-analysis.md
|
||||||
[DM-001]: ./domain-model.md
|
[DM-001]: ./domain-model.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
+12
-2
@@ -11,13 +11,14 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added the concept Level | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Purpose and Scope
|
## Purpose and Scope
|
||||||
|
|
||||||
Covers: [UC-001] Study Flash Cards. The model holds the concepts a Learner talks about: the flash card, the word list, the words to learn and the study session. The project-level model is this document; no other use case exists.
|
Covers: [UC-001] Study Flash Cards. The model holds the concepts a Learner talks about: the flash card, the word list, the words to learn, the level and the study session. The project-level model is this document; no other use case exists.
|
||||||
|
|
||||||
## Diagram
|
## Diagram
|
||||||
|
|
||||||
@@ -34,6 +35,9 @@ class "Word List" as WordList {
|
|||||||
second language
|
second language
|
||||||
}
|
}
|
||||||
class "Words To Learn" as WordsToLearn
|
class "Words To Learn" as WordsToLearn
|
||||||
|
class "Level" as Level {
|
||||||
|
number of words, or all words
|
||||||
|
}
|
||||||
class "Study Session" as StudySession {
|
class "Study Session" as StudySession {
|
||||||
card shown
|
card shown
|
||||||
side shown
|
side shown
|
||||||
@@ -43,6 +47,8 @@ WordsToLearn "1" o-- "0..*" FlashCard : holds
|
|||||||
WordsToLearn "1" --> "1" WordList : starts as a copy of
|
WordsToLearn "1" --> "1" WordList : starts as a copy of
|
||||||
StudySession "1" --> "1" WordsToLearn : works through
|
StudySession "1" --> "1" WordsToLearn : works through
|
||||||
StudySession "1" --> "0..1" FlashCard : shows
|
StudySession "1" --> "0..1" FlashCard : shows
|
||||||
|
StudySession "1" --> "1" Level : is limited to
|
||||||
|
Level "1" --> "1" WordList : takes the first words of
|
||||||
@enduml
|
@enduml
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -53,6 +59,7 @@ StudySession "1" --> "0..1" FlashCard : shows
|
|||||||
| Flash Card | A word in one language with its translation in another | word, translation | UC-001 steps 3 and 4 ("card", "translation") |
|
| Flash Card | A word in one language with its translation in another | word, translation | UC-001 steps 3 and 4 ("card", "translation") |
|
||||||
| Word List | The complete set of flash cards of a language pair, as delivered with the program | first language, second language | UC-001 step 2 ("word list") |
|
| Word List | The complete set of flash cards of a language pair, as delivered with the program | first language, second language | UC-001 step 2 ("word list") |
|
||||||
| Words To Learn | The flash cards the Learner does not yet know; starts as the word list and only gets smaller | none | UC-001 steps 2 and 6 ("words to learn") |
|
| Words To Learn | The flash cards the Learner does not yet know; starts as the word list and only gets smaller | none | UC-001 steps 2 and 6 ("words to learn") |
|
||||||
|
| Level | The part of the word list a study session uses: its first 100 or 1000 words, or all words | number of words, or all words | UC-001 steps 2, 3 and 5 ("level") |
|
||||||
| Study Session | One run of the program in which the Learner is shown cards | card shown, side shown | UC-001 main scenario |
|
| Study Session | One run of the program in which the Learner is shown cards | card shown, side shown | UC-001 main scenario |
|
||||||
|
|
||||||
## Association Table
|
## Association Table
|
||||||
@@ -64,6 +71,8 @@ StudySession "1" --> "0..1" FlashCard : shows
|
|||||||
| Words To Learn | starts as a copy of | Word List | 1 to 1 |
|
| Words To Learn | starts as a copy of | Word List | 1 to 1 |
|
||||||
| Study Session | works through | Words To Learn | 1 to 1 |
|
| Study Session | works through | Words To Learn | 1 to 1 |
|
||||||
| Study Session | shows | Flash Card | 1 to 0..1 |
|
| Study Session | shows | Flash Card | 1 to 0..1 |
|
||||||
|
| Study Session | is limited to | Level | 1 to 1 |
|
||||||
|
| Level | takes the first words of | Word List | 1 to 1 |
|
||||||
|
|
||||||
## Generalizations
|
## Generalizations
|
||||||
|
|
||||||
@@ -78,3 +87,4 @@ StudySession "1" --> "0..1" FlashCard : shows
|
|||||||
[SSD-001]: ./uc-001/ssd.md
|
[SSD-001]: ./uc-001/ssd.md
|
||||||
[DICT-001]: ./dictionary.md
|
[DICT-001]: ./dictionary.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
@@ -0,0 +1,82 @@
|
|||||||
|
# MIL-008: Choose level
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | MIL-008 |
|
||||||
|
| CrossReference | [BC-001], [US-001], [UC-001], [DCD-001] |
|
||||||
|
| Language | en |
|
||||||
|
| Domain | it |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
|
||||||
|
Decide whether the Learner can choose a level before learning: the program asks for 100 words, 1000 words or all words, and then uses the first N words of the word list, which is ordered from the most to the least frequent word.
|
||||||
|
|
||||||
|
## Deliverable
|
||||||
|
|
||||||
|
At start the window shows the choice "100 words", "1000 words" and "All words". After a choice the card window of the earlier milestones opens and every card comes from the first N words of the word list that the Learner does not yet know. Known words stay known across levels because there is still one progress file. The design documents, README, wiki (English, Danish, Bahasa Malaysia) and screenshots describe the choice.
|
||||||
|
|
||||||
|
## Go / No-Go Criteria
|
||||||
|
|
||||||
|
| # | Criterion (objectively checkable) | Go | No-Go |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Choosing 100 draws only cards that are among the first 100 rows of `data/ms-da.csv`, for every card of a full run through the deck | Integration test passes on the real word list | A card from row 101 or later appears |
|
||||||
|
| 2 | Choosing 1000 words or All words uses every word of the list; with a list of fewer than N words all are used | Unit and integration tests pass | Any word is missing |
|
||||||
|
| 3 | Marking words known at level 100 and then choosing All words leaves those words known, and `words_to_learn.csv` still holds every word that is not known (also those outside level 100) | Integration test passes | A word outside the level is lost from the file |
|
||||||
|
| 4 | When every word of the chosen level is known the card shows the message that nothing is left to learn, and the program does not fail | Unit and e2e tests pass | Exception or empty window |
|
||||||
|
| 5 | The level screen holds no rule: the labels and the choice come from the level view model, which imports no Tkinter | View model unit tests pass | A rule is in the view |
|
||||||
|
| 6 | `python -m flash_card --level 100` (also `1000`, `all`) skips the screen and starts at that level; an unknown value is refused by the argument parser | Unit tests pass | The screen appears or the program starts |
|
||||||
|
| 7 | The updated UC-001, DM-001, DICT-001, SSD-001, OC-001, SD-001, DCD-001, BC-001, wireframe, README and the wiki in three languages mention the level choice, and each changed document has a new Version History row and a `Go` review | Review records `Go`; `check-readme.sh` exit 0 | A document is not updated |
|
||||||
|
| 8 | Code review against QC-PY-001 has no failed Mandatory criterion; `pytest` exits with 0 and `ruff`, `mypy --strict`, `lint-imports` and `doxygen` are clean | `RC-*` verdict Go and exit codes 0 | Otherwise |
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
| Depends on | Reason |
|
||||||
|
| --- | --- |
|
||||||
|
| MIL-007 | The finished program, README, wiki and screenshots that this milestone extends |
|
||||||
|
|
||||||
|
## Traceability
|
||||||
|
|
||||||
|
| Business Case objective / KPI / user story | Reference |
|
||||||
|
| --- | --- |
|
||||||
|
| Objective 1 (learning with the word list) and success criterion 1, extended by the new request of S01 | [BC-001] |
|
||||||
|
| US-001.06 Choose my level | [US-001] |
|
||||||
|
|
||||||
|
## Ownership
|
||||||
|
|
||||||
|
| Role | Stakeholder ID (SA) |
|
||||||
|
| --- | --- |
|
||||||
|
| Owner | S01 |
|
||||||
|
| Approving reviewer | S01 (AI as stand-in in autonomous mode) |
|
||||||
|
|
||||||
|
## Target Date
|
||||||
|
|
||||||
|
2026-10-20 — within the delivery window that ends 2026-10-21 ([BC-001] constraint).
|
||||||
|
|
||||||
|
## Tasks
|
||||||
|
|
||||||
|
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
|
||||||
|
| --- | --- | --- | --- | --- |
|
||||||
|
| 1 | Update the design documents for the level choice | Add the level to UC-001 (a first step before the cards, and the finished-level extension), to DM-001 and DICT-001 (concept Level), to SSD-001, OC-001 and SD-001 (operation chooseLevel and the level in startStudySession) and to DCD-001; draw the wireframe of the level screen in wireframe.md; add the level choice to the In Scope list of BC-001. Every changed document gets a Version History row and a new review. | No | UC-001, DCD-001 |
|
||||||
|
| 2 | Add the Level value object and the level choices | `Level` (limit as a number of words, or none for all words) in the domain and the three choices 100, 1000 and all words in constants.py with their labels, so that the choices are defined once. | No | DCD-001 |
|
||||||
|
| 3 | Draw cards from the chosen level | `StudySession` draws only from the first N words of the word list that are still to learn, and removes a known card from the whole words to learn and saves the whole deck, so that words of other levels are never lost. | Yes | US-001.06 |
|
||||||
|
| 4 | Open the session with a level | `open_study_session` gets the level, loads the word list for its order and the progress file for what is left, and builds the session; a level with nothing left gives a finished session. | Yes | US-001.06 |
|
||||||
|
| 5 | Add the level screen | `LevelViewModel` (the choices and their labels, no Tkinter) and `LevelView` in `presentation/features/level/` with the title "Choose your level" and three buttons on the window background. | Yes | US-001.06 |
|
||||||
|
| 6 | Show the level screen before the cards | The composition root shows the level screen first and builds the card view on the same window after the choice; the option `--level 100`, `--level 1000` or `--level all` skips the screen. | Yes | US-001.06 |
|
||||||
|
| 7 | Test the level choice | Unit tests of the level, the filter, the session and the view model; integration tests on the real word list and the progress file across levels; e2e test of the level screen and the flow to the first card. | No | |
|
||||||
|
| 8 | Update the README, the wiki and the screenshots | README, Usage and Home pages of the wiki in English, Danish and Bahasa Malaysia, and a new screenshot of the level screen made by tools/capture_screenshots.py; republish the wiki after the merge. | No | |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[BC-001]: ../business-case.md
|
||||||
|
[US-001]: ../user-stories.md
|
||||||
|
[UC-001]: ../uc-001/uc.md
|
||||||
|
[DCD-001]: ../dcd.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
+11
-4
@@ -4,14 +4,15 @@
|
|||||||
| Key | Value |
|
| Key | Value |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| ID | PP-001 |
|
| ID | PP-001 |
|
||||||
| CrossReference | [BC-001], [SA-001], [US-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-007] |
|
| CrossReference | [BC-001], [SA-001], [US-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-007], [MIL-008] |
|
||||||
| Language | en |
|
| Language | en |
|
||||||
| Domain | it |
|
| Domain | it |
|
||||||
|
|
||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added gateway MIL-008 Choose level (new request of S01) | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ This plan schedules the seven phases (gateways) that deliver the flash card prog
|
|||||||
| Step 4 - Save progress | [MIL-005] | 2026-10-18 | 2026-10-18 | S01 | US-001.04 | words_to_learn.csv | [Milestone MIL-005][MS-005] |
|
| Step 4 - Save progress | [MIL-005] | 2026-10-18 | 2026-10-18 | S01 | US-001.04 | words_to_learn.csv | [Milestone MIL-005][MS-005] |
|
||||||
| Spoken Malay word | [MIL-006] | 2026-10-19 | 2026-10-19 | S01 | US-001.05 | Text to speech as optional extra | [Milestone MIL-006][MS-006] |
|
| Spoken Malay word | [MIL-006] | 2026-10-19 | 2026-10-19 | S01 | US-001.05 | Text to speech as optional extra | [Milestone MIL-006][MS-006] |
|
||||||
| Documentation and publication | [MIL-007] | 2026-10-19 to 2026-10-21 | 2026-10-21 | S01 | none | README, screenshots, wiki in 3 languages, description and topics | [Milestone MIL-007][MS-007] |
|
| Documentation and publication | [MIL-007] | 2026-10-19 to 2026-10-21 | 2026-10-21 | S01 | none | README, screenshots, wiki in 3 languages, description and topics | [Milestone MIL-007][MS-007] |
|
||||||
|
| Choose level | [MIL-008] | 2026-10-20 | 2026-10-20 | S01 | US-001.06 | A level choice (100, 1000, all words) before the cards; documents, wiki and screenshots updated | |
|
||||||
|
|
||||||
```plantuml
|
```plantuml
|
||||||
@startgantt
|
@startgantt
|
||||||
@@ -56,6 +58,8 @@ Project starts 2026-10-14
|
|||||||
[Step 4 Go/No-Go] happens 2026-10-18
|
[Step 4 Go/No-Go] happens 2026-10-18
|
||||||
[Speech Go/No-Go] happens 2026-10-19
|
[Speech Go/No-Go] happens 2026-10-19
|
||||||
[Documentation Go/No-Go] happens 2026-10-21
|
[Documentation Go/No-Go] happens 2026-10-21
|
||||||
|
[Choose level] starts 2026-10-20 and ends 2026-10-20
|
||||||
|
[Choose level Go/No-Go] happens 2026-10-20
|
||||||
@endgantt
|
@endgantt
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -70,15 +74,16 @@ Project starts 2026-10-14
|
|||||||
| `pyproject.toml`, `.gitignore`, `Doxyfile`, `.venv` instructions, `pytest`, `constants.py` | MIL-001 |
|
| `pyproject.toml`, `.gitignore`, `Doxyfile`, `.venv` instructions, `pytest`, `constants.py` | MIL-001 |
|
||||||
| README, screenshots, wiki in three languages | MIL-007 |
|
| README, screenshots, wiki in three languages | MIL-007 |
|
||||||
| Repository description and topics | MIL-007 |
|
| Repository description and topics | MIL-007 |
|
||||||
|
| Choice of level (new request after MIL-007) | MIL-008 |
|
||||||
| Framework documents of the baseline | Baseline pull request before MIL-001 |
|
| Framework documents of the baseline | Baseline pull request before MIL-001 |
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
```
|
```
|
||||||
Baseline → MIL-001 → MIL-002 → MIL-003 → MIL-004 → MIL-005 → MIL-006 → MIL-007
|
Baseline → MIL-001 → MIL-002 → MIL-003 → MIL-004 → MIL-005 → MIL-006 → MIL-007 → MIL-008
|
||||||
```
|
```
|
||||||
|
|
||||||
A No-Go on a phase moves every later date by the days the rework takes; the buffer is the 2026-10-20 working day, which has no phase of its own.
|
A No-Go on a phase moves every later date by the days the rework takes; MIL-008 was added after MIL-007 and takes the unplanned day 2026-10-20, so no buffer is left inside the window; a No-Go moves the end date past 2026-10-21 and S01 decides whether to accept that.
|
||||||
|
|
||||||
## Plan Risks
|
## Plan Risks
|
||||||
|
|
||||||
@@ -105,6 +110,7 @@ A No-Go on a phase moves every later date by the days the rework takes; the buff
|
|||||||
[MIL-005]: ./milestones/mil-005-step4-save-progress.md
|
[MIL-005]: ./milestones/mil-005-step4-save-progress.md
|
||||||
[MIL-006]: ./milestones/mil-006-malay-speech.md
|
[MIL-006]: ./milestones/mil-006-malay-speech.md
|
||||||
[MIL-007]: ./milestones/mil-007-documentation-and-publication.md
|
[MIL-007]: ./milestones/mil-007-documentation-and-publication.md
|
||||||
|
[MIL-008]: ./milestones/mil-008-choose-level.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
[MS-001]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/165
|
[MS-001]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/165
|
||||||
[MS-002]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/166
|
[MS-002]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/166
|
||||||
@@ -113,3 +119,4 @@ A No-Go on a phase moves every later date by the days the rework takes; the buff
|
|||||||
[MS-005]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/169
|
[MS-005]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/169
|
||||||
[MS-006]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/170
|
[MS-006]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/170
|
||||||
[MS-007]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/171
|
[MS-007]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/milestone/171
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# RC-030: Review of BC-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-030 |
|
||||||
|
| CrossReference | [BC-001], [QC-BC-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [BC-001]
|
||||||
|
- Checklist used: [QC-BC-001], and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | ROI/Cost-Benefit analysis is quantitative, or where qualitative, is explicitly justified | Pass | The Cost-Benefit table is qualitative and says why: no revenue is expected, so a quantitative return does not apply. |
|
||||||
|
| 2 | Risks are identified with documented impact and mitigation | Pass | The Risks table has 5 risks, each with an impact and a mitigation. |
|
||||||
|
| 3 | Success criteria are measurable, stating explicit targets rather than vague aspirations | Pass | The Success Criteria table has 8 rows with numeric targets and a measure each (for example 0 third-party packages; 5 commands or fewer). |
|
||||||
|
| 4 | Scope explicitly separates In Scope vs Out of Scope | Pass | Scope has `### In Scope` and `### Out of Scope` subsections. |
|
||||||
|
| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline | Pass | The Stakeholders table cites S01, S02 and S03 and does not re-describe their roles. |
|
||||||
|
| 6 | Methodology and quality-standard foundation are stated explicitly (e.g. ISO/IEC 25010, Larman) | Pass | Methodological and Standards Foundation names the framework, Larman, ISO/IEC 25010:2023 and PEP 8. |
|
||||||
|
| 7 | Assumptions and constraints are explicit and clearly distinguished from one another | Pass | Assumptions and Constraints are separate sections. |
|
||||||
|
| 8 | Document supports executive decision-making with a clear, unambiguous recommendation | Pass | Recommendation reads `Proceed` with a one-sentence rationale. |
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of BC-001 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Executive English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[BC-001]: ../../../docs/business-case.md
|
||||||
|
[QC-BC-001]: ../../../framework/qc/artifacts/qc-business-case.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# RC-031: Review of US-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-031 |
|
||||||
|
| CrossReference | [US-001], [QC-US-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [US-001]
|
||||||
|
- Checklist used: [QC-US-001], and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Follows INVEST criteria (Independent, Negotiable, Valuable, Estimable, Small, Testable) | Pass | INVEST Check section confirms the six properties for all six stories and states one dependency exception. |
|
||||||
|
| 2 | Written in "As a / I want / So that" form | Pass | All six stories use `As a / I want / so that`. |
|
||||||
|
| 3 | Clear, testable acceptance criteria are included | Pass | Every story, including US-001.06, has Given/When/Then acceptance criteria. |
|
||||||
|
| 4 | Traceable to a use case or epic | Pass | Every story traces to a milestone and to UC-001. |
|
||||||
|
| 5 | Story is sized to fit within a single iteration | Pass | Each story is one milestone, which fits one iteration. |
|
||||||
|
| 6 | Story statement avoids technical implementation detail | Fail | Acceptance criteria name `words_to_learn.csv`, `ms-da.csv` and 3000 ms, which are assignment-mandated names and values rather than pure behaviour. |
|
||||||
|
| 7 | Role named in the story matches an actor defined in the Use Case Diagram | Pass | The role `Learner` is the actor of UCD-001. |
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of US-001 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Professional English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion 6 (Optional) failed: Story statement avoids technical implementation detail; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[US-001]: ../../../docs/user-stories.md
|
||||||
|
[QC-US-001]: ../../../framework/qc/artifacts/qc-user-story.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# RC-032: Review of PP-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-032 |
|
||||||
|
| CrossReference | [PP-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [PP-001]
|
||||||
|
- Checklist used: none exists for this type, and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of PP-001 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Executive English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — no checklist exists for the Project Plan type; the plan now schedules MIL-008 on 2026-10-20 inside the Business Case constraint (delivery by 2026-10-21) and the language checklist passes. Accepted as the Product Owner's stand-in, after the Product Owner accepted the MIL-008 plan in chat. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[PP-001]: ../../../docs/project-plan.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# RC-033: Review of UC-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-033 |
|
||||||
|
| CrossReference | [UC-001], [QC-UC-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [UC-001]
|
||||||
|
- Checklist used: [QC-UC-001], and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Consists of a single, concise paragraph summarizing only the primary success scenario | N-A | The format is Fully Dressed; the Brief format criterion does not apply. |
|
||||||
|
| 2 | Written as an informal multi-paragraph narrative; may mention some alternate flows without formal structure | N-A | The format is Fully Dressed; the Casual format criterion does not apply. |
|
||||||
|
| 3 | All standard sections are present: actors, preconditions, postconditions, main success scenario, alternative/exception flows | Pass | Scope, level, actor, stakeholders, pre- and postconditions, main success scenario and extensions are present. |
|
||||||
|
| 4 | Preconditions and postconditions are explicitly defined | Pass | Preconditions and postconditions are listed. |
|
||||||
|
| 5 | Primary actor is explicitly stated | Pass | Primary actor is `Learner`. |
|
||||||
|
| 6 | Stakeholders and their interests are stated | Pass | Stakeholders S01 and S02 and their interests are stated. |
|
||||||
|
| 7 | Main success scenario is written as clear, numbered steps | Pass | Main success scenario has 9 numbered steps, including the level choice (steps 2 and 3). |
|
||||||
|
| 8 | Alternative/exception flows correctly reference `<<include>>`/`<<extend>>` use cases where relevant, per UML 2.5.1 | Pass | UCD-001 has no include or extend relationship, so no extension needs to reference one; the extensions (3a, 4a, 5a, 7a, 7b, 9a) are plain alternative flows. |
|
||||||
|
| 9 | Explicit business rules are captured per step where applicable, rather than embedded loosely in narrative text | Pass | The Business Rules table gives a rule per step. |
|
||||||
|
| 10 | Naming of actors and use case title is consistent with the corresponding Use Case Diagram and User Stories | Pass | Title and actor match UCD-001 and US-001; the level step matches US-001.06. |
|
||||||
|
| 11 | Scope/level (e.g. summary, user-goal, subfunction) is explicitly stated | Pass | `Level: user-goal` and `Scope: Flash Card program`. |
|
||||||
|
| 12 | Use case is written from the actor's goal perspective, free of UI or implementation detail | Pass | Steps are written as goals and answers; buttons, files and milliseconds are in the wireframe and milestones. |
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of UC-001 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Professional English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[UC-001]: ../../../docs/uc-001/uc.md
|
||||||
|
[QC-UC-001]: ../../../framework/qc/artifacts/qc-use-case.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# RC-034: Review of DM-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-034 |
|
||||||
|
| CrossReference | [DM-001], [QC-DM-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [DM-001]
|
||||||
|
- Checklist used: [QC-DM-001], and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Uses ubiquitous/business language throughout; no technical or implementation jargon (e.g. no "table", "class", "pointer") | Pass | Concepts are Flash Card, Word List, Words To Learn, Level and Study Session; no table or class names. |
|
||||||
|
| 2 | Multiplicities on associations are correct and complete (e.g. `1..*`, `0..1`) | Pass | Association table gives both multiplicities for all 7 associations. |
|
||||||
|
| 3 | No operation/method signatures shown — attributes and associations only | Pass | The diagram has attributes and associations only. |
|
||||||
|
| 4 | Associations are named with an unambiguous reading direction | Pass | Every association is named with a reading direction (`holds`, `works through`, `is limited to`, `takes the first words of`). |
|
||||||
|
| 5 | Generalization/specialization used correctly, reflecting true "is-a" relationships, not misused for code reuse | Pass | Generalization table says none exists, and why. |
|
||||||
|
| 6 | Every concept traces to a noun phrase found in the use cases or glossary | Pass | Concept table gives a source noun phrase in UC-001 for every concept. |
|
||||||
|
| 7 | Attributes are simple domain data (no foreign-key-like references or object pointers modeled as attributes) | Pass | Attributes are plain data (word, translation, first language, card shown). |
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of DM-001 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Professional English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[DM-001]: ../../../docs/domain-model.md
|
||||||
|
[QC-DM-001]: ../../../framework/qc/artifacts/qc-domain-model.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# RC-035: Review of DICT-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-035 |
|
||||||
|
| CrossReference | [DICT-001], [QC-DICT-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [DICT-001]
|
||||||
|
- Checklist used: [QC-DICT-001], and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Every row has a PO term, its language, an IT term and a definition | Pass | All 8 rows have PO term, language, IT term and definition. |
|
||||||
|
| 2 | Each PO term maps to exactly one IT term and the reverse (no synonyms) | Pass | One IT term per PO term; no synonym appears. |
|
||||||
|
| 3 | Every Domain Model concept has a row, and the Domain Model uses its PO term | Pass | The 5 concepts of DM-001 have a row (`Level` added) and DM-001 uses the PO term. |
|
||||||
|
| 4 | The Operation Contracts, Sequence Diagrams, Design Class Diagrams and ERD use the IT term, not the PO term | Pass | DCD-001, OC-001 and SD-001 use `Card`, `Vocabulary`, `Deck`, `StudySession`. |
|
||||||
|
| 5 | Definitions are written in the PO language and are one sentence | Pass | Definitions are one English sentence each. |
|
||||||
|
| 6 | "Used as PO term in" and "Used as IT term in" name artifact types that exist in the project | Pass | Artifact types named in both columns exist in the project. |
|
||||||
|
| 7 | The dictionary's `Language` and `Domain` rows, and the language of every row, match the PO language and domain in the project registry | Pass | `Language | en` and `Domain | it` match the registry; every row says `en`. |
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of DICT-001 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Professional English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[DICT-001]: ../../../docs/dictionary.md
|
||||||
|
[QC-DICT-001]: ../../../framework/qc/artifacts/qc-dictionary.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# RC-036: Review of SSD-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-036 |
|
||||||
|
| CrossReference | [SSD-001], [QC-SSD-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [SSD-001]
|
||||||
|
- Checklist used: [QC-SSD-001], and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Input/output messages match the corresponding Use Case's main success scenario step-for-step | Pass | System Operations table maps each message to steps of the main success scenario (1 to 9); the timer step is the one stated deviation. |
|
||||||
|
| 2 | Actor and System are treated strictly as black boxes (system shown as `:System`) | Pass | The system is `:System`; no internal object appears. |
|
||||||
|
| 3 | Object creation/destruction of the System instance handled explicitly where relevant | Pass | Lifecycle Notes state that the system lives for one run. |
|
||||||
|
| 4 | Return values are shown for operations that produce one, using dashed return arrows | Pass | Dashed return arrows are drawn for `startStudySession`, `chooseLevel`, the turn-over, `markKnown` and `markUnknown`. |
|
||||||
|
| 5 | Alternate/exceptional flows are represented separately (or explicitly out of scope noted) | Pass | The Alternate Flows section names extensions 3a, 4a, 5a, 7b and 9a, states that they add no operation, and says they are out of scope. |
|
||||||
|
| 6 | Message names are verb phrases consistent with the use case's system responsibilities | Pass | `startStudySession`, `markKnown` and `markUnknown` are verb phrases. |
|
||||||
|
| 7 | Diagram references the specific Use Case (name and ID) it depicts | Pass | Source Use Case section names UC-001 and the scenario. |
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of SSD-001 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Professional English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[SSD-001]: ../../../docs/uc-001/ssd.md
|
||||||
|
[QC-SSD-001]: ../../../framework/qc/artifacts/qc-ssd.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# RC-037: Review of OC-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-037 |
|
||||||
|
| CrossReference | [OC-001], [QC-OC-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [OC-001]
|
||||||
|
- Checklist used: [QC-OC-001]
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: n/a (technical type)
|
||||||
|
- Language reviewer: none
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Method signature is complete: operation name, parameter types, and return type | Pass | Each contract gives name, parameter list and return type (`startStudySession(): CardDto | None`). |
|
||||||
|
| 2 | Preconditions explicitly list required state before execution | Pass | Preconditions are listed per contract. |
|
||||||
|
| 3 | Postconditions explicitly describe resulting state using Larman's "instance created/associated/attribute modified" style | Pass | Postconditions use created / associated / destroyed / attribute set wording. |
|
||||||
|
| 4 | Exceptions and error conditions are documented, including the triggering precondition failure | Pass | Each contract has an Exceptions table with the failing precondition. |
|
||||||
|
| 5 | Operation is explicitly traceable to a single SSD message | Pass | Each of the four contracts (`startStudySession`, `chooseLevel`, `markKnown`, `markUnknown`) traces to exactly one SSD message; the timer step has none and says so. |
|
||||||
|
| 6 | Contract avoids specifying implementation/algorithmic details (declarative, not procedural) | Pass | Postconditions are declarative. |
|
||||||
|
| 7 | Cross-references the Domain Model classes/associations affected by pre/postconditions | Pass | Domain Model concepts and IT terms are cited per contract. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| none | - | - |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[OC-001]: ../../../docs/uc-001/oc.md
|
||||||
|
[QC-OC-001]: ../../../framework/qc/artifacts/qc-operation-contract.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
# RC-038: Review of SD-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-038 |
|
||||||
|
| CrossReference | [SD-001], [QC-SD-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [SD-001]
|
||||||
|
- Checklist used: [QC-SD-001]
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: n/a (technical type)
|
||||||
|
- Language reviewer: none
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | Message passing strictly follows UML sync/async/return arrow syntax | Pass | Calls are solid arrows with dashed returns. |
|
||||||
|
| 2 | GRASP/GoF patterns applied and explicitly annotated where used (e.g. Controller, Observer, Mediator, Factory) | Pass | Each sequence has a Pattern Annotations table (Creator, Information Expert, Null Object, MVVM, Repository). |
|
||||||
|
| 3 | Lifelines show activation bars matching actual processing time/call nesting | Pass | Activations are drawn for the session and the view model. |
|
||||||
|
| 4 | Object creation and destruction shown with correct UML notation (`create`/`destroy` messages, X on lifeline) | Pass | `create` is used for `Deck` and `StudySession`; no object is destroyed during the program's life and that is stated by omission, the process ends. |
|
||||||
|
| 5 | Diagram realizes the postconditions of a specific Operation Contract | Pass | Each of the four sequences has a Postcondition Coverage table for its contract in OC-001. |
|
||||||
|
| 6 | Responsibility assignment favors low coupling/high cohesion (no god-object receiving all messages) | Pass | Responsibility Check notes state that no object receives all messages. |
|
||||||
|
| 7 | Loop, alt, and opt combined fragments used correctly for conditional/repeated behavior | Pass | `alt` and `opt` fragments are used for the progress file and the empty deck. |
|
||||||
|
| 8 | Each exception of the realized Operation Contract is shown as an `alt` or `opt` fragment, or its absence is justified | Fail | The exceptions of OC-001 (missing file, malformed file) are raised before the sequence starts and are not drawn as `alt` fragments; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion 8 (Optional) failed: Each exception of the realized Operation Contract is shown as an `alt` or `opt` fragment, ; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[SD-001]: ../../../docs/uc-001/sd.md
|
||||||
|
[QC-SD-001]: ../../../framework/qc/artifacts/qc-sequence-diagram.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
# RC-039: Review of DCD-001
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-039 |
|
||||||
|
| CrossReference | [DCD-001], [QC-DCD-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [DCD-001]
|
||||||
|
- Checklist used: [QC-DCD-001]
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: n/a (technical type)
|
||||||
|
- Language reviewer: none
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | SOLID principles applied; no god classes with excessive responsibilities | Pass | Each class has one responsibility (Class Table); view, view model, session, deck and adapters are separate. |
|
||||||
|
| 2 | Visibility markers correct and consistent (`+` public, `-` private, `#` protected) | Pass | Visibility markers are on all members. |
|
||||||
|
| 3 | Relationships correctly distinguished: Association vs Aggregation vs Composition vs Dependency | Pass | Composition (Vocabulary and Card), aggregation (Deck), composition (LevelViewModel and LevelChoice), association, dependency and realization are distinguished. |
|
||||||
|
| 4 | Multiplicities and navigability specified on all associations | Pass | Multiplicities are on the associations; dependencies are directed. |
|
||||||
|
| 5 | Applied design patterns are annotated explicitly (e.g. Singleton, Factory, Strategy) | Pass | Pattern Annotations table lists Repository, Ports and adapters, Null Object, MVVM, Composition root. |
|
||||||
|
| 6 | Method signatures are traceable to Operation Contracts and/or design Sequence Diagrams | Pass | Method Traceability table maps every operation, including `Level.first`, `Deck.within`, `LevelViewModel.choices` and `LevelView.choose`, to OC-001 and SD-001. |
|
||||||
|
| 7 | Class names and structure remain consistent with the Domain Model concepts they refine | Pass | The Class Table has a `Refines` column; `Level` refines the concept Level of DM-001; names match the dictionary's IT terms. |
|
||||||
|
| 8 | No circular dependencies between classes/packages unless explicitly justified | Pass | Dependency Check states there are no cycles. |
|
||||||
|
| 9 | Dependencies between classes and packages point inward: domain classes do not depend on infrastructure, delivery or framework classes | Pass | Domain imports nothing; infrastructure and presentation point inward (Dependency Check). |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
Full review (not a delta) after the level choice was added for MIL-008.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| none | - | - |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[DCD-001]: ../../../docs/dcd.md
|
||||||
|
[QC-DCD-001]: ../../../framework/qc/artifacts/qc-dcd.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# RC-040: Review of MIL-008
|
||||||
|
|
||||||
|
## Metadata
|
||||||
|
| Key | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| ID | RC-040 |
|
||||||
|
| CrossReference | [MIL-008], [QC-MIL-001], [QC-LANG-001] |
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
|
| --- | --- | --- | --- | --- | --- |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [0b983b7] |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Artifact Under Review
|
||||||
|
|
||||||
|
- Instance reviewed: [MIL-008]
|
||||||
|
- Checklist used: [QC-MIL-001], and [QC-LANG-001] (language and domain)
|
||||||
|
- Scope: full review
|
||||||
|
- Language and domain: en / it
|
||||||
|
- Language reviewer: none (the stand-in for S01 reads the language and knows the domain)
|
||||||
|
- Mode: autonomous, not independent (reviewer is `AI as stand-in for S01`)
|
||||||
|
|
||||||
|
## Checklist Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | A concrete deliverable is defined for every gate | Pass | A concrete Deliverable section names the output evaluated at the gate. |
|
||||||
|
| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | The Go / No-Go table has numbered criteria, each with an observable Go and No-Go. |
|
||||||
|
| 3 | Dependencies on other milestones are explicitly mapped | Pass | Dependencies table names the milestone or documents it needs. |
|
||||||
|
| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability table maps to Business Case objectives and the user story. |
|
||||||
|
| 5 | Milestone owner and approving reviewer are identified | Pass | Ownership table names S01 as owner and approving reviewer. |
|
||||||
|
| 6 | Milestone has a defined target date consistent with project constraints | Pass | Target Date lies inside the 2026-10-14 to 2026-10-21 window of the Business Case. |
|
||||||
|
|
||||||
|
## Language and Domain Results
|
||||||
|
|
||||||
|
| # | Criterion | Status | Evidence/Notes |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata of MIL-008 has `Language | en` and `Domain | it`; neither is a placeholder. |
|
||||||
|
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code and `it` is a value of the registry's domain list. |
|
||||||
|
| 3 | The content (prose and table cells) is written in the stated language | Pass | Prose and table cells are English; Malay and Danish words and file names appear only as quoted data. |
|
||||||
|
| 4 | The register matches the one the registry gives for the artifact type | Pass | The registry gives `IT Executive English` for this type; the text is written for that reader. |
|
||||||
|
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | The PO terms of DICT-001 (flash card, word list, words to learn, study session) are used and no synonym replaces them. |
|
||||||
|
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Metadata keys, headings, IDs and statuses are English. |
|
||||||
|
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No translated twin exists beside the document (checked in `docs/`). |
|
||||||
|
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no change of language or domain since an earlier accepted version. |
|
||||||
|
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer is the stand-in for S01, the Product Owner, who reads English and knows the IT domain; no second language reviewer is needed (review-checklist-process step 2). Open to challenge by S01 in the end-of-run summary. |
|
||||||
|
| 10 | Abbreviations are spelled out on first use, in the stated language | Fail | CSV, MVVM, UI, PO and similar abbreviations are not all spelled out at first use; Optional, deferred. |
|
||||||
|
|
||||||
|
## Overall Verdict
|
||||||
|
|
||||||
|
Go — every Mandatory criterion passes; the failed Optional criteria are deferred with an action item. Reviewed by AI as stand-in for S01; not independent of the author.
|
||||||
|
|
||||||
|
## Action Items
|
||||||
|
|
||||||
|
| Action | Owner | Due |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Criterion LANG 10 (Optional) failed: Abbreviations are spelled out on first use, in the stated language; fix or accept the deferral | S01 | 2026-10-21 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[MIL-008]: ../../../docs/milestones/mil-008-choose-level.md
|
||||||
|
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||||
|
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
@@ -9,7 +9,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added MIL-008 and the review records of the level choice (no checklist exists for this type) | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -23,18 +24,18 @@ updated whenever an artifact instance is created or reviewed.
|
|||||||
|
|
||||||
| Artifact Instance | Type | Language | Domain | Upstream (Backward Link) | Downstream (Forward Link) | Last Reviewed (RC-ID) |
|
| Artifact Instance | Type | Language | Domain | Upstream (Backward Link) | Downstream (Forward Link) | Last Reviewed (RC-ID) |
|
||||||
| --- | --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- | --- |
|
||||||
| BC-001 | Business Case | en | it | - | SA-001, PP-001 | [RC-001] |
|
| BC-001 | Business Case | en | it | - | SA-001, PP-001 | [RC-030] |
|
||||||
| SA-001 | Stakeholder Analysis | en | it | BC-001 | PP-001, DICT-001 | [RC-002] |
|
| SA-001 | Stakeholder Analysis | en | it | BC-001 | PP-001, DICT-001 | [RC-002] |
|
||||||
| PP-001 | Project Plan | en | it | BC-001, SA-001 | MIL-001 to MIL-007 | [RC-003] |
|
| PP-001 | Project Plan | en | it | BC-001, SA-001 | MIL-001 to MIL-008 | [RC-032] |
|
||||||
| UCD-001 | Use Case Diagram | en | it | SA-001, BC-001 | US-001, UC-001 | [RC-004] |
|
| UCD-001 | Use Case Diagram | en | it | SA-001, BC-001 | US-001, UC-001 | [RC-004] |
|
||||||
| US-001 | User Story | en | it | UCD-001, BC-001 | MIL-002 to MIL-006 | [RC-005] |
|
| US-001 | User Story | en | it | UCD-001, BC-001 | MIL-002 to MIL-006, MIL-008 | [RC-031] |
|
||||||
| UC-001 | Use Case | en | it | UCD-001, US-001 | DM-001, SSD-001 | [RC-006] |
|
| UC-001 | Use Case | en | it | UCD-001, US-001 | DM-001, SSD-001 | [RC-033] |
|
||||||
| DM-001 | Domain Model | en | it | UC-001 | SSD-001, DICT-001, DCD-001 | [RC-007] |
|
| DM-001 | Domain Model | en | it | UC-001 | SSD-001, DICT-001, DCD-001 | [RC-034] |
|
||||||
| SSD-001 | System Sequence Diagram | en | it | UC-001, DM-001 | DCD-001 | [RC-008] |
|
| SSD-001 | System Sequence Diagram | en | it | UC-001, DM-001 | DCD-001 | [RC-036] |
|
||||||
| OC-001 | Operation Contract | - | - | SSD-001, DM-001 | SD-001 | [RC-009] |
|
| OC-001 | Operation Contract | - | - | SSD-001, DM-001 | SD-001 | [RC-037] |
|
||||||
| SD-001 | Sequence Diagram | - | - | OC-001 | DCD-001 | [RC-010] |
|
| SD-001 | Sequence Diagram | - | - | OC-001 | DCD-001 | [RC-038] |
|
||||||
| DCD-001 | Design Class Diagram | - | - | DM-001, SD-001, DICT-001 | src/flash_card | [RC-011] |
|
| DCD-001 | Design Class Diagram | - | - | DM-001, SD-001, DICT-001 | src/flash_card | [RC-039] |
|
||||||
| DICT-001 | Domain Dictionary | en | it | BC-001, SA-001, DM-001 | DCD-001 | [RC-012] |
|
| DICT-001 | Domain Dictionary | en | it | BC-001, SA-001, DM-001 | DCD-001 | [RC-035] |
|
||||||
| ADR-0001 | Architecture Decision Record | - | - | BC-001 | MIL-001, MIL-003, MIL-006 | [RC-013] |
|
| ADR-0001 | Architecture Decision Record | - | - | BC-001 | MIL-001, MIL-003, MIL-006 | [RC-013] |
|
||||||
| ADR-0002 | Architecture Decision Record | - | - | BC-001 | DCD-001 | [RC-014] |
|
| ADR-0002 | Architecture Decision Record | - | - | BC-001 | DCD-001 | [RC-014] |
|
||||||
| ADR-0003 | Architecture Decision Record | - | - | BC-001 | - | [RC-015] |
|
| ADR-0003 | Architecture Decision Record | - | - | BC-001 | - | [RC-015] |
|
||||||
@@ -45,6 +46,7 @@ updated whenever an artifact instance is created or reviewed.
|
|||||||
| MIL-005 | Milestone / Gateway | en | it | BC-001, PP-001 | tasks of MIL-005 | [RC-020] |
|
| MIL-005 | Milestone / Gateway | en | it | BC-001, PP-001 | tasks of MIL-005 | [RC-020] |
|
||||||
| MIL-006 | Milestone / Gateway | en | it | BC-001, PP-001 | tasks of MIL-006 | [RC-021] |
|
| MIL-006 | Milestone / Gateway | en | it | BC-001, PP-001 | tasks of MIL-006 | [RC-021] |
|
||||||
| MIL-007 | Milestone / Gateway | en | it | BC-001, PP-001 | tasks of MIL-007 | [RC-022] |
|
| MIL-007 | Milestone / Gateway | en | it | BC-001, PP-001 | tasks of MIL-007 | [RC-022] |
|
||||||
|
| MIL-008 | Milestone / Gateway | en | it | BC-001, PP-001 | tasks of MIL-008 | [RC-040] |
|
||||||
| PY-MIL-001 | Python Source Code | - | - | DCD-001, ADR-0002 | - | [RC-023] |
|
| PY-MIL-001 | Python Source Code | - | - | DCD-001, ADR-0002 | - | [RC-023] |
|
||||||
| PY-MIL-002 | Python Source Code | - | - | DCD-001, ADR-0002 | - | [RC-024] |
|
| PY-MIL-002 | Python Source Code | - | - | DCD-001, ADR-0002 | - | [RC-024] |
|
||||||
| PY-MIL-003 | Python Source Code | - | - | DCD-001, ADR-0002 | - | [RC-025] |
|
| PY-MIL-003 | Python Source Code | - | - | DCD-001, ADR-0002 | - | [RC-025] |
|
||||||
@@ -120,3 +122,16 @@ updated whenever an artifact instance is created or reviewed.
|
|||||||
[PY-MIL-006]: ../../src/flash_card
|
[PY-MIL-006]: ../../src/flash_card
|
||||||
[RC-029]: ./reviews/rc-029-py-mil-007.md
|
[RC-029]: ./reviews/rc-029-py-mil-007.md
|
||||||
[PY-MIL-007]: ../../src/flash_card
|
[PY-MIL-007]: ../../src/flash_card
|
||||||
|
[RC-030]: ./reviews/rc-030-business-case-level.md
|
||||||
|
[RC-031]: ./reviews/rc-031-user-stories-level.md
|
||||||
|
[RC-032]: ./reviews/rc-032-project-plan-level.md
|
||||||
|
[RC-033]: ./reviews/rc-033-use-case-level.md
|
||||||
|
[RC-034]: ./reviews/rc-034-domain-model-level.md
|
||||||
|
[RC-035]: ./reviews/rc-035-domain-dictionary-level.md
|
||||||
|
[RC-036]: ./reviews/rc-036-system-sequence-diagram-level.md
|
||||||
|
[RC-037]: ./reviews/rc-037-operation-contracts-level.md
|
||||||
|
[RC-038]: ./reviews/rc-038-sequence-diagrams-level.md
|
||||||
|
[RC-039]: ./reviews/rc-039-design-class-diagram-level.md
|
||||||
|
[RC-040]: ./reviews/rc-040-mil-008.md
|
||||||
|
[MIL-008]: ../milestones/mil-008-choose-level.md
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
+40
-11
@@ -9,7 +9,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added chooseLevel; startStudySession returns the levels | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -19,20 +20,46 @@ The turn-over of the card after 3000 ms is started by the system's own timer, no
|
|||||||
|
|
||||||
| Item | Value |
|
| Item | Value |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| Operation | `startStudySession(): CardDto \| None` |
|
| Operation | `startStudySession(): tuple[Level, ...]` |
|
||||||
| Traces to | `startStudySession` in [SSD-001] |
|
| Traces to | `startStudySession` in [SSD-001] |
|
||||||
| Domain Model concepts | Study Session, Words To Learn, Word List, Flash Card ([DM-001]); IT terms `StudySession`, `Deck`, `Vocabulary`, `Card` ([DICT-001]) |
|
| Domain Model concepts | Level ([DM-001]); IT term `Level` ([DICT-001]) |
|
||||||
|
|
||||||
|
**Preconditions**
|
||||||
|
|
||||||
|
- The program was started without a level.
|
||||||
|
|
||||||
|
**Postconditions**
|
||||||
|
|
||||||
|
- The levels 100 words, 1000 words and all words are returned, in that order.
|
||||||
|
- No `StudySession` or `Deck` was created and no file was read.
|
||||||
|
|
||||||
|
**Exceptions**
|
||||||
|
|
||||||
|
| Condition (failing precondition) | Outcome |
|
||||||
|
| --- | --- |
|
||||||
|
| The program was started with a level | The operation is not sent; `chooseLevel` is the first operation |
|
||||||
|
|
||||||
|
## Contract: chooseLevel
|
||||||
|
|
||||||
|
| Item | Value |
|
||||||
|
| --- | --- |
|
||||||
|
| Operation | `chooseLevel(level: Level): CardDto \| None` |
|
||||||
|
| Traces to | `chooseLevel` in [SSD-001] |
|
||||||
|
| Domain Model concepts | Study Session, Words To Learn, Word List, Level, Flash Card ([DM-001]); IT terms `StudySession`, `Deck`, `Vocabulary`, `Level`, `Card` ([DICT-001]) |
|
||||||
|
|
||||||
**Preconditions**
|
**Preconditions**
|
||||||
|
|
||||||
- A `Vocabulary` exists in the word list file.
|
- A `Vocabulary` exists in the word list file.
|
||||||
|
- `level` is one of the levels returned by `startStudySession`, or was given at start.
|
||||||
|
|
||||||
**Postconditions**
|
**Postconditions**
|
||||||
|
|
||||||
- A `StudySession` instance was created.
|
- A `StudySession` instance was created and associated with `level`.
|
||||||
- A `Deck` instance was created and associated with the `StudySession`.
|
- A `Deck` instance was created and associated with the `StudySession`.
|
||||||
- The `Deck` holds the cards of the progress file when it exists, otherwise a copy of the cards of the `Vocabulary`.
|
- The `Deck` holds the cards of the progress file when it exists, otherwise a copy of the cards of the `Vocabulary`; cards outside the level are kept in it.
|
||||||
- When the `Deck` is not empty, `StudySession.current_card` was set to a card of the `Deck` and a `CardDto` of it is returned; otherwise `current_card` is `None` and `None` is returned.
|
- The level's cards are the first `level.limit` cards of the `Vocabulary` (all of them when the limit is none or larger than the list).
|
||||||
|
- When the `Deck` holds a card of the level, `StudySession.current_card` was set to such a card and a `CardDto` of it is returned; otherwise `current_card` is `None` and `None` is returned.
|
||||||
|
- The Malay word of the card was passed to the `SpeechPort`.
|
||||||
|
|
||||||
**Exceptions**
|
**Exceptions**
|
||||||
|
|
||||||
@@ -40,6 +67,7 @@ The turn-over of the card after 3000 ms is started by the system's own timer, no
|
|||||||
| --- | --- |
|
| --- | --- |
|
||||||
| The word list file does not exist | `VocabularyNotFoundError` is raised; no session is created |
|
| The word list file does not exist | `VocabularyNotFoundError` is raised; no session is created |
|
||||||
| The word list or progress file has no header of two cells, or a row with other than two cells | `VocabularyFormatError` is raised; no session is created and no file is changed |
|
| The word list or progress file has no header of two cells, or a row with other than two cells | `VocabularyFormatError` is raised; no session is created and no file is changed |
|
||||||
|
| No card of the level is left in the `Deck` | `None` is returned; nothing is spoken |
|
||||||
|
|
||||||
## Contract: markKnown
|
## Contract: markKnown
|
||||||
|
|
||||||
@@ -55,8 +83,8 @@ The turn-over of the card after 3000 ms is started by the system's own timer, no
|
|||||||
|
|
||||||
**Postconditions**
|
**Postconditions**
|
||||||
|
|
||||||
- The `Card` of `current_card` was removed from the `Deck` (the association was destroyed).
|
- The `Card` of `current_card` was removed from the `Deck` (the association was destroyed); cards outside the level are not touched.
|
||||||
- The `Deck` was stored in the progress file.
|
- The whole `Deck` was stored in the progress file.
|
||||||
- `StudySession.current_card` was set to `None`.
|
- `StudySession.current_card` was set to `None`.
|
||||||
|
|
||||||
**Exceptions**
|
**Exceptions**
|
||||||
@@ -79,8 +107,8 @@ The turn-over of the card after 3000 ms is started by the system's own timer, no
|
|||||||
|
|
||||||
**Postconditions**
|
**Postconditions**
|
||||||
|
|
||||||
- `StudySession.current_card` was set to a card of the `Deck` that differs from the previous `current_card` when the `Deck` holds two or more cards, and a `CardDto` of it is returned.
|
- `StudySession.current_card` was set to a card of the level that differs from the previous `current_card` when the level holds two or more cards still to learn, and a `CardDto` of it is returned.
|
||||||
- When the `Deck` is empty, `current_card` is `None` and `None` is returned.
|
- When no card of the level is left, `current_card` is `None` and `None` is returned.
|
||||||
- The `Deck` and the progress file are unchanged.
|
- The `Deck` and the progress file are unchanged.
|
||||||
- The Malay word of the new `current_card` was passed to the `SpeechPort`.
|
- The Malay word of the new `current_card` was passed to the `SpeechPort`.
|
||||||
|
|
||||||
@@ -88,7 +116,7 @@ The turn-over of the card after 3000 ms is started by the system's own timer, no
|
|||||||
|
|
||||||
| Condition (failing precondition) | Outcome |
|
| Condition (failing precondition) | Outcome |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| The `Deck` is empty | `None` is returned; nothing is spoken |
|
| No card of the level is left | `None` is returned; nothing is spoken |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -97,3 +125,4 @@ The turn-over of the card after 3000 ms is started by the system's own timer, no
|
|||||||
[DICT-001]: ../dictionary.md
|
[DICT-001]: ../dictionary.md
|
||||||
[SD-001]: ./sd.md
|
[SD-001]: ./sd.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
+56
-14
@@ -9,7 +9,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added the sequences startStudySession (levels) and chooseLevel (level filter) | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -19,29 +20,66 @@
|
|||||||
|
|
||||||
### Diagram
|
### Diagram
|
||||||
|
|
||||||
|
```plantuml
|
||||||
|
@startuml
|
||||||
|
participant ":LevelView" as V
|
||||||
|
participant ":LevelViewModel" as VM
|
||||||
|
V -> VM : choices
|
||||||
|
VM --> V : tuple[Level, ...]
|
||||||
|
@enduml
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pattern Annotations
|
||||||
|
|
||||||
|
| Pattern (GRASP / GoF) | Applied to | Rationale |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| MVVM | `LevelView`, `LevelViewModel` | The view shows the choices; the labels and the order are in the view model |
|
||||||
|
|
||||||
|
### Postcondition Coverage
|
||||||
|
|
||||||
|
| Postcondition (from contract) | Satisfied by message |
|
||||||
|
| --- | --- |
|
||||||
|
| The three levels are returned in order | `choices` |
|
||||||
|
| No session or deck is created and no file is read | no other message is sent |
|
||||||
|
|
||||||
|
### Responsibility Check
|
||||||
|
|
||||||
|
The view model owns the choices; the view only draws buttons and forwards the click.
|
||||||
|
|
||||||
|
## Sequence: chooseLevel
|
||||||
|
|
||||||
|
**Realizes:** `chooseLevel` in [OC-001]
|
||||||
|
|
||||||
|
### Diagram
|
||||||
|
|
||||||
```plantuml
|
```plantuml
|
||||||
@startuml
|
@startuml
|
||||||
participant "main : app" as M
|
participant "main : app" as M
|
||||||
participant ":CsvVocabularyRepository" as VR
|
participant ":CsvVocabularyRepository" as VR
|
||||||
participant ":CsvProgressRepository" as PR
|
participant ":CsvProgressRepository" as PR
|
||||||
|
participant "level : Level" as L
|
||||||
participant ":StudySession" as S
|
participant ":StudySession" as S
|
||||||
participant ":Deck" as D
|
participant ":Deck" as D
|
||||||
participant ":SpeechPort" as SP
|
participant ":SpeechPort" as SP
|
||||||
|
M -> VR : load()
|
||||||
|
VR --> M : vocabulary
|
||||||
M -> PR : load()
|
M -> PR : load()
|
||||||
PR --> M : deck | None
|
PR --> M : deck | None
|
||||||
alt deck is None
|
alt deck is None
|
||||||
M -> VR : load()
|
|
||||||
VR --> M : vocabulary
|
|
||||||
create D
|
create D
|
||||||
M -> D : from_vocabulary(vocabulary)
|
M -> D : from_vocabulary(vocabulary)
|
||||||
D --> M : deck
|
D --> M : deck
|
||||||
end
|
end
|
||||||
|
M -> L : first(vocabulary.cards)
|
||||||
|
L --> M : level_cards
|
||||||
create S
|
create S
|
||||||
M -> S : create(deck, progress, speech, choose)
|
M -> S : create(deck, progress, speech, choose, level_cards)
|
||||||
M -> S : next_card()
|
M -> S : next_card()
|
||||||
activate S
|
activate S
|
||||||
opt deck is not empty
|
S -> D : within(level_cards)
|
||||||
S -> D : draw(choose, exclude)
|
D --> S : candidates
|
||||||
|
opt candidates is not empty
|
||||||
|
S -> D : draw(choose, exclude, among=candidates)
|
||||||
D --> S : card
|
D --> S : card
|
||||||
S -> SP : speak(card.front, front_code)
|
S -> SP : speak(card.front, front_code)
|
||||||
end
|
end
|
||||||
@@ -55,20 +93,21 @@ deactivate S
|
|||||||
| Pattern (GRASP / GoF) | Applied to | Rationale |
|
| Pattern (GRASP / GoF) | Applied to | Rationale |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| Creator | `app.main` creates `StudySession` | It holds the adapters the session needs |
|
| Creator | `app.main` creates `StudySession` | It holds the adapters the session needs |
|
||||||
| Information Expert | `Deck` draws and removes its own cards | It owns the list of cards |
|
| Information Expert | `Level.first`, `Deck.within`, `Deck.draw` | The level knows its limit, the deck knows its cards |
|
||||||
| Null Object | `NullSpeech` as `SpeechPort` | The session never tests for speech |
|
| Null Object | `NullSpeech` as `SpeechPort` | The session never tests for speech |
|
||||||
|
|
||||||
### Postcondition Coverage
|
### Postcondition Coverage
|
||||||
|
|
||||||
| Postcondition (from contract) | Satisfied by message |
|
| Postcondition (from contract) | Satisfied by message |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| A `StudySession` instance was created | `create(deck, progress, speech, choose)` |
|
| A `StudySession` was created and associated with the level | `create(deck, progress, speech, choose, level_cards)` |
|
||||||
| A `Deck` was created from the progress file or a copy of the `Vocabulary` | `PR.load()`, `alt` fragment, `from_vocabulary` |
|
| A `Deck` was created from the progress file or a copy of the `Vocabulary`, cards outside the level kept | `PR.load()`, `alt` fragment, `from_vocabulary` |
|
||||||
| `current_card` set and a `CardDto` returned, or `None` | `next_card()` with the `opt` fragment |
|
| The level's cards are the first N cards of the `Vocabulary` | `first(vocabulary.cards)` |
|
||||||
|
| `current_card` set and a `CardDto` returned, or `None`; the word was passed to the `SpeechPort` | `next_card()` with `within`, the `opt` fragment and `speak` |
|
||||||
|
|
||||||
### Responsibility Check
|
### Responsibility Check
|
||||||
|
|
||||||
The session coordinates, the deck holds the cards, the repositories hold the file format; no object receives all messages.
|
The composition root only wires; the level selects, the deck holds, the session coordinates; no object receives all messages.
|
||||||
|
|
||||||
## Sequence: markKnown
|
## Sequence: markKnown
|
||||||
|
|
||||||
@@ -134,8 +173,10 @@ participant ":SpeechPort" as SP
|
|||||||
V -> VM : next_card()
|
V -> VM : next_card()
|
||||||
VM -> S : next_card()
|
VM -> S : next_card()
|
||||||
activate S
|
activate S
|
||||||
opt deck is not empty
|
S -> D : within(level_cards)
|
||||||
S -> D : draw(choose, exclude=current)
|
D --> S : candidates
|
||||||
|
opt candidates is not empty
|
||||||
|
S -> D : draw(choose, exclude=current, among=candidates)
|
||||||
D --> S : card
|
D --> S : card
|
||||||
S -> SP : speak(card.front, front_code)
|
S -> SP : speak(card.front, front_code)
|
||||||
end
|
end
|
||||||
@@ -155,7 +196,7 @@ VM --> V : side, language name, text
|
|||||||
|
|
||||||
| Postcondition (from contract) | Satisfied by message |
|
| Postcondition (from contract) | Satisfied by message |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| A different card was chosen when two or more exist | `draw(choose, exclude=current)` |
|
| A different card of the level was chosen when two or more exist | `within(level_cards)`, `draw(choose, exclude=current, among=candidates)` |
|
||||||
| Deck and file unchanged | no `remove` or `save` message |
|
| Deck and file unchanged | no `remove` or `save` message |
|
||||||
| The Malay word was passed to the `SpeechPort` | `speak(card.front, front_code)` |
|
| The Malay word was passed to the `SpeechPort` | `speak(card.front, front_code)` |
|
||||||
|
|
||||||
@@ -169,3 +210,4 @@ Same as `markKnown`; the session is the only object that speaks and draws.
|
|||||||
[DCD-001]: ../dcd.md
|
[DCD-001]: ../dcd.md
|
||||||
[DICT-001]: ../dictionary.md
|
[DICT-001]: ../dictionary.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
+13
-8
@@ -11,7 +11,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added chooseLevel; startStudySession returns the levels | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -26,6 +27,8 @@ Study Flash Cards ([UC-001]) — scenario: main success scenario, with the unkno
|
|||||||
actor Learner as L
|
actor Learner as L
|
||||||
participant ":System" as S
|
participant ":System" as S
|
||||||
L -> S : startStudySession()
|
L -> S : startStudySession()
|
||||||
|
S --> L : levels (100 words, 1000 words, all words)
|
||||||
|
L -> S : chooseLevel(level)
|
||||||
S --> L : card (word, language name)
|
S --> L : card (word, language name)
|
||||||
... 3000 ms pass, the system turns the card over ...
|
... 3000 ms pass, the system turns the card over ...
|
||||||
S --> L : card (translation, language name)
|
S --> L : card (translation, language name)
|
||||||
@@ -40,20 +43,21 @@ S --> L : next card (word, language name)
|
|||||||
|
|
||||||
| Step | Message | Parameters | Return | Use case step |
|
| Step | Message | Parameters | Return | Use case step |
|
||||||
| --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- |
|
||||||
| 1 | startStudySession | none | card to show, or "nothing left to learn" | 1, 2, 3 |
|
| 1 | startStudySession | none | the levels to choose from | 1, 2 |
|
||||||
| 2 | (timer) turn the card over | none | the same card, translation side | 4 |
|
| 2 | chooseLevel | level | card to show, or "nothing left to learn" | 3, 4, 5 |
|
||||||
| 3 | markKnown | none | next card, or "nothing left to learn" | 5, 6, 7 |
|
| 3 | (timer) turn the card over | none | the same card, translation side | 6 |
|
||||||
| 4 | markUnknown | none | next card | 5a, 7 |
|
| 4 | markKnown | none | next card, or "nothing left to learn" | 7, 8, 9 |
|
||||||
|
| 5 | markUnknown | none | next card, or "nothing left to learn" | 7a, 9 |
|
||||||
|
|
||||||
The turn-over in step 2 is started by the system's own timer, not by a message from the Learner; it is shown as a return without a call, which is the one deviation from "every return answers a message".
|
The turn-over in step 3 is started by the system's own timer, not by a message from the Learner; it is shown as a return without a call, which is the one deviation from "every return answers a message". When the level is given at start (extension 3a of [UC-001]) the Learner's first message is `chooseLevel` and `startStudySession` is not sent.
|
||||||
|
|
||||||
## Alternate Flows
|
## Alternate Flows
|
||||||
|
|
||||||
The extensions 2a, 3a, 5b and 7a of [UC-001] add no system operation of their own (they are errors, speech and timer handling inside the three operations above); their behaviour is in [OC-001] as exceptions. They are out of scope of this diagram, which shows the main success scenario with `markUnknown` as the one alternate answer.
|
The extensions 3a, 4a, 5a, 7b and 9a of [UC-001] add no system operation of their own (they are errors, speech, timer and level handling inside the operations above); their behaviour is in [OC-001] as exceptions. They are out of scope of this diagram, which shows the main success scenario with `markUnknown` as the one alternate answer.
|
||||||
|
|
||||||
## Lifecycle Notes
|
## Lifecycle Notes
|
||||||
|
|
||||||
The system instance lives for one run of the program. The words to learn are created when the session starts and saved after each `markKnown`.
|
The system instance lives for one run of the program. The words to learn are created when the level is chosen and saved after each `markKnown`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -61,3 +65,4 @@ The system instance lives for one run of the program. The words to learn are cre
|
|||||||
[DM-001]: ../domain-model.md
|
[DM-001]: ../domain-model.md
|
||||||
[OC-001]: ./oc.md
|
[OC-001]: ./oc.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
+27
-18
@@ -11,7 +11,8 @@
|
|||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added the choice of level (US-001.06) | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -35,38 +36,45 @@
|
|||||||
### Main Success Scenario
|
### Main Success Scenario
|
||||||
|
|
||||||
1. The Learner starts the program.
|
1. The Learner starts the program.
|
||||||
2. The system loads the words to learn: from the kept progress when it exists, otherwise from the word list.
|
2. The system offers the levels: 100 words, 1000 words and all words.
|
||||||
3. The system shows a random card with the word in Malay.
|
3. The Learner chooses a level.
|
||||||
4. After three seconds the system turns the card over and shows the translation in Danish.
|
4. The system loads the words to learn: from the kept progress when it exists, otherwise from the word list.
|
||||||
5. The Learner states that the word is known.
|
5. The system shows a random card, with the word in Malay, from the first words of the word list that fit the level and are still to learn.
|
||||||
6. The system removes the word from the words to learn and keeps the words to learn.
|
6. After three seconds the system turns the card over and shows the translation in Danish.
|
||||||
7. The system shows a new random card, and the Learner repeats from step 4 until no word is left.
|
7. The Learner states that the word is known.
|
||||||
|
8. The system removes the word from the words to learn and keeps the words to learn.
|
||||||
|
9. The system shows a new random card of the level, and the Learner repeats from step 6 until no word is left at the level.
|
||||||
|
|
||||||
### Extensions (Alternative / Exception Flows)
|
### Extensions (Alternative / Exception Flows)
|
||||||
|
|
||||||
- 3a. Spoken words are available on the Learner's machine:
|
- 3a. The Learner has given the level when starting the program:
|
||||||
|
1. The system skips steps 2 and 3 and goes on at step 4.
|
||||||
|
- 5a. Spoken words are available on the Learner's machine:
|
||||||
1. The system speaks the Malay word. If speaking fails, the system logs it and goes on.
|
1. The system speaks the Malay word. If speaking fails, the system logs it and goes on.
|
||||||
- 5a. The Learner states that the word is not known:
|
- 7a. The Learner states that the word is not known:
|
||||||
1. The system keeps the word in the words to learn and shows a new random card; the Learner goes on at step 4.
|
1. The system keeps the word in the words to learn and shows a new random card of the level; the Learner goes on at step 6.
|
||||||
- 5b. The Learner answers before three seconds have passed:
|
- 7b. The Learner answers before three seconds have passed:
|
||||||
1. The system cancels the turn-over of the card being shown and starts a new one for the next card.
|
1. The system cancels the turn-over of the card being shown and starts a new one for the next card.
|
||||||
- 7a. No word is left:
|
- 9a. No word is left at the level:
|
||||||
1. The system tells the Learner that there is nothing left to learn, and further answers change nothing.
|
1. The system tells the Learner that there is nothing left to learn at this level, and further answers change nothing.
|
||||||
- 2a. The kept progress or the word list is unreadable:
|
- 4a. The kept progress or the word list is unreadable:
|
||||||
1. The system reports the problem to the Learner and ends; it does not overwrite the kept progress.
|
1. The system reports the problem to the Learner and ends; it does not overwrite the kept progress.
|
||||||
|
|
||||||
### Special Requirements / Business Rules
|
### Special Requirements / Business Rules
|
||||||
|
|
||||||
| Step | Rule |
|
| Step | Rule |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| 3, 7 | The next card is chosen at random from the words to learn |
|
| 2, 3 | A level is a number of words (100 or 1000) or all words |
|
||||||
| 4 | The turn-over comes three seconds after the card appears |
|
| 5 | The word list is ordered from the most to the least frequent word; a level of N words is its first N words; a list shorter than N is used whole |
|
||||||
| 6 | A word is identified by its Malay and Danish text; the first equal word is removed |
|
| 5, 9 | The next card is chosen at random from the words of the level that are still to learn |
|
||||||
| 2 | The word list names its two languages and holds one word and one translation per card |
|
| 6 | The turn-over comes three seconds after the card appears |
|
||||||
|
| 8 | A word is identified by its Malay and Danish text; the first equal word is removed; known words stay known at every level and words outside the level are kept |
|
||||||
|
| 4 | The word list names its two languages and holds one word and one translation per card |
|
||||||
|
|
||||||
### Open Issues
|
### Open Issues
|
||||||
|
|
||||||
- Starting again (resetting the kept progress) is not offered in the program; deleting the kept progress does it.
|
- Starting again (resetting the kept progress) is not offered in the program; deleting the kept progress does it.
|
||||||
|
- Going back to the level choice without restarting the program is not offered.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -76,3 +84,4 @@
|
|||||||
[DM-001]: ../domain-model.md
|
[DM-001]: ../domain-model.md
|
||||||
[SSD-001]: ./ssd.md
|
[SSD-001]: ./ssd.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
@@ -1,8 +1,32 @@
|
|||||||
# Wireframe: Study Flash Cards
|
# Wireframe: Study Flash Cards
|
||||||
|
|
||||||
|
_Revision 2026-10-14: the level screen (screen 1) was added for US-001.06. It was drawn by the AI from the use case because the Product Owner gave no wireframe for it; S01 may change it._
|
||||||
|
|
||||||
The Product Owner gave this screen in the first prompt (the course's target screenshot). The presentation layer implements it and does not redesign it. Source use case: [UC-001](./uc.md).
|
The Product Owner gave this screen in the first prompt (the course's target screenshot). The presentation layer implements it and does not redesign it. Source use case: [UC-001](./uc.md).
|
||||||
|
|
||||||
## Screen
|
## Screen 1: Choose your level
|
||||||
|
|
||||||
|
```text
|
||||||
|
+----------------------------------------------------------+ background #B1DDC6
|
||||||
|
| padding 50 px |
|
||||||
|
| |
|
||||||
|
| Choose your level (Arial 40 italic) |
|
||||||
|
| |
|
||||||
|
| [ 100 words ] |
|
||||||
|
| [ 1000 words ] |
|
||||||
|
| [ All words ] |
|
||||||
|
| |
|
||||||
|
+----------------------------------------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
| Element | Position | Details |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Window | whole | Same title, padding and background as the card screen |
|
||||||
|
| Title | row 0 | "Choose your level", Arial 40 italic |
|
||||||
|
| Level buttons | rows 1 to 3, one column | Labels "100 words", "1000 words", "All words"; Arial 24 bold; white background, equal width |
|
||||||
|
| After a choice | whole | The screen is replaced by screen 2 on the same window |
|
||||||
|
|
||||||
|
## Screen 2: The card
|
||||||
|
|
||||||
```text
|
```text
|
||||||
+----------------------------------------------------------+ background #B1DDC6
|
+----------------------------------------------------------+ background #B1DDC6
|
||||||
|
|||||||
+23
-4
@@ -4,20 +4,21 @@
|
|||||||
| Key | Value |
|
| Key | Value |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| ID | US-001 |
|
| ID | US-001 |
|
||||||
| CrossReference | [UCD-001], [BC-001], [UC-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006] |
|
| CrossReference | [UCD-001], [BC-001], [UC-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-008] |
|
||||||
| Language | en |
|
| Language | en |
|
||||||
| Domain | it |
|
| Domain | it |
|
||||||
|
|
||||||
## Version History
|
## Version History
|
||||||
| Date | Status | Author | Reviewer | Change | Commit |
|
| Date | Status | Author | Reviewer | Change | Commit |
|
||||||
| --- | --- | --- | --- | --- | --- |
|
| --- | --- | --- | --- | --- | --- |
|
||||||
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
| 2026-10-14 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [c3fbcbc] |
|
||||||
|
| 2026-10-14 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added US-001.06 Choose my level | [0b983b7] |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Purpose and Scope
|
## Purpose and Scope
|
||||||
|
|
||||||
These stories cover the epic "Study Flash Cards": the four steps of the course assignment (the window, new cards, flipping the cards, saving progress) and the spoken Malay word. Each story is delivered by one milestone. The wireframe the stories follow is in `docs/uc-001/wireframe.md`.
|
These stories cover the epic "Study Flash Cards": the four steps of the course assignment (the window, new cards, flipping the cards, saving progress), the spoken Malay word and the choice of level. Each story is delivered by one milestone. The wireframe the stories follow is in `docs/uc-001/wireframe.md`.
|
||||||
|
|
||||||
## Story List
|
## Story List
|
||||||
|
|
||||||
@@ -88,9 +89,25 @@ These stories cover the epic "Study Flash Cards": the four steps of the course a
|
|||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| [MIL-006], [UC-001] | fits one iteration | none |
|
| [MIL-006], [UC-001] | fits one iteration | none |
|
||||||
|
|
||||||
|
### US-001.06 — Choose my level
|
||||||
|
|
||||||
|
**As a** Learner, **I want** to choose a level of 100 words, 1000 words or all words before I start, **so that** I begin with the most frequent words and widen the list when I am ready.
|
||||||
|
|
||||||
|
**Acceptance Criteria**
|
||||||
|
|
||||||
|
- Given the program is started, when the window opens, then I see the choices 100 words, 1000 words and All words, and no card yet.
|
||||||
|
- Given I choose a level of N words, when the first card is shown, then every card comes from the first N words of the word list, which is ordered from the most to the least frequent word.
|
||||||
|
- Given I choose 1000 words or All words and the word list has fewer words than that, when the cards are drawn, then all words of the word list are used.
|
||||||
|
- Given I have marked words as known at one level, when I choose another level, then the known words stay known and only the words of the chosen level that I do not know yet come up.
|
||||||
|
- Given every word of the chosen level is known, when the level is chosen, then the program tells me that there is nothing left to learn at this level.
|
||||||
|
|
||||||
|
| Traces to | Size | INVEST exceptions |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| [MIL-008], [UC-001] | fits one iteration | none |
|
||||||
|
|
||||||
## INVEST Check
|
## INVEST Check
|
||||||
|
|
||||||
All five stories are Independent in delivery order (each builds on the one before but can be accepted alone), Negotiable in wording, Valuable to the Learner, Estimable, Small (one milestone each) and Testable (every criterion is Given/When/Then). Exception: US-001.02 to US-001.05 depend on the window of US-001.01, which is stated in their milestones' Dependencies.
|
All six stories are Independent in delivery order (each builds on the one before but can be accepted alone), Negotiable in wording, Valuable to the Learner, Estimable, Small (one milestone each) and Testable (every criterion is Given/When/Then). Exception: US-001.02 to US-001.06 depend on the window of US-001.01, which is stated in their milestones' Dependencies.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -102,4 +119,6 @@ All five stories are Independent in delivery order (each builds on the one befor
|
|||||||
[MIL-004]: ./milestones/mil-004-step3-flip-cards.md
|
[MIL-004]: ./milestones/mil-004-step3-flip-cards.md
|
||||||
[MIL-005]: ./milestones/mil-005-step4-save-progress.md
|
[MIL-005]: ./milestones/mil-005-step4-save-progress.md
|
||||||
[MIL-006]: ./milestones/mil-006-malay-speech.md
|
[MIL-006]: ./milestones/mil-006-malay-speech.md
|
||||||
|
[MIL-008]: ./milestones/mil-008-choose-level.md
|
||||||
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
[c3fbcbc]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/c3fbcbcfaf799e0ae34aed7e14d3bc8a62f03db3
|
||||||
|
[0b983b7]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/031-flash-card/commit/0b983b7fdadf6958717c1d0227d0f2ebe037f7b1
|
||||||
|
|||||||
Reference in New Issue
Block a user