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}")