{
  "shard_id": "FV-PROPFLOOR-SHARD-B10-1",
  "spec_anchor": "FV-PBT-FLOOR-BUILD-SPEC.md §2/§3/§4",
  "population_definition": "all kernels in shard FV-PROPFLOOR-SHARD-B10-1, enumerated below by kernel id and spec digest",
  "human_sign_off": {
    "status": "PENDING",
    "name": null,
    "date": null
  },
  "independence_sentence": "Each item listed was reviewed and attested independently; the single signature is a mechanical convenience over the enumerated digests, not a bulk review.",
  "per_item_basis_of_review": "Every row ran the same two mechanical checks unconditionally: (1) the fixture-oracle gate — compute() output diffed against the kernel's own existing golden fixtures before any property was trusted, and (2) run-proptests.mjs green (process exit 0, 199/199 across the full tree including this shard's 10). ULP-boundary forcing was mandatory and present for the 8 float-sensitive rows named in the WU (art-270, art-271, art-272, art-273, art-281, art-282, art-283, and the narrowed-but-real case art-276 — see its item note below), checked per-item. The other 2 rows (art-277, art-287) are the row's stated float:no exceptions and instead carry forced CATEGORICAL boundary cases (hash-length/regex boundaries, base64url decode failures, out-of-range bit indices, absent/malformed structural fields). One additional finding surfaced during authoring and is recorded per-item rather than silently fixed: art-270's compound_annualized_rate_pct can leak Infinity through round4's *1e4 scaling for a narrow band of astronomically large-but-finite compound values (~hourly rate 8.28-8.4%) that pow()'s own isFinite guard does not catch because the overflow happens one multiplication AFTER that guard runs — a genuine kernel edge-case quirk, out of this row's fence (no kernel edits permitted), so the property generator was bounded to realistic funding-rate ranges instead of asserting false finiteness. No row beyond these mechanical checks received a separate in-depth human review in this pass — that is exactly the gap human_sign_off.status=PENDING names.",
  "items": [
    {
      "kernel_id": "art-270-perp-funding-carry",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "kernel_digest": "sha256:aee8d23400f51967716d7a7033f200fa5947d81889f3f656b06fced816014de1",
      "proptest_file_digest": "sha256:d99ecf54a97a5e18b26df48aa4aecd7eaa697ad614567a030c2128e88a472e38",
      "proptest_file": "chaingraph/kernels/__proptests__/art-270-perp-funding-carry.proptest.mjs",
      "properties_tested": ["basis_usd_and_pct_nondecreasing_on_basis_perp_increase", "all_numeric_output_fields_finite", "above_hl_funding_cap_flag_matches_fixed_threshold_rule", "ULP_boundary_forcing"],
      "fixture_oracle_result": "PASS (4/4 vectors)",
      "run_proptests_result": "PASS",
      "note": "P1-P3 property generation bounded to realistic funding-rate/cadence ranges (cadence>=1h, |rate|<=6%) to stay clear of a distinct kernel rounding-overflow quirk documented in per_item_basis_of_review above; P4's forced boundary array still probes the true ULP cases (cap threshold, exact-zero basis, non-exact-double artifacts, negative zero, r<=-1 compound branch) independently of that quirk."
    },
    {
      "kernel_id": "art-271-defi-lending-health",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "kernel_digest": "sha256:49f4ca16e07b64152890ad0db1fe9b6bd52fd1c42e01b5113844e0dac0f424a1",
      "proptest_file_digest": "sha256:ba30231ae044a0bbb66998273b97d5c680b36bc8089fee736dfab4e53592d7ce",
      "proptest_file": "chaingraph/kernels/__proptests__/art-271-defi-lending-health.proptest.mjs",
      "properties_tested": ["health_factor_nonincreasing_as_debt_grows", "health_factor_and_borrow_capacity_bounded_status_known_set", "health_status_matches_fixed_health_factor_bands", "ULP_boundary_forcing"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-272-restaking-risk",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "kernel_digest": "sha256:fa0c0c6dff1a33577f8de9a44bbd6c3d35d4a2d544a0d9f83ed9c1635870b792",
      "proptest_file_digest": "sha256:9efc92d5fa8031b03d10a908fa2d6620163e19c240ddae3181be62841d27a29a",
      "proptest_file": "chaingraph/kernels/__proptests__/art-272-restaking-risk.proptest.mjs",
      "properties_tested": ["delegator_net_slash_nonincreasing_as_buffer_grows", "slash_waterfall_bounded_by_max_slash_all_fields_finite_nonneg", "net_apy_equals_gross_minus_operator_cut_identity", "ULP_boundary_forcing"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-273-pendle-yield",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "kernel_digest": "sha256:11142b24e8baee3beb0ab8ef15ab1c5ddc7fbe07ad7b5b63b7d81d66ff289439",
      "proptest_file_digest": "sha256:088a252dab7699f4b09f3e37b89438bc55226a91d9280e79c86fa99b104143b7",
      "proptest_file": "chaingraph/kernels/__proptests__/art-273-pendle-yield.proptest.mjs",
      "properties_tested": ["pt_yt_sum_invariant_holds_when_constructed_at_face_value", "pt_discount_and_return_increase_as_pt_price_falls", "all_numeric_output_fields_finite_over_declared_domain", "ULP_boundary_forcing"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-276-mutual-nda-composer",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "ulp_forcing_note": "RECLASSIFIED per spot-check (spec §3 FIX-2 carry): a document composer, not scalar arithmetic. Its only numeric fields (mnda_term_years, confidentiality_term_years) never enter arithmetic, only a `>0` gate then string interpolation — no rounding/division for a classic ULP artifact to hide in. float_sensitive is real but NARROW; P4 forces the >0 boundary (0, negative, NaN, denormal-small-positive, negative zero, Infinity) rather than the fuller arithmetic-kernel ULP battery. See the file's own header comment for the full reasoning.",
      "kernel_digest": "sha256:91212db29e804d760fdea1ab5633eeaae9a06c743518d3b746a30c50f026116d",
      "proptest_file_digest": "sha256:e2bec2f1d77e382f1f41469c2f93eecc835ab1f675f102cd46b78b6c7c4f11ee",
      "proptest_file": "chaingraph/kernels/__proptests__/art-276-mutual-nda-composer.proptest.mjs",
      "properties_tested": ["assembled_markdown_present_iff_all_checks_pass", "vendored_body_hash_and_template_id_invariant", "checks_array_always_5_named_boolean_checks", "narrowed_boundary_forcing_at_year_gt_zero_gate"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-277-agreement-acceptance-binder",
      "class": "B",
      "float_sensitive": false,
      "ulp_forcing_present": false,
      "ulp_forcing_note": "stated float:no exception per the WU row — every field is a string/hex/enum check, no arithmetic on doubles anywhere in compute(); forced CATEGORICAL boundary cases (64/63/65-char hash length, uppercase-hex normalization, empty/whitespace template_id, unrecognized role, optional-field-empty-is-valid, non-hex character at valid length) used instead of ULP forcing",
      "kernel_digest": "sha256:f89876aa4e8bd2c8202f42f53375dcaadcf311417577d08361dc752421a2a965",
      "proptest_file_digest": "sha256:4e014a0eb7ab140fe9a497f3d75369013874546ae77351de4fb601cf1b1e6d8e",
      "proptest_file": "chaingraph/kernels/__proptests__/art-277-agreement-acceptance-binder.proptest.mjs",
      "properties_tested": ["output_fields_present_iff_all_five_checks_pass", "checks_array_exactly_5_from_known_set_boolean_pass", "role_valid_matches_fixed_party_a_or_party_b_set"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-281-sco60-crypto-asset-exposure-classifier",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "kernel_digest": "sha256:27ca4b94e8f9b63be974894cab2c35fdb00b72b8c405455fead9dc3a6de0cdd9",
      "proptest_file_digest": "sha256:67c4ab71bf04668504774ad7f015fabc7278043586cff621895823aca0fc8fda",
      "proptest_file": "chaingraph/kernels/__proptests__/art-281-sco60-crypto-asset-exposure-classifier.proptest.mjs",
      "properties_tested": ["infra_addon_applied_bounded_0_to_150pct", "risk_weight_applied_nondecreasing_in_infra_addon_for_group1", "group2_limit_breached_matches_fixed_1pct_tier1_threshold", "ULP_boundary_forcing"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-282-social-security-claiming-optimizer",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "kernel_digest": "sha256:83b81f55de1dfe9bda0dc897482ce07935b420bc7f4b93f30ffd3e01d7ae7a35",
      "proptest_file_digest": "sha256:ebf8f28dbfd9a51701895a8365ed994a3a431a0253c9b256084fc3827b74367a",
      "proptest_file": "chaingraph/kernels/__proptests__/art-282-social-security-claiming-optimizer.proptest.mjs",
      "properties_tested": ["monthly_benefit_nondecreasing_as_claim_age_rises", "claim_age_and_longevity_clamped_money_fields_finite", "full_retirement_age_matches_statutory_birth_year_table", "ULP_boundary_forcing"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-283-pension-lump-sum-vs-annuity-decision-engine",
      "class": "B",
      "float_sensitive": true,
      "ulp_forcing_present": true,
      "kernel_digest": "sha256:f6d1afb8e2ecf41c2176368c4f1383cba8b5ffe9cbfed4ac2b8f12760984e828",
      "proptest_file_digest": "sha256:9c965daa4c2776b18a3b6b71507626eefd2c914336cd4eb4848e3be48ab9a4fc",
      "proptest_file": "chaingraph/kernels/__proptests__/art-283-pension-lump-sum-vs-annuity-decision-engine.proptest.mjs",
      "properties_tested": ["annuity_pv_nonincreasing_as_discount_rate_rises", "recommendation_and_survivor_pct_known_sets_money_finite", "recommendation_matches_annuity_pv_vs_lump_sum_comparison", "ULP_boundary_forcing"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    },
    {
      "kernel_id": "art-287-revocation-status-verifier",
      "class": "B",
      "float_sensitive": false,
      "ulp_forcing_present": false,
      "ulp_forcing_note": "stated float:no exception per the WU row — statusListIndex is an integer bit-address into a bounded byte array, base64url decode and bit extraction are pure integer/bitwise ops, no doubles enter compute() arithmetic; forced CATEGORICAL boundary cases (absent credentialStatus, wrong type, negative/non-integer index, empty/invalid encodedList, out-of-range index, MAX_LIST_BYTES overflow, MSB-first bit convention) used instead of ULP forcing",
      "kernel_digest": "sha256:1bba28fe16295e569ea0581670c5d95070c8d2057df9d9b6f24da30624c4c6f6",
      "proptest_file_digest": "sha256:d672723b190313843b73d24bed8d5c8f8a9e6f4ac60d81e3f241ebea5ef2c926",
      "proptest_file": "chaingraph/kernels/__proptests__/art-287-revocation-status-verifier.proptest.mjs",
      "properties_tested": ["status_matches_independent_bit_extraction_reference", "status_known_set_structural_error_null_when_not_no_signal", "absent_credential_status_always_no_signal_never_active_or_revoked"],
      "fixture_oracle_result": "PASS (vectors per fixtures file)",
      "run_proptests_result": "PASS"
    }
  ],
  "ulp_forcing_summary": "8 of 10 kernels required and carry ULP-boundary forcing (art-270, art-271, art-272, art-273, art-281, art-282, art-283 as arithmetic B kernels, plus art-276 under a narrowed reclassification — see its item note). The other 2 (art-277, art-287) are the row's stated float:no exceptions and carry forced categorical boundary cases instead.",
  "run_proptests_aggregate": "10/10 shard files passed (node scripts/run-proptests.mjs — 199/199 across the full tree, no regression in prior shards)",
  "fv_floor_coverage": "all 10 shard kernels confirmed absent from the pre-shard tree by directory listing (none of the 10 target *.proptest.mjs files existed before this row); 199 total proptest files present post-shard, 189 pre-existing + this shard's 10"
}
