feat(#85): IMP catalog builder invariant + VP runtime gate (u1~u7)

- u1: BuilderMissingError(FitError) — narrow exception aligned with pipeline catch
- u2: load_frame_contracts catalog invariant + VP skip + CatalogInvariantError
- u3a: audit CLI I1~I3 (partial existence / declared builder / registry membership)
- u3b: audit CLI I4 (slot_payload refs vs declared/generated payload keys)
- u4: lookup_v4_candidates VP filter (lookup_v4_all_judgments raw telemetry untouched)
- u5: catalog invariant regression coverage + temp non-VP failure fixtures
- u6: mdx04 VP routing fixture tests (sw_dependency_four_problems excluded from live)
- u7: tests/conftest.py env isolation + mdx03/mdx04/mdx05 subprocess smoke

Targeted 74 PASS (12.31s). Full regression 1063 PASS (87.70s). Audit CLI clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-23 16:56:38 +09:00
parent d9d338416a
commit cacc5b30db
14 changed files with 2163 additions and 3 deletions

View File

@@ -0,0 +1,17 @@
# IMP-#85 u5 fixture — non-VP contract whose payload.builder is absent from
# `PAYLOAD_BUILDERS`. Drives the u2 boot invariant + audit I3 negative paths.
#
# Scope (Stage 2 lock): regression coverage only. Not a runtime catalog entry.
# Frame id is in the 9999xxx range so any accidental cross-reference is obvious.
imp85_u5_missing_builder_frame:
template_id: imp85_u5_missing_builder_frame
frame_id: 9999001
family: imp85_u5_fixture
source_shape: top_bullets
cardinality:
strict: 3
payload:
title:
source: section.title
builder: definitely_not_a_registered_builder_imp85_u5

View File

@@ -0,0 +1,23 @@
# IMP-#85 u5 fixture — non-VP contract whose `items_with_role` builder produces
# a `slot_payload.<array_root>` key the partial never references. Drives the
# audit I4 (generated-key-orphan) negative path.
#
# Scope (Stage 2 lock): regression coverage only. The corresponding partial is
# written into a tmp dir by the test (it must NOT use `slot_payload[...]`
# bracket access, otherwise I4 suppresses correctly and the assertion fails).
imp85_u5_undeclared_slot_frame:
template_id: imp85_u5_undeclared_slot_frame
frame_id: 9999002
family: imp85_u5_fixture
source_shape: top_bullets
cardinality:
strict: 3
payload:
title:
source: section.title
builder: items_with_role
builder_options:
item_parser: pillar_item
array_root: orphan_array_root_imp85_u5
role_field: color_class