Skip to content

Audit fixes: metric convention required, publish guard, CI contracts job - #298

Merged
ronaldtse merged 1 commit into
mainfrom
feat/audit-fixes
Oct 18, 2026
Merged

ronaldtse merged 1 commit into
mainfrom
feat/audit-fixes

Conversation

@ronaldtse

Copy link
Copy Markdown
Contributor

Summary

The 2026-10-18 framework audit found three gaps between the WO52 spec
and reality; all are fixed here, tests-first (7 new tests watched
failing before implementation):

  • G1 — CI didn't enforce the contracts. isxml validate now runs
    as a CI job. Structural violations fail the build; license blocks
    print BLOCKED and stay non-failing in CI (they're owner decisions,
    enforced hard at publish time by the G3 guard).
  • G2 — gate numbers had no declared aggregation. The fas saga
    (five reproduction arms at 0.60–0.81% against a recorded 0.52%,
    root-caused to row-mean vs corpus-level CER) proved a gate without
    its metric convention is not a gate. GateSpec.convention is now
    required; every shipped recipe pins it (fas: corpus-level, others:
    row-mean).
  • G3 — the publish last-mile had no guard. pipeline/publish.py
    refuses to publish on: a moving/absent semver (versions are the
    owner's decision), any blocked license, any failing gate, or a
    missing conformance vectors file. The proven legacy publisher
    remains the invoked path; this layer decides whether it may run.

Test plan

  • 7 new tests in tests/test_audit_fixes.py (watched RED first)
  • Full suite 241 passed; ruff clean
  • isxml validate CI-mode smoke: 0 problem(s), 3 owner-blocked,
    exit 0

…rd, CI contracts job

Framework audit (2026-10-18) found three gaps; all fixed TDD-first:
- G1: CI never ran isxml validate — new contracts job; structural
  problems fail, license blocks report BLOCKED and are enforced at
  publish time (CI stays green while owner decisions are open)
- G2: gates now REQUIRE a metric convention (row-mean | corpus-level).
  The fas five-arm saga (0.60-0.81% vs a recorded 0.52%) proved a gate
  number without its aggregation is not a gate. All recipes pinned.
- G3: publish last-mile guard (pipeline/publish.py) — refuses moving
  versions, blocked licenses, failing gates, or missing conformance
  fixtures; the legacy publisher stays the invoked path.
Suite 241 green, ruff clean.
@ronaldtse
ronaldtse merged commit 56989a6 into main Oct 18, 2026
12 checks passed
@ronaldtse
ronaldtse deleted the feat/audit-fixes branch October 18, 2026 05:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant