2026-07-08 16:08:32 +02:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
CUST-WP-0060 test coverage: validate_work_records suite + CI wiring + C-31 comment fix
Critical review of CUST-WP-0060 (T03-T06) found: shipped mechanism proven
only by manual/live-repo runs, no repeatable test suite; tests/ never
wired to CI at all (pre-existing gap, not introduced here).
- tests/test_validate_work_records.py: 30 tests against the live canon
registry/schemas — classify() incl. all grandfathered legacy id
schemes, per-kind schema gates (intake open/closed/promoted, decision
prepared/resolved, engagement prepared), multi-doc yaml handling,
malformed-yaml-only-errors-if-id-registered, main() end-to-end via
subprocess (exit codes, template placeholders, --strict escalation,
terminal-record historical grace incl. the boundary case that grace
must NOT mask real enum violations), and the jsonschema-unavailable
fallback path (the exact failure mode that broke the first Forgejo
CI run before the runner-substrate fix)
- tools/validate_work_records.py: docstring said 'authoritative detector
is fix-consistency C-25' — wrong, it landed as C-31 (C-25..C-30 were
already taken); comment now correct
- .forgejo/workflows/python-tests.yaml: wires tests/ to CI for the first
time in this repo (apt python3/pytest/jsonschema/yaml on the
node:20-bookworm substrate, same pattern as work-records.yaml)
- tests/test_scan_workstream_terminology.py: found one pre-existing,
unrelated failure while establishing the CI-representative baseline
(agentic-resources allowlist entry no longer sets exclude_repo — a
policy question, not a bug this task should resolve silently); marked
xfail(strict=True) with the finding recorded so CI has a clean signal
and a silent 'fix' doesn't go unnoticed either
Local verification with apt-sourced deps (jsonschema 4.10.3, matching the
CI runner's package source, not just pip): 34 passed, 1 known xfailed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 23:09:25 +02:00
|
|
|
import pytest
|
|
|
|
|
|
2026-07-08 16:08:32 +02:00
|
|
|
from tools.scan_workstream_terminology import (
|
|
|
|
|
DEFAULT_ALLOWLIST_PATH,
|
|
|
|
|
load_allowlist,
|
|
|
|
|
path_is_excluded,
|
|
|
|
|
prose_gate_violations,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_load_allowlist_reads_fleet_config() -> None:
|
|
|
|
|
config = load_allowlist(DEFAULT_ALLOWLIST_PATH)
|
|
|
|
|
assert config["version"] == 1
|
|
|
|
|
assert "the-custodian" in config["per_repo"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_path_is_excluded_for_archived_workplans() -> None:
|
|
|
|
|
config = load_allowlist(DEFAULT_ALLOWLIST_PATH)
|
|
|
|
|
assert path_is_excluded("any-repo", "workplans/archived/foo.md", config)
|
|
|
|
|
assert not path_is_excluded("any-repo", "workplans/CUST-WP-0001.md", config)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_path_is_excluded_for_state_hub_compat_router() -> None:
|
|
|
|
|
config = load_allowlist(DEFAULT_ALLOWLIST_PATH)
|
|
|
|
|
assert path_is_excluded(
|
|
|
|
|
"state-hub",
|
|
|
|
|
"api/routers/workstreams.py",
|
|
|
|
|
config,
|
|
|
|
|
)
|
|
|
|
|
assert not path_is_excluded(
|
|
|
|
|
"state-hub",
|
|
|
|
|
"dashboard/src/index.md",
|
|
|
|
|
config,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
CUST-WP-0060 test coverage: validate_work_records suite + CI wiring + C-31 comment fix
Critical review of CUST-WP-0060 (T03-T06) found: shipped mechanism proven
only by manual/live-repo runs, no repeatable test suite; tests/ never
wired to CI at all (pre-existing gap, not introduced here).
- tests/test_validate_work_records.py: 30 tests against the live canon
registry/schemas — classify() incl. all grandfathered legacy id
schemes, per-kind schema gates (intake open/closed/promoted, decision
prepared/resolved, engagement prepared), multi-doc yaml handling,
malformed-yaml-only-errors-if-id-registered, main() end-to-end via
subprocess (exit codes, template placeholders, --strict escalation,
terminal-record historical grace incl. the boundary case that grace
must NOT mask real enum violations), and the jsonschema-unavailable
fallback path (the exact failure mode that broke the first Forgejo
CI run before the runner-substrate fix)
- tools/validate_work_records.py: docstring said 'authoritative detector
is fix-consistency C-25' — wrong, it landed as C-31 (C-25..C-30 were
already taken); comment now correct
- .forgejo/workflows/python-tests.yaml: wires tests/ to CI for the first
time in this repo (apt python3/pytest/jsonschema/yaml on the
node:20-bookworm substrate, same pattern as work-records.yaml)
- tests/test_scan_workstream_terminology.py: found one pre-existing,
unrelated failure while establishing the CI-representative baseline
(agentic-resources allowlist entry no longer sets exclude_repo — a
policy question, not a bug this task should resolve silently); marked
xfail(strict=True) with the finding recorded so CI has a clean signal
and a silent 'fix' doesn't go unnoticed either
Local verification with apt-sourced deps (jsonschema 4.10.3, matching the
CI runner's package source, not just pip): 34 passed, 1 known xfailed.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 23:09:25 +02:00
|
|
|
@pytest.mark.xfail(
|
|
|
|
|
reason="pre-existing, unrelated to CUST-WP-0060: scan_workstream_allowlist.yaml's "
|
|
|
|
|
"agentic-resources entry no longer sets exclude_repo: true, so the whole-repo "
|
|
|
|
|
"exclusion this test asserts doesn't currently hold. Found while wiring CI for "
|
|
|
|
|
"tests/ (previously unrun); needs an allowlist-owner decision (README.md is "
|
|
|
|
|
"user-facing prose that could legitimately want the scan), not a silent fix.",
|
|
|
|
|
strict=True,
|
|
|
|
|
)
|
2026-07-08 16:08:32 +02:00
|
|
|
def test_path_is_excluded_for_whole_repo() -> None:
|
|
|
|
|
config = load_allowlist(DEFAULT_ALLOWLIST_PATH)
|
|
|
|
|
assert path_is_excluded("agentic-resources", "README.md", config)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_prose_gate_violations_detect_user_facing_workstream() -> None:
|
|
|
|
|
root = Path(__file__).parent.parent
|
|
|
|
|
config = load_allowlist(DEFAULT_ALLOWLIST_PATH)
|
|
|
|
|
violations = prose_gate_violations(root, "the-custodian", config)
|
|
|
|
|
prose_paths = {path for path, _ in violations}
|
|
|
|
|
assert "canon/standards/workplan-terminology-fleet_v0.1.md" not in prose_paths
|