docs: hxprobe plans, summaries, explanations, usage, and changelog

Plans (docs/plans/):
- 2026-07-01-23-47-py-hxprobe-httpx.md — initial httpx probe design
- 2026-07-02-09-32 through 14-05 — standalone project, toolchain, usage
  doc + Makefile, file input (-f), simplification pass, run-summary footer

Summaries (docs/summaries/): one per completed feature, recording what
was actually built, deviations from the plan, and verification steps

Explanations (docs/explanations/): two deep-dives written during review —
hxprobe concurrency model and worst-exit-code + render-loop analysis

Usage (docs/usage/hxprobe.md): overview with pointer to hxprobe/USAGE.md
for the full runnable reference

Walkthrough (docs/py-latprobe-walkthrough.md): narrative tour of the
latprobe Python package for interview / code-review context

CHANGELOG.md: entries for all hxprobe features (toolchain, usage doc,
file input, simplification, run-summary footer)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-07-02 13:22:59 +02:00
parent 13a562e966
commit f487a4b1bd
19 changed files with 2367 additions and 0 deletions

View File

@@ -0,0 +1,73 @@
# Summary: hxprobe toolchain modernization (uv, ruff, pytest)
Plan: [docs/plans/2026-07-02-09-57-hxprobe-toolchain-modernization.md](../plans/2026-07-02-09-57-hxprobe-toolchain-modernization.md)
## What was built
Modernized `hxprobe`'s Python toolchain per the user's confirmed choices
(uv, ruff, pytest; mypy skipped). No behavior change to the probe/CLI
itself — this is purely tooling.
- `hxprobe/pyproject.toml`: added `[dependency-groups] dev = ["pytest>=8.0",
"ruff>=0.8"]` (PEP 735), `[tool.pytest.ini_options]` (testpaths, a
registered `integration` marker), `[tool.ruff]` (`target-version =
"py311"`, `line-length = 100`)
- `hxprobe/.python-version`: new, pins `3.14`
- `hxprobe/uv.lock`: new, 18 packages resolved and pinned (`httpx`,
`httpcore`, `h2`, `certifi`, `pytest`, `ruff`, and their transitive deps)
- `hxprobe/tests/test_integration.py`: added `pytestmark =
pytest.mark.integration`, replacing the `test_[!i]*.py` filename-glob
convention with a real pytest marker
- Ran `ruff check --fix` (one fix: removed unused `import sys` in `cli.py`,
inherited from the original `latprobe/cli.py`) and `ruff format .`
(6 files reformatted — collapsed the hand-aligned `=`/dict-key columns to
single-space; no semantic changes)
- `hxprobe/README.md`: new, standalone quick-start
- `Makefile`: `hx-deps`/`hx-run`/`hx-test`/`hx-test-integration` now shell
out to `uv sync`/`uv run` instead of manual venv+pip; added `hx-lint`/
`hx-fmt`; `hx-check` now bundles lint + hermetic tests (mirrors
`go-check`'s fmt+vet+test pattern)
- `docs/usage/hxprobe.md`: Setup and Makefile-targets sections updated
- `.gitignore`: added `.pytest_cache/`, `.ruff_cache/`
## Key design decisions
- **`[dependency-groups]` (PEP 735) over `[tool.uv.dev-dependencies]`** —
the standardized, current uv-recommended way to declare dev-only deps,
keeps them out of the installable package's `dependencies` list.
- **Runner swap only, no test rewrite.** `unittest.TestCase` classes,
`unittest.skipUnless` decorators, and `if __name__ == "__main__":
unittest.main()` guards are untouched — pytest is a superset runner for
unittest-style tests. Only the marker-based selection mechanism changed.
- **`hx-check` now includes lint**, not just tests — matches how
`go-check: go-fmt go-vet go-test` already bundles static checks with
tests in this repo, rather than treating lint as a separate, easy-to-skip
step.
- **Verified the `ruff format` diff was purely cosmetic** before accepting
it: reviewed the actual diff (whitespace/alignment only, no reordering or
logic changes), then confirmed with `ast.parse` on every file post-format
and a full pytest run afterward (37 tests: 28 hermetic + 9 integration,
all passing) — did not run the suite pre-format, so this confirms the
post-format state is correct rather than a strict before/after diff.
## Deviations from the plan
None. Implemented exactly as planned; the `import sys` removal and the
~6-file reformatting were both explicitly anticipated in the plan text
("Lint fixes" section) rather than being surprises.
## Verification
- `cd hxprobe && uv sync` — creates `.venv`, installs from `uv.lock`
(`httpx[http2]`, `pytest`, `ruff` + transitive deps)
- `make hx-run ARGS="-v http://github.com"` — unchanged output (HTTP/2,
1 redirect, IP/TLS/cert)
- `make hx-lint` — `ruff check .` clean (`All checks passed!`)
- `make hx-test` — `pytest tests -m "not integration"`: 28 passed, 9
deselected (matches the pre-toolchain-change hermetic test count exactly)
- `make hx-test-integration` — `pytest tests -m integration`: 9 passed, 28
deselected
- `grep -rn "latprobe" hxprobe/` — zero matches (toolchain change didn't
reintroduce coupling)
- `git diff --stat python/` — empty (hxprobe-only change, `latprobe`
untouched)