* chore(repo): land the retrieval contract and drop root cruft Lands work that had been sitting uncommitted in the working tree: - docs/architecture/retrieval_contracts.md plus its executable form, tests/benchmarks/retrieval_contract.py and test_retrieval_contract.py, now registered in meson as retrieval_contract_unit (suite: policy). .gitignore keeps them tracked beneath the tests/benchmarks/*.py ignore. - AGENTS.md: the Development Memory section, and the product default recorded as hybrid_assist + shadow with topology-off as the control, which is what search_topology_stage already does. docs/benchmarks/index.md gains the matching search_shadow_cost plan. - .gitleaks.toml, and a Secret scan workflow that actually runs it on push and pull requests (nothing in .github invoked gitleaks before). Deletes three root files with zero references anywhere in the tree: bench_profile.json (ad-hoc profiling leftover), CppProperties.json (Visual Studio config; the repo standardises on Meson), and spdlog.pc (a hand-copied spdlog 1.12 pkg-config with prefix=/usr/local that would mislead any PKG_CONFIG_PATH lookup; spdlog comes from Conan). docs/plans/ (two p2p designs already shipped in5a53cdfaandd012d95b) was ingested into YAMS with task=desloppification source=plan, hydrated via yams cat and byte-compared before removal, per the new AGENTS.md rule; tests/scripts/analyze_simeon_adaptivity.py no longer points at a plans directory. Also reflows two stale line anchors in raw_environment_allowlist.txt for tools/yams-cli/main.cpp (shifted by11c39157) so the policy suite passes again; no new environment writes. Not included: the external/yams-repo submodule pointer in the working tree was a stale local clone two commits behind, not an intended bump. Signed-off-by: trvon <me@trevon.dev> * test(policy): make the configuration-authority ratchet bidirectional check_configuration_authority.py only reported keys and TOML readers present in code but missing from the allowlists, so the reviewed YAMS_* surface could grow but never shrink: production_environment_keys.txt even said removals "may remain grandfathered". An allowlist that only accretes stops describing the code. The policy now also fails on allowlist entries with no remaining occurrence in src/, include/, or tools/, naming the lines to delete. Key removals in later commits therefore have to update the allowlist in the same change, and the count in the success banner becomes a real measure of the environment surface (432 today). stale_entries() exposes the two stale sets for tooling; three unit tests cover stale key, stale reader, and the returned names. Signed-off-by: trvon <me@trevon.dev> * tools(policy): report where every configuration key is referenced Adds tests/scripts/report_config_key_usage.py: for each YAMS_* key in production_environment_keys.txt and each dotted TOML key literally resolved in ConfigResolver.cpp, count whole-token references per tree bucket (src, test, bench, docs, plugin; build output and the allowlists themselves excluded) and assign a verdict: KEEP when anything outside product code exercises or documents the key, CANDIDATE when only product code mentions it, NOT_IN_SRC when the allowlist is stale. The report is evidence, not a decision. From here on a key deletion must paste its CANDIDATE rows into the change description; the first audit pass hand-listed keys that turned out to have bench and test consumers, which is exactly the mistake a mechanical inventory avoids. Today: 432 env keys (215 CANDIDATE, 217 KEEP), 117 TOML keys (103 CANDIDATE, 14 KEEP). Registered as config_key_usage_report_unit. The report counts only files git tracks (git ls-files) when the root is a work tree, so an ignored local bench harness cannot turn a CANDIDATE into a KEEP on one machine and not another; outside a work tree it falls back to scanning the directory, which is what the synthetic-tree test exercises. Signed-off-by: trvon <me@trevon.dev> --------- Signed-off-by: trvon <me@trevon.dev>
86 lines
3.2 KiB
Python
86 lines
3.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Tests for the configuration-authority policy scanner."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib.util
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
SCRIPT = Path(__file__).with_name("check_configuration_authority.py")
|
|
SPEC = importlib.util.spec_from_file_location("configuration_authority", SCRIPT)
|
|
assert SPEC and SPEC.loader
|
|
POLICY = importlib.util.module_from_spec(SPEC)
|
|
SPEC.loader.exec_module(POLICY)
|
|
|
|
|
|
class ConfigurationAuthorityPolicyTest(unittest.TestCase):
|
|
def setUp(self) -> None:
|
|
self.temp = tempfile.TemporaryDirectory()
|
|
self.root = Path(self.temp.name)
|
|
(self.root / "src").mkdir()
|
|
self.env_allowlist = self.root / "environment.txt"
|
|
self.reader_allowlist = self.root / "readers.txt"
|
|
self.env_allowlist.write_text("YAMS_EXISTING\n", encoding="utf-8")
|
|
self.reader_allowlist.write_text(
|
|
"src/config.cpp:parseSimpleTomlFlat\n", encoding="utf-8"
|
|
)
|
|
|
|
def tearDown(self) -> None:
|
|
self.temp.cleanup()
|
|
|
|
def test_reviewed_environment_key_and_reader_pass(self) -> None:
|
|
(self.root / "src" / "config.cpp").write_text(
|
|
'const char* key = "YAMS_EXISTING";\n'
|
|
"Config parseSimpleTomlFlat(const Path&) { return {}; }\n",
|
|
encoding="utf-8",
|
|
)
|
|
self.assertEqual(
|
|
POLICY.run(self.root, self.env_allowlist, self.reader_allowlist), 0
|
|
)
|
|
|
|
def test_new_environment_key_fails(self) -> None:
|
|
(self.root / "src" / "feature.cpp").write_text(
|
|
'auto value = getenv("YAMS_NEW_PRODUCT_KNOB");\n', encoding="utf-8"
|
|
)
|
|
self.assertEqual(
|
|
POLICY.run(self.root, self.env_allowlist, self.reader_allowlist), 1
|
|
)
|
|
|
|
def test_new_toml_reader_fails(self) -> None:
|
|
(self.root / "src" / "duplicate.cpp").write_text(
|
|
"Config parseAnotherToml(const Path&) { return {}; }\n", encoding="utf-8"
|
|
)
|
|
self.assertEqual(
|
|
POLICY.run(self.root, self.env_allowlist, self.reader_allowlist), 1
|
|
)
|
|
|
|
def test_stale_environment_key_fails(self) -> None:
|
|
# Nothing in src/ mentions YAMS_EXISTING any more: the allowlist must shrink.
|
|
(self.root / "src" / "config.cpp").write_text(
|
|
"Config parseSimpleTomlFlat(const Path&) { return {}; }\n", encoding="utf-8"
|
|
)
|
|
self.assertEqual(
|
|
POLICY.run(self.root, self.env_allowlist, self.reader_allowlist), 1
|
|
)
|
|
|
|
def test_stale_reader_entry_fails(self) -> None:
|
|
(self.root / "src" / "config.cpp").write_text(
|
|
'const char* key = "YAMS_EXISTING";\n', encoding="utf-8"
|
|
)
|
|
self.assertEqual(
|
|
POLICY.run(self.root, self.env_allowlist, self.reader_allowlist), 1
|
|
)
|
|
|
|
def test_stale_entries_are_named(self) -> None:
|
|
(self.root / "src" / "config.cpp").write_text("int x;\n", encoding="utf-8")
|
|
stale_keys, stale_readers = POLICY.stale_entries(
|
|
self.root, self.env_allowlist, self.reader_allowlist
|
|
)
|
|
self.assertEqual(stale_keys, ["YAMS_EXISTING"])
|
|
self.assertEqual(stale_readers, ["src/config.cpp:parseSimpleTomlFlat"])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|