{
"schemaVersion": 1,
"purpose": "Superset census of existing non-Ruby Rust tests. Unmapped is pending behavioral classification, not proof of a missing capability. Several tests may map to one Ruby fixture; shared contracts need an explicit rationale.",
"files": {
"src/analysis/evidence.rs": {
"sourceSha256": "4aac9c217c5aeb7e744a9e700c2229d944bd51820ac52f1438d431900bd8b580",
"tests": [
{
"name": "matcher_diffs_cover_empty_identical_disjoint_and_unicode_inputs",
"requiredStatus": "engine-invariant",
"stage": "matcher-text",
"rationale": "Adapter-independent stage `matcher-text`: Prefix/change/suffix diff over two matcher strings; pure text math.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "semantic_fingerprints_preserve_component_boundaries",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Semantic fingerprint framing of normalized matcher, flags and alpha components.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "pair_evidence_contract_includes_matchers_fingerprints_and_handler_classification",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_normalized_handler_evidence_and_snippets_preserve_final_outcomes"
},
"rationale": "A same-matcher Ruby pair whose bodies differ by a 4,100-character Unicode comment and `{}` versus `do...end` reports the normalized evidence tier with bounded comparison snippets. Exact, alpha, structural and different tiers remain pinned by `ruby_pair_evidence_reports_similarity_paths_and_matcher_delta`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "semantic_fingerprint_distinguishes_matcher_syntax",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Semantic fingerprint includes the matcher kind component.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/analysis/pairs/tests.rs": {
"sourceSha256": "0b9c48582b18769ae611a1396747b0da7350858369e5a5d54c1f21adf3b9176b",
"tests": [
{
"name": "fuzzy_pair_evidence_is_never_collapsed_into_clusters",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_pair_clusters_keep_fuzzy_and_suppressed_evidence_apart"
},
"rationale": "Six Ruby definitions with identical handlers yield four near-duplicate-step findings (lines 1-2, 1-3, 1-4, 1-5) connecting five definitions; each stays a pair with comparison evidence and no cluster, while duplicate-handler findings on the same definitions do collapse.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "cluster_reporting_does_not_cross_suppression_partitions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_pair_clusters_keep_fuzzy_and_suppressed_evidence_apart"
},
"rationale": "A matcher suppression selects the sixth definition: the suppressed duplicate-handler pair (lines 1-6) keeps comparison evidence and one related location, and the active findings collapse into one cluster of 5 members with 4 related locations.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_source_flags_preserve_independent_rule_inputs",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence for multi-source candidates: Ruby pins each candidate source feeding its own rule (`ruby_candidate_sources_feed_their_rules_with_computed_evidence`), but a pair carrying two source flags, and the normalized-only and structural near-feed bits, has no adapter producer because candidate sources never propose the same pair twice. Decide whether the flag merge is reachable or engine-only.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_shingle_keys_are_case_folded_unicode_safe_and_deduplicated",
"requiredStatus": "engine-invariant",
"stage": "matcher-text",
"rationale": "Adapter-independent stage `matcher-text`: Shingle keys over matcher text; pure text math.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_shingle_keys_bound_allocation_for_large_inputs",
"requiredStatus": "engine-invariant",
"stage": "matcher-text",
"rationale": "Adapter-independent stage `matcher-text`: Shingle keys over matcher text; pure text math.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_fails_closed_when_a_work_budget_is_exceeded",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_fails_closed_at_every_work_budget"
},
"rationale": "Shingle limit, exact: a 4,098-character matcher (4,096 shingles) keeps a neighbouring candidate, 4,099 skips matcherBlocking once and drops it. Event limit, exact: 512 definitions each share a bit-tag posting with every index except their complement (510 pairs each); 19 calls per handler, 151 repeating one, plus a separate 108/107-call pair cost exactly 10,000,000 and complete; one more repeated call in that pair makes 10,000,001 and truncates. Proposal limit, exact: 2,048 definitions in 4-definition files with file-local captures and two calls per handler propose 1,996,800 unique pairs; an 80-definition clique plus a hub with 40 spokes brings proposals to exactly 2,000,000, which completes, and a 41st spoke truncates. Almost all proposals are runtime-incompatible, and charging event work for rejected pairs would truncate the at-limit row.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "handler_prefilters_are_safe_upper_bounds_for_the_near_rule",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence for `covered_by_structural_source`: value-only rejection refuses the same pairs, so no Ruby run distinguishes the structural-coverage check (three `{red|green|blue}` definitions at structural limit 1 report matcherBlocking 0 either way). `ruby_matcher_blocking_prefilters_are_safe_upper_bounds` pins the similarity gate and the equal-structure shortcut (same-structure trusted assertions with conflicting values are not admitted; a shared-action control is).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "behavior_events_are_interned_before_pairwise_sequence_comparison",
"requiredStatus": "engine-invariant",
"stage": "lcs-math",
"rationale": "Adapter-independent stage `lcs-math`: Event interning before LCS over constructed event lists; pure sequence math.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_rejections_do_not_spend_handler_lcs_work",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unneeded_similarity_stages_do_not_spend_pair_work"
},
"rationale": "Two Ruby handlers with 10,001 action events each and non-near matchers (`abc x*64` / `abc y*64`) form one matcherBlocking candidate that is evaluated without truncation, incompleteness or findings; the control with near matchers charges the handler LCS matrix past the 100,000,000-cell ceiling and is skipped.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_survivors_retain_computed_similarity_evidence",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_sources_feed_their_rules_with_computed_evidence"
},
"rationale": "The original's matchers and five-versus-three call streams, with nearDuplicateHandlerSimilarity 0.5, give one matcherBlocking candidate whose near finding reports handlerSimilarity 0.6, `Handlers share 60.0% ordered behavior`, comparison evidence, and the same matcherSimilarity (< 1.0) as an identical-handler control on the same matchers.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "disabled_source_rules_do_not_leak_placeholder_similarity_evidence",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_sources_feed_their_rules_with_computed_evidence"
},
"rationale": "With duplicate-handler off, the identical-handler pair reports only near-duplicate-step; with near-duplicate-step off, only duplicate-handler. Each reports handlerSimilarity 1.0, comparison evidence, and the matcherSimilarity of the default run, never the 0.0 placeholder.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "disabled_parameterization_skips_unreachable_structural_matcher_work",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence that structural pairs cannot feed the near rule. `ruby_unneeded_similarity_stages_do_not_spend_pair_work` pins the disabled-rule half (with parameterization-candidate off, a structural `page.theme(1)`/`page.theme(2)` pair with 10,002-character matchers spends no matcher matrix work). No Ruby shape yields a structural pair that is otherwise near-eligible: action streams reject value-only differences, complete-event streams record every literal, and other streams require the same handler (about 20 trusted shapes tried).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "work_accounting_contract_charges_similarity_stages_and_enforces_boundaries",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence for the masked partial-stream case and the `u64` overflow guard, which no input reaches. The 1e9 total similarity budget and evidence-stage charging are pinned exactly by `ruby_pair_verification_fails_closed_at_the_total_similarity_budget` (32 identical-handler definitions with a 58,527- versus 58,528-character literal flip truncation); matcher-blocking budgets by `ruby_matcher_blocking_fails_closed_at_every_work_budget`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "work_accounting_contract_charges_only_rules_that_will_be_evaluated",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_suppression_work_is_charged_only_for_reported_rules"
},
"rationale": "An identical-handler pair reporting duplicate-handler and near-duplicate-step, with 4,000-byte matchers (16,038 work per entry): 3,117 path entries for each reported rule fit the 100,000,000 suppression budget, 3,118 truncate, and 3,118 entries for unreported parameterization-candidate plus 3,118 for near-duplicate-step do not truncate.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "saturated_matcher_postings_use_a_linear_lexical_fallback",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_saturated_matcher_postings_use_independent_linear_fallbacks"
},
"rationale": "257 Ruby definitions `the account record NNN is enabled` share every shingle (posting 257 > 256): matcher blocking evaluates exactly 256 lexical-neighbour candidates, skips none, and reports the record 000 / record 001 pair.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "saturated_matcher_fallback_keeps_interleaved_postings_independent",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_saturated_matcher_postings_use_independent_linear_fallbacks"
},
"rationale": "257 indices x two interleaved groups (`NNN aaa shared`, `NNN bbb shared`), cross-group overlap 1/5: 512 candidates, none skipped, including 000 aaa / 001 aaa and 000 bbb / 001 bbb, which a merged lexical order would never pair.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "repeated_posting_pairs_are_charged_once_and_fallback_requires_saturation",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_saturated_matcher_postings_use_independent_linear_fallbacks"
},
"rationale": "256 definitions sharing an 80-character prefix put 32,640 pairs in each of 78 identical postings (2,545,920 if repeats were charged against the 2,000,000 limit): no truncation and no candidate. A 256-member posting is fully expanded (32,640 candidates) rather than sampled.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "mixed_near_profiles_preserve_outcomes_and_budget_in_both_orders",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_mixed_near_profiles_preserve_outcomes_and_budget_in_both_orders"
},
"rationale": "Configured-assertion Ruby handlers: complete-event versus exact-policy (untrusted `expect`) with different handlers gives no finding, also with 10,002-character matchers; two complete streams give a near finding; two identical exact-policy handlers give a finding. Every row, in both orders, evaluates one candidate with no truncation and no diagnostic beyond the two missing-feature warnings.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/analysis/similarity.rs": {
"sourceSha256": "81b39d1faf7ca2de29fd5884ce26882f619aa9ffd85201a1e9e9ab86965819b7",
"tests": [
{
"name": "matcher_gate_rejects_mixed_syntax_and_polarity_conflicts",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_near_wording_rejects_mixed_syntax_and_opposite_words"
},
"rationale": "A Cucumber expression against a regex with the same text, and against a regex one word away, are not near; the regex/regex and expression/expression pairs one word apart are near. inactive and cannot rows pin the polarity half.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "similarity_helpers_cover_empty_exact_structural_and_lcs_paths",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_pair_evidence_reports_similarity_paths_and_matcher_delta"
},
"rationale": "Ruby pairs pin the helper paths: `Given('')` beside `Given(//)` reaches the empty-matcher branch (matcherSimilarity 1.0), and alpha, structural, ordered-overlap and empty-stream handler pairs give 1.0, 0.95, 0.5/0.667 and 0.0.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "method_metadata_is_a_compatibility_gate_not_similarity_evidence",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: decorated-method runtime metadata (async/static/generator/getter) exists only for JS/TS class-method handlers. Semantic residue: none; Ruby registers blocks and methods without such modifiers.",
"behaviorClass": "language-specific-api"
}
]
},
"src/analysis/tests.rs": {
"sourceSha256": "437896b7149bff26f7ac79e4540b450f7e4df2c515480d10fb28e3c226edbc42",
"tests": [
{
"name": "public_analysis_rejects_mutated_configs_above_hard_safety_ceilings",
"requiredStatus": "engine-invariant",
"stage": "api-shape",
"rationale": "Adapter-independent stage `api-shape`: the library `analyze` and `analyze_with_diagnostics` entry points re-validate a `Config` mutated after decoding; the test passes empty inputs, so no adapter-produced data is consumed, and Ruby source never constructs a `Config`; and every config-file and CLI path rejects the values before analysis starts. `ruby_candidate_limits_cannot_exceed_hard_safety_ceilings` pins the end-to-end rejection and the accepted ceilings on a Ruby corpus.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "equivalent_assertion_factory_syntax_preserves_conflicting_values",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "closed_assertion_origins_preserve_opposing_and_equivalent_outcomes"
},
"rationale": "Configured Ruby factories reached through `method(:expect)`, `api.fetch(:expect)` and a static `api[:expect]` alias retain the equal visibility finding while opposing literal values produce no parameterization; the same spellings without provider authority retain ordinary parameterization instead of gaining assertion trust.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "future_local_declarations_do_not_expose_outer_assertion_values",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "top_level_constants_resolve_to_immutable_literal_values"
},
"rationale": "Ruby constants declared after registrations resolve only to their final immutable literal identity: equal later values retain duplicate-handler, conflicting later values do not, while a second, nested, operator, destructured or reflective write removes that authority.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "nested_assertion_builders_validate_their_origin_and_arguments",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`nested assertion builders validate their origin and arguments`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "computed_nested_matchers_preserve_dotted_semantics",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`computed nested matchers preserve dotted semantics`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "unresolved_subject_shadows_do_not_collapse_to_empty_values",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "enclosing_scope_bindings_shadow_file_locals_with_scope_identity"
},
"rationale": "A Ruby block parameter named like a file local remains the unresolved inner expected-value binding and produces no handler finding; a direct equal-literal control retains duplicate and near findings, and existing parameter/block-local rows distinguish stable shadowing from writes that make the source incomplete.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "reassigned_asymmetric_matchers_lose_trust_without_changing_outer_factory",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "matcher_alias_mutations_preserve_controls_and_withdraw_optional_comparison"
},
"rationale": "Mutating a Ruby factory's `object_containing` or `not` matcher path through the factory or a shared alias removes matcher-based handler comparison, while the direct factory remains independently usable and an unrelated copied path retains its positive control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "namespace_matcher_mutations_follow_computed_and_destructured_aliases",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "matcher_alias_mutations_preserve_controls_and_withdraw_optional_comparison"
},
"rationale": "A Ruby `api[:expect]` lookup and aliases of the `api` hash share matcher authority: writing `object_containing` through the alias removes the duplicate-handler finding, while the unmodified static lookup retains it and a runtime-key lookup gains no authority.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "computed_destructuring_distinguishes_trust_from_possible_mutation",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "matcher_alias_mutations_preserve_controls_and_withdraw_optional_comparison"
},
"rationale": "Static Ruby `api[:expect]` access grants matcher trust only while its shared path is immutable; `api[runtime_key]` followed by mutation never grants trust, and an independent `dup` preserves the original only until a write reaches the shared nested matcher object.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "parameterized_inline_calls_keep_execution_context_without_handler_findings",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "declared_local_callables_execute_only_at_proven_invocations"
},
"rationale": "A parameterized Ruby lambda invoked with different arguments yields no duplicate, near or parameterization finding because substitution is unproven; parameterless direct, assigned, argument and block invocations retain their executed assertion outcomes, with equal-value positive controls and conflicting-value negatives.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "deferred_assertion_disagreement_cannot_be_outweighed_by_shared_calls",
"requiredStatus": "covered",
"fixtureGroup": "review-gap-deferred-assertions",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `review-gap-deferred-assertions` requiredAbsent[0]: Deferred Ruby assertion disagreement blocks near despite shared calls.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "repeated_commonjs_loads_share_only_guarded_mutation_provenance",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: repeated CommonJS `require` loads sharing guarded mutation provenance. Semantic residue: Ruby repeated loads and factory mutation are covered by load-cycle and equivalent-provider-factory-mutation.",
"behaviorClass": "language-specific-api"
},
{
"name": "destructured_negation_mutations_do_not_establish_handler_equivalence",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "matcher_alias_mutations_preserve_controls_and_withdraw_optional_comparison"
},
"rationale": "A Ruby alias of `api[:expect].not` that mutates `object_containing` removes optional comparison; the immutable negated matcher control compares, and mutations of an independent outer copy do not revoke the original unless they reach the shared nested `not` path.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "direct_generator_calls_do_not_contribute_suspended_body_events",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`direct generator calls do not contribute suspended body events`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "reports_exact_normalized_and_duplicate_handlers_even_when_unused",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_normalized_handler_evidence_and_snippets_preserve_final_outcomes"
},
"behaviorClass": "shared-engine-invariant",
"rationale": "Three unused Ruby definitions produce duplicate-matcher, normalized duplicate-handler, and all three unused-definition findings in one final report; the same comparison proves exact and normalized fingerprints remain distinct."
},
{
"name": "exact_handlers_require_compatible_assertion_provenance_across_files",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "lambda_captures_and_resolved_aliases_keep_file_identity_rules"
},
"rationale": "Two Ruby files resolving different aliases of the same configured provider produce duplicate-handler, while an alias from an unrelated provider and an untrusted runtime lambda do not compare; same-named lexical captures in separate files also remain source-scoped.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unresolved_external_assertion_values_cannot_establish_handler_equivalence",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-precision-external-values",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `equivalent-handlers-precision-external-values` requiredAbsent[0]: Unresolved external Ruby values cannot establish equivalence.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "inline_and_local_assertion_values_share_behavior_without_losing_value_precision",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-precision-inline-local",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `equivalent-handlers-precision-inline-local` requiredFindings[0]: An inline literal and a bound local with the same value share behaviour (near) without losing value precision (parameterization absent).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_trust_requires_real_facades_and_unmodified_namespace_factories",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "namespace_trust_requires_unmutated_expect_lookups"
},
"rationale": "Only the configured Ruby namespace's unmodified direct `expect` path compares nested callback assertions; replacement writes, runtime selectors, wrong members, wrong arity, splats and unsupported direct values all withhold handler findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "shorthand_assertions_preserve_property_keys_and_local_values",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "expected_values_preserve_bindings_and_uncertainty"
},
"rationale": "Ruby `object_containing` hashes with the same static key/value retain comparison, a different key does not, equal nested false/nil values stay comparable, and external, multiply assigned or branch-assigned locals never establish handler equivalence.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_precision_covers_member_require_iifes_and_factory_options",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_overlap_preserves_values_effects_and_callable_execution"
},
"rationale": "A configured Ruby factory obtained through the static API member participates in direct and proven immediate/deferred callable assertions: equal values retain comparison, opposing values and polarity do not, and parameterized or unproven callable execution cannot gain equivalence.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_precision_keeps_untrusted_bindings_and_callbacks_separate",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "source_origin_lookup_and_escape_matrix"
},
"rationale": "Ruby lexical callback parameters named like a trusted factory do not revoke the outer binding, while replacing, escaping or dynamically dispatching through the actual trusted binding removes comparison; the unmodified literal lookup remains the positive control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "nested_argument_callbacks_preserve_behavior_and_scope_boundaries",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_overlap_preserves_values_effects_and_callable_execution"
},
"behaviorClass": "shared-engine-invariant",
"rationale": "Ruby lambdas and procs nested in argument containers retain equal configured assertions across different wrappers, while conflicting values, polarity and parameterized nested callables produce no handler finding; a never-invoked callable versus an immediate invocation remains distinct."
},
{
"name": "callback_calls_retain_discriminating_behavior_without_assertion_promotion",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-review-gap-callback-call-evidence",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `equivalent-handlers-review-gap-callback-call-evidence` requiredFindings[0]: Ruby callback calls discriminate without promoting assertions.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_factories_are_trusted_by_provenance_across_runners",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "configured_ruby_provider_paths_preserve_literal_specifiers"
},
"rationale": "Ruby assertion authority follows the configured provider's resolved source identity across exact, suffix-bearing and dotted paths: equal deferred assertions compare, conflicting trusted assertions do not, and missing or mismatched provider paths retain only the untrusted callback behavior.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "module_scoped_constants_reach_the_handler_fingerprint",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-module-constant-values-reach-the-fingerprint",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `equivalent-handlers-module-constant-values-reach-the-fingerprint` requiredAbsent[0]: Top-level Ruby constants reach the fingerprint.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "module_constants_declared_after_the_registrations_still_resolve",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-module-constant-values-reach-the-fingerprint",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `equivalent-handlers-module-constant-values-reach-the-fingerprint` requiredAbsent[0]: Ruby constants declared after registrations still resolve.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_constant_does_not_resolve_into_a_same_named_member_property",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "expected_values_preserve_bindings_and_uncertainty"
},
"rationale": "Equal top-level Ruby constants named `READY` and `IDLE` do not substitute into the same-named receiver methods: `state.READY` matches itself but remains distinct from `state.IDLE`; the same matrix separately pins distinct ordinary receiver methods.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "called_local_functions_contribute_their_assertions_to_the_handler",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-provider-local-callables",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `equivalent-provider-local-callables` requiredFindings[0]: A called Ruby lambda contributes its assertion to the handler.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_buckets_skip_unrelated_pairs_and_keep_exact_groups",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "100 Ruby registrations with unique wording and distinct receiver methods evaluate 0 candidate comparisons; three `Given('same')` registrations evaluate exactly 2 normalizedMatcher pairs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limits_preserve_partial_analysis_and_report_skipped_work",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_structural_truncation_keeps_later_classes_and_bounds_locations"
},
"rationale": "143 Ruby receiver-call registrations at limits 100/20 report truncated, 20 evaluated (under the global limit), one truncated structural class, structuralHandler skips, retained parameterization findings, and exactly one partial-findings diagnostic.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "similarity_work_limits_fail_closed_before_quadratic_pair_verification",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_similarity_work_limits_fail_closed_before_pair_verification"
},
"rationale": "Ruby pairs whose matcher matrix (10,011-character matchers) or handler event matrix (10,002 events) exceed the cell ceiling report identicalHandler or matcherBlocking skipped 1, evaluated 0, truncated, a safety-limit diagnostic and no duplicate-handler or near-duplicate finding; sub-ceiling controls evaluate and report.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "suppression_globs_compile_once_and_pair_lookups_share_the_work_budget",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_suppression_lookups_share_the_pair_work_budget"
},
"rationale": "700 Ruby definitions in one identical-handler class with 1,000 duplicate-handler path suppressions exhaust the pair work budget (truncated, identicalHandler evaluated < 699, one safety-limit diagnostic); the same suppressions under unused-definition charge no pair work (1,397 comparisons evaluated). Globs compile once in `SuppressionIndex::new`; lookups take `&self` and read the compiled list, so no source text can trigger recompilation.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "suppression_lookup_borrows_and_bounds_large_reasons_until_a_finding_is_retained",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_library_suppression_reasons_are_bounded_when_a_finding_is_retained"
},
"rationale": "A Ruby duplicate pair extracted through the Ruby adapter and analyzed through the library API with a caller-built `**` suppression carrying the original 420,000-character reason retains one duplicate-matcher finding whose reason is the first 512 characters.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "structural_class_limit_preserves_work_from_later_classes",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_structural_truncation_keeps_later_classes_and_bounds_locations"
},
"rationale": "Two six-member Ruby structural classes at structural limit 2 report two truncated classes, 4 structuralHandler evaluations, and parameterization findings from both classes.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "global_candidate_limit_reports_the_source_that_was_truncated",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "Five Ruby `Given('same')` registrations at global limit 2 report normalizedMatcher evaluated 2 and skipped 2, and total evaluated equals 2.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limits_are_inclusive_at_the_exact_boundary",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_exact_global_limit_does_not_truncate_matcher_overlap"
},
"rationale": "`regression_exact_global_limit_does_not_truncate_matcher_overlap` runs Ruby and TypeScript corpora through the built binary at a global limit equal to their needed comparisons (a single matcher group, a three-pair structural class at structural limit 3, a real overlap) without truncation, and one comparison short of a real overlap as the truncating control that fails strict mode.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limits_do_not_count_structural_pairs_that_cannot_reach_a_rule",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "Three Ruby `Given('same') { page.perform(i) }` registrations, which share one structural class, at global limit 1 skip 1 normalizedMatcher pair and 0 structuralHandler pairs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "same_normalized_pairs_do_not_consume_the_structural_limit",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "The same three-member Ruby group at structural limit 1 evaluates 2 normalizedMatcher and 0 structuralHandler pairs with no truncation; distinct-matcher rows with the same handlers are the truncating control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "same_normalized_class_does_not_report_false_structural_truncation",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "Four same-matcher Ruby registrations in one structural class at structural limit 1 evaluate 3 normalizedMatcher pairs with 0 skipped and no truncation.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "structural_overlap_ignores_existing_pairs_within_one_handler_group",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "Four Ruby `page.act(<literal>)` registrations with one identical-handler pair at structural limit 1 report identicalHandler evaluated 1 and exactly 4 skipped (not 5); the unlimited control evaluates 6 without truncation.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "trivial_and_unresolved_handlers_do_not_consume_candidate_budgets",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "Two extracted Ruby definitions with empty blocks, and two with uncomparable handlers (optional block parameter), evaluate 0 candidates; non-trivial and comparable controls evaluate 1 identicalHandler pair.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limit_diagnostic_bounds_affected_class_locations",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_structural_truncation_keeps_later_classes_and_bounds_locations"
},
"rationale": "Five truncated Ruby structural classes list three locations followed by `and 2 more`; a single truncated class lists one location with no `and N more` suffix.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "regex_resource_errors_are_preserved_for_cli_reporting_and_library_callers",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_regex_resource_limit_is_reported_and_keeps_the_definition"
},
"rationale": "A Ruby regexp over the compiled-program limit yields exactly one regex-resource diagnostic at its own line, keeps 1 analyzed definition, exits 0 by default and 2 under `--fail-on-incomplete`; `/a{100}/` is the control with no diagnostic and exit 0 when strict. The library path over Ruby definitions (strict `analyze` rejects, `analyze_with_diagnostics` keeps the partial result) is pinned by `ruby_extraction_flows_through_the_public_diagnostic_analysis_and_report_api`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "equivalence_classes_report_a_spanning_set_instead_of_every_pair",
"requiredStatus": "covered",
"fixtureGroup": "exact-group-cluster-boundary-splits-at-five-members",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `exact-group-cluster-boundary-splits-at-five-members` requiredFindings[0]: A four-member Ruby group reports a linear spanning set.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "large_equivalence_classes_report_one_stable_cluster",
"requiredStatus": "covered",
"fixtureGroup": "exact-group-cluster-boundary-splits-at-five-members",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `exact-group-cluster-boundary-splits-at-five-members` requiredFindings[0]: The five-member Ruby group's required findings pin the single bounded cluster beside the four-member spanning set.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "inline_suppression_applies_to_pair_findings",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_inline_directives_are_rule_scoped_and_reject_malformed_input"
},
"rationale": "A Ruby `# cuke-dedup:ignore duplicate-matcher -- ...` directive above line 4 suppresses the duplicate-matcher pair steps.rb:4/steps.rb:5 with reason `wording fixed by an external contract`, while line 4's duplicate-handler pair with steps.rb:6 stays active; a `duplicate-handler` directive on the related definition (related.rb:3) suppresses the pair related.rb:1/related.rb:3. Rows assert rule, primary, related and reason.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "wording_drift_with_same_handler_is_near_duplicate",
"requiredStatus": "covered",
"fixtureGroup": "polarity",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `polarity` requiredFindings[0]: Near wording with agreeing Ruby handlers is a near finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_finds_near_wording_across_related_handler_shapes",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_admits_only_handlers_that_share_actions"
},
"rationale": "Row one: Ruby handlers with two and three calls (different structure) get one matcherBlocking candidate and a near finding at a 0.5 floor with handler similarity 0.667, the same value their duplicate-matcher evidence reports.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_rejects_similar_wording_without_handler_agreement",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_admits_only_handlers_that_share_actions"
},
"rationale": "Row two: the same near-worded matchers over handlers with no shared action produce zero matcherBlocking candidates and no near finding at either floor, with handler similarity 0.0; row one is the opposite control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_semantic_boundary_is_table_driven",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_admits_only_handlers_that_share_actions"
},
"rationale": "Rows three to nine pin candidate count, near outcome at a 0.5 floor and exact handler similarity: one shared action of two (0.5, near), direct versus fluent call (0.5, near), unrelated helpers (0.0), different receivers (0.0), control flow alone (0.5, not a candidate), one shared action of three (0.333), different terminal methods (0.0). The control-flow row uses two `if` events against one with no call, so its overlap is 0.5 where the JavaScript row's shape gives 2/3; identical Ruby streams would be vetoed for a different reason.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_finds_near_members_outside_an_identical_handler_spanning_tree",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_reaches_near_pairs_beside_identical_handlers"
},
"rationale": "Three Ruby definitions with one handler body: identicalHandler evaluates 2 spanning pairs, matcherBlocking adds the third, and exactly one near finding names `the account is enabled` and `the accounts are enabled`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_keeps_alpha_identical_handlers_with_empty_behavior_signatures",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_reaches_near_pairs_beside_identical_handlers"
},
"rationale": "Second body `|value| stored = value` is comparable, non-trivial and records no action event; it still gets one matcherBlocking candidate and the near finding. Removing the identical-structure shortcut fails only this body.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_blocking_respects_the_global_candidate_limit",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_respects_the_global_candidate_limit"
},
"rationale": "Four Ruby handlers sharing two of three actions under `--max-candidate-comparisons 2`: matcherBlocking evaluated 2 and skipped 1, candidateComparisonsEvaluated 2, truncated true and the incompleteness warning; the unlimited control evaluates 6 with no truncation.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "homogeneous_handler_groups_generate_linear_candidates",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_census_pins_buckets_and_limit_boundaries"
},
"rationale": "300 Ruby registrations with one shared handler evaluate 299 identicalHandler pairs and at most 600 comparisons in total (44,850 if quadratic).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "parameterization_requires_a_bounded_value_like_matcher_difference",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_parameterization_requires_one_bounded_value_change"
},
"rationale": "The first ten of the test's fourteen rows, the original matcher rows over literal-only Ruby handler differences: save/cancel and New York/York City are parameterization candidates; the five-word change, `not`, `dis-`, `in-`, `il-`, `im-`, `ir-` opposites and the flanked two-change pair are not; none is a near or duplicate-handler finding. The last four rows are the long-context cases mapped to shared_context_does_not_override_parameterization_evidence.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "near_duplicate_handler_similarity_floor_is_configurable",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_blocking_admits_only_handlers_that_share_actions"
},
"rationale": "Every row runs at the default floor (0.70) and with `nearDuplicateHandlerSimilarity` 0.5: 0.5 and 0.667 overlap rows are near only at 0.5, and a 0.75 overlap row (`page.click` beside `page.click` plus `page.wait_for_load_state`) is near at both, so changing the default floor fails the test.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "literal_handler_differences_prefer_parameterization_over_near_wording",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-provider-local-callables",
"oracleClause": "requiredFindings[3]",
"rationale": "Covered by `equivalent-provider-local-callables` requiredFindings[3]: Never-called Ruby declarations differing only in a literal are parameterization candidates, not near findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "empty_handlers_and_disjoint_placeholder_types_do_not_fail_analysis",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_empty_handlers_and_disjoint_placeholder_types_do_not_fail_analysis"
},
"rationale": "Three empty Ruby handlers under `{int}`, `{string}` and literal matchers: exit 0, 3 definitions, complete corpus, no findings. Controls: `work()` bodies add exactly one duplicate-handler, and a whitespace-only matcher change adds exactly one normalized-matcher.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "semantically_distinct_matchers_do_not_become_error_equivalent",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-duplicate-matcher-precision-requires-kind-text-and-flags",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `equivalent-handlers-duplicate-matcher-precision-requires-kind-text-and-flags` requiredAbsent[0]: Matchers differing in kind, text or flags are not duplicates in Ruby.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "awaited_stub_handlers_do_not_create_duplicate_handler_storms",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: `await`-wrapped stub handler shapes. Semantic residue: Ruby stub (`pending`) handlers are owned by the partial entry `named_handlers_with_different_bodies_and_stub_handlers_do_not_duplicate`.",
"behaviorClass": "language-specific-api"
},
{
"name": "similarity_rejects_opposite_or_different_actions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_near_wording_rejects_mixed_syntax_and_opposite_words"
},
"rationale": "active/inactive and can/cannot matcher pairs over identical Ruby handlers produce no near finding while still producing the duplicate-handler; the `now active` pair is the near control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_similarity_gates_are_pinned_at_short_and_long_boundaries",
"requiredStatus": "engine-invariant",
"stage": "matcher-text",
"rationale": "Adapter-independent stage `matcher-text`: Jaro-Winkler gates over matcher text; pure text math.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_similarity_reports_the_stronger_normalized_score",
"requiredStatus": "engine-invariant",
"stage": "matcher-text",
"rationale": "Adapter-independent stage `matcher-text`: Jaro-Winkler gates over matcher text; pure text math.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "handler_similarity_contract_is_table_driven",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_pair_evidence_reports_similarity_paths_and_matcher_delta"
},
"rationale": "Ruby pairs pin each handler-similarity row reachable from source through duplicate-matcher evidence: alpha 1.0, structural 0.95, ordered overlap 0.667, no events 0.0, and a trust-split pair (one file loads the configured assertion module, the other does not) with the same exact syntax scoring 0.0, against 1.0 when both load it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "duplicate_matcher_components_are_invariant_to_definition_input_order",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_duplicate_matcher_components_are_invariant_to_definition_order"
},
"rationale": "Three same-matcher Ruby definitions in the four original source orders always yield two duplicate-matcher findings whose members are all three handlers, identified by handler source.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "shared_context_does_not_override_parameterization_evidence",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_parameterization_requires_one_bounded_value_change"
},
"rationale": "The last four of the test's fourteen rows, the original long-context rows: save/cancel, first/last and dark/light are parameterization candidates, enabled/disabled is not, and none is a near finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "path_and_matcher_suppression_must_select_the_same_definition",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_configured_suppressions_select_root_relative_paths_and_matchers"
},
"rationale": "Ruby duplicate-handler pair in left.rb/right.rb: `path: left.rb` + `matcher: right matcher` and `path: *.rb` + `matcher: missing matcher` leave the finding active and report the suppression as matching no definition; `path: *.rb` + `matcher: right matcher` suppresses it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "suppression_path_globs_remain_root_relative",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_configured_suppressions_select_root_relative_paths_and_matchers"
},
"rationale": "Ruby pair in root.rb and nested/steps.rb: `path: *.rb` suppresses it; `path: steps.rb` does not and is reported as matching no definition.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "path_suppression_requires_every_definition_in_a_pair_to_be_in_scope",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_configured_suppressions_select_root_relative_paths_and_matchers"
},
"rationale": "`path: legacy/**` leaves the Ruby pair in legacy/left.rb and current/right.rb active and suppresses the pair when both files are under legacy/.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "suppression_directory_patterns_and_unmatched_detection_share_semantics",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_configured_suppressions_select_root_relative_paths_and_matchers"
},
"rationale": "For a Ruby pair under legacy/nested/, `path: legacy/` suppresses the finding with no unmatched warning, and `path: missing/**` leaves it active with `suppression 1 for duplicate-handler matched no step definitions`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "opposite_assertions_are_not_duplicate_handlers",
"requiredStatus": "covered",
"fixtureGroup": "assertion-and-polarity",
"oracleClause": "requiredAbsent[2]",
"rationale": "Covered by `assertion-and-polarity` requiredAbsent[2]: Opposite Ruby assertions are not duplicate handlers. Positive control: assertion-and-polarity requiredFindings[0].",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "similar_matchers_on_different_assertion_subjects_are_not_near_duplicates",
"requiredStatus": "covered",
"fixtureGroup": "assertion-subjects-and-chains-preserve-precision",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `assertion-subjects-and-chains-preserve-precision` requiredAbsent[0]: Different Ruby assertion subjects under near wording are not near.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "similar_matchers_with_opposite_assertion_chains_are_not_near_duplicates",
"requiredStatus": "covered",
"fixtureGroup": "polarity",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `polarity` requiredAbsent[0]: Opposite Ruby assertion chains under near wording are not near. Positive control: polarity requiredFindings[0].",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_only_handlers_reach_near_duplicate_verification",
"requiredStatus": "covered",
"fixtureGroup": "polarity",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `polarity` requiredFindings[0]: Assertion-only Ruby handlers reach near verification.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "conflicting_assertion_values_are_not_near_duplicates",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-precision-local-values",
"oracleClause": "requiredAbsent[1]",
"rationale": "Covered by `equivalent-handlers-precision-local-values` requiredAbsent[1]: Trusted `'ready'` vs `'idle'` locals are not near in Ruby. Positive control: equivalent-handlers-precision-mixed-positive requiredFindings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "mostly_matching_ordered_behavior_remains_a_near_duplicate_candidate",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_mostly_matching_ordered_assertions_remain_near_duplicates"
},
"rationale": "Ten configured Ruby assertions differing only in the last value give a near finding at the default floor with similarity 0.9; three changed values give 0.7 (still near), four give none. The original's other shape, structurally identical ordinary-call handlers differing only in literals, is never near in Ruby by documented policy (identical action streams are parameterization material; docs/discovery-and-frameworks.md, Handlers and assertion evidence), so the shared ordered-overlap property is pinned with configured assertions.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "decorated_method_metadata_does_not_create_near_duplicate_findings",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`decorated method metadata does not create near duplicate findings`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "incompatible_decorated_method_semantics_veto_near_duplicate_findings",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`incompatible decorated method semantics veto near duplicate findings`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "pair_evidence_retains_source_and_unicode_safe_matcher_delta",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_pair_evidence_reports_similarity_paths_and_matcher_delta"
},
"rationale": "Ruby findings for `the item is visible`/`the items are visible` report the diff `the item| is|s are| visible` with the handler source and the matcherDifference string; `the café is open`/`the cafè is open`, whose change sits inside a multibyte character sharing a leading byte, reports prefix `the caf`, changes `é`/`è` and suffix ` is open`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "concrete_feature_step_detects_ambiguity_and_usage",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_usage_and_ambiguity_outcomes_for_concrete_outline_and_expression_steps"
},
"rationale": "Ruby `Given('a user named {word}')` and `Given(/^a user named .+$/)` with step `a user named Ada` yield exactly one ambiguous-step at usage.feature:3 naming steps.rb:1 and steps.rb:2 and no unused-definition; the control step `a stranger named Ada` yields no ambiguity and both definitions unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "scenario_outline_rows_and_case_insensitive_regexes_count_as_usage",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_usage_and_ambiguity_outcomes_for_concrete_outline_and_expression_steps"
},
"rationale": "A Scenario Outline row `2` uses `Given('I have {int} items')` and `Then the user is here` uses `/^THE USER IS HERE$/i` on a complete corpus; dropping the `i` flag leaves steps.rb:2 unused and the row `two` leaves steps.rb:1 unused. The wording avoids `st`, which the documented Ruby `i` subset excludes.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "supports_optional_and_alternative_cucumber_expression_syntax",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_usage_and_ambiguity_outcomes_for_concrete_outline_and_expression_steps"
},
"rationale": "Ruby `'I have {int} cucumber(s)'` and `'they are in my belly/stomach'` are used by `2 cucumbers`/`stomach` and by `1 cucumber`/`belly`; the control `2 cucumberz`/`liver` leaves both definitions unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "fallback_for_custom_parameters_preserves_optional_and_alternative_syntax",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_usage_and_ambiguity_outcomes_for_concrete_outline_and_expression_steps"
},
"rationale": "With Ruby `ParameterType` declarations the fallback is exact but keeps optional and alternative text: `several cucumbers`/`stomach with joy` and `one cucumber`/`belly with grief` are used, and `several cucumberz`/`liver with joy` leaves steps.rb:2 and steps.rb:3 unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "named_handlers_with_different_bodies_and_stub_handlers_do_not_duplicate",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_pending_stub_handlers_are_not_duplicates"
},
"rationale": "`regression_ruby_pending_stub_handlers_are_not_duplicates` runs Ruby pending stubs (`pending`, `raise Cucumber::Pending`, `fail 'todo'`, empty `def` through `&method`) through the built binary without duplicate-handler, with real-work controls that stay duplicates, and same-named top-level `def handler` bodies in two files that never duplicate (the adapter withdraws them, a recall difference from JS/TS).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "differently_bound_arguments_do_not_report_duplicate_handlers",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: `Function.prototype.bind` bound-argument handler identity. Semantic residue: Ruby bound handlers (`&method(:name)`) keep method identity through the handler-context groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "outline_ambiguities_are_deduplicated_by_template_location_and_matches",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_outline_ambiguities_group_by_template_location_and_match_set"
},
"rationale": "Three outline rows matched by `'I have {int} items'` and `/^I have \\d+ items$/` give 3 feature steps and exactly one ambiguous-step at usage.feature:3 naming steps.rb:1 and steps.rb:2; the control with two concrete lines gives two findings, at lines 3 and 4.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "outline_ambiguities_keep_disjoint_match_sets_separate",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_outline_ambiguities_group_by_template_location_and_match_set"
},
"rationale": "Rows 1 and 2 under `value {int}`, `/^value \\d+$/`, `/^value 1$/` give two ambiguous-step findings at usage.feature:3, one naming steps.rb:1-2 and one naming steps.rb:1-3; rows 2/3 and rows 1/1 each collapse to one finding with their single match set.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "custom_parameter_fallback_marks_usage_but_cannot_prove_ambiguity",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_usage_and_ambiguity_outcomes_for_concrete_outline_and_expression_steps"
},
"rationale": "Undeclared `{duration}` beside `'I wait for the page'` with steps `I wait for the page` and `I wait 3 seconds` gives no ambiguous-step finding, while declaring `duration` as /for the page|\\d+ seconds/ proves the ambiguity at usage.feature:3 (steps.rb:2, steps.rb:3). The usage half is engine-wide: every non-exact matcher is marked used before matching, so it is not observable per row.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "ordered_behavior_similarity_uses_longest_common_subsequence",
"requiredStatus": "engine-invariant",
"stage": "lcs-math",
"rationale": "Adapter-independent stage `lcs-math`: LCS over constructed event sequences.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "reported_similarity_scores_round_to_three_decimal_places",
"requiredStatus": "engine-invariant",
"stage": "lcs-math",
"rationale": "Adapter-independent stage `lcs-math`: Rounding of a similarity score.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "dotted_assertion_events_distinguish_subject_modifier_and_value",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "expected_values_preserve_bindings_and_uncertainty"
},
"rationale": "The Ruby final-output matrix retains equal subject/value assertions and rejects a different receiver method, negation modifier or expected literal; static nested values remain comparable while external and dynamically dispatched values do not gain equivalence.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "flat_matcher_aliases_revoke_trust_only_for_matcher_paths",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "matcher_alias_mutations_preserve_controls_and_withdraw_optional_comparison"
},
"rationale": "A flat Ruby alias of the configured API or factory propagates writes that reach `object_containing`, removing matcher comparison without granting or globally erasing unrelated factory trust; the immutable alias remains the positive control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "dotted_access_resolves_every_assertion_position",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`dotted access resolves every assertion position`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "dynamic_access_gains_no_assertion_trust_at_any_position",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "source_origin_lookup_and_escape_matrix"
},
"rationale": "Ruby runtime-key API lookup, wrong static members, reflective selector chains, replacement writes and escapes never produce handler comparison; static `values_at(:expect)`, parenthesized `public_method(:expect)` and unrelated module declarations retain positive controls.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "modifier_chains_are_ordered_and_semantic",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "negated_factory_dispatch_retains_assertions_and_polarity"
},
"behaviorClass": "shared-engine-invariant",
"rationale": "Ruby factory-level `not`, expectation-level `not`, `soft` dispatch and literal `public_send(:not)` preserve their supported semantic positions: equivalent negated forms compare, ordered `.not.to` versus `.to.not` does not, and removing polarity or changing the expected value produces no handler finding."
},
{
"name": "computed_modifier_access_matches_dot_access_semantics",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`computed modifier access matches dot access semantics`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "nested_destructuring_aliases_revoke_matcher_trust_like_flat_aliases",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "matcher_alias_mutations_preserve_controls_and_withdraw_optional_comparison"
},
"rationale": "Ruby aliases of the nested `not` matcher path propagate `object_containing` mutation exactly like flat factory aliases and remove comparison; the immutable nested path compares and an outer `dup` stays independent until a write reaches its shared nested object.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "computed_access_matches_dot_access_at_every_position",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`computed access matches dot access at every position`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "object_rest_aliases_propagate_only_writes_that_reach_the_shared_object",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "matcher_alias_mutations_preserve_controls_and_withdraw_optional_comparison"
},
"rationale": "A Ruby `dup` of the factory is an independent outer object: writing its own `not` slot does not revoke the original, while mutating `copy.not.object_containing` reaches the shared nested matcher and removes comparison; direct shared aliases also revoke.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "static_computed_property_access_shares_a_handler_fingerprint",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`static computed property access shares a handler fingerprint`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "loop_head_bindings_shadow_an_outer_handler_constant",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "enclosing_scope_bindings_shadow_file_locals_with_scope_identity"
},
"rationale": "A Ruby iteration block parameter shadows the same-named file local in nested assertion evidence and produces no handler finding; the equal direct-literal control compares, while existing rebinding and plain-write rows prove only the binding-owning scope withdraws or preserves authority.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_write_through_any_binding_of_one_module_revokes_factory_trust",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "cross_file_constant_aliases_cannot_hide_namespace_mutation"
},
"rationale": "Mutation or unknown escape through any Ruby constant alias of the configured provider revokes cross-file factory authority and marks the source incomplete; an unmodified provider retains findings and mutation of an unrelated module cannot revoke it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_computed_require_property_is_an_assertion_factory",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "closed_assertion_origins_preserve_opposing_and_equivalent_outcomes"
},
"rationale": "A Ruby provider loaded from the configured source grants the same factory identity through `method(:expect)`, `api.fetch(:expect)` and the static computed lookup `api[:expect]`; equal assertions compare, conflicting values do not, and the unconfigured control retains ordinary parameterization instead of assertion trust.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "quote_shaped_subscript_indexes_do_not_name_a_property",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`quote shaped subscript indexes do not name a property`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "adapter_contracts_preserve_global_and_positional_outcomes",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/analysis/tests.rs",
"name": "adapter_contracts_preserve_global_and_positional_outcomes"
},
"rationale": "Cross-adapter matrix `adapter_contracts_preserve_global_and_positional_outcomes` constructs public definitions for both Ruby and JS/TS and checks final outcomes in-process; the Ruby arm is executable Ruby evidence.",
"behaviorClass": "ruby-behavior"
},
{
"name": "adapter_contracts_preserve_handler_domains_and_capture_context",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/analysis/tests.rs",
"name": "adapter_contracts_preserve_handler_domains_and_capture_context"
},
"rationale": "Cross-adapter matrix `adapter_contracts_preserve_handler_domains_and_capture_context` constructs public definitions for both Ruby and JS/TS and checks final outcomes in-process; the Ruby arm is executable Ruby evidence.",
"behaviorClass": "ruby-behavior"
},
{
"name": "adapter_contracts_preserve_regex_execution_and_identity",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/analysis/tests.rs",
"name": "adapter_contracts_preserve_regex_execution_and_identity"
},
"rationale": "Cross-adapter matrix `adapter_contracts_preserve_regex_execution_and_identity` constructs public definitions for both Ruby and JS/TS and checks final outcomes in-process; the Ruby arm is executable Ruby evidence.",
"behaviorClass": "ruby-behavior"
},
{
"name": "adapter_contracts_preserve_near_handler_and_uncertain_regex_controls",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/analysis/tests.rs",
"name": "adapter_contracts_preserve_near_handler_and_uncertain_regex_controls"
},
"rationale": "Cross-adapter matrix `adapter_contracts_preserve_near_handler_and_uncertain_regex_controls` constructs public definitions for both Ruby and JS/TS and checks final outcomes in-process; the Ruby arm is executable Ruby evidence.",
"behaviorClass": "ruby-behavior"
}
]
},
"src/analysis/usage/tests.rs": {
"sourceSha256": "5cfac5850b3fa395ed670415e02f4af6090aa8654def35358ac347d2e068f0d2",
"tests": [
{
"name": "cucumber_expression_expansion_stops_at_the_regex_pattern_limit",
"requiredStatus": "engine-invariant",
"stage": "regex-compiler",
"rationale": "Adapter-independent stage `regex-compiler`: Cucumber Expression expansion is bounded by the regex pattern limit; pure matcher compilation.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "regex_pattern_limit_is_inclusive",
"requiredStatus": "engine-invariant",
"stage": "regex-compiler",
"rationale": "Adapter-independent stage `regex-compiler`: Pattern limit boundary of the shared matcher compiler.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "broad_ambiguity_groups_use_linear_membership_storage",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence: an observable for the linear ambiguity-membership layout (for example a work charge or limit tied to membership size). Today a quadratic layout yields identical findings and census for any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_overlap_respects_the_shared_candidate_budget",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_overlap_budget_counts_unique_pairs_and_charges_index_scans"
},
"rationale": "Three Ruby `value {type}` definitions with `red|green` ParameterTypes at --max-candidate-comparisons 1 report matcherOverlap evaluated 1 / skipped 1, analysis.truncated, only the steps.rb:4-5 overlap and one overlap-incomplete diagnostic; the limit-3 control evaluates all 3 pairs. Adding one identical-handler pair that runs first makes limit 3 leave overlap at evaluated 2 / skipped 1 and limit 4 evaluate all 3, with candidateComparisonsEvaluated equal to overlap plus handler comparisons, so overlap shares the handler budget.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_overlap_charges_index_scans_before_candidate_generation",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_overlap_budget_counts_unique_pairs_and_charges_index_scans"
},
"rationale": "Five Ruby `value {name}` definitions with `<name>-only` types run at CUKE_DEDUP_MATCHER_WINDOW=1: limit 1 and limit 2 both report evaluated 0 / skipped 1, no finding and one diagnostic, while the single-window control at limit 2 reports skipped 0, so only the per-window scan charge truncates.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_overlap_proposals_stop_at_the_budget_inside_one_match_list",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_overlap_budget_counts_unique_pairs_and_charges_index_scans"
},
"rationale": "Ruby `alpha {word}` and `beta {word}` with seven `beta` and two `alpha` regexes at limit 2 (overlap cap 8): with windows of 9 the earlier witness `alpha` crosses the cap in window 2, keeps one proposal and the replay reports `1 10;2 3`; checked once per witness it kept both and reported `1 10;1 11`, which the single-window control still reports.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "scan_windows_stop_at_a_break",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence: an observable for skipped window compilation after the overlap cap is reached. The skipped windows store nothing, so findings and census are identical for any adapter; same class as broad_ambiguity_groups_use_linear_membership_storage.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "reverse_witnesses_do_not_consume_the_unique_pair_budget_twice",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_overlap_budget_counts_unique_pairs_and_charges_index_scans"
},
"rationale": "Two mutually overlapping Ruby definitions at --max-candidate-comparisons 1 report evaluated 1 / skipped 0, the steps.rb:3-4 overlap, analysis.truncated false and no overlap diagnostic, although both witnesses propose the pair.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_overlap_caps_finding_storms_and_marks_the_result_incomplete",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_overlap_caps_finding_storms_at_the_retained_limit"
},
"rationale": "150 overlapping Ruby definitions (11,175 pairs) at a 30,000 candidate limit report exactly 10,000 findings, all overlapping-matcher, evaluated 10,001 / skipped 1 and one overlap-incomplete diagnostic; the 141-definition control reports all 9,870 pairs with skipped 0 and no diagnostic.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "oversized_combined_matcher_programs_split_without_changing_matches",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_split_matcher_index_keeps_each_step_on_its_own_definition"
},
"rationale": "200 Ruby regex definitions ending in `.{10}` exceed the production 1 MiB combined-set limit (the original shrinks the limits to 4 KiB/64 KiB, which a binary run cannot), so the index splits into four sets; with two declared-type witnesses at --max-candidate-comparisons 1 the per-set scan charge truncates overlap (skipped 1) only for the split corpus, while the `[a-j]{10}` control in one set does not. Steps for definitions 1, 124 and 200 leave exactly the other 197 unused and no ambiguity in both corpora.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_index_falls_back_when_even_one_combined_pattern_is_rejected",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence for the combined-index fallback: no Ruby or JS/TS input is known to reach `MatcherIndex::fallback_definitions` (a one-pattern RegexSet rejected after its Regex compiled); only the unit test reaches it with a hand-built expression. Decide whether the branch is reachable or dead code to delete.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "ambiguity_membership_intersection_handles_ordered_disjoint_groups",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_proven_ambiguity_membership_withholds_only_pairs_sharing_a_group"
},
"rationale": "Five Ruby definitions whose feature steps prove groups {0,2}, {1,3}, {2,4} report exactly those three ambiguities and only the unproven overlaps (0,1), (1,2), (1,4); the proven pairs (0,2), (1,3) and (2,4), which require stepping past a smaller group, are withheld, and the no-usage control reports all six overlaps.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "feature_usage_caches_repeated_text_and_supports_suppressed_ambiguity",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_repeated_step_text_and_suppressed_ambiguity_keep_usage"
},
"rationale": "Ruby `'same step'` and `/^same step$/` over an outline repeating that text on lines 3 and 4 report both ambiguities (each with both definitions), no unused or overlap finding, and with a path suppression both carry reason `known overlap` and are inactive; the unsuppressed control keeps them active. The original asserts only the used set and the two suppressed findings; neither it nor this test observes the cache beyond identical match sets per repeated text, so the Ruby evidence matches the original's observable claim.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "complete_feature_matches_replace_only_an_untruncated_overlap_scan",
"requiredStatus": "engine-invariant",
"stage": "bounded-analysis",
"rationale": "Adapter-independent stage `bounded-analysis`: the test distinguishes cached overlap proposals from compiled-window fallback while pinning the existing proposal budget and result set. The cache source is internal resource accounting that source text cannot observe; Ruby outcome parity remains covered by the windowing and overlap-budget suites.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "overlap_and_unused_rules_honor_disabled_severity_and_usage",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_disabled_overlap_and_unused_rules_report_nothing"
},
"rationale": "With `--rule overlapping-matcher=off --rule unused-definition=off` a Ruby corpus with one overlapping pair and three unused definitions reports no finding and a zero matcherOverlap census; the default control reports the overlap, three unused definitions and evaluated 1; with only overlap off, the definition a step uses is not reported unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "non_authoritative_matchers_cannot_prove_a_definition_unused",
"requiredStatus": "covered",
"fixtureGroup": "parameter-types-unresolved",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `parameter-types-unresolved` requiredAbsent[0]: An unresolved parameter type withholds unused-definition claims.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "witness_generation_covers_builtins_declared_literals_and_unknowns",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence for unknown placeholders: an undeclared parameter makes the matcher non-authoritative, so overlap skips it before witness generation and no run observes the `None` witness. Builtin and declared-literal witnesses are pinned by `ruby_overlap_witnesses_cover_builtins_declared_literals_and_unknowns`. The array form `regexp: [/red/, /green/]` yields no witness and misses an overlap Cucumber reports.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "fallback_expression_handles_optional_alternative_and_declared_parameters",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_fallback_expressions_keep_optional_alternative_and_declared_text_exact"
},
"rationale": "With a Ruby-declared type the fallback for `I eat/eats {int} cucumber(s) with {colour}`, `open(unclosed {colour}` and `two spaces {colour}` uses steps inside that text (including `-2`) and reports steps outside it unused; an undeclared `{custom}` is never unused while the declared control is.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_compilation_reports_limits_but_not_unsupported_syntax",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence: a Ruby regex that compiles too big is reported as \"outside the supported static matching subset\" (alone, or beside the resource limit) where JS/TS reports only the resource limit, and the unsupported-syntax arm of `compile_definition_regex` is unreachable from Ruby because dialect translation validates first. The resource-limit diagnostics themselves are pinned by `ruby_matcher_compilation_reports_limits_but_not_unsupported_syntax`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "windowing_does_not_change_findings_on_any_axis",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_windowing_does_not_change_findings_on_any_axis"
},
"rationale": "The five original axes as Ruby corpora run at CUKE_DEDUP_MATCHER_WINDOW 1, 2 and wider than the corpus produce identical JSONL records and stderr, and the pinned ambiguous-step, overlapping-matcher and unused-definition locations show each axis discriminates.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/cli.rs": {
"sourceSha256": "37617a7326daac72583f329ef2a2353cda1e954eecc2e67e1d968c6d5d09723b",
"tests": [
{
"name": "terminal_color_requires_tty_and_allows_no_color_opt_out",
"requiredStatus": "engine-invariant",
"stage": "cli-parsing",
"rationale": "Adapter-independent stage `cli-parsing`: Terminal colour decision from TTY state and NO_COLOR.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "parses_rule_override",
"requiredStatus": "engine-invariant",
"stage": "cli-parsing",
"rationale": "Adapter-independent stage `cli-parsing`: `--rule name=severity` argument decoding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limit_cli_values_must_be_positive",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_overlap_limit_is_visible_and_candidate_flags_must_be_positive"
},
"rationale": "For both candidate flags, `0`, `-1` and `many` exit 2 over a Ruby corpus; `--print-config` with `7` for each flag reports `maxCandidateComparisons` and `maxStructuralClassComparisons` as 7.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unparseable_diagnostics_are_tolerated_by_default_and_escalated_by_the_flag",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_typed_diagnostics_route_by_kind_not_wording"
},
"rationale": "A Ruby syntax error is a warning with exit 0 and an incomplete corpus by default and becomes an error (exit 2, still incomplete) under --fail-on-unparseable; a dynamic matcher stays an incomplete warning under the flag (exit 0); a malformed suppression directive (the Ruby Other-kind diagnostic, emitted at error level) does not mark the corpus incomplete. Exact diagnostic lines are asserted, with locations for every diagnostic except the syntax error, whose Ruby location is always 1:1.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "typed_adapter_diagnostics_route_independently_of_language_and_wording",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_typed_diagnostics_route_by_kind_not_wording"
},
"rationale": "Routes every kind/level pair the Ruby adapter emits through the CLI under both --fail-on-unparseable settings: Unparseable/Warning (message lacks the legacy JavaScript prefix yet escalates), Incomplete/Warning and Dependency/Warning (incomplete, never escalated), Other/Error (error, corpus complete), plus a diagnostic-free control; diagnostic lines, exit codes and corpus completeness are asserted. Other/Warning, Incomplete/Error and Unparseable/Error have no Ruby producer.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "supports_implicit_and_explicit_check_forms",
"requiredStatus": "engine-invariant",
"stage": "cli-parsing",
"rationale": "Adapter-independent stage `cli-parsing`: Clap subcommand form decoding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "finalization_failure_discards_provisional_definitions_and_reports_incompleteness",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: the test injects a caller-built finalization `Err` (README exception: a value the caller constructs), which clears every definition and reports `failed to finalize source evidence`. No source text reaches that arm: a session with a root initializes the Ruby state at construction, and a root-less session initializes it lazily on first use. The adapter-facing Ok-with-uncertainty arm (withdrawn registrations, recounted files) is pinned over Ruby by `ruby_unresolved_registrations_warn_and_expose_the_corpus_census`.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/config/tests.rs": {
"sourceSha256": "ccaae8b3f1ea19386a30a377545cf7943d37756e11e6486c37a0df2b76fc8e77",
"tests": [
{
"name": "standalone_config_overrides_package_and_cli_overrides_both",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (standalone config overrides package and cli overrides both); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "threshold_defaults_to_zero_and_rejects_out_of_range_values",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (threshold defaults to zero and rejects out of range values); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "near_duplicate_floor_applies_from_config_and_rejects_out_of_range",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (near duplicate floor applies from config and rejects out of range); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "configuration_rejects_empty_or_malformed_public_selectors",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (configuration rejects empty or malformed public selectors); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "raw_configuration_applies_every_boolean_and_collection_field",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (raw configuration applies every boolean and collection field); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "no_metrics_is_available_from_project_config_and_cli_override",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (no metrics is available from project config and cli override); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "require_definitions_is_available_from_project_config",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Decodes the generic `requireDefinitions` boolean from project configuration; no language is involved.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limits_can_be_lowered_but_cannot_bypass_hard_safety_ceilings",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (candidate limits can be lowered but cannot bypass hard safety ceilings); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "project_configuration_output_cannot_escape_the_analysis_root",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (project configuration output cannot escape the analysis root); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "command_line_output_safely_overrides_an_invalid_project_value",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (command line output safely overrides an invalid project value); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "project_configuration_output_cannot_follow_a_symlink_outside_the_root",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (project configuration output cannot follow a symlink outside the root); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "suppression_requires_a_reason",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (suppression requires a reason); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "suppression_reasons_have_a_bounded_payload",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (suppression reasons have a bounded payload); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "configured_excludes_extend_safety_defaults",
"requiredStatus": "covered",
"fixtureGroup": "explicit-exclusion-patterns",
"oracleClause": "requiredAbsent[2]",
"rationale": "Covered by `explicit-exclusion-patterns` requiredAbsent[2]: Configured excludes remove the excluded Ruby files from the corpus.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "exclude_layers_replace_custom_patterns_but_preserve_default_policy",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exclude_layers_and_config_escape_hatches_select_ruby_sources"
},
"rationale": "Against a baseline of four Ruby sources: a `package.json` `exclude` hides `package-only/a.rb`; a standalone config's `exclude` hides `config-only/b.rb`; CLI `--exclude cli-only` replaces the config exclude, so `config-only/b.rb` reappears and `cli-only/c.rb` is hidden; `node_modules/pkg/d.rb` stays excluded until `--no-default-excludes`. Selections are pinned by explain lines and `unused-definition` paths.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "default_excludes_and_hidden_directories_have_explicit_escape_hatches",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exclude_layers_and_config_escape_hatches_select_ruby_sources"
},
"rationale": "Against a `{definitions, features}`-only baseline, config `excludeDefaults: false` adds exactly `node_modules/pkg/d.rb`, `includeHidden: true` adds exactly `.hidden/e.rb`, and both keys add both. Each selection is pinned by explain lines and `unused-definition` paths.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "jsonl_is_configurable_but_cannot_be_mixed_with_terminal_output",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (jsonl is configurable but cannot be mixed with terminal output); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "invalid_suppression_glob_is_rejected_during_config_load",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (invalid suppression glob is rejected during config load); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "cucumber_config_supplies_defaults_below_cuke_dedup_configuration",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Configuration source precedence (cucumber config supplies defaults below cuke dedup configuration); cucumber.yml decoding for Ruby is covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "playwright_bdd_literal_features_are_detected_without_executing_config",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD config feature detection. Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "cucumber_yaml_paths_are_detected",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/config/tests.rs",
"name": "cucumber_yaml_paths_are_detected"
},
"rationale": "Loads feature paths from `cucumber.yml`, Cucumber-Ruby's configuration file, through the public `Config::load`; executable Ruby-facing evidence, run under completion.",
"behaviorClass": "ruby-behavior"
},
{
"name": "explicit_features_skip_invalid_lower_precedence_framework_config",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework config precedence (Playwright-BDD/Cypress). Semantic residue: Ruby feature paths come from cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "jscpd_style_config_discovery_uses_one_source_in_documented_order",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Configuration source precedence (jscpd style config discovery uses one source in documented order); cucumber.yml decoding for Ruby is covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "explicit_config_is_fatal_and_bypasses_auto_discovery",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (explicit config is fatal and bypasses auto discovery); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "malformed_auto_config_warns_and_falls_through_to_package_config",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Generic configuration decoding, validation and precedence (malformed auto config warns and falls through to package config); the decoded values are language-independent and no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "verbatim_paths_rebuild_to_plain_windows_paths",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: rebuilding a Windows verbatim path in plain form for the analysis root and canonical source paths is path handling shared by every frontend; Ruby load targets are covered end to end by `regression_119_ruby_loaded_file_paths_stay_relative_to_the_root`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "verbatim_prefix_strip_keeps_non_unicode_windows_names",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Windows-only check that verbatim-prefix stripping keeps non-Unicode names byte for byte; path handling shared by every frontend, no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "long_canonical_windows_paths_stay_plain_under_the_root",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Windows-only check that a canonical path longer than MAX_PATH strips to plain form under the analysis root; path handling shared by every frontend, no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "canonical_platform_paths_strip_against_the_config_root",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: a canonicalized path strips against the normalized analysis root; no adapter runs, and Ruby load targets are covered end to end by `regression_119_ruby_loaded_file_paths_stay_relative_to_the_root`.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/discovery.rs": {
"sourceSha256": "07bd3501936fc6bd13ff0cad4bcec97e4d1b1c3a5d7346cc8e71f5867b4483d8",
"tests": [
{
"name": "discovers_sources_and_features_but_uses_gitignore",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_discovery_applies_ignore_files_and_glob_semantics_to_ruby_sources"
},
"rationale": "With `.gitignore` excluding `ignored/` and no git repository, `--explain-discovery` lists exactly the two features and the three selected Ruby definitions, `ignored/step.rb` absent; the feature steps use two of them, leaving one `unused-definition` at `packages/second/local.rb:1`. After the ignore files are removed, all seven Ruby sources are listed.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "cuke_dedup_ignore_supports_scoped_gitignore_rules_and_negation",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_discovery_applies_ignore_files_and_glob_semantics_to_ruby_sources"
},
"rationale": "A root `.cuke-dedupignore` (`skipped/`, `*.generated.rb`, `!keep.generated.rb`) and a `packages/first/.cuke-dedupignore` (`local.rb`) leave exactly `features/steps/example.rb`, `keep.generated.rb` and `packages/second/local.rb` selected. Removing the ignore files restores `skipped/step.rb`, `drop.generated.rb` and `packages/first/local.rb`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "discovers_classic_and_markdown_features_with_parser_metadata",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_discovery_applies_ignore_files_and_glob_semantics_to_ruby_sources"
},
"rationale": "Explain lines list `features/a.feature [gherkin]` and `features/nested/b.feature.md [gherkin-markdown]`, each with its selecting pattern and no unmatched-pattern warning. Ruby definitions used only by the classic feature and only by the Markdown feature report no `unused-definition`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "overlapping_feature_patterns_are_both_counted_as_matched",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_discovery_applies_ignore_files_and_glob_semantics_to_ruby_sources"
},
"rationale": "With features `*.feature` and `*a.feature`, whose only match is attributed to `*.feature`, the stderr lines contain no warning. The control `*.feature` plus `*missing.feature` produces exactly one warning naming `*missing.feature`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "configured_definition_globs_narrow_source_files",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_discovery_applies_ignore_files_and_glob_semantics_to_ruby_sources"
},
"rationale": "Definition glob `packages/*.rb` selects only `packages/second/local.rb`, and `{features,packages}/*.rb` selects only `features/steps/example.rb` and `packages/second/local.rb`. Neither run prints an unmatched-pattern warning; `*.rb` selects all three.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "configured_globs_use_documented_cross_separator_and_brace_semantics",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_discovery_applies_ignore_files_and_glob_semantics_to_ruby_sources"
},
"rationale": "`*.rb` selects the nested `features/steps/example.rb`, and `features/*.{feature,feature.md}` selects `features/nested/b.feature.md` but not `features/c.md`, whose step would otherwise hide the one unused finding. A brace definitions glob narrows the Ruby sources. The test runs on every CI OS, with separators normalized.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "reports_each_unmatched_definition_glob",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_discovery_applies_ignore_files_and_glob_semantics_to_ruby_sources"
},
"rationale": "Definitions `stpes/*.rb` alone select no Ruby source and warn once; `packages/*.rb`, `stpes/*.rb` and `support/*.rb` together select `packages/second/local.rb` and warn exactly once for each unmatched glob and never for the matched one (explain lines, without the feature-patterns header).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "declaration_and_source_map_files_are_not_definition_sources",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: `.d.ts` and source-map suffix exclusion. Semantic residue: none; Ruby has no declaration or source-map files.",
"behaviorClass": "language-specific-api"
},
{
"name": "built_in_excludes_prune_sources_unless_explicitly_disabled",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exclusions_and_discovery_flags_define_the_analysis_corpus"
},
"rationale": "Under default excludes, an explicit `node_modules/workspace` Ruby pattern admits nothing. With `--no-default-excludes`, `node_modules/workspace/nested.rb` is analyzed, pinned by its `unused-definition` path and `definitionsAnalyzed`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "hidden_sources_require_the_include_hidden_option",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exclusions_and_discovery_flags_define_the_analysis_corpus"
},
"rationale": "An explicit `.steps` Ruby pattern admits nothing by default. With `--include-hidden`, `.steps/hidden.rb` is analyzed, pinned by its `unused-definition` path and `definitionsAnalyzed`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "traversal_errors_are_collected_without_discarding_other_files",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_traversal_errors_are_reported_without_dropping_readable_sources"
},
"rationale": "On Unix, a mode-000 `locked/` directory yields exactly one `failed while walking target directory ...locked: ...` error and exit 2. `visible.rb` is still listed, and its `unused-definition` is reported at `visible.rb:1`. The directory mode is restored by a drop guard; where the locked directory stays readable (running as root) the test returns early.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "excluded_directories_are_pruned_before_traversal",
"requiredStatus": "covered",
"fixtureGroup": "nested-root-directory-exclusion",
"oracleClause": "requiredAbsent[1]",
"rationale": "Covered by `nested-root-directory-exclusion` requiredAbsent[1]: An excluded directory under a nested root contributes no Ruby definitions.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/framework_config/tests.rs": {
"sourceSha256": "abbc8be3e7ab921b8de9d0517be8ed741ee5c83736de932546b78e16f3b78924",
"tests": [
{
"name": "extracts_cucumber_default_profile_paths",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`extracts cucumber default profile paths`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_only_define_bdd_config_features",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`extracts only define bdd config features`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "maps_framework_directories_to_their_native_defaults",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`maps framework directories to their native defaults`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_cypress_e2e_spec_pattern_from_project_config",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`extracts cypress e2e spec pattern from project config`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "detects_supported_frameworks_and_dependency_fallbacks",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`detects supported frameworks and dependency fallbacks`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "registry_precedence_prefers_recognized_playwright_bdd_configuration",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`registry precedence prefers recognized playwright bdd configuration`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "unrecognized_playwright_config_falls_through_to_lower_precedence_frameworks",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`unrecognized playwright config falls through to lower precedence frameworks`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "cypress_configuration_requires_preprocessor_dependency_evidence",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`cypress configuration requires preprocessor dependency evidence`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "unsupported_dependency_names_do_not_enable_framework_discovery",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`unsupported dependency names do not enable framework discovery`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "same_provider_filename_fallthrough_continues_after_a_non_match",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`same provider filename fallthrough continues after a non match`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "cucumber_config_filename_order_decides_which_file_is_inspected",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`cucumber config filename order decides which file is inspected`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "cucumber_files_match_regardless_of_contents_and_errors_propagate",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`cucumber files match regardless of contents and errors propagate`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "framework_files_cover_missing_dynamic_and_default_paths",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`framework files cover missing dynamic and default paths`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "cucumber_file_formats_cover_literal_dynamic_and_missing_paths",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`cucumber file formats cover literal dynamic and missing paths`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "framework_pattern_normalization_is_explicit",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`framework pattern normalization is explicit`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "structured_config_values_distinguish_missing_dynamic_and_strings",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`structured config values distinguish missing dynamic and strings`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "static_object_queries_cover_absent_and_dynamic_shapes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration detection (`static object queries cover absent and dynamic shapes`): Playwright-BDD, Cypress, Jest-Cucumber files and dependencies. Semantic residue: Ruby project configuration is cucumber.yml, covered by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
}
]
},
"src/gherkin/tests.rs": {
"sourceSha256": "e9d6d118f4b66e91d93c8dc6327f0ae87266a89f23600ad9b779b7545c1b0b33",
"tests": [
{
"name": "table_escape_matrix_preserves_outline_text_and_source_positions",
"requiredStatus": "covered",
"fixtureGroup": "gherkin-table-cell-escapes",
"oracleClause": "requiredFindings[1]",
"rationale": "Covered by `gherkin-table-cell-escapes` requiredFindings[1]: Escaped table cells expand into steps that match definitions at their source positions.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "table_escapes_do_not_rewrite_step_text_or_docstrings",
"requiredStatus": "covered",
"fixtureGroup": "gherkin-table-cell-escapes",
"oracleClause": "requiredAbsent[1]",
"rationale": "Covered by `gherkin-table-cell-escapes` requiredAbsent[1]: Unknown escapes keep the step text that marks definitions used.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "table_escape_adaptation_is_bounded_and_does_not_change_docstrings",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: the reserved-character budget of table-escape adaptation is a per-feature-file parser bound computed before any adapter runs, from feature text alone. Leaving doc-string contents unadapted is the same parser stage; the `doc string before escaped table` row of `ruby_feature_structure_decides_definition_usage_and_ambiguity_locations` shows only that an escaped-looking doc-string line before an escaped table still parses and drives usage, not the doc-string text.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "malformed_tables_under_rules_and_backgrounds_are_not_truncated",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_malformed_feature_tables_fail_closed_beside_escaped_table_findings"
},
"rationale": "A ragged table under a Background and under a Rule outline each rejects broken.feature at lines 5 and 7 (exit 2, corpus incomplete, featureStepsAnalyzed 1); well-formed controls contribute 3 and 2 steps and mark the `table`/`done` and `a` Ruby definitions used.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "extracts_steps_from_full_document_structure",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "The checkout feature yields 6 steps; the Background, Rule Background and expanded `card stolen is rejected` steps mark their Ruby definitions used, and only the outline-template definition is unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "expands_every_scenario_outline_examples_row",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "Both Examples rows expand (2 steps) and mark `I have 2 apples` and `I have 3 pears` used; the template-text definition is unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "header_only_examples_preserve_verbatim_scenario_steps",
"requiredStatus": "covered",
"fixtureGroup": "gherkin-outline-examples-rows",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `gherkin-outline-examples-rows` requiredFindings[0]: Rows decide which definitions are used.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "examples_values_are_substituted_once",
"requiredStatus": "covered",
"fixtureGroup": "gherkin-outline-examples-rows",
"oracleClause": "requiredAbsent[0]",
"rationale": "Covered by `gherkin-outline-examples-rows` requiredAbsent[0]: Substituted rows match the used definition exactly once.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "multiple_examples_blocks_keep_only_available_rows",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "A populated block beside a header-only block yields 1 step: `value first` is used and the `value <value>` template definition stays unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "uses_upstream_localized_dialect_keywords",
"requiredStatus": "covered",
"fixtureGroup": "spanish-classic-gherkin-dialect",
"oracleClause": "requiredAbsent[1]",
"rationale": "Covered by `spanish-classic-gherkin-dialect` requiredAbsent[1]: A `# language: es` feature marks the definition used.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "structural_keywords_are_not_mistaken_for_steps",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "A Feature/Rule/Example file with no steps adds no step beside a one-step neighbour (1 step); unanchored Ruby regexes `/Structure only/`, `/No steps/` and `/Empty/`, which a heading misread as a step would match by name or whole line, stay unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "extracts_official_gherkin_markdown_structure_and_preserves_lines",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "The Markdown Rule outline (2 rows x 3 steps) beside a classic feature gives 7 steps; ambiguities are reported at staying-alive.feature.md:10 (steps.rb:1, 2) and :12 (steps.rb:4, 5), and the classic step marks its definition used.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_supports_doc_strings_and_an_implicit_feature_heading",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "A Markdown file with an implicit feature heading yields 1 step, ambiguous at checkout.feature.md:5 (steps.rb:1, 2); the keyword list item inside the fenced doc string leaves its definition unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_ignores_colon_prose_headings",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (gherkin markdown ignores colon prose headings); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_requires_gherkin_table_indentation",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (gherkin markdown requires gherkin table indentation); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_restores_structural_headings_from_the_active_dialect",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (gherkin markdown restores structural headings from the active dialect); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_separates_steps_from_prose_lists_and_fenced_examples",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "Prose, a keyword-less list item and a fenced keyword list item add no steps (1 step); the `first note` and `a fenced example` definitions are unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_accepts_all_common_list_markers_and_bold_keywords",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "`+`, `-`, ordered (`1.`, `2.`) and `*` items, each marker once with a plain and once with a bold keyword, yield 8 steps and leave none of the 8 Ruby definitions unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_preserves_a_final_step_without_a_trailing_newline",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_structure_decides_definition_usage_and_ambiguity_locations"
},
"rationale": "A Markdown file ending in a step without a newline yields 1 step, ambiguous at final.feature.md:5 (steps.rb:1, 2), over a complete corpus.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_accepts_single_dash_gfm_table_separators",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (gherkin markdown accepts single dash gfm table separators); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_rejects_candidate_storms_before_repeated_parsing",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (gherkin markdown rejects candidate storms before repeated parsing); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_counts_heading_and_step_candidates_together",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (gherkin markdown counts heading and step candidates together); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_tag_before_an_unknown_colon_heading_does_not_create_an_implicit_feature",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (a tag before an unknown colon heading does not create an implicit feature); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "valid_base_documents_do_not_restore_speculative_dialect_headings",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (valid base documents do not restore speculative dialect headings); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "parser_probe_and_retry_budgets_include_the_exact_ceiling",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (parser probe and retry budgets include the exact ceiling); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "out_of_range_step_candidates_are_ignored_defensively",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (out of range step candidates are ignored defensively); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "dialect_restoration_retains_only_candidates_that_make_the_document_valid",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (dialect restoration retains only candidates that make the document valid); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "prose_size_does_not_consume_budget_for_synthesized_parser_probes",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (prose size does not consume budget for synthesized parser probes); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "realistic_large_markdown_with_mixed_lists_stays_within_the_probe_budget",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (realistic large markdown with mixed lists stays within the probe budget); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "thousands_of_default_dialect_steps_use_one_bounded_whole_document_probe",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (thousands of default dialect steps use one bounded whole document probe); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "default_dialect_whole_document_probe_is_charged_to_the_budget",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (default dialect whole document probe is charged to the budget); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "gherkin_markdown_bounds_ambiguous_parser_probe_work",
"requiredStatus": "engine-invariant",
"stage": "gherkin-parser",
"rationale": "Adapter-independent stage `gherkin-parser`: Gherkin/Markdown text parsing (gherkin markdown bounds ambiguous parser probe work); feature text carries no adapter data and the parser runs before any adapter.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/model/sha256/tests.rs": {
"sourceSha256": "f415e955df28f2656ffe8e2043448da16f64d4f50a1b894011a58d01e9ba1ca1",
"tests": [
{
"name": "matches_sha256_known_answer_vectors",
"requiredStatus": "engine-invariant",
"stage": "sha256",
"rationale": "Adapter-independent stage `sha256`: SHA-256 digest primitive over bytes; no adapter data enters the function.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "padding_boundaries_are_correct",
"requiredStatus": "engine-invariant",
"stage": "sha256",
"rationale": "Adapter-independent stage `sha256`: SHA-256 digest primitive over bytes; no adapter data enters the function.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "chunk_boundaries_do_not_change_the_digest",
"requiredStatus": "engine-invariant",
"stage": "sha256",
"rationale": "Adapter-independent stage `sha256`: SHA-256 digest primitive over bytes; no adapter data enters the function.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/model/tests.rs": {
"sourceSha256": "98fc93fbbf60f01a18f40c68a16e335dc2fe3b06b2b9c1eb9287699fb90a6939",
"tests": [
{
"name": "rule_names_are_stable_kebab_case",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Rule name spelling and documentation anchors; pure model codec.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "multipart_fingerprint_has_unambiguous_framing_and_a_separate_domain",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Fingerprint framing of string parts; pure model codec.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "severity_text_forms_are_complete_and_reject_unknown_values",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Severity text round trip; pure model codec.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "threshold_rules_exclude_correctness_and_usage_findings",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_duplication_threshold_excludes_correctness_and_usage_findings"
},
"rationale": "With every finding at error severity, the Ruby findings are exactly duplicate-matcher steps.rb:3/4, parameterization-candidate steps.rb:1/2, ambiguous-step usage.feature:5 (steps.rb:3, 4) and usage.feature:6 (steps.rb:5, 6), and unused-definition steps.rb:7; only the first two carry contributesToThreshold, and summary.duplication counts 4 of 7 definitions, 400/7 percent, rules [duplicate-matcher, parameterization-candidate].",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "duplication_threshold_counts_unique_active_error_definitions",
"requiredStatus": "covered",
"fixtureGroup": "threshold-over-limit",
"oracleClause": "duplication",
"rationale": "Covered by `threshold-over-limit` duplication: The Ruby threshold group pins the duplication percentage, counted definitions and pass flag at the configured limit.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "empty_analysis_has_zero_percent_duplication",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_duplication_threshold_excludes_correctness_and_usage_findings"
},
"rationale": "A Ruby suite whose only file has no registrations reports `produced 0 definitions` and summary.duplication {threshold 0, duplicated 0, total 0, percentage 0, passed true, rules []}; the populated suite in the same test fails the same default 0% threshold.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "duplication_threshold_counts_multiple_definitions_at_one_location",
"requiredStatus": "covered",
"fixtureGroup": "configured-threshold-at-limit",
"oracleClause": "duplication",
"rationale": "Covered by `configured-threshold-at-limit` duplication: The Ruby threshold group pins duplicated and total definition counts for a corpus of duplicate matchers.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "fingerprint_is_stable_and_content_sensitive",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Stable fingerprint of a string; pure model codec.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "displayed_locations_use_portable_path_separators",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Location display normalizes separators on a constructed location; pure model codec.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/modes/tests.rs": {
"sourceSha256": "fb192ebfc1ff1898a28fb9bf64928841369ae70c9d2fb23c92be976eaffa8ab0",
"tests": [
{
"name": "changed_mode_keeps_findings_related_to_a_changed_file",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_decodes_paths_and_keeps_findings_that_reach_changed_files"
},
"rationale": "The changed-mode JSONL keeps exactly the three pairs touching changed Ruby files and drops the old_a.rb/old_b.rb pair that the full-run control reports.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "cluster_fingerprints_are_location_and_member_order_independent",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: the baseline sorts cluster member fingerprints before hashing. The analysis already emits sorted members, so no source can present another order; the end-to-end Ruby property is pinned by `ruby_baseline_cluster_identity_ignores_location_and_member_order`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "multipart_framing_cannot_suppress_a_different_cluster",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: framing of cluster fingerprint parts. The parts are analyzer-computed hashes that no source text can shape into a separator collision.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "multipart_framing_cannot_suppress_a_different_fallback_finding",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: framing of fallback finding parts. Message and matcher-difference fields are analyzer templates that no source text can shape into a separator collision.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_files_are_relative_to_a_subdirectory_and_include_untracked_files",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_decodes_paths_and_keeps_findings_that_reach_changed_files"
},
"rationale": "From packages/e2e, a modified tracked \"träcked.rb\", an untracked \" new step.rb\" and an untracked \"café step.rb\" are each in the changed set, shown by their findings with subdirectory-relative paths; the unix trailing-space name is not representable because a Ruby source must end in \".rb\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_files_preserve_newlines_in_unix_names",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_preserves_newlines_in_unix_names"
},
"rationale": "A tracked \"steps/line\\nbreak.rb\" modified after commit contributes a duplicate-matcher finding in changed mode (2 active findings total), after a control showing no findings before the edit.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "git_path_decoder_preserves_non_utf8_unix_bytes",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_preserves_non_utf8_linux_names"
},
"rationale": "The changed-mode run decodes non-UTF-8 Git path bytes for tracked and untracked .rb files into findings; gated to Linux because macOS filesystems reject non-UTF-8 names.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_files_preserve_non_utf8_linux_names",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_preserves_non_utf8_linux_names"
},
"rationale": "A tracked steps/tracked-\\xfe.rb modified after commit contributes a finding in changed mode (2 active total) after a no-change control (Linux-gated).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "semantic_baseline_survives_location_changes_and_enforces_multiplicity",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_semantic_baseline_is_updated_moved_and_gated_by_new_findings"
},
"rationale": "A baselined Ruby pair stays suppressed after a move to shifted lines; a second copy of the pair yields two findings with the accepted fingerprint, of which only one is suppressed, and the baseline still totals 1.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_mode_validates_revisions_repositories_and_ignored_roots",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_rejects_unsafe_revisions_roots_and_environments"
},
"rationale": "Revisions \"\", \" \", \"--all\" and \"missing-revision\" each exit 2 with the invalid/unresolvable revision message, a non-repository root fails with \"changed-files mode requires a Git repository\", and an ignored root fails with \"ignored by Git\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_mode_keeps_findings_with_changed_related_locations",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_decodes_paths_and_keeps_findings_that_reach_changed_files"
},
"rationale": "The tracked step finding has the unchanged steps/base.rb as primary and the changed steps/träcked.rb only as related location, and is kept.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "baseline_validation_counts_removals_and_ignores_suppressed_findings",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_baseline_update_migrates_counts_removals_and_rejects_invalid_inputs"
},
"rationale": "Updating nested/baseline.json from two Ruby duplicate pairs reports \"2 added, 0 removed, 2 total\"; after one pair is removed and the other inline-suppressed the update reports \"0 added, 2 removed, 0 total\"; applying schema 2, schema 99 and non-JSON baselines exits 2 with the expected messages.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "comparison_fingerprints_are_independent_of_pair_order",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_semantic_baseline_is_updated_moved_and_gated_by_new_findings"
},
"rationale": "The moved Ruby file lists the pair in reverse order, so the primary and related sides swap, and the baseline still suppresses it.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/reporters/tests.rs": {
"sourceSha256": "a43ed588e50edaf63a56d5460cfcf8fa6fa38f37d8a29552259346e25e78b18b",
"tests": [
{
"name": "json_uses_versioned_schema_and_relative_paths",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test renders a Ruby analysis as versioned JSON with relative `steps/steps.rb` paths, camelCase evidence and the Ruby handler text.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "default_summary_uses_the_strict_zero_percent_threshold",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test builds the default summary from a Ruby result and asserts the 0% threshold fails.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "terminal_report_has_version_and_finding_spacing",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_the_terminal_reporter"
},
"rationale": "The Ruby terminal test asserts the version header, rule headings, finding spacing and `.rb` locations over Ruby findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "terminal_report_colors_only_selected_text",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_the_terminal_reporter"
},
"rationale": "The Ruby terminal test strips the color codes from colored output over Ruby findings and compares it with plain output.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "terminal_report_uses_singular_finding_and_omits_optional_timing",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_the_terminal_reporter"
},
"rationale": "The Ruby terminal test renders one Ruby finding without metrics and asserts singular wording and no timing line.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "terminal_report_propagates_footer_write_failures",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_the_terminal_reporter"
},
"rationale": "The Ruby terminal test fails the writer at each footer line of a Ruby report and asserts the I/O error propagates.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "jsonl_emits_self_contained_findings_and_a_final_summary",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test asserts self-contained JSONL finding records, the suppressed record and the final summary. Truncation is driven by a Ruby matcher over the limit; Ruby handler snippets are capped at the JSONL limit, so the handler field cannot truncate.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "machine_reporters_preserve_cluster_evidence",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_respect_every_reporter_bound"
},
"rationale": "The Ruby bounds test asserts cluster evidence (member count, fingerprints, truncation flag) for a Ruby duplicate cluster in JSON, JSONL and SARIF.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "every_reporter_bounds_large_cluster_records_and_signals_omissions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_respect_every_reporter_bound"
},
"rationale": "The Ruby bounds test caps a 300-member Ruby duplicate cluster in every reporter and asserts the omission signals.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "sarif_contains_only_active_findings_with_stable_locations",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test asserts SARIF holds only the active Ruby findings, each with a `steps/steps.rb` location and a v3 fingerprint.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "every_sarif_rule_links_to_its_documentation_section",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test asserts the SARIF descriptor and documentation link for each rule the Ruby analysis produces; the full rule list is adapter-independent.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "html_is_self_contained_and_escapes_finding_text",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test escapes a Ruby handler containing `</script>` in self-contained HTML and asserts the embedded data equals the JSON report.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "buffered_reports_cap_findings_and_signal_truncation",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_respect_every_reporter_bound"
},
"rationale": "The Ruby bounds test caps one more than the buffered limit of Ruby findings in JSON, SARIF, HTML and terminal and asserts each truncation notice; JSONL keeps them all.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "bounded_reports_never_displace_an_error_with_warnings",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_respect_every_reporter_bound"
},
"rationale": "The Ruby bounds test places one Ruby error after a full page of Ruby warnings and asserts every buffered reporter keeps it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "terminal_groups_each_rule_once_and_removes_control_characters",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_the_terminal_reporter"
},
"rationale": "The Ruby terminal test groups Ruby findings once per rule and strips escape, bidi and tag characters that a Ruby matcher carries (control asserts the matcher holds them).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "reporters_preserve_finding_counts_and_information_across_formats",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test asserts the same active, suppressed and per-severity counts across terminal, JSON, JSONL, SARIF and HTML for one Ruby analysis.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "public_report_writer_uses_one_context_for_every_configured_format",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "The Ruby machine-reporter test writes a Ruby analysis through the public writer with terminal, JSON, HTML and SARIF configured and asserts each file holds the Ruby path.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "ruby_findings_render_through_the_terminal_reporter",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_the_terminal_reporter"
},
"rationale": "Ruby terminal-reporter evidence: findings from the Ruby adapter rendered with header, colors, footer failures, rule grouping and control-character stripping.",
"behaviorClass": "ruby-behavior"
},
{
"name": "ruby_findings_render_through_every_machine_reporter",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_render_through_every_machine_reporter"
},
"rationale": "Ruby machine-reporter evidence: findings from the Ruby adapter rendered as JSON, JSONL, SARIF and HTML, plus counts and the public writer.",
"behaviorClass": "ruby-behavior"
},
{
"name": "ruby_findings_respect_every_reporter_bound",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/reporters/tests.rs",
"name": "ruby_findings_respect_every_reporter_bound"
},
"rationale": "Ruby reporter-bounds evidence: a large Ruby cluster, more Ruby findings than the buffered cap, and error priority over Ruby warnings.",
"behaviorClass": "ruby-behavior"
}
]
},
"src/resource_limits.rs": {
"sourceSha256": "27fa902c16e443438e3ff48e0255518d4830532ed0dda28dd764246f6fe77bbb",
"tests": [
{
"name": "bounded_reader_accepts_exact_limit_and_rejects_next_byte",
"requiredStatus": "engine-invariant",
"stage": "bounded-io",
"rationale": "Adapter-independent stage `bounded-io`: Bounded UTF-8 reader primitive (`read_utf8`) over raw bytes and a byte limit; the adapter is not involved.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "bounded_reader_rejects_invalid_utf8_without_misclassifying_it_as_a_limit",
"requiredStatus": "engine-invariant",
"stage": "bounded-io",
"rationale": "Adapter-independent stage `bounded-io`: Bounded UTF-8 reader primitive (`read_utf8`) over raw bytes and a byte limit; the adapter is not involved.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "bounded_reader_limits_special_files_without_reliable_metadata_lengths",
"requiredStatus": "engine-invariant",
"stage": "bounded-io",
"rationale": "Adapter-independent stage `bounded-io`: Bounded UTF-8 reader primitive (`read_utf8`) over raw bytes and a byte limit; the adapter is not involved.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "regex_builder_enforces_the_configured_program_limit",
"requiredStatus": "engine-invariant",
"stage": "regex-compiler",
"rationale": "Adapter-independent stage `regex-compiler`: Regex program-size limit enforced by the shared builder on a pattern string.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "release_resource_limits_match_the_documented_policy",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence: every documented release limit over Ruby input. The 1,024-file load budget is pinned by `ruby_load_budget_is_shared_across_selected_definition_files`; the 64 MiB Ruby load byte budget has no Ruby run (nine 8 MiB loads take about 13 s in a debug build).",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/source_adapter/tests.rs": {
"sourceSha256": "bacd6a777d58f2f77e76182ceaee23e0628c45c1825a557e31bc5b5a2476a359",
"tests": [
{
"name": "session_state_initializes_once_per_backend_and_per_run",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "session_mixed_languages_share_cache_and_preserve_findings_in_either_order",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_library_routes_and_sessions_share_state_beside_ecmascript"
},
"rationale": "Extracts steps.rb beside steps.ts and steps.js in one SourceExtractionSession with Ruby first, between and last; support.ts is edited after each ECMAScript extraction, and the session's definitions equal fresh-session extractions, proving the resolver cache survives Ruby extraction. Analyzing all definitions together is refused (separate comparison domains), and per-domain analysis keeps exactly one duplicate-matcher pair per language (steps.js/steps.ts and steps.rb/steps.rb).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "session_keeps_failed_root_resolution_snapshot_and_default_fallback",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "session_keeps_valid_root_snapshot_when_symlink_is_retargeted",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "session_roots_and_configured_registrations_are_isolated",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "registry_routes_supported_suffixes",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/source_adapter/tests.rs",
"name": "registry_routes_supported_suffixes"
},
"rationale": "`registry_routes_supported_suffixes` names the Ruby language and `.rb` suffix in the adapter table it checks in-process.",
"behaviorClass": "ruby-behavior"
},
{
"name": "source_languages_select_their_registered_tree_sitter_grammar",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/source_adapter/tests.rs",
"name": "source_languages_select_their_registered_tree_sitter_grammar"
},
"rationale": "Parses a Ruby registration with the Ruby grammar entry of the adapter table beside the ECMAScript grammars, in-process.",
"behaviorClass": "ruby-behavior"
},
{
"name": "every_registration_has_a_unique_suffix_and_produces_shared_ir",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "registry_rejects_declarations_maps_and_unknown_languages",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "registry_classifies_non_utf8_names_by_their_ascii_extension",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "adapter_session_default_preserves_existing_extract_implementations",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "language_lookup_and_suffix_routing_agree_on_one_adapter_table",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_library_routes_and_sessions_share_state_beside_ecmascript"
},
"rationale": "adapter_for_path(\"steps.rb\") and adapter_for_language(Ruby) both have the data address of the single `.rb` SOURCE_ADAPTER_REGISTRY entry, name `cucumber-ruby` and language Ruby, and language_for_path(\"steps.rb\") is Ruby.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "language_routed_and_suffix_routed_extraction_share_session_state",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_library_routes_and_sessions_share_state_beside_ecmascript"
},
"rationale": "Ruby registrations extracted through one route and a later `def Given` redefinition extracted through the other route, in both orders, share session state: finalize reports an uncertainty and withdraws both definitions; extracting the redefinition in a separate session is the control that keeps both.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "legacy_diagnostics_preserve_message_classification_and_mutation",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: Extraction session or registry mechanics (initialization, root snapshots, suffix tables, legacy diagnostic shapes) that no source text can vary.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "finalization_scopes_preserve_independent_final_findings",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_finalization_scopes_preserve_independent_final_findings"
},
"rationale": "Over five Ruby-extracted definitions (control pair in control.rb; red, red, blue in steps.rb), caller-built Definition, File and Registry(Ruby) uncertainties with Registration, Handler and Source causes retain 4/2/5/5/5/0 definitions with exact duplicate-matcher and duplicate-handler counts, and Registry(JavaScript) is the control that leaves all 5 and both findings. The Ruby frontend itself emits only Registry scopes; its Registration-cause withdrawal is also run end to end in ruby_unresolved_registrations_warn_and_expose_the_corpus_census.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "registry_uncertainty_isolates_languages_but_groups_ecmascript_variants",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/source_adapter/tests.rs",
"name": "registry_uncertainty_isolates_languages_but_groups_ecmascript_variants"
},
"rationale": "`registry_uncertainty_isolates_languages_but_groups_ecmascript_variants` extracts `.rb` sources through the shared extraction session beside ECMAScript ones (registry uncertainty isolation, late Ruby finalization effects) in-process.",
"behaviorClass": "ruby-behavior"
},
{
"name": "public_session_finalization_applies_late_ruby_effects_in_either_order",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/source_adapter/tests.rs",
"name": "public_session_finalization_applies_late_ruby_effects_in_either_order"
},
"rationale": "`public_session_finalization_applies_late_ruby_effects_in_either_order` extracts `.rb` sources through the shared extraction session beside ECMAScript ones (registry uncertainty isolation, late Ruby finalization effects) in-process.",
"behaviorClass": "ruby-behavior"
}
]
},
"src/typescript/source_filter/tests.rs": {
"sourceSha256": "2ec63dff2af41fa5380d53d4c7e8955b3d8d175d60721e5e627f8b51084c5359",
"tests": [
{
"name": "classifies_every_content_kind_discovery_can_deliver",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`classifies every content kind discovery can deliver`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_line_wider_than_the_whole_prefix_is_minified_whatever_precedes_it",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a line wider than the whole prefix is minified whatever precedes it`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "authored_sources_longer_than_the_prefix_are_still_analyzed",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`authored sources longer than the prefix are still analyzed`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "an_unreadable_path_is_left_for_extraction_to_report",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`an unreadable path is left for extraction to report`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "the_guard_vocabulary_covers_every_registration_the_analyzer_understands",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`the guard vocabulary covers every registration the analyzer understands`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "authored_code_that_is_one_enormous_line_survives_on_its_registrations",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`authored code that is one enormous line survives on its registrations`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_configured_registration_name_also_guards_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a configured registration name also guards a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_registration_name_inside_a_longer_identifier_does_not_guard_a_bundle",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a registration name inside a longer identifier does not guard a bundle`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_namespace_qualified_registration_guards_a_file_but_a_promise_chain_does_not",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a namespace qualified registration guards a file but a promise chain does not`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_bare_lowercase_alias_guards_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a bare lowercase alias guards a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_renaming_import_guards_a_file_through_its_module_path",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a renaming import guards a file through its module path`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_project_facade_import_guards_a_file_whatever_the_callee_form",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a project facade import guards a file whatever the callee form`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_project_specifier_outside_import_position_does_not_guard_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a project specifier outside import position does not guard a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "every_registered_framework_module_guards_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`every registered framework module guards a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "comment_trivia_between_the_name_and_the_call_still_guards_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`comment trivia between the name and the call still guards a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "every_transparent_callee_wrapper_still_guards_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`every transparent callee wrapper still guards a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_bzip2_header_needs_its_whole_signature",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a bzip2 header needs its whole signature`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "ecmascript_whitespace_beyond_ascii_still_guards_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`ecmascript whitespace beyond ascii still guards a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "each_exclusion_reports_its_own_word",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`each exclusion reports its own word`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "an_import_keyword_reached_through_a_member_access_is_not_an_import",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`an import keyword reached through a member access is not an import`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "an_unterminated_comment_after_an_import_keyword_is_not_an_import",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`an unterminated comment after an import keyword is not an import`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_type_operator_that_runs_to_the_end_of_the_prefix_is_not_a_call",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a type operator that runs to the end of the prefix is not a call`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_value_block_inside_a_comparison_chain_does_not_guard_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a value block inside a comparison chain does not guard a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "an_unterminated_comment_does_not_run_past_the_prefix",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`an unterminated comment does not run past the prefix`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "repeated_unbalanced_type_arguments_do_not_scale_quadratically",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`repeated unbalanced type arguments do not scale quadratically`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_type_argument_list_longer_than_any_cap_still_guards_a_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a type argument list longer than any cap still guards a file`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_large_registration_configuration_does_not_multiply_classification_cost",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`a large registration configuration does not multiply classification cost`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
},
{
"name": "binary_and_compressed_content_is_excluded_even_when_it_mentions_a_registration",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`binary and compressed content is excluded even when it mentions a registration`). Semantic residue: the Ruby parser policy for binary content is covered by `source_exclusion_stays_with_javascript_adapter`.",
"behaviorClass": "language-specific-api"
}
]
},
"src/typescript/ast.rs": {
"sourceSha256": "ffeb333868535500a9bf07e64ed6b5075196b479a3602cf035d887297295fc27",
"tests": [
{
"name": "relative_specifiers_are_distinguished_from_packages_and_aliases",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: TypeScript AST token classification (`relative specifiers are distinguished from packages and aliases`). Semantic residue: none; Ruby load specifiers are string literals with no token classes.",
"behaviorClass": "language-specific-api"
},
{
"name": "type_only_and_star_forms_use_ast_tokens_instead_of_source_prefixes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: TypeScript AST token classification (`type only and star forms use ast tokens instead of source prefixes`). Semantic residue: none; Ruby load specifiers are string literals with no token classes.",
"behaviorClass": "language-specific-api"
},
{
"name": "typescript_namespace_parse_shapes_are_pinned",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: TypeScript AST token classification (`typescript namespace parse shapes are pinned`). Semantic residue: none; Ruby load specifiers are string literals with no token classes.",
"behaviorClass": "language-specific-api"
}
]
},
"src/typescript/frameworks.rs": {
"sourceSha256": "1682f2bf06aa0332004fe0b4fc37b8959fb3aa21707790b93a533e96b0c6d40f",
"tests": [
{
"name": "framework_entrypoints_preserve_export_kinds",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework entrypoint table (`framework entrypoints preserve export kinds`). Semantic residue: the Ruby provider table is pinned by the `provider-context-world-module-given` and `provider-context-uninstalled-module-given` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "framework_entrypoints_are_unique_and_have_exact_attribution",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework entrypoint table (`framework entrypoints are unique and have exact attribution`). Semantic residue: the Ruby provider table is pinned by the `provider-context-world-module-given` and `provider-context-uninstalled-module-given` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "default_registrations_are_a_subset_of_every_known_registration",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework entrypoint table (`default registrations are a subset of every known registration`). Semantic residue: the Ruby provider table is pinned by the `provider-context-world-module-given` and `provider-context-uninstalled-module-given` groups.",
"behaviorClass": "language-specific-api"
}
]
},
"src/typescript/matcher.rs": {
"sourceSha256": "ee759e90430d3e58fda95f59d730c8665e19bdd0cd9e1ef74c174eafb159a20f",
"tests": [
{
"name": "unicode_sets_flag_belongs_to_matcher_identity",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript regex/string literal semantics (`unicode sets flag belongs to matcher identity`). Semantic residue: Ruby regex and string literal matcher semantics are covered by the regex-* and matcher groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "javascript_string_decoding_covers_escape_forms_and_rejections",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript regex/string literal semantics (`javascript string decoding covers escape forms and rejections`). Semantic residue: Ruby regex and string literal matcher semantics are covered by the regex-* and matcher groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regex_normalization_preserves_semantics_while_canonicalizing_equivalence",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript regex/string literal semantics (`regex normalization preserves semantics while canonicalizing equivalence`). Semantic residue: Ruby regex and string literal matcher semantics are covered by the regex-* and matcher groups.",
"behaviorClass": "language-specific-api"
}
]
},
"src/typescript/module_resolver/tests.rs": {
"sourceSha256": "4cec69962f348e7b8057f445bac6b0fd7e9398efaf9c3c3bc1eb00c3de4808f8",
"tests": [
{
"name": "project_resolution_supports_relative_modules_and_rejects_escapes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`project resolution supports relative modules and rejects escapes`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "branching_diamond_reexports_are_memoized_by_path_and_remaining_depth",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`branching diamond reexports are memoized by path and remaining depth`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "resolver_reuses_cached_modules_across_importing_files",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`resolver reuses cached modules across importing files`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "configured_analysis_root_allows_cross_package_reexports",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`configured analysis root allows cross package reexports`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "depth_diverse_graphs_cache_each_module_depth_within_the_state_budget",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`depth diverse graphs cache each module depth within the state budget`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "cycles_do_not_poison_context_dependent_export_results",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`cycles do not poison context dependent export results`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "aggregate_module_graph_limits_fail_closed",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`aggregate module graph limits fail closed`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "malformed_reexport_modules_cannot_supply_recovered_registrations",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`malformed reexport modules cannot supply recovered registrations`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "namespace_star_exports_are_not_flattened_into_direct_registrations",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`namespace star exports are not flattened into direct registrations`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "modules_without_a_supported_grammar_contribute_no_exports",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`modules without a supported grammar contribute no exports`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_boundary_falls_back_to_the_importer_directory_without_a_manifest",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`project boundary falls back to the importer directory without a manifest`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "barrel_bindings_only_re_export_provable_registrations",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`barrel bindings only re export provable registrations`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_module_exports_barrels_resolve_every_modeled_form",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs module exports barrels resolve every modeled form`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_star_re_export_forms_follow_a_local_barrel",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs star re export forms follow a local barrel`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_spread_barrel_merges_a_re_export_with_a_named_export",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs spread barrel merges a re export with a named export`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "an_unmodeled_commonjs_export_form_marks_the_module_incomplete",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`an unmodeled commonjs export form marks the module incomplete`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_named_exports_resolve_member_re_exports_and_flag_whole_module_assignment",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs named exports resolve member re exports and flag whole module assignment`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_unmodeled_export_shapes_flag_incomplete_and_non_exports_stay_quiet",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs unmodeled export shapes flag incomplete and non exports stay quiet`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_object_export_resolves_a_string_literal_key",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs object export resolves a string literal key`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_degenerate_and_malformed_export_shapes_are_handled",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs degenerate and malformed export shapes are handled`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_star_re_export_of_a_missing_module_resolves_to_nothing",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs star re export of a missing module resolves to nothing`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_nested_module_exports_member_resolves_a_named_export",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs nested module exports member resolves a named export`). Semantic residue: Ruby relative, cyclic and unresolved loads are covered by the load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_opaque_named_export_values_fail_closed_but_inert_values_stay_quiet",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs opaque named export values fail closed but inert values stay quiet`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_exports_inside_a_function_are_not_module_exports",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs exports inside a function are not module exports`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_conditional_module_level_exports_fail_closed",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs conditional module level exports fail closed`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_bracket_notation_exports_fail_closed",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs bracket notation exports fail closed`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_export_values_are_quiet_only_when_provably_inert",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs export values are quiet only when provably inert`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_identifier_exports_follow_a_const_to_its_value",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/JSONC, package maps and workspace resolution (`commonjs identifier exports follow a const to its value`). Semantic residue: Ruby load-path resolution and cycles are pinned by the `load-provider-root` and `load-cycle` groups.",
"behaviorClass": "language-specific-api"
}
]
},
"src/typescript/project_resolution/tests.rs": {
"sourceSha256": "0a2520788c8b3505addae67fe8c086c6a206dfa18aad93856d53b8ab599145d9",
"tests": [
{
"name": "jsonc_preserves_comment_text_in_strings_and_removes_trailing_commas",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`jsonc preserves comment text in strings and removes trailing commas`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "paths_imports_and_workspace_exports_resolve_statically",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`paths imports and workspace exports resolve statically`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_import_chains_respect_the_resolution_depth_limit",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package import chains respect the resolution depth limit`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_import_to_workspace_chains_share_the_resolution_depth_limit",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package import to workspace chains share the resolution depth limit`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "multiple_extends_use_later_base_then_child_precedence",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`multiple extends use later base then child precedence`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "later_extends_inherits_fields_it_does_not_specify",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`later extends inherits fields it does not specify`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "module_files_precede_indexes_and_js_specifiers_substitute_typescript",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`module files precede indexes and js specifiers substitute typescript`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "conditional_targets_use_first_active_source_order_key",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`conditional targets use first active source order key`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_maps_reject_invalid_key_shapes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package maps reject invalid key shapes`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "pure_resolution_helpers_cover_valid_and_rejected_shapes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`pure resolution helpers cover valid and rejected shapes`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_map_targets_cover_conditions_arrays_wildcards_and_errors",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package map targets cover conditions arrays wildcards and errors`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_config_validation_reports_each_unsafe_static_shape",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`project config validation reports each unsafe static shape`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_metadata_and_workspace_shapes_are_validated",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package metadata and workspace shapes are validated`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "resolver_covers_relative_fallback_package_main_subpaths_and_missing_targets",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`resolver covers relative fallback package main subpaths and missing targets`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "canonical_paths_and_mapping_limits_fail_closed",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`canonical paths and mapping limits fail closed`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "cached_configs_cannot_bypass_extends_depth_or_metadata_limits",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`cached configs cannot bypass extends depth or metadata limits`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_manifest_symlinks_cannot_escape_the_package",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package manifest symlinks cannot escape the package`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jsonc_normalization_spans_block_comments_and_preserves_string_escapes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`jsonc normalization spans block comments and preserves string escapes`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_import_targets_forward_reach_workspaces_dead_end_or_are_rejected",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package import targets forward reach workspaces dead end or are rejected`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "workspace_scanning_skips_unnamed_packages_and_entry_points_fall_back_to_the_index",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`workspace scanning skips unnamed packages and entry points fall back to the index`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "duplicate_workspace_package_names_are_refused",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`duplicate workspace package names are refused`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_configs_without_matching_path_targets_fall_through",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`project configs without matching path targets fall through`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "unplaceable_importers_fail_by_name_or_resolve_to_no_package",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`unplaceable importers fail by name or resolve to no package`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "unparseable_manifests_and_uncontained_configs_name_the_offending_path",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`unparseable manifests and uncontained configs name the offending path`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_maps_require_key_prefixes_and_prefer_the_most_specific_wildcard",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package maps require key prefixes and prefer the most specific wildcard`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_export_targets_outside_the_analysis_root_are_refused",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package export targets outside the analysis root are refused`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_extends_resolve_workspace_bases_and_skip_unavailable_ones",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package extends resolve workspace bases and skip unavailable ones`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "relative_extends_names_a_dotted_json_base_without_its_suffix",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`relative extends names a dotted json base without its suffix`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_tsconfig_field_accepts_a_windows_current_directory_prefix",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package tsconfig field accepts a windows current directory prefix`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "package_extends_refuse_a_symlink_out_of_the_workspace_package",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM export and re-export resolution (`package extends refuse a symlink out of the workspace package`). Semantic residue: Ruby provider re-exports and load roots are covered by the equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
}
]
},
"src/typescript/tests.rs": {
"sourceSha256": "dad3d2f3b85823e552b9e5a53cf8f9d2f9393b4ae9ae76ba8a3d92a8e7fcd6c6",
"tests": [
{
"name": "framework_entrypoints_preserve_duplicate_findings_and_attribution",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`framework entrypoints preserve duplicate findings and attribution`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_cucumber_import_alias_and_regex",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`extracts cucumber import alias and regex`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_playwright_bdd_destructuring_alias",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`extracts playwright bdd destructuring alias`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_cypress_cucumber_preprocessor_definitions",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`extracts cypress cucumber preprocessor definitions`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_supported_legacy_cucumber_registration_modules_in_esm_and_cjs",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`extracts supported legacy cucumber registration modules in esm and cjs`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "legacy_cypress_preprocessor_root_and_similar_prefixes_are_not_registration_modules",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`legacy cypress preprocessor root and similar prefixes are not registration modules`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "playwright_step_decorator_name_is_not_invented_for_other_framework_modules",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`playwright step decorator name is not invented for other framework modules`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_playwright_bdd_method_decorators_with_aliases_and_options",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`extracts playwright bdd method decorators with aliases and options`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_playwright_bdd_method_decorators_from_cjs_namespaces",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`extracts playwright bdd method decorators from cjs namespaces`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "extracts_playwright_bdd_method_decorators_with_javascript_grammar",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`extracts playwright bdd method decorators with javascript grammar`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "unsupported_cjs_destructured_exports_shadow_ambient_registration_names",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`unsupported cjs destructured exports shadow ambient registration names`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "call_and_decorator_registration_apis_are_not_interchangeable",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`call and decorator registration apis are not interchangeable`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_reexports_preserve_playwright_decorator_registration_provenance",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project reexports preserve playwright decorator registration provenance`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "dynamic_playwright_bdd_decorator_matchers_warn_without_inventing_definitions",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`dynamic playwright bdd decorator matchers warn without inventing definitions`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "decorated_stub_methods_keep_the_existing_trivial_handler_guard",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`decorated stub methods keep the existing trivial handler guard`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "decorated_method_fingerprints_include_runtime_declaration_semantics",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`decorated method fingerprints include runtime declaration semantics`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "decorated_method_modifiers_are_detected_across_comments",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`decorated method modifiers are detected across comments`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "malformed_decorator_registrations_warn_without_crossing_class_members",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`malformed decorator registrations warn without crossing class members`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_resolved_registrations_propagate_framework_metadata",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`project resolved registrations propagate framework metadata`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "mixed_framework_detection_is_scoped_to_each_source_file",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`mixed framework detection is scoped to each source file`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "playwright_bdd_factory_requires_import_evidence_and_supports_aliases",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`playwright bdd factory requires import evidence and supports aliases`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "mixed_framework_bindings_keep_per_registration_provenance_in_any_import_order",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`mixed framework bindings keep per registration provenance in any import order`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_resolves_playwright_bdd_registrations_created_and_exported_by_local_fixture",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project resolves playwright bdd registrations created and exported by local fixture`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "resolved_framework_facades_provide_expect_import_provenance",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`resolved framework facades provide expect import provenance`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_resolves_commonjs_playwright_bdd_factory_aliases",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project resolves commonjs playwright bdd factory aliases`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_resolves_reexported_runtime_registration_imports",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project resolves reexported runtime registration imports`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_resolves_chained_import_then_export_provenance",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project resolves chained import then export provenance`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "module_resolution_clears_active_paths_after_recoverable_errors",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/package.json resolution (path aliases, extends, workspaces, package maps) (`module resolution clears active paths after recoverable errors`). Semantic residue: Ruby load cycles and recoverable load errors are pinned by the `load-cycle` and `load-unresolved` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_resolves_explicit_exports_but_rejects_untrusted_create_bdd_lookalikes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project resolves explicit exports but rejects untrusted create bdd lookalikes`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_resolves_wrapped_create_bdd_results_through_star_exports",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project resolves wrapped create bdd results through star exports`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_does_not_trust_type_only_create_bdd_imports",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`project does not trust type only create bdd imports`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "alpha_fingerprint_ignores_local_renames_but_not_opposite_assertions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_fingerprint_outcomes_preserve_identity_and_conflicts"
},
"rationale": "Renamed handler locals retain a handler finding, while opposite assertion polarity removes all handler-comparison findings; identical trusted assertions are the positive control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "handler_source_snippets_are_normalized_and_bounded",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_normalized_handler_evidence_and_snippets_preserve_final_outcomes"
},
"rationale": "A reported Ruby comparison trims and normalizes CRLF, bounds a Unicode handler snippet to 2,000 characters, and marks truncation with an ellipsis.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "extracts_rule_scoped_inline_suppressions_and_rejects_malformed_directives",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_inline_directives_are_rule_scoped_and_reject_malformed_input"
},
"rationale": "Two adjacent Ruby directives on one registration suppress its duplicate-matcher and unused-definition findings with their own reasons and nothing else; a directive without `--`, an unknown rule and an empty reason each produce exactly one located error (steps.rb:7:1, 9:1, 11:1), and the findings the first and third target stay active, with exit 2 and exactly four `cuke-dedup:` stderr lines in the run.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "rejects_oversized_inline_suppression_reasons",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_inline_directives_are_rule_scoped_and_reject_malformed_input"
},
"rationale": "A Ruby directive with a 513-character reason is rejected with `oversized.rb:2:1: inline suppression reason exceeds the 512-character limit` and its unused-definition finding stays active; the control with exactly 512 characters suppresses its finding and retains the full reason.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "structural_fingerprint_masks_string_literal_contents",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/ruby/tests.rs",
"name": "handler_fingerprints_preserve_superficial_value_and_callee_boundaries"
},
"rationale": "Two Ruby calls differing only in `'#save'` versus `'#saves'` have distinct alpha fingerprints and one structural fingerprint.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "behavior_signatures_canonicalize_calls_without_treating_await_as_behavior",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/ruby/tests.rs",
"name": "handler_fingerprints_preserve_superficial_value_and_callee_boundaries"
},
"rationale": "Ruby direct, fluent, factory-receiver, and block-parameter callback handlers retain their canonical receiver and method operations; JavaScript `await` syntax is inapplicable.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "behavior_signatures_alpha_normalize_declared_receivers",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/ruby/tests.rs",
"name": "handler_fingerprints_preserve_superficial_value_and_callee_boundaries"
},
"rationale": "Ruby handler parameters declared in the same order but named differently produce equal alpha fingerprints and behavior signatures.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "behavior_signatures_preserve_assertion_subjects_and_polarity",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_fingerprint_outcomes_preserve_identity_and_conflicts"
},
"rationale": "Distinct Ruby assertion subjects and opposite polarity each prohibit handler-comparison findings, while identical trusted assertions retain the positive handler finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "behavior_signatures_still_alpha_normalize_assertion_subject_locals",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_fingerprint_outcomes_preserve_identity_and_conflicts"
},
"rationale": "Equivalent Ruby assertion subjects reached through `item` and `element` locals retain the handler finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_values_resolve_safe_local_constant_initializers",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_fingerprint_outcomes_preserve_identity_and_conflicts"
},
"rationale": "Renamed handler-local single-assignment values resolving to `'ready'` retain a finding, while `'ready'` versus `'idle'` produces none.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_chains_unwrap_typescript_expression_wrappers",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`assertion chains unwrap typescript expression wrappers`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "assertion_review_scope_boundaries",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`assertion review scope boundaries`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "behavior_signatures_cover_supported_expect_variants_and_incomplete_chains",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`behavior signatures cover supported expect variants and incomplete chains`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "behavior_signatures_resolve_trusted_expect_imports_and_requires",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`behavior signatures resolve trusted expect imports and requires`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "behavior_signatures_do_not_trust_expect_aliases_from_unrelated_modules",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`behavior signatures do not trust expect aliases from unrelated modules`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "runtime_expect_bindings_shadow_the_ambient_assertion_factory",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`runtime expect bindings shadow the ambient assertion factory`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "typescript_runtime_and_erased_declarations_have_distinct_assertion_shadowing",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`typescript runtime and erased declarations have distinct assertion shadowing`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "assertion_namespaces_named_expect_do_not_restore_the_callable_ambient",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`assertion namespaces named expect do not restore the callable ambient`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "handler_local_shadows_do_not_disable_assertions_in_other_handlers",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_overlap_preserves_values_effects_and_callable_execution"
},
"rationale": "A block-local `expect` parameter is treated as a generic call without revoking the configured file-level assertion factory used by neighboring handler comparisons.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "nested_scope_shadows_do_not_disable_outer_assertions_in_the_same_handler",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_overlap_preserves_values_effects_and_callable_execution"
},
"rationale": "A nested block-local `check` shadow remains generic while conflicting trusted outer assertions reduce the pair to the one expected near finding rather than an identical-handler result.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "property_and_lexically_resolved_assignments_preserve_assertion_provenance",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`property and lexically resolved assignments preserve assertion provenance`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "javascript_using_loop_bindings_shadow_ambient_expect",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`javascript using loop bindings shadow ambient expect`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "runtime_class_names_shadow_ambient_expect_only_inside_the_class",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`runtime class names shadow ambient expect only inside the class`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "block_and_class_static_bindings_stay_within_their_lexical_scopes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`block and class static bindings stay within their lexical scopes`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "method_names_do_not_shadow_assertion_bindings_inside_their_bodies",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`method names do not shadow assertion bindings inside their bodies`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "shadowed_expect_calls_retain_generic_behavior_comparison",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_overlap_preserves_values_effects_and_callable_execution"
},
"rationale": "Two identical calls through a nested `expect` block parameter retain a handler finding as generic behavior without receiving configured assertion authority.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "trusted_and_type_only_expect_imports_preserve_assertion_semantics",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`trusted and type only expect imports preserve assertion semantics`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "ambient_variable_declarations_do_not_shadow_runtime_assertion_provenance",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`ambient variable declarations do not shadow runtime assertion provenance`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "decorated_method_metadata_does_not_inflate_executable_behavior_similarity",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`decorated method metadata does not inflate executable behavior similarity`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "alpha_fingerprints_assign_identifiers_by_declaration_order",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/ruby/tests.rs",
"name": "handler_fingerprints_preserve_superficial_value_and_callee_boundaries"
},
"rationale": "Two Ruby handlers with differently named parameters declared and used in the same order have equal alpha fingerprints and behavior signatures.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "defaulted_destructured_parameters_preserve_initializer_behavior",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`defaulted destructured parameters preserve initializer behavior`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "computed_callees_keep_the_structural_fallback",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`computed callees keep the structural fallback`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "ignores_unrelated_member_calls_and_destructuring_aliases",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`ignores unrelated member calls and destructuring aliases`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "retains_regex_flags_and_decodes_javascript_hex_escapes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript regex literal flags and escape decoding (`retains regex flags and decodes javascript hex escapes`). Semantic residue: Ruby regex matcher identity is pinned by the `regex-classes-ascii-word` and `regex-punctuation-quoted` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "preserves_all_flags_but_normalizes_only_semantic_regex_flags",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript regex literal flags and escape decoding (`preserves all flags but normalizes only semantic regex flags`). Semantic residue: Ruby regex matcher identity is pinned by the `regex-classes-ascii-word` and `regex-punctuation-quoted` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "resolves_named_handlers_to_bodies_without_cross_file_name_collisions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_pending_stub_handlers_are_not_duplicates"
},
"rationale": "Ruby named handlers are bound to the declaration current at registration: distinct method names in separate files retain two definitions with different bodies, while same-named top-level methods conservatively withdraw because load order can redefine them; neither path creates a cross-file duplicate-handler finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "resolves_bound_named_handlers_without_dropping_the_definition",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`resolves bound named handlers without dropping the definition`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "bound_arguments_are_part_of_handler_identity",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`bound arguments are part of handler identity`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "unresolved_handler_references_are_not_comparable",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_named_handler_discovery_preserves_callable_identity_and_capture_timing"
},
"rationale": "Unknown, late, mutated, escaped, dynamically named, redefined and receiver-unknown Ruby handler references yield no definitions or handler findings; inline, immutable local callable and proven `method(:name)` controls retain both definitions and findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "recognizes_resolved_and_inline_stub_handler_shapes",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_pending_stub_handlers_are_not_duplicates"
},
"rationale": "Inline blocks, do-blocks, lambdas and resolved `&method` handlers covering empty, pending, todo, not-implemented, return/next and labelled raise/fail shapes retain definitions but produce no handler findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "real_handlers_with_stub_like_text_remain_comparable",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_pending_stub_handlers_are_not_duplicates"
},
"rationale": "Real-work controls containing an unlabelled `raise NotImplementedError`, non-stub raise values, `work()`, `pending; work()` or `next work()` remain comparable and produce duplicate-handler and near-duplicate findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "structural_templates_preserve_substitution_behavior",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/ruby/tests.rs",
"name": "handler_fingerprints_preserve_superficial_value_and_callee_boundaries"
},
"rationale": "Ruby handlers interpolating `user.name` and `order.id` retain distinct structural fingerprints.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "lowercase_registrations_require_supported_import_evidence",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`lowercase registrations require supported import evidence`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regular_expression_normalization_preserves_matching_semantics",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: `typescript::matcher::normalize_regular_expression` rewrites JavaScript regex literals. Semantic residue: Ruby regex matcher identity is pinned by the `regex-classes-ascii-word`, `regex-braces-literal` and `regex-punctuation-quoted` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regex_flag_encoding_cannot_collide_with_literal_matcher_text",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript regex literal flags and escape decoding (`regex flag encoding cannot collide with literal matcher text`). Semantic residue: Ruby regex matcher identity is pinned by the `regex-classes-ascii-word` and `regex-punctuation-quoted` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "resolves_supported_registration_import_shapes_and_alias_chains",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`resolves supported registration import shapes and alias chains`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "runtime_absent_and_shadowed_registrations_are_ignored",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_registration_owner_matrix_preserves_findings_without_granting_alias_trust"
},
"rationale": "The Ruby ownership matrix retains three definitions and one duplicate-handler finding only for proven registration owners; shadowing, replacement, mutation, escape and unrelated namespace controls yield zero definitions and no handler findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "type_only_imports_neither_resolve_modules_nor_shadow_runtime_globals",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`type only imports neither resolve modules nor shadow runtime globals`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "side_effect_framework_imports_preserve_runtime_framework_metadata",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`side effect framework imports preserve runtime framework metadata`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "reports_unsupported_regexes_and_malformed_string_matchers",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unsupported_matchers_mark_partial_extraction_incomplete"
},
"rationale": "Unsupported lookahead regexes and an out-of-range Unicode string escape emit one located matcher diagnostic, mark reports incomplete and retain neighbouring valid definitions and their duplicate-matcher finding; supported string and regex controls remain complete.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "supported_regexes_remain_authoritative_under_resource_limits",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_regex_resource_limit_is_reported_and_keeps_the_definition"
},
"rationale": "A supported Ruby regex whose compiled program exceeds the one-MiB limit emits one located actionable diagnostic, remains in JSON analysis and fails strict mode; the small-repeat control is complete.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "grammar_limitations_stay_incomplete",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: TSX and TypeScript type-syntax grammar limitations. Semantic residue: Ruby grammar limitations are pinned by `malformed_ruby_literal_inputs_report_incompleteness_without_losing_controls`.",
"behaviorClass": "language-specific-api"
},
{
"name": "deeply_nested_handlers_do_not_use_the_process_stack",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_deep_handlers_and_unicode_locations_reach_final_analysis"
},
"rationale": "A Ruby handler containing 2,000 nested arrays completes in the built CLI and reaches the final summary as one complete definition, exercising iterative frontend traversal without process-stack recursion.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "source_locations_count_unicode_code_points",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_deep_handlers_and_unicode_locations_reach_final_analysis"
},
"rationale": "A registration after the multibyte prefix `日本語` starts at column 17 in the extracted definition and in the final duplicate-matcher finding, proving code-point rather than UTF-8-byte columns.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "generator_handlers_are_extracted_and_comparable",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`generator handlers are extracted and comparable`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "dynamic_matchers_and_handlers_emit_diagnostics_instead_of_disappearing",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unsupported_matchers_mark_partial_extraction_incomplete"
},
"rationale": "Dynamic call matchers, interpolated strings, non-string values and unresolved `&handler` references emit the exact located registration diagnostic, mark every machine report incomplete and retain neighbouring valid findings.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unresolved_registration_shaped_calls_are_visible_without_flagging_helpers",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_inert_receiver_only_project_passes_strict_mode"
},
"rationale": "Registration-shaped sends on main or uncertain receivers fail strict mode as incomplete, while the proven local receiver send yields zero definitions and only the ordinary empty-extraction notice; unrelated helper controls are also pinned by the matcher diagnostic matrix.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unresolved_registration_imports_name_the_module_in_diagnostics",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`unresolved registration imports name the module in diagnostics`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "resolved_registration_with_an_unsupported_matcher_is_not_called_unresolved",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unsupported_matchers_mark_partial_extraction_incomplete"
},
"rationale": "Resolved Ruby keywords with unsupported matchers emit exactly the located static-matcher or unsupported-regex diagnostic and no generic unresolved-registration diagnostic; supported controls remain complete.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unresolved_calls_remain_visible_when_the_same_file_yields_definitions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unsupported_matchers_mark_partial_extraction_incomplete"
},
"rationale": "Each uncertain registration row shares a file with two valid registrations: the located completeness diagnostic remains visible, both valid definitions stay analyzed and their duplicate-matcher finding remains in JSON and SARIF output.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "extracts_registrations_through_transparent_wrappers_and_static_subscripts",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`extracts registrations through transparent wrappers and static subscripts`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "static_subscript_registrations_are_included_in_completeness_diagnostics",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`static subscript registrations are included in completeness diagnostics`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "computed_subscripts_and_lowercase_then_calls_are_not_registration_evidence",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`computed subscripts and lowercase then calls are not registration evidence`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "deeply_parenthesized_registration_callees_are_unwrapped_iteratively",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`deeply parenthesized registration callees are unwrapped iteratively`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "positional_registration_wrappers_are_inferred_but_reordering_ones_are_not",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`positional registration wrappers are inferred but reordering ones are not`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "wrapper_inference_follows_chains_without_looping_on_self_reference",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`wrapper inference follows chains without looping on self reference`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "wrapper_inference_resolves_long_chains_without_quadratic_work",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`wrapper inference resolves long chains without quadratic work`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "registration_discovery_covers_static_alias_and_shadowing_forms",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`registration discovery covers static alias and shadowing forms`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "configured_assertion_modules_are_trusted_in_every_import_form",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`configured assertion modules are trusted in every import form`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "configured_registration_names_override_inference_without_duplicating_known_aliases",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`configured registration names override inference without duplicating known aliases`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "wrapper_forwards_unwrap_parentheses_but_reject_namespaced_or_short_calls",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`wrapper forwards unwrap parentheses but reject namespaced or short calls`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "type_only_specifiers_never_alias_registrations_in_resolved_or_unresolved_imports",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`type only specifiers never alias registrations in resolved or unresolved imports`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "re_exports_and_destructures_only_alias_names_the_framework_publishes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`re exports and destructures only alias names the framework publishes`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "language_adapters_reject_sources_from_another_language",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_adapter_rejects_mislabeled_sources_with_context"
},
"rationale": "The public cucumber-ruby adapter rejects a JavaScript-labelled source before parsing and its error names `cucumber-ruby`, `JavaScript` and `features/steps/example.js`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "decorated_method_parameter_defaults_are_part_of_handler_identity",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`decorated method parameter defaults are part of handler identity`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "javascript_decorated_method_defaults_change_handler_identity",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`javascript decorated method defaults change handler identity`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "named_handlers_resolve_to_the_innermost_and_latest_binding",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`named handlers resolve to the innermost and latest binding`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "property_handler_expressions_stay_uncomparable",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`property handler expressions stay uncomparable`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "nullish_and_marker_handlers_are_recognized_as_stubs",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`nullish and marker handlers are recognized as stubs`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "calls_on_unnameable_receivers_keep_their_structural_callee",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/ruby/tests.rs",
"name": "handler_fingerprints_preserve_superficial_value_and_callee_boundaries"
},
"rationale": "Ruby calls on the same literal receiver retain distinct behavior signatures for `strip` and `upcase`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "comments_do_not_change_normalized_handler_fingerprints",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_normalized_handler_evidence_and_snippets_preserve_final_outcomes"
},
"rationale": "A Ruby handler with a large comment and an uncommented `do...end` handler retain one normalized fingerprint while their exact fingerprints select the normalized evidence tier.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "loop_declarations_shadow_the_ambient_assertion_within_their_scope",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`loop declarations shadow the ambient assertion within their scope`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "nested_namespace_declarations_shadow_assertions_only_inside_their_block",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`nested namespace declarations shadow assertions only inside their block`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "import_require_clauses_bind_assertion_namespaces_by_module",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`import require clauses bind assertion namespaces by module`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "asymmetric_matchers_are_recognized_through_namespaced_factories",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`asymmetric matchers are recognized through namespaced factories`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "array_destructured_requires_shadow_rather_than_trust_the_assertion_factory",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`array destructured requires shadow rather than trust the assertion factory`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "type_only_specifiers_beside_a_runtime_expect_import_preserve_trust",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`type only specifiers beside a runtime expect import preserve trust`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "decorator_registrations_skip_sibling_decorators_to_reach_their_method",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD class-method decorators (`decorator registrations skip sibling decorators to reach their method`). Semantic residue: none; Ruby registers blocks and methods without decorators.",
"behaviorClass": "language-specific-api"
},
{
"name": "assertion_chains_unwrap_angle_bracket_type_assertions",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`assertion chains unwrap angle bracket type assertions`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "awaited_angle_bracket_casts_still_resolve_the_assertion_chain",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`awaited angle bracket casts still resolve the assertion chain`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "loop_heads_without_a_declaration_introduce_no_binding",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`loop heads without a declaration introduce no binding`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "labelled_module_level_var_declarations_shadow_the_ambient_assertion",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`labelled module level var declarations shadow the ambient assertion`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "only_named_receivers_revoke_namespace_assertion_trust",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`only named receivers revoke namespace assertion trust`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "nested_block_writes_resolve_to_the_shadowing_binding_not_the_namespace",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`nested block writes resolve to the shadowing binding not the namespace`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "alias_provenance_resolves_deep_scopes_with_many_assignment_edges_without_quadratic_work",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`alias provenance resolves deep scopes with many assignment edges without quadratic work`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "alias_propagation_terminates_on_cyclic_subscript_reassignments",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`alias propagation terminates on cyclic subscript reassignments`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "defaulted_destructured_matcher_aliases_propagate_writes_but_unrelated_ones_do_not",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`defaulted destructured matcher aliases propagate writes but unrelated ones do not`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "rest_copies_alias_the_namespace_only_through_a_bound_identifier",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS assertion provenance (ambient `expect`, namespace and destructured aliases, computed member access, asymmetric matchers) (`rest copies alias the namespace only through a bound identifier`). Semantic residue: Ruby assertion provenance (constants, aliases, namespaces, polarity) is pinned by `tests/ruby_assertion_provenance.rs` and the `assertion-and-polarity` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "facade_require_imports_bind_namespaces_without_assertion_trust",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`facade require imports bind namespaces without assertion trust`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "constant_aliases_of_parameters_normalize_without_resolving_a_value",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`constant aliases of parameters normalize without resolving a value`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_string_literal_does_not_forge_sibling_structure_into_an_equal_fingerprint",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "src/ruby/tests.rs",
"name": "handler_fingerprints_preserve_superficial_value_and_callee_boundaries"
},
"rationale": "A Ruby string shaped like sibling call arguments retains a different alpha fingerprint from two real arguments.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "assertion_event_components_escape_delimiters_so_computed_keys_do_not_forge_chains",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_fingerprint_outcomes_preserve_identity_and_conflicts"
},
"rationale": "A single Ruby `public_send(:'not.to_be', ...)` component cannot forge the trusted `.not.to_be(...)` chain and produces no handler-comparison finding against it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "default_and_import_equals_bindings_register_only_where_they_bind_the_module",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`default and import equals bindings register only where they bind the module`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "every_runtime_import_form_shadows_the_ambient_registration_global",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`every runtime import form shadows the ambient registration global`). Semantic residue: Ruby `require`, `require_relative` and `load` provenance is pinned by the `load-relative`, `load-cycle`, `load-unresolved` and `load-provider-root` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "passing_a_registration_to_a_function_is_reported",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`passing a registration to a function is reported`). Semantic residue: Ruby registration aliasing, shadowing and uncertain forms are pinned by the `registration-shadowing`, `registration-uncertain-dynamic` and `registration-uncertain-nested` groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "control_flow_behavior_events_map_typescript_node_kinds_only",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: TypeScript tree-sitter node-kind mapping to control-flow events. Semantic residue: Ruby control-flow events are pinned by `action_streams_compare_ordinary_handlers_like_the_typescript_frontend`.",
"behaviorClass": "language-specific-api"
}
]
},
"tests/cli.rs": {
"sourceSha256": "96bcdbaae75c1e6cee5c8508f4e1f3cc382db0d992fc87b1e86564f788698cf7",
"tests": [
{
"name": "baseline_from_ref_compares_history_without_mutating_the_checkout",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_baseline_from_ref_compares_history_without_mutating_the_checkout"
},
"rationale": "Ports the original over .rb sources in a space-named (non-UTF-8 on Linux) repository with hostile hooks, filters, a global config and GIT_* env (the mixed-case config variables take effect only on Windows): asserts exits 0/1/1/0 by allowance, 1 active + 1 suppressed after third.rb, Ruby parse failure fatal only under --fail-on-unparseable, HEAD/index/worktrees unchanged, and every flag-misuse error.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "baseline_from_ref_rejects_incomplete_history_even_when_current_files_are_valid",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_baseline_from_ref_rejects_or_reports_incomplete_history"
},
"rationale": "Five Ruby base revisions (syntax error, unresolved require, no definitions, no feature, invalid Gherkin) exit 2 under `--fail-on-incomplete`, each naming its cause, while a complete base under the same flags exits 0.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "baseline_from_ref_tolerates_incomplete_history_by_default_and_reports_it",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_baseline_from_ref_rejects_or_reports_incomplete_history"
},
"rationale": "A base with a valid steps.rb plus an unparseable broken.rb succeeds by default with \"baseline revision `HEAD` is incomplete\" and the --fail-on-incomplete hint, and exits 2 under --fail-on-incomplete.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "baseline_from_ref_rejects_truncated_base_and_unmaterialized_submodules",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_baseline_from_ref_rejects_truncated_base_and_unmaterialized_submodules"
},
"rationale": "Ten Ruby page.perform(i) definitions truncated by --max-structural-class-comparisons 2 make the base incomplete (exit 2), and gitlink submodules are refused whether real, hidden or injected by git replace.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "baseline_tree_output_is_bounded_before_git_exit_and_children_are_reaped",
"requiredStatus": "engine-invariant",
"stage": "bounded-io",
"rationale": "Adapter-independent stage `bounded-io`: the Git tree-listing reader bound and child reaping. A Git shim supplies the listing, so no source of any language is read.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "fixture_corpus_matches_the_versioned_manifest",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_parity_manifest_groups_match_their_scalar_oracles"
},
"rationale": "Loads the versioned Ruby parity manifest and its group manifests, runs all 136 executable groups with their manifest arguments under --fail-on-incomplete, and asserts each group's definition count, feature-step count, completeness, strict exit, zero truncated findings, each required finding matched on every declared field (rule, primaryPath, primaryLine, relatedLocations, relatedCount, messageIncludes, cluster, matchers) by exactly its count (default 1) of active findings, zero active matches for each requiredAbsent entry, exactly one owning requiredFindings entry per active finding, duplication values and expected candidate sources; an unmodeled oracle key fails the test.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "threshold_does_not_tolerate_non_duplication_errors",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exit_policy_follows_severity_threshold_and_suppressions"
},
"rationale": "Ruby duplicate pair plus a feature step under --threshold 100 exits 1 with \"threshold 100.00% — PASS\" and an ambiguous-step finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "invalid_thresholds_are_configuration_errors",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Configuration decoding and validation at the CLI boundary (invalid thresholds are configuration errors); no source adapter runs before the error.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "invalid_exclusion_patterns_are_operational_errors",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Configuration decoding and validation at the CLI boundary (invalid exclusion patterns are operational errors); no source adapter runs before the error.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "inline_suppressions_require_a_rule_and_reason_and_affect_exit_status",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exit_policy_follows_severity_threshold_and_suppressions"
},
"rationale": "A Ruby \"# cuke-dedup:ignore duplicate-matcher -- reason\" directive yields \"1 suppressed\" and exit 0; a reason-less directive on line 2 of broken.rb exits 2 with \"broken.rb:2:1: inline suppression must use `# cuke-dedup:ignore RULE -- REASON`\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "print_config_reports_merged_values_without_running_discovery",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Configuration decoding and validation at the CLI boundary (print config reports merged values without running discovery); no source adapter runs before the error.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limits_cannot_exceed_hard_safety_ceilings_from_config_or_cli",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_limits_cannot_exceed_hard_safety_ceilings"
},
"rationale": "Over-ceiling limits from config (with and without --print-config) and CLI exit 2 with the hard-limit messages beside a Ruby corpus; at-ceiling values print 2000000/250000 and a Ruby run at those values completes untruncated with its duplicate-matcher finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "zero_config_implicit_check_reports_duplicates_and_writes_machine_reports",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_machine_reports_follow_metrics_and_stream_contracts"
},
"rationale": "With no config file (only the mandatory --definitions opt-in) the implicit check over two Ruby Then registrations exits 1, writes terminal/json/html/sarif, and asserts schemaVersion, errors 2, corpus and metrics counts, phase timings, HTML census and SARIF executionSuccessful true.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "no_metrics_produces_reproducible_machine_report_content",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_machine_reports_follow_metrics_and_stream_contracts"
},
"rationale": "--no-metrics over one Ruby definition omits metrics from the default-directory JSON report and from the JSONL summary while keeping corpus counts of 1.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "project_config_can_disable_metrics",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_machine_reports_follow_metrics_and_stream_contracts"
},
"rationale": "A .cuke-dedup.json with definitions [\"*.rb\"], reporters [\"json\"] and noMetrics true produces a JSON report without metrics and definitionsExtracted 1.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "empty_default_definition_discovery_is_visible",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_default_discovery_is_visibly_empty_and_names_the_opt_in_pattern"
},
"rationale": "With only a feature and an un-opted steps.rb, default discovery succeeds with \"automatic discovery found no supported step-definition source files\" and Analyzed 0 definitions, and --require-definitions exits 2 with \"no step definitions were extracted because no definition source files were discovered\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unresolved_registration_calls_warn_and_expose_the_corpus_census",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unresolved_registrations_warn_and_expose_the_corpus_census"
},
"rationale": "A single Ruby file whose only registration has a dynamic matcher exits 0 with exactly two warnings (`steps.rb:2:1: Ruby registration requires a static matcher...` and `produced 0 definitions from 1 discovered definition source file(s)`); the JSON and JSONL census report definitionFiles 1, definitionFilesWithDefinitions 0, definitionsExtracted 0, featureFiles 1, featureFilesParsed 1, incomplete true; a fully static project is the complete control.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "empty_converted_gherkin_markdown_marks_the_corpus_incomplete",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_corpus_requirements_and_empty_features_are_visible"
},
"rationale": "Ruby steps with a step-less features/account.feature.md assert the stderr notice, no unused-definition, JSON/JSONL/HTML/SARIF featureFilesWithoutSteps 1 and incomplete true, SARIF executionSuccessful false, and exit 2 under --fail-on-incomplete — all four reporter-specific fields the parity oracle lacked.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "valid_empty_classic_feature_does_not_hide_unused_definitions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_corpus_requirements_and_empty_features_are_visible"
},
"rationale": "An empty placeholder.feature beside a non-empty active.feature over Ruby used/unused steps: no 0-steps notice, unused-definition 1, featureFiles 2, featureFilesWithoutSteps 0, incomplete false.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "partial_definition_extraction_is_visible_in_the_corpus_census",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unresolved_registrations_warn_and_expose_the_corpus_census"
},
"rationale": "resolved.rb beside unresolved.rb (dynamic matcher) warns exactly once at `unresolved.rb:2:1` and the JSON and JSONL census report definitionFiles 2, definitionFilesWithDefinitions 1, definitionsExtracted 1, incomplete true; strict mode exits 2.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unresolved_registration_warnings_are_not_hidden_for_unchanged_corpus_files",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs"
},
"rationale": "In changed mode with only changed.txt changed, the unchanged steps.rb dynamic-matcher registration still warns \"steps.rb:2:1: Ruby registration requires a static matcher and a statically resolved handler\" and the run succeeds.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "empty_definition_extraction_can_be_required_and_still_writes_reports",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_definition_requirements_and_source_diagnostics_are_visible"
},
"rationale": "A Ruby file with only HELPER = true under --require-definitions exits 2 with \"definition extraction produced 0 definitions from 1 discovered definition source file(s)\" and writes reports/cuke-dedup.json; the config-file form (requireDefinitions) exits 2 and writes configured-report/cuke-dedup.json.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "candidate_limits_warn_and_still_report_without_failing_the_run",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_candidate_limits_warn_and_still_report_without_failing_the_run"
},
"rationale": "Ten Ruby page.perform(i) definitions reproduce the original numbers exactly: exit 0 with the truncation warning at steps.rb:1:1, evaluated 2 / skipped 43 / 1 truncated class, HTML notice, SARIF unsuccessful, JSONL truncated, baseline update refused, and exit 2 under --fail-on-incomplete.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "explicit_check_honors_cli_rule_severity_for_exit_status",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exit_policy_follows_severity_threshold_and_suppressions"
},
"rationale": "\"check . --definitions *.rb --rule duplicate-matcher=warning\" over a Ruby duplicate pair succeeds and prints \"[warning]\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "zero_config_analyzes_playwright_bdd_without_loading_playwright",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`zero config analyzes playwright bdd without loading playwright`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "invalid_gherkin_is_an_operational_error",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_corpus_requirements_and_empty_features_are_visible"
},
"rationale": "A Ruby definition with a broken.feature lacking a Feature keyword exits 2 with \"failed to parse Gherkin feature\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "default_discovery_parses_gherkin_markdown",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_discovery_reads_markdown_by_default_and_custom_extensions_on_request"
},
"rationale": "Without `--features`, features/documentation.feature.md is listed as `[gherkin-markdown]`, the run reports 3 definitions and 1 feature step, and the two Ruby definitions the Markdown step does not use (`steps.rb:2`, `steps.rb:3`) are unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "custom_patterns_allow_nonstandard_gherkin_extensions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_discovery_reads_markdown_by_default_and_custom_extensions_on_request"
},
"rationale": "`.spec` files are not discovered by default; a recursive `--features` pattern for `*.spec` parses both a top-level and a nested `specs/nested/deep.spec` (2 steps), marking both custom definitions used and leaving the Markdown-only definition unused.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "framework_feature_paths_are_defaults_and_own_config_overrides_them",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/package.json resolution (path aliases, extends, workspaces, package maps) (`framework feature paths are defaults and own config overrides them`). Semantic residue: Cucumber-Ruby feature paths are pinned by `cucumber_yaml_paths_are_detected`.",
"behaviorClass": "language-specific-api"
},
{
"name": "local_barrel_reexports_are_recognized_as_registration_sources",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`local barrel reexports are recognized as registration sources`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_require_of_a_local_barrel_resolves_registrations",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`commonjs require of a local barrel resolves registrations`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "commonjs_require_of_a_local_non_registration_module_registers_nothing",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`commonjs require of a local non registration module registers nothing`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "project_config_extends_cycles_and_excessive_depth_never_resolve",
"requiredStatus": "engine-invariant",
"stage": "config-decoding",
"rationale": "Adapter-independent stage `config-decoding`: Configuration decoding and validation at the CLI boundary (project config extends cycles and excessive depth never resolve); no source adapter runs before the error.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "path_alias_targets_cannot_escape_the_analysis_root",
"requiredStatus": "partial",
"rationale": "Needs a decision and Ruby evidence: `rubyLoadPaths` is the Ruby counterpart of tsconfig `paths`, but a configured load path may resolve outside the analysis root by documented configuration, where JS/TS refuses alias targets outside the root. Unconfigured escapes (`require_relative '../outside/world'`, `require './../outside/world'`) and climbs out of a declared load-path root are refused (`ruby_source_loads_cannot_escape_the_analysis_root`).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "symlinked_path_alias_targets_cannot_escape_the_analysis_root",
"requiredStatus": "partial",
"rationale": "Needs a decision and Ruby evidence: a relative `rubyLoadPaths` entry through an in-root symlink to an outside directory is followed and its source analyzed, where the JS/TS symlinked alias target is refused; docs/configuration.md names only absolute and `..` load paths as able to leave the root.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "static_project_config_errors_survive_changed_mode_and_every_reporter",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: `tsconfig.json` `extends` resolution in the TypeScript frontend. A Ruby run never reads `tsconfig.json`. Semantic residue: none.",
"behaviorClass": "language-specific-api"
},
{
"name": "oversized_registration_modules_cannot_silently_remove_definitions",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence: an oversized loaded provider must not silently remove definitions. A Ruby provider over the 8 MiB input limit loaded by `require_relative` is named with its limit, but the run fails with exit 2 where an oversized JS/TS imported module only warns and exits 0. Map after the Ruby exit policy matches.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "ambiguous_steps_follow_the_selected_corpus_not_package_boundaries",
"requiredStatus": "covered",
"fixtureGroup": "multi-package-cross-package-detection",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `multi-package-cross-package-detection` requiredFindings[0]: Cross-package Ruby duplicates are detected within the selected corpus.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_overlap_is_reported_without_a_feature_corpus",
"requiredStatus": "covered",
"fixtureGroup": "equivalent-handlers-matcher-overlap-is-synthesised-without-features",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `equivalent-handlers-matcher-overlap-is-synthesised-without-features` requiredFindings[0]: Ruby matcher overlap is synthesised without features.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "matcher_overlap_limit_is_machine_visible_and_can_fail_closed",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_matcher_overlap_limit_is_visible_and_candidate_flags_must_be_positive"
},
"rationale": "Three Ruby `value {first|second|third}` registrations with configured `red|green` parameter types and `maxCandidateComparisons: 1` warn that matcher-overlap analysis is incomplete, report truncated=true with matcherOverlap evaluated 1/skipped 1, exit 0 by default and 2 under `--fail-on-incomplete`; `--max-candidate-comparisons=7` is the control (3 evaluated, 0 skipped, exit 0 when strict).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "declared_parameter_types_make_usage_analysis_exact",
"requiredStatus": "covered",
"fixtureGroup": "parameter-types-regex",
"oracleClause": "requiredFindings[1]",
"rationale": "Covered by `parameter-types-regex` requiredFindings[1]: Declared Ruby parameter types make usage exact.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "an_unresolved_registration_import_marks_the_whole_run_incomplete",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unresolved_load_marks_the_whole_run_incomplete"
},
"rationale": "A dynamic `require` on line 2 warns at `steps.rb:2:1`, keeps the definition, and marks the JSON report incomplete, the HTML report `Corpus is incomplete` and SARIF executionSuccessful false; --update-baseline exits 0 without writing the baseline; --fail-on-incomplete and the failOnIncomplete config key both exit 2 with the extraction refusal. The project without the load is the complete control for every assertion.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unreadable_registration_modules_remain_operational_failures",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unreadable_load_targets_remain_operational_failures"
},
"rationale": "A `require_relative` target with mode 000 makes the default run exit 2 with a `failed to read` error naming support/world.rb and no unresolved-dependency warning; the readable target exits 0 (unix only, like the original).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "registration_module_budget_is_shared_across_definition_files",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_load_budget_is_shared_across_selected_definition_files"
},
"rationale": "Two selected Ruby files with 520 distinct `require_relative` loads each are complete alone under `--fail-on-incomplete`; selected together, exactly 16 loads (steps-b.rb lines 505-520) are refused with the 1,024-file limit message, 17 diagnostic lines total, 1,026 definition files, corpus incomplete, and exit 2 under `--fail-on-incomplete`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "type_only_and_over_depth_barrels_do_not_create_runtime_registrations",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`type only and over depth barrels do not create runtime registrations`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "oversized_config_and_baseline_inputs_are_fatal",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_resource_limits_fail_closed_independently_of_reporters"
},
"rationale": "Each oversized package.json, .cuke-dedup.json, playwright.config.ts and baseline.json beside a Ruby corpus exits 2 naming the input kind and \"input limit\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "oversized_unchanged_sources_and_features_fail_changed_analysis_closed",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs"
},
"rationale": "An oversized unchanged steps.rb and feature in changed mode exit 2 naming both \"definition source\" and \"feature file\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "an_oversized_unchanged_feature_alone_fails_changed_analysis_closed",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs"
},
"rationale": "With a small valid steps.rb and only the unchanged feature oversized, changed mode exits 2 with \"feature file\" and \"input limit\" and no definition-source complaint.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "an_unreadable_unchanged_definition_cannot_make_changed_analysis_pass",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs"
},
"rationale": "An unchanged steps.rb containing byte 0xff makes changed mode exit 2 with \"not valid UTF-8\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_malformed_unchanged_definition_is_reported_in_changed_mode_and_gated_by_the_flag",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs"
},
"rationale": "An unchanged unterminated Ruby block succeeds in changed mode with \"Ruby source contains syntax errors\" and exits 2 with the same message under --fail-on-unparseable.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "an_unparseable_file_is_tolerated_and_reported_by_default_and_gated_by_flags",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unparseable_sources_are_tolerated_reported_and_gated_by_flags"
},
"rationale": "With duplicate-matcher=warning and threshold 100 in config, adding an unparseable broken.rb beside valid.rb succeeds with \"Ruby source contains syntax errors\", the JSON report has incomplete true and duplicate-matcher 1, and --fail-on-unparseable and --fail-on-incomplete each exit 2.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_corpus_of_only_parseable_files_reports_no_syntax_incompleteness",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_unparseable_sources_are_tolerated_reported_and_gated_by_flags"
},
"rationale": "Before broken.rb exists the parseable Ruby corpus succeeds without the \"Ruby source contains syntax errors\" warning and also succeeds under --fail-on-unparseable, the opposite-answer control for the tolerance case.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_mode_keeps_non_fatal_warnings_scoped_to_changed_definitions",
"requiredStatus": "engine-invariant",
"stage": "session-plumbing",
"rationale": "Adapter-independent stage `session-plumbing`: changed mode scopes non-completeness warnings to changed files. Every Ruby warning is a completeness warning, which changed mode keeps; `ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs` pins that Ruby path.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "oversized_source_exit_behavior_is_reporter_independent",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_resource_limits_fail_closed_independently_of_reporters"
},
"rationale": "An oversized steps.rb exits 2 with \"definition source\" and \"input limit\" under each of terminal, json, jsonl, html and sarif.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "explicitly_excluded_oversized_inputs_are_outside_the_analysis_corpus",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exclusions_and_discovery_flags_define_the_analysis_corpus"
},
"rationale": "An explicitly excluded oversized Ruby source leaves the run complete: exit 0 under `--fail-on-incomplete` with no diagnostic lines; without the exclusion the same file fails the run on the input limit.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "pathological_matcher_programs_fail_with_an_actionable_resource_error",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_regex_resource_limit_is_reported_and_keeps_the_definition"
},
"rationale": "`Given(/a{100000}/)` beside a broken feature exits 2 with the regex resource limit and `simplify the matcher` guidance plus the Gherkin parse failure, and the JSON report keeps 1 analyzed definition. The repeat is 100,000 instead of 1,000,000 because Ruby rejects repeats above 100,000 (`too big number for repeat range`).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "oversized_cucumber_expression_fails_closed_and_still_writes_a_report",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_resource_limits_fail_closed_independently_of_reporters"
},
"rationale": "A Ruby Given with a 1 MiB+1 literal matcher exits 0 with \"warning: step matcher at\" and \"regex resource limit\" and the JSON report still counts 1 definition.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "local_domain_functions_are_not_mistaken_for_registration_barrels",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`local domain functions are not mistaken for registration barrels`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "chained_local_barrel_reexports_preserve_aliases_and_namespaces",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`chained local barrel reexports preserve aliases and namespaces`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "explicit_config_flag_overrides_auto_discovery",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exit_policy_follows_severity_threshold_and_suppressions"
},
"rationale": "`--config team.json` over a Ruby corpus replaces the auto-discovered file: its threshold and features apply, and the auto file's ambiguous-step override, a key team.json leaves unset, does not; a control shows that override takes effect when the auto file is used.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "cypress_project_config_supplies_feature_discovery",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`cypress project config supplies feature discovery`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "missing_feature_corpus_is_safe_by_default_and_can_be_required",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_corpus_requirements_and_empty_features_are_visible"
},
"rationale": "A Ruby corpus without features succeeds with no unused-definition and \"unused-definition findings are disabled\", and exits 2 with \"no feature files matched\" under --require-features.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "partial_feature_parse_failure_is_summarized_when_features_are_required",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_feature_corpus_requirements_and_empty_features_are_visible"
},
"rationale": "A valid and a malformed feature over Ruby definitions under --require-features exit 2 with \"1 discovered feature file(s) could not be parsed\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unmatched_definition_patterns_and_suppressions_are_visible",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_definition_requirements_and_source_diagnostics_are_visible"
},
"rationale": "A config with definitions [\"missing/**/*.rb\"] and an unmatched suppression succeeds and warns \"definition pattern `missing/**/*.rb` matched no files\" and \"suppression 1 for duplicate-matcher matched no step definitions\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "semantic_baseline_can_be_updated_moved_and_gated_by_new_findings",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_semantic_baseline_is_updated_moved_and_gated_by_new_findings"
},
"rationale": "Updating writes a schema-3 baseline with total count 1; after moving to moved/renamed.rb the terminal run shows \"1 suppressed\" and \"Duplication: 0 of 2 definitions (0.00%), threshold 0.00% — PASS\"; a third copy fails --fail-on-new with exit 1.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "baseline_update_replaces_older_versions_but_refuses_unknown_future_schemas",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_baseline_update_migrates_counts_removals_and_rejects_invalid_inputs"
},
"rationale": "Schema 1 and 2 baselines are rewritten as schema 3 by --update-baseline over Ruby findings; schema 99 fails with \"newer than supported\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "baseline_workflow_rejects_unsafe_or_incomplete_flag_combinations",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_baseline_update_migrates_counts_removals_and_rejects_invalid_inputs"
},
"rationale": "--update-baseline alone, --fail-on-new alone, and --update-baseline with --changed-since each exit 2 over the Ruby corpus.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "reporter_flag_does_not_swallow_the_target_and_announces_file_output",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_machine_reports_follow_metrics_and_stream_contracts"
},
"rationale": "\"--reporters json . --definitions *.rb\" succeeds, prints \"Reports written to:\" and cuke-dedup.json, and the report exists in the default directory.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_compares_a_unicode_changed_source_against_the_full_corpus",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_decodes_paths_and_keeps_findings_that_reach_changed_files"
},
"rationale": "A staged \"steps/café changed.rb\" duplicating an unchanged Ruby definition exits 1 naming duplicate-matcher and the Unicode path, and passes with \"Duplication: 2 of 2 definitions (100.00%), threshold 100.00% — PASS\" at --threshold 100.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_rejects_option_like_revisions_instead_of_weakening_the_gate",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_rejects_unsafe_revisions_roots_and_environments"
},
"rationale": "--changed-since=--diff-filter=X over a Ruby repository exits 2 with \"invalid --changed-since revision\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_handles_a_unicode_untracked_file_from_a_repo_subdirectory",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_decodes_paths_and_keeps_findings_that_reach_changed_files"
},
"rationale": "Analyzing packages/e2e, the untracked \"steps/café step.rb\" duplicate is reported (path relative to the subdirectory) with exit 1.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_handles_an_untracked_file_with_a_newline",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_preserves_newlines_in_unix_names"
},
"rationale": "An untracked \"steps/new\\nline.rb\" duplicating an unchanged definition is reported as duplicate-matcher with exit 1 (unix-gated as the original).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_handles_an_untracked_non_utf8_file",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_preserves_non_utf8_linux_names"
},
"rationale": "An untracked steps/non-utf8-\\xff.rb duplicate is reported with exit 1 (Linux-gated as the original; compiled locally, runs only on Linux CI).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_rejects_a_gitignored_analysis_root",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_rejects_unsafe_revisions_roots_and_environments"
},
"rationale": "Analyzing a Git-ignored \"ignored\" directory holding a Ruby step exits 2 with \"ignored by Git\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_disables_unused_findings_but_fails_when_no_feature_parses",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs"
},
"rationale": "An untracked steps/new.rb with only an unparseable tracked feature under --rule unused-definition=error exits 2, reports no unused-definition, and names both feature-parse failures.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "closed_jsonl_consumer_is_a_clean_termination",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_closed_jsonl_consumer_is_a_clean_termination"
},
"rationale": "400 distinct Ruby duplicate pairs stream more than four pipe buffers of JSONL into `head -n 1` under pipefail, and the run exits successfully; the control measures the uninterrupted stream size.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "large_equivalence_class_emits_a_bounded_spanning_finding_set",
"requiredStatus": "covered",
"fixtureGroup": "exact-group-cluster-boundary-splits-at-five-members",
"oracleClause": "requiredFindings[0]",
"rationale": "Covered by `exact-group-cluster-boundary-splits-at-five-members` requiredFindings[0]: A large Ruby equivalence class emits a bounded set.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "package_json_configuration_and_suppression_apply_end_to_end",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exit_policy_follows_severity_threshold_and_suppressions"
},
"rationale": "package.json cukeDedup selects specs/**/*.rb, writes configured-reports/cuke-dedup.json, and the matcher suppression leaves 2 definitions analyzed, suppressed 1, and the configured reason on the finding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "discovery_flags_can_include_hidden_and_default_excluded_sources",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exclusions_and_discovery_flags_define_the_analysis_corpus"
},
"rationale": "Hidden and default-excluded Ruby sources each need their own discovery flag: no flag admits none, `--include-hidden` admits only `.steps/hidden.rb`, `--no-default-excludes` admits only `node_modules/workspace/nested.rb`, and both flags admit both, asserted by analyzed paths.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "json_report_uses_the_documented_default_output_directory",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_machine_reports_follow_metrics_and_stream_contracts"
},
"rationale": "A Ruby --reporters json run without --output writes reports/cuke-dedup/cuke-dedup.json.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "jsonl_report_streams_only_machine_records_to_stdout",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_machine_reports_follow_metrics_and_stream_contracts"
},
"rationale": "JSONL over the Ruby duplicate corpus exits 1 with only finding records then one summary (filesDiscovered 2, definitionFilesWithDefinitions 1, definitionsExtracted 2, featureFilesParsed 1) and no \"Reports written to:\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_since_fails_closed_on_unchanged_feature_parse_errors",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_keeps_completeness_failures_of_unchanged_inputs"
},
"rationale": "A clean Ruby repository with an unchanged unparseable feature exits 2 with \"found no tracked or untracked files\" and \"failed to parse Gherkin feature\".",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "bare_check_subcommand_requires_an_explicit_path",
"requiredStatus": "engine-invariant",
"stage": "cli-parsing",
"rationale": "Adapter-independent stage `cli-parsing`: Subcommand argument decoding.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "source_diagnostics_are_visible_without_discarding_valid_definitions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_definition_requirements_and_source_diagnostics_are_visible"
},
"rationale": "An unsupported Ruby regex (lookahead, line 2) is a per-definition diagnostic at `steps.rb:2:1` that keeps both valid definitions analyzed. The Ruby frontend has no error-level matcher diagnostic: the invalid `\\xZZ` escape that JS/TS reports as an error is a Ruby syntax error (`ruby -c`), so the run exits 0 by default and 2 under `--fail-on-unparseable`.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "malformed_definition_sources_are_reported_with_actionable_extension_guidance",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_default_discovery_is_visibly_empty_and_names_the_opt_in_pattern"
},
"rationale": "An un-opted steps.rb succeeds with the \".rb\" opt-in guidance, --require-definitions exits 2 keeping the guidance, and the corrected --definitions *.rb run analyzes 1 definition without it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "path_before_check_is_rejected_and_discovery_flags_are_applied",
"requiredStatus": "engine-invariant",
"stage": "cli-parsing",
"rationale": "Adapter-independent stage `cli-parsing`: Argument order and discovery-flag decoding; no adapter runs.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "changed_files_mode_ignores_an_inherited_git_environment",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_changed_since_rejects_unsafe_revisions_roots_and_environments"
},
"rationale": "A non-repository Ruby root with GIT_DIR/GIT_WORK_TREE/GIT_INDEX_FILE pointing at a decoy fails with \"changed-files mode requires a Git repository\" (same as the env-free control) and the decoy index still lists only sentinel.txt.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "ambiguous_step_severity_and_suppression_are_distinguishable_from_absence",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exit_policy_follows_severity_threshold_and_suppressions"
},
"rationale": "Ruby {word} and literal gauge steps: ambiguous-step=warning succeeds with \"[warning]\", the default severity control exits 1, and the configured suppression keeps exactly one ambiguous-step finding with its reason and summary findings 0.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "generated_bundles_are_excluded_and_reported_without_failing_the_run",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle, minified and binary source filtering (`generated bundles are excluded and reported without failing the run`). Semantic residue: Ruby exclusions are pinned by `ruby_dependency_cycles_load_order_and_exclusions_preserve_outcomes`.",
"behaviorClass": "language-specific-api"
},
{
"name": "an_oversized_bundle_is_excluded_rather_than_failing_the_input_limit",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle detection by the source filter (`an oversized bundle is excluded rather than failing the input limit`). Semantic residue: Ruby exclusions are pinned by `ruby_dependency_cycles_load_order_and_exclusions_preserve_outcomes`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_bundle_that_registers_steps_is_analyzed_rather_than_excluded",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JavaScript bundle guard vocabulary (`a bundle that registers steps is analyzed rather than excluded`). Semantic residue: Ruby exclusions are pinned by `ruby_dependency_cycles_load_order_and_exclusions_preserve_outcomes`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_minified_exclusion_makes_the_corpus_incomplete_so_strict_gates_fail_closed",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: minified JavaScript bundle detection. Semantic residue: the strict-mode exit on an incomplete Ruby corpus is pinned by `malformed_ruby_literal_inputs_report_incompleteness_without_losing_controls`.",
"behaviorClass": "language-specific-api"
},
{
"name": "a_run_with_nothing_excluded_stays_complete",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_exclusions_and_discovery_flags_define_the_analysis_corpus"
},
"rationale": "A clean Ruby corpus exits 0 under `--fail-on-incomplete` with `corpus.incomplete` false and no diagnostic lines; the same corpus plus one dynamic matcher exits 2 under the flag with exactly two diagnostic lines, one at `steps.rb:3:1`, and 0 without it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_binary_exclusion_also_makes_the_corpus_incomplete",
"requiredStatus": "partial",
"rationale": "Needs Ruby evidence: a NUL-bearing source is not proof of no definitions, so the corpus must not be reported complete. The Ruby adapter excludes nothing by content and parses such files, but a NUL inside a comment (valid Ruby) is reported as a syntax error at 1:1, and code after a top-level NUL (which ends a Ruby script) is still extracted. Map after Ruby NUL handling matches Ruby.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "a_long_exclusion_list_is_summarized_rather_than_printed_in_full",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: summarized warning for content-excluded JavaScript bundles (`report_excluded_sources`). The warning lists only sources an adapter excluded by content; the Ruby adapter excludes none, and a selection mixing Ruby with JS bundles is rejected. Semantic residue: none.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_framework_review_fallback_registrations_preserve_outcomes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`regression framework review fallback registrations preserve outcomes`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_framework_review_configured_import_does_not_trust_custom_assertions",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`regression framework review configured import does not trust custom assertions`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_framework_review_wrapped_callees_keep_registration_identity",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS framework configuration and registration conventions (Playwright-BDD, Cypress, Jest, Vitest) (`regression framework review wrapped callees keep registration identity`). Semantic residue: Cucumber-Ruby configuration is pinned by `cucumber_yaml_paths_are_detected` and `ruby_cucumber_normalization_preserves_matcher_and_handler_boundaries`.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_pr56_cjs_barrel_require_resolves_registrations_end_to_end",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`regression pr56 cjs barrel require resolves registrations end to end`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_pr55_unmodeled_cjs_export_fails_closed_end_to_end",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: unmodeled CommonJS export shapes (`regression pr55 unmodeled cjs export fails closed end to end`). Semantic residue: unresolved Ruby loads fail closed, pinned by the `load-unresolved` group.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_corpus_tsconfig_package_extends_keeps_path_aliases",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/package.json resolution (path aliases, extends, workspaces, package maps) (`regression corpus tsconfig package extends keeps path aliases`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_pr62_workspace_tsconfig_field_names_a_suffixless_base",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/package.json resolution (path aliases, extends, workspaces, package maps) (`regression pr62 workspace tsconfig field names a suffixless base`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_pr62_workspace_package_base_stays_inside_its_package",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: tsconfig/package.json resolution (path aliases, extends, workspaces, package maps) (`regression pr62 workspace package base stays inside its package`). Semantic residue: none; Ruby has no workspace package base.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_corpus_default_import_does_not_become_an_ambient_registration",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`regression corpus default import does not become an ambient registration`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_corpus_inert_commonjs_export_is_not_an_incomplete_barrel",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`regression corpus inert commonjs export is not an incomplete barrel`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "regression_pr63_registration_passed_to_a_helper_is_reported",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: a JS registration function passed as a value to a helper (`regression pr63 registration passed to a helper is reported`). Semantic residue: Ruby `&method(:Given)` captures and escapes are covered by equivalent-provider-registration-origins.",
"behaviorClass": "language-specific-api"
},
{
"name": "registration_loader_provenance_respects_runtime_scopes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS/TS registration and handler binding forms (loaders, aliases, shadowing, generators, stubs) (`registration loader provenance respects runtime scopes`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "registration_aliases_follow_the_nearest_runtime_binding",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: JS runtime registration alias binding (`registration aliases follow the nearest runtime binding`). Semantic residue: Ruby registration aliases are covered by equivalent-provider-registration-origins.",
"behaviorClass": "language-specific-api"
},
{
"name": "configured_registration_name_keeps_its_explicit_global_policy",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: the `registrations` key names JS/TS local registration functions; the Ruby adapter does not read it. Semantic residue: Ruby forwarding helpers are inferred, pinned by `ruby_transparent_wrapper_outcomes_preserve_forwarding_and_reject_uncertainty`.",
"behaviorClass": "language-specific-api"
},
{
"name": "registration_barrels_cannot_reexport_a_shadowed_loader",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`registration barrels cannot reexport a shadowed loader`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "shadowed_loader_barrel_completeness_follows_exported_local_values",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`shadowed loader barrel completeness follows exported local values`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "registration_loader_import_forms_preserve_conflicting_assertions",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM module forms (barrels, re-exports, `require`, import specifiers) (`registration loader import forms preserve conflicting assertions`). Semantic residue: Ruby load resolution and provider re-exports are covered by the load-* and equivalent-provider-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "dynamic_matcher_cannot_pass_strict_mode_or_create_a_baseline",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_dynamic_matcher_cannot_pass_strict_mode_or_create_a_baseline"
},
"rationale": "Ruby Given(build_pattern) beside a known step: default exit 0 with the steps.rb:2:1 diagnostic, 1 definition and incomplete true; --fail-on-incomplete exits 2; --update-baseline refuses and writes no file; failOnIncomplete config exits 2.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "unsupported_matchers_mark_partial_extraction_incomplete",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_syntax_boundaries_report_invalid_tokens_without_hiding_valid_outcomes"
},
"behaviorClass": "shared-engine-invariant",
"rationale": "Ruby out-of-range Unicode scalar escapes emit a located syntax diagnostic, preserve valid neighbouring findings, keep the corpus incomplete and exit 2 under both strict modes; valid Unicode escapes and literal escape text remain accepted (`ruby_syntax_boundaries_report_invalid_tokens_without_hiding_valid_outcomes`). Unsupported matchers and uncertain wrapper forms retain their exact incomplete diagnostics beside analysed neighbours (`ruby_unsupported_matchers_mark_partial_extraction_incomplete`)."
},
{
"name": "inert_local_members_do_not_make_registration_discovery_incomplete",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: object-literal member, computed-key, spread and getter receiver shapes. Semantic residue: a send on a local non-provider receiver is inert, pinned by `provider-context-receiver-local-send`.",
"behaviorClass": "language-specific-api"
},
{
"name": "inert_receiver_only_project_passes_strict_mode",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_inert_receiver_only_project_passes_strict_mode"
},
"rationale": "A project whose only registration-shaped calls are `router.send(:Given, ...)` or `router.Given(...)` on a LocalRouter instance (class loaded from providers/helpers.rb) passes --fail-on-incomplete with 0 definitions, a complete corpus and the empty-extraction notice as its only diagnostic; `send(:Given, ...)` on main is the control that exits 2 with an incomplete corpus.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "regression_ruby_release_broad_glob_keeps_typescript_selection",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_release_broad_glob_keeps_typescript_selection"
},
"rationale": "End-to-end release regression `regression_ruby_release_broad_glob_keeps_typescript_selection` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_release_dialect_step_keywords_register_definitions",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_release_dialect_step_keywords_register_definitions"
},
"rationale": "End-to-end release regression `regression_ruby_release_dialect_step_keywords_register_definitions` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_release_registrar_implementation_changes_revoke_trust",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_release_registrar_implementation_changes_revoke_trust"
},
"rationale": "End-to-end release regression `regression_ruby_release_registrar_implementation_changes_revoke_trust` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_release_ownership_diagnostic_points_at_its_cause",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_release_ownership_diagnostic_points_at_its_cause"
},
"rationale": "End-to-end release regression `regression_ruby_release_ownership_diagnostic_points_at_its_cause` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_release_inline_suppression_matches_typescript",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_release_inline_suppression_matches_typescript"
},
"rationale": "End-to-end release regression `regression_ruby_release_inline_suppression_matches_typescript` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_handler_values_block_local_write_keeps_capture_complete",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_handler_values_block_local_write_keeps_capture_complete"
},
"rationale": "End-to-end release regression `regression_ruby_handler_values_block_local_write_keeps_capture_complete` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_handler_values_top_level_constants_reach_the_fingerprint",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_handler_values_top_level_constants_reach_the_fingerprint"
},
"rationale": "End-to-end release regression `regression_ruby_handler_values_top_level_constants_reach_the_fingerprint` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_handler_values_declared_lambda_runs_only_where_invoked",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_handler_values_declared_lambda_runs_only_where_invoked"
},
"rationale": "End-to-end release regression `regression_ruby_handler_values_declared_lambda_runs_only_where_invoked` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_handler_values_resolved_alias_captures_compare_across_files",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_handler_values_resolved_alias_captures_compare_across_files"
},
"rationale": "End-to-end release regression `regression_ruby_handler_values_resolved_alias_captures_compare_across_files` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_action_evidence_direct_and_fluent_actions_are_near",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_action_evidence_direct_and_fluent_actions_are_near"
},
"rationale": "End-to-end release regression `regression_ruby_action_evidence_direct_and_fluent_actions_are_near` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_action_evidence_callbacks_and_bare_load_calls",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_action_evidence_callbacks_and_bare_load_calls"
},
"rationale": "End-to-end release regression `regression_ruby_action_evidence_callbacks_and_bare_load_calls` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_action_evidence_identical_streams_are_not_near",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_action_evidence_identical_streams_are_not_near"
},
"rationale": "End-to-end release regression `regression_ruby_action_evidence_identical_streams_are_not_near` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_action_evidence_untrusted_expectations_keep_exact_policy",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_action_evidence_untrusted_expectations_keep_exact_policy"
},
"rationale": "End-to-end release regression `regression_ruby_action_evidence_untrusted_expectations_keep_exact_policy` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_assertion_near_conflicting_values_are_one_differing_event",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_assertion_near_conflicting_values_are_one_differing_event"
},
"rationale": "End-to-end release regression `regression_ruby_assertion_near_conflicting_values_are_one_differing_event` runs Ruby sources through the built binary with paired TypeScript controls where the contract is shared.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_dependency_limits_do_not_charge_selected_entry_points",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_dependency_limits_do_not_charge_selected_entry_points"
},
"rationale": "`regression_ruby_dependency_limits_do_not_charge_selected_entry_points` runs Ruby sources through the built binary and pins the Ruby dependency and provider-proof limit outcomes end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_dependency_module_limit_marks_loads_incomplete",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_dependency_module_limit_marks_loads_incomplete"
},
"rationale": "`regression_ruby_dependency_module_limit_marks_loads_incomplete` runs Ruby sources through the built binary and pins the Ruby dependency and provider-proof limit outcomes end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_provider_proof_limit_names_its_cause",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_provider_proof_limit_names_its_cause"
},
"rationale": "`regression_ruby_provider_proof_limit_names_its_cause` runs Ruby sources through the built binary and pins the Ruby dependency and provider-proof limit outcomes end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_provider_proofs_missing_for_other_reasons_do_not_blame_the_limit",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_provider_proofs_missing_for_other_reasons_do_not_blame_the_limit"
},
"rationale": "`regression_ruby_provider_proofs_missing_for_other_reasons_do_not_blame_the_limit` runs Ruby sources through the built binary and pins the Ruby dependency and provider-proof limit outcomes end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_baseline_tolerates_definitions_withdrawn_by_finalization",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_baseline_tolerates_definitions_withdrawn_by_finalization"
},
"rationale": "`regression_ruby_baseline_tolerates_definitions_withdrawn_by_finalization` runs Ruby sources through the built binary in baseline mode and pins the tolerated, rejected and unmatched-empty baseline outcomes end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_dotted_require_paths_load_the_ruby_file",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_dotted_require_paths_load_the_ruby_file"
},
"rationale": "`regression_ruby_dotted_require_paths_load_the_ruby_file` runs Ruby sources through the built binary and pins dotted and native-suffix require resolution end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_loaded_files_are_not_reported_as_skipped",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_loaded_files_are_not_reported_as_skipped"
},
"rationale": "`regression_ruby_loaded_files_are_not_reported_as_skipped` runs Ruby sources through the built binary and pins the skipped-files warning against dependency-loaded files end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_contained_dispatch_needs_a_closed_load_phase",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_contained_dispatch_needs_a_closed_load_phase"
},
"rationale": "`regression_ruby_contained_dispatch_needs_a_closed_load_phase` runs Ruby sources through the built binary and pins the closed-load-phase containment of dynamic dispatch, kept and invalidated, end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_scenario_hook_blocks_are_deferred_like_step_handlers",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_scenario_hook_blocks_are_deferred_like_step_handlers"
},
"rationale": "`regression_ruby_scenario_hook_blocks_are_deferred_like_step_handlers` runs Ruby sources through the built binary and pins scenario-hook block deferral and the hooks that stay conservative end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_119_ruby_loaded_file_paths_stay_relative_to_the_root",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_119_ruby_loaded_file_paths_stay_relative_to_the_root"
},
"rationale": "`regression_119_ruby_loaded_file_paths_stay_relative_to_the_root` runs Ruby sources reached only through `require_relative` and a `rubyLoadPaths` `require` through the built binary and pins root-relative finding and discovery paths end to end.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_ruby_pending_stub_handlers_are_not_duplicates",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_ruby_pending_stub_handlers_are_not_duplicates"
},
"rationale": "`regression_ruby_pending_stub_handlers_are_not_duplicates` runs Ruby pending-stub handlers across blocks, do-blocks, lambdas and `&method` handlers through the built binary: stubs report no handler findings, real work and an unlabelled `raise NotImplementedError` stay duplicates.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_exact_global_limit_does_not_truncate_matcher_overlap",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_exact_global_limit_does_not_truncate_matcher_overlap"
},
"rationale": "`regression_exact_global_limit_does_not_truncate_matcher_overlap` pins exact global-limit inclusivity of the matcher-overlap pass end to end for Ruby and TypeScript, with a one-short truncating control.",
"behaviorClass": "ruby-behavior"
},
{
"name": "regression_122_ruby_receiver_registrations_fail_closed",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/cli.rs",
"name": "regression_122_ruby_receiver_registrations_fail_closed"
},
"rationale": "`regression_122_ruby_receiver_registrations_fail_closed` runs Ruby step keywords called through receivers through the built binary: every shape Cucumber-Ruby can register (a String or Regexp pattern in any literal form, at most three arguments, and a splat or `...`, a second argument that may be a Symbol or Proc, or a block or block argument when that argument is absent, nil or false), on any receiver including a local source-class instance or namespace alias, fails closed at its located call, while shapes Ruby rejects (Watir and Builder `a(...)` calls, each non-pattern literal or a lambda as pattern, no pattern, literal, parenthesized or keyword second arguments, more than three arguments for every number of values each splat or `...` may supply, a literal second argument fixed before or after splats, `-1` as a signed literal (while `- 1` is a call), `&nil`, `self.Given` without a block) stay complete.",
"behaviorClass": "ruby-behavior"
}
]
},
"tests/framework_callbacks.rs": {
"sourceSha256": "db33a88c3a81f1efd58d6bfc009763e9edc93b9df82c39bad707a4c5b59b7c95",
"tests": [
{
"name": "positional_regex_steps_do_not_enter_global_usage_but_plugin_steps_do",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`positional regex steps do not enter global usage but plugin steps do`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "local_framework_barrels_resolve_without_granting_assertion_facade_trust",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`local framework barrels resolve without granting assertion facade trust`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "unsupported_jest_setup_keeps_cli_reports_incomplete",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`unsupported jest setup keeps cli reports incomplete`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "forwarding_wrappers_use_lexical_targets_and_immediate_execution",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby_assertion_provenance.rs",
"name": "assertion_overlap_preserves_values_effects_and_callable_execution"
},
"rationale": "Immediate versus deferred execution of wrappers and callbacks is pinned for Ruby by the provenance matrix (register/other_wrapper callbacks, immediate `.call`).",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "ambient_jest_fallback_preserves_literal_kind_and_positional_rules",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`ambient jest fallback preserves literal kind and positional rules`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "fallback_scope_and_writes_never_gain_registration_trust",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`fallback scope and writes never gain registration trust`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_import_and_binding_forms_preserve_handler_findings_but_skip_matcher_rules",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest import and binding forms preserve handler findings but skip matcher rules`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "matcher_rules_stay_inapplicable_for_identical_matchers_in_one_scenario",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`matcher rules stay inapplicable for identical matchers in one scenario`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_equal_text_keeps_handler_candidates_without_redundant_near_findings",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest equal text keeps handler candidates without redundant near findings`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_literal_text_is_preserved_in_reports_and_handler_comparisons",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest literal text is preserved in reports and handler comparisons`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_assertion_conflicts_depend_on_trusted_provenance",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest assertion conflicts depend on trusted provenance`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "ordinary_vitest_registrations_keep_matcher_rules_and_duplicate_handler_control",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`ordinary vitest registrations keep matcher rules and duplicate handler control`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_and_vitest_handlers_are_not_compared_across_callback_conventions",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest and vitest handlers are not compared across callback conventions`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_callback_shapes_extract_only_when_synchronous_and_statically_resolved",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest callback shapes extract only when synchronous and statically resolved`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_resolution_fails_closed_for_type_only_unknown_and_shadowed_bindings",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest resolution fails closed for type only unknown and shadowed bindings`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "vitest_plugin_esm_bindings_have_positive_and_fail_closed_controls",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`vitest plugin esm bindings have positive and fail closed controls`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_requires_and_scenario_callback_aliases_respect_shadowing_and_escape",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest requires and scenario callback aliases respect shadowing and escape`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "jest_uncertain_setup_argument_positions_and_mixed_scope_never_register",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`jest uncertain setup argument positions and mixed scope never register`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "unmodeled_aliases_keep_framework_evidence_without_registering_steps",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`unmodeled aliases keep framework evidence without registering steps`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "known_helpers_preserve_complete_handler_outcomes",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`known helpers preserve complete handler outcomes`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "helper_exemptions_do_not_hide_uncertain_or_escaped_registrations",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`helper exemptions do not hide uncertain or escaped registrations`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "helper_barrels_require_export_provenance_and_keep_strict_cli_complete",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`helper barrels require export provenance and keep strict cli complete`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "callback_discovery_preserves_outcomes_through_adjacent_syntax",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`callback discovery preserves outcomes through adjacent syntax`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "deep_alias_writes_and_escapes_invalidate_roots_without_losing_uncertainty",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`deep alias writes and escapes invalidate roots without losing uncertainty`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "deep_alias_cli_rejects_incomplete_setup_and_mutated_root_findings",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Jest/Vitest callback-convention registrations (`deep alias cli rejects incomplete setup and mutated root findings`). Semantic residue: Cucumber Ruby has one global registration convention; its provenance is covered by the registration and equivalent-provider groups.",
"behaviorClass": "language-specific-api"
}
]
},
"tests/public_api.rs": {
"sourceSha256": "5af75402e1603979466b8f3cf1f7533db1e87f05f42e7441863b0738c78eb1aa",
"tests": [
{
"name": "extraction_session_preserves_public_constructors_auto_traits_and_adapter_defaults",
"requiredStatus": "engine-invariant",
"stage": "api-shape",
"rationale": "Adapter-independent stage `api-shape`: Compile-time auto traits and constructors of the public session type.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "external_callers_can_preserve_partial_results_and_operational_diagnostics",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/public_api.rs",
"name": "ruby_extraction_flows_through_the_public_diagnostic_analysis_and_report_api"
},
"rationale": "The Ruby public-API test keeps the partial result and the regex resource-limit diagnostic for an over-limit Ruby regex, and strict `analyze` rejects it.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "sessionless_file_extraction_uses_the_nearest_package_boundary",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: package.json boundary lookup. Semantic residue: Ruby configured registrations and provider loads are covered by the registration and load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "extensible_public_outputs_use_stable_constructors",
"requiredStatus": "engine-invariant",
"stage": "api-shape",
"rationale": "Adapter-independent stage `api-shape`: Public output constructors keep their shape; compile-time contract.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "report_context_is_the_single_public_rendering_entry_point",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/public_api.rs",
"name": "ruby_extraction_flows_through_the_public_diagnostic_analysis_and_report_api"
},
"rationale": "The Ruby public-API test renders a Ruby analysis result through one public report context in every format.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "configured_registrations_enable_lowercase_global_step_names",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: configured lowercase JS registration globals. Semantic residue: Ruby configured registrations and provider loads are covered by the registration and load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "local_commonjs_and_esm_barrel_imports_resolve_registrations_in_process",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: CommonJS/ESM barrel imports. Semantic residue: Ruby configured registrations and provider loads are covered by the registration and load-* groups.",
"behaviorClass": "language-specific-api"
},
{
"name": "local_barrel_re_exporting_the_bdd_factory_resolves_through_require",
"requiredStatus": "language-inapplicable",
"rationale": "JS/TS-only: Playwright-BDD `createBdd` factory re-exported through a CommonJS barrel. Semantic residue: Ruby provider re-exports are covered by equivalent-provider-barrel-reexport.",
"behaviorClass": "language-specific-api"
},
{
"name": "adapters_can_classify_diagnostics_without_language_specific_messages",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/public_api.rs",
"name": "ruby_extraction_flows_through_the_public_diagnostic_analysis_and_report_api"
},
"rationale": "The Ruby public-API test classifies a diagnostic the Ruby adapter produced through the public kind and level API, with its line and column.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "ruby_usage_metadata_and_legacy_analysis_remain_conservative",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/public_api.rs",
"name": "ruby_usage_metadata_and_legacy_analysis_remain_conservative"
},
"rationale": "Compares legacy analysis without usage metadata against analysis fed Ruby adapter metadata in-process; no CLI fixture can express the comparison, the test itself is the evidence.",
"behaviorClass": "ruby-behavior"
},
{
"name": "ruby_extraction_flows_through_the_public_diagnostic_analysis_and_report_api",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/public_api.rs",
"name": "ruby_extraction_flows_through_the_public_diagnostic_analysis_and_report_api"
},
"rationale": "Ruby public-API evidence: typed Ruby diagnostic, partial result with operational diagnostics, and rendering through the report context.",
"behaviorClass": "ruby-behavior"
}
]
},
"tests/gherkin_tables.rs": {
"sourceSha256": "eb5b5e2a465bf9da63c1987c040e09bb532cfc7cb0d8b6e72185908051a4bb76",
"tests": [
{
"name": "escaped_tables_preserve_findings_and_reject_malformed_neighbors_in_both_languages",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/ruby.rs",
"name": "ruby_malformed_feature_tables_fail_closed_beside_escaped_table_findings"
},
"rationale": "Under `--fail-on-incomplete`, the escaped `C:\\tmp\\q` outline keeps 1 feature step and the ambiguity at valid.feature:3 with its escaped text; exit is 1 alone and 2 with a ragged neighbour row, rejected at its line, or an unterminated neighbour row, which rejects its file (`broken.feature: Error at`; the parser reports a position after the row, so it is not pinned), each with exactly 3 `cuke-dedup:` stderr lines. The definition-side duplicate-matcher (steps.rb:1, 2) shows only that the run continues.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"src/model/behavior.rs": {
"sourceSha256": "2fafe30bbdb0f7992579916abe9374176a40c8ad266f5d7487a1fe95ed53bf6c",
"tests": [
{
"name": "legacy_signatures_round_trip_known_and_unknown_events",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Behavior-event codec round trip and classification over constructed events; no adapter data enters the function.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "typed_classification_keeps_method_execution_and_assertion_anchors_distinct",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Behavior-event codec round trip and classification over constructed events; no adapter data enters the function.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "deferring_and_unresolved_markers_preserve_assertion_payloads",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Behavior-event codec round trip and classification over constructed events; no adapter data enters the function.",
"behaviorClass": "shared-engine-invariant"
},
{
"name": "handler_fingerprint_keeps_the_public_string_array_shape",
"requiredStatus": "engine-invariant",
"stage": "model-codec",
"rationale": "Adapter-independent stage `model-codec`: Behavior-event codec round trip and classification over constructed events; no adapter data enters the function.",
"behaviorClass": "shared-engine-invariant"
}
]
},
"tests/frontend_conformance.rs": {
"sourceSha256": "91bbf41f9783a5fa518d98177ba856d9f0efb38d23e03eae04f13218fdbb12ee",
"tests": [
{
"name": "ruby_selection_dependencies_and_mixed_domain_keep_cli_outcomes",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/frontend_conformance.rs",
"name": "ruby_selection_dependencies_and_mixed_domain_keep_cli_outcomes"
},
"rationale": "Cross-language CLI control over a mixed JS/Ruby project: automatic JS selection, explicit Ruby dependencies, unresolved loads and mixed-domain rejection through the built binary.",
"behaviorClass": "ruby-behavior"
},
{
"name": "source_exclusion_stays_with_javascript_adapter",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/frontend_conformance.rs",
"name": "source_exclusion_stays_with_javascript_adapter"
},
"rationale": "Contrasts the JavaScript source-filter exclusion with the Ruby adapter's parser policy on the same NUL-bearing input through the registered adapters.",
"behaviorClass": "ruby-behavior"
},
{
"name": "ruby_configuration_keeps_flat_compatibility_key",
"requiredStatus": "rust-evidence",
"evidenceTest": {
"file": "tests/frontend_conformance.rs",
"name": "ruby_configuration_keeps_flat_compatibility_key"
},
"rationale": "Asserts the flat `rubyLoadPaths` compatibility key through the public configuration API; Ruby-specific, in-process, run under completion.",
"behaviorClass": "ruby-behavior"
}
]
}
}
}