MIL-001: project baseline and repository #19

Merged
Tirsvad merged 2 commits from mil-001-project-baseline into main 2026-11-06 06:30:57 +01:00
21 changed files with 1411 additions and 1 deletions

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
# Personal tokens: never commit
.env
.env.*
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
# Virtual environments
.venv/
venv/
env/
# Packaging and build
build/
dist/
*.egg-info/
.eggs/
# Test and tool caches
.pytest_cache/
.mypy_cache/
.ruff_cache/
.coverage
htmlcov/
# Doxygen output
docs/doxygen/
# IDE and OS
.idea/
.vscode/
.DS_Store
Thumbs.db
+3
View File
@@ -0,0 +1,3 @@
[submodule "framework"]
path = framework
url = ssh://git@git.tirsystem.com:10022/TirSystem/SQA-QC-Framework.git
+15
View File
@@ -0,0 +1,15 @@
# Doxygen configuration. Everything not listed here keeps the Doxygen default.
# Generate the HTML documentation with: doxygen Doxyfile
PROJECT_NAME = "Speed Calc Decorator"
PROJECT_BRIEF = "Decorator that measures how long a function takes to run"
OUTPUT_DIRECTORY = docs/doxygen
INPUT = src
FILE_PATTERNS = *.py
RECURSIVE = YES
EXTRACT_ALL = YES
OPTIMIZE_OUTPUT_JAVA = YES
MARKDOWN_SUPPORT = YES
GENERATE_HTML = YES
GENERATE_LATEX = NO
QUIET = YES
WARN_IF_UNDOCUMENTED = YES
+133 -1
View File
@@ -1,2 +1,134 @@
# 054-speed-calc-decorator
# ⏱️ Speed Calc Decorator
A Python decorator that measures how many seconds a function takes to run. It is
my solution to a lecture exercise from Udemy's *100 Days of Code: The Complete
Python Pro Bootcamp*, written for fellow course participants and for anyone
browsing for ideas. It has no runtime dependencies.
## 📚 Table of Contents
- [Overview](#-overview)
- [Requirements](#-requirements)
- [Setup](#-setup)
- [Run](#-run)
- [Tests](#-tests)
- [Documentation](#-documentation)
- [License](#-license)
- [Links](#-links)
- [Appendix: Project documents](#-appendix-project-documents)
## 🧭 Overview
The assignment: write `speed_calc_decorator` and use it to print how long
`fast_function` and `slow_function` take. Expected output has this shape:
```text
1695050908.1985211
fast_function run speed: 0.33974480628967285s
slow_function run speed: 2.9590742588043213s
```
The numbers differ on every machine. The repository is laid out as:
| Folder | Purpose |
| --- | --- |
| `src/speed_calc/` | The package: the decorator, the two demo functions, `constants.py` |
| `tests/` | pytest tests; they use a fake clock, so they never depend on real time |
| `docs/` | Project documents (Business Case, plan, milestones), screenshots and the wiki |
## 📋 Requirements
- Python 3.13 or newer (`python --version`).
- `git`, to clone the repository.
- Optional: [Doxygen](https://www.doxygen.nl/) to build the API documentation.
There are no runtime dependencies. `pytest` is needed only to run the tests.
## 🛠️ Setup
Create a local virtual environment named `.venv` in the project folder and
activate it. Windows (PowerShell):
```powershell
python -m venv .venv
.venv\Scripts\Activate.ps1
```
Linux and macOS:
```bash
python3 -m venv .venv
source .venv/bin/activate
```
Upgrade pip, then install the project with the test tools:
```bash
python -m pip install --upgrade pip
python -m pip install -e ".[dev]"
```
Leave the environment with `deactivate`. Delete the `.venv` folder to start over.
The `.venv` folder is ignored by git.
## ▶️ Run
With the environment active:
```bash
python -m speed_calc
```
## 🧪 Tests
```bash
python -m pytest
```
## 📖 Documentation
The source uses Doxygen comments. Build the HTML documentation into
`docs/doxygen/`:
```bash
doxygen Doxyfile
```
## 📄 License
GNU Affero General Public License v3.0, see [LICENSE](./LICENSE).
## 🔗 Links
- [Repository][repository]
- [Wiki][documentation]
- [Issue tracker][issues]
## 📎 Appendix: Project documents
| Document | What it tells you |
| --- | --- |
| [AGENTS.md][agents] | The rules AI agents follow in this repository |
| [Business Case][BC-001] | Why the project exists, its scope and success criteria |
| [Stakeholder Analysis][SA-001] | Who is involved; the stakeholder IDs used for owners and reviewers |
| [Project Plan][PP-001] | The gateways and their schedule |
| [Milestones][milestones] | One document per gateway: Go/No-Go criteria and tasks |
| [Artifact registry][registry] | Where each artifact type lives, the next version, the PO language and domain |
| [Traceability matrix][TM-001] | How the artifacts link and when each was last reviewed |
| [Framework README][framework-readme] | The framework this project uses |
| [Framework changelog][framework-changelog] | What changed in each framework release |
---
[repository]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator
[documentation]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/wiki
[issues]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/issues
[agents]: ./AGENTS.md
[BC-001]: ./docs/business-case.md
[SA-001]: ./docs/stakeholder-analysis.md
[PP-001]: ./docs/project-plan.md
[milestones]: ./docs/milestones/
[registry]: ./docs/artifact-registry.md
[TM-001]: ./docs/sqa/traceability-matrix.md
[framework-readme]: ./framework/README.md
[framework-changelog]: ./framework/CHANGELOG.md
@@ -0,0 +1,68 @@
# Skip user stories and use cases; plain package layout
## Metadata
| Key | Value |
| --- | --- |
| ID | ADR-0001 |
| CrossReference | [BC-001], [PP-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [a07d05b] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Review RC-006 fixed 2 defects (stakeholder IDs S01 to S03 now explained; shared rationale for the two decisions stated in Context); accepted as stand-in for S01 in autonomous mode, not independent | [a07d05b] |
Allowed Status values: `Proposed`, `Accepted`, `Rejected`, `Deprecated`, `Superseded by ADR-NNNN`.
---
## Context
The project solves one course exercise: a decorator that prints how long a
function takes. Two decisions shape the plan and the code; both follow from one force: the
documentation and structure should stay in proportion to a one-function exercise.
1. **User stories and use cases.** The framework asks for candidate stories and
use cases before milestones. The exercise has one actor (S01, the author and Product Owner)
running one command, with no input and no state. Options: (a) write a story and use case
for "run the timing demo"; (b) skip them and plan plain technical tasks.
2. **Code layout.** The `clean-architecture` skill describes layers (domain,
application, infrastructure, presentation). Options: (a) the full layers;
(b) one small package, `src/speed_calc/`, with a module per concern.
Forces: the target is a prototype to finish by 2026-11-09; stakeholders S02 (Udemy
coursists) and S03 (GitHub viewers) want readable code with the assignment's function names and no runtime
dependencies; layers would hide the three functions the course asks for.
## Decision
Skip user stories and use cases, and plan every task as a plain technical task
(`Needs its own Use Case/User Story?` is `No`). Use one flat package
`src/speed_calc/` with `constants.py`, the decorator, the two demo functions and
a `__main__` entry point; apply the dependency rule by keeping the decorator
free of any import from the demo or entry modules.
## Consequences
**Positive:**
- Less documentation than the code it describes; readers (S02, S03) find the
three assignment functions at once.
- No runtime dependencies and nothing to configure.
**Negative:**
- The layout does not scale to a larger program; a later lecture project with
real use cases needs its own decision.
- No story-level traceability; traceability stops at the milestone task.
## Affected Artifacts
- [BC-001] — scope stays as written; no story-level scope items exist.
- [PP-001] — the Stories column says "none" and points here.
---
[BC-001]: ../business-case.md
[PP-001]: ../project-plan.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
+61
View File
@@ -0,0 +1,61 @@
# Artifact Registry
This project's artifact state. Types, short names and `CrossReference
Candidates` come from the framework catalog
(`framework/registry/artifact-catalog.md`); this file only records where
each document lives in *this* project and the next version to use.
Delete rows for types you don't use. Add a row the first time you create a
document of a type. `Primary File` may contain a glob (e.g.
`docs/use-cases/uc-*/uc.md`); `framework/scripts/find-crossreferences.sh` reads it.
| Short Name | Artifact Type | Primary File | Next Available Version |
| --- | --- | --- | --- |
| BC | Business Case | docs/business-case.md | 002 |
| SA | Stakeholder Analysis | docs/stakeholder-analysis.md | 002 |
| PP | Project Plan | docs/project-plan.md | 002 |
| MIL | Milestone / Gateway | docs/milestones/mil-*.md | 004 |
| TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 |
| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 007 |
| ADR | Architecture Decision Record | docs/adr/adr-*.md | 0002 |
## Languages
Set the PO language when the project starts; `project-planning` asks for it
if it is missing. An artifact of a type marked "Written in the PO language"
exists once, in that language, under its normal name (`business-case.md`); the
`artifact` skill ("One file per artifact") has the rule.
| Setting | Value |
| --- | --- |
| PO language | en |
| PO domain | it |
| High-level register | IT Executive English |
| Technical register | IT Professional English |
| Wiki languages | en, da, ms (`framework/process/wiki.md`) |
Every artifact of a type marked "Yes" below states its language and domain in
its `Language` and `Domain` Metadata rows; `new-artifact.sh` fills them from
`PO language` and `PO domain`. `Language` is a BCP 47 code (`da`, `en`).
`Domain` is a value from this list; add a row to introduce a domain, so a
reviewer can see at once which professional vocabulary a document uses.
| Domain | Meaning |
| --- | --- |
| it | Software and IT |
| medical | Healthcare and medical devices |
| construction | Construction and civil engineering |
| Artifact types | Register | Written in the PO language |
| --- | --- | --- |
| BC, KPI, PP, MIL | IT Executive English | Yes |
| SA, BMC, BPMN, UCD, US, UC, SSD, DM, RA, GOV, DICT | IT Professional English | Yes |
| OC, SD, DCD, ERD, TP, AD, ADR, TM, RC, QC, source code | IT Professional English | No |
## Notes
- "Next Available Version" is the zero-padded (3-digit) version to use the
*next* time a new document of that type is created. Increment it only when
a brand-new document is created, not when an existing document's
`## Version History` gets a row.
- `ADR` uses 4 digits (`0001`); `RC` is sequential across all artifact types.
+159
View File
@@ -0,0 +1,159 @@
# Business Case
## Metadata
| Key | Value |
| --- | --- |
| ID | BC-001 |
| CrossReference | [SA-001] |
| Language | en |
| Domain | it |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | S01 | Review findings fixed: constraint wording, abbreviations spelled out (RC-001) | [a07d05b] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Go per RC-001; language checks confirmed by S01 | [a07d05b] |
---
## Executive Summary
Lecture 054 of Udemy's "100 Days of Code: The Complete Python Pro Bootcamp"
asks the participant to write a decorator, `speed_calc_decorator`, that prints
how many seconds a function takes to run, and to apply it to `fast_function`
and `slow_function`. This project turns that exercise into a small, tested,
documented repository that other course participants can read and run, and that
GitHub visitors can browse. It is a prototype: one Python package, a test suite,
a README and a three-language wiki that explains what each lecture step taught.
## Methodological and Standards Foundation
The documents follow the SQA and QC framework mounted at `framework/`
(Business Case, Stakeholder Analysis, Project Plan, milestones, then code).
Quality criteria are tagged with ISO/IEC 25010:2023 characteristics. Source
code follows the `coding-conventions` skill (Python) and is documented with
Doxygen comments.
## Problem Statement
- The assignment gives only a stub (`def speed_calc_decorator(): pass`) and an
expected output; there is no shared, runnable, tested solution layout.
- Participants who compare solutions find loose scripts without setup
instructions, tests or an explanation of the decorator concepts involved.
- The author has no record of what each lecture step taught.
## Business Opportunity
A clean solution repository lets participants run the exercise in two commands,
lets visitors reuse the layout (`src/`, `tests/`, `docs/`) for other lectures of
the course, and gives the author a written record of the learning.
## Objectives
1. Deliver `speed_calc_decorator`, `fast_function` and `slow_function` with the
assignment's names, printing output in the shape of the expected output.
2. Cover the behaviour with pytest tests that do not depend on real elapsed time.
3. Document how to create and use a local `.venv` and run the project and tests.
4. Provide a README and a wiki in English, Danish and Bahasa Malaysia that
explain what each lecture step gained, with one screenshot per step.
5. Publish a repository description and topics on the git host.
## Scope
### In Scope
- Python package under `src/`, tests under `tests/`, documents under `docs/`.
- `pyproject.toml`, Python `.gitignore`, `constants.py`, a `Doxyfile`.
- README from the framework template, with venv and test instructions.
- Wiki pages (en, da, ms) and one screenshot per lecture step.
- Repository description and topics on the git host.
### Out of Scope
- Other lectures of the course.
- Runtime dependencies, packaging to the Python Package Index (PyPI), a graphical user interface (GUI).
- Reading or importing the `.env` file in the project (personal use only).
## Expected Benefits
### Tangible Benefits
- A runnable solution: `python -m speed_calc` prints the expected output shape.
- A passing test suite and a documented setup.
- README and wiki in three languages with screenshots.
### Intangible Benefits
- Understanding of decorators, closures, `functools.wraps` and `time.time()`.
- A reusable layout for later lectures.
## Strategic Alignment
The project supports the author's goal of completing the 100 Days of Code course
with a documented portfolio on the author's git host, and supports the sharing
of solutions among course participants.
## Success Criteria
| # | Criterion | Target | Measure |
| --- | --- | --- | --- |
| 1 | Tests pass | 100 % of tests green | `python -m pytest` exits 0 |
| 2 | Program output | 3 lines in the shape of the assignment's expected output | `python -m speed_calc` run captured in the lecture-step screenshots |
| 3 | Runtime dependencies | 0 | `pyproject.toml` has an empty `dependencies` list |
| 4 | Wiki languages | 3 languages, same page set | file listing of `docs/wiki/` |
| 5 | Screenshots | 1 per lecture step in README and wiki | image files in `docs/screenshots/` |
| 6 | Repository metadata | Description and at least 5 topics set | git host application programming interface (API) response |
## Risks
| Risk | Impact | Mitigation |
| --- | --- | --- |
| Timing tests are flaky on slow machines | Red continuous integration (CI) runs, false failures | Tests inject a fake clock and never assert real durations |
| Token in `.env` leaks | Account compromise | `.env` is git-ignored, never read by project code, never printed |
| Repository URL in the request differs from the configured `origin` | Metadata set on the wrong repository | Use the `origin` repository; the difference is recorded in Open Issues of [PP-001] |
| Translations contain mistakes | Misleading wiki text | Keep wording simple, English is authoritative, review by S01 |
| Screenshot capture on the host desktop disturbs the user | Interrupted work | Screenshots are rendered from captured program output, never from the desktop |
## Assumptions
- Python 3.13 or newer is installed on the author's machine.
- The git host accepts the token in `.env` for repository settings and pull requests.
- The wiki is enabled in the repository settings.
- The Product Owner is S01; S01 is the reviewer. The people for whom the work is
intended (S02, S03) are not contacted for this prototype.
## Constraints
- Python 3.13 or newer, venv, pytest, `pyproject.toml`.
- No runtime dependencies.
- `constants.py` holds the constants.
- Folder structure `src/`, `tests/`, `docs/`.
- One pull request (branch) per milestone.
- Target: finished by 2026-11-09.
## Cost–Benefit Assessment
| Costs | Benefits |
| --- | --- |
| About one working day of effort | Complete, shareable solution and learning record |
| No licence or infrastructure cost | Reusable layout for later lectures |
The assessment is qualitative: this is a personal learning project with no
revenue, so numbers would add no information.
## Stakeholders
| Stakeholder ID (SA) | Interest in this project |
| --- | --- |
| S01 | Owner, developer and reviewer; wants a correct exercise and a learning record |
| S02 | Reads and runs the code; wants the assignment's function names and clear run instructions |
| S03 | Browses for ideas; wants a clear description, topics and README with no dependencies |
## Recommendation
Proceed — the scope is small, the dependencies are none, and the outcome serves all three stakeholders.
---
[SA-001]: ./stakeholder-analysis.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
@@ -0,0 +1,80 @@
# Project baseline and repository
## Metadata
| Key | Value |
| --- | --- |
| ID | MIL-001 |
| CrossReference | [BC-001] |
| Language | en |
| Domain | it |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | S01 | Review findings fixed: Go criterion 6 for ADR-0001, traceability to success criteria (RC-003) | [a07d05b] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Go per RC-003; language checks confirmed by S01 | [a07d05b] |
---
## Purpose
Decide whether the repository is ready for code: configuration, documentation
skeleton and repository metadata exist and follow the Business Case constraints.
## Deliverable
`pyproject.toml`, Python `.gitignore`, `Doxyfile`, README from the framework
template with venv instructions, ADR-0001, and the repository description and
topics set on the git host.
## Go / No-Go Criteria
| # | Criterion (objectively checkable) | Go | No-Go |
| --- | --- | --- | --- |
| 1 | `pyproject.toml` requires Python 3.13 or newer, has no runtime dependencies and a pytest dev extra | Yes | No |
| 2 | `.env` is git-ignored and `git ls-files` does not list it | Yes | No |
| 3 | README follows the template and documents `.venv`, `python -m pip install --upgrade pip` and pytest | Yes | No |
| 4 | `Doxyfile` exists with `INPUT = src` | Yes | No |
| 5 | The git host application programming interface (API) returns a non-empty description and at least 5 topics | Yes | No |
| 6 | ADR-0001 exists, records why user stories and use cases are skipped, and its review is a Go | Yes | No |
## Dependencies
| Depends on | Reason |
| --- | --- |
| none | First gateway |
## Traceability
| Business Case objective / KPI / user story | Reference |
| --- | --- |
| Objective 3 (venv and run instructions) | [BC-001] |
| Objective 5 (description and topics) | [BC-001] |
| Success criteria 3 and 6 (0 runtime dependencies; repository metadata) | [BC-001] |
## Ownership
| Role | Stakeholder ID (SA) |
| --- | --- |
| Owner | S01 |
| Approving reviewer | S01 |
## Target Date
2026-11-06 — within the Business Case target of 2026-11-09.
## Tasks
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
| --- | --- | --- | --- | --- |
| 1 | Record ADR-0001: skip user stories and use cases | The exercise is a single function with no user interaction, so stories and use cases add no information. Record the reason and the plain package layout (no clean-architecture layers) in an architecture decision record (ADR). | No | |
| 2 | Add pyproject.toml and venv setup | Configure the project for Python 3.13 or newer with the `src/` layout, no runtime dependencies, pytest as a dev extra, and pytest settings for `tests/`. | No | |
| 3 | Add Python .gitignore | Ignore `.venv`, caches, build output and `.env` so the personal token file is never committed. | No | |
| 4 | Add Doxyfile | Configure Doxygen to read `src/` and write `docs/doxygen/`, so the Doxygen comments in the source can be rendered. | No | |
| 5 | Write README from the framework template | Fill the template: overview, requirements, creating and using a local `.venv`, `python -m pip install --upgrade pip`, run and test commands, links. Screenshots are added in MIL-002. | No | |
| 6 | Set repository description and topics | Use the git host API with the token from `.env` (read by the shell only, never by the project or printed) to set a description and topics on the `origin` repository. | No | |
---
[BC-001]: ../business-case.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
@@ -0,0 +1,82 @@
# Speed calc decorator
## Metadata
| Key | Value |
| --- | --- |
| ID | MIL-002 |
| CrossReference | [BC-001] |
| Language | en |
| Domain | it |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | S01 | Review findings fixed: traceability to success criteria and constraints (RC-004) | [a07d05b] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Go per RC-004; language checks confirmed by S01 | [a07d05b] |
---
## Purpose
Decide whether the exercise is solved: the decorator works, is tested, and each
lecture step has a screenshot in the README.
## Deliverable
Package `speed_calc` under `src/` (`constants.py`, the decorator, `fast_function`,
`slow_function`, a `__main__` entry point), tests under `tests/`, and one
screenshot per lecture step in `docs/screenshots/`, shown in the README.
## Go / No-Go Criteria
| # | Criterion (objectively checkable) | Go | No-Go |
| --- | --- | --- | --- |
| 1 | `python -m pytest` exits 0 in a fresh `.venv` | Yes | No |
| 2 | `python -m speed_calc` prints the current time and two lines of the form `<name> run speed: <seconds>s` | Yes | No |
| 3 | Function names are `speed_calc_decorator`, `fast_function`, `slow_function` | Yes | No |
| 4 | Constants are only in `constants.py`; source has Doxygen comments | Yes | No |
| 5 | `docs/screenshots/` has 4 images, one per lecture step, referenced in the README | Yes | No |
| 6 | `pyproject.toml` lists no runtime dependencies | Yes | No |
## Dependencies
| Depends on | Reason |
| --- | --- |
| MIL-001 | Needs the project configuration and README skeleton |
## Traceability
| Business Case objective / KPI / user story | Reference |
| --- | --- |
| Objectives 1 and 2 (function names, tests) | [BC-001] |
| Objective 4 (one screenshot per step, README part) | [BC-001] |
| Success criteria 1, 2, 3 and 5 (tests, output, 0 runtime dependencies, screenshots) | [BC-001] |
| Constraint: `constants.py` holds the constants; Doxygen comments (Methodological and Standards Foundation) | [BC-001] |
## Ownership
| Role | Stakeholder ID (SA) |
| --- | --- |
| Owner | S01 |
| Approving reviewer | S01 |
## Target Date
2026-11-07 — within the Business Case target of 2026-11-09.
## Tasks
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
| --- | --- | --- | --- | --- |
| 1 | Lecture step 1: print the current time | Create the package and `constants.py`, and print `time.time()` as in the starting code. Test with a fake clock. | No | |
| 2 | Lecture step 2: decorator skeleton | Write `speed_calc_decorator(function)` that returns a wrapper calling the function and preserving its metadata with `functools.wraps`. Test that the result and name are preserved. | No | |
| 3 | Lecture step 3: time the call | Make the wrapper read the clock before and after the call and print `<name> run speed: <seconds>s`. The clock is injectable so the test asserts exact values. | No | |
| 4 | Lecture step 4: fast vs slow | Add `fast_function` (range 1,000,000) and `slow_function` (range 10,000,000) with the decorator, and the `__main__` entry point that prints the expected output shape. Constants live in `constants.py`. | No | |
| 5 | Doxygen comments on all source | Document modules, functions and constants with Doxygen-style comments, and check that `doxygen Doxyfile` runs without warnings if Doxygen is installed. | No | |
| 6 | Screenshots per lecture step | Render each step's real program output to a Portable Network Graphics (PNG) image in `docs/screenshots/` with a dev-only script (no host desktop capture), and add them to the README. | No | |
| 7 | Update README with run and test output | Add the four screenshots, the run command and the test command with expected results. | No | |
---
[BC-001]: ../business-case.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
@@ -0,0 +1,77 @@
# Wiki in three languages
## Metadata
| Key | Value |
| --- | --- |
| ID | MIL-003 |
| CrossReference | [BC-001] |
| Language | en |
| Domain | it |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | S01 | Review findings fixed: traceability to success criteria 4 and 5 (RC-005) | [a07d05b] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Go per RC-005; language checks confirmed by S01 | [a07d05b] |
---
## Purpose
Decide whether the wiki explains what each lecture step gained, in English,
Danish and Bahasa Malaysia, with a screenshot per step.
## Deliverable
`docs/wiki/` with the same page set in three languages (`Home`, `Setup`,
`Step-1-Current-Time`, `Step-2-Decorator-Skeleton`, `Step-3-Timing-Wrapper`,
`Step-4-Fast-vs-Slow`) and `_Sidebar.md`, reviewed against `QC-WIKI-001`.
## Go / No-Go Criteria
| # | Criterion (objectively checkable) | Go | No-Go |
| --- | --- | --- | --- |
| 1 | `docs/wiki/` is flat; every English page has a `-da` and a `-ms` page | Yes | No |
| 2 | Each page starts with the language switch line | Yes | No |
| 3 | Each step page shows its screenshot and a "What we gained" section | Yes | No |
| 4 | `_Sidebar.md` follows the framework's shape (English list, Languages last) | Yes | No |
| 5 | The wiki review against `QC-WIKI-001` is a Go | Yes | No |
## Dependencies
| Depends on | Reason |
| --- | --- |
| MIL-002 | Needs the screenshots and the finished lecture steps |
## Traceability
| Business Case objective / KPI / user story | Reference |
| --- | --- |
| Objective 4 (wiki in three languages) | [BC-001] |
| Success criteria 4 and 5 (wiki languages, screenshots) | [BC-001] |
## Ownership
| Role | Stakeholder ID (SA) |
| --- | --- |
| Owner | S01 |
| Approving reviewer | S01 |
## Target Date
2026-11-09 — the Business Case target date.
## Tasks
| # | Task | Summary | Needs its own Use Case/User Story? | Reference |
| --- | --- | --- | --- | --- |
| 1 | Write English wiki pages | Home, Setup and one page per lecture step. Each step page shows the screenshot and explains what was gained (time.time, closures, functools.wraps, decorators). English is the authoritative text. | No | |
| 2 | Translate wiki to Danish | Same page set as English with `-da` suffix, language line, code and commands unchanged. | No | |
| 3 | Translate wiki to Bahasa Malaysia | Same page set as English with `-ms` suffix, language line, code and commands unchanged. | No | |
| 4 | Add _Sidebar.md | One English page list, then a Languages section with Home links for en, da, ms. | No | |
| 5 | Check the wiki is enabled on the host | The publish workflow copies `docs/wiki/` to the host wiki after merge only if the wiki is enabled. Check the setting and report if it is off. | No | |
---
[BC-001]: ../business-case.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
+100
View File
@@ -0,0 +1,100 @@
# Project Plan
## Metadata
| Key | Value |
| --- | --- |
| ID | PP-001 |
| CrossReference | [BC-001], [SA-001], [MIL-001], [MIL-002], [MIL-003] |
| Language | en |
| Domain | it |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | S01 | Initial version | [a07d05b] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | S01 | Informal review against QC-PP-001 fixed 7 defects (constants.py gateway, No-Go rule, sources, risk trace, stories, sync mark); accepted by S01 as Product Owner through the accepted plan in chat on 2026-11-06 | [a07d05b] |
---
## Purpose
This plan schedules three gateways that take the lecture-054 exercise from an
empty repository to a tested, documented solution with a three-language wiki,
within the Business Case constraint of finishing by 2026-11-09.
## Planning Assumptions
- The plan starts 2026-11-06 and ends by 2026-11-09 (source: [BC-001] Constraints, target 2026-11-09).
- Phase length: one working session per gateway (source: the author, from the scope of [BC-001]).
- One branch and one pull request per gateway, so that the steps stay traceable.
- Stakeholder S01 owns and reviews every gateway ([SA-001]).
## Gateway Schedule
| Gateway | Document | Window | Decision date | Owner | Stories | Main deliverable | Milestone |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Project baseline and repository | [MIL-001] | 2026-11-06 | 2026-11-06 | S01 | none (technical tasks, see ADR-0001) | Project configuration, README, Doxyfile, ADR-0001, repository metadata | not yet synced |
| Speed calc decorator | [MIL-002] | 2026-11-06 to 2026-11-07 | 2026-11-07 | S01 | none (technical tasks, see ADR-0001) | Working package, tests, one screenshot per lecture step | not yet synced |
| Wiki in three languages | [MIL-003] | 2026-11-07 to 2026-11-09 | 2026-11-09 | S01 | none (technical tasks, see ADR-0001) | Wiki pages in en, da, ms explaining each lecture step | not yet synced |
```plantuml
@startgantt
Project starts 2026-11-06
[Project baseline] starts 2026-11-06 and ends 2026-11-06
[Project baseline Go/No-Go] happens 2026-11-06
[Speed calc decorator] starts 2026-11-06 and ends 2026-11-07
[Speed calc decorator Go/No-Go] happens 2026-11-07
[Wiki] starts 2026-11-07 and ends 2026-11-09
[Wiki Go/No-Go] happens 2026-11-09
@endgantt
```
## Scope Coverage
| Business Case scope item | Gateway |
| --- | --- |
| `pyproject.toml`, `.gitignore`, `Doxyfile` | [MIL-001] |
| `constants.py` | [MIL-002] |
| README with venv and test instructions | [MIL-001], updated in [MIL-002] |
| Repository description and topics | [MIL-001] |
| Python package under `src/`, tests under `tests/` | [MIL-002] |
| One screenshot per lecture step | [MIL-002] |
| Wiki in en, da, ms | [MIL-003] |
## Dependencies
```
MIL-001 → MIL-002 → MIL-003
```
A No-Go stops the later gateways; their dates move by the same number of days.
S01, as Product Owner, decides whether the end date of 2026-11-09 moves; a move
beyond it changes the constraint in [BC-001] and needs a new version of it.
## Plan Risks
| Risk | Impact | Mitigation |
| --- | --- | --- |
| The wiki is not enabled on the git host (assumption of [BC-001]) | MIL-003 cannot be published | Task checks the setting early; stop and report if disabled |
| Screenshots need a rendering tool (relates to the screenshot risk of [BC-001]) | Delay in MIL-002 | Render from captured output with a dev-only tool, no host desktop |
| Timing tests are flaky (risk of [BC-001]) | False failures in MIL-002 | Tests inject a fake clock; checked by Go criterion 1 of [MIL-002] |
| The token in `.env` leaks (risk of [BC-001]) | Account compromise during MIL-001 | `.env` is git-ignored; checked by Go criterion 2 of [MIL-001] |
## Open Issues
- The request names the repository `Tirsvad-Udemy-100_days_of_code`, but `origin`
is `Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator`. The plan uses
`origin`.
- User stories and use cases are skipped: the exercise is one function with no
user interaction. The reason is recorded in ADR-0001 (task in [MIL-001]).
- Under autonomous mode the reviews of S01's documents are performed by the AI
as stand-in for S01 and are recorded as not independent.
---
[BC-001]: ./business-case.md
[SA-001]: ./stakeholder-analysis.md
[MIL-001]: ./milestones/mil-001-project-baseline.md
[MIL-002]: ./milestones/mil-002-speed-calc-decorator.md
[MIL-003]: ./milestones/mil-003-wiki-and-screenshots.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
+68
View File
@@ -0,0 +1,68 @@
# RC-001 Review of BC-001 Business Case
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-001 |
| CrossReference | [BC-001], [QC-BC-001], [QC-LANG-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [a07d05b] |
---
## Artifact Under Review
- Instance reviewed: [BC-001]
- Checklist used: [QC-BC-001] and [QC-LANG-001] (the type is written in the PO language)
- Scope: full review. Round 1 found the defects named under Overall Verdict; they were fixed in the document and the criteria re-checked in round 2, which this record shows.
- Language and domain: en / it
- Language reviewer: S01 (a person; confirmed criteria 3, 5 and 9 of QC-LANG-001 in chat on 2026-11-06)
- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; S01 is also the author, the Product Owner and the named reviewer)
## Checklist Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | ROI/Cost-Benefit analysis is quantitative, or where qualitative, is explicitly justified | Pass | Section "Cost–Benefit Assessment" is qualitative and says why: "this is a personal learning project with no revenue, so numbers would add no information" |
| 2 | Risks are identified with documented impact and mitigation | Pass | Five risks, each row has Impact and Mitigation (flaky timing tests, token leak, wrong repository, translations, screenshot capture) |
| 3 | Success criteria are measurable, stating explicit targets rather than vague aspirations | Pass | Six criteria with Target and Measure (e.g. 100 % tests green via `python -m pytest`, 0 runtime dependencies, at least 5 topics). The measure of criterion 2 ("captured in the lecture-step screenshots") is checked by MIL-002 Go criterion 2 |
| 4 | Scope explicitly separates In Scope vs Out of Scope | Pass | Subsections "In Scope" and "Out of Scope" |
| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline | Pass | The "Stakeholders" table keys on S01, S02, S03 and gives only the interest in this project; roles and power are not re-described. [SA-001] is in CrossReference |
| 6 | Methodology and quality-standard foundation are stated explicitly (e.g. ISO/IEC 25010, Larman) | Pass | "Methodological and Standards Foundation" names the framework, the ISO/IEC 25010:2023 tags and the coding-conventions skill |
| 7 | Assumptions and constraints are explicit and clearly distinguished from one another | Pass | Separate sections. Round 1 defect (fixed): the constraint read "greater than 3.13 (3.13 or newer)" (ambiguous) and "No runtime dependencies unless needed" contradicted success criterion 3 (0 runtime dependencies). Now "Python 3.13 or newer" and "No runtime dependencies" |
| 8 | Document supports executive decision-making with a clear, unambiguous recommendation | Pass | "Recommendation": "Proceed", with the reason |
## Language and Domain Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = `en` and `Domain` = `it` |
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code; `it` is in the domain table of `docs/artifact-registry.md` |
| 3 | The content (prose and table cells) is written in the stated language | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. The English wording is correct |
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: short, outcome-oriented prose; technical detail (file names, commands) is limited to Scope and the Success Criteria measures, where it makes them checkable |
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. No DICT exists; the PO confirmed the terms are correct |
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All keys, headings and statuses are the framework's English ones |
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | The `docs/` listing has no twin file |
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | No earlier accepted version exists and the language has been `en` since the first row |
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. S01 reads English and knows software and IT; the IT domain terms are used correctly |
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Round 1: GUI, PyPI, API and CI were used unexpanded; expanded on first use in round 2. README and ISO/IEC are names, not abbreviations to expand |
## Overall Verdict
Go. No Fail on QC-BC-001 in round 2. Round 1 found two defects (criterion 7: ambiguous Python version wording and a contradiction between the dependency constraint and success criterion 3; QC-LANG-001 criterion 10: unexpanded abbreviations), fixed in the document. Criteria 3, 5 and 9 of QC-LANG-001 were Pending and are now Pass: S01 (a person) confirmed the English wording and the IT domain terms in chat on 2026-11-06. All Mandatory rows pass, so the verdict is Go and the Version History row of the document is Accepted. The review remains `Mode: autonomous, not independent` for the rest. Finding: no Domain Dictionary exists, so criterion 5 has no reference; it is not in the plan and is not added here.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| Confirm criteria 3, 5 and 9 of QC-LANG-001 as a person (Closed: confirmed by S01 in chat, 2026-11-06; criteria set to Pass, verdict Go, document row Accepted) | S01 | 2026-11-06 |
---
[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
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
@@ -0,0 +1,69 @@
# RC-002 Review of SA-001 Stakeholder Analysis
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-002 |
| CrossReference | [SA-001], [QC-SA-001], [QC-LANG-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [a07d05b] |
---
## Artifact Under Review
- Instance reviewed: [SA-001]
- Checklist used: [QC-SA-001] and [QC-LANG-001] (the type is written in the PO language)
- Scope: full review. Round 1 found the defects named under Overall Verdict; they were fixed in the document and the criteria re-checked in round 2, which this record shows.
- Language and domain: en / it
- Language reviewer: S01 (a person; confirmed criteria 3, 5 and 9 of QC-LANG-001 in chat on 2026-11-06)
- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; S01 is also the author, the Product Owner and the named reviewer)
## Checklist Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | Power/Interest grid is filled for every stakeholder, with no gaps or unclassified entries | Pass | S01 HIGH/HIGH, S02 LOW/HIGH, S03 LOW/LOW, each with a Quadrant (Manage Closely, Keep Informed, Monitor); consistent with the grid |
| 2 | Each stakeholder is assigned a unique, stable ID reusable for RACI assignments in other artifacts | Pass | S01, S02, S03; used by BC-001 and the MIL-* Ownership tables |
| 3 | Roles and organizational context are defined with explicit Power and Interest levels, not just narrative description | Pass | Role/Title, Organization, Power Level and Interest Level columns are filled; a rationale section follows |
| 4 | Communication needs (channel, frequency, deliverable type) are mapped to project phases or milestones | Pass | CR-001 to CR-003 give channel, frequency, deliverable and MIL-* |
| 5 | Conflicting stakeholder interests are identified with documented mitigation or resolution strategies | Pass | Two conflicts (S01/S02 structure vs exact shape; S01/S03 thorough wiki vs short entry), each with a mitigation |
| 6 | Stakeholder concerns are explicitly traced to Business Case objectives | Pass | "Business Goal Alignment" maps every CN-ID. Round 1 defect (fixed): CN-007 (no runtime dependencies) was traced to objective 3 (venv and run instructions), which does not cover it; it now cites BC-001 success criterion 3 and the constraint "No runtime dependencies" |
| 7 | Primary concerns are expressed in both business language and a recognized quality-attribute mapping (e.g. FURPS+) | Pass | The concern table has a FURPS+ attribute per concern |
| 8 | Document is understandable and navigable by non-technical stakeholders reviewing their own entry | Pass | Plain sentences, one table row per stakeholder, a rationale per quadrant |
| 9 | Every concern has a stable ID (`CN-NNN`) in the concern register, with the stakeholder who raised it; IDs are never renumbered or reused | Pass | CN-001 to CN-007, each with its stakeholder. First version, so no renumbering can have happened yet |
## Language and Domain Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = `en` and `Domain` = `it` |
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code; `it` is in the domain table of `docs/artifact-registry.md` |
| 3 | The content (prose and table cells) is written in the stated language | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. The English wording is correct |
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Professional English: precise technical terms (decorator, venv, README) used without explanation, which suits the reader the registry assumes |
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. No DICT exists; the PO confirmed the terms are correct |
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All keys, headings and statuses are the framework's English ones |
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | The `docs/` listing has no twin file |
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | No earlier accepted version exists and the language has been `en` since the first row |
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. S01 reads English and knows software and IT; the IT domain terms are used correctly |
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Round 1: FURPS+ was not spelled out; Purpose now lists its attributes. Other abbreviations are IDs or names |
## Overall Verdict
Go. No Fail on QC-SA-001 in round 2. Round 1 found one defect (criterion 6: CN-007 traced to a Business Case objective that does not cover it) and QC-LANG-001 criterion 10 (FURPS+ not spelled out), both fixed in the document. Criteria 3, 5 and 9 of QC-LANG-001 were Pending and are now Pass: S01 (a person) confirmed the English wording and the IT domain terms in chat on 2026-11-06. All Mandatory rows pass, so the verdict is Go and the Version History row of the document is Accepted. The review remains `Mode: autonomous, not independent` for the rest.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| Confirm criteria 3, 5 and 9 of QC-LANG-001 as a person (Closed: confirmed by S01 in chat, 2026-11-06; criteria set to Pass, verdict Go, document row Accepted) | S01 | 2026-11-06 |
---
[SA-001]: ../../stakeholder-analysis.md
[QC-SA-001]: ../../../framework/qc/artifacts/qc-stakeholder-analysis.md
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
@@ -0,0 +1,66 @@
# RC-003 Review of MIL-001 Project baseline and repository
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-003 |
| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [a07d05b] |
---
## Artifact Under Review
- Instance reviewed: [MIL-001]
- Checklist used: [QC-MIL-001] and [QC-LANG-001] (the type is written in the PO language)
- Scope: full review. Round 1 found the defects named under Overall Verdict; they were fixed in the document and the criteria re-checked in round 2, which this record shows.
- Language and domain: en / it
- Language reviewer: S01 (a person; confirmed criteria 3, 5 and 9 of QC-LANG-001 in chat on 2026-11-06)
- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; S01 is also the author, the Product Owner and the named reviewer)
## Checklist Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | A concrete deliverable is defined for every gate | Pass | "Deliverable": pyproject.toml, Python .gitignore, Doxyfile, README, ADR-0001, repository description and topics |
| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Six criteria, each checkable by a command or an API call. Round 1 defect (fixed): the deliverable ADR-0001 had no criterion; criterion 6 added |
| 3 | Dependencies on other milestones are explicitly mapped | Pass | "Dependencies": none, first gateway; matches PP-001 |
| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Objectives 3 and 5; round 1 added success criteria 3 and 6, which Go criteria 1 and 5 verify |
| 5 | Milestone owner and approving reviewer are identified | Pass | Owner S01, approving reviewer S01. Note: the same person, so not independent; the project has no governance document that requires otherwise |
| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-11-06, before the BC-001 target 2026-11-09; equals the decision date in PP-001 |
## Language and Domain Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = `en` and `Domain` = `it` |
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code; `it` is in the domain table of `docs/artifact-registry.md` |
| 3 | The content (prose and table cells) is written in the stated language | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. The English wording is correct |
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: purpose and target date read at a glance; Go/No-Go criteria are necessarily concrete (files, commands) so that they are checkable |
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. No DICT exists; the PO confirmed the terms are correct |
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All keys, headings and statuses are the framework's English ones |
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | The `docs/` listing has no twin file |
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | No earlier accepted version exists and the language has been `en` since the first row |
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. S01 reads English and knows software and IT; the IT domain terms are used correctly |
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Round 1: API and ADR were not expanded; expanded on first use in the Go criteria and the task |
## Overall Verdict
Go. No Fail on QC-MIL-001 in round 2. Round 1 found one defect (criterion 2: deliverable ADR-0001 without a Go criterion; plus thin traceability for criterion 4) and QC-LANG-001 criterion 10 (API and ADR unexpanded), all fixed. ADR-0001 is a task of this milestone; it is now written and accepted (RC-006). Criteria 3, 5 and 9 of QC-LANG-001 were Pending and are now Pass: S01 (a person) confirmed the English wording and the IT domain terms in chat on 2026-11-06. All Mandatory rows pass, so the verdict is Go and the Version History row of the document is Accepted. The review remains `Mode: autonomous, not independent` for the rest. Finding: no governance document defines escalation; S01 is owner and reviewer.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| Confirm criteria 3, 5 and 9 of QC-LANG-001 as a person (Closed: confirmed by S01 in chat, 2026-11-06; criteria set to Pass, verdict Go, document row Accepted) | S01 | 2026-11-06 |
---
[MIL-001]: ../../milestones/mil-001-project-baseline.md
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
@@ -0,0 +1,66 @@
# RC-004 Review of MIL-002 Speed calc decorator
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-004 |
| CrossReference | [MIL-002], [QC-MIL-001], [QC-LANG-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [a07d05b] |
---
## Artifact Under Review
- Instance reviewed: [MIL-002]
- Checklist used: [QC-MIL-001] and [QC-LANG-001] (the type is written in the PO language)
- Scope: full review. Round 1 found the defects named under Overall Verdict; they were fixed in the document and the criteria re-checked in round 2, which this record shows.
- Language and domain: en / it
- Language reviewer: S01 (a person; confirmed criteria 3, 5 and 9 of QC-LANG-001 in chat on 2026-11-06)
- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; S01 is also the author, the Product Owner and the named reviewer)
## Checklist Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | A concrete deliverable is defined for every gate | Pass | "Deliverable": package `speed_calc` with its modules, tests, one screenshot per lecture step shown in the README |
| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Six criteria; 1, 2, 3, 5 and 6 are command or count checks. Criterion 4 (Doxygen comments) is by inspection and is backed by task 5, which runs `doxygen Doxyfile`; accepted as checkable |
| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-001; matches PP-001 |
| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Objectives 1, 2 and 4. Round 1 defect (fixed): success criteria 1, 2, 3, 5 and the constants and Doxygen constraint were not cited; now in the Traceability table |
| 5 | Milestone owner and approving reviewer are identified | Pass | Owner S01, approving reviewer S01 (not independent; see the note in RC-003) |
| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-11-07, before 2026-11-09; equals the decision date in PP-001 |
## Language and Domain Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = `en` and `Domain` = `it` |
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code; `it` is in the domain table of `docs/artifact-registry.md` |
| 3 | The content (prose and table cells) is written in the stated language | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. The English wording is correct |
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: purpose and target date read at a glance; Go/No-Go criteria are necessarily concrete so that they are checkable |
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. No DICT exists; the PO confirmed the terms are correct |
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All keys, headings and statuses are the framework's English ones |
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | The `docs/` listing has no twin file |
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | No earlier accepted version exists and the language has been `en` since the first row |
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. S01 reads English and knows software and IT; the IT domain terms are used correctly |
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Round 1: PNG was not expanded; expanded in task 6 |
## Overall Verdict
Go. No Fail on QC-MIL-001 in round 2. Round 1 found one defect (criterion 4: thin traceability) and QC-LANG-001 criterion 10 (PNG unexpanded), both fixed. Criteria 3, 5 and 9 of QC-LANG-001 were Pending and are now Pass: S01 (a person) confirmed the English wording and the IT domain terms in chat on 2026-11-06. All Mandatory rows pass, so the verdict is Go and the Version History row of the document is Accepted. The review remains `Mode: autonomous, not independent` for the rest.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| Confirm criteria 3, 5 and 9 of QC-LANG-001 as a person (Closed: confirmed by S01 in chat, 2026-11-06; criteria set to Pass, verdict Go, document row Accepted) | S01 | 2026-11-06 |
---
[MIL-002]: ../../milestones/mil-002-speed-calc-decorator.md
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
+66
View File
@@ -0,0 +1,66 @@
# RC-005 Review of MIL-003 Wiki in three languages
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-005 |
| CrossReference | [MIL-003], [QC-MIL-001], [QC-LANG-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [a07d05b] |
---
## Artifact Under Review
- Instance reviewed: [MIL-003]
- Checklist used: [QC-MIL-001] and [QC-LANG-001] (the type is written in the PO language)
- Scope: full review. Round 1 found the defects named under Overall Verdict; they were fixed in the document and the criteria re-checked in round 2, which this record shows.
- Language and domain: en / it
- Language reviewer: S01 (a person; confirmed criteria 3, 5 and 9 of QC-LANG-001 in chat on 2026-11-06)
- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; S01 is also the author, the Product Owner and the named reviewer)
## Checklist Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | A concrete deliverable is defined for every gate | Pass | "Deliverable": `docs/wiki/` with six pages in three languages plus `_Sidebar.md`, reviewed against QC-WIKI-001 |
| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Five criteria, checkable by file listing, first-line check and the QC-WIKI-001 review (that checklist exists as `framework/qc/artifacts/qc-wiki.md`); page set and sidebar shape match `framework/process/wiki.md` and QC-WIKI-001 criteria 2, 5, 10, 11, 12 and 16 |
| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on MIL-002 (screenshots); matches PP-001 |
| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Objective 4; round 1 added success criteria 4 and 5, which Go criteria 1 and 3 verify |
| 5 | Milestone owner and approving reviewer are identified | Pass | Owner S01, approving reviewer S01 (not independent; see the note in RC-003) |
| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-11-09, equal to the BC-001 target and to the decision date in PP-001 |
## Language and Domain Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | The Metadata table has a `Language` row and a `Domain` row, and neither is a placeholder | Pass | Metadata has `Language` = `en` and `Domain` = `it` |
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | `en` is a BCP 47 code; `it` is in the domain table of `docs/artifact-registry.md` |
| 3 | The content (prose and table cells) is written in the stated language | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. The English wording is correct |
| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English: purpose and target date read at a glance; Go/No-Go criteria are necessarily concrete so that they are checkable |
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. No DICT exists; the PO confirmed the terms are correct |
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | All keys, headings and statuses are the framework's English ones |
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | The `docs/` listing has no twin file |
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | No earlier accepted version exists and the language has been `en` since the first row |
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | Confirmed by S01 (a person) in chat, 2026-11-06. S01 reads English and knows software and IT; the IT domain terms are used correctly |
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | No abbreviation needs expanding |
## Overall Verdict
Go. No Fail on QC-MIL-001 in round 2. Round 1 found one weak spot (criterion 4: thin traceability), fixed. Observation: the file name says wiki-and-screenshots while the title and scope are the wiki only (screenshots belong to MIL-002); harmless, not renamed to keep the link stable. Criteria 3, 5 and 9 of QC-LANG-001 were Pending and are now Pass: S01 (a person) confirmed the English wording and the IT domain terms in chat on 2026-11-06. All Mandatory rows pass, so the verdict is Go and the Version History row of the document is Accepted. The review remains `Mode: autonomous, not independent` for the rest.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| Confirm criteria 3, 5 and 9 of QC-LANG-001 as a person (Closed: confirmed by S01 in chat, 2026-11-06; criteria set to Pass, verdict Go, document row Accepted) | S01 | 2026-11-06 |
---
[MIL-003]: ../../milestones/mil-003-wiki-and-screenshots.md
[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md
[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
+55
View File
@@ -0,0 +1,55 @@
# SQA Review Record
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-006 |
| CrossReference | [ADR-0001], [QC-ADR-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version: review of ADR-0001, two rounds | [a07d05b] |
---
## Artifact Under Review
- Instance reviewed: [ADR-0001]
- Checklist used: [QC-ADR-001] (a technical type: no QC-LANG-001 table)
- Scope: full review. Round 1 found two defects (criterion 10 and the shared rationale for criterion 4); they were fixed in the ADR and the criteria re-checked in round 2, which this record shows.
- Language and domain: n/a (technical type)
- Language reviewer: none
- Mode: autonomous, not independent (the reviewer is `AI as stand-in for S01`; S01 is also the author and Product Owner)
## Checklist Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | The ID (`ADR-NNNN`, 4-digit) matches the filename number and is unique and sequential | Pass | ID `ADR-0001`, file `adr-0001-...`; the only ADR; registry next version is 0002 |
| 2 | Context states the problem, the forces (cost, risk, constraints) and the options evaluated | Pass | Problem: stories/use cases and code layout for a one-function exercise; Forces paragraph (date 2026-11-09, S02 and S03 wants, layers hiding the three functions); options (a) and (b) for both decisions |
| 3 | At least two options were considered, or the absence of alternatives is justified | Pass | Two options for each of the two decisions |
| 4 | Decision is stated in one or two unhedged sentences and matches one of the evaluated options | Pass | Two sentences, no hedging; they match option (b) of each decision. Round 1: two decisions share one driver (proportion to the exercise), now stated in Context, so they are not unrelated |
| 5 | Consequences list both Positive and Negative outcomes | Pass | Both lists present; negatives: does not scale, no story-level traceability |
| 6 | Quality-attribute impacts (performance, security, portability, etc.) are named where the decision affects them | Pass | Maintainability/scalability limit named as negative; no runtime dependencies named as positive; performance and security are not affected |
| 7 | Affected Artifacts are listed as links, and each is also in CrossReference | Pass | BC-001 and PP-001 are linked and both in CrossReference; PP-001 "Stories" column does say "none" and point to ADR-0001 |
| 8 | Status changes are recorded as new Version History rows with a Change summary and Commit link; retained rows are never rewritten | Pass | Acceptance is a new row, the earlier row only moves to Deprecated as the RC process says; Commit is `pending` until the commit exists (resolved by `resolve-pending-commits.sh`) |
| 9 | A superseded or deprecated ADR names its successor, and the successor links back | N-A | ADR-0001 is not superseded; the Deprecated row is a version row, not the ADR |
| 10 | Written in business or technical language of the domain, with no unexplained abbreviations | Pass | Round 1 Fail: S01 to S03 were bare IDs. Fixed: S01, S02 and S03 are now glossed in Context |
| 11 | Status is one of `Proposed`, `Accepted`, `Rejected`, `Deprecated` or `Superseded by ADR-NNNN`, and every Version History row uses only these | Pass | Rows use `Deprecated` and `Accepted` only |
## Overall Verdict
Go. Every Mandatory criterion passes after the two round 1 fixes; criterion 9 is N-A with a reason. Not independent: the author and the stand-in reviewer are the same party.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| Resolve the pending commit links after the commit | S01 | 2026-11-09 |
---
[ADR-0001]: ../../adr/adr-0001-skip-stories-plain-package.md
[QC-ADR-001]: ../../../framework/qc/artifacts/qc-adr.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
+88
View File
@@ -0,0 +1,88 @@
# Traceability Matrix
## Metadata
| Key | Value |
| --- | --- |
| ID | TM-001 |
| CrossReference | [BC-001], [SA-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | S01 | Initial version: BC, SA, PP, MIL-001 to MIL-003 and RC-001 to RC-005 | [a07d05b] |
---
## Purpose
Tracks backward/forward links between artifact instances so that the Business Case's
cross-artifact traceability success criterion is measurable. A row is added or
updated whenever an artifact instance is created or reviewed.
## Traceability Table
| Artifact Instance | Type | Language | Domain | Upstream (Backward Link) | Downstream (Forward Link) | Last Reviewed (RC-ID) |
| --- | --- | --- | --- | --- | --- | --- |
| [SA-001] | Stakeholder Analysis | en | it | - | [BC-001], [PP-001] | [RC-002] (Go) |
| [BC-001] | Business Case | en | it | [SA-001] | [PP-001], [MIL-001], [MIL-002], [MIL-003] | [RC-001] (Go) |
| [PP-001] | Project Plan | en | it | [BC-001], [SA-001] | [MIL-001], [MIL-002], [MIL-003] | - (no review gate; accepted by S01 through the accepted plan) |
| [MIL-001] | Milestone / Gateway | en | it | [BC-001], [PP-001] | [MIL-002]; source code is not built yet; ADR-0001 is written | [RC-003] (Go) |
| [MIL-002] | Milestone / Gateway | en | it | [BC-001], [PP-001], [MIL-001] | [MIL-003]; source code and tests are not built yet | [RC-004] (Go) |
| [MIL-003] | Milestone / Gateway | en | it | [BC-001], [PP-001], [MIL-002] | - | [RC-005] (Go) |
| [ADR-0001] | Architecture Decision Record | n/a | n/a | [BC-001], [PP-001] | source code and tests are not built yet | [RC-006] (Go) |
| [RC-001] | SQA Review Record | - | - | [BC-001] | - | - |
| [RC-002] | SQA Review Record | - | - | [SA-001] | - | - |
| [RC-003] | SQA Review Record | - | - | [MIL-001] | - | - |
| [RC-004] | SQA Review Record | - | - | [MIL-002] | - | - |
| [RC-005] | SQA Review Record | - | - | [MIL-003] | - | - |
| [RC-006] | SQA Review Record | - | - | [ADR-0001] | - | - |
## Concern Coverage
No view (architecture, design or use case artifact) exists yet, and none is planned
before the milestones: the exercise is one function and the reason for skipping
user stories and use cases is recorded in ADR-0001, a task of [MIL-001]
(accepted). Each concern is delivered by a milestone Go criterion; that is
noted in the first column. There is no Architecture Description, so the gaps
are not listed there.
| Concern (CN-ID) | Views that answer it | Decisions (ADR) | Quality check (TP) | Status |
| --- | --- | --- | --- | --- |
| CN-001 | none; delivered by [MIL-002] Go criteria 1 and 2 | none (ADR-0001 does not address it) | none | Gap |
| CN-002 | none; delivered by [MIL-002] Go criterion 1 | none (ADR-0001 does not address it) | none | Gap |
| CN-003 | none; delivered by [MIL-003] Go criteria 1 to 3 | none (ADR-0001 does not address it) | none | Gap |
| CN-004 | none; delivered by [MIL-002] Go criterion 3 | none (ADR-0001 does not address it) | none | Gap |
| CN-005 | none; delivered by [MIL-001] Go criterion 3 | none (ADR-0001 does not address it) | none | Gap |
| CN-006 | none; delivered by [MIL-001] Go criteria 3 and 5 | none (ADR-0001 does not address it) | none | Gap |
| CN-007 | none; delivered by [MIL-001] Go criterion 1 and [MIL-002] Go criterion 6 | none (ADR-0001 does not address it) | none | Gap |
## Open Inconsistencies
| # | Views | Inconsistency | Found in (RC-ID) | Status | Resolved in |
| --- | --- | --- | --- | --- | --- |
| 1 | [SA-001], [BC-001] | CN-007 (no runtime dependencies) was traced to Business Case objective 3 (venv and run instructions), which does not cover it | [RC-002] | Closed | [SA-001] version of 2026-11-06 |
| 2 | [BC-001] | The constraint "No runtime dependencies unless needed" contradicted success criterion 3 (0 runtime dependencies) | [RC-001] | Closed | [BC-001] version of 2026-11-06 |
| 3 | [PP-001], [MIL-002] | The plan placed `constants.py` at [MIL-001], while [MIL-002] task 1 creates it | informal review of [PP-001] (no RC) | Closed | [PP-001] version of 2026-11-06 |
## Coverage Notes
- Types with no instance yet: KPI, BMC, BPMN, UCD, US, UC, DM, SSD, OC, SD, DCD, ERD, TP, AD, GOV, DICT. User stories and use cases are skipped on purpose (recorded in [ADR-0001]); GOV and DICT are not in the plan, which leaves QC-LANG-001 criterion 5 without a dictionary to check against.
- `-` in Upstream means foundational; in Downstream, nothing is built on it yet; in Last Reviewed, no `RC-*` exists yet.
- All five reviews are `Mode: autonomous, not independent` and `Go`: S01 confirmed criteria 3, 5 and 9 of QC-LANG-001 as a person in chat on 2026-11-06, so BC-001, SA-001 and MIL-001 to MIL-003 are `Accepted`.
---
[BC-001]: ../business-case.md
[SA-001]: ../stakeholder-analysis.md
[PP-001]: ../project-plan.md
[MIL-001]: ../milestones/mil-001-project-baseline.md
[MIL-002]: ../milestones/mil-002-speed-calc-decorator.md
[MIL-003]: ../milestones/mil-003-wiki-and-screenshots.md
[RC-001]: ./reviews/rc-001-business-case.md
[RC-002]: ./reviews/rc-002-stakeholder-analysis.md
[RC-003]: ./reviews/rc-003-mil-001-project-baseline.md
[RC-004]: ./reviews/rc-004-mil-002-speed-calc-decorator.md
[RC-005]: ./reviews/rc-005-mil-003-wiki.md
[RC-006]: ./reviews/rc-006-adr-0001.md
[ADR-0001]: ../adr/adr-0001-skip-stories-plain-package.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
+89
View File
@@ -0,0 +1,89 @@
# Stakeholder Analysis
## Metadata
| Key | Value |
| --- | --- |
| ID | SA-001 |
| CrossReference | [BC-001] |
| Language | en |
| Domain | it |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | S01 | Review findings fixed: CN-007 traced to success criterion 3, abbreviations (RC-002) | [a07d05b] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Go per RC-002; language checks confirmed by S01 | [a07d05b] |
---
## Purpose
This analysis names the people the project serves and what each needs, so that
owners, reviewers and tasks can cite stable IDs. It uses the power/interest grid
and maps concerns to FURPS+ (Functionality, Usability, Reliability, Performance,
Supportability, plus design, implementation, interface and physical constraints).
## Stakeholder Summary Table
| ID | Name | Role/Title | Organization | Power Level | Interest Level | Quadrant | Primary Concern (Business Language) |
| --- | --- | --- | --- | --- | --- | --- | --- |
| S01 | Jens Tirsvad Nielsen (course participant) | Product Owner, developer and reviewer | Tirsvad | HIGH | HIGH | Manage Closely | A correct exercise solution and a record of what was learned |
| S02 | Udemy coursists | Fellow participants who share and compare code | Udemy course community | LOW | HIGH | Keep Informed | Readable, runnable code with the assignment's function names, and README run instructions |
| S03 | GitHub viewers | Visitors who browse the repository for ideas | Public | LOW | LOW | Monitor | A clear repository description, topics and README, and no runtime dependencies |
## Power/Interest Classification Rationale
- **Manage Closely (S01):** decides scope, writes, reviews and accepts everything.
- **Keep Informed (S02):** no authority over the project, but depends on its
clarity; the README and wiki are the channel.
- **Monitor (S03):** casual visitors with no stake beyond a good first
impression; the description, topics and README serve them.
## Primary Concerns and FURPS+ Mapping
| Concern ID | Stakeholder | Concern | FURPS+ attribute |
| --- | --- | --- | --- |
| CN-001 | S01 | The decorator prints the time a function takes, like the expected output | Functionality |
| CN-002 | S01 | Tests prove the behaviour without depending on real elapsed time | Reliability |
| CN-003 | S01 | The learning of each lecture step is written down in three languages | Supportability |
| CN-004 | S02 | Function names match the assignment (`speed_calc_decorator`, `fast_function`, `slow_function`) | Functionality |
| CN-005 | S02 | Setup and run instructions with a local `.venv` are easy to follow | Usability |
| CN-006 | S03 | Repository description, topics and README explain the project at a glance | Usability |
| CN-007 | S03 | The project installs and runs with no runtime dependencies | Implementation |
## Communication Requirements
| ID | Channel | Frequency | Deliverable | Phase / Milestone |
| --- | --- | --- | --- | --- |
| CR-001 | Pull request review | One per milestone | Pull request with the milestone's changes | MIL-001, MIL-002, MIL-003 |
| CR-002 | README | Updated per milestone | Run and test instructions with screenshots | MIL-001, MIL-002 |
| CR-003 | Wiki (en, da, ms) | Once | Lecture-step explanations with screenshots | MIL-003 |
## Conflicting Interests and Mitigations
| Conflict | Stakeholders | Mitigation |
| --- | --- | --- |
| S02 wants the exact assignment shape, S01 wants well-structured code (package, constants, tests) | S01, S02 | Keep the assignment's function names and output; add structure around them |
| S01 wants a thorough wiki in three languages, S03 wants a short entry point | S01, S03 | README is short and links to the wiki for detail |
## Traceability Analysis
### Business Goal Alignment
| Stakeholder | Concern | Business Case objective |
| --- | --- | --- |
| S01 | CN-001, CN-002 | [BC-001] objectives 1 and 2 |
| S01 | CN-003 | [BC-001] objective 4 |
| S02 | CN-004 | [BC-001] objective 1 |
| S02 | CN-005 | [BC-001] objective 3 |
| S03 | CN-006 | [BC-001] objectives 4 and 5 |
| S03 | CN-007 | [BC-001] success criterion 3 (0 runtime dependencies) and the constraint "No runtime dependencies" |
## Sign-Off
Product Owner: S01, accepted 2026-11-06 via RC-002.
---
[BC-001]: ./business-case.md
[a07d05b]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-speed-calc-decorator/commit/a07d05b385e6b831b90731aefe08f078ebb951ca
Submodule
+1
Submodule framework added at be602df82f.
+29
View File
@@ -0,0 +1,29 @@
[build-system]
requires = ["setuptools>=75"]
build-backend = "setuptools.build_meta"
[project]
name = "speed-calc-decorator"
version = "0.1.0"
description = "Udemy 100 Days of Code, lecture 054: a decorator that measures how long a function takes to run."
readme = "README.md"
requires-python = ">=3.13"
license = "AGPL-3.0-or-later"
license-files = ["LICENSE"]
authors = [{ name = "Jens Tirsvad Nielsen" }]
keywords = ["python", "decorator", "udemy", "100-days-of-code", "timing"]
dependencies = []
[project.optional-dependencies]
dev = ["pytest>=8", "pillow>=11"]
[tool.setuptools.packages.find]
where = ["src"]
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]
addopts = "-ra"
[tool.ruff]
line-length = 88