Files
Tarik Moussa 569a03dc08
All checks were successful
C++ Tests / test-fast (pull_request) Successful in 2m2s
API Docs / doc-build (pull_request) Successful in 1m8s
Markdown link check / check (pull_request) Successful in 52s
C++ Tests / test-cgal (pull_request) Has been skipped
C++ Tests / quality-gates (pull_request) Successful in 1m59s
docs+tooling: doc-freshness gate, documentation-pass policy, token-hygiene
Refresh CLAUDE.md for v0.10.0 (3 CI jobs incl. disabled test-cgal,
compile-time option matrix, reviewer/pages docs, agentic + token-hygiene
workflow patterns) and condense the historical Phase-8/audit logs to
pointers.

Add the documentation-pass process so the single-source-of-truth rules
stay enforced:
  * scripts/quality/check-doc-freshness.sh — string-only drift gate
    (version/date across CITATION/CHANGELOG/CLAUDE, doc-map count), <1 s,
    registered in run-all.sh + quality README.
  * doc/release-policy.md — "Documentation passes" subsection (triggers +
    docs:sync rule); fix stale Phase-milestone mapping (v0.10.0 was
    reviewer-ready, 9c→v0.11.0) and the test-cgal CI mention.

Add shared Claude config (un-ignore the two files only):
  * .claude/settings.json — permission allowlist for safe repo commands.
  * .claude/token-hygiene.md — Tier-3 cache-discipline user guide that
    CLAUDE.md instructs Claude to remind the user about.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-28 06:15:14 +02:00

90 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Local structural quality gates
This directory contains the structural quality checks that run **locally**
rather than in CI. They are intentionally not wired into
`.gitea/workflows/` (yet) because each is either too slow, too brittle
against the runner environment, or both — running them before a release
or before showing the repo to an external reviewer is the intended
workflow.
The CI gates that *are* enforced live in `.gitea/workflows/cpp-tests.yml`
and `.gitea/workflows/doxygen-pages.yml`; they cover the day-to-day
correctness loop (build + test + doxygen-coverage + test-count
consistency + markdown links + end-to-end smoke via `try_it.sh`).
## What runs locally
### Style / convention gates (run on every commit; cheap)
| Script | What it checks | Wall time | Prereqs |
|---|---|---|---|
| `license-headers.sh` | every C++ source carries `SPDX-License-Identifier: MIT` | ~1 s | `bash` |
| `check-doc-freshness.sh` | string-only doc drift: version/date agree across CITATION/CHANGELOG/CLAUDE; doc-map count matches `doc/**/*.md` | <1 s | `bash` |
| `cgal-conventions.py` | CGAL-16: include-guard format, `\file` brief, namespace nesting, tag-naming, no `using namespace`, no stray `#define` | ~1 s | `python3` |
| `clang-format.sh` | every C++ source matches `.clang-format` (dry-run by default; `--fix` to apply) | ~2 s | `clang-format` 15 |
| `cmake-format.sh` | every `CMakeLists.txt` matches `.cmake-format.yaml` + passes `cmake-lint` | ~2 s | `cmake-format` (pip: cmakelang) |
| `codespell.sh` | typo check across docs + source comments + script messages | ~1 s | `codespell` |
| `shellcheck.sh` | static analysis of every `scripts/**/*.sh` | ~1 s | `shellcheck` |
| `cppcheck.sh` | second-opinion static analyser over `code/include/` | ~5 s | `cppcheck` |
| `../check-markdown-links.py` | every internal markdown link resolves | ~2 s | `python3` |
### Correctness / quality gates (run before tagging or reviewer demos)
| Script | What it checks | Wall time | Prereqs |
|---|---|---|---|
| `sanitizers.sh` | fast test suite under ASan + UBSan | ~3 min | `clang++` 14 or `g++` 11 |
| `coverage.sh` | gcov/lcov line + branch coverage of `code/include/` | ~2 min | `lcov` |
| `clang-tidy.sh` | curated clang-tidy checks over public headers | ~2 min | `clang-tidy` 14, `.clang-tidy` |
| `multi-compiler.sh` | build + test under every detected gcc/clang | ~5 min × N compilers | any 2 of `g++`, `clang++` |
| `reproducible-build.sh` | two builds byte-identical test executables | ~6 min | none beyond compiler |
| `cgal-version-matrix.sh` | build + CGAL test suite against multiple CGAL versions | ~5 min × N versions | CGAL trees under `~/cgal/<ver>/` (or `CGAL_ROOTS=...`) |
## How to use
```bash
# Fast subset (license + links + sanitizers + clang-tidy) — ~5 min total
bash scripts/quality/run-all.sh --fast
# Full sweep — ~2540 min, intended for pre-release tagging
bash scripts/quality/run-all.sh
# One specific gate
bash scripts/quality/sanitizers.sh
```
Every gate writes its full output to `build-quality-logs/<gate>.log`
when invoked via `run-all.sh`, and to its own per-gate build directory
(`build-sanitizers/`, `build-coverage/`, `build-multi-<cc>/`, …) when
invoked directly.
## Promotion path to CI
Each gate can be wired into `.gitea/workflows/cpp-tests.yml` once two
conditions are met:
1. **The gate is green on the canonical dev machine.** If the script
exits 1 today, the CI gate would block every PR.
2. **There is a published policy line in `doc/release-policy.md`** that
explains what regression the gate catches and what the recovery is.
Future contributors should be able to read the error and know what
to fix.
Promoting a gate is a one-line change to `cpp-tests.yml`; the test
recipe is the script invocation itself.
## Known limitations
- `cgal-version-matrix.sh` does not download CGAL. Each version must
already be on the dev machine under `~/cgal/<ver>/` (override with
`CGAL_ROOTS=...:...`). The Dockerfile under
`.gitea/docker/Dockerfile.ci-cpp` could be extended to ship multiple
CGAL trees in a single image; not done yet.
- `sanitizers.sh` only instruments the fast (non-CGAL) test suite
the CGAL templates are too expensive to compile under instrumentation
on most laptops.
- `clang-tidy.sh` requires a `.clang-tidy` config in the repo root; the
default Anthropic-quality lint set is intentionally minimal until the
reviewer signs off on the warning policy.
- `reproducible-build.sh` checks the test executables only. The
library is header-only, so there is nothing else to compare.