MIL-005: documentation, wiki and release check #36

Merged
Tirsvad merged 5 commits from mil-005-docs-wiki into main 2026-11-06 06:13:23 +01:00
7 changed files with 270 additions and 27 deletions
Showing only changes of commit 8cd73cc46b - Show all commits

No files matched your search

+2
View File
@@ -25,6 +25,8 @@ The repository holds one small module per lecture step.
Doxygen comments in the source describe every public name; `Doxyfile` builds them into `docs/doxygen/`.
The wiki (English, Danish and Bahasa Malaysia) explains what each lecture taught; its sources are in `docs/wiki/` and are published to the repository wiki when they are merged to `main`.
### Lecture steps
Each lecture has its own screenshot in `docs/images/` (made by `docs/images/capture.py` with a headless browser, so no window opens on your desktop) and a wiki page that explains what the lecture taught.
+48 -13
View File
@@ -50,7 +50,9 @@ body{margin:0;background:#f3f3f3;font-family:Segoe UI,Arial,sans-serif}
def find_browser() -> str:
for candidate in BROWSERS:
found = shutil.which(candidate) or (candidate if os.path.exists(candidate) else None)
found = shutil.which(candidate) or (
candidate if os.path.exists(candidate) else None
)
if found:
return found
raise SystemExit("No Edge or Chrome found for headless screenshots")
@@ -81,20 +83,28 @@ def shot(page: Path, png: Path, width: int, height: int) -> None:
def run(cmd: list[str], cwd: Path, timeout: int = 30) -> str:
done = subprocess.run(cmd, cwd=cwd, capture_output=True, text=True, timeout=timeout) # nosemgrep
done = subprocess.run(
cmd, cwd=cwd, capture_output=True, text=True, timeout=timeout
) # nosemgrep
return (done.stdout + done.stderr).rstrip("\n")
def terminal_page(title: str, entries: list[tuple[str, str]], png: Path, height: int) -> None:
def terminal_page(
title: str, entries: list[tuple[str, str]], png: Path, height: int
) -> None:
"""Render (command, output) pairs as a terminal and take the screenshot."""
lines = []
for command, output in entries:
lines.append(f'<span class="p">$</span> <span class="c">{html.escape(command)}</span>')
lines.append(
f'<span class="p">$</span> <span class="c">{html.escape(command)}</span>'
)
if output:
lines.append(html.escape(output))
page = (
f"<!doctype html><meta charset='utf-8'><style>{TERMINAL_CSS}</style>"
f"<div class='bar'>{html.escape(title)}</div><pre>" + "\n".join(lines) + "</pre>"
f"<div class='bar'>{html.escape(title)}</div><pre>"
+ "\n".join(lines)
+ "</pre>"
)
SOURCES.mkdir(exist_ok=True)
src = SOURCES / (png.stem + ".html")
@@ -105,7 +115,9 @@ def terminal_page(title: str, entries: list[tuple[str, str]], png: Path, height:
def stop(proc: subprocess.Popen) -> None:
"""Stop a server and its reloader child."""
if os.name == "nt":
subprocess.run(["taskkill", "/F", "/T", "/PID", str(proc.pid)], capture_output=True) # nosemgrep
subprocess.run(
["taskkill", "/F", "/T", "/PID", str(proc.pid)], capture_output=True
) # nosemgrep
else:
proc.kill()
proc.wait(timeout=10)
@@ -140,7 +152,11 @@ def start_server() -> subprocess.Popen:
def step2() -> None:
proc = start_server()
try:
body = urllib.request.urlopen(f"http://127.0.0.1:{PORT}/", timeout=3).read().decode()
body = (
urllib.request.urlopen(f"http://127.0.0.1:{PORT}/", timeout=3)
.read()
.decode()
)
page = (
f"<!doctype html><meta charset='utf-8'><style>{BROWSER_CSS}</style>"
f"<div class='tab'>127.0.0.1:5057</div>"
@@ -169,14 +185,16 @@ def step3() -> None:
output = run([bash, "-c", command], work)
entries.append((command, re.sub(r"/tmp/cli-demo-\w+", "~/demo", output)))
shutil.rmtree(work, ignore_errors=True)
terminal_page("Terminal - lecture 3: the command line", entries, OUT / "lecture-03.png", 330)
terminal_page(
"Terminal - lecture 3: the command line", entries, OUT / "lecture-03.png", 330
)
def step4() -> None:
entries = []
cmd = "python -m flask_day_54.domain.name_demo"
entries.append((cmd, run([python(), "-m", "flask_day_54.domain.name_demo"], ROOT)))
imp = "python -c \"import flask_day_54.domain.name_demo as m; print(m.describe_name(m.__name__))\""
imp = 'python -c "import flask_day_54.domain.name_demo as m; print(m.describe_name(m.__name__))"'
entries.append(
(
imp,
@@ -202,23 +220,40 @@ def step4() -> None:
raw = (server.stdout.read() if server.stdout else "").strip()
# Leave out the .env tip and the random debugger PIN; they say nothing about the lecture.
kept = [
line for line in raw.splitlines() if "Tip:" not in line and "Debugger PIN" not in line
line
for line in raw.splitlines()
if "Tip:" not in line and "Debugger PIN" not in line
]
out = "\n".join(kept)
entries.append(("python -m flask_day_54.presentation.hello", out + "\n^C"))
terminal_page("Terminal - lecture 4: __name__ and __main__", entries, OUT / "lecture-04.png", 560)
terminal_page(
"Terminal - lecture 4: __name__ and __main__",
entries,
OUT / "lecture-04.png",
560,
)
def step5() -> None:
module = "flask_day_54.domain.first_class_functions"
entries = [(f"python -m {module}", run([python(), "-m", module], ROOT))]
terminal_page("Terminal - lecture 5: functions as first-class objects", entries, OUT / "lecture-05.png", 420)
terminal_page(
"Terminal - lecture 5: functions as first-class objects",
entries,
OUT / "lecture-05.png",
420,
)
def step6() -> None:
module = "flask_day_54.domain.decorators"
entries = [(f"python -m {module}", run([python(), "-m", module], ROOT))]
terminal_page("Terminal - lecture 6: decorators and the @ syntax", entries, OUT / "lecture-06.png", 380)
terminal_page(
"Terminal - lecture 6: decorators and the @ syntax",
entries,
OUT / "lecture-06.png",
380,
)
STEPS = {1: step1, 2: step2, 3: step3, 4: step4, 5: step5, 6: step6}
+12 -6
View File
@@ -11,7 +11,8 @@
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | S01 | Initial version | [73a5a95] |
| 2026-11-06 | Deprecated | Jens Tirsvad Nielsen | S01 | Initial version | [73a5a95] |
| 2026-11-06 | Accepted | Jens Tirsvad Nielsen | S01 | Link each gateway to its synced Gitea milestone | pending |
---
@@ -31,11 +32,11 @@ Schedule the five gateways that turn the Day 54 lectures into a tested, document
| Gateway | Document | Window | Decision date | Owner | Stories | Main deliverable | Milestone |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Foundation | [MIL-001] | 2026-11-06 | 2026-11-06 | S01 | none (technical tasks) | pyproject, gitignore, constants, Doxyfile, README, repo metadata | not yet synced |
| Backend and Hello Flask | [MIL-002] | 2026-11-06 to 2026-11-07 | 2026-11-07 | S01 | none (technical tasks) | hello.py, tests, screenshots 1 and 2 | not yet synced |
| Command line and __main__ | [MIL-003] | 2026-11-07 to 2026-11-08 | 2026-11-08 | S01 | none (technical tasks) | main guard, name_demo, cli_basics, screenshots 3 and 4 | not yet synced |
| Functions and decorators | [MIL-004] | 2026-11-08 to 2026-11-09 | 2026-11-09 | S01 | none (technical tasks) | first_class_functions, decorators, screenshots 5 and 6 | not yet synced |
| Docs and wiki | [MIL-005] | 2026-11-09 to 2026-11-10 | 2026-11-10 | S01 | none (technical tasks) | three-language wiki, Doxygen, code review | not yet synced |
| Foundation | [MIL-001] | 2026-11-06 | 2026-11-06 | S01 | none (technical tasks) | pyproject, gitignore, constants, Doxyfile, README, repo metadata | [Milestone 001][GM-001] |
| Backend and Hello Flask | [MIL-002] | 2026-11-06 to 2026-11-07 | 2026-11-07 | S01 | none (technical tasks) | hello.py, tests, screenshots 1 and 2 | [Milestone 002][GM-002] |
| Command line and __main__ | [MIL-003] | 2026-11-07 to 2026-11-08 | 2026-11-08 | S01 | none (technical tasks) | main guard, name_demo, cli_basics, screenshots 3 and 4 | [Milestone 003][GM-003] |
| Functions and decorators | [MIL-004] | 2026-11-08 to 2026-11-09 | 2026-11-09 | S01 | none (technical tasks) | first_class_functions, decorators, screenshots 5 and 6 | [Milestone 004][GM-004] |
| Docs and wiki | [MIL-005] | 2026-11-09 to 2026-11-10 | 2026-11-10 | S01 | none (technical tasks) | three-language wiki, Doxygen, code review | [Milestone 005][GM-005] |
```plantuml
@startgantt
@@ -96,3 +97,8 @@ A No-Go on a gateway moves every later gateway by the time needed to fix and re-
[MIL-004]: ./milestones/mil-004-functions-decorators.md
[MIL-005]: ./milestones/mil-005-docs-wiki.md
[73a5a95]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-flask/commit/73a5a95d28db041e4f27342cc552e18f7d386410
[GM-001]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-flask/milestone/342
[GM-002]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-flask/milestone/343
[GM-003]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-flask/milestone/344
[GM-004]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-flask/milestone/345
[GM-005]: https://git.tirsystem.com/Tirsvad-Udemy-100-days-of-code/054-flask/milestone/346
+60
View File
@@ -0,0 +1,60 @@
# Review of MIL-005
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-019 |
| CrossReference | [MIL-005], [QC-WIKI-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending |
---
## Artifact Under Review
- Instance reviewed: [MIL-005]
- Checklist used: [QC-WIKI-001]
- Scope: full review of the wiki sources in docs/wiki/ before publishing
- Language and domain: n/a
- Language reviewer: none (the reviewer reads English and knows the IT domain)
- Mode: autonomous, not independent (AI as stand-in for S01)
## Checklist Results
| # | Criterion | Status | Evidence/Notes |
| --- | --- | --- | --- |
| 1 | The wiki has a `_Sidebar.md`, because the host lists subpages only through it | Pass | docs/wiki/_Sidebar.md exists. |
| 2 | The sidebar starts with the wiki's title in bold, then one list of the pages in the primary language (English), `Home` first | Pass | Starts with **Flask Day 54**, then one English page list with Home first. |
| 3 | The page list holds a link to every English page of the wiki, and no link points to a page that does not exist | Pass | Eight English pages are all linked; check_wiki.py found no dead link. |
| 4 | A `**Related**` section follows the page list only when the wiki has related wikis (for example the checklists wiki for a framework wiki); each entry is a link to that wiki's Home. A wiki with nothing related has no such section | N-A | The wiki has no related wikis, so there is no Related section. |
| 5 | A `**Languages**` section is the last section of the sidebar. It has one line per language, the language written in that language, linking to that language's `Home` page | Pass | Languages section is last: English, Dansk and Bahasa Melayu, each linking to its Home page. |
| 6 | The sidebar does not repeat the page list per language | Pass | The page list appears once. |
| 7 | A sidebar produced by a generator carries a comment that says so and names the generator; the generator is changed, not the page | N-A | The sidebar is written by hand, not generated. |
| 8 | The wiki has a `Languages` line on each page (criterion 11), so the sidebar is not the only way to switch language | Pass | Every page has the language line. |
| 9 | Every wiki exists in English and, as a minimum, in the language the project's registry names as the PO language; further languages are added on top, never instead of English | Pass | English plus Danish and Bahasa Malaysia; the PO language is English. |
| 10 | Every English page has a page in each other language of the wiki: the page sets are identical | Pass | Eight pages in each of the three languages (24 files); check_wiki.py confirms parity. |
| 11 | Every page starts with the language line, with the current language in bold and a link to the same page in each other language | Pass | Line 3 of every page has the bold current language and links to the other two. |
| 12 | A page in a language other than English is named `<Page>-<code>.md`, with a BCP 47 code; English has no suffix | Pass | Files are <Page>-da.md and <Page>-ms.md; English has no suffix. |
| 13 | Code blocks, commands, file names and IDs stay in English in every language | Pass | check_wiki.py: code blocks and image links are identical in all three languages. |
| 14 | The sidebar, every page and every link were checked on the published wiki after the change, not only in the repository | Pending | The wiki can only be published by the merge to main; the published sidebar, pages and links are checked after the merge and recorded in a follow-up review. |
| 15 | A change to the layout rules (sections, order, naming) is made in the generator or template and in this checklist's source rules together | N-A | No layout rule is changed. |
| 16 | The wiki folder (`docs/wiki/`) is flat: every page, `Home.md` and `_Sidebar.md` included, is directly in it, and languages are told apart by file name, never by a subfolder | Pass | docs/wiki/ is flat; no subfolder. |
## Overall Verdict
Go-with-conditions — Every criterion that can be checked before publishing passes; criterion 14 is Pending until the merge publishes the wiki. The Danish and Bahasa Malaysia pages were translated and checked by the AI only, not by a native speaker.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| Check the published sidebar, pages and links on the host and record a follow-up review | S01 | 2026-11-07 |
| Have a native reader confirm the Danish and Bahasa Malaysia wording (not independent so far) | S01 | 2026-11-10 |
---
[MIL-005]: ../../milestones/mil-005-docs-wiki.md
[QC-WIKI-001]: ../../../framework/qc/artifacts/qc-wiki.md
@@ -0,0 +1,61 @@
# Review of MIL-005
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-020 |
| CrossReference | [MIL-005], [QC-PY-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | Jens Tirsvad Nielsen | AI as stand-in for S01 | Initial version | pending |
---
## Artifact Under Review
- Instance reviewed: [MIL-005]
- Checklist used: [QC-PY-001]
- Scope: full review of all source and tests in src/ and tests/ at the end of the project
- Language and domain: n/a
- Language reviewer: none (the reviewer reads English and knows the IT domain)
- Mode: autonomous, not independent (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 | Modules, functions and constants use snake_case / UPPER_SNAKE; classes none or PascalCase. |
| 2 | Names state purpose in the domain's language; no unexplained abbreviations, no single-letter names outside tiny scopes | Pass | Names follow the lecture and the domain dictionary. |
| 3 | Code is produced by the project's formatter and passes its linter with no unexplained suppressions | Pass | `ruff format` leaves files unchanged and `ruff check` (E, F, I, B, UP) passes; configured in pyproject.toml. |
| 4 | Every function and method signature is type-annotated, including `-> None` | Pass | Every function signature is annotated, including `-> None`. |
| 5 | No bare `except:`, no swallowed exceptions; specific exceptions are raised and the cause is kept (`raise ... from`) | Pass | No bare except and no swallowed exception. |
| 6 | No mutable default arguments and no shadowed builtins | Pass | No mutable defaults; no builtin shadowed. |
| 7 | Files, locks and connections are managed with context managers | N-A | No file, lock or connection is opened. |
| 8 | Public modules, classes and functions have docstrings that say what, not how | Pass | Module and public names carry docstrings plus Doxygen comments. |
| 9 | Logging uses `logging`, not `print`; no secrets or personal data in log output | N-A | Console output of the demo entry points (print under the __main__ guard) is the program's result, not diagnostic logging; no secrets handled. |
| 10 | Classes and operations trace to the Design Class Diagram they implement; deviations are recorded | N-A | No DCD exists in this project; the layered layout is recorded in ADR-0001. |
| 11 | Tests exist for new behaviour, are named for the behaviour, and do not depend on order or the network | Pass | pytest tests named for behaviour; no order or network dependence. |
| 12 | Type checker runs in strict mode without errors; `Any` is justified in a comment | N-A | No type checker is configured (optional criterion). |
| 13 | Dependencies are declared and pinned in the project's dependency file, none unused | Pass | Dependencies are declared in pyproject.toml; none unused (Flask is the optional `web` extra). |
| 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 | Each constant is defined once in the constants.py of its layer. |
| 15 | Imports point inward: business-rule modules import no framework, database, UI or delivery-mechanism code, and there are no import cycles | Pass | `domain` imports no framework or outer layer; imports point inward; no cycles. |
| 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 | Small modules with one reason to change; no type tests or subclass hierarchies. |
| 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 | Layers domain, application, infrastructure, presentation under src/flask_day_54; tests in unit and e2e (ADR-0001); no layer merged. |
| 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 | English snake_case file names without spaces. |
## Overall Verdict
Go — All applicable mandatory criteria pass.
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| None | S01 | - |
---
[MIL-005]: ../../milestones/mil-005-docs-wiki.md
[QC-PY-001]: ../../../framework/qc/code/qc-programming-python.md
@@ -0,0 +1,74 @@
# Review of PP-001
## Metadata
| Key | Value |
| --- | --- |
| ID | RC-021 |
| CrossReference | [PP-001], [QC-PP-001] |
## Version History
| Date | Status | Author | Reviewer | Change | Commit |
| --- | --- | --- | --- | --- | --- |
| 2026-11-06 | Proposed | 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 (re-review after the change)
- Language and domain: en / it
- Language reviewer: none (the reviewer reads English and knows the IT domain)
- Mode: autonomous, not independent (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-11-06, end 2026-11-10, constraint: one PR per milestone (BC-001 Constraints). |
| 2 | Every milestone or gateway is listed once with its document, decision date and owner | Pass | Five gateways, each with document, decision date and owner S01. |
| 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 Target Date of each MIL document 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-005 is acyclic and matches the dates. |
| 6 | The plan states what happens to later gateways and to the end date when a gateway is No-Go | Pass | Dependencies section: later gateways shift; S01 decides the end date. |
| 7 | Owners, reviewers and escalation roles use Stakeholder Analysis IDs and match the governance RACI | N-A | Owners and reviewers use S01; no governance document (GOV) exists in this small project, so no RACI to match. |
| 8 | Planning assumptions are listed with their source, and a changed baseline is recorded with its reason | Pass | Planning Assumptions lists sources; changes will be recorded in Version History. |
| 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 mitigation; two trace to BC-001 risks. |
| 10 | Open issues are listed, and none contradicts a statement elsewhere in the plan | Pass | Open Issues remain current. |
| 11 | Each gateway's main deliverable is stated and matches the deliverable of its `MIL-*` document | Pass | Main deliverables match the Deliverable sections of the MIL documents. |
| 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 | Gantt bars match the table; chain matches Dependencies. |
| 14 | Each gateway is linked to its issue-tracker milestone, or marked as not yet synced | Pass | Every gateway row links its Gitea milestone (342 to 346) with a reference-style link. |
| 15 | The plan is a singleton: one Project Plan per project, changes recorded in Version History | Pass | Single plan; Version History present. |
## 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 | Checked against the document and the registry. |
| 2 | `Language` is a BCP 47 code and `Domain` is a value from the registry's domain list | Pass | Checked against the document and the registry. |
| 3 | The content (prose and table cells) is written in the stated language | Pass | All prose and table cells are English, the PO language (registry `PO language` = en). |
| 4 | The register matches the one the registry gives for the artifact type | Pass | Register: IT Executive English for BC/PP/MIL, IT Professional English for SA/DICT; no implementation detail in the executive documents beyond file names. |
| 5 | Domain terms are the PO terms of the domain's dictionary, with no synonyms | Pass | Terms follow `docs/dictionary.md` (DICT-001): greeting, home page, lecture step, local environment, wrapper. |
| 6 | Metadata keys, section headings, IDs and statuses are in English | Pass | Checked against the document and the registry. |
| 7 | No translated twin (`<name>.<language>.md`) exists beside the document | Pass | No `*.en.md` or other translated twin exists. |
| 8 | A change of language or domain since the previous accepted version has a Version History row and was reviewed again | Pass | First version; no earlier language to compare. |
| 9 | A reviewer competent in the domain, and in the language, has confirmed that the domain terms are used correctly | Pass | Reviewer S01 reads English and works in the IT domain (stand-in, not independent). |
| 10 | Abbreviations are spelled out on first use, in the stated language | Pass | FURPS+, BC, SA etc. are defined by the framework; ISO/IEC 25010 named in full. |
## Overall Verdict
Go — Re-review of the whole checklist after the milestone links were added; all mandatory criteria pass (7 is not applicable).
## Action Items
| Action | Owner | Due |
| --- | --- | --- |
| None | S01 | - |
---
[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
+13 -8
View File
@@ -25,14 +25,14 @@ updated whenever an artifact instance is created or reviewed.
| --- | --- | --- | --- | --- | --- | --- |
| [BC-001] | BC | en | it | - | [SA-001], [PP-001] | [RC-001] |
| [SA-001] | SA | en | it | [BC-001] | [BC-001] | [RC-002] |
| [PP-001] | PP | en | it | [BC-001], [SA-001] | [MIL-001] to [MIL-005] | [RC-003] |
| [PP-001] | PP | en | it | [BC-001], [SA-001] | [MIL-001] to [MIL-005] | [RC-021] |
| [ADR-0001] | ADR | - | - | [BC-001], [PP-001] | [MIL-001] to [MIL-004] | [RC-010] |
| [DICT-001] | DICT | en | it | [BC-001], [SA-001] | - | [RC-004] |
| [MIL-001] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-011] |
| [MIL-002] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-012] |
| [MIL-003] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-013] |
| [MIL-004] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-014] |
| [MIL-005] | MIL | en | it | [BC-001], [PP-001] | - | [RC-009] |
| [MIL-001] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-011], [RC-015] |
| [MIL-002] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-012], [RC-016] |
| [MIL-003] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-013], [RC-017] |
| [MIL-004] | MIL | en | it | [BC-001], [PP-001], [ADR-0001] | - | [RC-014], [RC-018] |
| [MIL-005] | MIL | en | it | [BC-001], [PP-001] | - | [RC-009], [RC-019], [RC-020] |
## Concern Coverage
@@ -54,8 +54,6 @@ updated whenever an artifact instance is created or reviewed.
---
---
[BC-001]: ../business-case.md
[SA-001]: ../stakeholder-analysis.md
[PP-001]: ../project-plan.md
@@ -80,3 +78,10 @@ updated whenever an artifact instance is created or reviewed.
[RC-012]: ./reviews/rc-012-mil-002-hello-flask-delta.md
[RC-013]: ./reviews/rc-013-mil-003-cli-and-main-delta.md
[RC-014]: ./reviews/rc-014-mil-004-functions-decorators-delta.md
[RC-015]: ./reviews/rc-015-code-mil-001-foundation.md
[RC-016]: ./reviews/rc-016-code-mil-002-hello-flask.md
[RC-017]: ./reviews/rc-017-code-mil-003-cli-and-main.md
[RC-018]: ./reviews/rc-018-code-mil-004-functions-decorators.md
[RC-019]: ./reviews/rc-019-wiki-mil-005.md
[RC-020]: ./reviews/rc-020-code-mil-005-docs-wiki.md
[RC-021]: ./reviews/rc-021-project-plan-delta.md