Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/deep-dive.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -254,7 +254,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
- **`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
- **`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.

**Verified this pass:** `pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
**Verified this pass:** `pytest` → green, 2,145 selected and 13 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.5` on PyPI is that wheel. The counts are a snapshot, not a property of the project — `pytest` re-derives them in one command, which is the only reason they are quoted, and `tests/test_deep_dive.py` fails this line rather than letting it drift.

[ROADMAP.md](../ROADMAP.md) tracks what is built and what is not, item by item.

Expand Down
172 changes: 172 additions & 0 deletions tests/test_deep_dive.py
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
"""The deep dive's **Verified this pass** paragraph, held against reality.

The paragraph's whole value is that its numbers are real. Nothing checked them,
so they drifted: it read "1,533 passed … 103 submodules" while the tree it
described had grown to 1,754 tests and 116 submodules, and it read "1,985
passed, 12 deselected" against a tree with 2,132 selected and 13 live. A reader
who spots one stale figure discounts every other verified claim on the page —
including the ones the suite genuinely enforces.

This is the discipline the cookbook pages and the README's runnable blocks
already have (`tests/test_cookbook_*.py`, `tests/test_readme.py` byte-compare
those against real output): prose that states a checkable fact gets a check.

The figures are therefore quoted as what one command re-derives — how many
tests `pytest` selects, and how many it holds back as `live` — rather than as
a pass count, which cannot be re-derived without running the suite from inside
itself. A green suite is asserted by the suite being green.
"""

from __future__ import annotations

import re
import subprocess
import sys
import textwrap
import tomllib
from pathlib import Path

import pytest

ROOT = Path(__file__).resolve().parents[1]
DEEP_DIVE = ROOT / "docs" / "deep-dive.md"
MARKER = "**Verified this pass:**"

# The recount runs pytest in a subprocess rather than calling `pytest.main`
# in-process: this module is itself collected by the session doing the asking,
# and re-entering the collector from inside it is not a supported thing to do.
_RECOUNT = textwrap.dedent(
"""
import pytest


class Capture:
def pytest_collection_finish(self, session):
selected = live = 0
for item in session.items:
if item.get_closest_marker("live"):
live += 1
else:
selected += 1
print(f"COUNTS {selected} {live}")


# `-m ""` clears the `-m 'not live'` that pyproject's addopts supplies, so
# one collection pass yields both figures instead of two passes yielding one
# each. The marker is read off each item rather than inferred from a second
# selection.
raise SystemExit(
pytest.main(
["--collect-only", "-q", "-m", "", "-p", "no:cacheprovider"],
plugins=[Capture()],
)
)
"""
)


def _paragraph() -> str:
for line in DEEP_DIVE.read_text(encoding="utf-8").splitlines():
if line.startswith(MARKER):
return line
raise AssertionError(f"{DEEP_DIVE.name} has no line starting with {MARKER!r}")


@pytest.fixture(scope="module")
def recount() -> tuple[int, int]:
"""(selected, deselected-as-live), re-derived from this tree."""
proc = subprocess.run(
[sys.executable, "-c", _RECOUNT],
cwd=ROOT,
capture_output=True,
text=True,
)
match = re.search(r"^COUNTS (\d+) (\d+)$", proc.stdout, re.M)
assert match, (
f"collection did not report counts (exit {proc.returncode}):\n"
f"{proc.stdout[-2000:]}\n{proc.stderr[-2000:]}"
)
return int(match.group(1)), int(match.group(2))


def _quoted(pattern: str) -> str:
line = _paragraph()
match = re.search(pattern, line)
assert match, f"the paragraph no longer quotes {pattern!r}:\n{line}"
return match.group(1)


# -- the figures ------------------------------------------------------------


def test_the_quoted_selection_is_what_pytest_selects(recount):
selected, _ = recount
quoted = int(_quoted(r"([\d,]+) selected").replace(",", ""))

assert quoted == selected, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} selected, this tree has {selected:,}"
)


def test_the_quoted_deselection_is_what_pytest_holds_back(recount):
_, live = recount
quoted = int(_quoted(r"([\d,]+) deselected").replace(",", ""))

assert quoted == live, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted:,} deselected, this tree marks {live:,} `live`"
)


def test_the_quoted_published_version_is_the_packaged_one():
"""The paragraph names the version it says is on PyPI. `ci.yml` already
refuses a `grapharc.__version__` that disagrees with pyproject; a release
note naming a third number is the same failure with no check on it."""
with open(ROOT / "pyproject.toml", "rb") as fh:
packaged = tomllib.load(fh)["project"]["version"]
quoted = _quoted(r"`(\d+\.\d+\.\d+)` on PyPI")

assert quoted == packaged, (
f"update the **Verified this pass** paragraph in {DEEP_DIVE.name}: it "
f"says {quoted} is on PyPI, pyproject says {packaged}"
)


# -- a guard on the guard ---------------------------------------------------


def test_the_paragraph_still_quotes_every_figure_this_file_checks():
"""A rewrite that drops a figure must not pass by leaving nothing to check.

Without this, deleting "2,145 selected" from the sentence would make the
test above vacuous rather than red — the same trap the README's
`test_the_section_still_holds_the_two_blocks_this_file_checks` closes.
"""
line = _paragraph()

assert re.search(r"[\d,]+ selected", line), line
assert re.search(r"[\d,]+ deselected", line), line
assert re.search(r"`\d+\.\d+\.\d+` on PyPI", line), line


def test_the_paragraph_quotes_no_figure_that_nothing_re_derives():
"""The rule the issue settled on: a number on this line is either
re-derived by a test in this file, or it does not belong on the line.

`pass`/`fail` counts are the specific thing being kept off it — they cannot
be re-derived without running the suite from inside itself, which is how
the old "1,985 passed" figure came to be unowned in the first place.
"""
line = _paragraph()
checked = re.sub(r"[\d,]+ (?:selected|deselected)", "", line)
checked = re.sub(r"`\d+\.\d+\.\d+` on PyPI", "", checked)
# Version numbers inside command names and prose ordinals are not figures;
# what this catches is a bare count with a unit, e.g. "1,985 passed".
stray = re.findall(r"[\d,]{3,} \w+", checked)

assert not stray, (
f"these figures on the **Verified this pass** line are re-derived by "
f"nothing: {stray}. Either add a check for them here or take them off "
f"the line — that is the rot this file exists to stop."
)
Loading