Repository navigation
Implement transport mock coverage and type compatibility validation - #36
Merged
Merged
Conversation
This implements two key TODOs from the testgen-improvements.md document: **TODO 8.1: Transport-mock coverage assertion** ✅ - Added validation in `generate_test_module()` that checks every transport executor output port connected downstream has a corresponding mock in MockSpec - Panics early with helpful error if mocks are missing - Replaces manual "boundary presence" tests (Pattern A) **TODO 8.2: Mock-value type compatibility assertion** ✅ - Added validation that checks mock values have compatible types with DAG ports - Detects when a String mock is provided for an Int port, etc. - Handles special cases: Skipped compatible with all, Map-backed types (ToolHandle, AuthToken, Timestamp, etc.), Json flexibility - Catches type drift between MockSpec and DAG definitions **Pattern A, C, D test deletions (TODO 8.4 partial)** - Deleted 5 redundant tests from gist/graph_mock.rs: - 2 Pattern A (boundary presence): test_snapshot/diff_mock_spec_has_boundaries - 2 Pattern C (self-chain): test_snapshot/diff_chain_validation_self - 1 Pattern D (resource presence): test_resource_lock_present - Kept Pattern B tests (mode behavior, URL validity) as they test MockSpec logic Also fixed existing tests that had type mismatches in their MockSpecs, proving the new validation catches real issues. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
This implements the foundation for Phase 9 DagSpec: typed mock requirements
that make it structurally impossible to have incorrect or incomplete mocks.
## New module: mock_requirements
**MockRequirements**: Builder that knows exactly what mocks a DAG needs.
- Extracted from DAG via `extract_mock_requirements(&dag, "name")`
- Type-checks mock values at construction time, not at testgen
- Refuses to build MockSpec until all required slots are filled
**MockSlot**: Describes one required mock (node, port, type, cardinality).
- Categorized by kind: Boundary, Transport, or Resource
- Carries type information for validation
**Key functions**:
- `extract_mock_requirements()`: Analyze DAG structure to determine mock needs
- `.boundary()`, `.boundary_str()`, etc.: Type-checked mock setters
- `.build()`: Only succeeds if all required mocks provided
## Design principle
Instead of validating MockSpec against DAG at testgen time:
```rust
// Old: validate late, panic with error
TestGenerator::new(&dag).with_mock_spec(spec) // might panic
```
Type errors are caught at mock construction:
```rust
// New: impossible to construct invalid spec
let spec = extract_mock_requirements(&dag, "name")
.boundary_str("node", "port", "value") // type-checked here
.unwrap()
.build() // fails if incomplete
.unwrap();
```
## Files
- `TODO/design-typed-mock-builder.md`: Design document
- `core/test/src/mock_requirements.rs`: Implementation
- `core/test/src/lib.rs`: Module exports
This is a foundation - existing MockSpecs still work. Migration to the new
pattern will make the testgen validation panics (TODO 8.1, 8.3) unreachable.
https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
- Rewrite gist_mock_spec() to extract requirements from actual DAG - Add resource node output extraction to extract_mock_requirements() - Add Int->Timestamp type compatibility for serialized timestamps - Add get_transport_mock() getter to MockSpec - Update tests to use new pattern (get_transport_mock instead of get_boundary_mock) This demonstrates the "impossible by construction" approach: - DAG is built first - Requirements extracted from DAG structure - Mocks are type-checked at construction time - Missing mocks cause immediate panic, not testgen failure https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
- Rewrite deps_mock_spec() to extract requirements from actual DAG - Fix extract_mock_requirements() to only require mocks for transport/resource nodes (pure terminal outputs are computed, not mocked) - Add String->Platform type compatibility for string-backed enums - Update design-typed-mock-builder.md to reflect implemented status - Simplify deps MockSpec tests to Pattern B only (resource/value checks) Key insight: Pure node terminal outputs (parse_manifest.*, etc.) should NOT require mocks - they're computed during DryRun execution. Only transport and resource outputs need mocks for DryRun interception. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
- Rewrite makegen_mock_spec() to extract requirements from actual DAG - Provide mocks for all transport node outputs (response, written_path, content) - Update no_change and fs_fails variants with complete transport mocks - Fix test to query expected_outputs Vec instead of HashMap - Update design doc migration status Key insight: Transport nodes with multiple outputs require mocks for ALL outputs, not just the response. This is because DryRun intercepts the entire node execution and returns all mocked output values. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
- Rewrite bootstrap_mock_spec() to extract requirements from actual DAG - Remove stale references to write_files node (doesn't exist) - Provide mocks for all three transport nodes: - execute_scan_workspace (workspace scanning) - execute_makefile_transport (Makefile write) - execute_gitignore_transport (.gitignore write) - Update all variant specs (makefile_only, makefile_fails, all_fail) - Update design doc migration status Bootstrap has three transport nodes with multiple outputs each, making it a good test case for the typed mock builder pattern. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
This is a more complex migration involving: - Multiple transport nodes (execute_deps_exists, execute_codegen_exists, execute_codegen, execute_build, execute_test) - A resource node (runner_env providing tool:clippy) - A CliTool node (clippy_lint) that doesn't fit the typed pattern The CliTool node (clippy_lint) is handled with post-build .transport_mock() calls since it doesn't consume TransportRequest and thus isn't detected by extract_mock_requirements(). Also removes unused mock_ci_report_* helper functions since report outputs are computed by the pure report node, not mocked. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
Migrates both inline_review_mock_spec() and diff_review_mock_spec() to use extract_mock_requirements(). Both graphs have: - auth_env resource node providing AuthToken - execute_llm transport node for LLM API calls - execute_diff transport node (diff graph only) Pure terminal outputs (parse_response.output, parse_response.errors, parse_diff.stats) are computed during execution, not mocked. Also removes duplicate boundary/transport_mock calls that existed in the old code - the typed builder pattern makes this clearer. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
The llm-ops mock specs (openai_mock_spec, anthropic_mock_spec, etc.) don't have corresponding DAG builders - they define expected node patterns for testing the LLM workflow interface. The typed mock builder pattern requires a DAG to extract requirements from. These mock specs are still useful for testing the LLM ops pattern but don't fit the "DAG → extract → type-check → build" flow. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f09103af25
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Two issues fixed: P1: extract_mock_requirements now requires mocks for ALL transport node outputs, not just connected ones. DryRun interception requires a mock for every output port on intercepted nodes, so missing unconnected outputs would cause runtime failures even if test generation passed. P2: Failure mock specs (ci_mock_spec_test_fails, ci_mock_spec_build_fails, ci_mock_spec_prep_fails, ci_mock_spec_lint_fails) now actually model failure scenarios instead of silently using success-path mocks. Each spec explicitly provides failure-specific transport responses. https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
Multiple improvements based on thorough code review: 1. **Unified type compatibility** between MockRequirements and codegen testgen: - Both now allow Int → Timestamp (Timestamp serializes as Int) - Both now allow String → Platform (Platform serializes as String) - Both now allow Map → Platform (for structured platform info) - Removed Timestamp from map_backed types (it's Int-backed) 2. **Added unknown mock slot validation** in testgen: - Panics if MockSpec contains mocks for non-existent nodes/ports - Catches typos and stale mocks early 3. **Documented CardinalityMismatch as not yet implemented**: - Added #[allow(dead_code)] and documentation - Cardinality validation planned for future 4. **Prevent duplicate mock entries**: - Setting the same slot twice now replaces instead of duplicating - Uses retain() to remove existing entry before push() 5. **Extended requirements extraction to cover CliTool nodes**: - Nodes with ToolHandle input (like clippy_lint) now detected - All their outputs require mocks for DryRun interception - CI graph_mock no longer needs manual post-build .transport_mock() calls 6. **Updated CI mock specs to use typed builder for all mocks**: - with_ci_typed_mocks now includes clippy_lint mocks - Failure specs explicitly provide clippy_lint mocks before build_unchecked() https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW
This was referenced May 6, 2026
briansrls
added a commit
that referenced
this pull request
May 10, 2026
briansrls
added a commit
that referenced
this pull request
May 10, 2026
…G-2 manifest (#2496) * WIP: R3 gate #36: bridge retirement ledger zero * WIP: R3 gate #36: bridge retirement ledger zero * fix(v3): refresh SG-2 parse corpus manifest for types.dag `handwritten_parse_snapshot_matches_manifest` hashes the v3 parse surface `Debug` output; comment edits on `dsl/std/types.dag` changed the fingerprint without updating the manifest, breaking the v3 CI suite. Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
This was referenced May 10, 2026
briansrls
added a commit
that referenced
this pull request
May 10, 2026
Promotes 4 §1.8 rows with PR-evidence on main. PB Mgr post-merge ledger-receipt sync per Director ratification at gunbc#828 (c#4415884211; same pattern as PR #2399). Promotions: - #6 lens_testgen_dot_rs_retired DECLARED -> CONSUMER_LANDED + PASSING (PR #2392 producer + PR #2594 regression-guard; lens_testgen.rs absent on disk; consumer-side ratchet test landed) - #33 bridge_canonical_lens_name_dispatch_retired DECLARED -> CONSUMER_LANDED (PR #2449) - #34 bridge_include_str_side_channels_retired DECLARED -> CONSUMER_LANDED (slice scope) (PR #2459 pipeline.dag slice; standalone closure brief #1976 STOP-BLOCKED on Substrate T1) - #66 lens_producer_retirement_executable_witness Notes-update only (PR #2595 substrate-impl landed: TestRunner executes .dag PB census claim and reports residual; closure-receipt remains F3-DEFERRED per PB Mgr disposition) Excluded (out of charter): - #31 -> Substrate (#2068) - #36 -> Verification (#2075) Excluded (T-V2-Retirement HELD on PM-authored S-1 brief #1974): - #41 / #42 / #60 / #71 Pre-authored brief at docs/briefs/r3-pb-status-drift-sweep-post-tlp.md covers the post-T-LP cascade wave (G5/G7/G8). Closes PB Mgr drift-sweep obligation for already-merged evidence; G5/G7/G8 remain queued per pre-authored brief. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This was referenced May 10, 2026
briansrls
added a commit
that referenced
this pull request
May 10, 2026
…2631) * docs(audit): land R-3 + R-7 ratifications (T-Tier3 perf budget) §5.1 designation in canonical-bench-host-decision-matrix: Option A ubicloud-standard-2 ratified 2026-05-08 per PB Manager (warm-dove-618); Director ratification at gunbc#828 c#4403509523. §2 capture procedure: multi-run discipline addendum — N=5 preferred, median-of-medians for median_ns, max-p99-across-runs for p99_ns, per-run intermediates committed alongside final tier3_baseline.json. Both lines unblock #2204 slice dispatch (Substrate-side PerfWithinBaseline variant + PerfBaselineMeasurement carrier); PB consumer slice queues post-#2204 land. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * PB Item 5 brief — encode substrate disposition (#2068 P1 RATIFIED) Substrate Mgr (warm-wolf-698) ratified §7.3 disposition at gunbc#2068 c#4411574142: shape (b) CensusSubsetCount filter with closed predicate BinShimFilesSubsetPredicate, mirroring existing LensProducerFilesSubsetPredicate precedent. Per feedback_strict_mirror_vs_novel_substrate_fact, strict-mirror ratifies directly (no canvas needed). Updates r3-pb-binshim-retirement-worker.md: - New §"Substrate landings (locked shape)" with the 4 required artifacts (substrate marker type + value, runtime predicate body, dispatch branch). - §7.3 acceptance now authorable; locked TestClaim shape recorded. - Dispatch precondition (5): unauthorable → RESOLVED. - STOP condition: §7.3 disposition not-yet-live → drift-detection. - Status header: PROPOSAL → READY-FOR-DISPATCH posture (pending only the standard R2/R2-Evaluator close signal; both Item-4 sub-gates met via PR #2282 / #2227 close). Bin-shim file inventory at main 5a13ed8: 9 files in src/v3/compiler/src/bin/; closure when CensusSubsetCount predicate count == 0. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: R3 PB Mgr — lane through R3 close * brief: clarify §7.3 TestClaim is zero-only (not schedule-bound) Addresses non-blocking improvement on PR #2334 (codex review sha=68977425): the prior wording called CensusSubsetCount a schedule-bound gate, but the runtime predicate (test_runner.rs:3290-3296) is zero-only — Pass iff count==0. Interim per-PR shrink receipts are PR-level milestones outside this TestClaim, not TestClaim verdicts. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * brief: reconcile §"Substrate landings" with Non-goals (PB strict-mirror authoring authorized post-#2068) Addresses non-blocking improvement on PR #2334 (codex review sha=363cf799): the new §"Substrate landings (locked shape)" worker-owned list contradicted the unchanged "out of scope" entries that still said PB lane does not author §7.3 substrate shape. Resolution: per #2068 c#4411574142 ratification + feedback_strict_mirror_vs_ novel_substrate_fact, strict-mirror declarations (mirroring the existing LensProducerFilesSubsetPredicate precedent) are PB-lane-authorable. The non-goal still applies to *novel* shape (extra fields, alternative coproducts) which would re-escalate to Substrate Mgr. Updates: - "PB does not own and must not edit" entry (line 29): clarifies shape question is Substrate-territory but strict-mirror authoring is authorized. - Non-goals (line 155): same reconciliation; novel shape still gates back to Substrate Mgr. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * PB Item 5 follow-on brief — batch retirement for 8 remaining bin-shims Director re-task at gunbc#828 c#4413892216 Task A: author per-shim retirement worker briefs for the 9 bin-shims; 1 covered by gate #7 (warm-crab-600 working regen_lens.rs); 8 unscoped (emit_method_template_projection, r1c_e_emit_gates, regen_bootstrap, regen_parse, regen_parse_tables, regen_tokenize, regen_v3, self_host_fixed_point). This brief governs the 8-shim batch follow-on against the canonical r3-pb-binshim-retirement-worker.md template. Status PROPOSAL — dispatch-gated on: - smart-tern-649 Stage A landing (BinShimFilesSubsetPredicate carriers + runtime predicate) - warm-crab-600 gate #7 first-cut precedent on main Three staging shapes documented (mega-PR / serial-per-shim / batched-2-3); PB Mgr leans batched-by-regen-family. Worker chooses at dispatch. STOP-AND-PING conditions enumerated (substrate-carrier absent / carrier shape pressure / emit-pattern divergence / substrate-grep mismatch). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * fix-forward (PR #2471 codex REQUEST_CHANGES) Two findings addressed: 1. Carrier-shape mismatch (line 43): brief template said `name:` but the locked BinShim carrier per design-pb-runtime-interpreter.md:200-204 uses `entrypoint_name`, `description`, `entry`. P2 single-authority violation would have routed workers against wrong shape. Fixed: template now matches locked shape verbatim with explicit no-additional-fields clause. 2. Dispatch-gate dilution (lines 33, 98): brief reduced operative dispatch gate to "Stage A landing + gate #7 precedent" but parent brief enumerates 5 preconditions (R2 close + R2-Evaluator landed + Item 4 sub-gate green + BinShim carrier live + §7.3 disposition). P5 fail-closed violation. Fixed: full readiness prerequisite inherited verbatim from parent brief; gate #7 precedent demoted to implementation-pattern reference (not gate). Worker dispatch posture updated to require all 5 preconditions verified on main at dispatch time per feedback_substrate_grep_before_authoring. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * WIP: R3 PB Mgr — lane through R3 close * docs(r3): §1.8 ledger Status drift sweep — post-T-LP / T-Bridge wave Promotes 4 §1.8 rows with PR-evidence on main. PB Mgr post-merge ledger-receipt sync per Director ratification at gunbc#828 (c#4415884211; same pattern as PR #2399). Promotions: - #6 lens_testgen_dot_rs_retired DECLARED -> CONSUMER_LANDED + PASSING (PR #2392 producer + PR #2594 regression-guard; lens_testgen.rs absent on disk; consumer-side ratchet test landed) - #33 bridge_canonical_lens_name_dispatch_retired DECLARED -> CONSUMER_LANDED (PR #2449) - #34 bridge_include_str_side_channels_retired DECLARED -> CONSUMER_LANDED (slice scope) (PR #2459 pipeline.dag slice; standalone closure brief #1976 STOP-BLOCKED on Substrate T1) - #66 lens_producer_retirement_executable_witness Notes-update only (PR #2595 substrate-impl landed: TestRunner executes .dag PB census claim and reports residual; closure-receipt remains F3-DEFERRED per PB Mgr disposition) Excluded (out of charter): - #31 -> Substrate (#2068) - #36 -> Verification (#2075) Excluded (T-V2-Retirement HELD on PM-authored S-1 brief #1974): - #41 / #42 / #60 / #71 Pre-authored brief at docs/briefs/r3-pb-status-drift-sweep-post-tlp.md covers the post-T-LP cascade wave (G5/G7/G8). Closes PB Mgr drift-sweep obligation for already-merged evidence; G5/G7/G8 remain queued per pre-authored brief. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(briefs): fix gate #64 → #66 mislabel in drift-sweep brief Per cursor/composer-2 review on PR #2631: brief table + dispatch-trigger parenthetical labeled lens_producer_retirement_executable_witness as gate #64. Authoritative §1.8 row is #66; #64 is substrate_gap_reflection_closure_closed (separate predicate). Aligns brief with r3-program-plan.md §1.8 row identity per INVARIANTS.md P1 (single authoritative facts). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * docs(r3): row #66 DECLARED → CONSUMER_LANDED per §1.7 taxonomy Per codex/codex-default review on PR #2631 (REQUEST_CHANGES, review 9150): leaving row #66 at DECLARED while the Notes cell describes an executable consumer that runs through TestRunner contradicts the §1.7 status taxonomy and INVARIANTS P2 single-authority discipline. Promoting #66 to CONSUMER_LANDED with explicit PASSING gate on residual = 0 (cascades from T-LensProducer-Retirement gates #5 + #6 + #7). The F3 deferral is on PASSING, not CONSUMER_LANDED; the executable receipt src/v3/compiler/tests/integration/r3_lens_producer_retirement_executable_witness_test.rs already exists and runs the .dag PB census claim through TestRunner. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3 tasks done
briansrls
added a commit
that referenced
this pull request
May 12, 2026
…ion-owned) — codex BLOCKING review 10431 on PR #2782 (1) S2 brief deleted: per docs/r3-program-plan.md:311-312 — #85 carriers already landed via PR #2647, remaining work is consumer-side (Verification lane / V Mgr #87 cascade); #86 already CONSUMER_LANDED + PASSING. Substrate lane has no work on these gates. (2) S4 brief deleted: per docs/r3-structure.md:214 + docs/r3-program-plan.md:391 (Director-locked 2026-04-28 distribute-work-centralize-ledger) — #36 bridge_retirement_ledger_zero is Verification-owned. The 5 distributed bridges are separate gates (2 Substrate, 3 PB); none is #36. (3) Authored r3-wave1-substrate-lane-retractions.md as audit-trail receipt + updated queue (5 items down from 7). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
briansrls
added a commit
that referenced
this pull request
May 14, 2026
briansrls
added a commit
that referenced
this pull request
May 14, 2026
briansrls
added a commit
that referenced
this pull request
May 14, 2026
* WIP: R3 gate #36: bridge_retirement_ledger_zero (T-Bridge-Retirement) * WIP: R3 gate #36: bridge_retirement_ledger_zero (T-Bridge-Retirement) * chore: regen bootstrap snapshots after types.dag comment drift CI `regen_bootstrap --verify` failed: committed std/bootstrap snapshots embedded stale `SourceSpan` byte ranges for `dsl/std/types.dag` after the kernel Bool inhabits comment update. Regenerate the three PB-1-e snapshot artifacts so verify matches fresh fixture lowering. Co-authored-by: Cursor <cursoragent@cursor.com> * WIP: R3 gate #36: bridge_retirement_ledger_zero (T-Bridge-Retirement) * chore: regen PB-1 snapshots after bridge_ledger comment edit `bridge_ledger.dag` header drift shifts embedded `SourceSpan`s in `bootstrap_generated*.rs`. Re-run `regen_bootstrap`; apply rustfmt on `ensure_kernel_bool_lane1e2b_bootstrap_witness`. Co-authored-by: Cursor <cursoragent@cursor.com> * refactor: avoid expect in kernel Bool bootstrap witness Per review: use `let Some(inh_id) = … else { return }` after optional `wire_kernel_bool_boolean_algebra_inhabits` so the library path never panics when inhabitance stays unset (diagnostics-only failure). Co-authored-by: Cursor <cursoragent@cursor.com> --------- Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Completes TODO 8.1 and 8.3 by adding automated validation of transport mock coverage and mock value type compatibility to testgen. This eliminates the need for manual boundary presence and type mismatch tests.
Key Changes
Transport Mock Coverage Validation (TODO 8.1)
find_missing_transport_mocks()helper that identifies transport executor output ports connected downstream but lacking mocks in MockSpecMock Value Type Compatibility Validation (TODO 8.3)
find_mock_type_mismatches()helper that validates each mock value's type against the port's declared TypeIdAnytype matches anythingValue::Skippedcompatible with all typesJsonflexible with any value typeMapvalues compatible with structured types (ToolHandle, AuthToken, etc.)Test Updates
transport_mock()instead ofboundary()for transport executor outputstest_transport_mock_coverage_required()- validates panic on incomplete mockstest_transport_mock_coverage_passes_when_complete()- validates success pathtest_mock_type_mismatch_detected()- validates type checkingtest_mock_type_compatibility_accepts_skipped()- validates Skipped compatibilitytest_mock_type_compatibility_accepts_json()- validates Json flexibilityRedundant Test Cleanup
Documentation
https://claude.ai/code/session_01AH7FXhHKtqLPkpv3md8wfW