Compare commits
44
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d607b4fa2 | ||
|
|
be2e171f38 | ||
|
|
5902c2bc6a | ||
|
|
3cb5b24e14 | ||
|
|
bad9a8026d | ||
|
|
f5a0434a98 | ||
|
|
5b948e5a66 | ||
|
|
e44b9f7341 | ||
|
|
e7e5c68ce0 | ||
|
|
fa5bb84025 | ||
|
|
60af1e00ef | ||
|
|
5cb6665e4a | ||
|
|
c88434c583 | ||
|
|
a9df555dd3 | ||
|
|
ed9897b4c1 | ||
|
|
78a0d02bf3 | ||
|
|
12d4beef7a | ||
|
|
da7efc1120 | ||
|
|
e406d65f6a | ||
|
|
51e546e9f5 | ||
|
|
16811c53fa | ||
|
|
7c2604108c | ||
|
|
9b063bf58f | ||
|
|
fbf73fc6d7 | ||
|
|
0bbf4c22d4 | ||
|
|
10d8a6de3d | ||
|
|
40c3387ea7 | ||
|
|
89683f9c75 | ||
|
|
64511c9fef | ||
|
|
dfaa8400c3 | ||
|
|
8f73cd8cba | ||
|
|
329cc1484c | ||
|
|
7202aac595 | ||
|
|
6fb75ddb86 | ||
|
|
b52a739649 | ||
|
|
d3d2d03cd5 | ||
|
|
d85cfe5c4b | ||
|
|
1b217785c6 | ||
|
|
d2f36bfde3 | ||
|
|
c4e88c6da6 | ||
|
|
632fa61b89 | ||
|
|
d825bef0f1 | ||
|
|
9e41ae87b9 | ||
|
|
57e12637f0 |
+53
-46
@@ -1,46 +1,53 @@
|
||||
# Continuous integration for the squirrel census project: runs the pytest tests
|
||||
# on Python 3.13 for every push and pull request. Read by Gitea Actions (a
|
||||
# runner must be registered for the repository). It changes nothing outside the
|
||||
# repository and uses no secret. Decision: MIL-001 task "Add CI workflow".
|
||||
# Host: Gitea Actions; uses only github.* contexts, so it also runs on GitHub.
|
||||
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
PYTHON_VERSION: "3.13"
|
||||
PIP_VERSION: "26.2.1"
|
||||
|
||||
concurrency:
|
||||
group: tests-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
pytest:
|
||||
name: Run the tests
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- name: Check out the code
|
||||
uses: actions/checkout@v4.2.2
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5.6.0
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
|
||||
- name: Create the virtual environment and install
|
||||
run: |
|
||||
python -m venv .venv
|
||||
.venv/bin/python -m pip install --upgrade "pip==${PIP_VERSION}"
|
||||
.venv/bin/python -m pip install -e ".[dev]"
|
||||
|
||||
- name: Run the tests
|
||||
run: .venv/bin/python -m pytest
|
||||
# Continuous integration for the squirrel census project: lints the YAML and
|
||||
# workflow files and runs the pytest tests on Python 3.13 for every push and
|
||||
# pull request. Read by Gitea Actions (a runner must be registered for the
|
||||
# repository). It changes nothing outside the repository and uses no secret.
|
||||
# Decision: MIL-001 task "Add CI workflow".
|
||||
# Host: Gitea Actions; uses only github.* contexts, so it also runs on GitHub.
|
||||
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main]
|
||||
pull_request:
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
env:
|
||||
PYTHON_VERSION: "3.13"
|
||||
PIP_VERSION: "26.2.1"
|
||||
|
||||
concurrency:
|
||||
group: tests-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
pytest:
|
||||
name: Run the tests
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 10
|
||||
steps:
|
||||
- name: Check out the code
|
||||
uses: actions/checkout@v4.2.2
|
||||
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v5.6.0
|
||||
with:
|
||||
python-version: ${{ env.PYTHON_VERSION }}
|
||||
|
||||
- name: Create the virtual environment and install
|
||||
run: |
|
||||
python -m venv .venv
|
||||
.venv/bin/python -m pip install --upgrade "pip==${PIP_VERSION}"
|
||||
.venv/bin/python -m pip install -e ".[dev]"
|
||||
|
||||
- name: Lint the YAML files
|
||||
run: .venv/bin/python -m yamllint -c .yamllint.yml .gitea .yamllint.yml
|
||||
|
||||
- name: Lint the workflow files
|
||||
run: .venv/bin/actionlint .gitea/workflows/*.yml
|
||||
|
||||
- name: Run the tests
|
||||
run: .venv/bin/python -m pytest
|
||||
|
||||
@@ -6,3 +6,6 @@ rules:
|
||||
max: 100
|
||||
truthy:
|
||||
check-keys: false
|
||||
# Line endings are normalised by git (LF in the repository, CRLF in some
|
||||
# Windows checkouts), so the rule would fail on a local checkout only.
|
||||
new-lines: disable
|
||||
|
||||
@@ -1,141 +1,143 @@
|
||||
# Squirrel Census
|
||||
|
||||
Day 25 of Udemy's *100 Days of Code: The Complete Python Pro Bootcamp*: count the
|
||||
squirrels of the 2018 Central Park Squirrel Census by primary fur colour (gray,
|
||||
cinnamon, black) and export the counts to `squirrel_count.csv`. Python 3.13 or
|
||||
later, no runtime dependencies, with tests and source documentation.
|
||||
|
||||
![Program run][img-run]
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.13 or later (`python --version` on Windows, `python3 --version` on Linux and macOS).
|
||||
- `venv`, which ships with Python (on Debian: the `python3-venv` package).
|
||||
- The 2018 census file. It is already in the repository under `data/`.
|
||||
- Optional: [Doxygen][doxygen] 1.9 or later, only to build the source documentation.
|
||||
|
||||
There are no runtime dependencies: the program uses only the Python standard library
|
||||
([ADR-0001][adr-0001]). `pytest` is needed only to run the tests.
|
||||
|
||||
## Set up
|
||||
|
||||
Create a local virtual environment named `.venv` in the project folder, upgrade `pip`
|
||||
and install the project with its development tools (pytest, ruff, mypy).
|
||||
|
||||
### Windows powershell
|
||||
|
||||
```powershell
|
||||
python -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
If PowerShell refuses to run the activation script, allow it for the current session:
|
||||
`Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned`.
|
||||
|
||||
### Linux debian
|
||||
|
||||
```bash
|
||||
sudo apt install python3 python3-venv
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
### MacOS
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
On macOS, Python 3.13 can be installed with `brew install python@3.13`.
|
||||
|
||||
## Run
|
||||
|
||||
With the virtual environment active, run from the project folder:
|
||||
|
||||
```bash
|
||||
python -m squirrel
|
||||
```
|
||||
|
||||
The program reads `data/2018_Central_Park_Squirrel_Census_-_Squirrel_Data.csv`, prints
|
||||
the colour counts and writes `squirrel_count.csv`:
|
||||
|
||||
```text
|
||||
Gray: 2473
|
||||
Cinnamon: 392
|
||||
Black: 103
|
||||
```
|
||||
|
||||
Use other files by passing them as arguments, `python -m squirrel <census file> <summary file>`.
|
||||
If the census file does not exist the program prints a message and exits with status 2.
|
||||
|
||||
## Run the tests
|
||||
|
||||
```bash
|
||||
python -m pytest
|
||||
```
|
||||
|
||||
![Test run][img-tests]
|
||||
|
||||
The tests use small fixture rows; one test also checks the real 2018 census file when
|
||||
it is present.
|
||||
|
||||
## Continuous integration
|
||||
|
||||
The workflow [`.gitea/workflows/ci.yml`][ci] runs for every push to `main` and for every
|
||||
pull request. It sets up Python 3.13, creates a `.venv`, upgrades `pip`, installs the
|
||||
project with `.[dev]` and runs `python -m pytest`. It uses `github.*` contexts only, so
|
||||
it also runs on GitHub Actions.
|
||||
|
||||
## Build the source documentation
|
||||
|
||||
The source is documented with Doxygen comments and configured by [`Doxyfile`][doxyfile].
|
||||
|
||||
```bash
|
||||
doxygen Doxyfile
|
||||
```
|
||||
|
||||
Open `docs/doxygen/html/index.html` in a browser. The output folder is ignored by git.
|
||||
|
||||
## Project layout
|
||||
|
||||
```text
|
||||
.gitea/workflows/ci.yml continuous integration workflow
|
||||
data/ the 2018 census file
|
||||
docs/ business case, plan, milestones, models, reviews, ADRs
|
||||
docs/images/ screenshots used by this README and the wiki
|
||||
src/squirrel/ the package: census.py, cli.py, constants.py
|
||||
tests/ pytest tests
|
||||
Doxyfile Doxygen configuration
|
||||
pyproject.toml project configuration (Python >=3.13, no runtime dependencies)
|
||||
squirrel_count.csv the result of the assignment
|
||||
```
|
||||
|
||||
The project documents, in reading order: [Business Case][bc], [Stakeholder
|
||||
Analysis][sa], [Project Plan][pp], [Use Case][uc], [Domain Model][dm], [ADR-0001][adr-0001].
|
||||
The repository also has a wiki in English, Danish and Bahasa Malaysia.
|
||||
|
||||
## License
|
||||
|
||||
GNU Affero General Public License v3.0 or later. See [LICENSE][license].
|
||||
|
||||
---
|
||||
|
||||
[img-run]: docs/images/run.png
|
||||
[img-tests]: docs/images/tests.png
|
||||
[doxygen]: https://www.doxygen.nl/
|
||||
[adr-0001]: docs/adr/adr-0001-standard-library-instead-of-pandas.md
|
||||
[ci]: .gitea/workflows/ci.yml
|
||||
[doxyfile]: Doxyfile
|
||||
[bc]: docs/business-case.md
|
||||
[sa]: docs/stakeholder-analysis.md
|
||||
[pp]: docs/project-plan.md
|
||||
[uc]: docs/uc-001/uc.md
|
||||
[dm]: docs/domain-model.md
|
||||
[license]: LICENSE
|
||||
# Squirrel Census
|
||||
|
||||
Day 25 of Udemy's *100 Days of Code: The Complete Python Pro Bootcamp*: count the
|
||||
squirrels of the 2018 Central Park Squirrel Census by primary fur colour (gray,
|
||||
cinnamon, black) and export the counts to `squirrel_count.csv`. Python 3.13 or
|
||||
later, no runtime dependencies, with tests and source documentation.
|
||||
|
||||
![Program run][img-run]
|
||||
|
||||
## Requirements
|
||||
|
||||
- Python 3.13 or later (`python --version` on Windows, `python3 --version` on Linux and macOS).
|
||||
- `venv`, which ships with Python (on Debian: the `python3-venv` package).
|
||||
- The 2018 census file. It is already in the repository under `data/`.
|
||||
- Optional: [Doxygen][doxygen] 1.9 or later, only to build the source documentation.
|
||||
|
||||
There are no runtime dependencies: the program uses only the Python standard library
|
||||
([ADR-0001][adr-0001]). `pytest` is needed only to run the tests.
|
||||
|
||||
## Set up
|
||||
|
||||
Create a local virtual environment named `.venv` in the project folder, upgrade `pip`
|
||||
and install the project with its development tools (pytest, ruff, mypy, yamllint, actionlint).
|
||||
|
||||
### Windows powershell
|
||||
|
||||
```powershell
|
||||
python -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
If PowerShell refuses to run the activation script, allow it for the current session:
|
||||
`Set-ExecutionPolicy -Scope Process -ExecutionPolicy RemoteSigned`.
|
||||
|
||||
### Linux debian
|
||||
|
||||
```bash
|
||||
sudo apt install python3 python3-venv
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
### MacOS
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
On macOS, Python 3.13 can be installed with `brew install python@3.13`.
|
||||
|
||||
## Run
|
||||
|
||||
With the virtual environment active, run from the project folder:
|
||||
|
||||
```bash
|
||||
python -m squirrel
|
||||
```
|
||||
|
||||
The program reads `data/2018_Central_Park_Squirrel_Census_-_Squirrel_Data.csv`, prints
|
||||
the colour counts and writes `squirrel_count.csv`:
|
||||
|
||||
```text
|
||||
Gray: 2473
|
||||
Cinnamon: 392
|
||||
Black: 103
|
||||
```
|
||||
|
||||
Use other files by passing them as arguments, `python -m squirrel <census file> <summary file>`.
|
||||
If the census file does not exist the program prints a message and exits with status 2.
|
||||
|
||||
## Run the tests
|
||||
|
||||
```bash
|
||||
python -m pytest
|
||||
```
|
||||
|
||||
![Test run][img-tests]
|
||||
|
||||
The tests use small fixture rows; one test also checks the real 2018 census file when
|
||||
it is present.
|
||||
|
||||
## Continuous integration
|
||||
|
||||
The workflow [`.gitea/workflows/ci.yml`][ci] runs for every push to `main` and for every
|
||||
pull request. It sets up Python 3.13, creates a `.venv`, upgrades `pip`, installs the
|
||||
project with `.[dev]`, lints the YAML and workflow files with `yamllint` and
|
||||
`actionlint`, and runs `python -m pytest`. It uses `github.*` contexts only, so
|
||||
it also runs on GitHub Actions.
|
||||
|
||||
## Build the source documentation
|
||||
|
||||
The source is documented with Doxygen comments and configured by [`Doxyfile`][doxyfile].
|
||||
|
||||
```bash
|
||||
doxygen Doxyfile
|
||||
```
|
||||
|
||||
Open `docs/doxygen/html/index.html` in a browser. The output folder is ignored by git.
|
||||
|
||||
## Project layout
|
||||
|
||||
```text
|
||||
.gitea/workflows/ci.yml continuous integration workflow
|
||||
data/ the 2018 census file
|
||||
docs/ business case, plan, milestones, models, reviews, ADRs
|
||||
docs/images/ screenshots used by this README and the wiki
|
||||
src/squirrel/ the package: census.py, cli.py, constants.py
|
||||
tests/ pytest tests
|
||||
wiki/ wiki pages in English, Danish (.da) and Bahasa Malaysia (.ms)
|
||||
Doxyfile Doxygen configuration
|
||||
pyproject.toml project configuration (Python >=3.13, no runtime dependencies)
|
||||
squirrel_count.csv the result of the assignment
|
||||
```
|
||||
|
||||
The project documents, in reading order: [Business Case][bc], [Stakeholder
|
||||
Analysis][sa], [Project Plan][pp], [Use Case][uc], [Domain Model][dm], [ADR-0001][adr-0001].
|
||||
The repository also has a wiki in English, Danish and Bahasa Malaysia.
|
||||
|
||||
## License
|
||||
|
||||
GNU Affero General Public License v3.0 or later. See [LICENSE][license].
|
||||
|
||||
---
|
||||
|
||||
[img-run]: docs/images/run.png
|
||||
[img-tests]: docs/images/tests.png
|
||||
[doxygen]: https://www.doxygen.nl/
|
||||
[adr-0001]: docs/adr/adr-0001-standard-library-instead-of-pandas.md
|
||||
[ci]: .gitea/workflows/ci.yml
|
||||
[doxyfile]: Doxyfile
|
||||
[bc]: docs/business-case.md
|
||||
[sa]: docs/stakeholder-analysis.md
|
||||
[pp]: docs/project-plan.md
|
||||
[uc]: docs/uc-001/uc.md
|
||||
[dm]: docs/domain-model.md
|
||||
[license]: LICENSE
|
||||
|
||||
@@ -16,7 +16,7 @@ document of a type. `Primary File` may contain a glob (e.g.
|
||||
| PP | Project Plan | docs/project-plan.md | 002 |
|
||||
| MIL | Milestone / Gateway | docs/milestones/*.md | 005 |
|
||||
| ADR | Architecture Decision Record | docs/adr/adr-NNNN-*.md | 0002 |
|
||||
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 025 |
|
||||
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 037 |
|
||||
| DICT | Domain Dictionary | docs/dictionary.md | 002 |
|
||||
| TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 |
|
||||
| UCD | Use Case Diagram | docs/use-case-diagram.md | 002 |
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [UCD-001] | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [UCD-001] | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Corrected the wiki folder `docs/wiki/` to `wiki/` | [d85cfe5] |
|
||||
---
|
||||
|
||||
## Executive Summary
|
||||
@@ -91,7 +91,7 @@ The project supports the participant's goal of finishing the 100 Days of Code bo
|
||||
| The lecture uses Pandas but the repository must have no runtime dependencies | The solution differs from the lecture code | Use the standard library `csv` module; record the decision in an architecture decision record (ADR) and keep the lecture's step names as function names |
|
||||
| The census file is large and not part of the repository | Others cannot run the program | Keep the census file under `data/` and let the program accept a path argument |
|
||||
| Tokens in `.env` leak into the repository | Credential exposure | `.env` is git-ignored, never read by the project and never printed |
|
||||
| Wiki push is not available on the host | Wiki pages are not published | Keep the pages in the repository under `docs/wiki/` and report the failure |
|
||||
| Wiki push is not available on the host | Wiki pages are not published | Keep the pages in the repository under `wiki/` and report the failure |
|
||||
| Fur colour spelling differs in the data | Wrong counts | Count exact values `Gray`, `Cinnamon`, `Black` and test with fixture rows |
|
||||
|
||||
## Assumptions
|
||||
@@ -133,6 +133,6 @@ Proceed — the scope is small, the risks are mitigated and the result is direct
|
||||
|
||||
---
|
||||
|
||||
[f1b3c03]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/f1b3c034dc3880b7884646b4a4ed28e5f98fbcd3
|
||||
[UCD-001]: ./use-case-diagram.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[d85cfe5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/d85cfe5c4b62b2e1759f1c47b25bdb787ba6fd68
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [DM-002] | [259d017] |
|
||||
---
|
||||
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-001 |
|
||||
| CrossReference | [BC-001], [US-001] |
|
||||
| CrossReference | [BC-001], [US-001], [SA-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [US-001] | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added task 8: lint steps in CI (recorded after the work) | [78a0d02] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added the missing link definition and CrossReference for [SA-001] | [fa5bb84] |
|
||||
---
|
||||
|
||||
## Purpose
|
||||
@@ -67,10 +67,13 @@ A branch merged to `main` containing `.gitignore`, `pyproject.toml`, `src/squirr
|
||||
| 4 | Add Doxyfile | Create a `Doxyfile` that reads `src/` and writes to `docs/doxygen/`, with Python optimisation enabled, so the source documentation can be built with `doxygen Doxyfile`. | No | |
|
||||
| 5 | Add CI workflow | Add a Gitea Actions workflow that sets up Python 3.13, creates a venv, upgrades pip, installs the dev extra and runs pytest on push and pull request. It backs the "Continuous integration" section of the README. | No | |
|
||||
| 6 | Set repository description and topics | Use the Gitea API with the token from `.env` (read by the shell only, never by the project) to set a description and topics such as `python`, `csv`, `squirrel-census`, `udemy`, `100-days-of-code`, `pytest`. Satisfies stakeholder S03. | No | |
|
||||
| 7 | Add static workflow test | Add `tests/test_workflow.py`, run by pytest on every pull request, that parses `.gitea/workflows/ci.yml` with a safe YAML loader and checks the required keys, explicit permissions, runner and timeout, named steps, exact-tag action pins and the five-line limit on `run:` blocks. Closes criterion 24 (optional) of the workflow review RC-010. | No | RC-010 |
|
||||
| 8 | Run yamllint and actionlint in CI | Add two steps to `.gitea/workflows/ci.yml` that run `yamllint` on `.gitea` and `.yamllint.yml` and `actionlint` on the workflow files, after the dev extra is installed, so a malformed workflow fails the pull request. Done in pull request 39 at the request of S01 and recorded here afterwards; reviewed in RC-031 and RC-032. | No | RC-031, RC-032 |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[f1b3c03]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/f1b3c034dc3880b7884646b4a4ed28e5f98fbcd3
|
||||
[US-001]: ../user-stories.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[78a0d02]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/78a0d02bf373b92163f45d93449dd1009b62e568
|
||||
[SA-001]: ../stakeholder-analysis.md
|
||||
[fa5bb84]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/fa5bb84025ca0fa1957434d34b0b678280a3abe5
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-003 |
|
||||
| CrossReference | [BC-001], [US-001] |
|
||||
| CrossReference | [BC-001], [US-001], [SA-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [US-001] | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [US-001] | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added the missing link definition and CrossReference for [SA-001] | [fa5bb84] |
|
||||
---
|
||||
|
||||
## Purpose
|
||||
@@ -69,6 +69,7 @@ A branch merged to `main` containing `README.md` with the requested sections, Do
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[f1b3c03]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/f1b3c034dc3880b7884646b4a4ed28e5f98fbcd3
|
||||
[US-001]: ../user-stories.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[SA-001]: ../stakeholder-analysis.md
|
||||
[fa5bb84]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/fa5bb84025ca0fa1957434d34b0b678280a3abe5
|
||||
|
||||
@@ -4,15 +4,15 @@
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | MIL-004 |
|
||||
| CrossReference | [BC-001], [US-001] |
|
||||
| CrossReference | [BC-001], [US-001], [SA-001] |
|
||||
| Language | en |
|
||||
| Domain | it |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [US-001] | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Corrected the wiki folder `docs/wiki/` to `wiki/` | [d85cfe5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Added the missing link definition and CrossReference for [SA-001] | [fa5bb84] |
|
||||
---
|
||||
|
||||
## Purpose
|
||||
@@ -29,7 +29,7 @@ Wiki pages `Home`, `Install`, `Usage` and `Description` in English plus `-da` an
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Each wiki page exists in English, Danish (`-da`) and Bahasa Malaysia (`-ms`) | All present | Any missing |
|
||||
| 2 | The sidebar links every page in all three languages | All linked | Missing link |
|
||||
| 3 | Wiki pages are on the git host wiki, or kept under `docs/wiki/` with the failure reported | Published or reported | Neither |
|
||||
| 3 | Wiki pages are on the git host wiki, or kept under `wiki/` with the failure reported | Published or reported | Neither |
|
||||
| 4 | Screenshots appear on the wiki pages | Present | Missing |
|
||||
|
||||
## Dependencies
|
||||
@@ -69,6 +69,7 @@ Wiki pages `Home`, `Install`, `Usage` and `Description` in English plus `-da` an
|
||||
---
|
||||
|
||||
[BC-001]: ../business-case.md
|
||||
[f1b3c03]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/f1b3c034dc3880b7884646b4a4ed28e5f98fbcd3
|
||||
[US-001]: ../user-stories.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[d85cfe5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/d85cfe5c4b62b2e1759f1c47b25bdb787ba6fd68
|
||||
[SA-001]: ../stakeholder-analysis.md
|
||||
[fa5bb84]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/fa5bb84025ca0fa1957434d34b0b678280a3abe5
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [US-001] | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | CrossReference: added [US-001] | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Corrected the wiki folder `docs/wiki/` to `wiki/` | [d85cfe5] |
|
||||
---
|
||||
|
||||
## Purpose
|
||||
@@ -75,7 +75,7 @@ A No-Go at a gateway stops the later gateways; their dates move by the days the
|
||||
| Risk | Impact | Mitigation |
|
||||
| --- | --- | --- |
|
||||
| CI runner is not available on the git host | The CI workflow cannot be shown green | Run the same commands locally and report the missing runner |
|
||||
| Wiki repository cannot be pushed | G4 deliverable is not published | Keep the pages under `docs/wiki/` and report it |
|
||||
| Wiki repository cannot be pushed | G4 deliverable is not published | Keep the pages under `wiki/` and report it |
|
||||
| Doxygen is not installed locally | The documentation build cannot be verified | Report as not verified; document the command |
|
||||
|
||||
## Open Issues
|
||||
@@ -92,10 +92,10 @@ A No-Go at a gateway stops the later gateways; their dates move by the days the
|
||||
[MIL-002]: ./milestones/mil-002-census-analysis.md
|
||||
[MIL-003]: ./milestones/mil-003-documentation.md
|
||||
[MIL-004]: ./milestones/mil-004-wiki-publication.md
|
||||
[f1b3c03]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/f1b3c034dc3880b7884646b4a4ed28e5f98fbcd3
|
||||
[MS-124]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/milestone/124
|
||||
[MS-125]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/milestone/125
|
||||
[MS-126]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/milestone/126
|
||||
[MS-127]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/milestone/127
|
||||
[US-001]: ./user-stories.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[d85cfe5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/d85cfe5c4b62b2e1759f1c47b25bdb787ba6fd68
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Action item closed: criteria 3 and 4 re-reviewed in RC-018 (Go) | [40c3387] |
|
||||
|
||||
---
|
||||
|
||||
@@ -65,3 +66,4 @@ Go-with-conditions — criteria 3 and 4 cannot be checked until DM-001 and the d
|
||||
[QC-DICT-001]: ../../../framework/qc/artifacts/qc-dictionary.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[f1b3c03]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/f1b3c034dc3880b7884646b4a4ed28e5f98fbcd3
|
||||
[40c3387]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/40c3387ea7a4b601e8d20a5a7b6eba20c3d5323d
|
||||
|
||||
@@ -1,69 +1,72 @@
|
||||
# RC Review of ci.yml against the workflow checklist
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-010 |
|
||||
| CrossReference | [WF-MIL-001], [QC-WF-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [d71b586] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [WF-MIL-001]
|
||||
- Checklist used: [QC-WF-001]
|
||||
- Scope: full review
|
||||
- Language and domain: n/a
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The file meets the YAML checklist ([QC-YML-001]) (Mandatory) | Pass | See RC-009: YAML checklist passes. |
|
||||
| 2 | The file is in `.gitea/workflows/` or `.github/workflows/` with the extension `.yml` or `.yaml`, and the same workflow does not exist in both directories (Mandatory) | Pass | File is in `.gitea/workflows/` only; no `.github/workflows/` copy. |
|
||||
| 3 | The file declares `name`, `on` and `jobs`; `on` lists explicit events and, where it matters, `branches` or `paths` (Mandatory) | Pass | `name`, `on` (push to main, pull_request) and `jobs` are declared. |
|
||||
| 4 | A header comment states the purpose, the triggers, the inputs, the secrets it needs, what it changes outside the repository, and the decision or milestone it implements (Mandatory) | Pass | Header comment states purpose, triggers, secrets (none), outside effects (none) and decision. |
|
||||
| 5 | Every job and step has a descriptive `name`, unique within its job (Mandatory) | Pass | Every job and step has a unique descriptive `name`. |
|
||||
| 6 | The file passes `actionlint` (or the project's workflow validation test) and the tool version is stated (Mandatory) | Pass | `actionlint 1.7.12` reports no findings. |
|
||||
| 7 | Every job declares `permissions` explicitly with the least access that works (`contents: read` or none by default); write access only on the job that needs it (Mandatory) | Pass | Workflow-level `permissions: contents: read`. |
|
||||
| 8 | Every action used is pinned to a full commit SHA or an exact release tag, never to a branch; a moving major tag (`@v1`) is accepted only for an action published by the same organisation under a stated release policy (Mandatory) | Pass | `actions/checkout@v4.2.2` and `actions/setup-python@v5.6.0` are exact release tags. |
|
||||
| 9 | No secret is written in the file; a secret is read as `secrets.NAME`, passed to a step through `env:`, never placed on a command line or echoed (Mandatory) | Pass | No secret is used. |
|
||||
| 10 | Untrusted text (`inputs.*`, event fields such as a title, branch name or label, step outputs derived from them) is never interpolated into a `run:` script; it is passed through `env:` and used as a quoted variable (Mandatory) | Pass | No event field or input reaches a `run:` script; `PIP_VERSION` is a workflow `env` value used as a quoted shell variable. |
|
||||
| 11 | A trigger that gives a run secrets or a write token on code from a fork or an untrusted branch (`pull_request_target`, `workflow_run`) does not check out or execute that code (Mandatory) | Pass | Trigger is `pull_request`, not `pull_request_target`. |
|
||||
| 12 | A workflow that changes state outside the repository (release, tag, publish, sync, deploy) is started by hand or by a protected branch, and a manual run defaults to a dry run with an explicit input to apply (Mandatory) | Pass | The workflow changes nothing outside the repository. |
|
||||
| 13 | The token the workflow uses has only the scope the job needs, and where the host's built-in token is enough it is used instead of a personal token (Optional) | Pass | No token is used. |
|
||||
| 14 | Every job sets `runs-on` to an explicit label and `timeout-minutes` (Mandatory) | Pass | `runs-on: ubuntu-latest` and `timeout-minutes: 10`. |
|
||||
| 15 | `concurrency` is set where two runs would conflict: a check cancels the older run (`cancel-in-progress: true`); a publishing job queues (`cancel-in-progress: false`) (Mandatory) | Pass | Concurrency group per ref with `cancel-in-progress: true`. |
|
||||
| 16 | Triggers are filtered (`branches`, `paths`, `types`) so the workflow runs only for the changes it concerns (Mandatory) | Pass | Push filtered to `main`; pull requests run for all branches. |
|
||||
| 17 | Tools and dependencies are installed at pinned versions; a version is a workflow input with a default or a value in one place (Mandatory) | Pass | Python version and pip version are workflow `env` values; tool versions are exact in `pyproject.toml`. |
|
||||
| 18 | A dependency cache is used where the install is slow enough to matter (Optional) | N-A | Install takes seconds; a cache would add complexity without benefit. |
|
||||
| 19 | A failing step names the tool, the file and the reason in its log (annotation or `::error::` line) (Optional) | Pass | pytest names the failing file, test and reason in the log and exits non-zero. |
|
||||
| 20 | A `run:` block is within the limit on embedded program text of criterion 7 of [QC-YML-001]; a longer script is a file (`tools/`, or a shared repository fetched at a pinned ref) that the step calls with one command, and the workflow passes its settings through `env:` (Mandatory) | Pass | Longest `run:` block is 3 lines. |
|
||||
| 21 | Logic used by more than one workflow or repository is a reusable workflow (`workflow_call`) or a composite action; each input has a `description`, a `type` and a `default` where one is sensible (Mandatory) | N-A | Single workflow; nothing is shared. |
|
||||
| 22 | Every workflow feature used is verified on the instance that runs it, and the host and version are recorded; a feature the target hosts differ on is noted in the header (Mandatory) | Fail | Gitea 1.27.3 and runner labels (`ubuntu-latest`) are known, but the run of this workflow stayed `queued` for over 15 minutes on the only runner (busy), so the features are not yet verified on the instance. |
|
||||
| 23 | A reusable workflow states, in its header, how a caller pins it and the script it fetches, so the workflow and its script are the same release (Optional) | N-A | Not a reusable workflow. |
|
||||
| 24 | A static test of the repository's workflows exists and runs on every pull request: valid YAML, required keys, explicit permissions and runner, no inline script above the limit (Optional) | Fail | No static workflow test exists; actionlint and yamllint were run by hand. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go-with-conditions — all Mandatory criteria pass except 22: the workflow has not yet run on the instance. The commands it runs were executed locally (pytest 6 passed, ruff, mypy --strict).
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| Re-check criterion 22 when run 1012 or the next run on main completes; record the result in a delta re-review | S01 | 2026-10-16 |
|
||||
| Decide whether to add a static workflow test (criterion 24, optional) | S01 | 2026-10-16 |
|
||||
|
||||
---
|
||||
|
||||
[WF-MIL-001]: ../../../.gitea/workflows/ci.yml
|
||||
[QC-WF-001]: ../../../framework/qc/code/qc-workflow.md
|
||||
[d71b586]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/d71b5863eba3dc29c5a5e09e4ffa087c67565fae
|
||||
# RC Review of ci.yml against the workflow checklist
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-010 |
|
||||
| CrossReference | [WF-MIL-001], [QC-WF-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Action items closed: criterion 22 by RC-025 (Go), criterion 24 by RC-030 (Go) | [40c3387] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [WF-MIL-001]
|
||||
- Checklist used: [QC-WF-001]
|
||||
- Scope: full review
|
||||
- Language and domain: n/a
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | The file meets the YAML checklist ([QC-YML-001]) (Mandatory) | Pass | See RC-009: YAML checklist passes. |
|
||||
| 2 | The file is in `.gitea/workflows/` or `.github/workflows/` with the extension `.yml` or `.yaml`, and the same workflow does not exist in both directories (Mandatory) | Pass | File is in `.gitea/workflows/` only; no `.github/workflows/` copy. |
|
||||
| 3 | The file declares `name`, `on` and `jobs`; `on` lists explicit events and, where it matters, `branches` or `paths` (Mandatory) | Pass | `name`, `on` (push to main, pull_request) and `jobs` are declared. |
|
||||
| 4 | A header comment states the purpose, the triggers, the inputs, the secrets it needs, what it changes outside the repository, and the decision or milestone it implements (Mandatory) | Pass | Header comment states purpose, triggers, secrets (none), outside effects (none) and decision. |
|
||||
| 5 | Every job and step has a descriptive `name`, unique within its job (Mandatory) | Pass | Every job and step has a unique descriptive `name`. |
|
||||
| 6 | The file passes `actionlint` (or the project's workflow validation test) and the tool version is stated (Mandatory) | Pass | `actionlint 1.7.12` reports no findings. |
|
||||
| 7 | Every job declares `permissions` explicitly with the least access that works (`contents: read` or none by default); write access only on the job that needs it (Mandatory) | Pass | Workflow-level `permissions: contents: read`. |
|
||||
| 8 | Every action used is pinned to a full commit SHA or an exact release tag, never to a branch; a moving major tag (`@v1`) is accepted only for an action published by the same organisation under a stated release policy (Mandatory) | Pass | `actions/checkout@v4.2.2` and `actions/setup-python@v5.6.0` are exact release tags. |
|
||||
| 9 | No secret is written in the file; a secret is read as `secrets.NAME`, passed to a step through `env:`, never placed on a command line or echoed (Mandatory) | Pass | No secret is used. |
|
||||
| 10 | Untrusted text (`inputs.*`, event fields such as a title, branch name or label, step outputs derived from them) is never interpolated into a `run:` script; it is passed through `env:` and used as a quoted variable (Mandatory) | Pass | No event field or input reaches a `run:` script; `PIP_VERSION` is a workflow `env` value used as a quoted shell variable. |
|
||||
| 11 | A trigger that gives a run secrets or a write token on code from a fork or an untrusted branch (`pull_request_target`, `workflow_run`) does not check out or execute that code (Mandatory) | Pass | Trigger is `pull_request`, not `pull_request_target`. |
|
||||
| 12 | A workflow that changes state outside the repository (release, tag, publish, sync, deploy) is started by hand or by a protected branch, and a manual run defaults to a dry run with an explicit input to apply (Mandatory) | Pass | The workflow changes nothing outside the repository. |
|
||||
| 13 | The token the workflow uses has only the scope the job needs, and where the host's built-in token is enough it is used instead of a personal token (Optional) | Pass | No token is used. |
|
||||
| 14 | Every job sets `runs-on` to an explicit label and `timeout-minutes` (Mandatory) | Pass | `runs-on: ubuntu-latest` and `timeout-minutes: 10`. |
|
||||
| 15 | `concurrency` is set where two runs would conflict: a check cancels the older run (`cancel-in-progress: true`); a publishing job queues (`cancel-in-progress: false`) (Mandatory) | Pass | Concurrency group per ref with `cancel-in-progress: true`. |
|
||||
| 16 | Triggers are filtered (`branches`, `paths`, `types`) so the workflow runs only for the changes it concerns (Mandatory) | Pass | Push filtered to `main`; pull requests run for all branches. |
|
||||
| 17 | Tools and dependencies are installed at pinned versions; a version is a workflow input with a default or a value in one place (Mandatory) | Pass | Python version and pip version are workflow `env` values; tool versions are exact in `pyproject.toml`. |
|
||||
| 18 | A dependency cache is used where the install is slow enough to matter (Optional) | N-A | Install takes seconds; a cache would add complexity without benefit. |
|
||||
| 19 | A failing step names the tool, the file and the reason in its log (annotation or `::error::` line) (Optional) | Pass | pytest names the failing file, test and reason in the log and exits non-zero. |
|
||||
| 20 | A `run:` block is within the limit on embedded program text of criterion 7 of [QC-YML-001]; a longer script is a file (`tools/`, or a shared repository fetched at a pinned ref) that the step calls with one command, and the workflow passes its settings through `env:` (Mandatory) | Pass | Longest `run:` block is 3 lines. |
|
||||
| 21 | Logic used by more than one workflow or repository is a reusable workflow (`workflow_call`) or a composite action; each input has a `description`, a `type` and a `default` where one is sensible (Mandatory) | N-A | Single workflow; nothing is shared. |
|
||||
| 22 | Every workflow feature used is verified on the instance that runs it, and the host and version are recorded; a feature the target hosts differ on is noted in the header (Mandatory) | Fail | Gitea 1.27.3 and runner labels (`ubuntu-latest`) are known, but the run of this workflow stayed `queued` for over 15 minutes on the only runner (busy), so the features are not yet verified on the instance. |
|
||||
| 23 | A reusable workflow states, in its header, how a caller pins it and the script it fetches, so the workflow and its script are the same release (Optional) | N-A | Not a reusable workflow. |
|
||||
| 24 | A static test of the repository's workflows exists and runs on every pull request: valid YAML, required keys, explicit permissions and runner, no inline script above the limit (Optional) | Fail | No static workflow test exists; actionlint and yamllint were run by hand. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go-with-conditions — all Mandatory criteria pass except 22: the workflow has not yet run on the instance. The commands it runs were executed locally (pytest 6 passed, ruff, mypy --strict).
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| Re-check criterion 22 when run 1012 or the next run on main completes; record the result in a delta re-review | S01 | 2026-10-16 |
|
||||
| Decide whether to add a static workflow test (criterion 24, optional) | S01 | 2026-10-16 |
|
||||
|
||||
---
|
||||
|
||||
[WF-MIL-001]: ../../../.gitea/workflows/ci.yml
|
||||
[QC-WF-001]: ../../../framework/qc/code/qc-workflow.md
|
||||
[40c3387]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/40c3387ea7a4b601e8d20a5a7b6eba20c3d5323d
|
||||
[QC-YML-001]: ../../../framework/qc/code/qc-yaml.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -67,3 +68,7 @@ Go — all Mandatory criteria pass.
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[DICT-001]: ../../dictionary.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[SA-001]: ../../stakeholder-analysis.md
|
||||
[UC-001]: ../../uc-001/uc.md
|
||||
[US-001]: ../../user-stories.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -66,3 +67,7 @@ Go — all Mandatory criteria pass.
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[DICT-001]: ../../dictionary.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[MIL-002]: ../../milestones/mil-002-census-analysis.md
|
||||
[UC-001]: ../../uc-001/uc.md
|
||||
[UCD-001]: ../../use-case-diagram.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -71,3 +72,6 @@ Go — all Mandatory criteria pass; criteria 1 and 2 apply to other formats.
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[DICT-001]: ../../dictionary.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[UCD-001]: ../../use-case-diagram.md
|
||||
[US-001]: ../../user-stories.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -66,3 +67,5 @@ Go — all Mandatory criteria pass.
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[DICT-001]: ../../dictionary.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[UC-001]: ../../uc-001/uc.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -66,3 +67,5 @@ Go — all Mandatory criteria pass.
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[DICT-001]: ../../dictionary.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[UC-001]: ../../uc-001/uc.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -66,3 +67,5 @@ Go — all Mandatory criteria pass.
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[DICT-001]: ../../dictionary.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[UC-001]: ../../uc-001/uc.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -66,3 +67,5 @@ Go — all Mandatory criteria that can apply pass; criterion 4 has no object in
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[DM-002]: ../../domain-model.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[DM-001]: ../../uc-001/dm.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -1,56 +1,59 @@
|
||||
# RC-019 Review of BC-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-019 |
|
||||
| CrossReference | [BC-001], [QC-BC-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [BC-001]
|
||||
- Checklist used: [QC-BC-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline (Mandatory) | Pass | Stakeholders table is unchanged; CrossReference now also lists [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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../../business-case.md
|
||||
[QC-BC-001]: ../../../framework/qc/artifacts/qc-business-case.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
# RC-019 Review of BC-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-019 |
|
||||
| CrossReference | [BC-001], [QC-BC-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-001 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [BC-001]
|
||||
- Checklist used: [QC-BC-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record RC-001 applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline (Mandatory) | Pass | Stakeholders table is unchanged; CrossReference now also lists [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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds. The other criteria of the checklist and of QC-LANG-001 were passed in RC-001 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../../business-case.md
|
||||
[QC-BC-001]: ../../../framework/qc/artifacts/qc-business-case.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[UCD-001]: ../../use-case-diagram.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
|
||||
@@ -1,56 +1,59 @@
|
||||
# RC-020 Review of MIL-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-020 |
|
||||
| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-001]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-scaffold.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
# RC-020 Review of MIL-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-020 |
|
||||
| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-003 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-001]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record RC-003 applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds. The other criteria of the checklist and of QC-LANG-001 were passed in RC-003 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-scaffold.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[US-001]: ../../user-stories.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
|
||||
@@ -1,56 +1,59 @@
|
||||
# RC-021 Review of MIL-002
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-021 |
|
||||
| CrossReference | [MIL-002], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-002]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-002]: ../../milestones/mil-002-census-analysis.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
# RC-021 Review of MIL-002
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-021 |
|
||||
| CrossReference | [MIL-002], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-004 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-002]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record RC-004 applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds. The other criteria of the checklist and of QC-LANG-001 were passed in RC-004 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-002]: ../../milestones/mil-002-census-analysis.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[US-001]: ../../user-stories.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
|
||||
@@ -1,56 +1,59 @@
|
||||
# RC-022 Review of MIL-003
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-022 |
|
||||
| CrossReference | [MIL-003], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-003]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-003]: ../../milestones/mil-003-documentation.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
# RC-022 Review of MIL-003
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-022 |
|
||||
| CrossReference | [MIL-003], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-005 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-003]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record RC-005 applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds. The other criteria of the checklist and of QC-LANG-001 were passed in RC-005 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-003]: ../../milestones/mil-003-documentation.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[US-001]: ../../user-stories.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
|
||||
@@ -1,56 +1,59 @@
|
||||
# RC-023 Review of MIL-004
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-023 |
|
||||
| CrossReference | [MIL-004], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-004]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-004]: ../../milestones/mil-004-wiki-publication.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
# RC-023 Review of MIL-004
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-023 |
|
||||
| CrossReference | [MIL-004], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-006 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-004]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that cites the changed row and criteria 1, 2, 6, 7, 8 of QC-LANG-001: only the CrossReference row changed (first instance of a candidate type was created); earlier record RC-006 applies to the rest
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | Traceability table is unchanged; the CrossReference row now also lists [US-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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged since the accepted version. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only Metadata (CrossReference) and the Version History changed; the earlier review of the content still holds. The other criteria of the checklist and of QC-LANG-001 were passed in RC-006 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-004]: ../../milestones/mil-004-wiki-publication.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[US-001]: ../../user-stories.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [259d017] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
@@ -59,3 +60,5 @@ Go — all Mandatory criteria pass; criterion 10 is not applicable because no cl
|
||||
[QC-PY-001]: ../../../framework/qc/code/qc-programming-python.md
|
||||
[ADR-0001]: ../../adr/adr-0001-standard-library-instead-of-pandas.md
|
||||
[259d017]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/259d017ad257059330eb9a8bdbf940c9d082664e
|
||||
[SSD-001]: ../../uc-001/ssd.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
# RC Review of ci.yml, delta re-review of criterion 22
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-025 |
|
||||
| CrossReference | [WF-MIL-001], [QC-WF-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [d2f36bf] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [WF-MIL-001]
|
||||
- Checklist used: [QC-WF-001]
|
||||
- Scope: delta re-review of criterion 22 of QC-WF-001; reason: the condition of RC-010 (run 1012 queued); earlier record RC-010
|
||||
- Language and domain: n/a
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 22 | Every workflow feature used is verified on the instance that runs it, and the host and version are recorded; a feature the target hosts differ on is noted in the header (Mandatory) | Pass | Gitea 1.27.3, runner labels ubuntu-latest. `ci.yml` completed with success on the instance: pull_request runs 1037, 1040 and 1043, and the push run 1044 on main (commit c4e88c6). Header states the host and that only github.* contexts are used. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — criterion 22, the only open Mandatory criterion of RC-010, now passes; the other rows of RC-010 still hold, so the workflow is Go. Closes the condition of RC-010.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[WF-MIL-001]: ../../../.gitea/workflows/ci.yml
|
||||
[QC-WF-001]: ../../../framework/qc/code/qc-workflow.md
|
||||
[d2f36bf]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/d2f36bfde38dd8fe06e85ba26daff98c701451a3
|
||||
@@ -0,0 +1,58 @@
|
||||
# RC-026 Review of BC-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-026 |
|
||||
| CrossReference | [BC-001], [QC-BC-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [d85cfe5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-001, RC-019 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [BC-001]
|
||||
- Checklist used: [QC-BC-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that covers the changed text and criteria 1, 2, 6, 7, 8 of QC-LANG-001: the path `docs/wiki/` was corrected to `wiki/`; earlier records RC-001, RC-019
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 2 | Risks are identified with documented impact and mitigation (Mandatory) | Pass | The changed text is a folder path in a risk mitigation or a Go criterion; it is still objectively checkable and has a mitigation. |
|
||||
|
||||
## 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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only a folder path was corrected; the earlier review of the content still holds. The other criteria of the checklist and of QC-LANG-001 were passed in RC-001, RC-019 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[BC-001]: ../../business-case.md
|
||||
[QC-BC-001]: ../../../framework/qc/artifacts/qc-business-case.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[d85cfe5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/d85cfe5c4b62b2e1759f1c47b25bdb787ba6fd68
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
@@ -0,0 +1,58 @@
|
||||
# RC-027 Review of MIL-004
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-027 |
|
||||
| CrossReference | [MIL-004], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [d85cfe5] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-006, RC-023 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-004]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of the criterion that covers the changed text and criteria 1, 2, 6, 7, 8 of QC-LANG-001: the path `docs/wiki/` was corrected to `wiki/`; earlier records RC-006, RC-023
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 2 | Explicit Go/No-Go criteria are stated for each gate (Mandatory) | Pass | The changed text is a folder path in a risk mitigation or a Go criterion; it is still objectively checkable and has a mitigation. |
|
||||
|
||||
## 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 (Mandatory) | Pass | Language and Domain rows unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only a folder path was corrected; the earlier review of the content still holds. The other criteria of the checklist and of QC-LANG-001 were passed in RC-006, RC-023 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-004]: ../../milestones/mil-004-wiki-publication.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[d85cfe5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/d85cfe5c4b62b2e1759f1c47b25bdb787ba6fd68
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
@@ -0,0 +1,59 @@
|
||||
# RC-028 Review of MIL-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-028 |
|
||||
| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [6fb75dd] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-003, RC-020 and says the other criteria still hold | [be2e171] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-001]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of criteria 1 and 2 and criteria 1, 2, 6, 7, 8 of QC-LANG-001: task 7 added to the Tasks section; earlier records RC-003, RC-020
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | A concrete deliverable is defined for every gate (Mandatory) | Pass | Deliverable unchanged; the new task adds a test file to the same CI deliverable. |
|
||||
| 2 | Explicit Go/No-Go criteria are stated for each gate (Mandatory) | Pass | Go / No-Go criteria unchanged and still objectively checkable; the new test runs under criterion 3 (pytest exits 0). |
|
||||
|
||||
## 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 (Mandatory) | Pass | Unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — one task row was added at the request of S01 in chat; the gate criteria and deliverable are unchanged. The other criteria of the checklist and of QC-LANG-001 were passed in RC-003, RC-020 and are unaffected by this change.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-scaffold.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[6fb75dd]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/6fb75ddb8671636869b859d8718d3f3f8783659c
|
||||
[be2e171]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/be2e171f38de55340bb8236fd6b61f1b651ebd64
|
||||
@@ -0,0 +1,60 @@
|
||||
# RC Review of the workflow test
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-029 |
|
||||
| CrossReference | [PY-MIL-001-7], [QC-PY-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [7202aac] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [PY-MIL-001-7]
|
||||
- Checklist used: [QC-PY-001]
|
||||
- Scope: full review of tests/test_workflow.py and the dev extra of pyproject.toml
|
||||
- Language and domain: n/a
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Packages, modules, functions, variables, classes and constants follow PEP 8 casing (`snake_case`, `PascalCase`, `UPPER_SNAKE`) (Mandatory) | Pass | Functions, constants (`MAX_RUN_LINES`) and class (`UniqueKeyLoader`) follow PEP 8 casing. |
|
||||
| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes (Mandatory) | Pass | Names state purpose (`exceeds_line_limit`, `load_workflow`). |
|
||||
| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions (Mandatory) | Pass | `ruff check` and `ruff format --check` pass with no suppressions. |
|
||||
| 4 | Every function and method signature is type-annotated, including `-> None` (Mandatory) | Pass | Every function is annotated; `mypy --strict` passes on 11 files; `Any` is justified by a comment. |
|
||||
| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) (Mandatory) | Pass | The duplicate-key loader raises `ValueError` with the key named; no bare except. |
|
||||
| 6 | No mutable default arguments and no shadowed builtins (Mandatory) | Pass | No mutable defaults; no builtins shadowed. |
|
||||
| 7 | Files, locks and connections are managed with context managers (Mandatory) | Pass | The workflow file is read through `pathlib` and the YAML loader, which close the file. |
|
||||
| 8 | Public modules, classes and functions have docstrings that say what, not how (Optional) | Pass | Helpers and tests have docstrings. |
|
||||
| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output (Mandatory) | Pass | No print and no logging; no secrets. |
|
||||
| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded (Mandatory) | N-A | Test code; no class or operation of a design class diagram. |
|
||||
| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network (Mandatory) | Pass | 14 tests, one behaviour each, plus a negative self-test of the line limit; no order or network dependence. |
|
||||
| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment (Optional) | Pass | `mypy --strict` passes; `Any` is commented. |
|
||||
| 13 | Dependencies are declared and pinned in the project's dependency file, none unused (Optional) | Pass | `pyyaml` and `types-PyYAML` are dev dependencies pinned exactly; no runtime dependency added. |
|
||||
| 14 | Each piece of knowledge (a business rule, constant, format, validation or query) is defined in one place; code is merged only where it expresses the same knowledge, not where it merely looks alike (Mandatory) | Pass | The line limit is the single constant `MAX_RUN_LINES`, matching the rule in the YAML convention. |
|
||||
| 15 | Imports point inward: business-rule modules import no framework, database, UI or delivery-mechanism code, and there are no import cycles (Mandatory) | Pass | The test imports the standard library and `yaml`; it imports no application code. |
|
||||
| 16 | SOLID holds: a class or module has one reason to change; new behaviour is added by extension, not by editing a type test in several places; subclasses honour the contract of their base; protocols are narrow; high-level code depends on protocols or abstract types and receives its implementations (Mandatory) | Pass | One module of small single-purpose helpers and tests. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — all Mandatory criteria pass; criterion 10 is not applicable.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[PY-MIL-001-7]: ../../../tests/test_workflow.py
|
||||
[QC-PY-001]: ../../../framework/qc/code/qc-programming-python.md
|
||||
[7202aac]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/7202aac5956ef92ab6a4efc6cb1917de075d771a
|
||||
@@ -0,0 +1,45 @@
|
||||
# RC Review of ci.yml, delta re-review of criterion 24
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-030 |
|
||||
| CrossReference | [WF-MIL-001], [QC-WF-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [7202aac] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [WF-MIL-001]
|
||||
- Checklist used: [QC-WF-001]
|
||||
- Scope: delta re-review of criterion 24 of QC-WF-001; reason: action item of RC-010; earlier records RC-010 and RC-025
|
||||
- Language and domain: n/a
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 24 | A static test of the repository's workflows exists and runs on every pull request: valid YAML, required keys, explicit permissions and runner, no inline script above the limit (Optional) | Pass | `tests/test_workflow.py` runs in the pytest step of `ci.yml` on every pull request: it checks safe-loader parsing, required keys, duplicate keys, explicit permissions and runner, timeout, step names, exact-tag pins and the five-line limit on `run:` blocks. 33 tests pass locally. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — criterion 24 (Optional) now passes; the other rows of RC-010 and RC-025 still hold. Closes the second action item of RC-010.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[WF-MIL-001]: ../../../.gitea/workflows/ci.yml
|
||||
[QC-WF-001]: ../../../framework/qc/code/qc-workflow.md
|
||||
[7202aac]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/7202aac5956ef92ab6a4efc6cb1917de075d771a
|
||||
@@ -0,0 +1,48 @@
|
||||
# RC Review of ci.yml, delta re-review for the lint steps (YAML)
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-031 |
|
||||
| CrossReference | [WF-MIL-001], [QC-YML-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e406d65] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [WF-MIL-001]
|
||||
- Checklist used: [QC-YML-001]
|
||||
- Scope: delta re-review of criteria 3, 7, 10 and 15 of QC-YML-001: two lint steps added to ci.yml; earlier record RC-009
|
||||
- Language and domain: n/a
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 3 | Passes `yamllint` (or the project's YAML linter) with its configuration committed next to the code and no unexplained `disable` comments (Mandatory) | Pass | `yamllint 1.38.0` with `.yamllint.yml` runs in CI on `.gitea` and `.yamllint.yml`; no errors. `new-lines` is disabled with a comment because git normalises line endings. |
|
||||
| 7 | Embedded program text (shell, Python, SQL, `jq`, and so on) in a value is at most five lines; a longer one is moved to a file of its own, in its own language, and the YAML calls it (Mandatory) | Pass | The two new `run:` blocks have one line each; the longest block is still 3 lines. |
|
||||
| 10 | The file validates against the schema of the consuming tool where one exists, and the schema or tool version is stated (Optional) | Pass | `actionlint` validates the workflow schema in CI. |
|
||||
| 15 | A change is exercised by a check that runs without the real target: a parse and schema test, or a dry run of the consuming tool (Optional) | Pass | yamllint and actionlint now run on every push and pull request without the real target. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — the changed rows pass; the other rows of RC-009 still hold.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[WF-MIL-001]: ../../../.gitea/workflows/ci.yml
|
||||
[QC-YML-001]: ../../../framework/qc/code/qc-yaml.md
|
||||
[e406d65]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/e406d65f6a53332750204ec3fd876ab2daa2bbd2
|
||||
@@ -0,0 +1,53 @@
|
||||
# RC Review of ci.yml, delta re-review for the lint steps (workflow)
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-032 |
|
||||
| CrossReference | [WF-MIL-001], [QC-WF-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e406d65] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [WF-MIL-001]
|
||||
- Checklist used: [QC-WF-001]
|
||||
- Scope: delta re-review of criteria 5, 6, 17, 20, 22 and 24 of QC-WF-001: two lint steps added; earlier records RC-010, RC-025, RC-030
|
||||
- Language and domain: n/a
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 5 | Every job and step has a descriptive `name`, unique within its job (Mandatory) | Pass | The new steps are named "Lint the YAML files" and "Lint the workflow files"; step names stay unique. |
|
||||
| 6 | The file passes `actionlint` (or the project's workflow validation test) and the tool version is stated (Mandatory) | Pass | `actionlint 1.7.12` runs in CI against `.gitea/workflows/*.yml` and passes. |
|
||||
| 17 | Tools and dependencies are installed at pinned versions; a version is a workflow input with a default or a value in one place (Mandatory) | Pass | `yamllint==1.38.0` and `actionlint-py==1.7.12.25` are exact pins in the dev extra of `pyproject.toml`. |
|
||||
| 20 | A `run:` block is within the limit on embedded program text of criterion 7 of [QC-YML-001]; a longer script is a file (`tools/`, or a shared repository fetched at a pinned ref) that the step calls with one command, and the workflow passes its settings through `env:` (Mandatory) | Pass | Each new `run:` block is one line. |
|
||||
| 22 | Every workflow feature used is verified on the instance that runs it, and the host and version are recorded; a feature the target hosts differ on is noted in the header (Mandatory) | Pass | The changed workflow completed with success on Gitea 1.27.3: run 1087 on pull request #39. |
|
||||
| 24 | A static test of the repository's workflows exists and runs on every pull request: valid YAML, required keys, explicit permissions and runner, no inline script above the limit (Optional) | Pass | `tests/test_workflow.py` still passes (33 tests) with the new steps. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — the changed rows pass; the other rows of RC-010, RC-025 and RC-030 still hold.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[WF-MIL-001]: ../../../.gitea/workflows/ci.yml
|
||||
[QC-WF-001]: ../../../framework/qc/code/qc-workflow.md
|
||||
[e406d65]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/e406d65f6a53332750204ec3fd876ab2daa2bbd2
|
||||
[QC-YML-001]: ../../../framework/qc/code/qc-yaml.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
@@ -0,0 +1,59 @@
|
||||
# RC-033 Review of MIL-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-033 |
|
||||
| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [78a0d02] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Scope names the earlier records RC-003, RC-020 and RC-028 and says the other criteria still hold | [c88434c] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-001]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of criteria 1 and 2 and criteria 1, 2, 6, 7, 8 of QC-LANG-001: task 8 added to the Tasks section; earlier records RC-003 (full review), RC-020 and RC-028 (deltas)
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | A concrete deliverable is defined for every gate (Mandatory) | Pass | Deliverable unchanged; the new task extends the CI workflow already in the deliverable. |
|
||||
| 2 | Explicit Go/No-Go criteria are stated for each gate (Mandatory) | Pass | Go / No-Go criteria unchanged and objectively checkable; the lint steps run in the same CI run as criterion 3. |
|
||||
|
||||
## 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 (Mandatory) | Pass | Unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — one task row was added at the request of S01 in chat, after the work was done and reviewed in RC-031 and RC-032; the gate criteria and deliverable are unchanged. The remaining criteria 3 to 6 of QC-MIL-001 and 3, 4, 5, 9, 10 of QC-LANG-001 were passed in RC-003 and are unaffected by a new task row.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-scaffold.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[78a0d02]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/78a0d02bf373b92163f45d93449dd1009b62e568
|
||||
[c88434c]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/c88434c58398f6b8d0aa828bf89b2b21606b39a9
|
||||
@@ -0,0 +1,59 @@
|
||||
# RC-034 Review of MIL-001
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-034 |
|
||||
| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [fa5bb84] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-001]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of criterion 4 and criteria 1, 2, 6, 7, 8 of QC-LANG-001: link definition and CrossReference for [SA-001] added; earlier records RC-003, RC-020, RC-028, RC-033
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | The Traceability table cites [SA-001]; the link definition and the CrossReference entry now exist, so the reference resolves. |
|
||||
|
||||
## 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 (Mandatory) | Pass | Unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only a missing link definition and a CrossReference entry were added; the other criteria were passed in the earlier records (RC-003, RC-020, RC-028, RC-033) and are unaffected.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-001]: ../../milestones/mil-001-project-scaffold.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[fa5bb84]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/fa5bb84025ca0fa1957434d34b0b678280a3abe5
|
||||
[SA-001]: ../../stakeholder-analysis.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
@@ -0,0 +1,59 @@
|
||||
# RC-035 Review of MIL-003
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-035 |
|
||||
| CrossReference | [MIL-003], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [fa5bb84] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-003]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of criterion 4 and criteria 1, 2, 6, 7, 8 of QC-LANG-001: link definition and CrossReference for [SA-001] added; earlier records RC-005, RC-022
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | The Traceability table cites [SA-001]; the link definition and the CrossReference entry now exist, so the reference resolves. |
|
||||
|
||||
## 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 (Mandatory) | Pass | Unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only a missing link definition and a CrossReference entry were added; the other criteria were passed in the earlier records (RC-005, RC-022) and are unaffected.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-003]: ../../milestones/mil-003-documentation.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[fa5bb84]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/fa5bb84025ca0fa1957434d34b0b678280a3abe5
|
||||
[SA-001]: ../../stakeholder-analysis.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
@@ -0,0 +1,59 @@
|
||||
# RC-036 Review of MIL-004
|
||||
|
||||
## Metadata
|
||||
| Key | Value |
|
||||
| --- | --- |
|
||||
| ID | RC-036 |
|
||||
| CrossReference | [MIL-004], [QC-MIL-001], [QC-LANG-001] |
|
||||
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [fa5bb84] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Link definitions added for the IDs cited in the text | [5b948e5] |
|
||||
|
||||
---
|
||||
|
||||
## Artifact Under Review
|
||||
|
||||
- Instance reviewed: [MIL-004]
|
||||
- Checklist used: [QC-MIL-001] and [QC-LANG-001]
|
||||
- Scope: delta re-review of criterion 4 and criteria 1, 2, 6, 7, 8 of QC-LANG-001: link definition and CrossReference for [SA-001] added; earlier records RC-006, RC-023, RC-027
|
||||
- Language and domain: en / it
|
||||
- Language reviewer: none (the stand-in reviewer reads English and the `it` domain)
|
||||
- Mode: autonomous, not independent (reviewer: AI as stand-in for S01)
|
||||
|
||||
## Checklist Results
|
||||
|
||||
| # | Criterion | Status | Evidence/Notes |
|
||||
| --- | --- | --- | --- |
|
||||
| 4 | Each milestone is traceable to a Business Case objective or KPI (Mandatory) | Pass | The Traceability table cites [SA-001]; the link definition and the CrossReference entry now exist, so the reference resolves. |
|
||||
|
||||
## 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 (Mandatory) | Pass | Unchanged. |
|
||||
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list (Mandatory) | Pass | Unchanged. |
|
||||
| 6 | Metadata keys, section headings, IDs and statuses are in English (Mandatory) | Pass | Keys, headings and statuses are English. |
|
||||
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document (Mandatory) | Pass | No translated twin. |
|
||||
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again (Mandatory) | Pass | Language unchanged. |
|
||||
|
||||
## Overall Verdict
|
||||
|
||||
Go — only a missing link definition and a CrossReference entry were added; the other criteria were passed in the earlier records (RC-006, RC-023, RC-027) and are unaffected.
|
||||
|
||||
## Action Items
|
||||
|
||||
| Action | Owner | Due |
|
||||
| --- | --- | --- |
|
||||
| None | S01 | - |
|
||||
|
||||
---
|
||||
|
||||
[MIL-004]: ../../milestones/mil-004-wiki-publication.md
|
||||
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
|
||||
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
|
||||
[fa5bb84]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/fa5bb84025ca0fa1957434d34b0b678280a3abe5
|
||||
[SA-001]: ../../stakeholder-analysis.md
|
||||
[5b948e5]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/5b948e5a66bbcea5ef062f4557f47aae113a4e07
|
||||
@@ -9,7 +9,8 @@
|
||||
## Version History
|
||||
| Date | Status | Author | Reviewer | Change | Commit |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [f1b3c03] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Last Reviewed updated up to RC-033 (RC-026 to RC-033 added)<br>Version History row added for each change batch since the first version | [c88434c] |
|
||||
| 2026-10-13 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Last Reviewed updated up to RC-036 (MIL-001, MIL-003 and MIL-004 link fix) | [fa5bb84] |
|
||||
|
||||
---
|
||||
|
||||
@@ -23,13 +24,13 @@ updated whenever an artifact instance is created or reviewed.
|
||||
|
||||
| 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], [MIL-001], [MIL-002], [MIL-003], [MIL-004] | [RC-001], [RC-019] |
|
||||
| [BC-001] | Business Case | en | it | - | [SA-001], [PP-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004] | [RC-001], [RC-019], [RC-026] |
|
||||
| [SA-001] | Stakeholder Analysis | en | it | [BC-001] | [PP-001] | [RC-002] |
|
||||
| [PP-001] | Project Plan | en | it | [BC-001], [SA-001] | [MIL-001], [MIL-002], [MIL-003], [MIL-004] | - (no checklist; accepted by S01 in chat) |
|
||||
| [MIL-001] | Milestone | en | it | [BC-001], [PP-001] | - | [RC-003], [RC-020] |
|
||||
| [MIL-001] | Milestone | en | it | [BC-001], [PP-001] | - | [RC-003], [RC-020], [RC-028], [RC-033], [RC-034] |
|
||||
| [MIL-002] | Milestone | en | it | [BC-001], [PP-001], [MIL-001] | - | [RC-004], [RC-021] |
|
||||
| [MIL-003] | Milestone | en | it | [BC-001], [PP-001], [MIL-002] | - | [RC-005], [RC-022] |
|
||||
| [MIL-004] | Milestone | en | it | [BC-001], [PP-001], [MIL-003] | - | [RC-006], [RC-023] |
|
||||
| [MIL-003] | Milestone | en | it | [BC-001], [PP-001], [MIL-002] | - | [RC-005], [RC-022], [RC-035] |
|
||||
| [MIL-004] | Milestone | en | it | [BC-001], [PP-001], [MIL-003] | - | [RC-006], [RC-023], [RC-027], [RC-036] |
|
||||
| [DICT-001] | Domain Dictionary | en | it | [BC-001], [SA-001] | - | [RC-007], [RC-018] |
|
||||
| [UCD-001] | Use Case Diagram | en | it | [SA-001], [BC-001] | [US-001], [UC-001] | [RC-011] |
|
||||
| [US-001] | User Story | en | it | [UCD-001], [BC-001], [MIL-002] | [UC-001] | [RC-012] |
|
||||
@@ -40,7 +41,8 @@ updated whenever an artifact instance is created or reviewed.
|
||||
| [ADR-0001] | Architecture Decision Record | - | - | [BC-001], [SA-001], [MIL-002] | `src/squirrel/census.py` | [RC-017] |
|
||||
| `src/squirrel/census.py`, `cli.py`, `__main__.py`, `tests/` | Python Source Code | - | - | [UC-001], [SSD-001], [ADR-0001] | - | [RC-024] |
|
||||
| `src/squirrel/constants.py`, `tests/test_constants.py` | Python Source Code | - | - | [MIL-001] | - | [RC-008] |
|
||||
| `.gitea/workflows/ci.yml` | CI Workflow | - | - | [MIL-001] | - | [RC-009], [RC-010] |
|
||||
| `tests/test_workflow.py` | Python Source Code | - | - | [MIL-001], [RC-010] | - | [RC-029] |
|
||||
| `.gitea/workflows/ci.yml` | CI Workflow | - | - | [MIL-001] | - | [RC-009], [RC-010], [RC-025], [RC-030], [RC-031], [RC-032] |
|
||||
|
||||
## Coverage Notes
|
||||
|
||||
@@ -67,7 +69,6 @@ updated whenever an artifact instance is created or reviewed.
|
||||
[RC-008]: ./reviews/rc-008-python-constants.md
|
||||
[RC-009]: ./reviews/rc-009-ci-workflow-yaml.md
|
||||
[RC-010]: ./reviews/rc-010-ci-workflow.md
|
||||
[f1b3c03]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/f1b3c034dc3880b7884646b4a4ed28e5f98fbcd3
|
||||
[UCD-001]: ../use-case-diagram.md
|
||||
[US-001]: ../user-stories.md
|
||||
[UC-001]: ../uc-001/uc.md
|
||||
@@ -89,3 +90,17 @@ updated whenever an artifact instance is created or reviewed.
|
||||
[RC-022]: ./reviews/rc-022-mil-003-delta.md
|
||||
[RC-023]: ./reviews/rc-023-mil-004-delta.md
|
||||
[RC-024]: ./reviews/rc-024-python-census.md
|
||||
[RC-025]: ./reviews/rc-025-ci-workflow-delta.md
|
||||
[RC-026]: ./reviews/rc-026-business-case-wiki-path.md
|
||||
[RC-027]: ./reviews/rc-027-mil-004-wiki-path.md
|
||||
[RC-028]: ./reviews/rc-028-mil-001-task-7.md
|
||||
[RC-029]: ./reviews/rc-029-python-workflow-test.md
|
||||
[RC-030]: ./reviews/rc-030-ci-workflow-delta-24.md
|
||||
[RC-031]: ./reviews/rc-031-ci-yaml-lint-steps.md
|
||||
[RC-032]: ./reviews/rc-032-ci-workflow-lint-steps.md
|
||||
[RC-033]: ./reviews/rc-033-mil-001-task-8.md
|
||||
[c88434c]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/c88434c58398f6b8d0aa828bf89b2b21606b39a9
|
||||
[RC-034]: ./reviews/rc-034-mil-001-sa-link.md
|
||||
[RC-035]: ./reviews/rc-035-mil-003-sa-link.md
|
||||
[RC-036]: ./reviews/rc-036-mil-004-sa-link.md
|
||||
[fa5bb84]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel/commit/fa5bb84025ca0fa1957434d34b0b678280a3abe5
|
||||
|
||||
+49
-47
@@ -1,47 +1,49 @@
|
||||
# Project configuration for the squirrel census assignment (day 25).
|
||||
# Read by pip, setuptools and pytest. The decision to use the standard library
|
||||
# only is recorded in docs/adr/adr-0001-standard-library-instead-of-pandas.md.
|
||||
|
||||
[build-system]
|
||||
requires = ["setuptools>=68"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "squirrel"
|
||||
version = "0.1.0"
|
||||
description = "Count the squirrels of the 2018 Central Park Squirrel Census by primary fur colour."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
license = "AGPL-3.0-or-later"
|
||||
license-files = ["LICENSE"]
|
||||
dependencies = []
|
||||
classifiers = [
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"Intended Audience :: Education",
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = ["pytest==9.1.1", "ruff==0.17.0", "mypy==2.4.0"]
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
pythonpath = ["src"]
|
||||
testpaths = ["tests"]
|
||||
|
||||
[tool.ruff]
|
||||
line-length = 88
|
||||
src = ["src", "tests"]
|
||||
extend-exclude = ["docs"]
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "UP", "B", "D"]
|
||||
ignore = ["D203", "D213"]
|
||||
|
||||
[tool.mypy]
|
||||
strict = true
|
||||
files = ["src", "tests"]
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
"tests/**" = ["D"]
|
||||
# Project configuration for the squirrel census assignment (day 25).
|
||||
# Read by pip, setuptools and pytest. The decision to use the standard library
|
||||
# only is recorded in docs/adr/adr-0001-standard-library-instead-of-pandas.md.
|
||||
|
||||
[build-system]
|
||||
requires = ["setuptools>=68"]
|
||||
build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "squirrel"
|
||||
version = "0.1.0"
|
||||
description = "Count the squirrels of the 2018 Central Park Squirrel Census by primary fur colour."
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
license = "AGPL-3.0-or-later"
|
||||
license-files = ["LICENSE"]
|
||||
dependencies = []
|
||||
classifiers = [
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"Intended Audience :: Education",
|
||||
]
|
||||
|
||||
[project.optional-dependencies]
|
||||
dev = ["pytest==9.1.1", "ruff==0.17.0", "mypy==2.4.0",
|
||||
"pyyaml==6.0.3", "types-PyYAML==6.0.12.20260906",
|
||||
"yamllint==1.38.0", "actionlint-py==1.7.12.25"]
|
||||
|
||||
[tool.setuptools.packages.find]
|
||||
where = ["src"]
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
pythonpath = ["src"]
|
||||
testpaths = ["tests"]
|
||||
|
||||
[tool.ruff]
|
||||
line-length = 88
|
||||
src = ["src", "tests"]
|
||||
extend-exclude = ["docs"]
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["E", "F", "I", "UP", "B", "D"]
|
||||
ignore = ["D203", "D213"]
|
||||
|
||||
[tool.mypy]
|
||||
strict = true
|
||||
files = ["src", "tests"]
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
"tests/**" = ["D"]
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
"""Static checks of the CI workflow (QC-WF-001 criterion 24, MIL-001 task 7)."""
|
||||
|
||||
import re
|
||||
from collections.abc import Hashable, Iterator
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
import pytest
|
||||
import yaml
|
||||
|
||||
ROOT = Path(__file__).parents[1]
|
||||
WORKFLOW_PATH = ROOT / ".gitea" / "workflows" / "ci.yml"
|
||||
GITHUB_WORKFLOW_PATH = ROOT / ".github" / "workflows" / "ci.yml"
|
||||
MAX_RUN_LINES = 5
|
||||
EXACT_TAG = re.compile(r"@v\d+\.\d+\.\d+$")
|
||||
FULL_SHA = re.compile(r"@[0-9a-f]{40}$")
|
||||
|
||||
# Parsed YAML is untyped data, so Any is the honest type here.
|
||||
Workflow = dict[Any, Any]
|
||||
|
||||
|
||||
class UniqueKeyLoader(yaml.SafeLoader):
|
||||
"""Safe loader that rejects a mapping with a repeated key."""
|
||||
|
||||
def construct_mapping(
|
||||
self, node: yaml.MappingNode, deep: bool = False
|
||||
) -> dict[Hashable, Any]:
|
||||
"""Build the mapping, raising ValueError on a duplicate key."""
|
||||
seen: set[Hashable] = set()
|
||||
for key_node, _ in node.value:
|
||||
key = self.construct_object(key_node, deep=deep)
|
||||
if key in seen:
|
||||
raise ValueError(f"duplicate key {key!r} at {key_node.start_mark}")
|
||||
seen.add(key)
|
||||
return super().construct_mapping(node, deep=deep)
|
||||
|
||||
|
||||
def load_workflow() -> Workflow:
|
||||
"""Parse the workflow with the safe loader."""
|
||||
loaded = yaml.safe_load(WORKFLOW_PATH.read_text(encoding="utf-8"))
|
||||
assert isinstance(loaded, dict)
|
||||
return loaded
|
||||
|
||||
|
||||
def triggers(workflow: Workflow) -> Any:
|
||||
"""Return the trigger section; YAML 1.1 reads the key `on` as True."""
|
||||
return workflow["on"] if "on" in workflow else workflow[True]
|
||||
|
||||
|
||||
def trigger_names(workflow: Workflow) -> set[str]:
|
||||
"""Return the names of the events that trigger the workflow."""
|
||||
section = triggers(workflow)
|
||||
if isinstance(section, str):
|
||||
return {section}
|
||||
return {str(name) for name in section}
|
||||
|
||||
|
||||
def jobs(workflow: Workflow) -> dict[str, Workflow]:
|
||||
"""Return the jobs by id."""
|
||||
found: dict[str, Workflow] = workflow["jobs"]
|
||||
return found
|
||||
|
||||
|
||||
def steps(job: Workflow) -> list[Workflow]:
|
||||
"""Return the steps of a job."""
|
||||
found: list[Workflow] = job.get("steps", [])
|
||||
return found
|
||||
|
||||
|
||||
def all_steps(workflow: Workflow) -> Iterator[Workflow]:
|
||||
"""Yield every step of every job."""
|
||||
for job in jobs(workflow).values():
|
||||
yield from steps(job)
|
||||
|
||||
|
||||
def exceeds_line_limit(script: str, limit: int = MAX_RUN_LINES) -> bool:
|
||||
"""Tell whether a script has more lines than the limit, as written.
|
||||
|
||||
Blank lines and comments count.
|
||||
"""
|
||||
return len(script.splitlines()) > limit
|
||||
|
||||
|
||||
def test_workflow_parses_with_required_keys() -> None:
|
||||
"""The file is valid YAML with a name, a trigger and jobs."""
|
||||
workflow = load_workflow()
|
||||
assert "name" in workflow
|
||||
assert "on" in workflow or True in workflow
|
||||
assert "jobs" in workflow
|
||||
|
||||
|
||||
def test_workflow_has_no_duplicate_keys() -> None:
|
||||
"""No mapping in the file repeats a key."""
|
||||
text = WORKFLOW_PATH.read_text(encoding="utf-8")
|
||||
assert yaml.load(text, Loader=UniqueKeyLoader) is not None
|
||||
|
||||
|
||||
def test_duplicate_key_loader_rejects_repeated_key() -> None:
|
||||
"""The duplicate-key loader bites on a repeated key."""
|
||||
with pytest.raises(ValueError, match="duplicate key"):
|
||||
yaml.load("a: 1\na: 2\n", Loader=UniqueKeyLoader)
|
||||
|
||||
|
||||
def test_permissions_are_declared() -> None:
|
||||
"""Permissions are set at workflow level or on every job."""
|
||||
workflow = load_workflow()
|
||||
if "permissions" in workflow:
|
||||
return
|
||||
assert all("permissions" in job for job in jobs(workflow).values())
|
||||
|
||||
|
||||
def test_every_job_has_runner_and_timeout() -> None:
|
||||
"""Each job names its runner and a timeout."""
|
||||
for job_id, job in jobs(load_workflow()).items():
|
||||
assert "runs-on" in job, job_id
|
||||
assert "timeout-minutes" in job, job_id
|
||||
|
||||
|
||||
def test_every_step_has_a_name() -> None:
|
||||
"""Each step carries a name."""
|
||||
for job_id, job in jobs(load_workflow()).items():
|
||||
for step in steps(job):
|
||||
assert "name" in step, f"{job_id}: {step}"
|
||||
|
||||
|
||||
def test_step_names_are_unique_within_a_job() -> None:
|
||||
"""No two steps of one job share a name."""
|
||||
for job_id, job in jobs(load_workflow()).items():
|
||||
names = [step["name"] for step in steps(job) if "name" in step]
|
||||
assert len(names) == len(set(names)), job_id
|
||||
|
||||
|
||||
def test_uses_are_pinned_to_exact_release_or_sha() -> None:
|
||||
"""Each action is pinned to an exact tag or a full commit SHA."""
|
||||
for step in all_steps(load_workflow()):
|
||||
if "uses" in step:
|
||||
ref = str(step["uses"])
|
||||
assert EXACT_TAG.search(ref) or FULL_SHA.search(ref), ref
|
||||
|
||||
|
||||
def test_run_blocks_stay_within_line_limit() -> None:
|
||||
"""No inline script is longer than the limit."""
|
||||
for step in all_steps(load_workflow()):
|
||||
if "run" in step:
|
||||
assert not exceeds_line_limit(str(step["run"])), step.get("name")
|
||||
|
||||
|
||||
def test_line_limit_check_rejects_six_lines() -> None:
|
||||
"""The line-limit helper counts lines as written, blank lines included."""
|
||||
assert exceeds_line_limit("a\nb\nc\nd\ne\nf\n")
|
||||
assert exceeds_line_limit("a\nb\nc\nd\ne\n\n")
|
||||
assert not exceeds_line_limit("a\nb\n\nc\nd\n")
|
||||
|
||||
|
||||
def test_workflow_uses_no_secrets() -> None:
|
||||
"""The file refers to no secret."""
|
||||
assert "secrets." not in WORKFLOW_PATH.read_text(encoding="utf-8")
|
||||
|
||||
|
||||
def test_workflow_is_not_triggered_by_pull_request_target() -> None:
|
||||
"""The privileged pull_request_target trigger is not used."""
|
||||
assert "pull_request_target" not in trigger_names(load_workflow())
|
||||
|
||||
|
||||
def test_workflow_is_not_duplicated_for_github() -> None:
|
||||
"""The same workflow does not also live under .github/workflows."""
|
||||
assert not GITHUB_WORKFLOW_PATH.exists()
|
||||
@@ -0,0 +1,32 @@
|
||||
🌐 [English](Description) · **Dansk** · [Bahasa Melayu](Description.ms)
|
||||
|
||||
# Beskrivelse
|
||||
|
||||
## Hvad programmet gør
|
||||
|
||||
Programmet følger lektionens trin:
|
||||
|
||||
1. `read_csv` læser optællingsfilen.
|
||||
2. `count_by_fur_color` tæller observationerne af Gray, Cinnamon og Black.
|
||||
3. `build_summary` gør tallene til rækkerne i en opsummering.
|
||||
4. `write_csv` skriver opsummeringen til `squirrel_count.csv`.
|
||||
|
||||
På optællingsfilen fra 2018 er resultatet Gray 2473, Cinnamon 392 og Black 103. Observationer uden pelsfarve tælles ikke med i nogen af dem.
|
||||
|
||||
## Hvorfor ikke Pandas
|
||||
|
||||
Lektionen bruger Pandas. Dette projekt bruger kun Pythons standardbibliotek (`csv` og `collections.Counter`), så der ikke er noget at installere for at køre det. Beslutningen er beskrevet som ADR-0001 i repositoryet.
|
||||
|
||||
## Opbygning
|
||||
|
||||
| Sti | Indhold |
|
||||
| --- | --- |
|
||||
| `src/squirrel/census.py` | De fire trin ovenfor |
|
||||
| `src/squirrel/cli.py` | Kommandolinjen, `python -m squirrel` |
|
||||
| `src/squirrel/constants.py` | Alle konstanter, defineret ét sted |
|
||||
| `tests/` | pytest-testene |
|
||||
| `docs/` | Business case, plan, modeller, reviewposter |
|
||||
|
||||
## Kvalitet
|
||||
|
||||
Alle dokumenter og al kode er gennemgået mod tjeklisterne i SQA- og QC-frameworket i autonom tilstand: reviewer er en AI-stedfortræder, så reviewene er ikke uafhængige.
|
||||
@@ -0,0 +1,32 @@
|
||||
🌐 **English** · [Dansk](Description.da) · [Bahasa Melayu](Description.ms)
|
||||
|
||||
# Description
|
||||
|
||||
## What it does
|
||||
|
||||
The program follows the steps of the lecture:
|
||||
|
||||
1. `read_csv` reads the census file.
|
||||
2. `count_by_fur_color` counts the sightings of Gray, Cinnamon and Black.
|
||||
3. `build_summary` turns the counts into the rows of a summary.
|
||||
4. `write_csv` writes the summary to `squirrel_count.csv`.
|
||||
|
||||
On the 2018 census file the result is Gray 2473, Cinnamon 392 and Black 103. Sightings without a fur colour are counted in none of them.
|
||||
|
||||
## Why no Pandas
|
||||
|
||||
The lecture uses Pandas. This project uses only the Python standard library (`csv` and `collections.Counter`) so that there is nothing to install to run it. The decision is recorded as ADR-0001 in the repository.
|
||||
|
||||
## Layout
|
||||
|
||||
| Path | Content |
|
||||
| --- | --- |
|
||||
| `src/squirrel/census.py` | The four steps above |
|
||||
| `src/squirrel/cli.py` | The command line, `python -m squirrel` |
|
||||
| `src/squirrel/constants.py` | Every literal, defined once |
|
||||
| `tests/` | The pytest tests |
|
||||
| `docs/` | Business case, plan, models, review records |
|
||||
|
||||
## Quality
|
||||
|
||||
Every document and every piece of code was reviewed against the checklists of the SQA and QC framework, in autonomous mode: the reviewer is an AI stand-in, so the reviews are not independent.
|
||||
@@ -0,0 +1,32 @@
|
||||
🌐 [English](Description) · [Dansk](Description.da) · **Bahasa Melayu**
|
||||
|
||||
# Penerangan
|
||||
|
||||
## Apa yang dilakukan program
|
||||
|
||||
Program mengikut langkah dalam pelajaran:
|
||||
|
||||
1. `read_csv` membaca fail banci.
|
||||
2. `count_by_fur_color` mengira pemerhatian Gray, Cinnamon dan Black.
|
||||
3. `build_summary` menukar kiraan kepada baris ringkasan.
|
||||
4. `write_csv` menulis ringkasan ke `squirrel_count.csv`.
|
||||
|
||||
Pada fail banci 2018 hasilnya ialah Gray 2473, Cinnamon 392 dan Black 103. Pemerhatian tanpa warna bulu tidak dikira dalam mana-mana satu.
|
||||
|
||||
## Mengapa tidak menggunakan Pandas
|
||||
|
||||
Pelajaran menggunakan Pandas. Projek ini hanya menggunakan pustaka standard Python (`csv` dan `collections.Counter`) supaya tiada apa-apa untuk dipasang bagi menjalankannya. Keputusan itu direkodkan sebagai ADR-0001 dalam repositori.
|
||||
|
||||
## Susun atur
|
||||
|
||||
| Laluan | Kandungan |
|
||||
| --- | --- |
|
||||
| `src/squirrel/census.py` | Empat langkah di atas |
|
||||
| `src/squirrel/cli.py` | Baris perintah, `python -m squirrel` |
|
||||
| `src/squirrel/constants.py` | Semua pemalar, ditakrif sekali |
|
||||
| `tests/` | Ujian pytest |
|
||||
| `docs/` | Kes perniagaan, pelan, model, rekod semakan |
|
||||
|
||||
## Kualiti
|
||||
|
||||
Setiap dokumen dan kod disemak berdasarkan senarai semak rangka kerja SQA dan QC dalam mod autonomi: penyemak ialah pengganti AI, jadi semakan itu tidak bebas.
|
||||
@@ -0,0 +1,15 @@
|
||||
🌐 [English](Home) · **Dansk** · [Bahasa Melayu](Home.ms)
|
||||
|
||||
# Egern-optælling
|
||||
|
||||
Dag 25 i Udemys *100 Days of Code: The Complete Python Pro Bootcamp*: tæl egernene i Central Parks egern-optælling fra 2018 efter primær pelsfarve (grå, kanel, sort) og eksportér tallene til `squirrel_count.csv`.
|
||||
|
||||

|
||||
|
||||
| Side | Læs den, når du vil |
|
||||
| --- | --- |
|
||||
| [Installation](Install.da) | Oprette et `.venv` og installere projektet på Windows PowerShell, Linux Debian eller macOS |
|
||||
| [Brug](Usage.da) | Køre programmet og testene |
|
||||
| [Beskrivelse](Description.da) | Forstå hvordan koden er bygget, og hvorfor den ikke har kørselsafhængigheder |
|
||||
|
||||
Koden, testene og projektdokumenterne ligger i [repositoryet](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel).
|
||||
@@ -0,0 +1,15 @@
|
||||
🌐 **English** · [Dansk](Home.da) · [Bahasa Melayu](Home.ms)
|
||||
|
||||
# Squirrel Census
|
||||
|
||||
Day 25 of Udemy's *100 Days of Code: The Complete Python Pro Bootcamp*: count the squirrels of the 2018 Central Park Squirrel Census by primary fur colour (gray, cinnamon, black) and export the counts to `squirrel_count.csv`.
|
||||
|
||||

|
||||
|
||||
| Page | Read it when you want to |
|
||||
| --- | --- |
|
||||
| [Install](Install) | Create a `.venv` and install the project on Windows PowerShell, Linux Debian or macOS |
|
||||
| [Usage](Usage) | Run the program and the tests |
|
||||
| [Description](Description) | Understand how the code is built and why it has no runtime dependencies |
|
||||
|
||||
The code, the tests and the project documents are in the [repository](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel).
|
||||
@@ -0,0 +1,15 @@
|
||||
🌐 [English](Home) · [Dansk](Home.da) · **Bahasa Melayu**
|
||||
|
||||
# Banci Tupai
|
||||
|
||||
Hari ke-25 dalam *100 Days of Code: The Complete Python Pro Bootcamp* Udemy: kira tupai dalam Banci Tupai Central Park 2018 mengikut warna bulu utama (kelabu, kayu manis, hitam) dan eksport kiraan ke `squirrel_count.csv`.
|
||||
|
||||

|
||||
|
||||
| Halaman | Baca apabila anda mahu |
|
||||
| --- | --- |
|
||||
| [Pemasangan](Install.ms) | Mencipta `.venv` dan memasang projek di Windows PowerShell, Linux Debian atau macOS |
|
||||
| [Penggunaan](Usage.ms) | Menjalankan program dan ujian |
|
||||
| [Penerangan](Description.ms) | Memahami cara kod dibina dan sebab ia tiada kebergantungan masa jalan |
|
||||
|
||||
Kod, ujian dan dokumen projek berada dalam [repositori](https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/025-squirrel).
|
||||
@@ -0,0 +1,35 @@
|
||||
🌐 [English](Install) · **Dansk** · [Bahasa Melayu](Install.ms)
|
||||
|
||||
# Installation
|
||||
|
||||
Projektet kræver **Python 3.13 eller nyere**. Det har ingen kørselsafhængigheder; `pytest`, `ruff`, `mypy`, `yamllint` og `actionlint` er udviklingsværktøjer.
|
||||
|
||||
## Windows PowerShell
|
||||
|
||||
```powershell
|
||||
python -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
## Linux Debian
|
||||
|
||||
```bash
|
||||
sudo apt install python3 python3-venv
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
## macOS
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
Næste: [Brug](Usage.da).
|
||||
@@ -0,0 +1,35 @@
|
||||
🌐 **English** · [Dansk](Install.da) · [Bahasa Melayu](Install.ms)
|
||||
|
||||
# Install
|
||||
|
||||
The project needs **Python 3.13 or later**. It has no runtime dependencies; `pytest`, `ruff`, `mypy`, `yamllint` and `actionlint` are development tools.
|
||||
|
||||
## Windows PowerShell
|
||||
|
||||
```powershell
|
||||
python -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
## Linux Debian
|
||||
|
||||
```bash
|
||||
sudo apt install python3 python3-venv
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
## macOS
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
Next: [Usage](Usage).
|
||||
@@ -0,0 +1,35 @@
|
||||
🌐 [English](Install) · [Dansk](Install.da) · **Bahasa Melayu**
|
||||
|
||||
# Pemasangan
|
||||
|
||||
Projek ini memerlukan **Python 3.13 atau lebih baharu**. Ia tiada kebergantungan masa jalan; `pytest`, `ruff`, `mypy`, `yamllint` dan `actionlint` ialah alat pembangunan.
|
||||
|
||||
## Windows PowerShell
|
||||
|
||||
```powershell
|
||||
python -m venv .venv
|
||||
.\.venv\Scripts\Activate.ps1
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
## Linux Debian
|
||||
|
||||
```bash
|
||||
sudo apt install python3 python3-venv
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
## macOS
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
source .venv/bin/activate
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install -e ".[dev]"
|
||||
```
|
||||
|
||||
Seterusnya: [Penggunaan](Usage.ms).
|
||||
@@ -0,0 +1,33 @@
|
||||
🌐 [English](Usage) · **Dansk** · [Bahasa Melayu](Usage.ms)
|
||||
|
||||
# Brug
|
||||
|
||||
## Kør programmet
|
||||
|
||||
Med det virtuelle miljø aktivt, fra projektmappen:
|
||||
|
||||
```bash
|
||||
python -m squirrel
|
||||
```
|
||||
|
||||
Programmet læser `data/2018_Central_Park_Squirrel_Census_-_Squirrel_Data.csv`, skriver tallene for hver pelsfarve og gemmer `squirrel_count.csv`.
|
||||
|
||||

|
||||
|
||||
Brug andre filer med `python -m squirrel <optællingsfil> <opsummeringsfil>`. Findes optællingsfilen ikke, skriver programmet `Census file not found` og afslutter med status 2.
|
||||
|
||||
## Kør testene
|
||||
|
||||
```bash
|
||||
python -m pytest
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Byg kildedokumentationen
|
||||
|
||||
```bash
|
||||
doxygen Doxyfile
|
||||
```
|
||||
|
||||
Åbn `docs/doxygen/html/index.html`.
|
||||
@@ -0,0 +1,33 @@
|
||||
🌐 **English** · [Dansk](Usage.da) · [Bahasa Melayu](Usage.ms)
|
||||
|
||||
# Usage
|
||||
|
||||
## Run the program
|
||||
|
||||
With the virtual environment active, from the project folder:
|
||||
|
||||
```bash
|
||||
python -m squirrel
|
||||
```
|
||||
|
||||
The program reads `data/2018_Central_Park_Squirrel_Census_-_Squirrel_Data.csv`, prints the colour counts and writes `squirrel_count.csv`.
|
||||
|
||||

|
||||
|
||||
Use other files with `python -m squirrel <census file> <summary file>`. If the census file does not exist, the program prints `Census file not found` and exits with status 2.
|
||||
|
||||
## Run the tests
|
||||
|
||||
```bash
|
||||
python -m pytest
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Build the source documentation
|
||||
|
||||
```bash
|
||||
doxygen Doxyfile
|
||||
```
|
||||
|
||||
Open `docs/doxygen/html/index.html`.
|
||||
@@ -0,0 +1,33 @@
|
||||
🌐 [English](Usage) · [Dansk](Usage.da) · **Bahasa Melayu**
|
||||
|
||||
# Penggunaan
|
||||
|
||||
## Jalankan program
|
||||
|
||||
Dengan persekitaran maya aktif, dari folder projek:
|
||||
|
||||
```bash
|
||||
python -m squirrel
|
||||
```
|
||||
|
||||
Program membaca `data/2018_Central_Park_Squirrel_Census_-_Squirrel_Data.csv`, mencetak kiraan setiap warna bulu dan menulis `squirrel_count.csv`.
|
||||
|
||||

|
||||
|
||||
Gunakan fail lain dengan `python -m squirrel <fail banci> <fail ringkasan>`. Jika fail banci tidak wujud, program mencetak `Census file not found` dan keluar dengan status 2.
|
||||
|
||||
## Jalankan ujian
|
||||
|
||||
```bash
|
||||
python -m pytest
|
||||
```
|
||||
|
||||

|
||||
|
||||
## Bina dokumentasi sumber
|
||||
|
||||
```bash
|
||||
doxygen Doxyfile
|
||||
```
|
||||
|
||||
Buka `docs/doxygen/html/index.html`.
|
||||
@@ -0,0 +1,24 @@
|
||||
<!-- Generated from wiki; edit the source pages, not the published wiki. -->
|
||||
|
||||
**Squirrel Census**
|
||||
|
||||
**English**
|
||||
|
||||
- [Home](Home)
|
||||
- [Install](Install)
|
||||
- [Usage](Usage)
|
||||
- [Description](Description)
|
||||
|
||||
**Dansk**
|
||||
|
||||
- [Hjem](Home.da)
|
||||
- [Installation](Install.da)
|
||||
- [Brug](Usage.da)
|
||||
- [Beskrivelse](Description.da)
|
||||
|
||||
**Bahasa Melayu**
|
||||
|
||||
- [Utama](Home.ms)
|
||||
- [Pemasangan](Install.ms)
|
||||
- [Penggunaan](Usage.ms)
|
||||
- [Penerangan](Description.ms)
|
||||
Reference in New Issue
Block a user