Completes the Wave M B3.5 consolidation slice (b–e), built on #728. B3.5-b — calibration as a first-class evidence subject (`calibration_class`, address `calibration:<class_name>`): RightInspector projection + Evidence Chain Rail semantics (serving-discipline evidence, not runtime truth). B3.5-c / B4a — nullable `LeewayEvidence` read model threaded through turn, replay, cognition-proposal, and math-proposal surfaces, with a shared absence-honest card. B4 is gated correctly: the tuple exists in typed data but no producer populates it, so the card renders absence (verified: no non-null producer in workbench/core/chat). B3.5-d/e — UI-UX-GUIDE.md, b4-leeway-feasibility-gate.md, phase-a-residue-ledger.md. Practice artifact — earn-it-for-real (runner-reproducible). The committed `report.json` (additive earns PROPOSE @0.861, 95/5/50) is now emitted by a deterministic runner rather than copied from the queue. `propose_runner` gains `regenerate_practice_artifacts()`, which runs ONE sealed `resolve_pooled` practice pass and writes BOTH report.json (the per-class ledger the calibration reader consumes) and ratification_queue.json — two projections of one ledger, coherent by construction and byte-reproducible. `runner.main()` delegates to it (lazy import, no cycle), so both entry points produce the identical pair. This closes the gap where a hand-copied report.json agreed with the queue but no runner produced it. `resolve_pooled` is the aggressive sealed PROPOSE-regime scorer (proposal-only/HITL, unsafe for serving, legitimate for attempt-and-eliminate); wrong=5 is the sealed-practice learning signal, NOT the serving wrong=0. No serving/derivation/reliability_gate source touched; the practice lane is not in the serving-frozen SHA gate. Validated: - python -m pytest tests/test_workbench_{calibration,journal,replay,schemas}.py -> 31 passed - python -m pytest tests/ -k "workbench or propose or learning_arena or practice" -> 190 passed (3 failing tests in test_adr_0175_phase2_practice_lane.py are PRE-EXISTING reds on clean origin/main: stale 4/0/46 assertions on build_report, which this change does not touch) - report.json + ratification_queue.json: deterministic (run1==run2) and reproduced byte-identically by both `python -m ...runner` and `...propose_runner` - pnpm build green; 144 UI tests across calibration/leeway/evidence/replay/ doctrine-gates/routes-docs-drift all pass
33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
import { render, screen } from "@testing-library/react";
|
|
import { describe, expect, it } from "vitest";
|
|
import { LeewayEvidenceCard } from "./LeewayEvidenceCard";
|
|
|
|
describe("LeewayEvidenceCard", () => {
|
|
it("renders a served-with-leeway tuple from typed data", () => {
|
|
render(
|
|
<LeewayEvidenceCard
|
|
evidence={{
|
|
class_name: "additive",
|
|
license: "PROPOSE",
|
|
theta: 0.85,
|
|
claim_disclosure: "approximate",
|
|
source_digest: "sha256:practice",
|
|
calibration_evidence_ref: "calibration:additive",
|
|
}}
|
|
/>,
|
|
);
|
|
expect(screen.getByText("additive")).toBeInTheDocument();
|
|
expect(screen.getByText(/PROPOSE · θ 85\.0%/)).toBeInTheDocument();
|
|
expect(screen.getByText("approximate")).toBeInTheDocument();
|
|
expect(screen.getByRole("link", { name: "calibration:additive" })).toHaveAttribute(
|
|
"href",
|
|
"/calibration?inspect=calibration%3Aadditive",
|
|
);
|
|
});
|
|
|
|
it("renders explicit absence for verified turns with no leeway tuple", () => {
|
|
render(<LeewayEvidenceCard evidence={null} />);
|
|
expect(screen.getByText("No leeway evidence recorded.")).toBeInTheDocument();
|
|
expect(screen.queryByText(/PROPOSE|SERVE/)).not.toBeInTheDocument();
|
|
});
|
|
});
|