Land milestones 002 to 004 on main #34
@@ -15,7 +15,7 @@ document of a type. `Primary File` may contain a glob (e.g.
|
||||
| SA | Stakeholder Analysis | docs/stakeholder-analysis.md | 002 |
|
||||
| PP | Project Plan | docs/project-plan.md | 002 |
|
||||
| MIL | Milestone / Gateway | docs/milestones/*.md | 005 |
|
||||
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 014 |
|
||||
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 018 |
|
||||
| TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 |
|
||||
| DICT | Domain Dictionary | docs/dictionary.md | 002 |
|
||||
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
# Review Record: Code of Milestone 001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-014 |
|
||||
| CrossReference | [MIL-001], [QC-PY-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-08 | Proposed | Jens Tirsvad Nielsen | S01 | Initial version | pending |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: Python source code of milestone 001 (type `PY`): the Python files that this milestone added or changed, on branch `mil-001-project-foundation` at commit d38f114
|
||||
- Checklist used: [QC-PY-001] (`QC-PY-001`, Python Source Code)
|
||||
- Milestone: [MIL-001], tasks 1 to 3 (#1 to #3), plus the configuration of tasks 1 and 2 (`pyproject.toml`, `.gitignore`); this record is the review task, issue #8
|
||||
- Scope: full review of the 4 Python files this milestone added or changed: `src/turtle_challenges/__init__.py`, `src/turtle_challenges/constants.py`, `tests/__init__.py`, `tests/test_package.py`. `pyproject.toml` and `.gitignore` are reviewed as the milestone's configuration.
|
||||
- Toolchain at that commit, run in a clean checkout of the branch: `ruff format --check .` and `ruff check .` exit 0, `mypy` reports no issues in 4 source files, `pytest` reports 3 passed, and `doxygen Doxyfile` prints no warning.
|
||||
- Language and domain: n/a (technical type)
|
||||
- Language reviewer: none (n/a)
|
||||
- Reviewer eligibility: S01 is the author of this code (the assistant wrote it for S01) and also its reviewer, which `framework/process/review-checklist-process.md` does not allow. S01 accepted this deviation in chat on 2026-10-07; it is recorded in the traceability matrix.
|
||||
- Status of this record: decided on 2026-10-08 by S01, the reviewer. The statuses and evidence are the assistant's assessment from the toolchain, an AST scan and a reading of the code, confirmed by S01.
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Packages, modules, functions, variables, classes and constants follow PEP 8 casing (`snake_case`, `PascalCase`, `UPPER_SNAKE`) | Pass | The package and modules (`turtle_challenges`, `constants`, `test_package`) are `snake_case`, the constants `WINDOW_TITLE` and `COLOR_MODE` are `UPPER_SNAKE`, the test functions are `snake_case`. The ruff naming rules (`N`) are on and report nothing. |
|
||||
| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes | Pass | `WINDOW_TITLE` and `COLOR_MODE` say what they hold, and each constant has a comment that says what it is for. The scan finds no single-letter and no short names. |
|
||||
| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions | Pass | `ruff format --check .` and `ruff check .` exit 0 with the rules `ANN`, `B`, `E`, `F`, `I`, `N`, `SIM`, `UP` and `W`; `pyproject.toml` commits the configuration. No `# noqa` and no `# type: ignore` (scan). |
|
||||
| 4 | Every function and method signature is type-annotated, including `-> None` | Pass | The only functions are the three smoke tests, annotated `-> None`; ruff `ANN` and mypy strict report nothing. |
|
||||
| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) | N-A | No code in this milestone raises or catches an exception. |
|
||||
| 6 | No mutable default arguments and no shadowed builtins | Pass | Scan of the changed files: no mutable default argument and no shadowed builtin (parameters, variables, functions, classes). |
|
||||
| 7 | Files, locks and connections are managed with context managers | N-A | No file, lock or connection is opened (scan: no `open(`). |
|
||||
| 8 | Public modules, classes and functions have docstrings that say what, not how | Pass | Optional. `__init__.py` and `constants.py` have module docstrings and every constant has a Doxygen comment. `doxygen Doxyfile` has 0 warnings, and a warning fails the build. |
|
||||
| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output | Pass | No `print` call (scan) and no logging; nothing reads `.env` or any other secret. |
|
||||
| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded | N-A | No class or operation is defined, and no design class diagram exists: the milestone's tasks are plain technical tasks (`Needs its own Use Case/User Story?` is No). S01 confirmed `N-A` on 2026-10-08. |
|
||||
| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network | Pass | `tests/test_package.py` has 3 smoke tests named for the behaviour (the package imports and is documented, the color mode, the window title). They pass alone and in reverse order and use no network (scan). |
|
||||
| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment | Pass | Optional. `mypy` (strict, set in `pyproject.toml`) reports no issues in 4 source files; `Any` is not used. |
|
||||
| 13 | Dependencies are declared and pinned in the project's dependency file, none unused | Fail | Optional. `pyproject.toml` declares `mypy>=1.13`, `pytest>=8.3`, `ruff>=0.8` and the build backend `setuptools>=77` with lower bounds only; nothing is pinned and there is no lockfile or constraints file. The runtime dependency list is empty, so no dependency is unused. S01 accepted lower bounds on 2026-10-08, so this optional failure stays recorded and needs no action. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — all mandatory criteria of `QC-PY-001` pass or are `N-A`. The optional criterion 13 fails (lower bounds only); S01 accepted that on 2026-10-08, so it needs no action.
|
||||
|
||||
Reviewer eligibility: S01 is the author of this code and also its reviewer, which the review process does not allow; S01 accepted this deviation in chat on 2026-10-07 and it is recorded in the traceability matrix.
|
||||
|
||||
The row of the code in the traceability matrix is updated, and issue #8 closes through the commit message when the pull request that carries it merges into `main`.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| Optional (criterion 13): pin the development tools (exact versions or a constraints file), or record that lower bounds are accepted. Closed 2026-10-08: S01 accepted lower bounds. | S01 | 2026-10-10 |
|
||||
| After the verdict `Go`: update the traceability matrix and close issue #8. Done 2026-10-08: the matrix is updated and the commit message carries `Closes #8`. | S01 | 2026-10-10 |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-foundation.md
|
||||
[QC-PY-001]: ../../../framework/qc/qc-programming-python.md
|
||||
@@ -0,0 +1,67 @@
|
||||
# Review Record: Code of Milestone 002
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-015 |
|
||||
| CrossReference | [MIL-002], [QC-PY-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-08 | Proposed | Jens Tirsvad Nielsen | S01 | Initial version | pending |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: Python source code of milestone 002 (type `PY`): the Python files that this milestone added or changed, on branch `mil-002-square-and-dashed-line` at commit b3153b9
|
||||
- Checklist used: [QC-PY-001] (`QC-PY-001`, Python Source Code)
|
||||
- Milestone: [MIL-002], tasks 1 to 6 (#9 to #14); this record is the review task, issue #15
|
||||
- Scope: full review of the 14 Python files this milestone added or changed: `src/turtle_challenges/__init__.py`, `src/turtle_challenges/__main__.py`, `src/turtle_challenges/cli.py`, `src/turtle_challenges/constants.py`, `src/turtle_challenges/dashed_line.py`, `src/turtle_challenges/pen.py`, `src/turtle_challenges/square.py`, `src/turtle_challenges/window.py`, `tests/fakes.py`, `tests/test_cli.py`, `tests/test_constants.py`, `tests/test_dashed_line.py`, `tests/test_square.py`, `tests/test_window.py`.
|
||||
- Toolchain at that commit, run in a clean checkout of the branch: `ruff format --check .` and `ruff check .` exit 0, `mypy` reports no issues in 16 source files, `pytest` reports 29 passed, and `doxygen Doxyfile` prints no warning.
|
||||
- Language and domain: n/a (technical type)
|
||||
- Language reviewer: none (n/a)
|
||||
- Reviewer eligibility: S01 is the author of this code (the assistant wrote it for S01) and also its reviewer, which `framework/process/review-checklist-process.md` does not allow. S01 accepted this deviation in chat on 2026-10-07; it is recorded in the traceability matrix.
|
||||
- Status of this record: decided on 2026-10-08 by S01, the reviewer. The statuses and evidence are the assistant's assessment from the toolchain, an AST scan and a reading of the code, confirmed by S01.
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Packages, modules, functions, variables, classes and constants follow PEP 8 casing (`snake_case`, `PascalCase`, `UPPER_SNAKE`) | Pass | Modules, functions and variables are `snake_case` (`draw_square`, `draw_dashed_line`, `create_window`, `build_parser`). The classes `Pen`, `Window`, `TurtleUnavailableError`, `FakePen` and `FakeWindow` are `PascalCase` and the exception ends in `Error`. Constants are `UPPER_SNAKE`. ruff `N` is clean. |
|
||||
| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes | Pass | Names state purpose (`dash_count`, `gap_length`, `side_length`, `create_pen`); the scan finds no single-letter names. Short names: `pen`, `args`, `argv` (standard) and `tim`. `tim` in `cli.main` is the lecture's name for the turtle and nothing in the code explains it. Judgement call for the reviewer (see the action items). S01 accepted the name `tim` as the course's name on 2026-10-08. |
|
||||
| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions | Pass | `ruff format --check .` and `ruff check .` exit 0; no `# noqa`, no `# type: ignore`. Recorded exception: `window.py` imports `turtle` inside `create_window` and `create_pen` instead of at the top of the file, which the Python conventions ask for. The reason is stated in the module docstring (importing the package must not need Tk), and no linter rule flags it. S01 accepts the exception (see the action items). S01 accepted this exception on 2026-10-08. |
|
||||
| 4 | Every function and method signature is type-annotated, including `-> None` | Pass | Every parameter and return is annotated (scan: none unannotated); mypy strict is clean. |
|
||||
| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) | Pass | `window.py` raises `TurtleUnavailableError` `from` the `ImportError` (2 raises, both with a cause) and `cli.main` handles it with `parser.exit`. The drawing functions raise `ValueError` for invalid lengths and counts. No bare or broad `except`; nothing is swallowed. |
|
||||
| 6 | No mutable default arguments and no shadowed builtins | Pass | Scan of the changed files: no mutable default argument and no shadowed builtin (parameters, variables, functions, classes). |
|
||||
| 7 | Files, locks and connections are managed with context managers | N-A | No file, lock or connection is opened (scan: no `open(`). The turtle window is closed by `exitonclick`, the library's own mechanism. |
|
||||
| 8 | Public modules, classes and functions have docstrings that say what, not how | Pass | Optional. Every public module, class and function in `src/` has a docstring (scan: none missing), and `doxygen Doxyfile` has 0 warnings. |
|
||||
| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output | Pass | No `print` call (scan: 0) and no logging. `cli.main` reports a missing Tk on standard error through `parser.exit`. No secret is read. |
|
||||
| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded | N-A | No design class diagram exists, and the tasks are plain technical tasks. The only classes are the protocols `Pen` and `Window` and the test doubles `FakePen` and `FakeWindow`; each traces to a task row (MIL-002 tasks 1 and 2, issues #9 and #10). Judgement call: a strict reading would fail this criterion. S01 confirmed `N-A` on 2026-10-08. |
|
||||
| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network | Pass | 29 tests (26 new), named for the behaviour (for example `test_draw_square_rejects_a_side_that_is_not_positive`). They pass in file order, in reverse order and file by file, and no test imports a network module (scan). Gaps: the successful path of `create_window` and `create_pen` needs a display and has no automated test (only the missing-Tk path does), and `__main__.py` (two lines) has none. A script has run the challenges against the real `turtle` library without error. |
|
||||
| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment | Pass | Optional. mypy strict reports no issues in 16 source files; `Any` is not used. |
|
||||
| 13 | Dependencies are declared and pinned in the project's dependency file, none unused | N-A | Optional. No dependency changed in this milestone; see [RC-014]. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — all mandatory criteria of `QC-PY-001` pass or are `N-A`. S01 accepted the three points that needed judgement on 2026-10-08: the imports inside `create_window` and `create_pen` as a documented exception, the name `tim` as the course's name, and `N-A` for criterion 10 because the project has no design artifacts.
|
||||
|
||||
Reviewer eligibility: S01 is the author of this code and also its reviewer, which the review process does not allow; S01 accepted this deviation in chat on 2026-10-07 and it is recorded in the traceability matrix.
|
||||
|
||||
The row of the code in the traceability matrix is updated, and issue #15 closes through the commit message when the pull request that carries it merges into `main`.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| Decision (criterion 3): accept the imports inside `create_window` and `create_pen` as a documented exception to "imports at the top". Closed 2026-10-08: S01 accepted. | S01 | 2026-10-14 |
|
||||
| Decision (criterion 2): rename `tim` to `pen` in `cli.py` and in the README example, or accept it as the course's name. Closed 2026-10-08: S01 accepted. | S01 | 2026-10-14 |
|
||||
| Decision (criterion 10): confirm `N-A`, because the project has no design artifacts, or require a design class diagram. Closed 2026-10-08: S01 accepted. | S01 | 2026-10-14 |
|
||||
| After the verdict `Go`: update the traceability matrix and close issue #15. Done 2026-10-08: the matrix is updated and the commit message carries `Closes #15`. | S01 | 2026-10-14 |
|
||||
|
||||
---
|
||||
|
||||
[MIL-002]: ../../milestones/mil-002-square-and-dashed-line.md
|
||||
[QC-PY-001]: ../../../framework/qc/qc-programming-python.md
|
||||
[RC-014]: ./rc-014-code-mil-001.md
|
||||
@@ -0,0 +1,66 @@
|
||||
# Review Record: Code of Milestone 003
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-016 |
|
||||
| CrossReference | [MIL-003], [QC-PY-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-08 | Proposed | Jens Tirsvad Nielsen | S01 | Initial version | pending |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: Python source code of milestone 003 (type `PY`): the Python files that this milestone added or changed, on branch `mil-003-shapes-and-random-color` at commit c695c47
|
||||
- Checklist used: [QC-PY-001] (`QC-PY-001`, Python Source Code)
|
||||
- Milestone: [MIL-003], tasks 1 to 6 (#16 to #21); this record is the review task, issue #22
|
||||
- Scope: full review of the 8 Python files this milestone added or changed: `src/turtle_challenges/__init__.py`, `src/turtle_challenges/cli.py`, `src/turtle_challenges/colors.py`, `src/turtle_challenges/constants.py`, `src/turtle_challenges/shapes.py`, `tests/test_colors.py`, `tests/test_constants.py`, `tests/test_shapes.py`.
|
||||
- Toolchain at that commit, run in a clean checkout of the branch: `ruff format --check .` and `ruff check .` exit 0, `mypy` reports no issues in 20 source files, `pytest` reports 66 passed, and `doxygen Doxyfile` prints no warning.
|
||||
- Language and domain: n/a (technical type)
|
||||
- Language reviewer: none (n/a)
|
||||
- Reviewer eligibility: S01 is the author of this code (the assistant wrote it for S01) and also its reviewer, which `framework/process/review-checklist-process.md` does not allow. S01 accepted this deviation in chat on 2026-10-07; it is recorded in the traceability matrix.
|
||||
- Status of this record: decided on 2026-10-08 by S01, the reviewer. The statuses and evidence are the assistant's assessment from the toolchain, an AST scan and a reading of the code, confirmed by S01.
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Packages, modules, functions, variables, classes and constants follow PEP 8 casing (`snake_case`, `PascalCase`, `UPPER_SNAKE`) | Pass | Modules `colors` and `shapes`, functions `random_color`, `random_palette_color`, `draw_shape` and `draw_shapes` and the tests are `snake_case`; constants such as `COLOR_PALETTE` and `MIN_POLYGON_SIDES` are `UPPER_SNAKE`. No class is defined. ruff `N` is clean. |
|
||||
| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes | Pass | Names state purpose (`num_sides`, `side_length`, `random_palette_color`); no single-letter names (scan). Short names: `rng` (every docstring explains it as the random generator to draw from), `red`, `green`, `blue`, and `tim`, carried over from `cli.py` (see [RC-015]). |
|
||||
| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions | Pass | `ruff format --check .` and `ruff check .` exit 0; no `# noqa`, no `# type: ignore`. |
|
||||
| 4 | Every function and method signature is type-annotated, including `-> None` | Pass | Every parameter and return is annotated (scan: none unannotated); mypy strict is clean. |
|
||||
| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) | Pass | `draw_shape` raises `ValueError` for fewer than 3 sides or a side that is not positive; no code in this milestone catches an exception. |
|
||||
| 6 | No mutable default arguments and no shadowed builtins | Pass | Scan of the changed files: no mutable default argument and no shadowed builtin (parameters, variables, functions, classes). |
|
||||
| 7 | Files, locks and connections are managed with context managers | N-A | No file, lock or connection is opened (scan: no `open(`). |
|
||||
| 8 | Public modules, classes and functions have docstrings that say what, not how | Pass | Optional. Every public module and function in `src/` has a docstring (scan: none missing); `doxygen Doxyfile` has 0 warnings. |
|
||||
| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output | Pass | No `print` call (scan) and no logging; no secret is read. |
|
||||
| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded | N-A | No class is defined and no design class diagram exists; the tasks are plain technical tasks (see [RC-015] criterion 10). S01 confirmed `N-A` on 2026-10-08. |
|
||||
| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network | Pass | 66 tests (37 new), named for the behaviour: type, range and seeded repeatability of `random_color`; the turn angle and the side count for each shape from 3 to 10 sides (parametrised); the `ValueError` cases; the palette use of `draw_shapes`. They pass in file order, in reverse order and file by file; no network imports (scan). |
|
||||
| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment | Pass | Optional. mypy strict reports no issues in 20 source files; `Any` is not used. |
|
||||
| 13 | Dependencies are declared and pinned in the project's dependency file, none unused | N-A | Optional. No dependency changed in this milestone; see [RC-014]. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — all mandatory criteria of `QC-PY-001` pass or are `N-A`. S01 confirmed `N-A` for criterion 10 on 2026-10-08, as in [RC-015].
|
||||
|
||||
Reviewer eligibility: S01 is the author of this code and also its reviewer, which the review process does not allow; S01 accepted this deviation in chat on 2026-10-07 and it is recorded in the traceability matrix.
|
||||
|
||||
The row of the code in the traceability matrix is updated, and issue #22 closes through the commit message when the pull request that carries it merges into `main`.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| Decision (criterion 10): confirm `N-A` as in [RC-015]. Closed 2026-10-08: S01 accepted. | S01 | 2026-10-17 |
|
||||
| After the verdict `Go`: update the traceability matrix and close issue #22. Done 2026-10-08: the matrix is updated and the commit message carries `Closes #22`. | S01 | 2026-10-17 |
|
||||
|
||||
---
|
||||
|
||||
[MIL-003]: ../../milestones/mil-003-shapes-and-random-color.md
|
||||
[QC-PY-001]: ../../../framework/qc/qc-programming-python.md
|
||||
[RC-014]: ./rc-014-code-mil-001.md
|
||||
[RC-015]: ./rc-015-code-mil-002.md
|
||||
@@ -0,0 +1,67 @@
|
||||
# Review Record: Code of Milestone 004
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-017 |
|
||||
| CrossReference | [MIL-004], [QC-PY-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-08 | Proposed | Jens Tirsvad Nielsen | S01 | Initial version | pending |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: Python source code of milestone 004 (type `PY`): the Python files that this milestone added or changed, on branch `mil-004-random-walk-and-spirograph` at commit 795b9db
|
||||
- Checklist used: [QC-PY-001] (`QC-PY-001`, Python Source Code)
|
||||
- Milestone: [MIL-004], tasks 1 to 4 (#23 to #26) and the code side of task 5 (#27); this record is the review task, issue #29
|
||||
- Scope: full review of the 9 Python files this milestone added or changed: `src/turtle_challenges/__init__.py`, `src/turtle_challenges/cli.py`, `src/turtle_challenges/constants.py`, `src/turtle_challenges/random_walk.py`, `src/turtle_challenges/spirograph.py`, `tests/test_cli.py`, `tests/test_constants.py`, `tests/test_random_walk.py`, `tests/test_spirograph.py`.
|
||||
- Toolchain at that commit, run in a clean checkout of the branch: `ruff format --check .` and `ruff check .` exit 0, `mypy` reports no issues in 24 source files, `pytest` reports 95 passed, and `doxygen Doxyfile` prints no warning.
|
||||
- Language and domain: n/a (technical type)
|
||||
- Language reviewer: none (n/a)
|
||||
- Reviewer eligibility: S01 is the author of this code (the assistant wrote it for S01) and also its reviewer, which `framework/process/review-checklist-process.md` does not allow. S01 accepted this deviation in chat on 2026-10-07; it is recorded in the traceability matrix.
|
||||
- Status of this record: decided on 2026-10-08 by S01, the reviewer. The statuses and evidence are the assistant's assessment from the toolchain, an AST scan and a reading of the code, confirmed by S01.
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Packages, modules, functions, variables, classes and constants follow PEP 8 casing (`snake_case`, `PascalCase`, `UPPER_SNAKE`) | Pass | Modules `random_walk` and `spirograph`, functions `random_walk` and `draw_spirograph` and the tests are `snake_case`; constants such as `WALK_STEPS` and `SPIROGRAPH_RADIUS` are `UPPER_SNAKE`. No class is defined. ruff `N` is clean. |
|
||||
| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes | Pass | Names state purpose (`steps`, `distance`, `size_of_gap`, `radius`); no single-letter names (scan). `size_of_gap` and `draw_spirograph` are the course's names. Short names: `rng` (explained in each docstring), `gap` (the `--gap` option) and `tim`, still in `cli.py` (see [RC-015]). S01 accepted the name `tim` on 2026-10-08 (see [RC-015]). |
|
||||
| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions | Pass | `ruff format --check .` and `ruff check .` exit 0; no `# noqa`, no `# type: ignore`. |
|
||||
| 4 | Every function and method signature is type-annotated, including `-> None` | Pass | Every parameter and return is annotated (scan: none unannotated); mypy strict is clean. |
|
||||
| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) | Pass | `random_walk` raises `ValueError` for negative steps or a distance that is not positive, and `draw_spirograph` for a gap or radius that is not positive; no code in this milestone catches an exception. |
|
||||
| 6 | No mutable default arguments and no shadowed builtins | Pass | Scan of the changed files: no mutable default argument and no shadowed builtin (parameters, variables, functions, classes). |
|
||||
| 7 | Files, locks and connections are managed with context managers | N-A | No file, lock or connection is opened (scan: no `open(`). |
|
||||
| 8 | Public modules, classes and functions have docstrings that say what, not how | Pass | Optional. Every public module and function in `src/` has a docstring (scan: none missing); `doxygen Doxyfile` has 0 warnings. |
|
||||
| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output | Pass | No `print` call (scan) and no logging; no secret is read. |
|
||||
| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded | N-A | No class is defined and no design class diagram exists; the tasks are plain technical tasks (see [RC-015] criterion 10). S01 confirmed `N-A` on 2026-10-08. |
|
||||
| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network | Pass | 95 tests (29 new), named for the behaviour: seeded repeatability, step count and distance, headings drawn only from the four directions, pen size and speed set before the first move, the circle count `int(360 / size_of_gap)` including a gap of 7 and a float gap, the heading change, the `ValueError` cases, and the `--gap` option of the command line. They pass in file order, in reverse order and file by file; no network imports (scan). The real turtle window is not covered by an automated test (see [RC-015] criterion 11). |
|
||||
| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment | Pass | Optional. mypy strict reports no issues in 24 source files; `Any` is not used. |
|
||||
| 13 | Dependencies are declared and pinned in the project's dependency file, none unused | N-A | Optional. No dependency changed in this milestone; see [RC-014]. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — all mandatory criteria of `QC-PY-001` pass or are `N-A`. S01 confirmed `N-A` for criterion 10 and accepted the name `tim` on 2026-10-08, as in [RC-015].
|
||||
|
||||
Reviewer eligibility: S01 is the author of this code and also its reviewer, which the review process does not allow; S01 accepted this deviation in chat on 2026-10-07 and it is recorded in the traceability matrix.
|
||||
|
||||
The row of the code in the traceability matrix is updated, and issue #29 closes through the commit message when the pull request that carries it merges into `main`.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| Decision (criterion 10): confirm `N-A` as in [RC-015]. Closed 2026-10-08: S01 accepted. | S01 | 2026-10-21 |
|
||||
| Decision (criterion 2): the name `tim` in `cli.py` is decided in [RC-015]. Closed 2026-10-08: S01 accepted. | S01 | 2026-10-21 |
|
||||
| After the verdict `Go`: update the traceability matrix and close issue #29. Done 2026-10-08: the matrix is updated and the commit message carries `Closes #29`. | S01 | 2026-10-21 |
|
||||
|
||||
---
|
||||
|
||||
[MIL-004]: ../../milestones/mil-004-random-walk-and-spirograph.md
|
||||
[QC-PY-001]: ../../../framework/qc/qc-programming-python.md
|
||||
[RC-014]: ./rc-014-code-mil-001.md
|
||||
[RC-015]: ./rc-015-code-mil-002.md
|
||||
@@ -10,6 +10,7 @@
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S01 | Initial version | [4b3391b] |
|
||||
| 2026-10-08 | Proposed | Jens Tirsvad Nielsen | S01 | Added the rows for the code of each milestone, with [RC-014] to [RC-017] | pending |
|
||||
|
||||
---
|
||||
|
||||
@@ -31,11 +32,16 @@ updated whenever an artifact instance is created or reviewed.
|
||||
| [MIL-002] | MIL | en | it | [BC-001], [MIL-001] | [MIL-003] | [RC-011] (draft re-review of [RC-004], Go) |
|
||||
| [MIL-003] | MIL | en | it | [BC-001], [MIL-002] | [MIL-004] | [RC-012] (draft re-review of [RC-005], Go) |
|
||||
| [MIL-004] | MIL | en | it | [BC-001], [MIL-003] | - | [RC-013] (draft re-review of [RC-006], Go) |
|
||||
| Python source code of milestone 001 (`src/`, `tests/`, branch `mil-001-project-foundation`) | PY | - | - | [MIL-001] | - | [RC-014] (Go) |
|
||||
| Python source code of milestone 002 (`src/`, `tests/`, branch `mil-002-square-and-dashed-line`) | PY | - | - | [MIL-002] | - | [RC-015] (Go) |
|
||||
| Python source code of milestone 003 (`src/`, `tests/`, branch `mil-003-shapes-and-random-color`) | PY | - | - | [MIL-003] | - | [RC-016] (Go) |
|
||||
| Python source code of milestone 004 (`src/`, `tests/`, branch `mil-004-random-walk-and-spirograph`) | PY | - | - | [MIL-004] | - | [RC-017] (Go) |
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
- `-` in Upstream means foundational ([SA-001] is the foundation of the stakeholder IDs); in Downstream it means nothing is built on it yet ([MIL-004] is the last gateway; the source code under `src/` is not an instance of this matrix); in Last Reviewed it means no `RC-*` exists.
|
||||
- [PP-001] has no `RC-*` because the Project Plan has no QC checklist; the Product Owner accepts it directly.
|
||||
- `-` in Upstream means foundational ([SA-001] is the foundation of the stakeholder IDs); in Downstream it means nothing is built on it yet ([MIL-004] is the last gateway; the source code is listed per milestone in the `PY` rows); in Last Reviewed it means no `RC-*` exists.
|
||||
- [PP-001] has no `RC-*` because the Project Plan has no QC checklist; the Product Owner accepted it directly on 2026-10-08.
|
||||
- The `PY` rows list the Python code each milestone added or changed, reviewed against `QC-PY-001`. Their records, [RC-014] to [RC-017], ended in `Go` on 2026-10-08; a `-` in Language and Domain is right for source code, a technical type.
|
||||
- Each artifact lists its latest review record: the delta re-review ([RC-008] to [RC-013]) of the first review ([RC-001] to [RC-006]), or [RC-007] for [DICT-001]. All of them ended in `Go` on 2026-10-07.
|
||||
- S01 is the author and also the reviewer of every artifact. The review process does not allow this; S01 accepted the deviation in chat on 2026-10-07 because the project has one person and no governance document (`GOV`) exists.
|
||||
- No instance exists yet for the types KPI, RA, BMC, BPMN, UCD, US, UC, DM, SSD, OC, SD, DCD, ERD, ADR, GOV or TRR. One of them matters for the open reviews: GOV (the rule that the reviewer is not the author).
|
||||
@@ -64,3 +70,7 @@ updated whenever an artifact instance is created or reviewed.
|
||||
[RC-012]: ./reviews/rc-012-mil-003-re-review.md
|
||||
[RC-013]: ./reviews/rc-013-mil-004-re-review.md
|
||||
[4b3391b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/018-turtle/commit/4b3391b22626b49aca06a7c265c1d0be93d1155d
|
||||
[RC-014]: ./reviews/rc-014-code-mil-001.md
|
||||
[RC-015]: ./reviews/rc-015-code-mil-002.md
|
||||
[RC-016]: ./reviews/rc-016-code-mil-003.md
|
||||
[RC-017]: ./reviews/rc-017-code-mil-004.md
|
||||
|
||||
Reference in New Issue
Block a user