From e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 Mon Sep 17 00:00:00 2001 From: Jens Tirsvad Nielsen Date: Wed, 28 Oct 2026 16:14:21 +0800 Subject: [PATCH 1/2] Set up project baseline and skeleton (MIL-001) Business Case, Stakeholder Analysis, Project Plan, three milestones, ADR-0001, their reviews (RC-001 to RC-008) and the traceability matrix. Python project skeleton: pyproject.toml, constants.py, layer packages, Doxyfile, .gitignore and README with venv instructions. Task: MIL-001#1 --- .gitignore | 77 ++++++++++ .gitmodules | 3 + Doxyfile | 40 +++++ README.md | 144 +++++++++++++++++- .../adr-0001-dependencies-fixture-docker.md | 45 ++++++ docs/artifact-registry.md | 61 ++++++++ docs/business-case.md | 142 +++++++++++++++++ docs/milestones/mil-001-project-setup.md | 75 +++++++++ docs/milestones/mil-002-form-automation.md | 76 +++++++++ docs/milestones/mil-003-documentation.md | 73 +++++++++ docs/project-plan.md | 91 +++++++++++ docs/sqa/reviews/rc-001-business-case.md | 67 ++++++++ .../reviews/rc-002-stakeholder-analysis.md | 68 +++++++++ docs/sqa/reviews/rc-003-project-plan.md | 74 +++++++++ .../reviews/rc-004-mil-001-project-setup.md | 65 ++++++++ .../reviews/rc-005-mil-002-form-automation.md | 65 ++++++++ .../reviews/rc-006-mil-003-documentation.md | 65 ++++++++ docs/sqa/reviews/rc-007-adr-0001.md | 54 +++++++ docs/sqa/reviews/rc-008-code-mil-001.md | 61 ++++++++ docs/sqa/traceability-matrix.md | 72 +++++++++ docs/stakeholder-analysis.md | 80 ++++++++++ framework | 1 + pyproject.toml | 51 +++++++ src/fill_out_form/__init__.py | 7 + src/fill_out_form/application/__init__.py | 5 + src/fill_out_form/constants.py | 51 +++++++ src/fill_out_form/domain/__init__.py | 5 + src/fill_out_form/infrastructure/__init__.py | 5 + src/fill_out_form/presentation/__init__.py | 5 + tests/__init__.py | 0 tests/unit/test_constants.py | 19 +++ 31 files changed, 1646 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Doxyfile create mode 100644 docs/adr/adr-0001-dependencies-fixture-docker.md create mode 100644 docs/artifact-registry.md create mode 100644 docs/business-case.md create mode 100644 docs/milestones/mil-001-project-setup.md create mode 100644 docs/milestones/mil-002-form-automation.md create mode 100644 docs/milestones/mil-003-documentation.md create mode 100644 docs/project-plan.md create mode 100644 docs/sqa/reviews/rc-001-business-case.md create mode 100644 docs/sqa/reviews/rc-002-stakeholder-analysis.md create mode 100644 docs/sqa/reviews/rc-003-project-plan.md create mode 100644 docs/sqa/reviews/rc-004-mil-001-project-setup.md create mode 100644 docs/sqa/reviews/rc-005-mil-002-form-automation.md create mode 100644 docs/sqa/reviews/rc-006-mil-003-documentation.md create mode 100644 docs/sqa/reviews/rc-007-adr-0001.md create mode 100644 docs/sqa/reviews/rc-008-code-mil-001.md create mode 100644 docs/sqa/traceability-matrix.md create mode 100644 docs/stakeholder-analysis.md create mode 160000 framework create mode 100644 pyproject.toml create mode 100644 src/fill_out_form/__init__.py create mode 100644 src/fill_out_form/application/__init__.py create mode 100644 src/fill_out_form/constants.py create mode 100644 src/fill_out_form/domain/__init__.py create mode 100644 src/fill_out_form/infrastructure/__init__.py create mode 100644 src/fill_out_form/presentation/__init__.py create mode 100644 tests/__init__.py create mode 100644 tests/unit/test_constants.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..90464b7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,77 @@ +# Secrets and local environment +.env +.env.* +!.env.example +.venv/ +venv/ +env/ + +# AI prompt log (the repository is public, see framework/process/ai-prompt-log.md) +/docs/ai-prompts/ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +build/ +dist/ +develop-eggs/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage / tool caches +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +.ruff_cache/ +.mypy_cache/ +.pytype/ +.pyre/ + +# Jupyter, IPython +.ipynb_checkpoints +profile_default/ +ipython_config.py + +# Doxygen output +/docs/doxygen/ + +# Browser run results (screenshots are copied to docs/images/ on purpose) +/results/ + +# IDEs and OS +.idea/ +.vscode/ +*.swp +.DS_Store +Thumbs.db diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..a759dc9 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "framework"] + path = framework + url = ssh://git@git.tirsystem.com:10022/TirSystem/SQA-QC-Framework.git diff --git a/Doxyfile b/Doxyfile new file mode 100644 index 0000000..98c3f1f --- /dev/null +++ b/Doxyfile @@ -0,0 +1,40 @@ +# Doxygen configuration for fill-out-form (Python sources in src/). +# Generate the HTML documentation with: doxygen Doxyfile +# Output goes to docs/doxygen/ (ignored by git). + +PROJECT_NAME = "fill-out-form" +PROJECT_BRIEF = "Udemy 100 Days of Code, Day 48: fill out a form with Selenium" +PROJECT_NUMBER = 0.1.0 +OUTPUT_DIRECTORY = docs/doxygen +CREATE_SUBDIRS = NO +OUTPUT_LANGUAGE = English + +# Python sources +INPUT = src README.md +FILE_PATTERNS = *.py *.md +RECURSIVE = YES +EXCLUDE_PATTERNS = */__pycache__/* +OPTIMIZE_OUTPUT_JAVA = YES +EXTRACT_ALL = YES +EXTRACT_PRIVATE = NO +EXTRACT_STATIC = YES +AUTOLINK_SUPPORT = YES +MARKDOWN_SUPPORT = YES +USE_MDFILE_AS_MAINPAGE = README.md +PYTHON_DOCSTRING = YES + +# Output formats +GENERATE_HTML = YES +HTML_OUTPUT = html +GENERATE_LATEX = NO +GENERATE_XML = NO + +# Diagrams are not needed and Graphviz is not required +HAVE_DOT = NO +CLASS_DIAGRAMS = NO + +# Messages +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES diff --git a/README.md b/README.md index 55109b3..3c4c289 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,144 @@ -# 048-fill-out-form +# πŸš€ 048-fill-out-form +Udemy "100 Days of Code: The Complete Python Pro Bootcamp", Day 48: automate a browser with Selenium β€” click a link by its text, type into a search box, send the Enter key and fill out a sign-up form. For course participants who want to compare solutions and for anyone who wants a small, tested Selenium example. + +## πŸ“š Table of Contents + +- [Overview](#-overview) +- [Requirements](#-requirements) +- [Setup](#-setup) +- [Run](#-run) +- [Tests](#-tests) +- [License](#-license) +- [Links](#-links) +- [Appendix: Project documents](#-appendix-project-documents) + +## 🧭 Overview + +The code automates the three steps of the lecture: + +1. `click_link_by_text` β€” click the "Content portals" link on the Wikipedia main page. +2. `search_for` β€” type "Python" into the search box and press Enter. +3. `fill_out_form` β€” type a first name, last name and email into the sign-up form and click the button. + +| Part | What it is for | +| --- | --- | +| `src/fill_out_form/` | The package: `constants.py` holds every URL, locator and text; the layers `domain`, `application`, `infrastructure` and `presentation` hold the code | +| `tests/` | pytest tests (`unit/`), the browser run (`e2e/`) and a local copy of the form (`fixtures/`) | +| `docs/` | Project documents, screenshots and the wiki in English, Danish and Bahasa Malaysia | +| `Doxyfile` | Configuration for the Doxygen API documentation | + +## πŸ“‹ Requirements + +- Python 3.13 or newer, with `venv` β€” the language and the isolated environment. +- Google Chrome or Chromium β€” the browser that Selenium drives (Selenium 4 finds the driver itself). +- Docker β€” only to run the browser in a container and take the screenshots. +- Doxygen β€” only to build the API documentation (optional). + +The only runtime dependency is `selenium`; `pytest`, `ruff` and `mypy` are development extras. + +## πŸ› οΈ Setup + +Create and use a local virtual environment in `.venv`: + +```bash +python -m venv .venv +``` + +Activate it (Linux, macOS, Git Bash): + +```bash +source .venv/bin/activate +``` + +Activate it (Windows PowerShell): + +```powershell +.venv\Scripts\Activate.ps1 +``` + +Upgrade pip and install the project with the development extras: + +```bash +python -m pip install --upgrade pip +``` + +```bash +python -m pip install -e ".[dev]" +``` + +## ▢️ Run + +Run the three lecture steps in a visible Chrome window: + +```bash +python -m fill_out_form +``` + +Useful options: `--headless` (no window), `--screenshots DIR` (save one picture per step) and `--form-url URL` (use another form page). See `python -m fill_out_form --help`. + +Run the steps in Docker (headless, screenshots in `results/`), which never touches your desktop: + +```bash +docker build -t fill-out-form -f docker/Dockerfile . +``` + +```bash +docker run --rm -v "$(pwd)/results:/results" fill-out-form +``` + +## πŸ§ͺ Tests + +The unit tests need no browser and no network: + +```bash +python -m pytest +``` + +Build the API documentation with Doxygen (output in `docs/doxygen/`): + +```bash +doxygen Doxyfile +``` + +## πŸ“„ License + +GNU Affero General Public License v3.0, see [LICENSE][license]. + +## πŸ”— Links + +- [Repository][repository] +- [Documentation][documentation] +- [Issue tracker][issues] + +## πŸ“Ž Appendix: Project documents + +The documents a newcomer needs, in reading order. + +| 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/048-fill-out-form +[documentation]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/wiki +[issues]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/issues +[license]: ./LICENSE +[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 diff --git a/docs/adr/adr-0001-dependencies-fixture-docker.md b/docs/adr/adr-0001-dependencies-fixture-docker.md new file mode 100644 index 0000000..ce99a68 --- /dev/null +++ b/docs/adr/adr-0001-dependencies-fixture-docker.md @@ -0,0 +1,45 @@ +# ADR-0001 Dependencies, form page and browser environment + +## Metadata +| Key | Value | +| --- | --- | +| ID | ADR-0001 | +| CrossReference | [BC-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +Allowed Status values: `Proposed`, `Accepted`, `Rejected`, `Deprecated`, `Superseded by ADR-NNNN`. + +--- + +## Context + +The project drives a browser with Selenium (the lecture's subject). S03 wants no runtime dependencies beyond the necessary (CN-006). The lecture's form challenge uses a public demo page that is online today but is not under our control. The framework forbids testing a GUI on the host desktop (`framework/process/gui-testing.md`). Options considered: (a) add helper libraries such as `python-dotenv` or `webdriver-manager`; (b) run only against the live demo page; (c) a local HTML fixture for unit tests plus a Docker browser run for screenshots. + +## Decision + +Selenium is the only runtime dependency (pytest, ruff and mypy are `dev` extras). Unit tests use a fake browser and a local HTML fixture, never the network; the live pages are used only by the Docker browser run that produces the screenshots. Any browser run happens in a Docker container, never on the host desktop. The `.env` file is never read by the project. + +## Consequences + +**Positive:** + +- The installation is one dependency; Selenium Manager finds the driver, so no driver helper is needed. +- Unit tests are fast, offline and independent of a third-party site. +- The user's desktop is never taken over by a browser. + +**Negative:** + +- Screenshots need Docker. +- The fixture can drift from the live demo page; the Docker run is the check. + +## Affected Artifacts + +- [BC-001] β€” realises success criterion 4 (one runtime dependency) and the risk about the demo page + +--- + +[BC-001]: ../business-case.md diff --git a/docs/artifact-registry.md b/docs/artifact-registry.md new file mode 100644 index 0000000..76ea6e8 --- /dev/null +++ b/docs/artifact-registry.md @@ -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/*.md | 004 | +| ADR | Architecture Decision Record | docs/adr/adr-NNNN-*.md | 0002 | +| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 009 | +| TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 | + +## 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 and the PO language, at least (`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. diff --git a/docs/business-case.md b/docs/business-case.md new file mode 100644 index 0000000..de60ed2 --- /dev/null +++ b/docs/business-case.md @@ -0,0 +1,142 @@ +# Business Case + +## Metadata +| Key | Value | +| --- | --- | +| ID | BC-001 | +| CrossReference | [SA-001] | +| Language | en | +| Domain | it | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Executive Summary + +Day 48 of the Udemy course "100 Days of Code: The Complete Python Pro Bootcamp" teaches Selenium WebDriver: clicking links, typing into inputs, sending special keys and filling out a sign-up form. This project turns that assignment into a small, readable, runnable Python repository with tests, documentation, a screenshot for every lecture step and a three-language wiki. It is a learning and portfolio project with one person doing the work. + +## Methodological and Standards Foundation + +- The SQA and QC framework mounted at `framework/` governs documents, reviews and the plan-first gate. +- Quality characteristics follow ISO/IEC 25010:2023. +- Code follows the `coding-conventions` skill (Python) and the layering of the `clean-architecture` skill. +- Docs-as-code: every change reaches `main` by a pull request, one pull request per milestone. + +## Problem Statement + +- The course assignment is normally solved as one throw-away script. The author's earlier solution (the day-48 folder of a monolithic course repository) is a scratch file that does not follow the lecture, has no tests and no documentation. +- Other course participants cannot easily compare solutions or see what each lecture step produces. +- A repository without a description, topics and a README is neither found nor understood by GitHub viewers. + +## Business Opportunity + +A clean reference solution for the lecture lets the author keep a tidy portfolio, lets course participants compare solutions, and shows a repeatable project structure (src, tests, docs, wiki) for the remaining days of the course. + +## Objectives + +1. Deliver Python code that automates the lecture steps with Selenium: click a link by its text, search for "Python" and press Enter, and fill out a form (first name, last name, email) and click the sign-up button. +2. Deliver pytest tests for all logic that needs no browser. +3. Deliver a screenshot for each lecture step, shown in the README and the wiki. +4. Deliver a wiki in English, Danish and Bahasa Malaysia that explains what was gained in each lecture step. +5. Configure the repository: description, topics, Python `.gitignore`, `pyproject.toml`, Doxyfile, and instructions for a local `.venv`. + +## Scope + +### In Scope + +- Python 3.13 or newer package under `src/`, tests under `tests/`, documents under `docs/`. +- Constants in `constants.py`; Doxygen comments in the source and a `Doxyfile`. +- `pyproject.toml`, venv instructions (`python -m pip install --upgrade pip`), Python `.gitignore`. +- README from the framework template, with run and test instructions and screenshots. +- Wiki pages in English, Danish and Bahasa Malaysia (`docs/wiki/`), with the same screenshots. +- Repository description and topics on the git host. + +### Out of Scope + +- Running the browser automation on the host desktop (it runs in Docker, see `framework/process/gui-testing.md`). +- Later days of the course and the final project. +- Packaging for PyPI, a graphical front end, and a web service. +- Reading, testing or importing the personal tokens in `.env`. + +## Expected Benefits + +### Tangible Benefits + +- A runnable reference solution with passing tests. +- One screenshot per lecture step (at least three). +- Three language versions of the wiki. + +### Intangible Benefits + +- A reusable project layout for the other course days. +- Practice with Selenium, pytest and docs-as-code. +- A repository others can read and learn from. + +## Strategic Alignment + +The project supports the author's goal of completing the course with a documented, reviewable portfolio, and the framework's goal of showing the plan-first workflow on a small project. + +## Success Criteria + +| # | Criterion | Target | Measure | +| --- | --- | --- | --- | +| 1 | Tests pass | 100 % of pytest tests pass on Python 3.13 | `pytest` exit code 0 | +| 2 | Lecture steps covered | 3 of 3 steps (link click, search, form) implemented and shown by a screenshot | Files in `docs/images/` | +| 3 | Wiki languages | 3 of 3 languages with the same page set | Files in `docs/wiki/` | +| 4 | Runtime dependencies | Exactly 1 (selenium) | `dependencies` in `pyproject.toml` | +| 5 | Repository metadata | Description set and at least 5 topics | Git host API response | +| 6 | Quality gate | Every document and the code have an `RC-*` with verdict Go | `docs/sqa/reviews/` | + +## Risks + +| Risk | Impact | Mitigation | +| --- | --- | --- | +| The assignment's form page (a Heroku demo) is offline | The form step cannot be shown against the original site | A local HTML fixture with the same field names serves tests and screenshots; the original URL is a constant | +| Docker or the browser image is unavailable | No screenshots | Stop and report (gui-testing rule 5); never fall back to the host desktop | +| Wikipedia changes its page layout | Selectors break | Selectors live in `constants.py`; screenshots record the state on the capture date | +| Danish or Bahasa Malaysia text contains errors | Misleading text | English is authoritative; translations follow page by page; the author can correct them | +| Tokens in `.env` leak | Account compromise | `.env` is in `.gitignore` and is never read by project code or tests | + +## Assumptions + +- S01 is Product Owner, developer and reviewer; in autonomous mode the AI stands in for the reviewer, recorded as not independent. +- Docker is installed on the author's machine. +- The git host accepts the token in `.env` for repository and issue operations. +- "Python greater than 3.13" is read as 3.13 or newer (`requires-python = ">=3.13"`). + +## Constraints + +- Duration: one week, 2026-10-28 to 2026-11-04. +- Python 3.13 or newer, `venv`, `pytest`, `pyproject.toml`. +- Folder structure `src/`, `tests/`, `docs/`. +- Only runtime dependency: selenium. +- Product Owner domain: IT; language: English. + +## Cost–Benefit Assessment + +Qualitative, because the project is unpaid learning work with no revenue. + +| Costs | Benefits | +| --- | --- | +| About one week of the author's time and AI usage | A reference solution, documentation in three languages and a reusable project layout | +| A Docker image download | Safe, reproducible browser runs | + +## Stakeholders + +| Stakeholder ID (SA) | Interest in this project | +| --- | --- | +| S01 | Wants a tidy portfolio piece (CN-001, CN-002, CN-007) | +| S02 | Wants readable, runnable code with the assignment's function names and run instructions (CN-003, CN-004) | +| S03 | Wants a clear repository description, topics and README, and no unnecessary runtime dependencies (CN-005, CN-006) | + +## Recommendation + +Proceed β€” the scope is small, the risks are mitigated and the outcome is a reusable reference. + +--- + +[SA-001]: ./stakeholder-analysis.md diff --git a/docs/milestones/mil-001-project-setup.md b/docs/milestones/mil-001-project-setup.md new file mode 100644 index 0000000..b77871c --- /dev/null +++ b/docs/milestones/mil-001-project-setup.md @@ -0,0 +1,75 @@ +# MIL-001 Project setup + +## Metadata +| Key | Value | +| --- | --- | +| ID | MIL-001 | +| CrossReference | [BC-001] | +| Language | en | +| Domain | it | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Purpose + +Decide whether the repository is configured well enough to start writing the Selenium code: project configuration, folder structure, constants, tooling, documentation skeleton and repository metadata. + +## Deliverable + +A repository on branch `mil-001-project-setup` with `pyproject.toml`, the `src/` and `tests/` skeleton, `constants.py`, a Python `.gitignore`, a `Doxyfile`, the README 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 | `python -m venv .venv`, `python -m pip install --upgrade pip` and `pip install -e ".[dev]"` succeed on Python 3.13 | All three succeed | Any fails | +| 2 | `pytest` runs and exits 0 on the skeleton | Exit 0 | Non-zero | +| 3 | `[project] dependencies` lists only selenium | Only selenium | Any other runtime dependency | +| 4 | The git host shows a description and at least 5 topics | Both present | Either missing | +| 5 | `.env` is ignored and is not read by any file under `src/` or `tests/` | `git check-ignore .env` succeeds; no match for `.env` in code | Otherwise | +| 6 | The code review record against `QC-PY-001` is `Go` | Go | No-Go | + +## Dependencies + +| Depends on | Reason | +| --- | --- | +| None | First gateway; the Business Case, Stakeholder Analysis and Project Plan are accepted before it starts | + +## Traceability + +| Business Case objective / KPI / user story | Reference | +| --- | --- | +| Objective 5 (repository configuration) | [BC-001] | +| Success criteria 4 and 5 | [BC-001] | + +## Ownership + +| Role | Stakeholder ID (SA) | +| --- | --- | +| Owner | S01 | +| Approving reviewer | S01 | + +## Target Date + +2026-10-29 β€” inside the one-week window of the Business Case. + +## Tasks + +| # | Task | Summary | Needs its own Use Case/User Story? | Reference | +| --- | --- | --- | --- | --- | +| 1 | Set repository description and topics | Set a short description and topics (python, selenium, udemy, 100-days-of-code, web-automation, pytest) on the git host through its API. The token is read from the shell environment loaded from `.env` by the operator and is never printed, committed, tested or imported by the project (CN-005). | No | | +| 2 | Add Python .gitignore | Add a Python `.gitignore` that also ignores `.venv/`, `.env`, build output, caches and generated Doxygen output so that no secret or artifact is committed (CN-005). | No | | +| 3 | Create pyproject.toml and package layout | Configure the project in `pyproject.toml` with `requires-python = ">=3.13"`, selenium as the only runtime dependency, pytest as a `dev` extra, and the `src/fill_out_form/` and `tests/` folders (CN-006). | No | | +| 4 | Create constants.py | Put every URL, selector, link text, search term, field value and timeout in `constants.py` so the logic has no magic values (CN-003). | No | | +| 5 | Add Doxyfile | Add a `Doxyfile` configured for Python sources in `src/` and write Doxygen-style comments in the skeleton (CN-003). | No | | +| 6 | Write README with venv and test instructions | Create `README.md` from the framework template with how to create a local `.venv`, run `python -m pip install --upgrade pip`, install, run and test (CN-004). | No | | +| 7 | Record dependency and fixture decisions as ADR-0001 | Record that selenium is the only runtime dependency, that the form step has a local HTML fixture because the original demo site may be offline, and that browser runs happen in Docker (CN-006). | No | | + +--- + +[BC-001]: ../business-case.md diff --git a/docs/milestones/mil-002-form-automation.md b/docs/milestones/mil-002-form-automation.md new file mode 100644 index 0000000..51707a9 --- /dev/null +++ b/docs/milestones/mil-002-form-automation.md @@ -0,0 +1,76 @@ +# MIL-002 Form automation + +## Metadata +| Key | Value | +| --- | --- | +| ID | MIL-002 | +| CrossReference | [BC-001] | +| Language | en | +| Domain | it | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Purpose + +Decide whether the three lecture steps (click a link by its text, search and press Enter, fill out and submit a form) work, are tested, and have screenshots. + +## Deliverable + +Branch `mil-002-form-automation` with the `fill_out_form` package, a runnable entry point, pytest tests, a local form fixture, and one screenshot per lecture step in `docs/images/`, captured in Docker. + +## Go / No-Go Criteria + +| # | Criterion (objectively checkable) | Go | No-Go | +| --- | --- | --- | --- | +| 1 | `pytest` exits 0 on the host without a browser | Exit 0 | Non-zero | +| 2 | The Docker end-to-end run exits 0 and writes three screenshots | Exit 0 and three PNG files | Otherwise | +| 3 | Every selector, URL and text is defined in `constants.py` | No literal selector or URL elsewhere under `src/` | Any found | +| 4 | Public functions carry Doxygen comments | All public functions | Any missing | +| 5 | The code review record against `QC-PY-001` is `Go` | Go | No-Go | + +## Dependencies + +| Depends on | Reason | +| --- | --- | +| [MIL-001] | Needs the project configuration, constants file and tooling | + +## Traceability + +| Business Case objective / KPI / user story | Reference | +| --- | --- | +| Objectives 1 and 2 | [BC-001] | +| Success criteria 1 and 2 | [BC-001] | + +## Ownership + +| Role | Stakeholder ID (SA) | +| --- | --- | +| Owner | S01 | +| Approving reviewer | S01 | + +## Target Date + +2026-11-01 β€” inside the one-week window of the Business Case. + +## Tasks + +| # | Task | Summary | Needs its own Use Case/User Story? | Reference | +| --- | --- | --- | --- | --- | +| 1 | Implement driver factory | Create `create_driver` that returns a Chrome WebDriver, headless when requested, so the same code runs on a desktop-less Docker container (CN-002). | No | | +| 2 | Implement click_link_by_text | Open the Wikipedia main page and click the link whose text is "Content portals" with `By.LINK_TEXT`, as the lecture shows (CN-002, CN-003). | No | | +| 3 | Implement search_for | Find the search input by its `name` attribute, type "Python" and press `Keys.ENTER` (CN-002, CN-003). | No | | +| 4 | Implement fill_out_form | Find first name, last name and email fields with CSS selectors, type the values from `constants.py` and click the sign-up button (CN-002, CN-003). | No | | +| 5 | Add the main entry point | Add `python -m fill_out_form` that runs the three steps in order and optionally saves a screenshot after each step (CN-004, CN-007). | No | | +| 6 | Add local form fixture and unit tests | Add an HTML form fixture with the same field names and pytest tests that use a fake driver for the logic and need no browser (CN-002). | No | | +| 7 | Run end-to-end in Docker and capture screenshots | Run the three steps in a headless Chrome Docker container with a shared results folder (Docker container; never the host desktop) and save one screenshot per step to `docs/images/` (CN-007). | No | | +| 8 | Review code against the Python checklist | Review `src/` and `tests/` against `qc-programming-python` and record the `RC-*` before the pull request. | No | | + +--- + +[BC-001]: ../business-case.md +[MIL-001]: ./mil-001-project-setup.md diff --git a/docs/milestones/mil-003-documentation.md b/docs/milestones/mil-003-documentation.md new file mode 100644 index 0000000..99cf586 --- /dev/null +++ b/docs/milestones/mil-003-documentation.md @@ -0,0 +1,73 @@ +# MIL-003 Documentation and wiki + +## Metadata +| Key | Value | +| --- | --- | +| ID | MIL-003 | +| CrossReference | [BC-001] | +| Language | en | +| Domain | it | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Purpose + +Decide whether the project is explained well enough for course participants and GitHub viewers: a README with screenshots and a wiki in three languages describing what each lecture step teaches. + +## Deliverable + +Branch `mil-003-documentation` with the finished `README.md` showing the screenshots, and the wiki in `docs/wiki/` in English, Danish and Bahasa Malaysia with the same page set and screenshots. + +## Go / No-Go Criteria + +| # | Criterion (objectively checkable) | Go | No-Go | +| --- | --- | --- | --- | +| 1 | The README shows one screenshot per lecture step and `check-readme.sh` passes | Both | Either fails | +| 2 | Every English wiki page has a `-da` and a `-ms` twin | Same page set in 3 languages | A page is missing | +| 3 | Each language line links to the other two languages | All links present | Any missing | +| 4 | Each wiki page explains what was gained in its lecture step | One section per step | Any missing | +| 5 | The review record of the wiki against the rules of `framework/process/wiki.md` is `Go` | Go | No-Go | + +## Dependencies + +| Depends on | Reason | +| --- | --- | +| [MIL-002] | Needs the working code and the screenshots | + +## Traceability + +| Business Case objective / KPI / user story | Reference | +| --- | --- | +| Objectives 3 and 4 | [BC-001] | +| Success criteria 2, 3 and 6 | [BC-001] | + +## Ownership + +| Role | Stakeholder ID (SA) | +| --- | --- | +| Owner | S01 | +| Approving reviewer | S01 | + +## Target Date + +2026-11-04 β€” the last day of the one-week window of the Business Case. + +## Tasks + +| # | Task | Summary | Needs its own Use Case/User Story? | Reference | +| --- | --- | --- | --- | --- | +| 1 | Finish README with screenshots | Add the three lecture-step screenshots, the run and test instructions and the appendix of project documents to `README.md` (CN-004, CN-007). | No | | +| 2 | Write English wiki | Write `Home`, one page per lecture step ("Link click", "Search", "Form") and `_Sidebar` in `docs/wiki/`, each explaining what was gained and showing the screenshot (CN-007). | No | | +| 3 | Write Danish wiki | Translate every English wiki page into Danish as `-da.md`, keeping code, commands and file names in English (CN-007). | No | | +| 4 | Write Bahasa Malaysia wiki | Translate every English wiki page into Bahasa Malaysia as `-ms.md`, keeping code, commands and file names in English (CN-007). | No | | +| 5 | Review wiki against the wiki rules | Review the three wiki languages against `framework/process/wiki.md` (no checklist exists for a wiki) and record the `RC-*` before the pull request. | No | | + +--- + +[BC-001]: ../business-case.md +[MIL-002]: ./mil-002-form-automation.md diff --git a/docs/project-plan.md b/docs/project-plan.md new file mode 100644 index 0000000..8541080 --- /dev/null +++ b/docs/project-plan.md @@ -0,0 +1,91 @@ +# 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-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Purpose + +This plan schedules three gateways that deliver the Day 48 Selenium form project within the one-week constraint of [BC-001]. + +## Planning Assumptions + +- Week 1 starts 2026-10-28; the plan ends 2026-11-04, per the Business Case constraint. +- Phase length: one to four days, one pull request per phase ([SA-001] concern CN-001). +- The AI works in autonomous mode after the user accepts this plan. + +## Gateway Schedule + +| Gateway | Document | Window | Decision date | Owner | Stories | Main deliverable | Milestone | +| --- | --- | --- | --- | --- | --- | --- | --- | +| Project setup | [MIL-001] | 2026-10-28 to 2026-10-29 | 2026-10-29 | S01 | none (technical tasks) | Configured repository, skeleton, README, ADR | [M-282] | +| Form automation | [MIL-002] | 2026-10-30 to 2026-11-01 | 2026-11-01 | S01 | none (technical tasks) | Code, tests and screenshots for the three lecture steps | [M-283] | +| Documentation and wiki | [MIL-003] | 2026-11-02 to 2026-11-04 | 2026-11-04 | S01 | none (technical tasks) | README with screenshots and a three-language wiki | [M-284] | + +```plantuml +@startgantt +Project starts 2026-10-28 +[Project setup] starts 2026-10-28 and ends 2026-10-29 +[Project setup Go/No-Go] happens 2026-10-29 +[Form automation] starts 2026-10-30 and ends 2026-11-01 +[Form automation Go/No-Go] happens 2026-11-01 +[Documentation and wiki] starts 2026-11-02 and ends 2026-11-04 +[Documentation and wiki Go/No-Go] happens 2026-11-04 +@endgantt +``` + +## Scope Coverage + +| Business Case scope item | Gateway | +| --- | --- | +| Python package under `src/`, tests, constants | [MIL-002] | +| `pyproject.toml`, venv instructions, `.gitignore`, Doxyfile | [MIL-001] | +| README from the framework template | [MIL-001] (skeleton), [MIL-003] (final) | +| Wiki in English, Danish and Bahasa Malaysia | [MIL-003] | +| Screenshots for each lecture step | [MIL-002] (capture), [MIL-003] (use) | +| Repository description and topics | [MIL-001] | + +## Dependencies + +``` +MIL-001 β†’ MIL-002 β†’ MIL-003 +``` + +A No-Go on a gateway delays every later gateway by the days needed for rework. Only S01 may move the end date 2026-11-04. + +## Plan Risks + +| Risk | Impact | Mitigation | +| --- | --- | --- | +| The Docker browser run fails | MIL-002 and MIL-003 slip | Fix the image or configuration; stop and report after three failed attempts on one cause | +| Translation takes longer than planned | MIL-003 slips | English is written first; translations follow page by page | +| The git host token lacks scope | Description and topics cannot be set | Stop and report; S01 supplies a token with repository scope | + +## Open Issues + +- The assignment gives no function names. The plan uses `create_driver`, `click_link_by_text`, `search_for` and `fill_out_form`; S01 may rename them at review. +- The assignment's original form URL is not confirmed to be online; a local fixture is used and the original URL is kept as a constant. +- The repository URL in the request (`Tirsvad-Udemy-100_days_of_code`) differs from `origin` (`Tirsvad-Udemy-100-days-of-code/048-fill-out-form`); the plan uses `origin`. +- No governance document, dictionary or traceability matrix exists yet; the README appendix lists only existing documents. + +--- + +[BC-001]: ./business-case.md +[SA-001]: ./stakeholder-analysis.md +[MIL-001]: ./milestones/mil-001-project-setup.md +[MIL-002]: ./milestones/mil-002-form-automation.md +[MIL-003]: ./milestones/mil-003-documentation.md +[M-282]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/282 +[M-283]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/283 +[M-284]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/284 diff --git a/docs/sqa/reviews/rc-001-business-case.md b/docs/sqa/reviews/rc-001-business-case.md new file mode 100644 index 0000000..e00bd86 --- /dev/null +++ b/docs/sqa/reviews/rc-001-business-case.md @@ -0,0 +1,67 @@ +# SQA Review Record: BC-001 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-001 | +| CrossReference | [BC-001], [QC-BC-001], [QC-LANG-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [BC-001] +- Checklist used: [QC-BC-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the IT domain) +- Mode: autonomous, not independent (reviewer: AI as stand-in for S01) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | ROI/Cost-Benefit analysis is quantitative, or where qualitative, is explicitly justified | Pass | Cost-Benefit is qualitative and says why (unpaid learning work, no revenue). | +| 2 | Risks are identified with documented impact and mitigation | Pass | Five risks, each with impact and mitigation. | +| 3 | Success criteria are measurable, stating explicit targets rather than vague aspirations | Pass | Six success criteria, each with a target and a measure. | +| 4 | Scope explicitly separates In Scope vs Out of Scope | Pass | Separate `### In Scope` and `### Out of Scope` sections. | +| 5 | Stakeholders are cross-referenced to Stakeholder Analysis IDs rather than re-described inline | Pass | Stakeholders table cites S01, S02, S03 and CN-IDs only. | +| 6 | Methodology and quality-standard foundation are stated explicitly (e.g. ISO/IEC 25010, Larman) | Pass | Foundation section names the framework, ISO/IEC 25010:2023, coding conventions. | +| 7 | Assumptions and constraints are explicit and clearly distinguished from one another | Pass | Separate Assumptions and Constraints lists. | +| 8 | Document supports executive decision-making with a clear, unambiguous recommendation | Pass | Recommendation: Proceed, one sentence. | + +## 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 BCP 47; `it` is in the registry domain list. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | No translated twin exists beside the document. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[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 diff --git a/docs/sqa/reviews/rc-002-stakeholder-analysis.md b/docs/sqa/reviews/rc-002-stakeholder-analysis.md new file mode 100644 index 0000000..36d648c --- /dev/null +++ b/docs/sqa/reviews/rc-002-stakeholder-analysis.md @@ -0,0 +1,68 @@ +# SQA Review Record: SA-001 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-002 | +| CrossReference | [SA-001], [QC-SA-001], [QC-LANG-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [SA-001] +- Checklist used: [QC-SA-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the IT domain) +- Mode: autonomous, not independent (reviewer: AI as stand-in for S01) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Power/Interest grid is filled for every stakeholder, with no gaps or unclassified entries | Pass | S01, S02, S03 all have power, interest and quadrant. | +| 2 | Each stakeholder is assigned a unique, stable ID (e.g. S01-S11 style) reusable for RACI assignments in other artifacts | Pass | Stable IDs S01-S03. | +| 3 | Roles and organizational context are defined with explicit Power and Interest levels, not just narrative description | Pass | Role, organisation, power and interest in the summary table. | +| 4 | Communication needs (channel, frequency, deliverable type) are mapped to project phases or milestones | Pass | Communication table C-01 to C-03 maps to milestones. | +| 5 | Conflicting stakeholder interests are identified with documented mitigation or resolution strategies | Pass | Two conflicts, each with a mitigation. | +| 6 | Stakeholder concerns are explicitly traced to Business Case objectives | Pass | Traceability table cites BC-001 objectives. | +| 7 | Primary concerns are expressed in both business language and a recognized quality-attribute mapping (e.g. FURPS+) | Pass | Concern register maps each concern to a FURPS+ attribute. | +| 8 | Document is understandable and navigable by non-technical stakeholders reviewing their own entry | Pass | Short entries in plain language. | +| 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 the stakeholder who raised it. | + +## 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 BCP 47; `it` is in the registry domain list. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | No translated twin exists beside the document. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[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 diff --git a/docs/sqa/reviews/rc-003-project-plan.md b/docs/sqa/reviews/rc-003-project-plan.md new file mode 100644 index 0000000..38bc554 --- /dev/null +++ b/docs/sqa/reviews/rc-003-project-plan.md @@ -0,0 +1,74 @@ +# SQA Review Record: PP-001 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-003 | +| CrossReference | [PP-001], [QC-PP-001], [QC-LANG-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [PP-001] +- Checklist used: [QC-PP-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows the IT domain) +- Mode: autonomous, not independent (reviewer: AI as stand-in for S01) + +## Checklist Results + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | The plan states its start date, end date and the constraint it must fit | Pass | Start 2026-10-28, end 2026-11-04, the one-week constraint of BC-001. | +| 2 | Every milestone or gateway is listed once with its document, decision date and owner | Pass | Three gateways, each with its MIL document, decision date and owner. | +| 3 | Every decision date lies inside the plan's window and is consistent with the dates in the linked `MIL-*` document | Pass | Decision dates equal the MIL target dates (10-29, 11-01, 11-04) and lie inside the window. | +| 4 | Every in-scope item of the Business Case is delivered at a named gateway (scope coverage) | Pass | Scope Coverage table maps every in-scope item to a gateway. | +| 5 | Dependencies between gateways are stated, acyclic and consistent with the schedule order | Pass | Chain MIL-001 to MIL-002 to MIL-003, in schedule order. | +| 6 | The plan states what happens to later gateways and to the end date when a gateway is No-Go | Pass | States the delay and that only S01 moves the end date. | +| 7 | Owners, reviewers and escalation roles use Stakeholder Analysis IDs and match the governance RACI | Pass | Owners are S-IDs. No governance document exists yet, so no RACI to match; recorded in Open Issues. | +| 8 | Planning assumptions are listed with their source, and a changed baseline is recorded with its reason | Pass | Assumptions cite BC-001 and SA-001. | +| 9 | Plan risks are listed with impact and a mitigation, and trace to Business Case risks where they come from there | Pass | Three plan risks with impact and mitigation. | +| 10 | Open issues are listed, and none contradicts a statement elsewhere in the plan | Pass | Open issues are current and do not contradict the plan. | +| 11 | Each gateway's main deliverable is stated and matches the deliverable of its `MIL-*` document | Pass | Deliverables match the Deliverable of each MIL document. | +| 12 | Gateways that deliver user stories name them, and those that do not say why | Pass | Stories column says none (technical tasks). | +| 13 | The schedule view (table, Gantt) and the dependency view agree with each other | Pass | Table, Gantt and dependency chain agree. | +| 14 | Each gateway is linked to its issue-tracker milestone, or marked as not yet synced | Pass | Column says not yet synced; updated after the sync. | +| 15 | The plan is a singleton: one Project Plan per project, changes recorded in Version History | Pass | Single plan, Version History kept. | + +## 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 BCP 47; `it` is in the registry domain list. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | No translated twin exists beside the document. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[PP-001]: ../../project-plan.md +[QC-PP-001]: ../../../framework/qc/artifacts/qc-project-plan.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md diff --git a/docs/sqa/reviews/rc-004-mil-001-project-setup.md b/docs/sqa/reviews/rc-004-mil-001-project-setup.md new file mode 100644 index 0000000..89971e2 --- /dev/null +++ b/docs/sqa/reviews/rc-004-mil-001-project-setup.md @@ -0,0 +1,65 @@ +# SQA Review Record: MIL-001 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-004 | +| CrossReference | [MIL-001], [QC-MIL-001], [QC-LANG-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-001] +- Checklist used: [QC-MIL-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows 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 | Pass | The Deliverable section names the branch and its files. | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go/No-Go table with objectively checkable criteria. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | Dependencies table. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability cites BC-001 objectives and success criteria. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Owner and approving reviewer are S01. | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | Target date lies in 2026-10-28 to 2026-11-04. | + +## 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 BCP 47; `it` is in the registry domain list. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | No translated twin exists beside the document. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[MIL-001]: ../../milestones/mil-001-project-setup.md +[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md diff --git a/docs/sqa/reviews/rc-005-mil-002-form-automation.md b/docs/sqa/reviews/rc-005-mil-002-form-automation.md new file mode 100644 index 0000000..61613d5 --- /dev/null +++ b/docs/sqa/reviews/rc-005-mil-002-form-automation.md @@ -0,0 +1,65 @@ +# SQA Review Record: MIL-002 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-005 | +| CrossReference | [MIL-002], [QC-MIL-001], [QC-LANG-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-002] +- Checklist used: [QC-MIL-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows 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 | Pass | The Deliverable section names the branch and its files. | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go/No-Go table with objectively checkable criteria. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | Dependencies table. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability cites BC-001 objectives and success criteria. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Owner and approving reviewer are S01. | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | Target date lies in 2026-10-28 to 2026-11-04. | + +## 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 BCP 47; `it` is in the registry domain list. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | No translated twin exists beside the document. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[MIL-002]: ../../milestones/mil-002-form-automation.md +[QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md +[QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md diff --git a/docs/sqa/reviews/rc-006-mil-003-documentation.md b/docs/sqa/reviews/rc-006-mil-003-documentation.md new file mode 100644 index 0000000..dc47e0e --- /dev/null +++ b/docs/sqa/reviews/rc-006-mil-003-documentation.md @@ -0,0 +1,65 @@ +# SQA Review Record: MIL-003 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-006 | +| CrossReference | [MIL-003], [QC-MIL-001], [QC-LANG-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-003] +- Checklist used: [QC-MIL-001] +- Scope: full review +- Language and domain: en / it +- Language reviewer: none (the reviewer reads English and knows 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 | Pass | The Deliverable section names the branch and its files. | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Go/No-Go table with objectively checkable criteria. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | Dependencies table. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Traceability cites BC-001 objectives and success criteria. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Owner and approving reviewer are S01. | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | Target date lies in 2026-10-28 to 2026-11-04. | + +## 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 BCP 47; `it` is in the registry domain list. | +| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English. | +| 4 | The register matches the one the registry gives for the artifact type | Pass | IT Executive English for BC, PP and MIL; IT Professional English for SA, as the registry states. | +| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | No `DICT` exists yet; only standard IT terms are used, with no synonyms for one concept. | +| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Keys, headings, IDs and statuses are English. | +| 7 | No translated twin (`..md`) exists beside the document | Pass | No translated twin exists beside the document. | +| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | N-A | First version: no earlier accepted version, so no language change. | +| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | The reviewer (AI as stand-in for S01) reads English and knows the IT domain; not independent. | +| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | Abbreviations (ADR, PO, CI, FURPS+) are known to the audience or spelled out. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[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 diff --git a/docs/sqa/reviews/rc-007-adr-0001.md b/docs/sqa/reviews/rc-007-adr-0001.md new file mode 100644 index 0000000..c174edb --- /dev/null +++ b/docs/sqa/reviews/rc-007-adr-0001.md @@ -0,0 +1,54 @@ +# SQA Review Record: ADR-0001 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-007 | +| CrossReference | [ADR-0001], [QC-ADR-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [ADR-0001] +- Checklist used: [QC-ADR-001] +- Scope: full review +- Language and domain: n/a (technical type) +- Language reviewer: none +- Mode: autonomous, not independent (reviewer: AI as stand-in for S01) + +## 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 matches the filename adr-0001; first and only ADR. | +| 2 | Context states the problem, the forces (cost, risk, constraints) and the options evaluated | Pass | Context gives the problem, forces and three options (a, b, c). | +| 3 | At least two options were considered, or the absence of alternatives is justified | Pass | Three options considered. | +| 4 | Decision is stated in one or two unhedged sentences and matches one of the evaluated options | Pass | Decision is two sentences and is option (c) without the helper libraries of (a). | +| 5 | Consequences list both Positive and Negative outcomes | Pass | Positive and Negative lists present. | +| 6 | Quality-attribute impacts (performance, security, portability, etc.) are named where the decision affects them | Pass | Portability (Docker), security (no .env read) and dependency footprint are named. | +| 7 | Affected Artifacts are listed as links, and each is also in CrossReference | Pass | BC-001 is listed in Affected Artifacts and in CrossReference. | +| 8 | Status changes are recorded as new Version History rows with a Change summary and Commit link; retained rows are never rewritten | Pass | One row, commit link resolved after the commit. | +| 9 | A superseded or deprecated ADR names its successor, and the successor links back | Pass | Not superseded. | +| 10 | Written in business or technical language of the domain, with no unexplained abbreviations | Pass | Plain technical language. | +| 11 | Status is one of `Proposed`, `Accepted`, `Rejected`, `Deprecated` or `Superseded by ADR-NNNN`, and every Version History row uses only these | Pass | Status Accepted is an allowed value. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[ADR-0001]: ../../adr/adr-0001-dependencies-fixture-docker.md +[QC-ADR-001]: ../../../framework/qc/artifacts/qc-adr.md diff --git a/docs/sqa/reviews/rc-008-code-mil-001.md b/docs/sqa/reviews/rc-008-code-mil-001.md new file mode 100644 index 0000000..5ad53b1 --- /dev/null +++ b/docs/sqa/reviews/rc-008-code-mil-001.md @@ -0,0 +1,61 @@ +# SQA Review Record: code of MIL-001 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-008 | +| CrossReference | [MIL-001], [QC-PY-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-001] +- Checklist used: [QC-PY-001] +- Scope: full review +- Language and domain: n/a (technical type) +- Language reviewer: none +- 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`) | Pass | Names are snake_case, UPPER_SNAKE for constants, PascalCase for classes. | +| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes | Pass | Names state purpose (`LINK_TEXT_CONTENT_PORTALS`, `SEARCH_TERM`). | +| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions | Pass | `ruff check` and `ruff format --check` pass. | +| 4 | Every function and method signature is type-annotated, including `-> None` | Pass | `mypy --strict` passes; the test function is annotated `-> None`. | +| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) | Pass | No exception handling in the skeleton. | +| 6 | No mutable default arguments and no shadowed builtins | Pass | No mutable defaults and no shadowed builtins. | +| 7 | Files, locks and connections are managed with context managers | Pass | No files or connections in the skeleton. | +| 8 | Public modules, classes and functions have docstrings that say what, not how | Pass | Every module has a docstring with Doxygen commands. | +| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output | Pass | No output or logging in the skeleton; no secrets. | +| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded | N-A | N-A: no Design Class Diagram exists; the tasks are plain technical tasks. | +| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network | Pass | `tests/unit/test_constants.py` guards the constants against Selenium; offline. | +| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment | Pass | `mypy --strict` runs without errors. | +| 13 | Dependencies are declared and pinned in the project's dependency file, none unused | Pass | `selenium>=4.25,<5` is the only runtime dependency, used by the tests and the next milestone. | +| 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 | Pass | Every URL, locator and text is defined once in `constants.py`. | +| 15 | Imports point inward: business-rule modules import no framework, database, UI or delivery-mechanism code, and there are no import cycles | Pass | The layer packages exist; no module imports an outer layer. | +| 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 | Pass | No class yet; modules have one purpose each. | +| 17 | Source is laid out in the layers and folders of the clean architecture folder structure (`domain`, `application`, `infrastructure`, `presentation` packages under `src/`, and `unit`, `integration` and `e2e` under `tests/`), in `snake_case`, and imports between the layers point inward | Pass | `domain`, `application`, `infrastructure` and `presentation` under `src/fill_out_form/`; `unit`, `e2e` and `fixtures` under `tests/`. | +| 18 | File and folder names are English, contain no space and no character outside letters, digits, `-`, `_` and `.`, and follow the casing of the language for files | Pass | All names are English, without space, in the allowed characters. | + +## Overall Verdict + +Go β€” every Mandatory criterion passes; no blocking finding. Reviewed files: skeleton under src/ and tests/ of MIL-001. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | S01 | n/a | + +--- + +[MIL-001]: ../../milestones/mil-001-project-setup.md +[QC-PY-001]: ../../../framework/qc/code/qc-programming-python.md diff --git a/docs/sqa/traceability-matrix.md b/docs/sqa/traceability-matrix.md new file mode 100644 index 0000000..f576d64 --- /dev/null +++ b/docs/sqa/traceability-matrix.md @@ -0,0 +1,72 @@ +# Traceability Matrix + +## Metadata +| Key | Value | +| --- | --- | +| ID | TM-001 | +| CrossReference | [BC-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## 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) | +| --- | --- | --- | --- | --- | --- | --- | +| [BC-001] | BC | en | it | - | [SA-001], [PP-001] | [RC-001] | +| [SA-001] | SA | en | it | [BC-001] | [PP-001] | [RC-002] | +| [PP-001] | PP | en | it | [BC-001], [SA-001] | [MIL-001], [MIL-002], [MIL-003] | [RC-003] | +| [MIL-001] | MIL | en | it | [PP-001] | [MIL-002], [ADR-0001] | [RC-004], [RC-008] (code) | +| [MIL-002] | MIL | en | it | [MIL-001] | [MIL-003] | [RC-005] | +| [MIL-003] | MIL | en | it | [MIL-002] | - | [RC-006] | +| [ADR-0001] | ADR | - | - | [BC-001], [MIL-001] | - | [RC-007] | + +## Concern Coverage + +| Concern (CN-ID) | Views that answer it | Decisions (ADR) | Quality check (TP) | Status | +| --- | --- | --- | --- | --- | +| CN-001 | [PP-001], [MIL-001], [MIL-002], [MIL-003] | - | - | Covered | +| CN-002 | [MIL-002] | - | - | Covered | +| CN-003 | [MIL-001], [MIL-002] | - | - | Covered | +| CN-004 | [MIL-001], [MIL-003] | - | - | Covered | +| CN-005 | [MIL-001] | - | - | Covered | +| CN-006 | [MIL-001] | [ADR-0001] | - | Covered | +| CN-007 | [MIL-002], [MIL-003] | - | - | Covered | + +## Open Inconsistencies + +| # | Views | Inconsistency | Found in (RC-ID) | Status | Resolved in | +| --- | --- | --- | --- | --- | --- | + +## Coverage Notes + +- No instance exists yet of the other artifact types (KPI, BMC, BPMN, UCD, US, UC, design artifacts, TP, GOV, DICT); the tasks of all milestones are plain technical tasks. +- `-` in Upstream means foundational; in Downstream it means nothing is built on it yet. + +--- + +[BC-001]: ../business-case.md +[SA-001]: ../stakeholder-analysis.md +[PP-001]: ../project-plan.md +[MIL-001]: ../milestones/mil-001-project-setup.md +[MIL-002]: ../milestones/mil-002-form-automation.md +[MIL-003]: ../milestones/mil-003-documentation.md +[RC-001]: ./reviews/rc-001-business-case.md +[RC-002]: ./reviews/rc-002-stakeholder-analysis.md +[RC-003]: ./reviews/rc-003-project-plan.md +[RC-004]: ./reviews/rc-004-mil-001-project-setup.md +[RC-005]: ./reviews/rc-005-mil-002-form-automation.md +[RC-006]: ./reviews/rc-006-mil-003-documentation.md +[ADR-0001]: ../adr/adr-0001-dependencies-fixture-docker.md +[RC-007]: ./reviews/rc-007-adr-0001.md +[RC-008]: ./reviews/rc-008-code-mil-001.md diff --git a/docs/stakeholder-analysis.md b/docs/stakeholder-analysis.md new file mode 100644 index 0000000..18591e2 --- /dev/null +++ b/docs/stakeholder-analysis.md @@ -0,0 +1,80 @@ +# Stakeholder Analysis + +## Metadata +| Key | Value | +| --- | --- | +| ID | SA-001 | +| CrossReference | [BC-001] | +| Language | en | +| Domain | it | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | + +--- + +## Purpose + +This analysis names the people who care about the project, so that owners, reviewers and concerns can be cited by ID. It uses the power/interest grid and maps each concern to a FURPS+ attribute. It supports [BC-001]. + +## 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 | Private | HIGH | HIGH | Manage Closely | A tidy, correct and well documented solution for the course portfolio | +| S02 | Udemy coursists | Course participants who share and compare solutions | Udemy community | LOW | HIGH | Keep Informed | Readable, runnable code with the assignment's function names, and README instructions to run it | +| S03 | GitHub viewers | Visitors who browse the repository for ideas | Public | LOW | MEDIUM | Monitor | A clear repository description, topics and README, and no unnecessary runtime dependencies | + +## Power/Interest Classification Rationale + +- **Manage Closely (S01):** decides scope, reviews and accepts every artifact. +- **Keep Informed (S02):** cannot change the project, but whether they can run the code decides whether it is useful. They get the README and the wiki. +- **Monitor (S03):** casual visitors, served by the repository metadata and the README. + +## Primary Concerns and FURPS+ Mapping + +| Concern ID | Stakeholder | Concern | FURPS+ attribute | +| --- | --- | --- | --- | +| CN-001 | S01 | Every change is planned, reviewed and traceable by pull request | Supportability | +| CN-002 | S01 | The code is correct for all three lecture steps and tested | Functionality | +| CN-003 | S02 | The code is readable and uses the assignment's function names | Usability | +| CN-004 | S02 | The README tells how to create the venv, run the code and run the tests | Usability | +| CN-005 | S03 | The repository has a description, topics and a clear README | Usability | +| CN-006 | S03 | No runtime dependency except the one that is necessary | Supportability | +| CN-007 | S01 | Each lecture step has a screenshot and a wiki text in three languages | Usability | + +## Communication Requirements + +| ID | Channel | Frequency | Deliverable | Phase / Milestone | +| --- | --- | --- | --- | --- | +| C-01 | Chat with S01 | At plan acceptance and at the end of the run | Plan; run summary | All | +| C-02 | Pull request | One per milestone | Changes and review records | MIL-001, MIL-002, MIL-003 | +| C-03 | README and wiki | At each milestone that changes them | Instructions, screenshots, explanations | MIL-003 | + +## Conflicting Interests and Mitigations + +| Conflict | Stakeholders | Mitigation | +| --- | --- | --- | +| S02 wants the assignment's names; clean code conventions may prefer others | S01, S02 | Public functions keep the lecture's names; internals follow the conventions | +| S01 wants documentation in three languages; S03 wants brevity | S01, S03 | The README stays 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-007 | [BC-001] objectives 3 and 4 | +| S02 | CN-003, CN-004 | [BC-001] objectives 1 and 3 | +| S03 | CN-005, CN-006 | [BC-001] objective 5 | + +## Sign-Off + +Pending review. In autonomous mode the AI stands in for S01 as reviewer; the review record says "not independent". + +--- + +[BC-001]: ./business-case.md diff --git a/framework b/framework new file mode 160000 index 0000000..7c27919 --- /dev/null +++ b/framework @@ -0,0 +1 @@ +Subproject commit 7c2791939c42c18ec444bce245e9a3958b242cae diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..fdf0ff5 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,51 @@ +[build-system] +requires = ["setuptools>=68"] +build-backend = "setuptools.build_meta" + +[project] +name = "fill-out-form" +version = "0.1.0" +description = "Udemy 100 Days of Code, Day 48: automate links, search and a sign-up form with Selenium." +readme = "README.md" +requires-python = ">=3.13" +license = "AGPL-3.0-only" +license-files = ["LICENSE"] +authors = [{ name = "Jens Tirsvad Nielsen" }] +keywords = ["selenium", "udemy", "100-days-of-code", "web-automation"] +dependencies = [ + "selenium>=4.25,<5", +] + +[project.optional-dependencies] +dev = [ + "pytest>=8", + "ruff>=0.6", + "mypy>=1.11", +] + +[project.scripts] +fill-out-form = "fill_out_form.presentation.cli:main" + +[tool.setuptools.packages.find] +where = ["src"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +pythonpath = ["src"] +markers = ["e2e: runs a real browser; only inside the Docker container"] +addopts = "-m 'not e2e'" + +[tool.ruff] +line-length = 88 +src = ["src", "tests"] + +[tool.ruff.lint] +select = ["E", "F", "I", "B", "UP", "D"] +ignore = ["D203", "D213"] + +[tool.ruff.lint.per-file-ignores] +"tests/**" = ["D"] + +[tool.mypy] +strict = true +mypy_path = "src" diff --git a/src/fill_out_form/__init__.py b/src/fill_out_form/__init__.py new file mode 100644 index 0000000..702aad6 --- /dev/null +++ b/src/fill_out_form/__init__.py @@ -0,0 +1,7 @@ +"""Day 48 of the Udemy 100 Days of Code course: fill out a form with Selenium. + +@file __init__.py +@brief Day 48 of the Udemy "100 Days of Code" course: fill out a form with Selenium. +""" + +__version__ = "0.1.0" diff --git a/src/fill_out_form/application/__init__.py b/src/fill_out_form/application/__init__.py new file mode 100644 index 0000000..7be32fc --- /dev/null +++ b/src/fill_out_form/application/__init__.py @@ -0,0 +1,5 @@ +"""Application layer: the lecture steps, written against a small browser port. + +@file __init__.py +@brief Application layer: the lecture steps, written against a small browser port. +""" diff --git a/src/fill_out_form/constants.py b/src/fill_out_form/constants.py new file mode 100644 index 0000000..d39ae0f --- /dev/null +++ b/src/fill_out_form/constants.py @@ -0,0 +1,51 @@ +"""Every URL, locator, text and timing value of the lecture, defined once. + +@file constants.py +@brief Every URL, locator, text and timing value of the lecture, defined once. + +The locator strategies are the plain strings that Selenium's `By` class holds +(`By.LINK_TEXT == "link text"`); a unit test guards that they stay equal, so +the application layer does not need to import Selenium. +""" + +# --- Pages ----------------------------------------------------------------- +WIKIPEDIA_URL = "https://en.wikipedia.org/wiki/Main_Page" +FORM_URL = "https://secure-retreat-92358.herokuapp.com/" + +# --- Locator strategies (equal to selenium.webdriver.common.by.By) ---------- +BY_LINK_TEXT = "link text" +BY_NAME = "name" +BY_CSS_SELECTOR = "css selector" + +# --- Lecture step 1: click a link by its text ------------------------------- +LINK_TEXT_CONTENT_PORTALS = "Content portals" + +# --- Lecture step 2: type into an input and send a special key -------------- +SEARCH_INPUT_NAME = "search" +SEARCH_TERM = "Python" +KEY_ENTER = "" # selenium.webdriver.common.keys.Keys.ENTER + +# --- Lecture step 3: fill out the form (challenge) -------------------------- +FIRST_NAME_SELECTOR = "input[name='fName']" +LAST_NAME_SELECTOR = "input[name='lName']" +EMAIL_SELECTOR = "input[name='email']" +SIGN_UP_BUTTON_SELECTOR = "form button" +DEFAULT_FIRST_NAME = "Jane" +DEFAULT_LAST_NAME = "Doe" +DEFAULT_EMAIL = "jane.doe@example.com" + +# --- Browser ---------------------------------------------------------------- +PAUSE_SECONDS = 2.0 +WINDOW_SIZE = "1280,900" +CHROME_BINARY_ENV = "CHROME_BIN" +HEADLESS_ARGUMENTS = ( + "--headless=new", + "--no-sandbox", + "--disable-dev-shm-usage", +) + +# --- Screenshots (one per lecture step) --------------------------------------- +SCREENSHOT_STEP_1 = "step-1-click-link.png" +SCREENSHOT_STEP_2 = "step-2-search.png" +SCREENSHOT_STEP_3_FILLED = "step-3-form-filled.png" +SCREENSHOT_STEP_3_SIGNED_UP = "step-3-form-signed-up.png" diff --git a/src/fill_out_form/domain/__init__.py b/src/fill_out_form/domain/__init__.py new file mode 100644 index 0000000..39e2940 --- /dev/null +++ b/src/fill_out_form/domain/__init__.py @@ -0,0 +1,5 @@ +"""Domain layer: the values the lecture types into the form. + +@file __init__.py +@brief Domain layer: the values the lecture types into the form. +""" diff --git a/src/fill_out_form/infrastructure/__init__.py b/src/fill_out_form/infrastructure/__init__.py new file mode 100644 index 0000000..6fd8a79 --- /dev/null +++ b/src/fill_out_form/infrastructure/__init__.py @@ -0,0 +1,5 @@ +"""Infrastructure layer: the Selenium Chrome driver. + +@file __init__.py +@brief Infrastructure layer: the Selenium Chrome driver. +""" diff --git a/src/fill_out_form/presentation/__init__.py b/src/fill_out_form/presentation/__init__.py new file mode 100644 index 0000000..b414f99 --- /dev/null +++ b/src/fill_out_form/presentation/__init__.py @@ -0,0 +1,5 @@ +"""Presentation layer: the command line. + +@file __init__.py +@brief Presentation layer: the command line. +""" diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/unit/test_constants.py b/tests/unit/test_constants.py new file mode 100644 index 0000000..b8a5716 --- /dev/null +++ b/tests/unit/test_constants.py @@ -0,0 +1,19 @@ +from selenium.webdriver.common.by import By +from selenium.webdriver.common.keys import Keys + +from fill_out_form import constants + + +def test_locator_strategies_equal_selenium_by() -> None: + assert constants.BY_LINK_TEXT == By.LINK_TEXT + assert constants.BY_NAME == By.NAME + assert constants.BY_CSS_SELECTOR == By.CSS_SELECTOR + + +def test_enter_key_equals_selenium_keys_enter() -> None: + assert constants.KEY_ENTER == Keys.ENTER + + +def test_urls_use_https() -> None: + assert constants.WIKIPEDIA_URL.startswith("https://") + assert constants.FORM_URL.startswith("https://") -- 2.54.0 From e67dbab0c6b93c97c6dc3feeccf687056d827458 Mon Sep 17 00:00:00 2001 From: Jens Tirsvad Nielsen Date: Wed, 28 Oct 2026 16:14:31 +0800 Subject: [PATCH 2/2] Resolve pending commit links for MIL-001 --- docs/adr/adr-0001-dependencies-fixture-docker.md | 3 ++- docs/business-case.md | 3 ++- docs/milestones/mil-001-project-setup.md | 3 ++- docs/milestones/mil-002-form-automation.md | 3 ++- docs/milestones/mil-003-documentation.md | 3 ++- docs/project-plan.md | 3 ++- docs/sqa/reviews/rc-001-business-case.md | 3 ++- docs/sqa/reviews/rc-002-stakeholder-analysis.md | 3 ++- docs/sqa/reviews/rc-003-project-plan.md | 3 ++- docs/sqa/reviews/rc-004-mil-001-project-setup.md | 3 ++- docs/sqa/reviews/rc-005-mil-002-form-automation.md | 3 ++- docs/sqa/reviews/rc-006-mil-003-documentation.md | 3 ++- docs/sqa/reviews/rc-007-adr-0001.md | 3 ++- docs/sqa/reviews/rc-008-code-mil-001.md | 3 ++- docs/sqa/traceability-matrix.md | 3 ++- docs/stakeholder-analysis.md | 3 ++- 16 files changed, 32 insertions(+), 16 deletions(-) diff --git a/docs/adr/adr-0001-dependencies-fixture-docker.md b/docs/adr/adr-0001-dependencies-fixture-docker.md index ce99a68..b991762 100644 --- a/docs/adr/adr-0001-dependencies-fixture-docker.md +++ b/docs/adr/adr-0001-dependencies-fixture-docker.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | Allowed Status values: `Proposed`, `Accepted`, `Rejected`, `Deprecated`, `Superseded by ADR-NNNN`. @@ -43,3 +43,4 @@ Selenium is the only runtime dependency (pytest, ruff and mypy are `dev` extras) --- [BC-001]: ../business-case.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/business-case.md b/docs/business-case.md index de60ed2..ddad7d2 100644 --- a/docs/business-case.md +++ b/docs/business-case.md @@ -11,7 +11,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -140,3 +140,4 @@ Proceed β€” the scope is small, the risks are mitigated and the outcome is a reu --- [SA-001]: ./stakeholder-analysis.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/milestones/mil-001-project-setup.md b/docs/milestones/mil-001-project-setup.md index b77871c..a75951c 100644 --- a/docs/milestones/mil-001-project-setup.md +++ b/docs/milestones/mil-001-project-setup.md @@ -11,7 +11,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -73,3 +73,4 @@ A repository on branch `mil-001-project-setup` with `pyproject.toml`, the `src/` --- [BC-001]: ../business-case.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/milestones/mil-002-form-automation.md b/docs/milestones/mil-002-form-automation.md index 51707a9..e2c4abd 100644 --- a/docs/milestones/mil-002-form-automation.md +++ b/docs/milestones/mil-002-form-automation.md @@ -11,7 +11,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -74,3 +74,4 @@ Branch `mil-002-form-automation` with the `fill_out_form` package, a runnable en [BC-001]: ../business-case.md [MIL-001]: ./mil-001-project-setup.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/milestones/mil-003-documentation.md b/docs/milestones/mil-003-documentation.md index 99cf586..21f10bc 100644 --- a/docs/milestones/mil-003-documentation.md +++ b/docs/milestones/mil-003-documentation.md @@ -11,7 +11,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -71,3 +71,4 @@ Branch `mil-003-documentation` with the finished `README.md` showing the screens [BC-001]: ../business-case.md [MIL-002]: ./mil-002-form-automation.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/project-plan.md b/docs/project-plan.md index 8541080..b788614 100644 --- a/docs/project-plan.md +++ b/docs/project-plan.md @@ -11,7 +11,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -89,3 +89,4 @@ A No-Go on a gateway delays every later gateway by the days needed for rework. O [M-282]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/282 [M-283]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/283 [M-284]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/milestones/284 +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-001-business-case.md b/docs/sqa/reviews/rc-001-business-case.md index e00bd86..f06a3e0 100644 --- a/docs/sqa/reviews/rc-001-business-case.md +++ b/docs/sqa/reviews/rc-001-business-case.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -65,3 +65,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. [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 +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-002-stakeholder-analysis.md b/docs/sqa/reviews/rc-002-stakeholder-analysis.md index 36d648c..30d67af 100644 --- a/docs/sqa/reviews/rc-002-stakeholder-analysis.md +++ b/docs/sqa/reviews/rc-002-stakeholder-analysis.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -66,3 +66,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. [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 +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-003-project-plan.md b/docs/sqa/reviews/rc-003-project-plan.md index 38bc554..7a31768 100644 --- a/docs/sqa/reviews/rc-003-project-plan.md +++ b/docs/sqa/reviews/rc-003-project-plan.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -72,3 +72,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. [PP-001]: ../../project-plan.md [QC-PP-001]: ../../../framework/qc/artifacts/qc-project-plan.md [QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-004-mil-001-project-setup.md b/docs/sqa/reviews/rc-004-mil-001-project-setup.md index 89971e2..9d8df6c 100644 --- a/docs/sqa/reviews/rc-004-mil-001-project-setup.md +++ b/docs/sqa/reviews/rc-004-mil-001-project-setup.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -63,3 +63,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. [MIL-001]: ../../milestones/mil-001-project-setup.md [QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md [QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-005-mil-002-form-automation.md b/docs/sqa/reviews/rc-005-mil-002-form-automation.md index 61613d5..96acb0b 100644 --- a/docs/sqa/reviews/rc-005-mil-002-form-automation.md +++ b/docs/sqa/reviews/rc-005-mil-002-form-automation.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -63,3 +63,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. [MIL-002]: ../../milestones/mil-002-form-automation.md [QC-MIL-001]: ../../../framework/qc/artifacts/qc-milestones-gateways.md [QC-LANG-001]: ../../../framework/qc/artifacts/qc-language-domain.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-006-mil-003-documentation.md b/docs/sqa/reviews/rc-006-mil-003-documentation.md index dc47e0e..d5607a2 100644 --- a/docs/sqa/reviews/rc-006-mil-003-documentation.md +++ b/docs/sqa/reviews/rc-006-mil-003-documentation.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -63,3 +63,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. [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 +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-007-adr-0001.md b/docs/sqa/reviews/rc-007-adr-0001.md index c174edb..4515dbd 100644 --- a/docs/sqa/reviews/rc-007-adr-0001.md +++ b/docs/sqa/reviews/rc-007-adr-0001.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -52,3 +52,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. [ADR-0001]: ../../adr/adr-0001-dependencies-fixture-docker.md [QC-ADR-001]: ../../../framework/qc/artifacts/qc-adr.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/reviews/rc-008-code-mil-001.md b/docs/sqa/reviews/rc-008-code-mil-001.md index 5ad53b1..c4b2198 100644 --- a/docs/sqa/reviews/rc-008-code-mil-001.md +++ b/docs/sqa/reviews/rc-008-code-mil-001.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -59,3 +59,4 @@ Go β€” every Mandatory criterion passes; no blocking finding. Reviewed files: sk [MIL-001]: ../../milestones/mil-001-project-setup.md [QC-PY-001]: ../../../framework/qc/code/qc-programming-python.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/sqa/traceability-matrix.md b/docs/sqa/traceability-matrix.md index f576d64..d94bb37 100644 --- a/docs/sqa/traceability-matrix.md +++ b/docs/sqa/traceability-matrix.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -70,3 +70,4 @@ updated whenever an artifact instance is created or reviewed. [ADR-0001]: ../adr/adr-0001-dependencies-fixture-docker.md [RC-007]: ./reviews/rc-007-adr-0001.md [RC-008]: ./reviews/rc-008-code-mil-001.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 diff --git a/docs/stakeholder-analysis.md b/docs/stakeholder-analysis.md index 18591e2..f30f5e2 100644 --- a/docs/stakeholder-analysis.md +++ b/docs/stakeholder-analysis.md @@ -11,7 +11,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending | +| 2026-10-28 | Accepted | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | [e1a3d8d] | --- @@ -78,3 +78,4 @@ Pending review. In autonomous mode the AI stands in for S01 as reviewer; the rev --- [BC-001]: ./business-case.md +[e1a3d8d]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/048-fill-out-form/commit/e1a3d8d304d4b6ece1a3f95ee02b597e30a97520 -- 2.54.0