Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions docs/how-to/formal-core.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,20 @@ JSON-отчёты, логи, воспроизводимые контрприме
артефактом задачи `formal core (Kani)` внутри обязательного CI. Публикация требует
эту задачу в успешном canonical push-run точного коммита. Старый результат не
подменяет новый запуск. Нечистый checkout не получает `source_commit` в квитанции.
При проверке чистоты локальный Git fsmonitor отключается, целостность достижимых
объектов Git проверяется через `git fsck --strict`, а сырые байты всех
отслеживаемых файлов сравниваются с blob указанного коммита. В том числе
`verified_source_sha256` формальных исходников привязаны к этим blob.
Физическое поддерево `crates/labcolors-core` дополнительно сверяется с Git-деревом,
включая игнорируемые файлы и пустые каталоги; workspace `target/` остаётся допустимым.
Отслеживаемые символьные ссылки внутри Core и среди формальных входов вне Core
отклоняются: Git связывает текст ссылки, а компилятор или верификатор может прочитать
изменяемую игнорируемую цель. Посторонние ссылки вне Core остаются допустимыми.
Это обнаруживает правку, скрытую настройками статуса или индексом Git. Checkout,
меняющий байты исходников при извлечении, не получает `source_commit`. Для Linux CI
нужен checkout с LF: перевод LF в CRLF при извлечении также не совпадёт с blob. Для этой
проверки нужен Git 2.35.2 или новее: более ранние версии трактуют
`core.fsmonitor=false` как путь к hook, поэтому верификатор завершится отказом.

## Обновление и пределы

Expand Down
10 changes: 8 additions & 2 deletions proof/artifact/tests.json
Original file line number Diff line number Diff line change
Expand Up @@ -600,7 +600,7 @@
"start": "proof/region/v1/tests"
},
{
"count": 272,
"count": 278,
"load_errors": [],
"names": [
"ci_workflow_binding.TestCiWorkflowBinding.test_accepts_exact_local_call_at_workflow_sha",
Expand Down Expand Up @@ -850,6 +850,12 @@
"test_verify_clean_set_receipt.ReceiptHostileTests.test_unknown_receipt_field_is_rejected",
"test_verify_clean_set_receipt.ReceiptHostileTests.test_valid_receipt_binds_committed_research_and_product_codec",
"test_verify_clean_set_receipt.ReceiptHostileTests.test_wrong_research_commit_is_rejected_before_blob_lookup",
"test_verify_core_formal.FormalReportTests.test_assembly_rejects_index_hidden_source_changes",
"test_verify_core_formal.FormalReportTests.test_checkout_ignores_foreign_git_repository_environment",
"test_verify_core_formal.FormalReportTests.test_checkout_rejects_corrupt_blob_even_when_status_and_bytes_match",
"test_verify_core_formal.FormalReportTests.test_checkout_rejects_ignored_core_extras_but_allows_workspace_target",
"test_verify_core_formal.FormalReportTests.test_checkout_rejects_symlinks_for_each_formal_input_outside_core",
"test_verify_core_formal.FormalReportTests.test_checkout_rejects_tracked_core_symlink_to_ignored_target",
"test_verify_core_formal.FormalReportTests.test_complete_result_passes",
"test_verify_core_formal.FormalReportTests.test_completed_wrapper_still_cleans_its_solver_group",
"test_verify_core_formal.FormalReportTests.test_deleted_semantic_assertion_or_cover_is_rejected",
Expand Down Expand Up @@ -882,7 +888,7 @@
"start": "scripts"
}
],
"record_sha256": "93ed27c874673dea462679f7d54b9d1dc091cbca376436f5506ee4b334a2739c",
"record_sha256": "2e62131734917268357705f8bacdea4216290ee6fe15e36171165748286627be",
"rust": {
"enabled": [
"actual_process_cannot_succeed_when_stdout_refuses_bytes: test",
Expand Down
6 changes: 3 additions & 3 deletions proof/artifact/tree.json
Original file line number Diff line number Diff line change
Expand Up @@ -478,18 +478,18 @@
"scripts/test_program_public_surface.py": "cd04ede56d9d500850250577bcae9e992701185c",
"scripts/test_transport_distribution.mjs": "c532d55b086dc324ef6477b0d7b0352d16d4e395",
"scripts/test_verify_clean_set_receipt.py": "a8051388a28b68fc4fb984609814e79ddb45be53",
"scripts/test_verify_core_formal.py": "f92c6c6a290e9413a3048e63714e0ec40219fc0a",
"scripts/test_verify_core_formal.py": "85372064d897d0bb7048b8aa7436817eb6a74e67",
"scripts/test_wcag22_source_binding.py": "381b2c5685cb4022367f0465d02b044f100ea7f8",
"scripts/transport-distribution.mjs": "77ad862e3ea464cb0824e519b6583e3090b85f2a",
"scripts/verify-package-release.mjs": "8b0815717dc02e6af23341e7f2e83b02f4c1a120",
"scripts/verify_clean_set_receipt.py": "05fbd7254d592b8cb4d87bc53297ab4f47429e77",
"scripts/verify_core_formal.py": "2a9ce2e87a6647c98ef1f894d6ab36517c3e4a0d",
"scripts/verify_core_formal.py": "fb5fb76667a4fc9fd5c9e1654002a416c280acb5",
"scripts/verify_point_support_surplus.py": "24785f2d6cc56c88e12b0c50643f8f25365b3f6c",
"scripts/verify_program_public_surface.py": "613740af9951edf658817a530e216a3ddec739e5",
"scripts/verify_wcag22_neutral_axis.py": "13e7a1aa7621ff96435849d2f340ab128377a867",
"scripts/verify_wcag22_q55.py": "39d7a4ae3355ae0907f5745c612f9b928cd1ff01"
},
"record_sha256": "885529180af1868482db541f60b9eb8b1dc40e698e7fb43b0a3ee4c26e5c3325",
"record_sha256": "7766ec8c003140a6d46f2abe9dafd030f68fb9d7a7b2df1e3bce1c66ad299274",
"roots": [
".github/workflows",
"Cargo.toml",
Expand Down
Loading
Loading