diff --git a/checks/index.html b/checks/index.html
index c52219a..0905fa8 100644
--- a/checks/index.html
+++ b/checks/index.html
@@ -160,6 +160,16 @@
Numbers pinned to code
pyproject.toml extras |
tests/test_packaging.py |
+
+ | Every Python package here type-checks |
+ the organisation profile — "open source, typed, and tested" |
+ mypy in each repository's CI |
+
+
+ | No workflow runs an action it took from a moving tag |
+ implied by every badge above, which those workflows produce |
+ scripts/org_triage.py, weekly |
+
| This site makes no third-party request of any kind |
the legal page |
@@ -220,6 +230,11 @@ What runs on a schedule
weekly |
one standing issue names the page, what it says, and what the source says |
+
+ | Actions that have gone back to a moving tag |
+ weekly, across every repository |
+ the triage names the repository and the references — and says unknown rather than fine when it could not read the workflows |
+
| Organisation-wide maintenance triage |
weekly |
diff --git a/ru/checks/index.html b/ru/checks/index.html
index 284a0d3..97e8cab 100644
--- a/ru/checks/index.html
+++ b/ru/checks/index.html
@@ -161,6 +161,16 @@ Числа, прибитые к коду
extras в pyproject.toml |
tests/test_packaging.py |
+
+ | Каждый Python-пакет здесь проходит проверку типов |
+ профиль организации — «open source, typed, and tested» |
+ mypy в CI каждого репозитория |
+
+
+ | Ни один воркфлоу не запускает action, взятый с подвижного тега |
+ подразумевается каждым бейджем выше — их делают эти воркфлоу |
+ scripts/org_triage.py, еженедельно |
+
| Этот сайт не делает ни одного запроса к сторонним доменам |
юридическая страница |
@@ -221,6 +231,11 @@ Что работает по расписанию
еженедельно |
одна стоячая issue называет страницу, её версию и версию источника |
+
+ | Actions, вернувшиеся на подвижный тег |
+ еженедельно, по всем репозиториям |
+ триаж называет репозиторий и ссылки — и говорит неизвестно, а не в порядке, если не смог прочитать воркфлоу |
+
| Триаж обслуживания по всей организации |
еженедельно |
diff --git a/scripts/check_figures.py b/scripts/check_figures.py
index 7a4b747..48da015 100644
--- a/scripts/check_figures.py
+++ b/scripts/check_figures.py
@@ -12,7 +12,10 @@
Each figure here names its source and is checked against it:
algorithms / environments decisionrl's CITATION.cff, which decisionrl's own
- test suite pins to the package it ships
+ test suite pins to the package it ships -- checked
+ on this site and in the organisation profile, which
+ spells the same figures out in words and so escaped
+ every check that looked for digits
required dependencies glia's pyproject.toml, read directly
line coverage Codecov, the run that produced it
@@ -23,6 +26,11 @@
Standard library only. Needs network, which is why this runs in its own weekly
workflow rather than in the required CI check.
+Sources are read through raw.githubusercontent.com, which serves from a cache
+that can lag a commit by a few minutes. That is invisible to a weekly run and
+confusing to anyone running this by hand right after a merge: if it reports a
+figure you have just corrected, check the commit landed before believing it.
+
Usage:
python scripts/check_figures.py [site_root]
"""
@@ -41,6 +49,16 @@
PAGES = ("index.html", "ru/index.html")
+# The organisation profile states the same counts in words. That is how "thirty-one
+# algorithms and twenty-two environments" survived every correction made to the
+# digits elsewhere.
+PROFILE = f"{RAW}/.github/master/profile/README.md"
+WORDS = {
+ 22: "twenty-two", 23: "twenty-three", 24: "twenty-four", 25: "twenty-five",
+ 29: "twenty-nine", 30: "thirty", 31: "thirty-one", 32: "thirty-two",
+ 33: "thirty-three", 34: "thirty-four", 35: "thirty-five",
+}
+
def fetch(url: str) -> str | None:
try:
@@ -147,7 +165,35 @@ def main(root: Path) -> int:
f"{name}: coverage says {stated}, Codecov measures {coverage:.1f}%"
)
- unchecked.append("recall@5 — praxis states it in prose, with no eval run pinning it")
+ if counts is not None:
+ algorithms, environments, _ = counts
+ profile = fetch(PROFILE)
+ if profile is None:
+ unchecked.append("the organisation profile could not be read")
+ else:
+ lowered = profile.lower()
+ for value, label in ((algorithms, "algorithms"), (environments, "environments")):
+ word = WORDS.get(value)
+ if word is None:
+ unchecked.append(f"no word for {value} {label} in the profile check")
+ continue
+ # Read the word actually in front of the noun, rather than asking
+ # whether the right word appears anywhere: "thirty-two algorithms
+ # and twenty-four environments" contains both, and a check that
+ # only looks for presence cannot tell which belongs to which.
+ stated = re.search(rf"([a-z]+(?:-[a-z]+)?) {label}\b", lowered)
+ if stated is None:
+ problems.append(f"organisation profile: no longer states a count of {label}")
+ elif stated.group(1) != word:
+ problems.append(
+ f"organisation profile: says {stated.group(1)} {label}, "
+ f"decisionrl ships {word} ({value})"
+ )
+
+ unchecked.append(
+ "praxis on real models — the offline column of its quality table is pinned by a "
+ "test; recall@5 0.92 and MRR 0.94 need a GPU CI does not have"
+ )
for problem in problems:
print(f" DRIFTED {problem}")