Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
1 change: 1 addition & 0 deletions .cargo/mutants.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ examine_globs = [
"crates/labcolors-core/src/wcag22.rs",
"crates/labcolors-core/src/wcag22_evidence.rs",
"crates/labcolors-core/src/wcag22_feasibility.rs",
"crates/labcolors-core/src/wcag22_feasibility/explicit.rs",
"crates/labcolors-core/src/wcag22/kernel.rs",
]

Expand Down
45 changes: 37 additions & 8 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -302,10 +302,12 @@ jobs:
run: python3 scripts/verify_wcag22_neutral_axis.py
- name: verify WCAG22 feasibility identity byte grammar
run: python3 scripts/verify_wcag22_feasibility_identity.py
- name: validate committed WCAG22 feasibility benchmark evidence
- name: verify explicit WCAG22 feasibility identity and anti-vacuum mutations
run: python3 scripts/verify_wcag22_explicit_feasibility_identity.py --self-test
- name: validate historical and current WCAG22 feasibility benchmark evidence
run: |
artifact="crates/labcolors-core/contracts/wcag22-feasibility-benchmark-v1.json"
protocol=(
historical_artifact="crates/labcolors-core/contracts/wcag22-feasibility-benchmark-v1.json"
historical_protocol=(
--admit-revision fea99a1ea4148a5a72423c88220655f7f84213fe
--admit-rustc-release 1.96.0
--admit-target-triple aarch64-apple-darwin
Expand All @@ -315,26 +317,53 @@ jobs:
--admit-package-version 0.2.0
--admit-sample-count 5
)
historical_snapshot=6001cf41e0a8364f25543e7955ceaf64d50129b4
historical_checker_snapshot=6001cf41e0a8364f25543e7955ceaf64d50129b4
historical_applicability_snapshot=94efeeeb1811f5515558ab2d79014a5e4c3a570a
historical_root="$RUNNER_TEMP/wcag22-feasibility-slice-a-$GITHUB_RUN_ID-$GITHUB_RUN_ATTEMPT"
git worktree add --detach "$historical_root" "$historical_snapshot"
git worktree add --detach "$historical_root" "$historical_checker_snapshot"
cleanup_history() {
git worktree remove --force "$historical_root"
}
trap cleanup_history EXIT
(
cd "$historical_root"
python3 scripts/check_wcag22_feasibility_benchmark.py \
"$artifact" "${protocol[@]}" \
"$historical_artifact" "${historical_protocol[@]}" \
--verify-current-subjects \
--artifact-sha256 7e9ffcbdd9d5d50fe681f511c34fc5c5dd270e9c475ce23ae56e9776922a3c5e \
--self-test
)
cleanup_history
git worktree add --detach "$historical_root" "$historical_applicability_snapshot"
(
cd "$historical_root"
python3 scripts/check_wcag22_feasibility_applicability.py \
"$historical_artifact" \
--artifact-sha256 7e9ffcbdd9d5d50fe681f511c34fc5c5dd270e9c475ce23ae56e9776922a3c5e \
--self-test
)
cleanup_history
trap - EXIT

current_artifact="crates/labcolors-core/contracts/wcag22-feasibility-benchmark-v2.json"
current_protocol=(
--admit-revision 9a4144d23fb3582bae8e0f0e2749722eef1b1e56
--admit-rustc-release 1.96.0
--admit-target-triple aarch64-apple-darwin
--admit-target-arch aarch64
--admit-target-os macos
--admit-pointer-width-bits 64
--admit-package-version 0.2.0
--admit-sample-count 5
)
python3 scripts/check_wcag22_feasibility_benchmark.py \
"$current_artifact" "${current_protocol[@]}" \
--verify-current-subjects \
--artifact-sha256 7809990c643453d1b255870b178b755c1736af8f59107a03fd5a28fa82ecf7a1 \
--self-test
python3 scripts/check_wcag22_feasibility_applicability.py \
"$artifact" \
--artifact-sha256 7e9ffcbdd9d5d50fe681f511c34fc5c5dd270e9c475ce23ae56e9776922a3c5e \
"$current_artifact" \
--artifact-sha256 7809990c643453d1b255870b178b755c1736af8f59107a03fd5a28fa82ecf7a1 \
--self-test

audit:
Expand Down
4 changes: 4 additions & 0 deletions crates/labcolors-core/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,7 @@ required-features = ["wcag22-feasibility"]
[[test]]
name = "wcag22_feasibility"
required-features = ["wcag22-feasibility"]

[[test]]
name = "wcag22_explicit_feasibility"
required-features = ["wcag22-feasibility"]
78 changes: 65 additions & 13 deletions crates/labcolors-core/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,35 @@ details.
вхождения, применимый критерий WCAG 2.2 и точные соседние цвета sRGB8. Core
канонизирует декларации, вычисляет каждую пару «кандидат × сосед» и возвращает
один запечатанный терминал: `Feasible`, `Infeasible` либо декларационный
`NotEvaluated`. `Infeasible` означает отсутствие решения только в выбранном
зарегистрированном домене; это не утверждение об отсутствии цвета вне домена.
`NotEvaluated`. `Infeasible` означает отсутствие решения только в проверенном
конечном домене; это не утверждение об отсутствии цвета вне него.

Возможность Cargo `wcag22-feasibility` включена по умолчанию для прямых
потребителей Core. Транспортные адаптеры отключают неэкспортируемые возможности
и включают каждую возможность вместе с её публичным транспортом и контрактом
соответствия.

В версии 1 зарегистрирована нейтральная ось кодированной sRGB8: ровно 256 кодов
`[v, v, v]`, где `v` принимает каждое целое значение от 0 до 255. Число 256 —
мощность исчерпывающе перечисляемого 8-битного домена, а не эмпирический порог.
Core не выводит размер текста, компонентную семантику или применимость из ID.
Превышение ресурсов, противоречивая декларация, ошибка выделения памяти и
нарушение инварианта вычислителя или компилятора возвращаются типизированными
ошибками; частичного или запасного результата нет.
потребителей Core. Транспорты Protocol/WASM/FFI в V1 проецируют только
зарегистрированную нейтральную ось. В этом релизе явный клиентский набор
является Core-only API: Protocol/WASM/FFI его не проецируют. Эта граница не
создаёт второй Cargo-feature и не меняет математику общего компилятора.

В V1 доступны две формы одного компилятора. Совместимый вход `evaluate`
перечисляет зарегистрированную нейтральную ось: ровно 256 кодов `[v, v, v]`,
где `v` принимает каждое целое значение от 0 до 255. Вход
`explicit::evaluate` принимает непустой клиентский набор пар «непрозрачный ID +
неизменяемый финальный `Srgb8`». Core сортирует точные UTF-8-байты ID, отклоняет
их повторы и сам выводит мощность, digest, матрицу и partition. Разные ID с
одинаковыми физическими байтами остаются разными кандидатами. Ни один из входов
не выводит размер текста, компонентную семантику, применимость или предпочтение
из ID; выбор среди допустимых кандидатов в этот контракт не входит.

Для `C` кандидатов и `E` канонических применимых рёбер выполняется ровно
`W=C×E` атомарных проверок. При `E>0` единственный упакованный буфер имеет
`B=ceil(C×E/8)+ceil(C/8)` байт; при `E=0` он пуст. Эти величины выводятся и
проверяются до выделения памяти. Остальная стоимость не маскируется формулой
`C×E`: отдельно выполняются линейный просмотр деклараций, сортировка кандидатов
и связей сравнением точных байтов ID, сортировка соседей внутри каждой связи и
линейное хеширование канонического результата. Превышение ресурсов,
противоречивая декларация, ошибка выделения памяти и нарушение инварианта
вычислителя или компилятора возвращаются типизированными ошибками; частичного
или запасного результата нет.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

```rust
# #[cfg(feature = "wcag22-feasibility")]
Expand Down Expand Up @@ -93,6 +107,44 @@ if let Some(evaluated) = result.evaluated() {
# fn main() {}
```

Клиентский конечный набор использует те же `RelationV1` и атомарный WCAG-путь:

```rust
# #[cfg(feature = "wcag22-feasibility")]
# fn explicit_feasibility_example() -> Result<(), Box<dyn std::error::Error>> {
use labcolors_core::{
Srgb8,
wcag22::Wcag22CriterionV1,
wcag22_feasibility::{
OccurrenceId, RelationId, RelationV1, ResourceProfileIdV1,
explicit::{
CandidateId, CandidateV1, DomainRequestV1, RequestV1, evaluate,
},
},
};

let domain = DomainRequestV1::try_new(vec![
CandidateV1::new(CandidateId::try_new("brand/ink")?, Srgb8::new([18, 52, 86])),
CandidateV1::new(CandidateId::try_new("brand/paper")?, Srgb8::new([245, 247, 250])),
])?;
let relation = RelationV1::applicable(
RelationId::try_new("content-on-canvas")?,
OccurrenceId::try_new("article/body")?,
Wcag22CriterionV1::Sc143TextDefault,
vec![Srgb8::new([255; 3])],
)?;
let result = evaluate(RequestV1::try_new(
domain,
vec![relation],
ResourceProfileIdV1::Compile,
)?)?;

assert_eq!(result.evaluated().map(|value| value.candidates().len()), Some(2));
# Ok(())
# }
# fn main() {}
```

В примере `Sc143TextDefault` означает явно объявленный клиентом критерий
SC 1.4.3 для обычного текста с отношением 4.5:1; Core не угадывает его по ID или
типографике. `0x75` и `0x76` — вычисленные граничные результаты именно для двух
Expand Down
9 changes: 5 additions & 4 deletions crates/labcolors-core/benches/wcag22_feasibility_admission.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
//!
//! ```text
//! LABCOLORS_WCAG22_BENCH_SAMPLES=5 \
//! LABCOLORS_WCAG22_BENCH_OUTPUT=/private/tmp/labcolors-wcag22-feasibility-admission-raw-v1.json \
//! LABCOLORS_WCAG22_BENCH_OUTPUT=/private/tmp/labcolors-wcag22-feasibility-admission-raw-v2.json \
//! cargo bench -p labcolors-core --bench wcag22_feasibility_admission
//! ```

Expand All @@ -39,8 +39,8 @@ use labcolors_core::wcag22_feasibility::{
#[path = "../src/sha256.rs"]
mod subject_sha256;

const ARTIFACT_ID: &str = "wcag22-feasibility-admission-raw-v1";
const DEFAULT_OUTPUT_FILENAME: &str = "labcolors-wcag22-feasibility-admission-raw-v1.json";
const ARTIFACT_ID: &str = "wcag22-feasibility-admission-raw-v2";
const DEFAULT_OUTPUT_FILENAME: &str = "labcolors-wcag22-feasibility-admission-raw-v2.json";
const CANDIDATE_COUNT: u64 = 256;
const PAGE_BYTES: u64 = 65_536;
const DECISION_SLOT_BYTES: u64 = 32;
Expand Down Expand Up @@ -71,10 +71,11 @@ const SOURCE_OBJECTS: [(&str, &str); 8] = [
"scripts/check_wcag22_feasibility_benchmark.py",
),
];
const SUBJECT_PATHS: [&str; 16] = [
const SUBJECT_PATHS: [&str; 17] = [
"Cargo.toml",
"crates/labcolors-core/src/lib.rs",
"crates/labcolors-core/src/wcag22_feasibility.rs",
"crates/labcolors-core/src/wcag22_feasibility/explicit.rs",
"crates/labcolors-core/src/srgb8.rs",
"crates/labcolors-core/src/sha256.rs",
"crates/labcolors-core/src/wcag22.rs",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"artifactId":"wcag22-explicit-feasibility-identity-v1","encoding":{"byteString":"u64-length-then-exact-bytes","candidateOrder":"lexicographic-exact-utf8-bytes-no-normalization","candidateRecord":"length-prefixed-id-then-three-srgb8-octets","evaluationLayoutOrder":["canonicalRelations","applicableRelations","notApplicableRelations","applicableEdges","candidateCount","logicalAssessments","failureMatrixBytes","partitionBytes","packedResultBytes"],"integer":"u64-big-endian","matrixBitOrder":"candidate-major-contiguous-lsb0","partitionBitOrder":"canonical-candidate-index-lsb0","partitionInEvaluation":"u64-length-then-exact-bytes","relationGrammar":"wcag22-feasibility-relations-v1"},"expected":{"domainDigestSha256":"71960b339a5af0421a5562e02aea28217b3f985c88a53f3244ea73f6c19258f4","evaluationIdSha256":"59e69b867d8feb8afae4d28708bd353d0f3a0e89c12b0f34952f2e9a5e8be700","relationSetDigestSha256":"990dbc58252dc518ccf63b2f4b63ef5ae227a2bed48dda9e5e5959f3e2477132"},"fixture":{"canonicalCandidates":[{"candidateId":"é","candidateIdUtf8Hex":"65cc81","emitted":[18,52,86]},{"candidateId":"é","candidateIdUtf8Hex":"c3a9","emitted":[18,52,86]},{"candidateId":"海","candidateIdUtf8Hex":"e6b5b7","emitted":[0,0,0]},{"candidateId":"🎨","candidateIdUtf8Hex":"f09f8ea8","emitted":[255,128,1]}],"canonicalRelations":[{"adjacent":[[0,0,0],[118,118,118],[255,255,255]],"criterion":"sc-1.4.3-text-default","kind":"applicable","occurrenceId":"hover/🎨","relationId":"alpha"},{"kind":"notApplicable","occurrenceId":"ornament","reasonId":"client/не-применимо","relationId":"zeta"}],"declaredCandidates":[{"candidateId":"🎨","emitted":[255,128,1]},{"candidateId":"é","emitted":[18,52,86]},{"candidateId":"海","emitted":[0,0,0]},{"candidateId":"é","emitted":[18,52,86]}],"domainKind":"explicit-srgb8-set-v1","failureMatrixHex":"5b0c","layout":{"applicableEdges":3,"applicableRelations":1,"candidateCount":4,"canonicalRelations":2,"failureMatrixBytes":2,"logicalAssessments":12,"notApplicableRelations":1,"packedResultBytes":3,"partitionBytes":1},"matrixSha256":"f414937d1b17276054be72790c34aef5a4eb5b6dc2132122599d47297bba5507","partitionHex":"00"},"schemaVersion":1}
Loading
Loading